@namewta/speculo 0.8.5 → 0.8.7
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.
- package/README.md +4 -3
- package/dist/src/structured.js +162 -4
- package/dist/src/structured.js.map +1 -1
- package/package.json +2 -2
- package/template/canonical/canonical-specdev-goal-plan.md +14 -15
- package/template/canonical/canonical-specdev-grill-with-docs.md +9 -8
- package/template/canonical/canonical-specdev-spec.md +9 -8
- package/template/canonical/canonical-specdev-tickets.md +13 -14
- package/template/canonical/canonical-specdev-wayfinder.md +7 -7
- package/template/commands/status.md +3 -3
- package/template/skills/archive-and-consolidate/SKILL.md +19 -14
- package/template/workflows/learning/A-archive-and-consolidate/A-archive-and-consolidate.md +38 -0
- package/template/workflows/learning/A-archive-and-consolidate/promotion-plan-template.md +23 -0
- package/template/workflows/learning/A-assess-and-plan/A-assess-and-plan.md +39 -0
- package/template/workflows/learning/A-assess-and-plan/change-status-template.json +28 -0
- package/template/workflows/learning/A-assess-and-plan/learning-plan-template.md +28 -0
- package/template/workflows/learning/E-eli5/E-eli5.md +37 -0
- package/template/workflows/learning/E-eli5/lesson-template.md +31 -0
- package/template/workflows/learning/I-init-setup/I-init-setup.md +36 -0
- package/template/workflows/learning/I-init-setup/context-index-template.md +6 -0
- package/template/workflows/learning/I-init-setup/learner-profile-template.md +17 -0
- package/template/workflows/learning/I-init-setup/review-index-template.md +4 -0
- package/template/workflows/learning/INDEX.md +26 -0
- package/template/workflows/learning/P-practice/P-practice.md +34 -0
- package/template/workflows/learning/P-practice/practice-template.md +16 -0
- package/template/workflows/learning/Q-quiz/Q-quiz.md +34 -0
- package/template/workflows/learning/Q-quiz/quiz-artifact-template.md +16 -0
- package/template/workflows/learning/R-review/R-review.md +35 -0
- package/template/workflows/learning/R-review/review-template.md +12 -0
- package/template/workflows/learning/README.md +121 -0
- package/template/workflows/learning/_state/archive/.gitkeep +1 -0
- package/template/workflows/learning/_state/changes/.gitkeep +1 -0
- package/template/workflows/learning/_state/status.json +6 -0
- package/template/workflows/learning/common/rules/artifact-contract.md +27 -0
- package/template/workflows/learning/common/rules/assessment-policy.md +7 -0
- package/template/workflows/learning/common/rules/knowledge-organization.md +9 -0
- package/template/workflows/learning/common/rules/mastery-policy.md +21 -0
- package/template/workflows/learning/common/rules/path-reference-contract.md +7 -0
- package/template/workflows/learning/common/rules/teaching-policy.md +15 -0
- package/template/workflows/learning/common/schemas/change-status.schema.json +41 -0
- package/template/workflows/learning/common/schemas/status.schema.json +32 -0
- package/template/workflows/learning/common/skills/knowledge-promotion/SKILL.md +46 -0
- package/template/workflows/learning/common/skills/knowledge-promotion/domain-index-template.md +6 -0
- package/template/workflows/learning/common/skills/knowledge-promotion/domain-overview-template.md +19 -0
- package/template/workflows/learning/common/skills/knowledge-promotion/knowledge-template.md +25 -0
- package/template/workflows/learning/common/tools/validate-learning.mjs +356 -0
- package/template/workflows/learning/runtime-contract.json +11 -0
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +1 -1
- package/template/workflows/specdev/I-init-setup/config-template.json +2 -2
- package/template/workflows/specdev/INDEX.md +2 -2
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +1 -1
- package/template/workflows/specdev/P-prototype/P-prototype.md +30 -26
- package/template/workflows/specdev/P-prototype/design-library/INDEX.md +43 -0
- package/template/workflows/specdev/P-prototype/design-library/color-and-theme.md +65 -0
- package/template/workflows/specdev/P-prototype/design-library/foundations.md +66 -0
- package/template/workflows/specdev/P-prototype/design-library/interaction-patterns.md +61 -0
- package/template/workflows/specdev/P-prototype/design-library/product-pattern-index.md +73 -0
- package/template/workflows/specdev/P-prototype/design-library/research-provenance.md +54 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/METHODOLOGY.md +90 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/README.md +31 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/data/extended-projects.json +241 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/data/projects.json +253 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/reference/USAGE.md +40 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/reference/design-tokens.css +145 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/report/OPEN_SOURCE_UI_RESEARCH_2026.md +519 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/PROJECT_TEMPLATE.md +29 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/README.md +9 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/claude-code-modern-clients.md +407 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/creative-ai-communication.md +574 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/data-dev-tools.md +432 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/personal-multiplatform-apps.md +185 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/productivity-collaboration.md +398 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/01-dense-ide.html +68 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/02-monochrome-console.html +18 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/03-soft-personal-ai.html +17 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/04-responsive-web.html +14 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/05-mobile-supervisor.html +16 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/06-cross-platform-workspace.html +17 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/07-local-first-content.html +9 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/08-media-first.html +17 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/README.md +49 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/ATTRIBUTION.md +9 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/landscape.jpg +0 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/lucide.js +20494 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/mountain.jpg +0 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/workspace.jpg +0 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/index.html +70 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/package-lock.json +78 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/package.json +12 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/screenshots/index-desktop.png +0 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/scripts/gallery.js +134 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/styles/base.css +795 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/styles/pages.css +533 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/tests/gallery.spec.js +56 -0
- package/template/workflows/specdev/P-prototype/design-library/responsive-and-platforms.md +53 -0
- package/template/workflows/specdev/P-prototype/design-library/style-index.md +32 -0
- package/template/workflows/specdev/P-prototype/design-package.schema.json +70 -0
- package/template/workflows/specdev/P-prototype/design-system-template.md +366 -0
- package/template/workflows/specdev/P-prototype/detect-existing-style.md +53 -0
- package/template/workflows/specdev/P-prototype/generate-design-package.md +50 -0
- package/template/workflows/specdev/P-prototype/style-selection-protocol.md +41 -0
- package/template/workflows/specdev/P-prototype/tools/materialize-prototype.mjs +126 -0
- package/template/workflows/specdev/P-prototype/tools/validate-design-package.mjs +155 -0
- package/template/workflows/specdev/README.md +12 -11
- package/template/workflows/specdev/T-triage/T-triage.md +1 -1
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +1 -1
- package/template/workflows/specdev/common/README.md +2 -2
- package/template/workflows/specdev/common/rules/artifact-contract.md +3 -2
- package/template/workflows/specdev/common/schemas/config.schema.json +4 -4
- package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +4 -4
- package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +1 -3
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +83 -92
- package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +0 -1968
- package/template/workflows/specdev/E-eli5/E-eli5.md +0 -97
- package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +0 -254
- package/template/workflows/specdev/E-engineering-cognitive-mentor/architecture-guidance.md +0 -90
- package/template/workflows/specdev/E-engineering-cognitive-mentor/bug-guidance.md +0 -80
- package/template/workflows/specdev/E-engineering-cognitive-mentor/codebase-guidance.md +0 -107
- package/template/workflows/specdev/E-engineering-cognitive-mentor/comprehension-and-closure.md +0 -95
- package/template/workflows/specdev/E-engineering-cognitive-mentor/domain-learning-guidance.md +0 -62
- package/template/workflows/specdev/E-engineering-cognitive-mentor/evidence-and-options.md +0 -132
- package/template/workflows/specdev/E-engineering-cognitive-mentor/interaction-protocol.md +0 -116
- package/template/workflows/specdev/E-engineering-cognitive-mentor/mentor-report-template.md +0 -135
- package/template/workflows/specdev/E-engineering-cognitive-mentor/mode-routing.md +0 -47
- package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +0 -132
- package/template/workflows/specdev/E-engineering-cognitive-mentor/requirements-guidance.md +0 -92
- package/template/workflows/specdev/P-prototype/logic-prototype.md +0 -24
- package/template/workflows/specdev/P-prototype/prototype-record-template.md +0 -46
- package/template/workflows/specdev/P-prototype/ui-prototype.md +0 -21
- package/template/workflows/specdev/common/schemas/prototype-record.schema.json +0 -24
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<title>开源 UI 风格样板库</title>
|
|
7
|
+
<link rel="stylesheet" href="styles/base.css">
|
|
8
|
+
<link rel="stylesheet" href="styles/pages.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body class="gallery-page">
|
|
11
|
+
<div class="gallery-shell">
|
|
12
|
+
<header class="gallery-topbar">
|
|
13
|
+
<div class="utility-mark"><i data-lucide="panels-top-left"></i></div>
|
|
14
|
+
<strong>UI 风格样板库</strong>
|
|
15
|
+
<span>基于 38 个开源项目的视觉与架构研究</span>
|
|
16
|
+
<a class="btn" href="../report/OPEN_SOURCE_UI_RESEARCH_2026.md" style="margin-left:auto"><i data-lucide="book-open"></i>研究报告</a>
|
|
17
|
+
</header>
|
|
18
|
+
<main class="gallery-main">
|
|
19
|
+
<section class="gallery-summary">
|
|
20
|
+
<div>
|
|
21
|
+
<h1>从布局、密度和交互出发比较八种产品风格</h1>
|
|
22
|
+
<p>每个样板都是独立 HTML,可直接打开、检查变量并作为原型起点。选择与你的任务模型最接近的一类,再调整品牌色,而不是只复制表面装饰。</p>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="gallery-metrics" aria-label="样板库统计">
|
|
25
|
+
<div class="metric"><b>8</b><span>独立风格</span></div>
|
|
26
|
+
<div class="metric"><b>3</b><span>端类型</span></div>
|
|
27
|
+
<div class="metric"><b>38</b><span>研究项目</span></div>
|
|
28
|
+
</div>
|
|
29
|
+
</section>
|
|
30
|
+
|
|
31
|
+
<section class="style-grid" aria-label="风格页面">
|
|
32
|
+
<a class="style-card" href="01-dense-ide.html">
|
|
33
|
+
<div class="style-preview preview-ide"><div class="mini-app"><i class="mini-top"></i><i class="mini-rail"></i><i class="mini-side"></i><i class="mini-main"></i><i class="mini-right"></i><i class="mini-status"></i></div></div>
|
|
34
|
+
<div class="style-card-body"><span class="style-number">01 / cdesktop</span><h2>高密度 IDE</h2><p>方正、紧凑、多窗格。文件树、编辑器、diff 与终端同时可见。</p><div class="style-tags"><span>2-4px</span><span>12-13px</span><span>橙色强调</span></div></div>
|
|
35
|
+
</a>
|
|
36
|
+
<a class="style-card" href="02-monochrome-console.html">
|
|
37
|
+
<div class="style-preview preview-console"><div class="mini-app"><i class="mini-top"></i><i class="mini-rail"></i><i class="mini-side"></i><i class="mini-main"></i><i class="mini-right"></i><i class="mini-status"></i></div></div>
|
|
38
|
+
<div class="style-card-body"><span class="style-number">02 / Opcode</span><h2>单色桌面控制台</h2><p>近乎无品牌色,靠表面亮度和边框构建高可靠管理界面。</p><div class="style-tags"><span>4-12px</span><span>Inter</span><span>深色优先</span></div></div>
|
|
39
|
+
</a>
|
|
40
|
+
<a class="style-card" href="03-soft-personal-ai.html">
|
|
41
|
+
<div class="style-preview preview-soft"><div class="mini-app"><i class="mini-top"></i><i class="mini-rail"></i><i class="mini-side"></i><i class="mini-main"></i><i class="mini-right"></i><i class="mini-status"></i></div></div>
|
|
42
|
+
<div class="style-card-body"><span class="style-number">03 / CodePilot</span><h2>柔和个人 AI 桌面</h2><p>暖中性、浮动窗格、柔和阴影,适合个人助手与长期陪伴型工具。</p><div class="style-tags"><span>12-20px</span><span>OKLCH</span><span>平台材质</span></div></div>
|
|
43
|
+
</a>
|
|
44
|
+
<a class="style-card" href="04-responsive-web.html">
|
|
45
|
+
<div class="style-preview preview-web"><div class="mini-app"><i class="mini-top"></i><i class="mini-rail"></i><i class="mini-side"></i><i class="mini-main"></i><i class="mini-right"></i><i class="mini-status"></i></div></div>
|
|
46
|
+
<div class="style-card-body"><span class="style-number">04 / CloudCLI</span><h2>响应式 Web 工作台</h2><p>桌面保留三栏,窄屏重组为 drawer、全屏详情和底部导航。</p><div class="style-tags"><span>6-8px</span><span>PWA</span><span>安全区</span></div></div>
|
|
47
|
+
</a>
|
|
48
|
+
<a class="style-card" href="05-mobile-supervisor.html">
|
|
49
|
+
<div class="style-preview preview-mobile"><div class="mini-app"><i class="mini-top"></i><i class="mini-main"></i><i class="mini-status"></i></div></div>
|
|
50
|
+
<div class="style-card-body"><span class="style-number">05 / Happy</span><h2>移动监督与审批</h2><p>以 Agent 状态、权限批准、通知和短 follow-up 为移动端核心。</p><div class="style-tags"><span>16-24px</span><span>15-17px</span><span>触屏优先</span></div></div>
|
|
51
|
+
</a>
|
|
52
|
+
<a class="style-card" href="06-cross-platform-workspace.html">
|
|
53
|
+
<div class="style-preview preview-paseo"><div class="mini-app"><i class="mini-top"></i><i class="mini-rail"></i><i class="mini-side"></i><i class="mini-main"></i><i class="mini-right"></i><i class="mini-status"></i></div></div>
|
|
54
|
+
<div class="style-card-body"><span class="style-number">06 / Paseo</span><h2>多端 Agent 工作区</h2><p>统一 workspace、Agent、文件与终端对象,再按平台切换表现形态。</p><div class="style-tags"><span>4-8px</span><span>12/14/15px</span><span>状态色分层</span></div></div>
|
|
55
|
+
</a>
|
|
56
|
+
<a class="style-card" href="07-local-first-content.html">
|
|
57
|
+
<div class="style-preview preview-content"><div class="mini-app"><i class="mini-top"></i><i class="mini-rail"></i><i class="mini-side"></i><i class="mini-main"></i><i class="mini-right"></i><i class="mini-status"></i></div></div>
|
|
58
|
+
<div class="style-card-body"><span class="style-number">07 / Notesnook + Joplin</span><h2>Local-first 内容编辑器</h2><p>导航安静、正文优先,突出同步、离线、层级和长时间阅读。</p><div class="style-tags"><span>4-8px</span><span>17px 正文</span><span>暖灰</span></div></div>
|
|
59
|
+
</a>
|
|
60
|
+
<a class="style-card" href="08-media-first.html">
|
|
61
|
+
<div class="style-preview preview-media"><div class="mini-app"><i class="mini-top"></i><i class="mini-rail"></i><i class="mini-side"></i><i class="mini-main"></i><i class="mini-right"></i><i class="mini-status"></i></div></div>
|
|
62
|
+
<div class="style-card-body"><span class="style-number">08 / Immich</span><h2>媒体优先个人应用</h2><p>内容本身成为第一视觉信号,chrome 退后,状态与操作按需出现。</p><div class="style-tags"><span>沉浸网格</span><span>深色</span><span>渐进操作</span></div></div>
|
|
63
|
+
</a>
|
|
64
|
+
</section>
|
|
65
|
+
</main>
|
|
66
|
+
</div>
|
|
67
|
+
<script src="assets/lucide.js"></script>
|
|
68
|
+
<script src="scripts/gallery.js"></script>
|
|
69
|
+
</body>
|
|
70
|
+
</html>
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "open-source-ui-style-gallery",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"lockfileVersion": 3,
|
|
5
|
+
"requires": true,
|
|
6
|
+
"packages": {
|
|
7
|
+
"": {
|
|
8
|
+
"name": "open-source-ui-style-gallery",
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"@playwright/test": "1.62.1"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"node_modules/@playwright/test": {
|
|
15
|
+
"version": "1.62.1",
|
|
16
|
+
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz",
|
|
17
|
+
"integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==",
|
|
18
|
+
"dev": true,
|
|
19
|
+
"license": "Apache-2.0",
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"playwright": "1.62.1"
|
|
22
|
+
},
|
|
23
|
+
"bin": {
|
|
24
|
+
"playwright": "cli.js"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=20"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"node_modules/fsevents": {
|
|
31
|
+
"version": "2.3.2",
|
|
32
|
+
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
|
33
|
+
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
|
|
34
|
+
"dev": true,
|
|
35
|
+
"hasInstallScript": true,
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"optional": true,
|
|
38
|
+
"os": [
|
|
39
|
+
"darwin"
|
|
40
|
+
],
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"node_modules/playwright": {
|
|
46
|
+
"version": "1.62.1",
|
|
47
|
+
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz",
|
|
48
|
+
"integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==",
|
|
49
|
+
"dev": true,
|
|
50
|
+
"license": "Apache-2.0",
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"playwright-core": "1.62.1"
|
|
53
|
+
},
|
|
54
|
+
"bin": {
|
|
55
|
+
"playwright": "cli.js"
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=20"
|
|
59
|
+
},
|
|
60
|
+
"optionalDependencies": {
|
|
61
|
+
"fsevents": "2.3.2"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"node_modules/playwright-core": {
|
|
65
|
+
"version": "1.62.1",
|
|
66
|
+
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz",
|
|
67
|
+
"integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==",
|
|
68
|
+
"dev": true,
|
|
69
|
+
"license": "Apache-2.0",
|
|
70
|
+
"bin": {
|
|
71
|
+
"playwright-core": "cli.js"
|
|
72
|
+
},
|
|
73
|
+
"engines": {
|
|
74
|
+
"node": ">=20"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "open-source-ui-style-gallery",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"description": "Static HTML style gallery derived from open-source UI research",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "playwright test tests/gallery.spec.js --workers=4"
|
|
8
|
+
},
|
|
9
|
+
"devDependencies": {
|
|
10
|
+
"@playwright/test": "1.62.1"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
const root = document.documentElement;
|
|
3
|
+
const body = document.body;
|
|
4
|
+
const savedTheme = localStorage.getItem("ui-gallery-theme");
|
|
5
|
+
const prefersDark = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
6
|
+
|
|
7
|
+
if (savedTheme === "dark" || (!savedTheme && prefersDark)) {
|
|
8
|
+
root.classList.add("dark");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function refreshIcons() {
|
|
12
|
+
if (window.lucide) {
|
|
13
|
+
window.lucide.createIcons({ attrs: { "aria-hidden": "true" } });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function updateThemeLabels() {
|
|
18
|
+
document.querySelectorAll("[data-theme-toggle]").forEach((button) => {
|
|
19
|
+
const dark = root.classList.contains("dark");
|
|
20
|
+
button.setAttribute("aria-label", dark ? "切换到浅色主题" : "切换到深色主题");
|
|
21
|
+
button.setAttribute("title", dark ? "浅色主题" : "深色主题");
|
|
22
|
+
button.innerHTML = `<i data-lucide="${dark ? "sun" : "moon"}"></i>`;
|
|
23
|
+
});
|
|
24
|
+
refreshIcons();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
document.addEventListener("click", (event) => {
|
|
28
|
+
const themeButton = event.target.closest("[data-theme-toggle]");
|
|
29
|
+
if (themeButton) {
|
|
30
|
+
root.classList.toggle("dark");
|
|
31
|
+
localStorage.setItem("ui-gallery-theme", root.classList.contains("dark") ? "dark" : "light");
|
|
32
|
+
updateThemeLabels();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const tokenButton = event.target.closest("[data-token-toggle]");
|
|
37
|
+
if (tokenButton) {
|
|
38
|
+
const drawer = document.querySelector(".token-drawer");
|
|
39
|
+
if (drawer) {
|
|
40
|
+
const open = drawer.classList.toggle("open");
|
|
41
|
+
tokenButton.setAttribute("aria-expanded", String(open));
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const drawerClose = event.target.closest("[data-token-close]");
|
|
47
|
+
if (drawerClose) {
|
|
48
|
+
document.querySelector(".token-drawer")?.classList.remove("open");
|
|
49
|
+
document.querySelector("[data-token-toggle]")?.setAttribute("aria-expanded", "false");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const drawerButton = event.target.closest("[data-sidebar-toggle]");
|
|
54
|
+
if (drawerButton) {
|
|
55
|
+
const drawer = document.querySelector(".sidebar.drawer");
|
|
56
|
+
if (drawer) {
|
|
57
|
+
const open = drawer.classList.toggle("open");
|
|
58
|
+
drawerButton.setAttribute("aria-expanded", String(open));
|
|
59
|
+
}
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const densityButton = event.target.closest("[data-density]");
|
|
64
|
+
if (densityButton) {
|
|
65
|
+
const density = densityButton.dataset.density;
|
|
66
|
+
body.classList.remove("density-compact", "density-default", "density-comfortable");
|
|
67
|
+
body.classList.add(`density-${density}`);
|
|
68
|
+
document.querySelectorAll("[data-density]").forEach((button) => {
|
|
69
|
+
button.classList.toggle("active", button === densityButton);
|
|
70
|
+
});
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const tab = event.target.closest("[data-tab-target]");
|
|
75
|
+
if (tab) {
|
|
76
|
+
const group = tab.closest("[data-tabs]") || document;
|
|
77
|
+
group.querySelectorAll("[data-tab-target]").forEach((item) => item.classList.remove("active"));
|
|
78
|
+
tab.classList.add("active");
|
|
79
|
+
const target = tab.dataset.tabTarget;
|
|
80
|
+
document.querySelectorAll("[data-tab-panel]").forEach((panel) => {
|
|
81
|
+
panel.hidden = panel.dataset.tabPanel !== target;
|
|
82
|
+
});
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const navRow = event.target.closest(".nav-row");
|
|
87
|
+
if (navRow && !navRow.closest("a")) {
|
|
88
|
+
navRow.parentElement?.querySelectorAll(".nav-row").forEach((row) => row.classList.remove("active"));
|
|
89
|
+
navRow.classList.add("active");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const sendButton = event.target.closest("[data-send]");
|
|
93
|
+
if (sendButton) {
|
|
94
|
+
const composer = sendButton.closest(".composer") || document;
|
|
95
|
+
const textarea = composer.querySelector("textarea");
|
|
96
|
+
if (textarea && textarea.value.trim()) {
|
|
97
|
+
sendButton.innerHTML = '<i data-lucide="loader-circle"></i>';
|
|
98
|
+
sendButton.classList.add("is-loading");
|
|
99
|
+
textarea.value = "";
|
|
100
|
+
setTimeout(() => {
|
|
101
|
+
sendButton.innerHTML = '<i data-lucide="arrow-up"></i>';
|
|
102
|
+
sendButton.classList.remove("is-loading");
|
|
103
|
+
refreshIcons();
|
|
104
|
+
}, 900);
|
|
105
|
+
refreshIcons();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const approval = event.target.closest("[data-approval]");
|
|
110
|
+
if (approval) {
|
|
111
|
+
const card = approval.closest(".approval-card");
|
|
112
|
+
if (card) {
|
|
113
|
+
card.dataset.state = approval.dataset.approval;
|
|
114
|
+
card.querySelector(".approval-actions")?.remove();
|
|
115
|
+
const status = document.createElement("div");
|
|
116
|
+
status.className = `approval-result ${approval.dataset.approval}`;
|
|
117
|
+
status.textContent = approval.dataset.approval === "allow" ? "已允许本次操作" : "已拒绝操作";
|
|
118
|
+
card.appendChild(status);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
document.addEventListener("keydown", (event) => {
|
|
124
|
+
if (event.key === "Escape") {
|
|
125
|
+
document.querySelector(".token-drawer")?.classList.remove("open");
|
|
126
|
+
document.querySelector(".sidebar.drawer")?.classList.remove("open");
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
window.addEventListener("DOMContentLoaded", () => {
|
|
131
|
+
updateThemeLabels();
|
|
132
|
+
refreshIcons();
|
|
133
|
+
});
|
|
134
|
+
})();
|