sensorium-mcp 3.1.2 → 3.1.3-board.2

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 (217) hide show
  1. package/Install-Sensorium.ps1 +61 -0
  2. package/dist/board/api/api.js +61 -0
  3. package/dist/board/api/client.js +96 -0
  4. package/dist/board/components/BottomNav.js +32 -0
  5. package/dist/board/components/Card.js +44 -0
  6. package/dist/board/components/CommentComposer.js +26 -0
  7. package/dist/board/components/CommentList.js +39 -0
  8. package/dist/board/components/Dropdown.js +66 -0
  9. package/dist/board/components/Lane.js +40 -0
  10. package/dist/board/components/PriorityChip.js +17 -0
  11. package/dist/board/components/ProfileSummary.js +39 -0
  12. package/dist/board/components/StateBanner.js +22 -0
  13. package/dist/board/components/StatusChip.js +21 -0
  14. package/dist/board/components/TokenEntry.js +42 -0
  15. package/dist/board/config.js +56 -0
  16. package/dist/board/index.html +18 -0
  17. package/dist/board/main.js +37 -0
  18. package/dist/board/mock/api.mock.js +193 -0
  19. package/dist/board/mock/fixtures.js +164 -0
  20. package/dist/board/schema/policy.js +192 -0
  21. package/dist/board/state/auth.js +55 -0
  22. package/dist/board/state/useBoard.js +149 -0
  23. package/dist/board/state/useBuilder.js +98 -0
  24. package/dist/board/state/useCard.js +67 -0
  25. package/dist/board/styles/board.css +1760 -0
  26. package/dist/board/styles/tokens.css +71 -0
  27. package/dist/board/vendor/vue.esm-browser.js +9 -0
  28. package/dist/board/views/App.js +65 -0
  29. package/dist/board/views/BoardView.js +84 -0
  30. package/dist/board/views/BuilderView.js +303 -0
  31. package/dist/board/views/CardView.js +245 -0
  32. package/dist/board/views/SettingsView.js +145 -0
  33. package/dist/config/agent-settings.d.ts +2 -0
  34. package/dist/config/agent-settings.d.ts.map +1 -1
  35. package/dist/config/agent-settings.js +23 -0
  36. package/dist/config/agent-settings.js.map +1 -1
  37. package/dist/config/index.d.ts +1 -0
  38. package/dist/config/index.d.ts.map +1 -1
  39. package/dist/config/index.js +12 -0
  40. package/dist/config/index.js.map +1 -1
  41. package/dist/config/misc-settings.d.ts +14 -0
  42. package/dist/config/misc-settings.d.ts.map +1 -1
  43. package/dist/config/misc-settings.js +53 -0
  44. package/dist/config/misc-settings.js.map +1 -1
  45. package/dist/dashboard/board-static.d.ts +23 -0
  46. package/dist/dashboard/board-static.d.ts.map +1 -0
  47. package/dist/dashboard/board-static.js +131 -0
  48. package/dist/dashboard/board-static.js.map +1 -0
  49. package/dist/dashboard/routes/board.d.ts +73 -0
  50. package/dist/dashboard/routes/board.d.ts.map +1 -0
  51. package/dist/dashboard/routes/board.js +623 -0
  52. package/dist/dashboard/routes/board.js.map +1 -0
  53. package/dist/dashboard/routes/claude.d.ts.map +1 -1
  54. package/dist/dashboard/routes/claude.js +10 -1
  55. package/dist/dashboard/routes/claude.js.map +1 -1
  56. package/dist/dashboard/routes/settings.d.ts +2 -0
  57. package/dist/dashboard/routes/settings.d.ts.map +1 -1
  58. package/dist/dashboard/routes/settings.js +24 -1
  59. package/dist/dashboard/routes/settings.js.map +1 -1
  60. package/dist/dashboard/routes/threads-read.d.ts +7 -3
  61. package/dist/dashboard/routes/threads-read.d.ts.map +1 -1
  62. package/dist/dashboard/routes/threads-read.js +19 -4
  63. package/dist/dashboard/routes/threads-read.js.map +1 -1
  64. package/dist/dashboard/routes/types.d.ts +6 -0
  65. package/dist/dashboard/routes/types.d.ts.map +1 -1
  66. package/dist/dashboard/routes/types.js.map +1 -1
  67. package/dist/dashboard/routes.d.ts.map +1 -1
  68. package/dist/dashboard/routes.js +42 -1
  69. package/dist/dashboard/routes.js.map +1 -1
  70. package/dist/dashboard/spa.html +12 -12
  71. package/dist/data/board/board-schema.d.ts +22 -0
  72. package/dist/data/board/board-schema.d.ts.map +1 -0
  73. package/dist/data/board/board-schema.js +103 -0
  74. package/dist/data/board/board-schema.js.map +1 -0
  75. package/dist/data/board/board-types.d.ts +117 -0
  76. package/dist/data/board/board-types.d.ts.map +1 -0
  77. package/dist/data/board/board-types.js +9 -0
  78. package/dist/data/board/board-types.js.map +1 -0
  79. package/dist/data/board/card.repository.d.ts +64 -0
  80. package/dist/data/board/card.repository.d.ts.map +1 -0
  81. package/dist/data/board/card.repository.js +272 -0
  82. package/dist/data/board/card.repository.js.map +1 -0
  83. package/dist/data/board/comment.repository.d.ts +12 -0
  84. package/dist/data/board/comment.repository.d.ts.map +1 -0
  85. package/dist/data/board/comment.repository.js +31 -0
  86. package/dist/data/board/comment.repository.js.map +1 -0
  87. package/dist/data/board/lane.repository.d.ts +18 -0
  88. package/dist/data/board/lane.repository.d.ts.map +1 -0
  89. package/dist/data/board/lane.repository.js +44 -0
  90. package/dist/data/board/lane.repository.js.map +1 -0
  91. package/dist/data/board/profile-defaults.d.ts +19 -0
  92. package/dist/data/board/profile-defaults.d.ts.map +1 -0
  93. package/dist/data/board/profile-defaults.js +118 -0
  94. package/dist/data/board/profile-defaults.js.map +1 -0
  95. package/dist/data/memory/migration-runner.d.ts.map +1 -1
  96. package/dist/data/memory/migration-runner.js +4 -0
  97. package/dist/data/memory/migration-runner.js.map +1 -1
  98. package/dist/data/memory/narrative-store.d.ts +14 -0
  99. package/dist/data/memory/narrative-store.d.ts.map +1 -1
  100. package/dist/data/memory/narrative-store.js +36 -0
  101. package/dist/data/memory/narrative-store.js.map +1 -1
  102. package/dist/data/memory/narrative.d.ts.map +1 -1
  103. package/dist/data/memory/narrative.js +13 -1
  104. package/dist/data/memory/narrative.js.map +1 -1
  105. package/dist/data/memory/schema.d.ts.map +1 -1
  106. package/dist/data/memory/schema.js +4 -0
  107. package/dist/data/memory/schema.js.map +1 -1
  108. package/dist/index.js +84 -2
  109. package/dist/index.js.map +1 -1
  110. package/dist/integrations/openai/speech.d.ts.map +1 -1
  111. package/dist/integrations/openai/speech.js +52 -19
  112. package/dist/integrations/openai/speech.js.map +1 -1
  113. package/dist/lib/http-retry.d.ts +91 -0
  114. package/dist/lib/http-retry.d.ts.map +1 -0
  115. package/dist/lib/http-retry.js +177 -0
  116. package/dist/lib/http-retry.js.map +1 -0
  117. package/dist/lib/usage-metering/pricing.js +1 -1
  118. package/dist/lib/usage-metering/pricing.js.map +1 -1
  119. package/dist/lib/utils.d.ts +10 -0
  120. package/dist/lib/utils.d.ts.map +1 -1
  121. package/dist/lib/utils.js +22 -0
  122. package/dist/lib/utils.js.map +1 -1
  123. package/dist/server/http-server.d.ts +3 -1
  124. package/dist/server/http-server.d.ts.map +1 -1
  125. package/dist/server/http-server.js +6 -2
  126. package/dist/server/http-server.js.map +1 -1
  127. package/dist/services/board/board-signals.d.ts +25 -0
  128. package/dist/services/board/board-signals.d.ts.map +1 -0
  129. package/dist/services/board/board-signals.js +83 -0
  130. package/dist/services/board/board-signals.js.map +1 -0
  131. package/dist/services/board/card-briefing.d.ts +17 -0
  132. package/dist/services/board/card-briefing.d.ts.map +1 -0
  133. package/dist/services/board/card-briefing.js +86 -0
  134. package/dist/services/board/card-briefing.js.map +1 -0
  135. package/dist/services/board/orchestrator.service.d.ts +55 -0
  136. package/dist/services/board/orchestrator.service.d.ts.map +1 -0
  137. package/dist/services/board/orchestrator.service.js +198 -0
  138. package/dist/services/board/orchestrator.service.js.map +1 -0
  139. package/dist/services/board/release-worker.d.ts +32 -0
  140. package/dist/services/board/release-worker.d.ts.map +1 -0
  141. package/dist/services/board/release-worker.js +49 -0
  142. package/dist/services/board/release-worker.js.map +1 -0
  143. package/dist/services/board/report-capture.d.ts +48 -0
  144. package/dist/services/board/report-capture.d.ts.map +1 -0
  145. package/dist/services/board/report-capture.js +172 -0
  146. package/dist/services/board/report-capture.js.map +1 -0
  147. package/dist/services/board/worker-spawn.d.ts +30 -0
  148. package/dist/services/board/worker-spawn.d.ts.map +1 -0
  149. package/dist/services/board/worker-spawn.js +90 -0
  150. package/dist/services/board/worker-spawn.js.map +1 -0
  151. package/dist/services/broker-client.d.ts +30 -0
  152. package/dist/services/broker-client.d.ts.map +1 -1
  153. package/dist/services/broker-client.js +23 -0
  154. package/dist/services/broker-client.js.map +1 -1
  155. package/dist/services/codex-spawn.service.d.ts +2 -2
  156. package/dist/services/codex-spawn.service.d.ts.map +1 -1
  157. package/dist/services/codex-spawn.service.js +54 -54
  158. package/dist/services/codex-spawn.service.js.map +1 -1
  159. package/dist/services/http-retry.d.ts +1 -90
  160. package/dist/services/http-retry.d.ts.map +1 -1
  161. package/dist/services/http-retry.js +1 -176
  162. package/dist/services/http-retry.js.map +1 -1
  163. package/dist/services/mcp-config.service.d.ts.map +1 -1
  164. package/dist/services/mcp-config.service.js +5 -1
  165. package/dist/services/mcp-config.service.js.map +1 -1
  166. package/dist/services/passive-notice.service.d.ts +39 -0
  167. package/dist/services/passive-notice.service.d.ts.map +1 -0
  168. package/dist/services/passive-notice.service.js +274 -0
  169. package/dist/services/passive-notice.service.js.map +1 -0
  170. package/dist/services/spawn-common.d.ts.map +1 -1
  171. package/dist/services/spawn-common.js +14 -1
  172. package/dist/services/spawn-common.js.map +1 -1
  173. package/dist/services/telegram.d.ts +7 -5
  174. package/dist/services/telegram.d.ts.map +1 -1
  175. package/dist/services/telegram.js +18 -13
  176. package/dist/services/telegram.js.map +1 -1
  177. package/dist/services/usage/usage-inbox-notifier.d.ts +50 -0
  178. package/dist/services/usage/usage-inbox-notifier.d.ts.map +1 -0
  179. package/dist/services/usage/usage-inbox-notifier.js +118 -0
  180. package/dist/services/usage/usage-inbox-notifier.js.map +1 -0
  181. package/dist/services/usage/usage-poller.service.d.ts +41 -0
  182. package/dist/services/usage/usage-poller.service.d.ts.map +1 -0
  183. package/dist/services/usage/usage-poller.service.js +66 -0
  184. package/dist/services/usage/usage-poller.service.js.map +1 -0
  185. package/dist/services/usage/usage-snapshot-provider.d.ts +29 -0
  186. package/dist/services/usage/usage-snapshot-provider.d.ts.map +1 -0
  187. package/dist/services/usage/usage-snapshot-provider.js +59 -0
  188. package/dist/services/usage/usage-snapshot-provider.js.map +1 -0
  189. package/dist/services/usage/usage-types.d.ts +23 -0
  190. package/dist/services/usage/usage-types.d.ts.map +1 -0
  191. package/dist/services/usage/usage-types.js +14 -0
  192. package/dist/services/usage/usage-types.js.map +1 -0
  193. package/dist/services/worker-cleanup.service.d.ts +6 -1
  194. package/dist/services/worker-cleanup.service.d.ts.map +1 -1
  195. package/dist/services/worker-cleanup.service.js +123 -10
  196. package/dist/services/worker-cleanup.service.js.map +1 -1
  197. package/dist/tools/delegate-tool.d.ts.map +1 -1
  198. package/dist/tools/delegate-tool.js +34 -2
  199. package/dist/tools/delegate-tool.js.map +1 -1
  200. package/dist/tools/utility-tools.d.ts.map +1 -1
  201. package/dist/tools/utility-tools.js +7 -3
  202. package/dist/tools/utility-tools.js.map +1 -1
  203. package/dist/tools/wait/consolidation-strategy.d.ts +42 -0
  204. package/dist/tools/wait/consolidation-strategy.d.ts.map +1 -0
  205. package/dist/tools/wait/consolidation-strategy.js +50 -0
  206. package/dist/tools/wait/consolidation-strategy.js.map +1 -0
  207. package/dist/tools/wait/drive-handler.d.ts +5 -7
  208. package/dist/tools/wait/drive-handler.d.ts.map +1 -1
  209. package/dist/tools/wait/drive-handler.js +30 -48
  210. package/dist/tools/wait/drive-handler.js.map +1 -1
  211. package/dist/tools/wait/message-delivery.d.ts.map +1 -1
  212. package/dist/tools/wait/message-delivery.js +13 -0
  213. package/dist/tools/wait/message-delivery.js.map +1 -1
  214. package/package.json +2 -2
  215. package/templates/atomic-build-spec.default.md +57 -0
  216. package/templates/buildless-vue-preview.default.md +47 -0
  217. package/templates/phased-build.default.md +59 -0
@@ -0,0 +1,1760 @@
1
+ /**
2
+ * Board layout + components — ✅ EDITABLE. Dispatch design: mobile-first dark
3
+ * shell, soft floating cards, pill chips, mono micro-labels, pulse dots.
4
+ */
5
+
6
+ * {
7
+ box-sizing: border-box;
8
+ }
9
+ html,
10
+ body {
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+ body {
15
+ font-family: var(--font);
16
+ font-size: var(--fs-md);
17
+ color: var(--c-text);
18
+ background: var(--c-bg);
19
+ -webkit-text-size-adjust: 100%;
20
+ -webkit-font-smoothing: antialiased;
21
+ }
22
+ a {
23
+ color: var(--c-primary);
24
+ text-decoration: none;
25
+ }
26
+ a:hover {
27
+ color: oklch(86% 0.11 165);
28
+ }
29
+
30
+ @keyframes pulse {
31
+ 0%,
32
+ 100% {
33
+ opacity: 1;
34
+ transform: scale(1);
35
+ }
36
+ 50% {
37
+ opacity: 0.4;
38
+ transform: scale(0.75);
39
+ }
40
+ }
41
+ @keyframes rise {
42
+ from {
43
+ opacity: 0;
44
+ transform: translateY(10px);
45
+ }
46
+ to {
47
+ opacity: 1;
48
+ transform: none;
49
+ }
50
+ }
51
+
52
+ .dot {
53
+ width: 7px;
54
+ height: 7px;
55
+ border-radius: 50%;
56
+ background: currentColor;
57
+ display: inline-block;
58
+ flex: none;
59
+ }
60
+ .dot--pulse {
61
+ animation: pulse 1.6s infinite;
62
+ }
63
+ .mono-label {
64
+ font-family: var(--font-mono);
65
+ font-size: var(--fs-xs);
66
+ letter-spacing: 0.08em;
67
+ text-transform: uppercase;
68
+ color: var(--c-text-muted);
69
+ }
70
+
71
+ /* ── App shell ─────────────────────────────────────────────── */
72
+ .app {
73
+ min-height: 100dvh;
74
+ display: flex;
75
+ flex-direction: column;
76
+ max-width: 430px;
77
+ margin: 0 auto;
78
+ }
79
+ .app-bar {
80
+ min-height: var(--bar-h);
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: space-between;
84
+ gap: var(--sp-3);
85
+ padding: var(--sp-4) var(--sp-4) var(--sp-2);
86
+ background: transparent;
87
+ position: sticky;
88
+ top: 0;
89
+ z-index: 10;
90
+ background: var(--c-bg);
91
+ }
92
+ .app-bar__brand {
93
+ display: flex;
94
+ align-items: center;
95
+ gap: var(--sp-2);
96
+ border: 0;
97
+ background: none;
98
+ color: var(--c-text);
99
+ cursor: pointer;
100
+ padding: 0;
101
+ text-align: left;
102
+ }
103
+ .app-bar__dot {
104
+ width: 10px;
105
+ height: 10px;
106
+ border-radius: 50%;
107
+ background: var(--c-primary);
108
+ display: inline-block;
109
+ flex: none;
110
+ animation: pulse 2s infinite;
111
+ }
112
+ .app-bar__titles {
113
+ display: flex;
114
+ flex-direction: column;
115
+ gap: 1px;
116
+ }
117
+ .app-bar__name {
118
+ font-weight: 700;
119
+ font-size: 20px;
120
+ letter-spacing: -0.02em;
121
+ line-height: 1.1;
122
+ }
123
+ .app-bar__right {
124
+ display: flex;
125
+ align-items: center;
126
+ gap: var(--sp-2);
127
+ }
128
+ .app-bar__working {
129
+ border: 1px solid oklch(78% 0.14 165 / 0.3);
130
+ padding: 6px 12px;
131
+ box-shadow: var(--shadow-1);
132
+ }
133
+ .app-bar__sub {
134
+ font-family: var(--font-mono);
135
+ font-size: 10px;
136
+ letter-spacing: 0.08em;
137
+ color: var(--c-text-muted);
138
+ }
139
+ .app-main {
140
+ flex: 1;
141
+ padding: var(--sp-2) var(--sp-4) 0;
142
+ padding-bottom: calc(var(--nav-h) + var(--sp-6) + env(safe-area-inset-bottom, 0px));
143
+ overflow-x: hidden;
144
+ animation: rise 0.28s ease;
145
+ }
146
+
147
+ /* ── Bottom nav ────────────────────────────────────────────── */
148
+ .bottom-nav {
149
+ position: fixed;
150
+ left: 50%;
151
+ transform: translateX(-50%);
152
+ width: 100%;
153
+ max-width: 430px;
154
+ bottom: 0;
155
+ height: calc(var(--nav-h) + env(safe-area-inset-bottom, 0px));
156
+ padding-bottom: env(safe-area-inset-bottom, 0px);
157
+ display: flex;
158
+ background: color-mix(in oklab, var(--c-surface) 92%, transparent);
159
+ backdrop-filter: blur(12px);
160
+ border-top: 1px solid var(--c-border);
161
+ z-index: 20;
162
+ }
163
+ .bottom-nav__item {
164
+ flex: 1;
165
+ border: 0;
166
+ background: none;
167
+ color: var(--c-text-muted);
168
+ display: flex;
169
+ flex-direction: column;
170
+ align-items: center;
171
+ justify-content: center;
172
+ gap: 3px;
173
+ cursor: pointer;
174
+ font-family: var(--font);
175
+ font-size: var(--fs-xs);
176
+ font-weight: 600;
177
+ min-height: 44px;
178
+ }
179
+ .bottom-nav__item.is-active {
180
+ color: var(--c-primary);
181
+ }
182
+ .bottom-nav__icon {
183
+ font-size: 19px;
184
+ line-height: 1;
185
+ }
186
+
187
+ /* ── Board ─────────────────────────────────────────────────── */
188
+ .board__toolbar {
189
+ display: flex;
190
+ align-items: center;
191
+ gap: var(--sp-2);
192
+ margin-bottom: var(--sp-4);
193
+ flex-wrap: wrap;
194
+ }
195
+ .board__new {
196
+ margin-left: auto;
197
+ }
198
+ @media (max-width: 719px) {
199
+ .board__new {
200
+ flex: 1;
201
+ }
202
+ }
203
+ .board__columns {
204
+ display: flex;
205
+ gap: 14px;
206
+ overflow-x: auto;
207
+ scroll-snap-type: x mandatory;
208
+ -webkit-overflow-scrolling: touch;
209
+ padding: 2px 2px var(--sp-4);
210
+ scrollbar-width: none;
211
+ align-items: flex-start;
212
+ }
213
+ .board__columns::-webkit-scrollbar {
214
+ display: none;
215
+ }
216
+ .lane {
217
+ scroll-snap-align: center;
218
+ scroll-snap-stop: always;
219
+ flex: 0 0 100%;
220
+ max-width: none;
221
+ display: flex;
222
+ flex-direction: column;
223
+ gap: var(--sp-3);
224
+ background: none;
225
+ border: 0;
226
+ }
227
+ .lane__head {
228
+ display: flex;
229
+ align-items: center;
230
+ gap: 6px;
231
+ padding: 2px var(--sp-1);
232
+ min-height: 28px;
233
+ }
234
+ .lane__dot {
235
+ width: 8px;
236
+ height: 8px;
237
+ border-radius: 50%;
238
+ background: var(--c-status-backlog);
239
+ flex: none;
240
+ }
241
+ .lane--in_progress .lane__dot {
242
+ background: var(--c-status-in_progress);
243
+ }
244
+ .lane--decision_needed .lane__dot {
245
+ background: var(--c-status-decision_needed);
246
+ }
247
+ .lane--blocked .lane__dot {
248
+ background: var(--c-status-blocked);
249
+ }
250
+ .lane--done .lane__dot {
251
+ background: var(--c-status-done);
252
+ }
253
+ .lane__title {
254
+ font-size: 13px;
255
+ font-weight: 600;
256
+ margin: 0;
257
+ white-space: nowrap;
258
+ overflow: hidden;
259
+ text-overflow: ellipsis;
260
+ min-width: 0;
261
+ }
262
+ .lane__count {
263
+ font-family: var(--font-mono);
264
+ font-size: var(--fs-xs);
265
+ color: var(--c-text-muted);
266
+ background: var(--c-surface);
267
+ border-radius: 999px;
268
+ padding: 2px 8px;
269
+ }
270
+ .lane__body {
271
+ display: flex;
272
+ flex-direction: column;
273
+ gap: var(--sp-3);
274
+ }
275
+ .lane__empty {
276
+ border: 1px dashed var(--c-border-strong);
277
+ border-radius: 18px;
278
+ padding: 22px;
279
+ text-align: center;
280
+ font-size: var(--fs-sm);
281
+ color: var(--c-text-faint);
282
+ margin: 0;
283
+ }
284
+
285
+ /* ── Card ──────────────────────────────────────────────────── */
286
+ .card {
287
+ background: var(--c-surface);
288
+ border: 1px solid var(--c-border);
289
+ border-radius: 18px;
290
+ padding: var(--sp-4);
291
+ box-shadow: var(--shadow-2);
292
+ cursor: pointer;
293
+ display: flex;
294
+ flex-direction: column;
295
+ gap: 10px;
296
+ transition: border-color 0.15s, transform 0.15s;
297
+ }
298
+ .card .card__foot {
299
+ margin-top: auto;
300
+ }
301
+ .card:hover {
302
+ border-color: oklch(78% 0.14 165 / 0.35);
303
+ transform: translateY(-1px);
304
+ }
305
+ .card:active {
306
+ transform: scale(0.98);
307
+ }
308
+ .card:focus-visible {
309
+ outline: 2px solid var(--c-primary);
310
+ outline-offset: 2px;
311
+ }
312
+ .card__top {
313
+ display: flex;
314
+ align-items: center;
315
+ justify-content: space-between;
316
+ gap: var(--sp-2);
317
+ }
318
+ .card__lane {
319
+ font-family: var(--font-mono);
320
+ font-size: 10px;
321
+ letter-spacing: 0.04em;
322
+ color: var(--c-text-faint);
323
+ margin-left: auto;
324
+ }
325
+ .card__title {
326
+ margin: 0;
327
+ font-size: var(--fs-md);
328
+ font-weight: 600;
329
+ line-height: 1.35;
330
+ }
331
+ .card__desc {
332
+ margin: 0;
333
+ font-size: var(--fs-sm);
334
+ color: var(--c-text-muted);
335
+ line-height: 1.5;
336
+ display: -webkit-box;
337
+ -webkit-line-clamp: 2;
338
+ -webkit-box-orient: vertical;
339
+ overflow: hidden;
340
+ }
341
+ .card__foot {
342
+ display: flex;
343
+ gap: var(--sp-2);
344
+ flex-wrap: wrap;
345
+ align-items: center;
346
+ }
347
+ .card__top {
348
+ display: none;
349
+ }
350
+
351
+ /* ── Chips ─────────────────────────────────────────────────── */
352
+ .chips {
353
+ display: flex;
354
+ gap: var(--sp-2);
355
+ flex-wrap: wrap;
356
+ align-items: center;
357
+ }
358
+ .chip {
359
+ display: inline-flex;
360
+ align-items: center;
361
+ gap: 6px;
362
+ font-family: var(--font-mono);
363
+ font-size: var(--fs-xs);
364
+ font-weight: 500;
365
+ padding: 4px 10px;
366
+ border-radius: 999px;
367
+ background: var(--c-surface-2);
368
+ color: var(--c-text-muted);
369
+ white-space: nowrap;
370
+ }
371
+ .chip--muted {
372
+ background: oklch(74% 0.02 280 / 0.12);
373
+ color: oklch(74% 0.02 280);
374
+ }
375
+ .chip--live {
376
+ background: oklch(78% 0.14 165 / 0.13);
377
+ color: var(--c-live);
378
+ }
379
+ .chip--warn {
380
+ background: oklch(80% 0.13 75 / 0.13);
381
+ color: var(--c-warn);
382
+ }
383
+ .chip--status-backlog {
384
+ background: oklch(74% 0.02 280 / 0.12);
385
+ color: oklch(74% 0.02 280);
386
+ }
387
+ .chip--status-in_progress {
388
+ background: oklch(78% 0.14 165 / 0.13);
389
+ color: var(--c-status-in_progress);
390
+ }
391
+ .chip--status-decision_needed {
392
+ background: oklch(75% 0.13 300 / 0.13);
393
+ color: var(--c-status-decision_needed);
394
+ }
395
+ .chip--status-blocked {
396
+ background: oklch(80% 0.13 75 / 0.13);
397
+ color: var(--c-status-blocked);
398
+ }
399
+ .chip--status-done {
400
+ background: oklch(64% 0.06 165 / 0.1);
401
+ color: var(--c-status-done);
402
+ }
403
+ .chip--prio-0 {
404
+ background: oklch(64% 0.02 280 / 0.12);
405
+ color: var(--c-prio-0);
406
+ }
407
+ .chip--prio-1 {
408
+ background: oklch(80% 0.12 200 / 0.13);
409
+ color: var(--c-prio-1);
410
+ }
411
+ .chip--prio-2 {
412
+ background: oklch(80% 0.13 75 / 0.13);
413
+ color: var(--c-prio-2);
414
+ }
415
+ .chip--prio-3 {
416
+ background: oklch(78% 0.14 25 / 0.13);
417
+ color: var(--c-prio-3);
418
+ }
419
+
420
+ .badge {
421
+ font-family: var(--font-mono);
422
+ font-size: var(--fs-xs);
423
+ font-weight: 500;
424
+ padding: 6px 12px;
425
+ border-radius: 999px;
426
+ text-transform: uppercase;
427
+ letter-spacing: 0.06em;
428
+ border: 1px solid var(--c-border);
429
+ background: var(--c-surface);
430
+ box-shadow: var(--shadow-1);
431
+ }
432
+ .badge--mode-preview {
433
+ color: var(--c-warn);
434
+ border-color: oklch(80% 0.13 75 / 0.35);
435
+ }
436
+ .badge--mode-production {
437
+ color: var(--c-live);
438
+ border-color: oklch(78% 0.14 165 / 0.35);
439
+ }
440
+
441
+ /* ── Card detail ───────────────────────────────────────────── */
442
+ .card-detail {
443
+ display: flex;
444
+ flex-direction: column;
445
+ gap: var(--sp-4);
446
+ }
447
+ .card-detail__nav {
448
+ display: flex;
449
+ align-items: center;
450
+ gap: var(--sp-3);
451
+ }
452
+ .card-detail__id {
453
+ font-family: var(--font-mono);
454
+ font-size: var(--fs-xs);
455
+ letter-spacing: 0.08em;
456
+ color: var(--c-text-muted);
457
+ }
458
+ .card-detail__head {
459
+ display: flex;
460
+ flex-direction: column;
461
+ gap: var(--sp-3);
462
+ }
463
+ .card-detail__title {
464
+ font-size: var(--fs-xl);
465
+ font-weight: 700;
466
+ margin: 0;
467
+ line-height: 1.3;
468
+ letter-spacing: -0.01em;
469
+ }
470
+ .section {
471
+ background: var(--c-surface);
472
+ border: 1px solid var(--c-border);
473
+ border-radius: var(--r-lg);
474
+ padding: 18px;
475
+ box-shadow: var(--shadow-2);
476
+ margin: 0;
477
+ display: flex;
478
+ flex-direction: column;
479
+ gap: var(--sp-2);
480
+ }
481
+ .section--plain {
482
+ background: none;
483
+ border: 0;
484
+ box-shadow: none;
485
+ padding: 0 var(--sp-1);
486
+ }
487
+ .section__label {
488
+ font-family: var(--font-mono);
489
+ font-size: 12px;
490
+ font-weight: 700;
491
+ text-transform: uppercase;
492
+ letter-spacing: 0.1em;
493
+ color: var(--c-text);
494
+ margin: 0;
495
+ padding-bottom: var(--sp-2);
496
+ border-bottom: 1px solid var(--c-border-strong);
497
+ }
498
+ .prose {
499
+ margin: 0;
500
+ font-size: var(--fs-sm);
501
+ line-height: 1.6;
502
+ color: var(--c-text-soft);
503
+ white-space: pre-wrap;
504
+ }
505
+ .profile {
506
+ display: flex;
507
+ gap: var(--sp-2);
508
+ flex-wrap: wrap;
509
+ }
510
+ .profile__empty {
511
+ color: var(--c-text-muted);
512
+ font-size: var(--fs-sm);
513
+ }
514
+
515
+ /* ── Comments (activity feed) ──────────────────────────────── */
516
+ .comments {
517
+ list-style: none;
518
+ padding: 0;
519
+ margin: 0 0 var(--sp-3);
520
+ display: flex;
521
+ flex-direction: column;
522
+ gap: var(--sp-3);
523
+ }
524
+ .comment {
525
+ display: flex;
526
+ gap: var(--sp-3);
527
+ background: none;
528
+ border: 0;
529
+ padding: 0;
530
+ }
531
+ .comment__avatar {
532
+ flex: none;
533
+ width: 34px;
534
+ height: 34px;
535
+ border-radius: 12px;
536
+ display: flex;
537
+ align-items: center;
538
+ justify-content: center;
539
+ font-size: 14px;
540
+ border: 1px solid oklch(100% 0 0 / 0.08);
541
+ background: oklch(74% 0.02 280 / 0.12);
542
+ }
543
+ .comment--worker .comment__avatar {
544
+ background: oklch(78% 0.14 165 / 0.15);
545
+ }
546
+ .comment--operator .comment__avatar {
547
+ background: oklch(75% 0.13 300 / 0.15);
548
+ }
549
+ .comment--board .comment__avatar {
550
+ background: oklch(80% 0.12 200 / 0.15);
551
+ }
552
+ .comment__bubble {
553
+ flex: 1;
554
+ display: flex;
555
+ flex-direction: column;
556
+ gap: 3px;
557
+ background: var(--c-surface);
558
+ border: 1px solid oklch(100% 0 0 / 0.06);
559
+ border-radius: 14px;
560
+ padding: 11px 14px;
561
+ box-shadow: var(--shadow-1);
562
+ }
563
+ .comment__meta {
564
+ display: flex;
565
+ gap: var(--sp-2);
566
+ align-items: baseline;
567
+ }
568
+ .comment__author {
569
+ font-weight: 600;
570
+ font-size: 12px;
571
+ text-transform: capitalize;
572
+ color: var(--c-text-soft);
573
+ }
574
+ .comment--worker .comment__author {
575
+ color: var(--c-primary);
576
+ }
577
+ .comment--operator .comment__author {
578
+ color: oklch(80% 0.1 300);
579
+ }
580
+ .comment--board .comment__author {
581
+ color: var(--c-info);
582
+ }
583
+ .comment__time {
584
+ font-family: var(--font-mono);
585
+ font-size: 10px;
586
+ color: var(--c-text-faint);
587
+ }
588
+ .comment__body {
589
+ margin: 0;
590
+ font-size: var(--fs-sm);
591
+ line-height: 1.5;
592
+ color: var(--c-text-soft);
593
+ white-space: pre-wrap;
594
+ }
595
+ .comment--empty {
596
+ color: var(--c-text-muted);
597
+ font-size: var(--fs-sm);
598
+ justify-content: center;
599
+ padding: var(--sp-3) 0;
600
+ }
601
+ .composer {
602
+ display: flex;
603
+ flex-direction: column;
604
+ gap: var(--sp-2);
605
+ }
606
+ .composer .btn {
607
+ align-self: flex-end;
608
+ }
609
+
610
+ /* ── Forms ─────────────────────────────────────────────────── */
611
+ .form {
612
+ display: flex;
613
+ flex-direction: column;
614
+ gap: var(--sp-4);
615
+ }
616
+ .form__row {
617
+ display: flex;
618
+ gap: var(--sp-3);
619
+ }
620
+ .form__row .field {
621
+ flex: 1;
622
+ }
623
+ .field {
624
+ display: flex;
625
+ flex-direction: column;
626
+ gap: 7px;
627
+ }
628
+ .field--inline {
629
+ min-width: 120px;
630
+ }
631
+ .field--check {
632
+ flex-direction: row;
633
+ align-items: center;
634
+ gap: var(--sp-2);
635
+ min-height: 44px;
636
+ padding: 0 var(--sp-3);
637
+ border: 1px solid var(--c-border);
638
+ border-radius: 999px;
639
+ background: var(--c-surface);
640
+ cursor: pointer;
641
+ }
642
+ .field--check input {
643
+ accent-color: var(--c-primary);
644
+ width: 16px;
645
+ height: 16px;
646
+ }
647
+ .field__label {
648
+ font-size: var(--fs-sm);
649
+ color: var(--c-text);
650
+ font-weight: 600;
651
+ padding: 0 var(--sp-1);
652
+ }
653
+ .field--check .field__label,
654
+ .field--inline .field__label {
655
+ padding: 0;
656
+ }
657
+ .field--inline .field__label {
658
+ font-family: var(--font-mono);
659
+ font-size: var(--fs-xs);
660
+ font-weight: 500;
661
+ letter-spacing: 0.08em;
662
+ text-transform: uppercase;
663
+ color: var(--c-text-muted);
664
+ }
665
+ .field__hint {
666
+ font-weight: 400;
667
+ color: var(--c-text-muted);
668
+ }
669
+ .input {
670
+ width: 100%;
671
+ font: inherit;
672
+ font-size: var(--fs-md);
673
+ color: var(--c-text);
674
+ background: var(--c-surface);
675
+ border: 1px solid var(--c-border-strong);
676
+ border-radius: var(--r-md);
677
+ padding: 13px 16px;
678
+ min-height: 50px;
679
+ box-shadow: var(--shadow-1);
680
+ }
681
+ .input::placeholder {
682
+ color: var(--c-text-faint);
683
+ }
684
+ .input:focus {
685
+ outline: 2px solid oklch(78% 0.14 165 / 0.5);
686
+ outline-offset: 0;
687
+ border-color: oklch(78% 0.14 165 / 0.5);
688
+ }
689
+ .input--area {
690
+ resize: vertical;
691
+ min-height: 80px;
692
+ line-height: 1.55;
693
+ font-size: var(--fs-sm);
694
+ }
695
+ select.input {
696
+ appearance: none;
697
+ background-image: linear-gradient(45deg, transparent 50%, var(--c-text-muted) 50%),
698
+ linear-gradient(135deg, var(--c-text-muted) 50%, transparent 50%);
699
+ background-position: calc(100% - 20px) 50%, calc(100% - 15px) 50%;
700
+ background-size: 5px 5px;
701
+ background-repeat: no-repeat;
702
+ padding-right: 38px;
703
+ }
704
+ .input--sm {
705
+ min-height: 44px;
706
+ padding: 10px 14px;
707
+ flex: 1;
708
+ font-size: var(--fs-sm);
709
+ }
710
+
711
+ /* ── Custom dropdown ──────────────────────────────── */
712
+ .dropdown {
713
+ position: relative;
714
+ width: 100%;
715
+ }
716
+ .dropdown__btn {
717
+ width: 100%;
718
+ display: flex;
719
+ align-items: center;
720
+ justify-content: space-between;
721
+ gap: var(--sp-2);
722
+ font: inherit;
723
+ font-size: var(--fs-md);
724
+ color: var(--c-text);
725
+ background: var(--c-surface);
726
+ border: 1px solid var(--c-border-strong);
727
+ border-radius: var(--r-md);
728
+ padding: 13px 16px;
729
+ min-height: 50px;
730
+ box-shadow: var(--shadow-1);
731
+ cursor: pointer;
732
+ text-align: left;
733
+ }
734
+ .dropdown__btn.is-open,
735
+ .dropdown__btn:focus-visible {
736
+ outline: 2px solid oklch(78% 0.14 165 / 0.5);
737
+ outline-offset: 0;
738
+ border-color: oklch(78% 0.14 165 / 0.5);
739
+ }
740
+ .dropdown__value {
741
+ overflow: hidden;
742
+ text-overflow: ellipsis;
743
+ white-space: nowrap;
744
+ }
745
+ .dropdown__value.is-placeholder {
746
+ color: var(--c-text-faint);
747
+ }
748
+ .dropdown__chevron {
749
+ color: var(--c-text-muted);
750
+ font-size: 12px;
751
+ flex: none;
752
+ transition: transform 0.15s;
753
+ }
754
+ .dropdown__btn.is-open .dropdown__chevron {
755
+ transform: rotate(180deg);
756
+ }
757
+ .dropdown__menu {
758
+ position: absolute;
759
+ top: calc(100% + 6px);
760
+ left: 0;
761
+ right: 0;
762
+ z-index: 40;
763
+ margin: 0;
764
+ padding: 6px;
765
+ list-style: none;
766
+ background: var(--c-surface-deep);
767
+ border: 1px solid var(--c-border-strong);
768
+ border-radius: var(--r-md);
769
+ box-shadow: var(--shadow-2);
770
+ max-height: 280px;
771
+ overflow-y: auto;
772
+ overflow-x: hidden;
773
+ scrollbar-width: none;
774
+ animation: rise 0.16s ease;
775
+ }
776
+ .dropdown__menu::-webkit-scrollbar {
777
+ display: none;
778
+ }
779
+ .dropdown__opt {
780
+ width: 100%;
781
+ display: flex;
782
+ align-items: center;
783
+ justify-content: space-between;
784
+ gap: var(--sp-2);
785
+ border: 0;
786
+ background: none;
787
+ color: var(--c-text-soft);
788
+ font: inherit;
789
+ font-size: var(--fs-sm);
790
+ font-weight: 500;
791
+ padding: 11px 12px;
792
+ border-radius: 10px;
793
+ cursor: pointer;
794
+ text-align: left;
795
+ min-height: 44px;
796
+ }
797
+ .dropdown__opt:hover {
798
+ background: oklch(78% 0.14 165 / 0.1);
799
+ color: var(--c-text);
800
+ }
801
+ .dropdown__opt.is-selected {
802
+ color: var(--c-primary);
803
+ background: oklch(78% 0.14 165 / 0.13);
804
+ }
805
+ .dropdown__check {
806
+ font-size: 12px;
807
+ flex: none;
808
+ }
809
+ .dropdown--sm {
810
+ width: auto;
811
+ min-width: 150px;
812
+ }
813
+ .dropdown--sm .dropdown__btn {
814
+ min-height: 44px;
815
+ padding: 10px 14px;
816
+ font-size: var(--fs-sm);
817
+ border-radius: 999px;
818
+ }
819
+
820
+ /* ── Icon buttons + lane management (settings) ─────────── */
821
+ .iconbtn {
822
+ flex: none;
823
+ width: 32px;
824
+ height: 32px;
825
+ border-radius: 9px;
826
+ border: 0;
827
+ background: transparent;
828
+ color: var(--c-text-faint);
829
+ cursor: pointer;
830
+ display: inline-flex;
831
+ align-items: center;
832
+ justify-content: center;
833
+ line-height: 1;
834
+ }
835
+ .iconbtn:hover {
836
+ color: var(--c-text);
837
+ background: oklch(100% 0 0 / 0.06);
838
+ }
839
+ .iconbtn--danger:hover {
840
+ color: var(--c-danger);
841
+ background: oklch(78% 0.14 25 / 0.12);
842
+ }
843
+ .iconbtn:disabled {
844
+ opacity: 0.35;
845
+ cursor: default;
846
+ }
847
+ .iconbtn:disabled:hover {
848
+ color: var(--c-text-faint);
849
+ background: transparent;
850
+ }
851
+ .lane-add {
852
+ display: flex;
853
+ gap: var(--sp-2);
854
+ margin-top: var(--sp-2);
855
+ }
856
+ .lane-add .input {
857
+ flex: 1;
858
+ min-height: 48px;
859
+ }
860
+
861
+ /* Segmented option buttons (priority) */
862
+ .seg {
863
+ display: grid;
864
+ grid-template-columns: repeat(4, 1fr);
865
+ gap: var(--sp-2);
866
+ }
867
+ .seg__btn {
868
+ min-height: 44px;
869
+ border-radius: 14px;
870
+ font-family: var(--font);
871
+ font-size: var(--fs-sm);
872
+ font-weight: 600;
873
+ cursor: pointer;
874
+ border: 1px solid var(--c-border-strong);
875
+ background: var(--c-surface);
876
+ color: var(--c-text-soft);
877
+ }
878
+ .seg__btn:active {
879
+ transform: scale(0.96);
880
+ }
881
+ .seg__btn.is-selected {
882
+ border-color: oklch(78% 0.14 165 / 0.55);
883
+ background: oklch(78% 0.14 165 / 0.13);
884
+ color: var(--c-primary);
885
+ }
886
+ .seg__btn.is-active-0 {
887
+ border-color: var(--c-prio-0);
888
+ background: oklch(64% 0.02 280 / 0.12);
889
+ color: var(--c-prio-0);
890
+ }
891
+ .seg__btn.is-active-1 {
892
+ border-color: var(--c-prio-1);
893
+ background: oklch(80% 0.12 200 / 0.13);
894
+ color: var(--c-prio-1);
895
+ }
896
+ .seg__btn.is-active-2 {
897
+ border-color: var(--c-prio-2);
898
+ background: oklch(80% 0.13 75 / 0.13);
899
+ color: var(--c-prio-2);
900
+ }
901
+ .seg__btn.is-active-3 {
902
+ border-color: var(--c-prio-3);
903
+ background: oklch(78% 0.14 25 / 0.13);
904
+ color: var(--c-prio-3);
905
+ }
906
+
907
+ /* ── Buttons ───────────────────────────────────────────────── */
908
+ .actions {
909
+ display: flex;
910
+ gap: var(--sp-2);
911
+ flex-wrap: wrap;
912
+ align-items: center;
913
+ }
914
+ .btn {
915
+ font-family: var(--font);
916
+ font-size: var(--fs-sm);
917
+ font-weight: 600;
918
+ padding: 12px 18px;
919
+ border-radius: var(--r-md);
920
+ border: 1px solid var(--c-border-strong);
921
+ background: var(--c-surface);
922
+ color: var(--c-text);
923
+ cursor: pointer;
924
+ min-height: 48px;
925
+ transition: transform 0.12s;
926
+ white-space: nowrap;
927
+ }
928
+ .btn:hover {
929
+ border-color: oklch(78% 0.14 165 / 0.35);
930
+ }
931
+ .btn:active {
932
+ transform: scale(0.97);
933
+ }
934
+ .btn:disabled {
935
+ opacity: 0.5;
936
+ cursor: default;
937
+ }
938
+ .btn--sm {
939
+ padding: 6px 12px;
940
+ min-height: 36px;
941
+ border-radius: var(--r-sm);
942
+ }
943
+ .btn--primary {
944
+ background: var(--c-primary);
945
+ color: var(--c-primary-ink);
946
+ border-color: var(--c-primary);
947
+ font-weight: 700;
948
+ box-shadow: var(--shadow-accent);
949
+ }
950
+ .btn--primary:hover {
951
+ transform: translateY(-1px);
952
+ }
953
+ .btn--ghost {
954
+ background: transparent;
955
+ border-color: transparent;
956
+ box-shadow: none;
957
+ color: var(--c-text-soft);
958
+ }
959
+ .btn--ghost:hover {
960
+ border-color: var(--c-border-strong);
961
+ }
962
+ .btn--danger {
963
+ color: var(--c-danger);
964
+ border-color: oklch(78% 0.14 25 / 0.35);
965
+ }
966
+ .btn--primary.btn--danger {
967
+ background: var(--c-danger);
968
+ color: #fff;
969
+ }
970
+ .btn--back {
971
+ width: 44px;
972
+ height: 44px;
973
+ min-height: 44px;
974
+ padding: 0;
975
+ border-radius: 14px;
976
+ font-size: 18px;
977
+ box-shadow: var(--shadow-1);
978
+ }
979
+
980
+ /* Card actions — quiet footer row, not a boxed section */
981
+ .card-detail__actions {
982
+ display: flex;
983
+ gap: var(--sp-2);
984
+ flex-wrap: wrap;
985
+ align-items: center;
986
+ padding: var(--sp-2) var(--sp-1) 0;
987
+ border-top: 1px solid var(--c-border);
988
+ }
989
+ .card-detail__actions .btn {
990
+ background: transparent;
991
+ border-color: transparent;
992
+ box-shadow: none;
993
+ color: var(--c-text-soft);
994
+ min-height: 44px;
995
+ padding: 10px 14px;
996
+ }
997
+ .card-detail__actions .btn:hover {
998
+ border-color: var(--c-border-strong);
999
+ background: var(--c-surface);
1000
+ }
1001
+ .card-detail__actions .btn--danger {
1002
+ color: var(--c-danger);
1003
+ }
1004
+ .card-detail__actions .card-detail__actions-spacer {
1005
+ flex: 1;
1006
+ }
1007
+
1008
+ /* ── Notices ───────────────────────────────────────────────── */
1009
+ .notice {
1010
+ border-radius: var(--r-lg);
1011
+ padding: var(--sp-4) 18px;
1012
+ font-size: var(--fs-sm);
1013
+ line-height: 1.55;
1014
+ display: flex;
1015
+ align-items: center;
1016
+ gap: var(--sp-3);
1017
+ justify-content: space-between;
1018
+ border: 1px solid transparent;
1019
+ }
1020
+ .notice--info {
1021
+ background: var(--c-surface);
1022
+ border-color: var(--c-border);
1023
+ color: var(--c-text-muted);
1024
+ }
1025
+ .notice--warn {
1026
+ background: oklch(80% 0.13 75 / 0.09);
1027
+ border-color: oklch(80% 0.13 75 / 0.4);
1028
+ color: var(--c-warn);
1029
+ box-shadow: 0 14px 36px oklch(80% 0.13 75 / 0.1);
1030
+ }
1031
+ .notice--error {
1032
+ background: oklch(78% 0.14 25 / 0.09);
1033
+ border-color: oklch(78% 0.14 25 / 0.4);
1034
+ color: var(--c-danger);
1035
+ }
1036
+
1037
+ /* ── Lists (settings) ──────────────────────────────────────── */
1038
+ .list {
1039
+ list-style: none;
1040
+ padding: 0;
1041
+ margin: 0;
1042
+ display: flex;
1043
+ flex-direction: column;
1044
+ gap: var(--sp-2);
1045
+ }
1046
+ .list__row {
1047
+ display: flex;
1048
+ align-items: center;
1049
+ gap: var(--sp-2);
1050
+ background: var(--c-surface);
1051
+ border: 1px solid var(--c-border);
1052
+ border-radius: var(--r-md);
1053
+ padding: var(--sp-3) var(--sp-4);
1054
+ box-shadow: var(--shadow-1);
1055
+ }
1056
+ .list__main {
1057
+ flex: 1;
1058
+ font-weight: 600;
1059
+ font-size: var(--fs-sm);
1060
+ min-width: 0;
1061
+ white-space: nowrap;
1062
+ overflow: hidden;
1063
+ text-overflow: ellipsis;
1064
+ }
1065
+ .list__row--empty {
1066
+ color: var(--c-text-muted);
1067
+ justify-content: center;
1068
+ box-shadow: none;
1069
+ border-style: dashed;
1070
+ background: none;
1071
+ }
1072
+
1073
+ /* ── Token gate ────────────────────────────────────────────── */
1074
+ .token-gate {
1075
+ min-height: 70dvh;
1076
+ display: flex;
1077
+ align-items: center;
1078
+ justify-content: center;
1079
+ }
1080
+ .token-gate__card {
1081
+ background: var(--c-surface);
1082
+ border: 1px solid var(--c-border);
1083
+ border-radius: var(--r-lg);
1084
+ padding: var(--sp-6) var(--sp-5);
1085
+ max-width: 360px;
1086
+ width: 100%;
1087
+ text-align: center;
1088
+ box-shadow: var(--shadow-2);
1089
+ animation: rise 0.28s ease;
1090
+ }
1091
+ .token-gate__logo {
1092
+ margin-bottom: var(--sp-3);
1093
+ }
1094
+ .token-gate__logo .app-bar__dot {
1095
+ width: 14px;
1096
+ height: 14px;
1097
+ }
1098
+ .token-gate__title {
1099
+ margin: 0 0 var(--sp-1);
1100
+ font-size: var(--fs-xl);
1101
+ font-weight: 700;
1102
+ letter-spacing: -0.02em;
1103
+ }
1104
+ .token-gate__sub {
1105
+ color: var(--c-text-muted);
1106
+ margin: 0 0 var(--sp-4);
1107
+ font-size: var(--fs-sm);
1108
+ }
1109
+ .token-gate__btn {
1110
+ width: 100%;
1111
+ margin-top: var(--sp-3);
1112
+ }
1113
+ .token-gate__hint {
1114
+ color: var(--c-text-faint);
1115
+ font-size: var(--fs-xs);
1116
+ margin: var(--sp-3) 0 0;
1117
+ }
1118
+
1119
+ /* ── Builder / Settings headers ────────────────────────────── */
1120
+ .builder,
1121
+ .settings {
1122
+ display: flex;
1123
+ flex-direction: column;
1124
+ gap: var(--sp-4);
1125
+ }
1126
+ .builder__head,
1127
+ .settings__head {
1128
+ display: flex;
1129
+ flex-direction: column;
1130
+ gap: 2px;
1131
+ padding: 0 var(--sp-1);
1132
+ }
1133
+ .builder__title,
1134
+ .settings__title {
1135
+ font-size: var(--fs-xl);
1136
+ font-weight: 700;
1137
+ letter-spacing: -0.01em;
1138
+ margin: 0;
1139
+ }
1140
+ .builder__hint,
1141
+ .settings__note {
1142
+ color: var(--c-text-muted);
1143
+ font-size: var(--fs-sm);
1144
+ margin: 0;
1145
+ }
1146
+ .settings__saved {
1147
+ color: var(--c-live);
1148
+ font-size: var(--fs-sm);
1149
+ font-weight: 600;
1150
+ }
1151
+
1152
+ /* ── Worker status strip ──────────────────────────────── */
1153
+ .worker-strip {
1154
+ display: flex;
1155
+ align-items: center;
1156
+ gap: var(--sp-3);
1157
+ flex-wrap: wrap;
1158
+ background: var(--c-surface);
1159
+ border: 1px solid var(--c-border);
1160
+ border-radius: 999px;
1161
+ padding: 10px 16px;
1162
+ box-shadow: var(--shadow-1);
1163
+ font-family: var(--font-mono);
1164
+ font-size: var(--fs-xs);
1165
+ color: var(--c-text-muted);
1166
+ }
1167
+ .worker-strip__state {
1168
+ display: inline-flex;
1169
+ align-items: center;
1170
+ gap: 6px;
1171
+ font-weight: 500;
1172
+ text-transform: uppercase;
1173
+ letter-spacing: 0.06em;
1174
+ }
1175
+ .worker-strip--running .worker-strip__state {
1176
+ color: var(--c-live);
1177
+ }
1178
+ .worker-strip--paused .worker-strip__state {
1179
+ color: var(--c-decision);
1180
+ }
1181
+ .worker-strip--finished .worker-strip__state {
1182
+ color: var(--c-status-done);
1183
+ }
1184
+ .worker-strip--idle .worker-strip__state {
1185
+ color: var(--c-warn);
1186
+ }
1187
+
1188
+ /* ── Decision block ──────────────────────────────────── */
1189
+ .decision {
1190
+ border: 1px solid oklch(75% 0.13 300 / 0.4);
1191
+ background: oklch(75% 0.13 300 / 0.09);
1192
+ border-radius: var(--r-lg);
1193
+ padding: 18px;
1194
+ display: flex;
1195
+ flex-direction: column;
1196
+ gap: var(--sp-3);
1197
+ box-shadow: 0 14px 36px oklch(75% 0.13 300 / 0.12);
1198
+ }
1199
+ .decision__head {
1200
+ display: flex;
1201
+ align-items: center;
1202
+ gap: var(--sp-2);
1203
+ color: var(--c-decision);
1204
+ }
1205
+ .decision__label {
1206
+ font-family: var(--font-mono);
1207
+ font-size: var(--fs-xs);
1208
+ letter-spacing: 0.08em;
1209
+ color: oklch(80% 0.11 300);
1210
+ }
1211
+ .decision__question {
1212
+ margin: 0;
1213
+ font-size: var(--fs-md);
1214
+ line-height: 1.55;
1215
+ }
1216
+ .decision__options {
1217
+ display: flex;
1218
+ flex-direction: column;
1219
+ gap: var(--sp-2);
1220
+ }
1221
+ .decision__option {
1222
+ min-height: 48px;
1223
+ border-radius: 14px;
1224
+ border: 1px solid oklch(75% 0.13 300 / 0.45);
1225
+ background: oklch(24% 0.03 295);
1226
+ color: var(--c-text);
1227
+ font-family: var(--font);
1228
+ font-size: var(--fs-sm);
1229
+ font-weight: 600;
1230
+ cursor: pointer;
1231
+ padding: 12px 16px;
1232
+ text-align: left;
1233
+ }
1234
+ .decision__option:hover {
1235
+ background: oklch(75% 0.13 300 / 0.2);
1236
+ }
1237
+ .decision__option:active {
1238
+ transform: scale(0.98);
1239
+ }
1240
+ .decision__option:disabled {
1241
+ opacity: 0.45;
1242
+ cursor: default;
1243
+ }
1244
+ .decision__sent {
1245
+ margin: 0;
1246
+ font-size: var(--fs-sm);
1247
+ font-weight: 600;
1248
+ color: var(--c-live);
1249
+ }
1250
+ .decision__own {
1251
+ display: flex;
1252
+ gap: var(--sp-2);
1253
+ align-items: stretch;
1254
+ }
1255
+ .decision__own .input {
1256
+ flex: 1;
1257
+ min-height: 48px;
1258
+ border-color: oklch(75% 0.13 300 / 0.45);
1259
+ background: oklch(24% 0.03 295);
1260
+ box-shadow: none;
1261
+ }
1262
+ .decision__own .input:focus {
1263
+ outline-color: oklch(75% 0.13 300 / 0.5);
1264
+ border-color: oklch(75% 0.13 300 / 0.6);
1265
+ }
1266
+ .decision__own-send {
1267
+ min-width: 72px;
1268
+ border-radius: 14px;
1269
+ border: 1px solid oklch(75% 0.13 300 / 0.55);
1270
+ background: oklch(75% 0.13 300 / 0.16);
1271
+ color: oklch(84% 0.1 300);
1272
+ font-family: var(--font);
1273
+ font-size: var(--fs-sm);
1274
+ font-weight: 700;
1275
+ cursor: pointer;
1276
+ }
1277
+ .decision__own-send:active {
1278
+ transform: scale(0.96);
1279
+ }
1280
+ .decision__own-send:disabled {
1281
+ opacity: 0.45;
1282
+ cursor: default;
1283
+ }
1284
+
1285
+ /* ── Agent log panel ────────────────────────────────── */
1286
+ .log {
1287
+ background: var(--c-surface-deep);
1288
+ border: 1px solid oklch(100% 0 0 / 0.09);
1289
+ border-radius: var(--r-lg);
1290
+ overflow: hidden;
1291
+ box-shadow: var(--shadow-2);
1292
+ }
1293
+ .log__toggle {
1294
+ width: 100%;
1295
+ display: flex;
1296
+ align-items: center;
1297
+ justify-content: space-between;
1298
+ background: transparent;
1299
+ border: 0;
1300
+ color: inherit;
1301
+ padding: 14px 17px;
1302
+ cursor: pointer;
1303
+ min-height: 48px;
1304
+ font-family: inherit;
1305
+ }
1306
+ .log__title {
1307
+ display: flex;
1308
+ align-items: center;
1309
+ gap: var(--sp-2);
1310
+ }
1311
+ .log__status {
1312
+ display: inline-flex;
1313
+ align-items: center;
1314
+ gap: 5px;
1315
+ font-family: var(--font-mono);
1316
+ font-size: 10px;
1317
+ letter-spacing: 0.06em;
1318
+ color: var(--c-text-faint);
1319
+ }
1320
+ .log__status--live {
1321
+ color: var(--c-live);
1322
+ }
1323
+ .log__status--paused {
1324
+ color: var(--c-decision);
1325
+ }
1326
+ .log__status--halted {
1327
+ color: var(--c-warn);
1328
+ }
1329
+ .log__chevron {
1330
+ color: var(--c-text-muted);
1331
+ font-size: 12px;
1332
+ }
1333
+ .log__body {
1334
+ padding: 0 17px 15px;
1335
+ display: flex;
1336
+ flex-direction: column;
1337
+ gap: 6px;
1338
+ max-height: 220px;
1339
+ overflow-y: auto;
1340
+ }
1341
+ .log__line {
1342
+ margin: 0;
1343
+ font-family: var(--font-mono);
1344
+ font-size: 11.5px;
1345
+ line-height: 1.5;
1346
+ color: oklch(76% 0.015 280);
1347
+ white-space: pre-wrap;
1348
+ }
1349
+ .log__line--cmd {
1350
+ color: oklch(80% 0.1 300);
1351
+ }
1352
+ .log__line--ok {
1353
+ color: var(--c-live);
1354
+ }
1355
+ .log__line--warn {
1356
+ color: var(--c-warn);
1357
+ }
1358
+ .log__line--err {
1359
+ color: var(--c-danger);
1360
+ }
1361
+ .log__line--cursor {
1362
+ color: var(--c-live);
1363
+ animation: pulse 1s infinite;
1364
+ }
1365
+
1366
+ /* ── Builder wizard ─────────────────────────────────── */
1367
+ .builder__headrow {
1368
+ display: flex;
1369
+ align-items: center;
1370
+ justify-content: space-between;
1371
+ gap: var(--sp-3);
1372
+ }
1373
+ .builder__dots {
1374
+ display: flex;
1375
+ gap: 5px;
1376
+ }
1377
+ .builder__dotstep {
1378
+ width: 22px;
1379
+ height: 5px;
1380
+ border-radius: 99px;
1381
+ background: oklch(32% 0.02 280);
1382
+ }
1383
+ .builder__dotstep.is-on {
1384
+ background: var(--c-primary);
1385
+ }
1386
+ .presets {
1387
+ display: flex;
1388
+ flex-direction: column;
1389
+ gap: var(--sp-2);
1390
+ }
1391
+ .presets__label {
1392
+ margin: 0;
1393
+ padding: 0 var(--sp-1);
1394
+ }
1395
+ .presets__row {
1396
+ display: flex;
1397
+ gap: var(--sp-2);
1398
+ overflow-x: auto;
1399
+ scrollbar-width: none;
1400
+ padding: 2px;
1401
+ }
1402
+ .presets__chip {
1403
+ flex: none;
1404
+ min-height: 44px;
1405
+ padding: 10px 16px;
1406
+ border-radius: 14px;
1407
+ font-family: var(--font);
1408
+ font-size: var(--fs-sm);
1409
+ font-weight: 600;
1410
+ cursor: pointer;
1411
+ border: 1px solid var(--c-border-strong);
1412
+ background: var(--c-surface);
1413
+ color: var(--c-text-soft);
1414
+ box-shadow: var(--shadow-1);
1415
+ white-space: nowrap;
1416
+ }
1417
+ .presets__chip:active {
1418
+ transform: scale(0.96);
1419
+ }
1420
+ .presets__chip.is-active {
1421
+ border-color: oklch(78% 0.14 165 / 0.55);
1422
+ background: oklch(78% 0.14 165 / 0.13);
1423
+ color: var(--c-primary);
1424
+ }
1425
+ .skillchips {
1426
+ display: flex;
1427
+ flex-wrap: wrap;
1428
+ gap: var(--sp-2);
1429
+ }
1430
+ .skillchips__chip {
1431
+ min-height: 44px;
1432
+ padding: 10px 15px;
1433
+ border-radius: 999px;
1434
+ font-family: var(--font);
1435
+ font-size: var(--fs-sm);
1436
+ font-weight: 600;
1437
+ cursor: pointer;
1438
+ border: 1px solid var(--c-border-strong);
1439
+ background: var(--c-surface);
1440
+ color: var(--c-text-soft);
1441
+ white-space: nowrap;
1442
+ }
1443
+ .skillchips__chip:active {
1444
+ transform: scale(0.95);
1445
+ }
1446
+ .skillchips__chip.is-on {
1447
+ border-color: oklch(78% 0.14 165 / 0.55);
1448
+ background: oklch(78% 0.14 165 / 0.13);
1449
+ color: var(--c-primary);
1450
+ }
1451
+ .switchlist {
1452
+ display: flex;
1453
+ flex-direction: column;
1454
+ gap: var(--sp-2);
1455
+ }
1456
+ .switchrow {
1457
+ display: flex;
1458
+ align-items: center;
1459
+ gap: var(--sp-3);
1460
+ min-height: 60px;
1461
+ border-radius: var(--r-md);
1462
+ border: 1px solid var(--c-border);
1463
+ background: var(--c-surface);
1464
+ padding: var(--sp-3) var(--sp-4);
1465
+ cursor: pointer;
1466
+ text-align: left;
1467
+ box-shadow: var(--shadow-1);
1468
+ font-family: inherit;
1469
+ }
1470
+ .switchrow:active {
1471
+ transform: scale(0.99);
1472
+ }
1473
+ .switchrow__text {
1474
+ flex: 1;
1475
+ display: flex;
1476
+ flex-direction: column;
1477
+ gap: 2px;
1478
+ }
1479
+ .switchrow__label {
1480
+ font-size: var(--fs-sm);
1481
+ font-weight: 600;
1482
+ color: var(--c-text);
1483
+ }
1484
+ .switchrow__desc {
1485
+ font-size: 12px;
1486
+ color: var(--c-text-muted);
1487
+ line-height: 1.4;
1488
+ }
1489
+ .switch {
1490
+ flex: none;
1491
+ width: 48px;
1492
+ height: 28px;
1493
+ border-radius: 999px;
1494
+ background: oklch(32% 0.02 280);
1495
+ position: relative;
1496
+ transition: background 0.2s;
1497
+ }
1498
+ .switch.is-on {
1499
+ background: var(--c-primary);
1500
+ }
1501
+ .switch__knob {
1502
+ position: absolute;
1503
+ top: 3px;
1504
+ left: 3px;
1505
+ width: 22px;
1506
+ height: 22px;
1507
+ border-radius: 50%;
1508
+ background: oklch(96% 0 0);
1509
+ transition: left 0.2s;
1510
+ box-shadow: 0 2px 6px oklch(0% 0 0 / 0.4);
1511
+ }
1512
+ .switch.is-on .switch__knob {
1513
+ left: 23px;
1514
+ }
1515
+ .phases {
1516
+ display: flex;
1517
+ flex-direction: column;
1518
+ gap: var(--sp-2);
1519
+ }
1520
+ .phases__row {
1521
+ display: flex;
1522
+ align-items: center;
1523
+ gap: var(--sp-3);
1524
+ border: 1px solid var(--c-border);
1525
+ background: var(--c-surface);
1526
+ border-radius: var(--r-md);
1527
+ padding: var(--sp-3) 14px;
1528
+ box-shadow: var(--shadow-1);
1529
+ }
1530
+ .phases__num {
1531
+ flex: none;
1532
+ width: 26px;
1533
+ height: 26px;
1534
+ border-radius: 9px;
1535
+ background: oklch(78% 0.14 165 / 0.14);
1536
+ color: var(--c-primary);
1537
+ display: flex;
1538
+ align-items: center;
1539
+ justify-content: center;
1540
+ font-family: var(--font-mono);
1541
+ font-size: 12px;
1542
+ }
1543
+ .phases__name {
1544
+ flex: 1;
1545
+ font-size: var(--fs-sm);
1546
+ font-weight: 500;
1547
+ }
1548
+ .phases__review {
1549
+ border: 1px solid var(--c-border-strong);
1550
+ background: transparent;
1551
+ color: var(--c-text-faint);
1552
+ border-radius: 999px;
1553
+ padding: 7px 11px;
1554
+ font-family: var(--font-mono);
1555
+ font-size: 10px;
1556
+ cursor: pointer;
1557
+ letter-spacing: 0.04em;
1558
+ white-space: nowrap;
1559
+ }
1560
+ .phases__review:active {
1561
+ transform: scale(0.94);
1562
+ }
1563
+ .phases__review.is-on {
1564
+ color: var(--c-primary);
1565
+ border-color: oklch(78% 0.14 165 / 0.5);
1566
+ background: oklch(78% 0.14 165 / 0.12);
1567
+ }
1568
+ .phases__remove {
1569
+ border: 0;
1570
+ background: transparent;
1571
+ color: var(--c-text-faint);
1572
+ font-size: 16px;
1573
+ cursor: pointer;
1574
+ padding: 6px;
1575
+ }
1576
+ .phases__remove:hover {
1577
+ color: var(--c-danger);
1578
+ }
1579
+ .phases__add {
1580
+ display: flex;
1581
+ gap: var(--sp-2);
1582
+ }
1583
+ .phases__add .input {
1584
+ flex: 1;
1585
+ min-height: 48px;
1586
+ }
1587
+ .phases__addbtn {
1588
+ min-width: 64px;
1589
+ border-color: oklch(78% 0.14 165 / 0.4);
1590
+ background: oklch(78% 0.14 165 / 0.12);
1591
+ color: var(--c-primary);
1592
+ font-weight: 700;
1593
+ }
1594
+ .preview {
1595
+ border: 1px solid oklch(78% 0.14 165 / 0.25);
1596
+ background: oklch(78% 0.14 165 / 0.05);
1597
+ border-radius: 18px;
1598
+ overflow: hidden;
1599
+ box-shadow: var(--shadow-1);
1600
+ }
1601
+ .preview__toggle {
1602
+ width: 100%;
1603
+ display: flex;
1604
+ align-items: center;
1605
+ justify-content: space-between;
1606
+ background: transparent;
1607
+ border: 0;
1608
+ color: inherit;
1609
+ padding: 15px 17px;
1610
+ cursor: pointer;
1611
+ min-height: 50px;
1612
+ font-family: inherit;
1613
+ }
1614
+ .preview__title {
1615
+ display: flex;
1616
+ align-items: center;
1617
+ gap: var(--sp-2);
1618
+ }
1619
+ .preview__label {
1620
+ font-family: var(--font-mono);
1621
+ font-size: var(--fs-xs);
1622
+ letter-spacing: 0.08em;
1623
+ color: var(--c-primary);
1624
+ }
1625
+ .preview__meta {
1626
+ font-family: var(--font-mono);
1627
+ font-size: 10px;
1628
+ color: var(--c-text-muted);
1629
+ }
1630
+ .preview__chevron {
1631
+ color: var(--c-primary);
1632
+ font-size: 13px;
1633
+ }
1634
+ .preview__body {
1635
+ padding: 2px 17px 16px;
1636
+ display: flex;
1637
+ flex-direction: column;
1638
+ gap: 7px;
1639
+ }
1640
+ .preview__line {
1641
+ display: flex;
1642
+ gap: var(--sp-3);
1643
+ font-family: var(--font-mono);
1644
+ font-size: 12px;
1645
+ line-height: 1.5;
1646
+ }
1647
+ .preview__key {
1648
+ flex: none;
1649
+ width: 74px;
1650
+ color: var(--c-text-muted);
1651
+ }
1652
+ .preview__val {
1653
+ color: oklch(86% 0.05 165);
1654
+ min-width: 0;
1655
+ overflow-wrap: anywhere;
1656
+ }
1657
+ .builder__actions {
1658
+ flex-wrap: nowrap;
1659
+ }
1660
+ .builder__cta {
1661
+ flex: 1;
1662
+ }
1663
+
1664
+ /* ── Wider screens ─────────────────────────────────────────── */
1665
+ @media (min-width: 720px) {
1666
+ .app {
1667
+ max-width: 1200px;
1668
+ }
1669
+ .app-bar {
1670
+ padding: var(--sp-4) var(--sp-5) var(--sp-2);
1671
+ }
1672
+ .app-main {
1673
+ padding: var(--sp-2) var(--sp-5) 0;
1674
+ padding-bottom: var(--sp-6);
1675
+ width: 100%;
1676
+ }
1677
+
1678
+ /* Nav becomes a slim top-right rail instead of a thumb bar */
1679
+ .bottom-nav {
1680
+ position: static;
1681
+ transform: none;
1682
+ max-width: none;
1683
+ width: auto;
1684
+ height: auto;
1685
+ padding: 0;
1686
+ border: 0;
1687
+ background: none;
1688
+ backdrop-filter: none;
1689
+ order: -1;
1690
+ }
1691
+ .app-bar {
1692
+ gap: var(--sp-4);
1693
+ }
1694
+ .app-bar .badge {
1695
+ margin-left: 0;
1696
+ }
1697
+ /* bottom-nav rendered after main; float it into the app bar visually */
1698
+ .bottom-nav {
1699
+ position: fixed;
1700
+ top: 14px;
1701
+ right: max(16px, calc(50vw - 584px));
1702
+ left: auto;
1703
+ bottom: auto;
1704
+ display: flex;
1705
+ gap: var(--sp-1);
1706
+ background: var(--c-surface);
1707
+ border: 1px solid var(--c-border);
1708
+ border-radius: 999px;
1709
+ padding: 4px;
1710
+ box-shadow: var(--shadow-1);
1711
+ z-index: 30;
1712
+ }
1713
+ .bottom-nav__item {
1714
+ flex: none;
1715
+ flex-direction: row;
1716
+ gap: var(--sp-2);
1717
+ padding: 8px 16px;
1718
+ border-radius: 999px;
1719
+ min-height: 40px;
1720
+ }
1721
+ .bottom-nav__item.is-active {
1722
+ background: oklch(78% 0.14 165 / 0.13);
1723
+ }
1724
+ .bottom-nav__icon {
1725
+ font-size: 15px;
1726
+ }
1727
+
1728
+ /* Board: all five columns visible, no swipe */
1729
+ .board__columns {
1730
+ overflow-x: visible;
1731
+ scroll-snap-type: none;
1732
+ flex-wrap: nowrap;
1733
+ }
1734
+ .lane {
1735
+ flex: 1 1 0;
1736
+ min-width: 0;
1737
+ max-width: none;
1738
+ }
1739
+
1740
+ /* Detail / builder / settings: comfortable reading column */
1741
+ .card-detail,
1742
+ .builder,
1743
+ .settings {
1744
+ max-width: 720px;
1745
+ margin: 0 auto;
1746
+ width: 100%;
1747
+ }
1748
+ .token-gate__card {
1749
+ max-width: 400px;
1750
+ }
1751
+ }
1752
+
1753
+ @media (min-width: 1024px) {
1754
+ .card__title {
1755
+ font-size: var(--fs-md);
1756
+ }
1757
+ .card-detail__title {
1758
+ font-size: 26px;
1759
+ }
1760
+ }