code-abyss 1.6.15 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/bin/install.js +25 -4
  2. package/package.json +2 -2
  3. package/skills/SKILL.md +24 -16
  4. package/skills/domains/ai/SKILL.md +2 -2
  5. package/skills/domains/ai/prompt-and-eval.md +279 -0
  6. package/skills/domains/architecture/SKILL.md +2 -3
  7. package/skills/domains/architecture/security-arch.md +87 -0
  8. package/skills/domains/data-engineering/SKILL.md +188 -26
  9. package/skills/domains/development/SKILL.md +1 -4
  10. package/skills/domains/devops/SKILL.md +3 -5
  11. package/skills/domains/devops/performance.md +63 -0
  12. package/skills/domains/devops/testing.md +97 -0
  13. package/skills/domains/frontend-design/SKILL.md +12 -3
  14. package/skills/domains/frontend-design/claymorphism/SKILL.md +117 -0
  15. package/skills/domains/frontend-design/claymorphism/references/tokens.css +52 -0
  16. package/skills/domains/frontend-design/engineering.md +287 -0
  17. package/skills/domains/frontend-design/glassmorphism/SKILL.md +138 -0
  18. package/skills/domains/frontend-design/glassmorphism/references/tokens.css +32 -0
  19. package/skills/domains/frontend-design/liquid-glass/SKILL.md +135 -0
  20. package/skills/domains/frontend-design/liquid-glass/references/tokens.css +81 -0
  21. package/skills/domains/frontend-design/neubrutalism/SKILL.md +141 -0
  22. package/skills/domains/frontend-design/neubrutalism/references/tokens.css +44 -0
  23. package/skills/domains/infrastructure/SKILL.md +174 -34
  24. package/skills/domains/mobile/SKILL.md +211 -21
  25. package/skills/domains/orchestration/SKILL.md +1 -0
  26. package/skills/domains/security/SKILL.md +4 -6
  27. package/skills/domains/security/blue-team.md +57 -0
  28. package/skills/domains/security/red-team.md +54 -0
  29. package/skills/domains/security/threat-intel.md +50 -0
  30. package/skills/orchestration/multi-agent/SKILL.md +195 -46
  31. package/skills/run_skill.js +134 -0
  32. package/skills/tools/gen-docs/SKILL.md +6 -4
  33. package/skills/tools/gen-docs/scripts/doc_generator.js +349 -0
  34. package/skills/tools/verify-change/SKILL.md +8 -6
  35. package/skills/tools/verify-change/scripts/change_analyzer.js +270 -0
  36. package/skills/tools/verify-module/SKILL.md +6 -4
  37. package/skills/tools/verify-module/scripts/module_scanner.js +145 -0
  38. package/skills/tools/verify-quality/SKILL.md +5 -3
  39. package/skills/tools/verify-quality/scripts/quality_checker.js +276 -0
  40. package/skills/tools/verify-security/SKILL.md +7 -5
  41. package/skills/tools/verify-security/scripts/security_scanner.js +133 -0
  42. package/skills/domains/COVERAGE_PLAN.md +0 -232
  43. package/skills/domains/ai/model-evaluation.md +0 -790
  44. package/skills/domains/ai/prompt-engineering.md +0 -703
  45. package/skills/domains/architecture/compliance.md +0 -299
  46. package/skills/domains/architecture/data-security.md +0 -184
  47. package/skills/domains/data-engineering/data-pipeline.md +0 -762
  48. package/skills/domains/data-engineering/data-quality.md +0 -894
  49. package/skills/domains/data-engineering/stream-processing.md +0 -791
  50. package/skills/domains/development/dart.md +0 -963
  51. package/skills/domains/development/kotlin.md +0 -834
  52. package/skills/domains/development/php.md +0 -659
  53. package/skills/domains/development/swift.md +0 -755
  54. package/skills/domains/devops/e2e-testing.md +0 -914
  55. package/skills/domains/devops/performance-testing.md +0 -734
  56. package/skills/domains/devops/testing-strategy.md +0 -667
  57. package/skills/domains/frontend-design/build-tools.md +0 -743
  58. package/skills/domains/frontend-design/performance.md +0 -734
  59. package/skills/domains/frontend-design/testing.md +0 -699
  60. package/skills/domains/infrastructure/gitops.md +0 -735
  61. package/skills/domains/infrastructure/iac.md +0 -855
  62. package/skills/domains/infrastructure/kubernetes.md +0 -1018
  63. package/skills/domains/mobile/android-dev.md +0 -979
  64. package/skills/domains/mobile/cross-platform.md +0 -795
  65. package/skills/domains/mobile/ios-dev.md +0 -931
  66. package/skills/domains/security/secrets-management.md +0 -834
  67. package/skills/domains/security/supply-chain.md +0 -931
  68. package/skills/domains/security/threat-modeling.md +0 -828
  69. package/skills/run_skill.py +0 -88
  70. package/skills/tests/README.md +0 -225
  71. package/skills/tests/SUMMARY.md +0 -362
  72. package/skills/tests/__init__.py +0 -3
  73. package/skills/tests/test_change_analyzer.py +0 -558
  74. package/skills/tests/test_doc_generator.py +0 -538
  75. package/skills/tests/test_module_scanner.py +0 -376
  76. package/skills/tests/test_quality_checker.py +0 -516
  77. package/skills/tests/test_security_scanner.py +0 -426
  78. package/skills/tools/gen-docs/scripts/doc_generator.py +0 -491
  79. package/skills/tools/verify-change/scripts/change_analyzer.py +0 -529
  80. package/skills/tools/verify-module/scripts/module_scanner.py +0 -321
  81. package/skills/tools/verify-quality/scripts/quality_checker.py +0 -481
  82. package/skills/tools/verify-security/scripts/security_scanner.py +0 -368
@@ -0,0 +1,287 @@
1
+ ---
2
+ name: frontend-engineering
3
+ description: 前端工程化。性能优化(Web Vitals、懒加载、虚拟滚动)、测试(Vitest、Playwright、MSW)、构建工具(Vite、Webpack、esbuild)。当用户提到性能优化、前端测试、构建工具、代码分割时使用。
4
+ ---
5
+
6
+ # 前端工程化 · Frontend Engineering
7
+
8
+ ## 一、性能优化
9
+
10
+ ### Core Web Vitals
11
+
12
+ | 指标 | 含义 | 目标值 |
13
+ |------|------|--------|
14
+ | LCP | Largest Contentful Paint | < 2.5s |
15
+ | FID | First Input Delay | < 100ms |
16
+ | CLS | Cumulative Layout Shift | < 0.1 |
17
+ | FCP | First Contentful Paint | < 1.8s |
18
+ | TTI | Time to Interactive | < 3.8s |
19
+
20
+ ### 性能决策树
21
+
22
+ ```
23
+ 加载慢 → Bundle 大?代码分割 + Tree Shaking | 资源多?懒加载 + 预加载 | 网络慢?CDN + 压缩
24
+ 渲染慢 → 列表长?虚拟滚动 | 重渲染?React.memo + useMemo | 布局抖动?固定尺寸
25
+ 交互慢 → JS 阻塞?Web Worker + startTransition | 动画卡顿?CSS 动画 + rAF
26
+ ```
27
+
28
+ ### 代码分割
29
+
30
+ ```typescript
31
+ // 路由级别 — React.lazy + Suspense
32
+ const Dashboard = lazy(() => import('./pages/Dashboard'))
33
+
34
+ // 组件级别 — 按需加载重量级组件
35
+ const HeavyChart = lazy(() => import('./components/HeavyChart'))
36
+
37
+ // Vite manualChunks
38
+ export default defineConfig({
39
+ build: {
40
+ rollupOptions: {
41
+ output: {
42
+ manualChunks: {
43
+ 'react-vendor': ['react', 'react-dom'],
44
+ 'ui': ['@mui/material'],
45
+ },
46
+ },
47
+ },
48
+ },
49
+ })
50
+ ```
51
+
52
+ ### 虚拟滚动
53
+
54
+ ```typescript
55
+ import { FixedSizeList } from 'react-window'
56
+
57
+ function VirtualList({ items }: { items: Item[] }) {
58
+ return (
59
+ <FixedSizeList height={600} itemCount={items.length} itemSize={50} width="100%">
60
+ {({ index, style }) => <div style={style}>{items[index].name}</div>}
61
+ </FixedSizeList>
62
+ )
63
+ }
64
+ ```
65
+
66
+ ### React 性能要点
67
+
68
+ ```typescript
69
+ // memo 避免重渲染
70
+ const Row = memo(function Row({ item, onClick }: Props) {
71
+ return <div onClick={() => onClick(item.id)}>{item.name}</div>
72
+ })
73
+
74
+ // useMemo 缓存计算 + useCallback 缓存回调
75
+ const filtered = useMemo(() => data.filter(x => x.name.includes(q)), [data, q])
76
+ const handleClick = useCallback((id: string) => select(id), [])
77
+
78
+ // startTransition 低优先级更新
79
+ startTransition(() => setResults(heavySearch(query)))
80
+ ```
81
+
82
+ ### 资源优化 Checklist
83
+
84
+ - 图片:WebP 格式 + `loading="lazy"` + 响应式 `<picture>`
85
+ - 字体:`font-display: swap` + `preload` woff2
86
+ - 预加载:`dns-prefetch` → `preconnect` → `preload` → `prefetch`
87
+ - 压缩:Gzip/Brotli + HTTP/2
88
+
89
+ ### 性能监控
90
+
91
+ ```typescript
92
+ import { onCLS, onFID, onLCP } from 'web-vitals'
93
+ onCLS(sendToAnalytics)
94
+ onFID(sendToAnalytics)
95
+ onLCP(sendToAnalytics)
96
+
97
+ // 自定义指标
98
+ performance.mark('start')
99
+ doWork()
100
+ performance.mark('end')
101
+ performance.measure('work', 'start', 'end')
102
+ ```
103
+
104
+ ## 二、测试
105
+
106
+ ### 测试金字塔
107
+
108
+ ```
109
+ /\ E2E (10%) — Playwright
110
+ /--\ 集成 (20%) — Testing Library + MSW
111
+ /----\ 单元 (70%) — Vitest
112
+ ```
113
+
114
+ ### Vitest 配置
115
+
116
+ ```typescript
117
+ // vitest.config.ts
118
+ export default defineConfig({
119
+ test: {
120
+ globals: true,
121
+ environment: 'jsdom',
122
+ setupFiles: './src/test/setup.ts',
123
+ coverage: {
124
+ provider: 'v8',
125
+ thresholds: { lines: 80, functions: 80, branches: 75 },
126
+ },
127
+ },
128
+ })
129
+ ```
130
+
131
+ ### 单元测试
132
+
133
+ ```typescript
134
+ describe('formatCurrency', () => {
135
+ it('formats number', () => expect(formatCurrency(1234.56)).toBe('$1,234.56'))
136
+ it('handles zero', () => expect(formatCurrency(0)).toBe('$0.00'))
137
+ })
138
+ ```
139
+
140
+ ### 组件测试
141
+
142
+ ```typescript
143
+ import { render, screen, fireEvent } from '@testing-library/react'
144
+
145
+ it('calls onClick', () => {
146
+ const fn = vi.fn()
147
+ render(<Button onClick={fn}>Click</Button>)
148
+ fireEvent.click(screen.getByText('Click'))
149
+ expect(fn).toHaveBeenCalledTimes(1)
150
+ })
151
+ ```
152
+
153
+ ### MSW Mock
154
+
155
+ ```typescript
156
+ import { http, HttpResponse } from 'msw'
157
+ import { setupServer } from 'msw/node'
158
+
159
+ const server = setupServer(
160
+ http.get('/api/users/:id', ({ params }) =>
161
+ HttpResponse.json({ id: params.id, name: 'John' })
162
+ ),
163
+ )
164
+ beforeAll(() => server.listen())
165
+ afterEach(() => server.resetHandlers())
166
+ afterAll(() => server.close())
167
+ ```
168
+
169
+ ### Playwright E2E
170
+
171
+ ```typescript
172
+ // playwright.config.ts 核心
173
+ export default defineConfig({
174
+ testDir: './e2e',
175
+ use: { baseURL: 'http://localhost:3000', trace: 'on-first-retry' },
176
+ webServer: { command: 'npm run dev', url: 'http://localhost:3000' },
177
+ })
178
+
179
+ // Page Object 模式
180
+ class LoginPage {
181
+ constructor(private page: Page) {}
182
+ async login(email: string, password: string) {
183
+ await this.page.fill('[name="email"]', email)
184
+ await this.page.fill('[name="password"]', password)
185
+ await this.page.click('[type="submit"]')
186
+ }
187
+ }
188
+ ```
189
+
190
+ ### 测试 Checklist
191
+
192
+ - 遵循 AAA 模式(Arrange / Act / Assert)
193
+ - 测试行为而非实现
194
+ - Mock 外部依赖(API、时间)
195
+ - 测试边界条件和错误路径
196
+ - CI 中自动运行 + 覆盖率门禁 80%+
197
+
198
+ ## 三、构建工具
199
+
200
+ ### 选型决策
201
+
202
+ ```
203
+ 新项目 React/Vue → Vite | Next.js → Turbopack | 零配置 → Parcel
204
+ 库开发 → Rollup / esbuild
205
+ 老项目复杂配置 → 保持 Webpack | 可迁移 → Vite
206
+ ```
207
+
208
+ ### 工具对比
209
+
210
+ | 工具 | 冷启动 | HMR | 生产构建 | 生态 |
211
+ |------|--------|-----|----------|------|
212
+ | Vite | < 1s | < 100ms | 10-30s | 成熟 |
213
+ | Webpack | 10-30s | 1-3s | 30-60s | 最丰富 |
214
+ | Turbopack | < 1s | < 100ms | 10-20s | 新兴 |
215
+ | esbuild | < 1s | N/A | 5-10s | 基础 |
216
+
217
+ ### Vite 核心配置
218
+
219
+ ```typescript
220
+ export default defineConfig({
221
+ plugins: [react()],
222
+ resolve: { alias: { '@': path.resolve(__dirname, './src') } },
223
+ server: {
224
+ port: 3000,
225
+ proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } },
226
+ },
227
+ build: {
228
+ minify: 'terser',
229
+ terserOptions: { compress: { drop_console: true } },
230
+ rollupOptions: {
231
+ output: {
232
+ manualChunks: { 'react-vendor': ['react', 'react-dom'] },
233
+ entryFileNames: 'assets/[name].[hash].js',
234
+ },
235
+ },
236
+ },
237
+ optimizeDeps: { include: ['react', 'react-dom'] },
238
+ })
239
+ ```
240
+
241
+ ### Webpack 生产优化要点
242
+
243
+ ```javascript
244
+ optimization: {
245
+ minimize: true,
246
+ minimizer: [new TerserPlugin(), new CssMinimizerPlugin()],
247
+ splitChunks: {
248
+ chunks: 'all',
249
+ cacheGroups: {
250
+ react: { test: /[\\/]node_modules[\\/](react|react-dom)[\\/]/, priority: 20 },
251
+ vendor: { test: /[\\/]node_modules[\\/]/, priority: 10 },
252
+ },
253
+ },
254
+ runtimeChunk: 'single',
255
+ }
256
+ ```
257
+
258
+ ### Webpack → Vite 迁移要点
259
+
260
+ 1. `npm install -D vite @vitejs/plugin-react`
261
+ 2. `index.html` 移到根目录,加 `<script type="module" src="/src/main.tsx">`
262
+ 3. `REACT_APP_*` → `VITE_*`,`process.env` → `import.meta.env`
263
+ 4. `require()` → `import`
264
+
265
+ ### 构建 Checklist
266
+
267
+ - 合理代码分割(路由级 + 第三方库分组)
268
+ - Tree Shaking + 压缩(terser / esbuild)
269
+ - 文件名哈希实现长期缓存
270
+ - Source map 仅 dev 或 hidden
271
+ - 定期 `webpack-bundle-analyzer` / `rollup-plugin-visualizer` 审计
272
+ - CI 缓存 `node_modules` + 构建产物
273
+
274
+ ## 工具速查
275
+
276
+ | 类别 | 推荐工具 |
277
+ |------|----------|
278
+ | 构建 | Vite (新项目) / Webpack (复杂项目) |
279
+ | 单元测试 | Vitest |
280
+ | 组件测试 | Testing Library |
281
+ | E2E | Playwright |
282
+ | API Mock | MSW |
283
+ | 性能监控 | web-vitals + Lighthouse |
284
+ | Bundle 分析 | webpack-bundle-analyzer / rollup-plugin-visualizer |
285
+ | 视觉回归 | Playwright screenshots / Chromatic |
286
+
287
+ ---
@@ -0,0 +1,138 @@
1
+ ---
2
+ name: glassmorphism
3
+ description: Glassmorphism design system skill. Use when building frosted-glass UI components with blur, transparency, and layered depth effects.
4
+ license: MIT
5
+ ---
6
+
7
+ # Glassmorphism Design Spec
8
+
9
+ ## 4 Core Elements
10
+
11
+ 1. **Transparency** — Semi-transparent backgrounds using `rgba()` or `hsla()` with alpha `0.05–0.4`
12
+ 2. **Blur** — `backdrop-filter: blur()` ranging 8–40px for frosted-glass effect
13
+ 3. **Border** — Subtle semi-transparent borders (`1px solid rgba(255,255,255,0.18)`) to define edges
14
+ 4. **Shadow** — Soft layered `box-shadow` for depth separation from background
15
+
16
+ ## CSS Tokens
17
+
18
+ Reference: [references/tokens.css](references/tokens.css)
19
+
20
+ Use CSS custom properties from `tokens.css` for consistent theming:
21
+
22
+ ```css
23
+ @import 'references/tokens.css';
24
+
25
+ .glass-card {
26
+ background: var(--glass-bg);
27
+ backdrop-filter: var(--glass-blur);
28
+ -webkit-backdrop-filter: var(--glass-blur);
29
+ border: var(--glass-border);
30
+ border-radius: var(--glass-radius);
31
+ box-shadow: var(--glass-shadow);
32
+ }
33
+ ```
34
+
35
+ ## Component Examples
36
+
37
+ ### Card
38
+ ```css
39
+ .glass-card {
40
+ background: var(--glass-bg);
41
+ backdrop-filter: var(--glass-blur);
42
+ -webkit-backdrop-filter: var(--glass-blur);
43
+ border: var(--glass-border);
44
+ border-radius: var(--glass-radius);
45
+ box-shadow: var(--glass-shadow);
46
+ padding: 1.5rem;
47
+ }
48
+ ```
49
+
50
+ ### Navbar
51
+ ```css
52
+ .glass-nav {
53
+ background: var(--glass-bg-heavy);
54
+ backdrop-filter: var(--glass-blur-strong);
55
+ -webkit-backdrop-filter: var(--glass-blur-strong);
56
+ border-bottom: var(--glass-border);
57
+ box-shadow: var(--glass-shadow);
58
+ position: sticky;
59
+ top: 0;
60
+ z-index: 100;
61
+ }
62
+ ```
63
+
64
+ ### Modal Overlay
65
+ ```css
66
+ .glass-modal-backdrop {
67
+ background: rgba(0, 0, 0, 0.4);
68
+ backdrop-filter: blur(4px);
69
+ }
70
+ .glass-modal {
71
+ background: var(--glass-bg-heavy);
72
+ backdrop-filter: var(--glass-blur-strong);
73
+ -webkit-backdrop-filter: var(--glass-blur-strong);
74
+ border: var(--glass-border);
75
+ border-radius: var(--glass-radius-lg);
76
+ box-shadow: var(--glass-shadow-elevated);
77
+ }
78
+ ```
79
+
80
+ ### Button
81
+ ```css
82
+ .glass-btn {
83
+ background: var(--glass-bg-light);
84
+ backdrop-filter: var(--glass-blur-light);
85
+ -webkit-backdrop-filter: var(--glass-blur-light);
86
+ border: var(--glass-border);
87
+ border-radius: var(--glass-radius);
88
+ transition: background 0.2s;
89
+ }
90
+ .glass-btn:hover {
91
+ background: var(--glass-bg);
92
+ }
93
+ ```
94
+
95
+ ## Browser Compatibility
96
+
97
+ | Feature | Chrome | Firefox | Safari | Edge |
98
+ |---------|--------|---------|--------|------|
99
+ | `backdrop-filter` | 76+ | 103+ | 9+ (`-webkit-`) | 79+ |
100
+ | `rgba()` backgrounds | All | All | All | All |
101
+
102
+ - Always include `-webkit-backdrop-filter` for Safari support
103
+ - Firefox <103: use `@supports` fallback with solid semi-transparent bg
104
+ - Fallback pattern:
105
+
106
+ ```css
107
+ .glass-card {
108
+ background: rgba(255, 255, 255, 0.85); /* fallback */
109
+ }
110
+ @supports (backdrop-filter: blur(1px)) {
111
+ .glass-card {
112
+ background: var(--glass-bg);
113
+ backdrop-filter: var(--glass-blur);
114
+ }
115
+ }
116
+ ```
117
+
118
+ ## Accessibility Notes
119
+
120
+ - Ensure **contrast ratio ≥ 4.5:1** for text over glass surfaces — test against all possible backgrounds
121
+ - Provide `prefers-reduced-transparency` media query to disable blur/transparency for users who need it
122
+ - Avoid placing critical text on highly transparent surfaces without a fallback
123
+ - Use `prefers-contrast: more` to increase border opacity and reduce transparency
124
+
125
+ ```css
126
+ @media (prefers-reduced-transparency: reduce) {
127
+ .glass-card {
128
+ background: rgba(255, 255, 255, 0.92);
129
+ backdrop-filter: none;
130
+ }
131
+ }
132
+ @media (prefers-contrast: more) {
133
+ .glass-card {
134
+ background: rgba(255, 255, 255, 0.85);
135
+ border: 1px solid rgba(0, 0, 0, 0.3);
136
+ }
137
+ }
138
+ ```
@@ -0,0 +1,32 @@
1
+ :root {
2
+ /* Backgrounds */
3
+ --glass-bg-light: rgba(255, 255, 255, 0.08);
4
+ --glass-bg: rgba(255, 255, 255, 0.15);
5
+ --glass-bg-heavy: rgba(255, 255, 255, 0.25);
6
+
7
+ /* Blur */
8
+ --glass-blur-light: blur(8px);
9
+ --glass-blur: blur(16px);
10
+ --glass-blur-strong: blur(32px);
11
+
12
+ /* Border */
13
+ --glass-border: 1px solid rgba(255, 255, 255, 0.18);
14
+
15
+ /* Radius */
16
+ --glass-radius: 12px;
17
+ --glass-radius-lg: 20px;
18
+
19
+ /* Shadow */
20
+ --glass-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
21
+ --glass-shadow-elevated: 0 8px 40px rgba(0, 0, 0, 0.15);
22
+ }
23
+
24
+ /* Dark theme overrides */
25
+ [data-theme="dark"] {
26
+ --glass-bg-light: rgba(255, 255, 255, 0.04);
27
+ --glass-bg: rgba(255, 255, 255, 0.08);
28
+ --glass-bg-heavy: rgba(255, 255, 255, 0.14);
29
+ --glass-border: 1px solid rgba(255, 255, 255, 0.12);
30
+ --glass-shadow: 0 4px 30px rgba(0, 0, 0, 0.3);
31
+ --glass-shadow-elevated: 0 8px 40px rgba(0, 0, 0, 0.4);
32
+ }
@@ -0,0 +1,135 @@
1
+ ---
2
+ name: liquid-glass
3
+ description: Apple Liquid Glass design system. Use when building UI with translucent, depth-aware glass morphism following Apple's design language. Provides CSS tokens, component patterns, dark/light mode, and animation specs.
4
+ license: MIT
5
+ ---
6
+
7
+ # Liquid Glass Design System
8
+
9
+ Apple-inspired translucent glass UI with depth, refraction, and ambient light response.
10
+
11
+ ## Core Principles
12
+
13
+ 1. **Translucency** — Surfaces reveal layered content beneath via backdrop blur
14
+ 2. **Depth** — Elements float on distinct z-layers with realistic shadows
15
+ 3. **Ambient Response** — Glass tints shift based on underlying content color
16
+ 4. **Minimal Chrome** — Borders are subtle; shape and blur define boundaries
17
+ 5. **Motion** — Transitions feel physical: spring-based, with inertia
18
+
19
+ ## Usage
20
+
21
+ Import the token file in your CSS:
22
+
23
+ ```css
24
+ @import 'references/tokens.css';
25
+ ```
26
+
27
+ ## CSS Tokens Reference
28
+
29
+ All tokens are defined in `references/tokens.css`. Key categories:
30
+
31
+ | Category | Prefix | Example |
32
+ |---|---|---|
33
+ | Glass backgrounds | `--lg-bg-*` | `--lg-bg-primary` |
34
+ | Blur | `--lg-blur-*` | `--lg-blur-md` |
35
+ | Borders | `--lg-border-*` | `--lg-border-color` |
36
+ | Shadows | `--lg-shadow-*` | `--lg-shadow-elevated` |
37
+ | Radius | `--lg-radius-*` | `--lg-radius-lg` |
38
+ | Animation | `--lg-duration-*` | `--lg-duration-normal` |
39
+
40
+ ## Component Patterns
41
+
42
+ ### Glass Card
43
+
44
+ ```css
45
+ .glass-card {
46
+ background: var(--lg-bg-primary);
47
+ backdrop-filter: blur(var(--lg-blur-md));
48
+ -webkit-backdrop-filter: blur(var(--lg-blur-md));
49
+ border: 1px solid var(--lg-border-color);
50
+ border-radius: var(--lg-radius-lg);
51
+ box-shadow: var(--lg-shadow-elevated);
52
+ transition: transform var(--lg-duration-normal) var(--lg-easing-spring);
53
+ }
54
+
55
+ .glass-card:hover {
56
+ transform: translateY(-2px);
57
+ box-shadow: var(--lg-shadow-high);
58
+ }
59
+ ```
60
+
61
+ ### Glass Toolbar
62
+
63
+ ```css
64
+ .glass-toolbar {
65
+ background: var(--lg-bg-toolbar);
66
+ backdrop-filter: blur(var(--lg-blur-lg)) saturate(var(--lg-saturate));
67
+ -webkit-backdrop-filter: blur(var(--lg-blur-lg)) saturate(var(--lg-saturate));
68
+ border-bottom: 1px solid var(--lg-border-subtle);
69
+ }
70
+ ```
71
+
72
+ ### Glass Button
73
+
74
+ ```css
75
+ .glass-btn {
76
+ background: var(--lg-bg-interactive);
77
+ backdrop-filter: blur(var(--lg-blur-sm));
78
+ border: 1px solid var(--lg-border-color);
79
+ border-radius: var(--lg-radius-md);
80
+ transition: all var(--lg-duration-fast) var(--lg-easing-spring);
81
+ }
82
+
83
+ .glass-btn:active {
84
+ transform: scale(0.97);
85
+ background: var(--lg-bg-pressed);
86
+ }
87
+ ```
88
+
89
+ ### Glass Modal Overlay
90
+
91
+ ```css
92
+ .glass-overlay {
93
+ background: var(--lg-bg-scrim);
94
+ backdrop-filter: blur(var(--lg-blur-xl));
95
+ }
96
+
97
+ .glass-modal {
98
+ background: var(--lg-bg-elevated);
99
+ border: 1px solid var(--lg-border-color);
100
+ border-radius: var(--lg-radius-xl);
101
+ box-shadow: var(--lg-shadow-high);
102
+ }
103
+ ```
104
+
105
+ ## Dark / Light Mode
106
+
107
+ Tokens auto-switch via `prefers-color-scheme`. Light mode uses white-tinted glass; dark mode uses dark-tinted glass with higher blur to maintain readability.
108
+
109
+ ```css
110
+ /* Force a mode on a subtree */
111
+ .light-glass { color-scheme: light; }
112
+ .dark-glass { color-scheme: dark; }
113
+ ```
114
+
115
+ ## Animations
116
+
117
+ Use spring-based easing for physical feel:
118
+
119
+ ```css
120
+ /* Entry */
121
+ @keyframes glass-enter {
122
+ from { opacity: 0; transform: scale(0.95) translateY(8px); }
123
+ to { opacity: 1; transform: scale(1) translateY(0); }
124
+ }
125
+
126
+ .glass-animate-in {
127
+ animation: glass-enter var(--lg-duration-normal) var(--lg-easing-spring) both;
128
+ }
129
+ ```
130
+
131
+ ## Accessibility
132
+
133
+ - Ensure `contrast-ratio ≥ 4.5:1` for text over glass surfaces
134
+ - Respect `prefers-reduced-motion` — disable blur animations, use opacity-only transitions
135
+ - Provide `prefers-contrast: high` overrides that replace translucent backgrounds with solid ones
@@ -0,0 +1,81 @@
1
+ /* Liquid Glass Design Tokens */
2
+
3
+ :root {
4
+ color-scheme: light dark;
5
+
6
+ /* Blur */
7
+ --lg-blur-sm: 8px;
8
+ --lg-blur-md: 16px;
9
+ --lg-blur-lg: 32px;
10
+ --lg-blur-xl: 48px;
11
+
12
+ /* Saturation */
13
+ --lg-saturate: 1.8;
14
+
15
+ /* Radius */
16
+ --lg-radius-sm: 8px;
17
+ --lg-radius-md: 12px;
18
+ --lg-radius-lg: 16px;
19
+ --lg-radius-xl: 24px;
20
+
21
+ /* Shadows */
22
+ --lg-shadow-subtle: 0 1px 3px rgba(0,0,0,0.08);
23
+ --lg-shadow-elevated: 0 4px 16px rgba(0,0,0,0.1);
24
+ --lg-shadow-high: 0 8px 32px rgba(0,0,0,0.15);
25
+
26
+ /* Animation */
27
+ --lg-duration-fast: 150ms;
28
+ --lg-duration-normal: 300ms;
29
+ --lg-duration-slow: 500ms;
30
+ --lg-easing-spring: cubic-bezier(0.22, 1, 0.36, 1);
31
+
32
+ /* Light mode (default) */
33
+ --lg-bg-primary: rgba(255,255,255,0.72);
34
+ --lg-bg-elevated: rgba(255,255,255,0.82);
35
+ --lg-bg-toolbar: rgba(255,255,255,0.65);
36
+ --lg-bg-interactive: rgba(255,255,255,0.5);
37
+ --lg-bg-pressed: rgba(255,255,255,0.35);
38
+ --lg-bg-scrim: rgba(0,0,0,0.25);
39
+ --lg-border-color: rgba(255,255,255,0.45);
40
+ --lg-border-subtle: rgba(0,0,0,0.06);
41
+ }
42
+
43
+ @media (prefers-color-scheme: dark) {
44
+ :root {
45
+ --lg-bg-primary: rgba(30,30,30,0.65);
46
+ --lg-bg-elevated: rgba(40,40,40,0.75);
47
+ --lg-bg-toolbar: rgba(25,25,25,0.6);
48
+ --lg-bg-interactive: rgba(255,255,255,0.1);
49
+ --lg-bg-pressed: rgba(255,255,255,0.06);
50
+ --lg-bg-scrim: rgba(0,0,0,0.5);
51
+ --lg-border-color: rgba(255,255,255,0.12);
52
+ --lg-border-subtle: rgba(255,255,255,0.06);
53
+ --lg-shadow-subtle: 0 1px 3px rgba(0,0,0,0.3);
54
+ --lg-shadow-elevated: 0 4px 16px rgba(0,0,0,0.4);
55
+ --lg-shadow-high: 0 8px 32px rgba(0,0,0,0.5);
56
+ }
57
+ }
58
+
59
+ @media (prefers-contrast: high) {
60
+ :root {
61
+ --lg-bg-primary: rgba(255,255,255,0.95);
62
+ --lg-bg-elevated: rgba(255,255,255,0.98);
63
+ --lg-border-color: rgba(0,0,0,0.3);
64
+ }
65
+ }
66
+
67
+ @media (prefers-contrast: high) and (prefers-color-scheme: dark) {
68
+ :root {
69
+ --lg-bg-primary: rgba(20,20,20,0.95);
70
+ --lg-bg-elevated: rgba(25,25,25,0.98);
71
+ --lg-border-color: rgba(255,255,255,0.3);
72
+ }
73
+ }
74
+
75
+ @media (prefers-reduced-motion: reduce) {
76
+ :root {
77
+ --lg-duration-fast: 0ms;
78
+ --lg-duration-normal: 0ms;
79
+ --lg-duration-slow: 0ms;
80
+ }
81
+ }