连接

准备好加入了?联系我们,成为集体的一部分

没有申请流程。没有门槛。只需带着你的好奇心和创造的 desire 出现。 我们将提供空间、工具和社区。

社区成员

认识一些我们的成员

@styka
创始人
@labria
核心开发者
@neon
AI 负责人
@rustacean
系统
@pygoddess
数据科学
@webweaver
前端
@gamedev
Godot
你?
加入我们

发送信号

告诉我们关于你自己的信息

立即连接

源代码展示

📜 connect.html — 联系表单

带语义 HTML5 验证和 ARIA 属性的无障碍联系表单。

<form id="contact-form" novalidate>
  <div class="form-group">
    <label for="name">呼号 / 姓名</label>
    <input type="text" id="name" 
           required aria-required="true">
  </div>
  
  <div class="form-group">
    <label for="email">电子邮件</label>
    <input type="email" id="email"
           required aria-required="true">
  </div>
  
  <button type="submit" class="btn">
    发送
  </button>
</form>

⚡ 表单验证 JavaScript

带视觉反馈和无障碍支持的客户端表单验证。

const FormValidation = {
  init() {
    const form = document.getElementById('contact-form');
    
    form.addEventListener('submit', (e) => {
      e.preventDefault();
      
      const name = form.querySelector('#name');
      const email = form.querySelector('#email');
      let isValid = true;
      
      // 验证姓名
      if (!name.value.trim()) {
        name.style.borderColor = '#ff5aa0';
        isValid = false;
      } else {
        name.style.borderColor = '#00ffaa';
      }
      
      // 验证电子邮件
      const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
      if (!emailRegex.test(email.value)) {
        email.style.borderColor = '#ff5aa0';
        isValid = false;
      } else {
        email.style.borderColor = '#00ffaa';
      }
      
      if (isValid) {
        Toast.show('传输已接收。欢迎来到集体!');
        form.reset();
      }
    });
  }
};

⚡ Cookie 和会话管理

隐私优先的 Cookie 处理,最小化数据存储。

const Cookie = {
  set(key, value, days = 365) {
    const date = new Date();
    date.setTime(date.getTime() + days * 86400000);
    document.cookie = 
      `${key}=${encodeURIComponent(value)};` +
      `expires=${date.toUTCString()};` +
      `path=/;SameSite=Lax`;
  },
  
  get(key) {
    const match = document.cookie.match(
      new RegExp('(^|; )' + key + '=([^;]*)')
    );
    return match ? decodeURIComponent(match[2]) : null;
  },
  
  getJSON(key) {
    try {
      return JSON.parse(this.get(key));
    } catch {
      return null;
    }
  }
};