@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.
Files changed (130) hide show
  1. package/README.md +4 -3
  2. package/dist/src/structured.js +162 -4
  3. package/dist/src/structured.js.map +1 -1
  4. package/package.json +2 -2
  5. package/template/canonical/canonical-specdev-goal-plan.md +14 -15
  6. package/template/canonical/canonical-specdev-grill-with-docs.md +9 -8
  7. package/template/canonical/canonical-specdev-spec.md +9 -8
  8. package/template/canonical/canonical-specdev-tickets.md +13 -14
  9. package/template/canonical/canonical-specdev-wayfinder.md +7 -7
  10. package/template/commands/status.md +3 -3
  11. package/template/skills/archive-and-consolidate/SKILL.md +19 -14
  12. package/template/workflows/learning/A-archive-and-consolidate/A-archive-and-consolidate.md +38 -0
  13. package/template/workflows/learning/A-archive-and-consolidate/promotion-plan-template.md +23 -0
  14. package/template/workflows/learning/A-assess-and-plan/A-assess-and-plan.md +39 -0
  15. package/template/workflows/learning/A-assess-and-plan/change-status-template.json +28 -0
  16. package/template/workflows/learning/A-assess-and-plan/learning-plan-template.md +28 -0
  17. package/template/workflows/learning/E-eli5/E-eli5.md +37 -0
  18. package/template/workflows/learning/E-eli5/lesson-template.md +31 -0
  19. package/template/workflows/learning/I-init-setup/I-init-setup.md +36 -0
  20. package/template/workflows/learning/I-init-setup/context-index-template.md +6 -0
  21. package/template/workflows/learning/I-init-setup/learner-profile-template.md +17 -0
  22. package/template/workflows/learning/I-init-setup/review-index-template.md +4 -0
  23. package/template/workflows/learning/INDEX.md +26 -0
  24. package/template/workflows/learning/P-practice/P-practice.md +34 -0
  25. package/template/workflows/learning/P-practice/practice-template.md +16 -0
  26. package/template/workflows/learning/Q-quiz/Q-quiz.md +34 -0
  27. package/template/workflows/learning/Q-quiz/quiz-artifact-template.md +16 -0
  28. package/template/workflows/learning/R-review/R-review.md +35 -0
  29. package/template/workflows/learning/R-review/review-template.md +12 -0
  30. package/template/workflows/learning/README.md +121 -0
  31. package/template/workflows/learning/_state/archive/.gitkeep +1 -0
  32. package/template/workflows/learning/_state/changes/.gitkeep +1 -0
  33. package/template/workflows/learning/_state/status.json +6 -0
  34. package/template/workflows/learning/common/rules/artifact-contract.md +27 -0
  35. package/template/workflows/learning/common/rules/assessment-policy.md +7 -0
  36. package/template/workflows/learning/common/rules/knowledge-organization.md +9 -0
  37. package/template/workflows/learning/common/rules/mastery-policy.md +21 -0
  38. package/template/workflows/learning/common/rules/path-reference-contract.md +7 -0
  39. package/template/workflows/learning/common/rules/teaching-policy.md +15 -0
  40. package/template/workflows/learning/common/schemas/change-status.schema.json +41 -0
  41. package/template/workflows/learning/common/schemas/status.schema.json +32 -0
  42. package/template/workflows/learning/common/skills/knowledge-promotion/SKILL.md +46 -0
  43. package/template/workflows/learning/common/skills/knowledge-promotion/domain-index-template.md +6 -0
  44. package/template/workflows/learning/common/skills/knowledge-promotion/domain-overview-template.md +19 -0
  45. package/template/workflows/learning/common/skills/knowledge-promotion/knowledge-template.md +25 -0
  46. package/template/workflows/learning/common/tools/validate-learning.mjs +356 -0
  47. package/template/workflows/learning/runtime-contract.json +11 -0
  48. package/template/workflows/specdev/I-init-setup/I-init-setup.md +1 -1
  49. package/template/workflows/specdev/I-init-setup/config-template.json +2 -2
  50. package/template/workflows/specdev/INDEX.md +2 -2
  51. package/template/workflows/specdev/P-goal-plan/planning-modes.md +1 -1
  52. package/template/workflows/specdev/P-prototype/P-prototype.md +30 -26
  53. package/template/workflows/specdev/P-prototype/design-library/INDEX.md +43 -0
  54. package/template/workflows/specdev/P-prototype/design-library/color-and-theme.md +65 -0
  55. package/template/workflows/specdev/P-prototype/design-library/foundations.md +66 -0
  56. package/template/workflows/specdev/P-prototype/design-library/interaction-patterns.md +61 -0
  57. package/template/workflows/specdev/P-prototype/design-library/product-pattern-index.md +73 -0
  58. package/template/workflows/specdev/P-prototype/design-library/research-provenance.md +54 -0
  59. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/METHODOLOGY.md +90 -0
  60. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/README.md +31 -0
  61. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/data/extended-projects.json +241 -0
  62. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/data/projects.json +253 -0
  63. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/reference/USAGE.md +40 -0
  64. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/reference/design-tokens.css +145 -0
  65. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/report/OPEN_SOURCE_UI_RESEARCH_2026.md +519 -0
  66. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/PROJECT_TEMPLATE.md +29 -0
  67. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/README.md +9 -0
  68. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/claude-code-modern-clients.md +407 -0
  69. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/creative-ai-communication.md +574 -0
  70. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/data-dev-tools.md +432 -0
  71. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/personal-multiplatform-apps.md +185 -0
  72. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/productivity-collaboration.md +398 -0
  73. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/01-dense-ide.html +68 -0
  74. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/02-monochrome-console.html +18 -0
  75. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/03-soft-personal-ai.html +17 -0
  76. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/04-responsive-web.html +14 -0
  77. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/05-mobile-supervisor.html +16 -0
  78. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/06-cross-platform-workspace.html +17 -0
  79. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/07-local-first-content.html +9 -0
  80. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/08-media-first.html +17 -0
  81. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/README.md +49 -0
  82. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/ATTRIBUTION.md +9 -0
  83. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/landscape.jpg +0 -0
  84. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/lucide.js +20494 -0
  85. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/mountain.jpg +0 -0
  86. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/workspace.jpg +0 -0
  87. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/index.html +70 -0
  88. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/package-lock.json +78 -0
  89. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/package.json +12 -0
  90. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/screenshots/index-desktop.png +0 -0
  91. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/scripts/gallery.js +134 -0
  92. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/styles/base.css +795 -0
  93. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/styles/pages.css +533 -0
  94. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/tests/gallery.spec.js +56 -0
  95. package/template/workflows/specdev/P-prototype/design-library/responsive-and-platforms.md +53 -0
  96. package/template/workflows/specdev/P-prototype/design-library/style-index.md +32 -0
  97. package/template/workflows/specdev/P-prototype/design-package.schema.json +70 -0
  98. package/template/workflows/specdev/P-prototype/design-system-template.md +366 -0
  99. package/template/workflows/specdev/P-prototype/detect-existing-style.md +53 -0
  100. package/template/workflows/specdev/P-prototype/generate-design-package.md +50 -0
  101. package/template/workflows/specdev/P-prototype/style-selection-protocol.md +41 -0
  102. package/template/workflows/specdev/P-prototype/tools/materialize-prototype.mjs +126 -0
  103. package/template/workflows/specdev/P-prototype/tools/validate-design-package.mjs +155 -0
  104. package/template/workflows/specdev/README.md +12 -11
  105. package/template/workflows/specdev/T-triage/T-triage.md +1 -1
  106. package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +1 -1
  107. package/template/workflows/specdev/common/README.md +2 -2
  108. package/template/workflows/specdev/common/rules/artifact-contract.md +3 -2
  109. package/template/workflows/specdev/common/schemas/config.schema.json +4 -4
  110. package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +4 -4
  111. package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +1 -3
  112. package/template/workflows/specdev/common/tools/validate-specdev.mjs +83 -92
  113. package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +0 -1968
  114. package/template/workflows/specdev/E-eli5/E-eli5.md +0 -97
  115. package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +0 -254
  116. package/template/workflows/specdev/E-engineering-cognitive-mentor/architecture-guidance.md +0 -90
  117. package/template/workflows/specdev/E-engineering-cognitive-mentor/bug-guidance.md +0 -80
  118. package/template/workflows/specdev/E-engineering-cognitive-mentor/codebase-guidance.md +0 -107
  119. package/template/workflows/specdev/E-engineering-cognitive-mentor/comprehension-and-closure.md +0 -95
  120. package/template/workflows/specdev/E-engineering-cognitive-mentor/domain-learning-guidance.md +0 -62
  121. package/template/workflows/specdev/E-engineering-cognitive-mentor/evidence-and-options.md +0 -132
  122. package/template/workflows/specdev/E-engineering-cognitive-mentor/interaction-protocol.md +0 -116
  123. package/template/workflows/specdev/E-engineering-cognitive-mentor/mentor-report-template.md +0 -135
  124. package/template/workflows/specdev/E-engineering-cognitive-mentor/mode-routing.md +0 -47
  125. package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +0 -132
  126. package/template/workflows/specdev/E-engineering-cognitive-mentor/requirements-guidance.md +0 -92
  127. package/template/workflows/specdev/P-prototype/logic-prototype.md +0 -24
  128. package/template/workflows/specdev/P-prototype/prototype-record-template.md +0 -46
  129. package/template/workflows/specdev/P-prototype/ui-prototype.md +0 -21
  130. package/template/workflows/specdev/common/schemas/prototype-record.schema.json +0 -24
@@ -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
+ }
@@ -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
+ })();