@polderlabs/openkan 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +226 -0
  2. package/LICENSE +21 -0
  3. package/README.md +318 -0
  4. package/agents/openkan.md +254 -0
  5. package/bin/install-agent.mjs +63 -0
  6. package/bin/ok.mjs +17 -0
  7. package/bin/openkan.mjs +10 -0
  8. package/dist/.claude/skills/ok-planning/SKILL.md +285 -0
  9. package/dist/.claude/skills/ok-planning/references/integration.md +153 -0
  10. package/dist/.claude/skills/ok-planning/references/schemas.md +270 -0
  11. package/dist/.claude/skills/ok-planning/references/workflows.md +185 -0
  12. package/dist/.claude/skills/ok-planning/scripts/ok-init.sh +14 -0
  13. package/dist/.claude/skills/ok-planning/scripts/ok-resume.sh +38 -0
  14. package/dist/.claude/skills/ok-planning/scripts/ok-status.sh +24 -0
  15. package/dist/agents/openkan.md +254 -0
  16. package/dist/bin/install-agent.mjs +76 -0
  17. package/dist/bin/ok-install.js +58 -0
  18. package/dist/bin/ok.js +138 -0
  19. package/dist/bin/openkan.js +804 -0
  20. package/dist/commands/organize.md +15 -0
  21. package/dist/kanban/agent-profile.js +8 -0
  22. package/dist/kanban/archive.js +49 -0
  23. package/dist/kanban/bizar.js +242 -0
  24. package/dist/kanban/board.js +367 -0
  25. package/dist/kanban/bulk.js +139 -0
  26. package/dist/kanban/changelog.js +186 -0
  27. package/dist/kanban/chat.js +1280 -0
  28. package/dist/kanban/claude-state.js +974 -0
  29. package/dist/kanban/comments.js +80 -0
  30. package/dist/kanban/docs.js +144 -0
  31. package/dist/kanban/fs.js +163 -0
  32. package/dist/kanban/git.js +196 -0
  33. package/dist/kanban/images.js +140 -0
  34. package/dist/kanban/import.js +295 -0
  35. package/dist/kanban/inputs.js +94 -0
  36. package/dist/kanban/insights.js +140 -0
  37. package/dist/kanban/io.js +75 -0
  38. package/dist/kanban/mdx-render.js +348 -0
  39. package/dist/kanban/mdx.js +231 -0
  40. package/dist/kanban/projects.js +545 -0
  41. package/dist/kanban/search.js +121 -0
  42. package/dist/kanban/server.js +3296 -0
  43. package/dist/kanban/tags.js +124 -0
  44. package/dist/kanban/template.js +145 -0
  45. package/dist/kanban/tsx-sandbox.js +187 -0
  46. package/dist/kanban/watcher.js +270 -0
  47. package/dist/ok/commands/goal.js +65 -0
  48. package/dist/ok/commands/index.js +87 -0
  49. package/dist/ok/commands/init.js +15 -0
  50. package/dist/ok/commands/plan.js +155 -0
  51. package/dist/ok/commands/prd.js +202 -0
  52. package/dist/ok/commands/progress.js +31 -0
  53. package/dist/ok/commands/task.js +377 -0
  54. package/dist/ok/ids.js +98 -0
  55. package/dist/ok/lock.js +156 -0
  56. package/dist/ok/migrate.js +197 -0
  57. package/dist/ok/schemas.js +402 -0
  58. package/dist/ok/storage.js +222 -0
  59. package/dist/skills/openkan/SKILL.md +111 -0
  60. package/dist/skills/openkan/agents/openai.yaml +4 -0
  61. package/dist/skills/openkan/examples/simple-task.mdx +34 -0
  62. package/dist/skills/openkan/examples/with-ask.mdx +32 -0
  63. package/dist/skills/openkan/examples/with-choice.mdx +51 -0
  64. package/dist/skills/openkan/examples/with-preview.mdx +54 -0
  65. package/dist/skills/openkan/references/api.md +169 -0
  66. package/dist/skills/openkan/templates/task.mdx +46 -0
  67. package/dist/web/api.js +257 -0
  68. package/dist/web/app.js +4251 -0
  69. package/dist/web/bizar.js +39 -0
  70. package/dist/web/brand/agent-activity-sprite.svg +1 -0
  71. package/dist/web/brand/banner-docs.svg +24 -0
  72. package/dist/web/brand/banner.svg +32 -0
  73. package/dist/web/brand/empty-sessions.svg +17 -0
  74. package/dist/web/brand/empty-tasks.svg +17 -0
  75. package/dist/web/brand/favicon.svg +9 -0
  76. package/dist/web/brand/infinity-loader-animated.svg +220 -0
  77. package/dist/web/brand/infinity-loader-spritesheet.svg +230 -0
  78. package/dist/web/brand/logo-wordmark.svg +10 -0
  79. package/dist/web/brand/logo.svg +9 -0
  80. package/dist/web/brand/pixel-infinity-track.svg +1 -0
  81. package/dist/web/brand/social-card.svg +26 -0
  82. package/dist/web/changelog-view.js +456 -0
  83. package/dist/web/charts.js +269 -0
  84. package/dist/web/chat-sidebar.js +2397 -0
  85. package/dist/web/chat-status-motion.js +154 -0
  86. package/dist/web/claude-pane.js +820 -0
  87. package/dist/web/command-palette.js +381 -0
  88. package/dist/web/contributors-view.js +317 -0
  89. package/dist/web/cross-tab.js +102 -0
  90. package/dist/web/docs-view.js +168 -0
  91. package/dist/web/experience.css +165 -0
  92. package/dist/web/goals-view.js +45 -0
  93. package/dist/web/home-view.js +113 -0
  94. package/dist/web/images.js +311 -0
  95. package/dist/web/index.html +485 -0
  96. package/dist/web/insights.js +217 -0
  97. package/dist/web/keyboard.js +446 -0
  98. package/dist/web/mdx-viewer.js +600 -0
  99. package/dist/web/path-picker.js +787 -0
  100. package/dist/web/preview-frame.html +187 -0
  101. package/dist/web/settings.js +582 -0
  102. package/dist/web/style.css +8545 -0
  103. package/dist/web/task-view.js +1759 -0
  104. package/dist/web/vendor/gsap.min.js +11 -0
  105. package/dist/web/workspace.css +1513 -0
  106. package/package.json +71 -0
  107. package/skills/openkan/SKILL.md +111 -0
  108. package/skills/openkan/agents/openai.yaml +4 -0
  109. package/skills/openkan/examples/simple-task.mdx +34 -0
  110. package/skills/openkan/examples/with-ask.mdx +32 -0
  111. package/skills/openkan/examples/with-choice.mdx +51 -0
  112. package/skills/openkan/examples/with-preview.mdx +54 -0
  113. package/skills/openkan/references/api.md +169 -0
  114. package/skills/openkan/templates/task.mdx +46 -0
@@ -0,0 +1,1513 @@
1
+ /* OpenKan workspace refresh
2
+ This file is the active visual contract described in DESIGN.md. It layers
3
+ over legacy component styles while preserving existing DOM/API contracts. */
4
+
5
+ :root {
6
+ --bg: #090c12;
7
+ --bg-elev: #111722;
8
+ --bg-elev-2: #18202d;
9
+ --border: #253044;
10
+ --border-strong: #3a4962;
11
+ --text: #f4f7fb;
12
+ --text-dim: #aeb9c9;
13
+ --text-mute: #748198;
14
+ --accent: #6d6ff8;
15
+ --accent-hover: #8587ff;
16
+ --success: #3bc985;
17
+ --warn: #f4b75d;
18
+ --danger: #f06978;
19
+ --danger-hover: #ff7d8c;
20
+ --radius: 14px;
21
+ --radius-sm: 8px;
22
+ --radius-md: 10px;
23
+ --shadow-1: 0 1px 2px rgba(0, 0, 0, 0.25);
24
+ --shadow-2: 0 18px 50px rgba(0, 0, 0, 0.35);
25
+ --transition: 160ms cubic-bezier(0.2, 0.7, 0.2, 1);
26
+ --topbar-height: 68px;
27
+ --footer-height: 28px;
28
+ --gap: 12px;
29
+ }
30
+
31
+ html,
32
+ body {
33
+ background:
34
+ radial-gradient(circle at 12% -10%, rgba(109, 111, 248, 0.14), transparent 32rem),
35
+ radial-gradient(circle at 94% 12%, rgba(50, 201, 190, 0.07), transparent 28rem),
36
+ var(--bg);
37
+ }
38
+
39
+ body {
40
+ letter-spacing: -0.006em;
41
+ }
42
+
43
+ .sr-only {
44
+ position: absolute !important;
45
+ width: 1px !important;
46
+ height: 1px !important;
47
+ padding: 0 !important;
48
+ margin: -1px !important;
49
+ overflow: hidden !important;
50
+ clip: rect(0, 0, 0, 0) !important;
51
+ white-space: nowrap !important;
52
+ border: 0 !important;
53
+ }
54
+
55
+ .topbar {
56
+ display: grid;
57
+ grid-template-columns: minmax(220px, 0.8fr) minmax(440px, 1.5fr) minmax(300px, 1fr);
58
+ gap: 18px;
59
+ height: var(--topbar-height);
60
+ padding: 0 22px;
61
+ background: rgba(9, 12, 18, 0.84);
62
+ border-color: rgba(116, 129, 152, 0.2);
63
+ box-shadow: 0 1px 0 rgba(255, 255, 255, 0.02);
64
+ }
65
+
66
+ .brand {
67
+ min-width: 0;
68
+ gap: 11px;
69
+ }
70
+
71
+ .brand h1 {
72
+ font-size: 17px;
73
+ font-weight: 720;
74
+ letter-spacing: -0.02em;
75
+ }
76
+
77
+ .logo {
78
+ position: relative;
79
+ width: 22px;
80
+ height: 22px;
81
+ border-radius: 7px;
82
+ background: linear-gradient(145deg, #8d8fff 0%, #696cf5 48%, #35c7bc 130%);
83
+ box-shadow:
84
+ 0 8px 18px rgba(109, 111, 248, 0.28),
85
+ inset 0 1px 0 rgba(255, 255, 255, 0.28);
86
+ }
87
+
88
+ .logo::after {
89
+ content: "";
90
+ position: absolute;
91
+ inset: 5px;
92
+ border: 1.5px solid rgba(255, 255, 255, 0.82);
93
+ border-radius: 3px;
94
+ }
95
+
96
+ .brand-project-chip {
97
+ max-width: 150px;
98
+ min-height: 30px;
99
+ background: rgba(255, 255, 255, 0.035);
100
+ border-color: rgba(116, 129, 152, 0.22);
101
+ }
102
+
103
+ .topbar-tabs {
104
+ justify-self: center;
105
+ align-self: stretch;
106
+ display: flex;
107
+ align-items: center;
108
+ gap: 5px;
109
+ padding: 8px;
110
+ background: rgba(255, 255, 255, 0.025);
111
+ border: 1px solid rgba(116, 129, 152, 0.12);
112
+ border-radius: 14px;
113
+ height: 46px;
114
+ margin: auto 0;
115
+ }
116
+
117
+ .topbar-tabs .tab {
118
+ position: relative;
119
+ height: 32px;
120
+ padding: 0 14px;
121
+ border: 0;
122
+ border-radius: 9px;
123
+ color: var(--text-mute);
124
+ font-size: 12.5px;
125
+ font-weight: 650;
126
+ letter-spacing: 0.005em;
127
+ transition: color var(--transition), background var(--transition), box-shadow var(--transition);
128
+ }
129
+
130
+ .topbar-tabs .tab::after {
131
+ display: none;
132
+ }
133
+
134
+ .topbar-tabs .tab:hover {
135
+ color: var(--text);
136
+ background: rgba(255, 255, 255, 0.045);
137
+ }
138
+
139
+ .topbar-tabs .tab.active,
140
+ .topbar-tabs .tab[aria-selected="true"] {
141
+ color: #fff;
142
+ background: var(--bg-elev-2);
143
+ box-shadow:
144
+ 0 0 0 1px rgba(133, 135, 255, 0.22),
145
+ 0 5px 16px rgba(0, 0, 0, 0.2);
146
+ }
147
+
148
+ .topbar-right {
149
+ justify-self: end;
150
+ min-width: 0;
151
+ }
152
+
153
+ .topbar-right .project-switcher {
154
+ display: none;
155
+ }
156
+
157
+ .pill {
158
+ background: rgba(255, 255, 255, 0.035);
159
+ border-color: rgba(116, 129, 152, 0.22);
160
+ }
161
+
162
+ .pill-connected {
163
+ color: #cdf8e1;
164
+ background: rgba(59, 201, 133, 0.08);
165
+ border-color: rgba(59, 201, 133, 0.28);
166
+ }
167
+
168
+ .pill-connected .pill-dot {
169
+ box-shadow: 0 0 0 3px rgba(59, 201, 133, 0.12), 0 0 12px rgba(59, 201, 133, 0.35);
170
+ }
171
+
172
+ .btn {
173
+ min-height: 36px;
174
+ border-radius: 10px;
175
+ font-weight: 650;
176
+ }
177
+
178
+ .btn-primary {
179
+ background: linear-gradient(135deg, #7779fa, #6265ef);
180
+ border-color: rgba(150, 151, 255, 0.5);
181
+ box-shadow: 0 8px 22px rgba(91, 94, 226, 0.22);
182
+ }
183
+
184
+ .btn-primary:hover {
185
+ background: linear-gradient(135deg, #898bff, #7174f7);
186
+ box-shadow: 0 10px 28px rgba(91, 94, 226, 0.3);
187
+ }
188
+
189
+ .topbar-create {
190
+ padding: 0 14px;
191
+ }
192
+
193
+ .btn-symbol {
194
+ font-size: 18px;
195
+ font-weight: 400;
196
+ line-height: 1;
197
+ }
198
+
199
+ .btn-icon {
200
+ width: 36px;
201
+ height: 36px;
202
+ border: 1px solid transparent;
203
+ }
204
+
205
+ .btn-icon:hover {
206
+ border-color: var(--border);
207
+ }
208
+
209
+ .dashboard {
210
+ min-height: 0;
211
+ padding: 20px 22px 0;
212
+ overflow: hidden;
213
+ }
214
+
215
+ .tab-pane {
216
+ min-height: 0;
217
+ }
218
+
219
+ #tab-tasks {
220
+ display: flex;
221
+ flex-direction: column;
222
+ gap: 12px;
223
+ min-height: 0;
224
+ }
225
+
226
+ #tab-tasks[hidden] {
227
+ display: none;
228
+ }
229
+
230
+ .workspace-intro {
231
+ display: flex;
232
+ align-items: flex-end;
233
+ justify-content: space-between;
234
+ gap: 24px;
235
+ flex: 0 0 auto;
236
+ }
237
+
238
+ .workspace-eyebrow {
239
+ display: block;
240
+ margin-bottom: 3px;
241
+ color: #8f91ff;
242
+ font-size: 10.5px;
243
+ font-weight: 750;
244
+ letter-spacing: 0.12em;
245
+ text-transform: uppercase;
246
+ }
247
+
248
+ .workspace-intro h2 {
249
+ margin: 0;
250
+ color: var(--text);
251
+ font-size: clamp(22px, 2.2vw, 30px);
252
+ line-height: 1.15;
253
+ letter-spacing: -0.035em;
254
+ }
255
+
256
+ .workspace-intro p {
257
+ margin: 5px 0 0;
258
+ color: var(--text-mute);
259
+ font-size: 12.5px;
260
+ }
261
+
262
+ .board-overview {
263
+ display: grid;
264
+ grid-template-columns: repeat(4, minmax(74px, 1fr));
265
+ min-width: min(390px, 42vw);
266
+ background: rgba(17, 23, 34, 0.68);
267
+ border: 1px solid rgba(116, 129, 152, 0.18);
268
+ border-radius: 14px;
269
+ overflow: hidden;
270
+ box-shadow: var(--shadow-1);
271
+ }
272
+
273
+ .overview-stat {
274
+ position: relative;
275
+ display: flex;
276
+ flex-direction: column;
277
+ gap: 1px;
278
+ padding: 10px 13px;
279
+ }
280
+
281
+ .overview-stat + .overview-stat {
282
+ border-left: 1px solid rgba(116, 129, 152, 0.14);
283
+ }
284
+
285
+ .overview-stat::before {
286
+ content: "";
287
+ position: absolute;
288
+ top: 13px;
289
+ left: 0;
290
+ width: 2px;
291
+ height: 18px;
292
+ border-radius: 2px;
293
+ background: transparent;
294
+ }
295
+
296
+ .overview-stat.is-doing::before { background: #5d9dfa; }
297
+ .overview-stat.is-review::before { background: #b584ff; }
298
+ .overview-stat.is-done::before { background: var(--success); }
299
+
300
+ .overview-value {
301
+ color: var(--text);
302
+ font-size: 18px;
303
+ font-weight: 740;
304
+ line-height: 1;
305
+ }
306
+
307
+ .overview-label {
308
+ color: var(--text-mute);
309
+ font-size: 9.5px;
310
+ font-weight: 650;
311
+ letter-spacing: 0.04em;
312
+ text-transform: uppercase;
313
+ white-space: nowrap;
314
+ }
315
+
316
+ .saved-filters-bar {
317
+ flex: 0 0 auto;
318
+ padding: 8px 12px;
319
+ background: rgba(17, 23, 34, 0.75);
320
+ border: 1px solid rgba(116, 129, 152, 0.16);
321
+ border-radius: 12px;
322
+ }
323
+
324
+ .filter-bar {
325
+ flex: 0 0 auto;
326
+ padding: 10px;
327
+ background: rgba(17, 23, 34, 0.78);
328
+ border: 1px solid rgba(116, 129, 152, 0.18);
329
+ border-radius: 16px;
330
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.14);
331
+ }
332
+
333
+ .filter-primary {
334
+ display: grid;
335
+ grid-template-columns: minmax(260px, 1fr) auto;
336
+ gap: 10px;
337
+ align-items: center;
338
+ }
339
+
340
+ .filter-bar-row.search {
341
+ position: relative;
342
+ display: flex;
343
+ align-items: center;
344
+ min-width: 0;
345
+ padding: 0;
346
+ border: 0;
347
+ }
348
+
349
+ .search-icon {
350
+ position: absolute;
351
+ left: 13px;
352
+ z-index: 1;
353
+ width: 14px;
354
+ height: 14px;
355
+ border: 1.5px solid var(--text-mute);
356
+ border-radius: 50%;
357
+ pointer-events: none;
358
+ }
359
+
360
+ .search-icon::after {
361
+ content: "";
362
+ position: absolute;
363
+ width: 6px;
364
+ height: 1.5px;
365
+ right: -5px;
366
+ bottom: -2px;
367
+ border-radius: 1px;
368
+ background: var(--text-mute);
369
+ transform: rotate(45deg);
370
+ }
371
+
372
+ .filter-bar-row.search input[type="search"] {
373
+ width: 100%;
374
+ height: 40px;
375
+ padding: 0 46px 0 38px;
376
+ background: rgba(9, 12, 18, 0.66);
377
+ border: 1px solid rgba(116, 129, 152, 0.24);
378
+ border-radius: 11px;
379
+ color: var(--text);
380
+ font-size: 13px;
381
+ }
382
+
383
+ .filter-bar-row.search input[type="search"]:focus {
384
+ border-color: rgba(133, 135, 255, 0.72);
385
+ box-shadow: 0 0 0 3px rgba(109, 111, 248, 0.12);
386
+ }
387
+
388
+ .search-meta {
389
+ right: 12px;
390
+ }
391
+
392
+ .filter-bar-row.controls {
393
+ display: flex;
394
+ align-items: center;
395
+ gap: 8px;
396
+ padding: 0;
397
+ border: 0;
398
+ }
399
+
400
+ .select-wrap select,
401
+ .filter-toggle-btn,
402
+ .archive-toggle,
403
+ .filter-bar-save,
404
+ .filter-bar-clear {
405
+ height: 38px;
406
+ }
407
+
408
+ .select-wrap select {
409
+ min-width: 132px;
410
+ padding: 0 32px 0 12px;
411
+ background: var(--bg-elev-2);
412
+ border: 1px solid var(--border);
413
+ border-radius: 10px;
414
+ color: var(--text-dim);
415
+ font-size: 12px;
416
+ }
417
+
418
+ .select-wrap::after {
419
+ display: none;
420
+ }
421
+
422
+ .filter-toggle-btn,
423
+ .filter-bar-save,
424
+ .filter-bar-clear {
425
+ display: inline-flex;
426
+ align-items: center;
427
+ justify-content: center;
428
+ gap: 7px;
429
+ padding: 0 12px;
430
+ background: var(--bg-elev-2);
431
+ border: 1px solid var(--border);
432
+ border-radius: 10px;
433
+ color: var(--text-dim);
434
+ font: 650 12px inherit;
435
+ cursor: pointer;
436
+ }
437
+
438
+ .filter-toggle-btn:hover,
439
+ .filter-toggle-btn.active {
440
+ color: var(--text);
441
+ border-color: rgba(133, 135, 255, 0.45);
442
+ }
443
+
444
+ .filter-toggle-btn.active {
445
+ background: rgba(109, 111, 248, 0.12);
446
+ }
447
+
448
+ .filter-count {
449
+ min-width: 19px;
450
+ padding: 1px 5px;
451
+ border-radius: 999px;
452
+ color: #fff;
453
+ background: var(--accent);
454
+ font-size: 10px;
455
+ text-align: center;
456
+ }
457
+
458
+ .archive-toggle {
459
+ padding: 3px;
460
+ background: rgba(9, 12, 18, 0.55);
461
+ border: 1px solid var(--border);
462
+ border-radius: 10px;
463
+ }
464
+
465
+ .archive-toggle button {
466
+ height: 30px;
467
+ padding: 0 10px;
468
+ border-radius: 7px;
469
+ }
470
+
471
+ .archive-toggle button.active {
472
+ background: var(--bg-elev-2);
473
+ color: var(--text);
474
+ box-shadow: inset 0 0 0 1px rgba(133, 135, 255, 0.18);
475
+ }
476
+
477
+ .filter-advanced {
478
+ display: grid;
479
+ gap: 8px;
480
+ margin-top: 10px;
481
+ padding: 12px;
482
+ background: rgba(9, 12, 18, 0.42);
483
+ border: 1px solid rgba(116, 129, 152, 0.14);
484
+ border-radius: 12px;
485
+ }
486
+
487
+ .filter-advanced[hidden] {
488
+ display: none;
489
+ }
490
+
491
+ .filter-advanced .filter-bar-row {
492
+ min-height: 30px;
493
+ padding: 0;
494
+ border: 0;
495
+ }
496
+
497
+ .filter-bar-label {
498
+ width: 86px;
499
+ flex: 0 0 86px;
500
+ color: var(--text-mute);
501
+ font-size: 9.5px;
502
+ letter-spacing: 0.09em;
503
+ }
504
+
505
+ .filter-advanced-actions {
506
+ display: flex;
507
+ justify-content: flex-end;
508
+ gap: 8px;
509
+ padding-top: 3px;
510
+ }
511
+
512
+ .filter-bar-save,
513
+ .filter-bar-clear {
514
+ height: 32px;
515
+ }
516
+
517
+ .filter-bar-clear {
518
+ background: transparent;
519
+ border-color: transparent;
520
+ }
521
+
522
+ #main-content {
523
+ flex: 1;
524
+ min-height: 0;
525
+ overflow: hidden;
526
+ border-radius: 16px 16px 0 0;
527
+ }
528
+
529
+ .board {
530
+ height: 100%;
531
+ min-height: 0;
532
+ grid-template-columns: repeat(5, minmax(0, 1fr));
533
+ gap: 10px;
534
+ padding: 0 0 12px;
535
+ overflow-x: hidden;
536
+ }
537
+
538
+ .column {
539
+ min-width: 0;
540
+ background: rgba(17, 23, 34, 0.74);
541
+ border-color: rgba(116, 129, 152, 0.18);
542
+ border-radius: 15px;
543
+ box-shadow: 0 12px 30px rgba(0, 0, 0, 0.12);
544
+ }
545
+
546
+ .column-header {
547
+ min-height: 48px;
548
+ padding: 0 12px;
549
+ border-color: rgba(116, 129, 152, 0.14);
550
+ }
551
+
552
+ .column-title {
553
+ font-size: 10.5px;
554
+ font-weight: 760;
555
+ letter-spacing: 0.08em;
556
+ }
557
+
558
+ .column-count {
559
+ min-width: 22px;
560
+ height: 22px;
561
+ background: rgba(255, 255, 255, 0.045);
562
+ color: var(--text-dim);
563
+ font-size: 10px;
564
+ }
565
+
566
+ .column-add-btn {
567
+ width: 28px;
568
+ height: 28px;
569
+ border-radius: 8px;
570
+ color: var(--text-mute);
571
+ }
572
+
573
+ .column-add-btn:hover {
574
+ color: #fff;
575
+ background: rgba(109, 111, 248, 0.18);
576
+ }
577
+
578
+ .column-body {
579
+ padding: 9px;
580
+ gap: 8px;
581
+ }
582
+
583
+ .card {
584
+ position: relative;
585
+ padding: 12px;
586
+ background:
587
+ linear-gradient(180deg, rgba(255, 255, 255, 0.025), transparent 42%),
588
+ var(--bg-elev-2);
589
+ border-color: rgba(116, 129, 152, 0.21);
590
+ border-radius: 12px;
591
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
592
+ }
593
+
594
+ .card::before {
595
+ content: "";
596
+ position: absolute;
597
+ left: 0;
598
+ top: 12px;
599
+ bottom: 12px;
600
+ width: 2px;
601
+ border-radius: 2px;
602
+ background: rgba(116, 129, 152, 0.3);
603
+ }
604
+
605
+ .column[data-column="doing"] .card::before { background: #5d9dfa; }
606
+ .column[data-column="review"] .card::before { background: #b584ff; }
607
+ .column[data-column="done"] .card::before { background: var(--success); }
608
+
609
+ .card:hover {
610
+ border-color: rgba(133, 135, 255, 0.42);
611
+ transform: translateY(-1px);
612
+ box-shadow: 0 10px 28px rgba(0, 0, 0, 0.2);
613
+ }
614
+
615
+ .card-title {
616
+ font-size: 12.5px;
617
+ font-weight: 690;
618
+ line-height: 1.38;
619
+ letter-spacing: -0.01em;
620
+ }
621
+
622
+ .card-desc {
623
+ font-size: 11.5px;
624
+ line-height: 1.45;
625
+ color: var(--text-mute);
626
+ }
627
+
628
+ .tag-chip {
629
+ min-height: 20px;
630
+ }
631
+
632
+ .column-empty {
633
+ min-height: 76px;
634
+ border-radius: 11px;
635
+ border-color: rgba(116, 129, 152, 0.22);
636
+ color: var(--text-mute);
637
+ font-size: 11px;
638
+ }
639
+
640
+ .footer {
641
+ height: var(--footer-height);
642
+ min-height: var(--footer-height);
643
+ background: rgba(9, 12, 18, 0.9);
644
+ border-color: rgba(116, 129, 152, 0.16);
645
+ color: var(--text-mute);
646
+ font-size: 9px;
647
+ }
648
+
649
+ /* Task workspace */
650
+
651
+ #task-view {
652
+ display: grid;
653
+ grid-template-rows: auto auto auto minmax(380px, 1fr) auto;
654
+ gap: 12px;
655
+ padding: 18px 22px;
656
+ overflow-y: auto;
657
+ }
658
+
659
+ #task-view[hidden] {
660
+ display: none;
661
+ }
662
+
663
+ .task-header {
664
+ grid-template-areas:
665
+ "back title actions"
666
+ "back desc status";
667
+ grid-template-columns: auto minmax(0, 1fr) auto;
668
+ grid-template-rows: auto auto;
669
+ gap: 8px 16px;
670
+ padding: 16px 18px;
671
+ background: rgba(17, 23, 34, 0.78);
672
+ border-color: rgba(116, 129, 152, 0.2);
673
+ border-radius: 16px;
674
+ }
675
+
676
+ .task-actions {
677
+ grid-area: actions;
678
+ align-self: start;
679
+ }
680
+
681
+ .task-header > .btn:first-child {
682
+ align-self: start;
683
+ }
684
+
685
+ .task-title {
686
+ font-size: clamp(21px, 2.2vw, 28px);
687
+ font-weight: 740;
688
+ letter-spacing: -0.03em;
689
+ }
690
+
691
+ .task-description {
692
+ font-size: 13px;
693
+ max-height: 5em;
694
+ }
695
+
696
+ .task-status-col {
697
+ grid-area: status;
698
+ flex-direction: row;
699
+ align-self: start;
700
+ }
701
+
702
+ .task-header-meta {
703
+ padding: 11px 14px;
704
+ background: rgba(17, 23, 34, 0.68);
705
+ border-color: rgba(116, 129, 152, 0.18);
706
+ border-radius: 14px;
707
+ }
708
+
709
+ .task-header-meta .meta-dl {
710
+ grid-template-columns: repeat(4, max-content minmax(54px, auto));
711
+ align-items: center;
712
+ column-gap: 8px;
713
+ row-gap: 7px;
714
+ }
715
+
716
+ .task-header-meta .meta-dl dt:not(:first-child) {
717
+ margin-left: 10px;
718
+ }
719
+
720
+ .task-header-meta .meta-tag-row {
721
+ padding-top: 8px;
722
+ }
723
+
724
+ .task-main {
725
+ min-height: 380px;
726
+ grid-template-columns: minmax(0, 1fr) minmax(260px, 320px);
727
+ }
728
+
729
+ .mdx-slot,
730
+ .comments-panel,
731
+ .inputs-panel,
732
+ .images-panel,
733
+ .subtasks-panel {
734
+ background: rgba(17, 23, 34, 0.74);
735
+ border-color: rgba(116, 129, 152, 0.18);
736
+ border-radius: 14px;
737
+ }
738
+
739
+ .mdx-slot {
740
+ padding: clamp(18px, 2.5vw, 32px);
741
+ }
742
+
743
+ .task-footer {
744
+ position: sticky;
745
+ bottom: -1px;
746
+ z-index: 3;
747
+ padding: 10px 12px;
748
+ background: rgba(17, 23, 34, 0.9);
749
+ border-color: rgba(116, 129, 152, 0.2);
750
+ border-radius: 14px;
751
+ backdrop-filter: blur(14px);
752
+ }
753
+
754
+ /* Docs and secondary workspaces */
755
+
756
+ .docs-tab {
757
+ background: rgba(17, 23, 34, 0.58);
758
+ border: 1px solid rgba(116, 129, 152, 0.16);
759
+ border-radius: 16px 16px 0 0;
760
+ overflow: hidden;
761
+ }
762
+
763
+ .docs-tree {
764
+ width: 270px;
765
+ background: rgba(17, 23, 34, 0.78);
766
+ border-color: rgba(116, 129, 152, 0.16);
767
+ }
768
+
769
+ .docs-file-header,
770
+ .docs-tree-header {
771
+ min-height: 52px;
772
+ background: rgba(9, 12, 18, 0.22);
773
+ border-color: rgba(116, 129, 152, 0.14);
774
+ }
775
+
776
+ .docs-content {
777
+ width: min(100%, 920px);
778
+ margin: 0 auto;
779
+ padding: clamp(26px, 4vw, 54px);
780
+ font-size: 15px;
781
+ line-height: 1.75;
782
+ }
783
+
784
+ .view-root {
785
+ background: transparent;
786
+ }
787
+
788
+ .view-root {
789
+ display: flex;
790
+ flex-direction: column;
791
+ gap: 12px;
792
+ min-height: 0;
793
+ padding: 12px;
794
+ }
795
+
796
+ .view-hero {
797
+ display: flex;
798
+ align-items: flex-end;
799
+ justify-content: space-between;
800
+ padding: 4px 2px 2px;
801
+ }
802
+
803
+ .view-eyebrow {
804
+ display: block;
805
+ margin-bottom: 4px;
806
+ color: #8f91ff;
807
+ font-size: 10px;
808
+ font-weight: 750;
809
+ letter-spacing: 0.12em;
810
+ text-transform: uppercase;
811
+ }
812
+
813
+ .view-hero h2 {
814
+ margin: 0;
815
+ font-size: clamp(22px, 2.2vw, 30px);
816
+ letter-spacing: -0.035em;
817
+ }
818
+
819
+ .view-hero p {
820
+ margin: 5px 0 0;
821
+ color: var(--text-mute);
822
+ font-size: 12.5px;
823
+ }
824
+
825
+ .changelog-summary,
826
+ .changelog-filter-row,
827
+ .changelog-entry,
828
+ .contributors-header,
829
+ .contributor-row {
830
+ background: rgba(17, 23, 34, 0.74);
831
+ border-color: rgba(116, 129, 152, 0.18);
832
+ border-radius: 14px;
833
+ }
834
+
835
+ .changelog-filter-row,
836
+ .contributors-header {
837
+ min-height: 48px;
838
+ padding-inline: 14px;
839
+ }
840
+
841
+ .changelog-entry {
842
+ padding: 14px 16px;
843
+ }
844
+
845
+ .contributor-row {
846
+ overflow: hidden;
847
+ }
848
+
849
+ .modal {
850
+ background: #141b27;
851
+ border-color: rgba(116, 129, 152, 0.3);
852
+ border-radius: 18px;
853
+ box-shadow: var(--shadow-2);
854
+ }
855
+
856
+ .modal-header,
857
+ .modal-footer {
858
+ border-color: rgba(116, 129, 152, 0.18);
859
+ }
860
+
861
+ .field input,
862
+ .field textarea,
863
+ .field select {
864
+ background: rgba(9, 12, 18, 0.72);
865
+ border-color: rgba(116, 129, 152, 0.28);
866
+ border-radius: 10px;
867
+ }
868
+
869
+ :root[data-theme="light"] {
870
+ --bg: #f4f6fa;
871
+ --bg-elev: #ffffff;
872
+ --bg-elev-2: #f6f7fb;
873
+ --border: #dce2eb;
874
+ --border-strong: #bec9d8;
875
+ --text: #172033;
876
+ --text-dim: #536078;
877
+ --text-mute: #77849a;
878
+ --accent: #5a5ee7;
879
+ --accent-hover: #484cd1;
880
+ --success: #16895c;
881
+ --warn: #ae6d14;
882
+ --danger: #cf4054;
883
+ }
884
+
885
+ :root[data-theme="light"] html,
886
+ :root[data-theme="light"] body {
887
+ background:
888
+ radial-gradient(circle at 10% 0%, rgba(90, 94, 231, 0.08), transparent 30rem),
889
+ #f4f6fa;
890
+ }
891
+
892
+ :root[data-theme="light"] .topbar {
893
+ background: rgba(255, 255, 255, 0.88);
894
+ }
895
+
896
+ :root[data-theme="light"] .topbar-tabs,
897
+ :root[data-theme="light"] .board-overview,
898
+ :root[data-theme="light"] .saved-filters-bar,
899
+ :root[data-theme="light"] .filter-bar,
900
+ :root[data-theme="light"] .filter-advanced,
901
+ :root[data-theme="light"] .docs-tab,
902
+ :root[data-theme="light"] .docs-tree,
903
+ :root[data-theme="light"] .changelog-summary,
904
+ :root[data-theme="light"] .changelog-filter-row,
905
+ :root[data-theme="light"] .changelog-entry,
906
+ :root[data-theme="light"] .contributors-header,
907
+ :root[data-theme="light"] .contributor-row {
908
+ background: rgba(255, 255, 255, 0.9);
909
+ border-color: #dce2eb;
910
+ }
911
+
912
+ :root[data-theme="light"] .filter-bar-row.search input[type="search"],
913
+ :root[data-theme="light"] .archive-toggle,
914
+ :root[data-theme="light"] .field input,
915
+ :root[data-theme="light"] .field textarea,
916
+ :root[data-theme="light"] .field select {
917
+ background: #fff;
918
+ border-color: #d5dce7;
919
+ color: var(--text);
920
+ }
921
+
922
+ :root[data-theme="light"] .overview-stat + .overview-stat {
923
+ border-color: #e2e7ef;
924
+ }
925
+
926
+ :root[data-theme="light"] .topbar-tabs .tab.active,
927
+ :root[data-theme="light"] .topbar-tabs .tab[aria-selected="true"],
928
+ :root[data-theme="light"] .archive-toggle button.active {
929
+ background: #e9ebf5;
930
+ color: #20283a;
931
+ }
932
+
933
+ :root[data-theme="light"] .filter-bar,
934
+ :root[data-theme="light"] .column,
935
+ :root[data-theme="light"] .task-header,
936
+ :root[data-theme="light"] .task-header-meta,
937
+ :root[data-theme="light"] .mdx-slot,
938
+ :root[data-theme="light"] .comments-panel,
939
+ :root[data-theme="light"] .inputs-panel,
940
+ :root[data-theme="light"] .images-panel,
941
+ :root[data-theme="light"] .subtasks-panel {
942
+ background: rgba(255, 255, 255, 0.86);
943
+ }
944
+
945
+ :root[data-theme="light"] .card {
946
+ background: #fff;
947
+ box-shadow: 0 5px 18px rgba(38, 48, 68, 0.06);
948
+ }
949
+
950
+ :root[data-theme="light"] .footer {
951
+ background: rgba(255, 255, 255, 0.92);
952
+ border-color: #dce2eb;
953
+ }
954
+
955
+ @media (max-width: 1120px) {
956
+ .topbar {
957
+ grid-template-columns: minmax(190px, 0.7fr) minmax(400px, 1.3fr) auto;
958
+ padding: 0 14px;
959
+ }
960
+
961
+ .topbar-tabs .tab {
962
+ padding: 0 10px;
963
+ }
964
+
965
+ #status-pill {
966
+ display: none;
967
+ }
968
+
969
+ .dashboard {
970
+ padding-inline: 14px;
971
+ }
972
+
973
+ .board {
974
+ grid-template-columns: repeat(5, minmax(210px, 1fr));
975
+ overflow-x: auto;
976
+ }
977
+ }
978
+
979
+ @media (max-width: 820px) {
980
+ :root {
981
+ --topbar-height: 112px;
982
+ }
983
+
984
+ .topbar {
985
+ grid-template-columns: 1fr auto;
986
+ grid-template-rows: 52px 48px;
987
+ gap: 0 10px;
988
+ height: var(--topbar-height);
989
+ padding: 6px 12px;
990
+ }
991
+
992
+ .brand {
993
+ grid-column: 1;
994
+ grid-row: 1;
995
+ }
996
+
997
+ .topbar-right {
998
+ grid-column: 2;
999
+ grid-row: 1;
1000
+ }
1001
+
1002
+ .topbar-tabs {
1003
+ grid-column: 1 / -1;
1004
+ grid-row: 2;
1005
+ justify-self: stretch;
1006
+ width: 100%;
1007
+ height: 42px;
1008
+ overflow-x: auto;
1009
+ justify-content: flex-start;
1010
+ }
1011
+
1012
+ .topbar-tabs .tab {
1013
+ flex: 1 0 auto;
1014
+ }
1015
+
1016
+ .workspace-intro {
1017
+ align-items: stretch;
1018
+ flex-direction: column;
1019
+ gap: 12px;
1020
+ }
1021
+
1022
+ .workspace-intro > div:first-child {
1023
+ display: none;
1024
+ }
1025
+
1026
+ .board-overview {
1027
+ min-width: 0;
1028
+ width: 100%;
1029
+ }
1030
+
1031
+ .filter-primary {
1032
+ grid-template-columns: 1fr;
1033
+ }
1034
+
1035
+ .filter-bar-row.controls {
1036
+ justify-content: space-between;
1037
+ }
1038
+
1039
+ .select-wrap {
1040
+ flex: 1;
1041
+ }
1042
+
1043
+ .select-wrap select {
1044
+ width: 100%;
1045
+ }
1046
+
1047
+ .archive-toggle {
1048
+ margin-left: auto;
1049
+ }
1050
+
1051
+ .board {
1052
+ display: flex;
1053
+ gap: 10px;
1054
+ padding-bottom: 10px;
1055
+ overflow-x: auto;
1056
+ overflow-y: hidden;
1057
+ scroll-snap-type: x mandatory;
1058
+ scrollbar-width: thin;
1059
+ }
1060
+
1061
+ .column {
1062
+ flex: 0 0 min(78vw, 320px);
1063
+ scroll-snap-align: start;
1064
+ }
1065
+
1066
+ .column[data-column="todo"] { order: 1; }
1067
+ .column[data-column="doing"] { order: 2; }
1068
+ .column[data-column="review"] { order: 3; }
1069
+ .column[data-column="backlog"] { order: 4; }
1070
+ .column[data-column="done"] { order: 5; }
1071
+
1072
+ #task-view {
1073
+ grid-template-rows: auto auto auto auto auto;
1074
+ padding: 12px;
1075
+ }
1076
+
1077
+ .task-header {
1078
+ grid-template-areas:
1079
+ "back actions"
1080
+ "title title"
1081
+ "desc desc"
1082
+ "status status";
1083
+ grid-template-columns: 1fr auto;
1084
+ }
1085
+
1086
+ .task-title-wrap {
1087
+ grid-area: title;
1088
+ }
1089
+
1090
+ .task-header > .task-description {
1091
+ grid-area: desc;
1092
+ }
1093
+
1094
+ .task-status-col {
1095
+ grid-area: status;
1096
+ justify-self: start;
1097
+ }
1098
+
1099
+ .task-header-meta .meta-dl {
1100
+ grid-template-columns: repeat(2, max-content minmax(52px, 1fr));
1101
+ }
1102
+
1103
+ .task-main {
1104
+ grid-template-columns: 1fr;
1105
+ min-height: 600px;
1106
+ }
1107
+
1108
+ .task-side {
1109
+ overflow: visible;
1110
+ }
1111
+ }
1112
+
1113
+ @media (max-width: 560px) {
1114
+ :root {
1115
+ --footer-height: 24px;
1116
+ }
1117
+
1118
+ .topbar {
1119
+ grid-template-columns: minmax(0, 1fr) auto;
1120
+ }
1121
+
1122
+ .brand h1,
1123
+ #settings-btn {
1124
+ display: none;
1125
+ }
1126
+
1127
+ .brand-project-chip {
1128
+ max-width: 132px;
1129
+ }
1130
+
1131
+ .topbar-create {
1132
+ width: 38px;
1133
+ padding: 0;
1134
+ }
1135
+
1136
+ .topbar-create .btn-label {
1137
+ position: absolute;
1138
+ width: 1px;
1139
+ height: 1px;
1140
+ overflow: hidden;
1141
+ clip: rect(0 0 0 0);
1142
+ }
1143
+
1144
+ .dashboard {
1145
+ padding: 10px 10px 0;
1146
+ }
1147
+
1148
+ #tab-tasks {
1149
+ gap: 9px;
1150
+ }
1151
+
1152
+ .overview-stat {
1153
+ padding: 8px;
1154
+ }
1155
+
1156
+ .overview-value {
1157
+ font-size: 16px;
1158
+ }
1159
+
1160
+ .overview-label {
1161
+ font-size: 8px;
1162
+ }
1163
+
1164
+ .filter-bar {
1165
+ padding: 8px;
1166
+ border-radius: 13px;
1167
+ }
1168
+
1169
+ .filter-bar-row.controls {
1170
+ display: grid;
1171
+ grid-template-columns: 1fr auto;
1172
+ }
1173
+
1174
+ .archive-toggle {
1175
+ grid-column: 1 / -1;
1176
+ width: 100%;
1177
+ }
1178
+
1179
+ .archive-toggle button {
1180
+ flex: 1;
1181
+ }
1182
+
1183
+ .filter-advanced {
1184
+ max-height: 44vh;
1185
+ overflow-y: auto;
1186
+ }
1187
+
1188
+ .filter-advanced .filter-bar-row {
1189
+ align-items: flex-start;
1190
+ }
1191
+
1192
+ .filter-bar-label {
1193
+ width: 68px;
1194
+ flex-basis: 68px;
1195
+ padding-top: 5px;
1196
+ }
1197
+
1198
+ .column {
1199
+ flex-basis: calc(100vw - 34px);
1200
+ }
1201
+
1202
+ .task-header-meta .meta-dl {
1203
+ grid-template-columns: max-content 1fr;
1204
+ }
1205
+
1206
+ .task-header-meta .meta-dl dt:not(:first-child) {
1207
+ margin-left: 0;
1208
+ }
1209
+
1210
+ .task-footer {
1211
+ justify-content: flex-start;
1212
+ overflow-x: auto;
1213
+ }
1214
+
1215
+ .task-footer .btn {
1216
+ flex: 0 0 auto;
1217
+ }
1218
+
1219
+ .docs-tree {
1220
+ width: 42%;
1221
+ min-width: 132px;
1222
+ }
1223
+
1224
+ .docs-content {
1225
+ padding: 20px;
1226
+ }
1227
+ }
1228
+
1229
+ @media (prefers-reduced-motion: reduce) {
1230
+ .card,
1231
+ .btn,
1232
+ .tab,
1233
+ .filter-toggle-btn {
1234
+ transition: none;
1235
+ }
1236
+ }
1237
+
1238
+ /* Workspace layout overrides: must follow the base workspace contract. */
1239
+ .topbar {
1240
+ display: grid;
1241
+ grid-template-columns: minmax(170px, 1fr) auto minmax(0, 1.7fr) auto;
1242
+ align-items: center;
1243
+ gap: 14px;
1244
+ position: sticky;
1245
+ top: 0;
1246
+ z-index: 100;
1247
+ }
1248
+ .brand { min-width: 0; }
1249
+ .workspace-mode { grid-column: 2; grid-row: 1; }
1250
+ .topbar-tabs {
1251
+ grid-column: 3;
1252
+ grid-row: 1;
1253
+ min-width: 0;
1254
+ width: min-content;
1255
+ max-width: 100%;
1256
+ justify-self: center;
1257
+ }
1258
+ .topbar-right {
1259
+ grid-column: 4;
1260
+ grid-row: 1;
1261
+ min-width: max-content;
1262
+ justify-self: end;
1263
+ }
1264
+ body.workspace-mode-chat { padding-left: 0; }
1265
+ .workspace-mode-chat .dashboard {
1266
+ top: var(--topbar-height);
1267
+ right: 0;
1268
+ bottom: 0;
1269
+ left: auto;
1270
+ width: 320px;
1271
+ padding: 0;
1272
+ border-right: 0;
1273
+ border-left: 1px solid var(--border);
1274
+ box-shadow: -12px 0 32px rgba(0, 0, 0, .12);
1275
+ }
1276
+ .workspace-mode-chat .chat-sidebar {
1277
+ top: var(--topbar-height);
1278
+ right: 320px;
1279
+ bottom: 0;
1280
+ left: 0;
1281
+ width: auto;
1282
+ }
1283
+ .workspace-mode-chat .chat-sidebar__topbar { padding-inline: 32px; }
1284
+ .workspace-mode-chat .chat-sidebar-transcript { max-width: 900px; }
1285
+ .workspace-mode-chat .chat-sidebar-composer { padding-inline: max(32px, calc((100vw - 1240px) / 2)); }
1286
+ .workspace-mode-chat #board { padding: 10px; }
1287
+ .workspace-mode-chat #board .column:nth-child(n + 3) { display: none; }
1288
+ @media (max-width: 1180px) and (min-width: 901px) {
1289
+ .topbar { grid-template-columns: minmax(140px, 1fr) auto minmax(0, 1.4fr) auto; gap: 8px; padding-inline: 12px; }
1290
+ .topbar-tabs .tab { padding-inline: 8px; }
1291
+ .topbar-right { gap: 5px; }
1292
+ #status-pill { display: none; }
1293
+ }
1294
+ @media (max-width: 900px) {
1295
+ .topbar { display: flex; min-height: var(--topbar-height); height: auto; flex-wrap: wrap; }
1296
+ .workspace-mode { display: none; }
1297
+ .topbar-tabs { order: 3; width: 100%; max-width: none; justify-self: auto; }
1298
+ .topbar-right { margin-left: auto; }
1299
+ .workspace-mode-chat .dashboard { display: none; }
1300
+ .workspace-mode-chat .chat-sidebar { inset: var(--topbar-height) 0 0; width: 100%; }
1301
+ }
1302
+
1303
+ /* External SVG images do not inherit `currentColor`; the wordmark asset owns
1304
+ its high-contrast dark-theme fill. */
1305
+ .brand-wordmark { width: 120px; height: 30px; object-fit: contain; object-position: left center; }
1306
+
1307
+ /* The wordmark is a CSS mask, so its color follows the active theme token. */
1308
+ .brand-wordmark {
1309
+ display: inline-block;
1310
+ width: 120px;
1311
+ height: 30px;
1312
+ flex: 0 0 auto;
1313
+ background: var(--text);
1314
+ -webkit-mask: url("./brand/logo-wordmark.svg") left center / contain no-repeat;
1315
+ mask: url("./brand/logo-wordmark.svg") left center / contain no-repeat;
1316
+ }
1317
+
1318
+ /* One explicit project control: a label, current project, and a clear menu affordance. */
1319
+ .brand-project-chip {
1320
+ gap: 9px;
1321
+ min-width: 174px;
1322
+ max-width: 252px;
1323
+ min-height: 36px;
1324
+ padding: 5px 10px 5px 11px;
1325
+ border-radius: 10px;
1326
+ background: var(--bg-elev);
1327
+ color: var(--text);
1328
+ font-family: inherit;
1329
+ text-align: left;
1330
+ }
1331
+ .brand-project-chip:hover { background: var(--bg-elev-2); border-color: var(--accent); }
1332
+ .brand-project-label {
1333
+ flex: 0 0 auto;
1334
+ color: var(--text-mute);
1335
+ font-size: 10px;
1336
+ font-weight: 750;
1337
+ letter-spacing: .08em;
1338
+ text-transform: uppercase;
1339
+ }
1340
+ .brand-project-value { display: inline-flex; min-width: 0; align-items: center; gap: 6px; }
1341
+ .brand-project-name { max-width: 132px; color: var(--text); font-size: 12px; font-weight: 650; }
1342
+ .brand-project-dot { width: 7px; height: 7px; }
1343
+ .brand-project-caret { margin-left: auto; color: var(--text-mute); font-size: 11px; transition: transform var(--transition); }
1344
+ .brand-project-chip[aria-expanded="true"] .brand-project-caret { transform: rotate(180deg); color: var(--text); }
1345
+ @media (max-width: 1180px) { .brand-project-chip { min-width: 0; max-width: 180px; } .brand-project-label { display: none; } }
1346
+
1347
+ /* Final chat-mode composer geometry. workspace.css is loaded last, so this
1348
+ clears its former wide inline padding before the surface is measured. */
1349
+ .workspace-mode-chat .chat-sidebar__composer {
1350
+ position: absolute;
1351
+ z-index: 5;
1352
+ right: auto !important;
1353
+ bottom: 22px;
1354
+ left: 50% !important;
1355
+ width: calc(100% - 56px) !important;
1356
+ max-width: 900px;
1357
+ box-sizing: border-box;
1358
+ padding: 0 !important;
1359
+ border: 0;
1360
+ background: transparent;
1361
+ transform: translateX(-50%);
1362
+ }
1363
+ .workspace-mode-chat .chat-sidebar__composer-surface { width: 100%; box-sizing: border-box; }
1364
+ .workspace-mode-chat .chat-sidebar__composer-input { box-sizing: border-box; }
1365
+ @media (max-width: 900px) {
1366
+ .workspace-mode-chat .chat-sidebar__composer {
1367
+ right: 16px !important;
1368
+ left: 16px !important;
1369
+ width: auto !important;
1370
+ max-width: none;
1371
+ transform: none;
1372
+ }
1373
+ }
1374
+
1375
+ /* Keep the deliberately small primary nav fully visible when a chat rail
1376
+ narrows the application shell. Less-frequent destinations live in More. */
1377
+ @media (max-width: 1400px) and (min-width: 901px) {
1378
+ .workspace-mode { display: none; }
1379
+ .topbar-tabs { gap: 2px; height: 40px; padding: 4px; overflow: visible; }
1380
+ .topbar-tabs .tab,
1381
+ .topbar-tabs .tab:hover { height: 30px; padding: 0 5px; font-size: 10.5px; }
1382
+ }
1383
+
1384
+
1385
+ /* Task-card readability refresh: text-led hierarchy with compact, semantic metadata. */
1386
+ .card {
1387
+ gap: 10px;
1388
+ padding: 13px;
1389
+ border-radius: 10px;
1390
+ }
1391
+ .card-header {
1392
+ display: flex;
1393
+ align-items: flex-start;
1394
+ justify-content: space-between;
1395
+ gap: 10px;
1396
+ }
1397
+ .card-title {
1398
+ flex: 1 1 auto;
1399
+ min-width: 0;
1400
+ font-size: 13px;
1401
+ font-weight: 670;
1402
+ letter-spacing: -0.012em;
1403
+ line-height: 1.42;
1404
+ }
1405
+ .card-priority {
1406
+ display: inline-flex;
1407
+ align-items: center;
1408
+ flex: 0 0 auto;
1409
+ min-height: 20px;
1410
+ padding: 2px 6px;
1411
+ border: 1px solid var(--border);
1412
+ border-radius: 5px;
1413
+ color: var(--text-mute);
1414
+ font-family: ui-monospace, "SFMono-Regular", Consolas, monospace;
1415
+ font-size: 9px;
1416
+ font-weight: 750;
1417
+ letter-spacing: .045em;
1418
+ line-height: 1;
1419
+ text-transform: uppercase;
1420
+ }
1421
+ .card-priority.priority-urgent { border-color: color-mix(in srgb, var(--danger) 62%, var(--border)); color: var(--danger); background: color-mix(in srgb, var(--danger) 10%, transparent); }
1422
+ .card-priority.priority-high { border-color: color-mix(in srgb, var(--warn) 56%, var(--border)); color: var(--warn); background: color-mix(in srgb, var(--warn) 8%, transparent); }
1423
+ .card-priority.priority-normal { color: var(--text-mute); }
1424
+ .card-priority.priority-low { opacity: .74; }
1425
+ .card-desc {
1426
+ color: color-mix(in srgb, var(--text-dim) 88%, var(--text));
1427
+ font-size: 12px;
1428
+ line-height: 1.5;
1429
+ }
1430
+ .card-subtask-badge {
1431
+ color: var(--text-dim);
1432
+ background: transparent;
1433
+ border-color: var(--border);
1434
+ font-size: 10px;
1435
+ font-weight: 650;
1436
+ padding: 2px 6px;
1437
+ }
1438
+ .card-tags { margin-top: 0; gap: 5px; }
1439
+ .card-meta {
1440
+ min-height: 20px;
1441
+ padding-top: 8px;
1442
+ margin-top: 0;
1443
+ border-top: 1px solid color-mix(in srgb, var(--border) 78%, transparent);
1444
+ }
1445
+ .card-state-label {
1446
+ color: var(--text-mute);
1447
+ font-size: 10px;
1448
+ font-weight: 650;
1449
+ letter-spacing: .035em;
1450
+ text-transform: capitalize;
1451
+ }
1452
+ .card-artifact-link {
1453
+ color: var(--text-mute);
1454
+ font-size: 10px;
1455
+ font-weight: 650;
1456
+ text-decoration: none;
1457
+ }
1458
+ .card-artifact-link:hover { color: var(--text); text-decoration: underline; text-underline-offset: 3px; }
1459
+ .card-source { gap: 7px; padding: 3px 7px; color: var(--text-dim); background: transparent; border-color: var(--border); }
1460
+ .card-source:hover { background: var(--bg-elev); border-color: var(--border-strong); color: var(--text); }
1461
+ .card-source-label { color: var(--text-mute); font-size: 9px; font-weight: 750; letter-spacing: .07em; text-transform: uppercase; }
1462
+ .card-source-text { max-width: 205px; }
1463
+ .card.card-archived .card-priority { left: auto; right: auto; }
1464
+ .task-action-btn { width: auto; min-width: 28px; padding: 0 7px; font-size: 10px; font-weight: 700; letter-spacing: .01em; }
1465
+ .task-actions { flex-wrap: wrap; max-width: 100%; }
1466
+ @media (max-width: 700px) {
1467
+ .card { padding: 12px; }
1468
+ .card-priority { font-size: 8px; }
1469
+ .task-actions { justify-self: start; }
1470
+ }
1471
+
1472
+ /* A chat rail reduces the task canvas, not the width of its cards. Keep a
1473
+ consistent five-column board and let the dedicated board viewport scroll
1474
+ horizontally once the available task area becomes too narrow. This applies
1475
+ only to task mode: chat mode intentionally renders the compact right rail. */
1476
+ @media (min-width: 901px) {
1477
+ body.chat-sidebar-open:not(.workspace-mode-chat) .dashboard,
1478
+ body.chat-sidebar-open:not(.workspace-mode-chat) #tab-tasks {
1479
+ min-width: 0;
1480
+ }
1481
+
1482
+ body.chat-sidebar-open:not(.workspace-mode-chat) .workspace-intro {
1483
+ flex-wrap: wrap;
1484
+ align-items: flex-start;
1485
+ gap: 12px;
1486
+ }
1487
+
1488
+ body.chat-sidebar-open:not(.workspace-mode-chat) .board-overview {
1489
+ flex: 1 1 330px;
1490
+ min-width: 0;
1491
+ }
1492
+
1493
+ body.chat-sidebar-open:not(.workspace-mode-chat) .filter-primary {
1494
+ grid-template-columns: minmax(220px, 1fr);
1495
+ }
1496
+
1497
+ body.chat-sidebar-open:not(.workspace-mode-chat) .filter-bar-row.controls {
1498
+ flex-wrap: wrap;
1499
+ justify-content: flex-start;
1500
+ }
1501
+
1502
+ body.chat-sidebar-open:not(.workspace-mode-chat) #main-content {
1503
+ overflow: auto;
1504
+ overscroll-behavior-inline: contain;
1505
+ scrollbar-gutter: stable both-edges;
1506
+ }
1507
+
1508
+ body.chat-sidebar-open:not(.workspace-mode-chat) .board {
1509
+ min-width: 1340px;
1510
+ grid-template-columns: repeat(5, minmax(260px, 1fr));
1511
+ overflow: visible;
1512
+ }
1513
+ }