claudecode-omc 5.6.6 → 5.6.8

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 (179) hide show
  1. package/.local/skills/THIRD_PARTY_LICENSES/AvdLee-SwiftUI-Agent-Skill.LICENSE +21 -0
  2. package/.local/skills/THIRD_PARTY_LICENSES/Dimillian-Skills.LICENSE +21 -0
  3. package/.local/skills/THIRD_PARTY_LICENSES/README.md +36 -0
  4. package/.local/skills/THIRD_PARTY_LICENSES/twostraws-swiftui-agent-skill.LICENSE +21 -0
  5. package/.local/skills/h5-to-swiftui/SKILL.md +201 -0
  6. package/.local/skills/h5-to-swiftui/assets/calibration/README.md +176 -0
  7. package/.local/skills/h5-to-swiftui/assets/calibration/h5-twin/index.html +52 -0
  8. package/.local/skills/h5-to-swiftui/assets/calibration/h5-twin/style.css +133 -0
  9. package/.local/skills/h5-to-swiftui/assets/calibration/swiftui-twin/Package.swift +26 -0
  10. package/.local/skills/h5-to-swiftui/assets/calibration/swiftui-twin/Sources/CalibrationScreen/CalibrationScreen.swift +142 -0
  11. package/.local/skills/h5-to-swiftui/assets/calibration/swiftui-twin-divergent/Package.swift +32 -0
  12. package/.local/skills/h5-to-swiftui/assets/calibration/swiftui-twin-divergent/Sources/CalibrationScreenDivergent/CalibrationScreenDivergent.swift +122 -0
  13. package/.local/skills/h5-to-swiftui/assets/calibration/tokens.json +42 -0
  14. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/index.html +14 -0
  15. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/package.json +20 -0
  16. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/public/api/articles/001.json +96 -0
  17. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/public/api/articles/index.json +89 -0
  18. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/App.jsx +22 -0
  19. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/App.module.css +11 -0
  20. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/ArticleCard.jsx +53 -0
  21. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/ArticleCard.module.css +139 -0
  22. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/NavBar.jsx +37 -0
  23. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/NavBar.module.css +72 -0
  24. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/TagCloud.jsx +30 -0
  25. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/TagCloud.module.css +50 -0
  26. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/TrendChart.jsx +159 -0
  27. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/TrendChart.module.css +21 -0
  28. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/main.jsx +12 -0
  29. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/screens/ArticleScreen.jsx +182 -0
  30. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/screens/ArticleScreen.module.css +294 -0
  31. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/screens/FeedScreen.jsx +147 -0
  32. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/screens/FeedScreen.module.css +161 -0
  33. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/styles/global.css +50 -0
  34. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/styles/tokens.css +103 -0
  35. package/.local/skills/h5-to-swiftui/assets/sample-h5-react/vite.config.js +6 -0
  36. package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/data/tasks.js +67 -0
  37. package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/index.html +26 -0
  38. package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/router.js +73 -0
  39. package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/screens/detail.js +164 -0
  40. package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/screens/home.js +53 -0
  41. package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/screens/list.js +87 -0
  42. package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/styles/app.css +342 -0
  43. package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/styles/tokens.css +68 -0
  44. package/.local/skills/h5-to-swiftui/references/css-to-swiftui-map.md +205 -0
  45. package/.local/skills/h5-to-swiftui/references/design-token-extraction.md +209 -0
  46. package/.local/skills/h5-to-swiftui/references/high-risk-triage.md +209 -0
  47. package/.local/skills/h5-to-swiftui/references/render-equivalence-calibration.md +193 -0
  48. package/.local/skills/h5-to-swiftui/references/stack-detection.md +160 -0
  49. package/.local/skills/h5-to-swiftui/references/visual-diff-loop-protocol.md +365 -0
  50. package/.local/skills/h5-to-swiftui/scripts/_calib-consts.mjs +150 -0
  51. package/.local/skills/h5-to-swiftui/scripts/_imglib.mjs +547 -0
  52. package/.local/skills/h5-to-swiftui/scripts/_provenance.mjs +123 -0
  53. package/.local/skills/h5-to-swiftui/scripts/calibrate-render.mjs +625 -0
  54. package/.local/skills/h5-to-swiftui/scripts/capture-reference.mjs +386 -0
  55. package/.local/skills/h5-to-swiftui/scripts/detect-stack.mjs +305 -0
  56. package/.local/skills/h5-to-swiftui/scripts/evaluate-convergence.mjs +1093 -0
  57. package/.local/skills/h5-to-swiftui/scripts/extract-tokens.mjs +600 -0
  58. package/.local/skills/h5-to-swiftui/scripts/mark-overlay.mjs +379 -0
  59. package/.local/skills/h5-to-swiftui/scripts/pixel-diff.mjs +530 -0
  60. package/.local/skills/h5-to-swiftui/scripts/sim-screenshot.sh +544 -0
  61. package/.local/skills/ios-debugger-agent/SKILL.md +51 -0
  62. package/.local/skills/ios-debugger-agent/agents/openai.yaml +4 -0
  63. package/.local/skills/swift-concurrency-expert/SKILL.md +105 -0
  64. package/.local/skills/swift-concurrency-expert/agents/openai.yaml +4 -0
  65. package/.local/skills/swift-concurrency-expert/references/approachable-concurrency.md +63 -0
  66. package/.local/skills/swift-concurrency-expert/references/swift-6-2-concurrency.md +272 -0
  67. package/.local/skills/swift-concurrency-expert/references/swiftui-concurrency-tour-wwdc.md +33 -0
  68. package/.local/skills/swiftui-expert-skill/SKILL.md +162 -0
  69. package/.local/skills/swiftui-expert-skill/references/accessibility-patterns.md +215 -0
  70. package/.local/skills/swiftui-expert-skill/references/animation-advanced.md +403 -0
  71. package/.local/skills/swiftui-expert-skill/references/animation-basics.md +284 -0
  72. package/.local/skills/swiftui-expert-skill/references/animation-transitions.md +326 -0
  73. package/.local/skills/swiftui-expert-skill/references/charts-accessibility.md +135 -0
  74. package/.local/skills/swiftui-expert-skill/references/charts.md +602 -0
  75. package/.local/skills/swiftui-expert-skill/references/focus-patterns.md +299 -0
  76. package/.local/skills/swiftui-expert-skill/references/image-optimization.md +203 -0
  77. package/.local/skills/swiftui-expert-skill/references/latest-apis.md +488 -0
  78. package/.local/skills/swiftui-expert-skill/references/layout-best-practices.md +266 -0
  79. package/.local/skills/swiftui-expert-skill/references/liquid-glass.md +423 -0
  80. package/.local/skills/swiftui-expert-skill/references/list-patterns.md +446 -0
  81. package/.local/skills/swiftui-expert-skill/references/macos-scenes.md +318 -0
  82. package/.local/skills/swiftui-expert-skill/references/macos-views.md +357 -0
  83. package/.local/skills/swiftui-expert-skill/references/macos-window-styling.md +303 -0
  84. package/.local/skills/swiftui-expert-skill/references/performance-patterns.md +403 -0
  85. package/.local/skills/swiftui-expert-skill/references/scroll-patterns.md +293 -0
  86. package/.local/skills/swiftui-expert-skill/references/sheet-navigation-patterns.md +363 -0
  87. package/.local/skills/swiftui-expert-skill/references/state-management.md +388 -0
  88. package/.local/skills/swiftui-expert-skill/references/text-patterns.md +32 -0
  89. package/.local/skills/swiftui-expert-skill/references/trace-analysis.md +295 -0
  90. package/.local/skills/swiftui-expert-skill/references/trace-recording.md +134 -0
  91. package/.local/skills/swiftui-expert-skill/references/view-structure.md +780 -0
  92. package/.local/skills/swiftui-expert-skill/scripts/__pycache__/analyze_trace.cpython-313.pyc +0 -0
  93. package/.local/skills/swiftui-expert-skill/scripts/__pycache__/record_trace.cpython-313.pyc +0 -0
  94. package/.local/skills/swiftui-expert-skill/scripts/analyze_trace.py +301 -0
  95. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__init__.py +1 -0
  96. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__pycache__/__init__.cpython-313.pyc +0 -0
  97. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__pycache__/causes.cpython-313.pyc +0 -0
  98. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__pycache__/correlate.cpython-313.pyc +0 -0
  99. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__pycache__/events.cpython-313.pyc +0 -0
  100. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__pycache__/hangs.cpython-313.pyc +0 -0
  101. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__pycache__/hitches.cpython-313.pyc +0 -0
  102. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__pycache__/summary.cpython-313.pyc +0 -0
  103. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__pycache__/swiftui.cpython-313.pyc +0 -0
  104. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__pycache__/time_profiler.cpython-313.pyc +0 -0
  105. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__pycache__/xctrace.cpython-313.pyc +0 -0
  106. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/__pycache__/xml_utils.cpython-313.pyc +0 -0
  107. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/causes.py +187 -0
  108. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/correlate.py +179 -0
  109. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/events.py +291 -0
  110. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/hangs.py +108 -0
  111. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/hitches.py +145 -0
  112. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/summary.py +243 -0
  113. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/swiftui.py +195 -0
  114. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/time_profiler.py +135 -0
  115. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/xctrace.py +117 -0
  116. package/.local/skills/swiftui-expert-skill/scripts/instruments_parser/xml_utils.py +224 -0
  117. package/.local/skills/swiftui-expert-skill/scripts/record_trace.py +252 -0
  118. package/.local/skills/swiftui-liquid-glass/SKILL.md +90 -0
  119. package/.local/skills/swiftui-liquid-glass/agents/openai.yaml +4 -0
  120. package/.local/skills/swiftui-liquid-glass/references/liquid-glass.md +280 -0
  121. package/.local/skills/swiftui-performance-audit/SKILL.md +106 -0
  122. package/.local/skills/swiftui-performance-audit/agents/openai.yaml +4 -0
  123. package/.local/skills/swiftui-performance-audit/references/code-smells.md +150 -0
  124. package/.local/skills/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md +46 -0
  125. package/.local/skills/swiftui-performance-audit/references/optimizing-swiftui-performance-instruments.md +29 -0
  126. package/.local/skills/swiftui-performance-audit/references/profiling-intake.md +44 -0
  127. package/.local/skills/swiftui-performance-audit/references/report-template.md +47 -0
  128. package/.local/skills/swiftui-performance-audit/references/understanding-hangs-in-your-app.md +33 -0
  129. package/.local/skills/swiftui-performance-audit/references/understanding-improving-swiftui-performance.md +52 -0
  130. package/.local/skills/swiftui-pro/SKILL.md +108 -0
  131. package/.local/skills/swiftui-pro/agents/openai.yaml +10 -0
  132. package/.local/skills/swiftui-pro/assets/swiftui-pro-icon.png +0 -0
  133. package/.local/skills/swiftui-pro/assets/swiftui-pro-icon.svg +29 -0
  134. package/.local/skills/swiftui-pro/references/accessibility.md +13 -0
  135. package/.local/skills/swiftui-pro/references/api.md +39 -0
  136. package/.local/skills/swiftui-pro/references/data.md +43 -0
  137. package/.local/skills/swiftui-pro/references/design.md +32 -0
  138. package/.local/skills/swiftui-pro/references/hygiene.md +9 -0
  139. package/.local/skills/swiftui-pro/references/navigation.md +14 -0
  140. package/.local/skills/swiftui-pro/references/performance.md +46 -0
  141. package/.local/skills/swiftui-pro/references/swift.md +56 -0
  142. package/.local/skills/swiftui-pro/references/views.md +36 -0
  143. package/.local/skills/swiftui-ui-patterns/SKILL.md +95 -0
  144. package/.local/skills/swiftui-ui-patterns/agents/openai.yaml +4 -0
  145. package/.local/skills/swiftui-ui-patterns/references/app-wiring.md +201 -0
  146. package/.local/skills/swiftui-ui-patterns/references/async-state.md +96 -0
  147. package/.local/skills/swiftui-ui-patterns/references/components-index.md +50 -0
  148. package/.local/skills/swiftui-ui-patterns/references/controls.md +57 -0
  149. package/.local/skills/swiftui-ui-patterns/references/deeplinks.md +66 -0
  150. package/.local/skills/swiftui-ui-patterns/references/focus.md +90 -0
  151. package/.local/skills/swiftui-ui-patterns/references/form.md +97 -0
  152. package/.local/skills/swiftui-ui-patterns/references/grids.md +71 -0
  153. package/.local/skills/swiftui-ui-patterns/references/haptics.md +71 -0
  154. package/.local/skills/swiftui-ui-patterns/references/input-toolbar.md +51 -0
  155. package/.local/skills/swiftui-ui-patterns/references/lightweight-clients.md +93 -0
  156. package/.local/skills/swiftui-ui-patterns/references/list.md +86 -0
  157. package/.local/skills/swiftui-ui-patterns/references/loading-placeholders.md +38 -0
  158. package/.local/skills/swiftui-ui-patterns/references/macos-settings.md +71 -0
  159. package/.local/skills/swiftui-ui-patterns/references/matched-transitions.md +59 -0
  160. package/.local/skills/swiftui-ui-patterns/references/media.md +73 -0
  161. package/.local/skills/swiftui-ui-patterns/references/menu-bar.md +101 -0
  162. package/.local/skills/swiftui-ui-patterns/references/navigationstack.md +159 -0
  163. package/.local/skills/swiftui-ui-patterns/references/overlay.md +45 -0
  164. package/.local/skills/swiftui-ui-patterns/references/performance.md +62 -0
  165. package/.local/skills/swiftui-ui-patterns/references/previews.md +48 -0
  166. package/.local/skills/swiftui-ui-patterns/references/scroll-reveal.md +133 -0
  167. package/.local/skills/swiftui-ui-patterns/references/scrollview.md +87 -0
  168. package/.local/skills/swiftui-ui-patterns/references/searchable.md +71 -0
  169. package/.local/skills/swiftui-ui-patterns/references/sheets.md +155 -0
  170. package/.local/skills/swiftui-ui-patterns/references/split-views.md +72 -0
  171. package/.local/skills/swiftui-ui-patterns/references/tabview.md +114 -0
  172. package/.local/skills/swiftui-ui-patterns/references/theming.md +71 -0
  173. package/.local/skills/swiftui-ui-patterns/references/title-menus.md +93 -0
  174. package/.local/skills/swiftui-ui-patterns/references/top-bar.md +49 -0
  175. package/.local/skills/swiftui-view-refactor/SKILL.md +202 -0
  176. package/.local/skills/swiftui-view-refactor/agents/openai.yaml +4 -0
  177. package/.local/skills/swiftui-view-refactor/references/mv-patterns.md +161 -0
  178. package/bundled/manifest.json +1 -1
  179. package/package.json +1 -1
@@ -0,0 +1,53 @@
1
+ /* ── Home screen ─────────────────────────────────────────────────────────── *
2
+ * Route: #/home
3
+ * Shows: hero text, summary stats derived from TASKS, two CTA buttons.
4
+ * Tier-1 surface: text, buttons, stat cards, flex layout.
5
+ * ─────────────────────────────────────────────────────────────────────────── */
6
+
7
+ /* global TASKS */
8
+
9
+ function renderHome(/* params */) {
10
+ 'use strict';
11
+
12
+ const total = TASKS.length;
13
+ const done = TASKS.filter(t => t.done).length;
14
+ const pending = total - done;
15
+ const highPri = TASKS.filter(t => t.priority === 'high' && !t.done).length;
16
+
17
+ const screen = document.createElement('section');
18
+ screen.className = 'screen';
19
+ screen.setAttribute('aria-label', 'Home');
20
+
21
+ screen.innerHTML = `
22
+ <div class="home-hero">
23
+ <h1>TaskFlow</h1>
24
+ <p>A simple task manager — open <code>index.html</code> directly, no build required.</p>
25
+ </div>
26
+
27
+ <div class="home-stats" role="list" aria-label="Summary stats">
28
+ <div class="stat-card" role="listitem">
29
+ <span class="stat-value">${total}</span>
30
+ <span class="stat-label">Total</span>
31
+ </div>
32
+ <div class="stat-card" role="listitem">
33
+ <span class="stat-value">${pending}</span>
34
+ <span class="stat-label">Pending</span>
35
+ </div>
36
+ <div class="stat-card" role="listitem">
37
+ <span class="stat-value">${done}</span>
38
+ <span class="stat-label">Done</span>
39
+ </div>
40
+ <div class="stat-card" role="listitem">
41
+ <span class="stat-value">${highPri}</span>
42
+ <span class="stat-label">High priority</span>
43
+ </div>
44
+ </div>
45
+
46
+ <div class="home-cta">
47
+ <a href="#/list" class="btn btn-primary">View Tasks</a>
48
+ <a href="#/detail?id=1" class="btn btn-secondary">Sample Detail</a>
49
+ </div>
50
+ `;
51
+
52
+ return screen;
53
+ }
@@ -0,0 +1,87 @@
1
+ /* ── List screen ─────────────────────────────────────────────────────────── *
2
+ * Route: #/list
3
+ * Shows: filterable task list loaded from window.TASKS (in-file JS array).
4
+ * Tier-1 surface: list rows, badges, flex layout, text.
5
+ * ─────────────────────────────────────────────────────────────────────────── */
6
+
7
+ /* global TASKS */
8
+
9
+ function renderList(/* params */) {
10
+ 'use strict';
11
+
12
+ const screen = document.createElement('section');
13
+ screen.className = 'screen';
14
+ screen.setAttribute('aria-label', 'Task list');
15
+
16
+ // ── State ──
17
+ let filter = 'all'; // 'all' | 'pending' | 'done'
18
+
19
+ function filteredTasks() {
20
+ if (filter === 'pending') return TASKS.filter(t => !t.done);
21
+ if (filter === 'done') return TASKS.filter(t => t.done);
22
+ return TASKS;
23
+ }
24
+
25
+ // ── Render task rows ──
26
+ function buildTaskList() {
27
+ const tasks = filteredTasks();
28
+
29
+ if (tasks.length === 0) {
30
+ return `<div class="empty-state"><p>No tasks in this filter.</p></div>`;
31
+ }
32
+
33
+ const rows = tasks.map(task => `
34
+ <li class="task-row ${task.done ? 'task-done' : ''}"
35
+ data-id="${task.id}"
36
+ role="button"
37
+ tabindex="0"
38
+ aria-label="${task.title}, ${task.priority} priority, ${task.done ? 'done' : 'pending'}">
39
+ <span class="task-dot priority-${task.priority}" aria-hidden="true"></span>
40
+ <div class="task-info">
41
+ <span class="task-title">${task.title}</span>
42
+ <span class="task-meta">${task.category} · Due ${task.dueDate}</span>
43
+ </div>
44
+ <span class="task-badge">${task.priority}</span>
45
+ </li>
46
+ `).join('');
47
+
48
+ return `<ul class="task-list" aria-label="Tasks">${rows}</ul>`;
49
+ }
50
+
51
+ // ── Full render ──
52
+ function render() {
53
+ screen.innerHTML = `
54
+ <div class="list-header">
55
+ <h2>Tasks</h2>
56
+ <div style="display:flex; gap:var(--space-2)">
57
+ <button class="btn btn-secondary ${filter === 'all' ? 'active' : ''}" data-filter="all">All</button>
58
+ <button class="btn btn-secondary ${filter === 'pending' ? 'active' : ''}" data-filter="pending">Pending</button>
59
+ <button class="btn btn-secondary ${filter === 'done' ? 'active' : ''}" data-filter="done">Done</button>
60
+ </div>
61
+ </div>
62
+ ${buildTaskList()}
63
+ `;
64
+
65
+ // Bind filter buttons
66
+ screen.querySelectorAll('[data-filter]').forEach(btn => {
67
+ btn.addEventListener('click', () => {
68
+ filter = btn.dataset.filter;
69
+ render();
70
+ });
71
+ });
72
+
73
+ // Bind task rows → navigate to detail
74
+ screen.querySelectorAll('.task-row').forEach(row => {
75
+ function goDetail() {
76
+ window.location.hash = `#/detail?id=${row.dataset.id}`;
77
+ }
78
+ row.addEventListener('click', goDetail);
79
+ row.addEventListener('keydown', e => {
80
+ if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); goDetail(); }
81
+ });
82
+ });
83
+ }
84
+
85
+ render();
86
+ return screen;
87
+ }
@@ -0,0 +1,342 @@
1
+ /* ── Global reset & base ─────────────────────────────────────────────────── */
2
+
3
+ *, *::before, *::after {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ body {
10
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
11
+ font-size: var(--font-size-body);
12
+ line-height: var(--line-height-normal);
13
+ background-color: var(--color-bg);
14
+ color: var(--color-text);
15
+ min-height: 100vh;
16
+ }
17
+
18
+ /* ── Nav bar ─────────────────────────────────────────────────────────────── */
19
+
20
+ #nav-bar {
21
+ display: flex;
22
+ align-items: center;
23
+ gap: var(--space-4);
24
+ padding: 0 var(--space-6);
25
+ height: var(--nav-height);
26
+ background-color: var(--color-surface);
27
+ border-bottom: 1px solid var(--color-border);
28
+ position: sticky;
29
+ top: 0;
30
+ z-index: 10;
31
+ }
32
+
33
+ .nav-link {
34
+ font-size: var(--font-size-body);
35
+ font-weight: var(--font-weight-medium);
36
+ color: var(--color-text-secondary);
37
+ text-decoration: none;
38
+ padding: var(--space-1) var(--space-2);
39
+ border-radius: var(--radius-sm);
40
+ transition: color 0.15s, background-color 0.15s;
41
+ }
42
+
43
+ .nav-link:hover {
44
+ color: var(--color-primary);
45
+ background-color: var(--color-surface-alt);
46
+ }
47
+
48
+ .nav-link.active {
49
+ color: var(--color-primary);
50
+ font-weight: var(--font-weight-bold);
51
+ }
52
+
53
+ /* ── Screen root ─────────────────────────────────────────────────────────── */
54
+
55
+ #screen-root {
56
+ padding: var(--space-6);
57
+ max-width: 640px;
58
+ margin: 0 auto;
59
+ }
60
+
61
+ /* ── Screen transition (simple fade) ────────────────────────────────────── */
62
+
63
+ .screen {
64
+ animation: fadeIn 0.2s ease;
65
+ }
66
+
67
+ @keyframes fadeIn {
68
+ from { opacity: 0; transform: translateY(4px); }
69
+ to { opacity: 1; transform: translateY(0); }
70
+ }
71
+
72
+ /* ── Home screen ─────────────────────────────────────────────────────────── */
73
+
74
+ .home-hero {
75
+ display: flex;
76
+ flex-direction: column;
77
+ gap: var(--space-3);
78
+ margin-bottom: var(--space-8);
79
+ }
80
+
81
+ .home-hero h1 {
82
+ font-size: var(--font-size-title);
83
+ font-weight: var(--font-weight-bold);
84
+ line-height: var(--line-height-tight);
85
+ }
86
+
87
+ .home-hero p {
88
+ color: var(--color-text-secondary);
89
+ font-size: var(--font-size-body);
90
+ }
91
+
92
+ .home-stats {
93
+ display: flex;
94
+ gap: var(--space-4);
95
+ flex-wrap: wrap;
96
+ margin-bottom: var(--space-8);
97
+ }
98
+
99
+ .stat-card {
100
+ flex: 1 1 120px;
101
+ background-color: var(--color-surface);
102
+ border-radius: var(--radius-md);
103
+ padding: var(--space-4);
104
+ box-shadow: var(--shadow-card);
105
+ display: flex;
106
+ flex-direction: column;
107
+ gap: var(--space-1);
108
+ }
109
+
110
+ .stat-card .stat-value {
111
+ font-size: var(--font-size-title);
112
+ font-weight: var(--font-weight-bold);
113
+ color: var(--color-primary);
114
+ }
115
+
116
+ .stat-card .stat-label {
117
+ font-size: var(--font-size-caption);
118
+ color: var(--color-text-secondary);
119
+ text-transform: uppercase;
120
+ letter-spacing: 0.04em;
121
+ }
122
+
123
+ .home-cta {
124
+ display: flex;
125
+ gap: var(--space-3);
126
+ flex-wrap: wrap;
127
+ }
128
+
129
+ /* ── Buttons ─────────────────────────────────────────────────────────────── */
130
+
131
+ .btn {
132
+ display: inline-flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ padding: var(--space-3) var(--space-5);
136
+ border-radius: var(--radius-md);
137
+ font-size: var(--font-size-body);
138
+ font-weight: var(--font-weight-medium);
139
+ cursor: pointer;
140
+ border: none;
141
+ text-decoration: none;
142
+ transition: opacity 0.15s, transform 0.1s;
143
+ }
144
+
145
+ .btn:active { transform: scale(0.97); }
146
+
147
+ .btn-primary {
148
+ background-color: var(--color-primary);
149
+ color: #ffffff;
150
+ }
151
+
152
+ .btn-primary:hover { background-color: var(--color-primary-dark); }
153
+
154
+ .btn-secondary {
155
+ background-color: var(--color-surface-alt);
156
+ color: var(--color-text);
157
+ border: 1px solid var(--color-border);
158
+ }
159
+
160
+ .btn-secondary:hover { background-color: var(--color-border); }
161
+
162
+ /* ── List screen ─────────────────────────────────────────────────────────── */
163
+
164
+ .list-header {
165
+ display: flex;
166
+ align-items: center;
167
+ justify-content: space-between;
168
+ margin-bottom: var(--space-6);
169
+ }
170
+
171
+ .list-header h2 {
172
+ font-size: var(--font-size-heading);
173
+ font-weight: var(--font-weight-bold);
174
+ }
175
+
176
+ .task-list {
177
+ display: flex;
178
+ flex-direction: column;
179
+ gap: var(--space-3);
180
+ list-style: none;
181
+ }
182
+
183
+ .task-row {
184
+ display: flex;
185
+ align-items: center;
186
+ gap: var(--space-3);
187
+ background-color: var(--color-surface);
188
+ border-radius: var(--radius-md);
189
+ padding: var(--space-4);
190
+ box-shadow: var(--shadow-card);
191
+ cursor: pointer;
192
+ transition: transform 0.1s, box-shadow 0.1s;
193
+ }
194
+
195
+ .task-row:hover {
196
+ transform: translateY(-1px);
197
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12);
198
+ }
199
+
200
+ .task-dot {
201
+ width: 10px;
202
+ height: 10px;
203
+ border-radius: var(--radius-full);
204
+ flex-shrink: 0;
205
+ }
206
+
207
+ .task-dot.priority-high { background-color: var(--color-danger); }
208
+ .task-dot.priority-medium { background-color: #ff9f0a; }
209
+ .task-dot.priority-low { background-color: var(--color-success); }
210
+
211
+ .task-info {
212
+ flex: 1;
213
+ display: flex;
214
+ flex-direction: column;
215
+ gap: var(--space-1);
216
+ }
217
+
218
+ .task-title {
219
+ font-size: var(--font-size-body);
220
+ font-weight: var(--font-weight-medium);
221
+ }
222
+
223
+ .task-meta {
224
+ font-size: var(--font-size-caption);
225
+ color: var(--color-text-secondary);
226
+ }
227
+
228
+ .task-done .task-title {
229
+ text-decoration: line-through;
230
+ color: var(--color-text-secondary);
231
+ }
232
+
233
+ .task-badge {
234
+ font-size: var(--font-size-caption);
235
+ font-weight: var(--font-weight-medium);
236
+ padding: var(--space-1) var(--space-2);
237
+ border-radius: var(--radius-full);
238
+ background-color: var(--color-surface-alt);
239
+ color: var(--color-text-secondary);
240
+ white-space: nowrap;
241
+ }
242
+
243
+ /* ── Detail screen ───────────────────────────────────────────────────────── */
244
+
245
+ .detail-back {
246
+ display: inline-flex;
247
+ align-items: center;
248
+ gap: var(--space-2);
249
+ color: var(--color-primary);
250
+ font-size: var(--font-size-body);
251
+ text-decoration: none;
252
+ margin-bottom: var(--space-6);
253
+ }
254
+
255
+ .detail-card {
256
+ background-color: var(--color-surface);
257
+ border-radius: var(--radius-lg);
258
+ overflow: hidden;
259
+ box-shadow: var(--shadow-card);
260
+ margin-bottom: var(--space-6);
261
+ }
262
+
263
+ .detail-image-placeholder {
264
+ width: 100%;
265
+ height: 180px;
266
+ background-color: var(--color-surface-alt);
267
+ display: flex;
268
+ align-items: center;
269
+ justify-content: center;
270
+ color: var(--color-text-secondary);
271
+ font-size: var(--font-size-caption);
272
+ }
273
+
274
+ .detail-body {
275
+ padding: var(--space-5);
276
+ display: flex;
277
+ flex-direction: column;
278
+ gap: var(--space-3);
279
+ }
280
+
281
+ .detail-title {
282
+ font-size: var(--font-size-heading);
283
+ font-weight: var(--font-weight-bold);
284
+ }
285
+
286
+ .detail-desc {
287
+ color: var(--color-text-secondary);
288
+ line-height: var(--line-height-normal);
289
+ }
290
+
291
+ .detail-meta-row {
292
+ display: flex;
293
+ gap: var(--space-3);
294
+ flex-wrap: wrap;
295
+ }
296
+
297
+ .detail-chip {
298
+ font-size: var(--font-size-caption);
299
+ font-weight: var(--font-weight-medium);
300
+ padding: var(--space-1) var(--space-3);
301
+ border-radius: var(--radius-full);
302
+ background-color: var(--color-surface-alt);
303
+ color: var(--color-text);
304
+ }
305
+
306
+ /* ── Canvas sparkline section ────────────────────────────────────────────── */
307
+
308
+ .sparkline-section {
309
+ margin-bottom: var(--space-6);
310
+ }
311
+
312
+ .sparkline-section h3 {
313
+ font-size: var(--font-size-body);
314
+ font-weight: var(--font-weight-medium);
315
+ margin-bottom: var(--space-3);
316
+ color: var(--color-text-secondary);
317
+ }
318
+
319
+ /* TIER3: canvas custom drawing */
320
+ #sparkline-canvas {
321
+ display: block;
322
+ width: 100%;
323
+ height: 80px;
324
+ border-radius: var(--radius-md);
325
+ background-color: var(--color-surface);
326
+ border: 1px solid var(--color-border);
327
+ }
328
+
329
+ /* ── Empty state ─────────────────────────────────────────────────────────── */
330
+
331
+ .empty-state {
332
+ text-align: center;
333
+ padding: var(--space-12) var(--space-6);
334
+ color: var(--color-text-secondary);
335
+ display: flex;
336
+ flex-direction: column;
337
+ gap: var(--space-3);
338
+ }
339
+
340
+ .empty-state p {
341
+ font-size: var(--font-size-body);
342
+ }
@@ -0,0 +1,68 @@
1
+ /* ── Design Tokens ───────────────────────────────────────────────────────────
2
+ All visual values are defined here as CSS custom properties so that
3
+ extract-tokens.mjs can harvest them in Stage 1.
4
+ ─────────────────────────────────────────────────────────────────────────── */
5
+
6
+ :root {
7
+ /* Colors */
8
+ --color-bg: #f5f5f7;
9
+ --color-surface: #ffffff;
10
+ --color-surface-alt: #f0f0f5;
11
+ --color-primary: #007aff;
12
+ --color-primary-dark: #0055cc;
13
+ --color-text: #1c1c1e;
14
+ --color-text-secondary:#6e6e73;
15
+ --color-border: #d1d1d6;
16
+ --color-danger: #ff3b30;
17
+ --color-success: #34c759;
18
+
19
+ /* Typography */
20
+ --font-size-title: 1.75rem;
21
+ --font-size-heading: 1.25rem;
22
+ --font-size-body: 1rem;
23
+ --font-size-caption: 0.75rem;
24
+ --font-weight-regular: 400;
25
+ --font-weight-medium: 500;
26
+ --font-weight-bold: 700;
27
+ --line-height-tight: 1.2;
28
+ --line-height-normal: 1.5;
29
+
30
+ /* Spacing */
31
+ --space-1: 0.25rem;
32
+ --space-2: 0.5rem;
33
+ --space-3: 0.75rem;
34
+ --space-4: 1rem;
35
+ --space-5: 1.25rem;
36
+ --space-6: 1.5rem;
37
+ --space-8: 2rem;
38
+ --space-12: 3rem;
39
+
40
+ /* Radii */
41
+ --radius-sm: 4px;
42
+ --radius-md: 8px;
43
+ --radius-lg: 16px;
44
+ --radius-full: 9999px;
45
+
46
+ /* Shadows */
47
+ --shadow-card: 0 2px 8px rgba(0, 0, 0, 0.08);
48
+
49
+ /* Nav */
50
+ --nav-height: 3rem;
51
+ }
52
+
53
+ /* ── Dark scheme ─────────────────────────────────────────────────────────── */
54
+ @media (prefers-color-scheme: dark) {
55
+ :root {
56
+ --color-bg: #000000;
57
+ --color-surface: #1c1c1e;
58
+ --color-surface-alt: #2c2c2e;
59
+ --color-primary: #0a84ff;
60
+ --color-primary-dark: #409cff;
61
+ --color-text: #ffffff;
62
+ --color-text-secondary:#aeaeb2;
63
+ --color-border: #38383a;
64
+ --color-danger: #ff453a;
65
+ --color-success: #30d158;
66
+ --shadow-card: 0 2px 8px rgba(0, 0, 0, 0.4);
67
+ }
68
+ }