原生 <select> 的弹出列表由 OS/浏览器渲染,暗色主题下是白底系统菜单, 无法跟随 Catppuccin 主题。将 FormSelect 内部重写为 button[aria-haspopup=listbox] + 绝对定位面板(组件签名不变,调用方零改动): - 面板/选项全部使用语义色 token,与 POPOVER_PANEL_CLASS 同源 (卡片化圆角 + 阴影),新增 select-enter 入场动画(150ms, 含 prefers-reduced-motion 豁免) - 键盘:focus 留在触发器,aria-activedescendant 高亮;↑↓ 循环 (wrap_index)、Enter/Space 选中、Esc 关闭、Home/End 跳首尾、 Tab 关闭并自然流转焦点;选项 onmousedown 阻止默认行为避免抢夺焦点 - 透明遮罩拦截外部点击关闭(同 Popover 模式) - 打开时按视口空间决定展开方向(should_flip + measure_flip, 下翻/上翻分别设 transform-origin) - 打开/键盘导航时高亮项 scrollIntoView(block: nearest) - 选中行:text-paper-accent + check 图标;高亮行:accent-soft 背景 should_flip / wrap_index 抽为纯函数并配单测(边界:恰好放得下、 上方更窄不翻、空列表回绕安全)。
Yggdrasil
基于 Dioxus 0.7 的全栈博客系统,Rust 单一代码库同时编译为 WASM 前端和原生服务端。
技术栈
- 框架: Dioxus 0.7 (fullstack)
- 数据库: PostgreSQL + tokio-postgres
- 样式: Tailwind CSS v4
- 密码: Argon2
- 会话: UUID token + cookie
功能
- 邮箱注册 / 登录(单管理员模式,首次注册后关闭)
- 会话管理与自动过期清理
- 暗色 / 亮色主题切换
- 后台文章撰写(Tiptap Markdown 编辑器)
- 文章归档与标签浏览
开发
依赖 Rust 1.95+、wasm32 目标、dx CLI、tailwindcss CLI v4 和 PostgreSQL。
# 配置数据库
DATABASE_URL=postgres://postgres:postgres@localhost:5432/yggdrasil
# 运行迁移(自动创建数据库并按顺序执行 migrations/ 下所有 SQL)
./migrate.sh
# 启动开发服务器
make dev
构建
make build
生产部署
生产环境必须前置反向代理(nginx/Caddy)做 TLS 终结,并设置 APP_BASE_URL、
COOKIE_SECURE=true、TRUSTED_PROXY_COUNT=1。详见 部署指南。
Description
Languages
Rust
79.7%
TypeScript
15.4%
CSS
3%
Dockerfile
0.8%
Makefile
0.5%
Other
0.5%