@bvdm/delano 0.2.3 → 0.2.5

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 (40) hide show
  1. package/.delano/viewer/README.md +3 -2
  2. package/.delano/viewer/public/app.js +13 -1
  3. package/.delano/viewer/public/app.jsx +2312 -0
  4. package/.delano/viewer/public/delano-mark.svg +4 -0
  5. package/.delano/viewer/public/index.html +12 -14
  6. package/.delano/viewer/public/styles.css +1005 -833
  7. package/.delano/viewer/server.js +46 -5
  8. package/README.md +63 -3
  9. package/assets/install-manifest.json +7 -0
  10. package/assets/payload/.agents/adapters/manifest.schema.json +103 -0
  11. package/assets/payload/.agents/adapters/spec-kit/adapter.json +71 -0
  12. package/assets/payload/.agents/hooks/README.md +6 -1
  13. package/assets/payload/.agents/hooks/codex-session-status.js +123 -0
  14. package/assets/payload/.agents/schemas/status-transitions.json +35 -0
  15. package/assets/payload/.agents/scripts/README.md +1 -1
  16. package/assets/payload/.agents/scripts/check-status-transitions.mjs +171 -2
  17. package/assets/payload/.agents/scripts/pm/import-spec-kit.sh +605 -0
  18. package/assets/payload/.agents/scripts/pm/init.sh +31 -2
  19. package/assets/payload/.agents/scripts/pm/research.sh +296 -0
  20. package/assets/payload/.agents/scripts/pm/status.sh +135 -28
  21. package/assets/payload/.agents/scripts/pm/validate.sh +16 -0
  22. package/assets/payload/.codex/hooks.json +17 -0
  23. package/assets/payload/.delano/viewer/README.md +3 -2
  24. package/assets/payload/.delano/viewer/public/app.js +13 -1
  25. package/assets/payload/.delano/viewer/public/index.html +12 -14
  26. package/assets/payload/.delano/viewer/public/styles.css +1005 -833
  27. package/assets/payload/.delano/viewer/server.js +46 -5
  28. package/assets/payload/.project/templates/decisions.md +18 -0
  29. package/assets/payload/.project/templates/plan.md +17 -0
  30. package/assets/payload/.project/templates/spec.md +12 -0
  31. package/assets/payload/.project/templates/task.md +6 -0
  32. package/assets/payload/.project/templates/workstream.md +1 -0
  33. package/package.json +4 -2
  34. package/src/cli/commands/install.js +2 -1
  35. package/src/cli/commands/state.js +689 -0
  36. package/src/cli/commands/viewer.js +2 -1
  37. package/src/cli/commands/wrapper.js +29 -5
  38. package/src/cli/index.js +120 -7
  39. package/src/cli/lib/install.js +179 -2
  40. package/src/cli/lib/project-state.js +918 -0
@@ -1,1042 +1,1214 @@
1
+ /* ============================================================
2
+ Delano Viewer — Keendoc design language
3
+ ============================================================ */
4
+
5
+ /* ---------- Tokens ---------- */
1
6
  :root {
2
- color-scheme: light;
3
- --canvas: #f7f6f3;
4
- --paper: #ffffff;
5
- --paper-soft: #fbfbfa;
6
- --ink: #111111;
7
- --text: #2f3437;
8
- --muted: #787774;
9
- --faint: #a5a19b;
10
- --line: #eaeaea;
11
- --line-soft: rgba(0, 0, 0, 0.06);
12
- --red-bg: #fdebec;
13
- --red-text: #9f2f2d;
14
- --blue-bg: #e1f3fe;
15
- --blue-text: #1f6c9f;
16
- --green-bg: #edf3ec;
17
- --green-text: #346538;
18
- --yellow-bg: #fbf3db;
19
- --yellow-text: #956400;
20
- --sans: "Aptos", "Segoe UI Variable", "Segoe UI", "SF Pro Display", "Geist Sans", "Helvetica Neue", Arial, sans-serif;
21
- --display: "Aptos Display", "Segoe UI Variable Display", "Segoe UI", "SF Pro Display", "Geist Sans", "Helvetica Neue", Arial, sans-serif;
22
- --serif: "Newsreader", "Instrument Serif", "Lyon Text", "Iowan Old Style", "Sitka Text", "Charter", "Cambria", Georgia, serif;
23
- --mono: "Geist Mono", "SF Mono", "JetBrains Mono", Consolas, monospace;
24
- --shadow-card-rest: 0 0 0 rgba(0, 0, 0, 0);
25
- --shadow-card-hover: 0 2px 8px rgba(0, 0, 0, 0.04);
26
- }
7
+ --bg: oklch(0.985 0.004 85);
8
+ --surface: oklch(0.995 0.003 85);
9
+ --ink: oklch(0.21 0.008 80);
10
+ --ink-70: oklch(0.40 0.008 80);
11
+ --ink-50: oklch(0.55 0.008 80);
12
+ --ink-40: oklch(0.66 0.006 80);
13
+ --ink-25: oklch(0.82 0.005 80);
27
14
 
28
- * { box-sizing: border-box; }
15
+ --line: oklch(0.92 0.005 85);
16
+ --line-soft: oklch(0.95 0.005 85);
29
17
 
30
- html { background: var(--canvas); }
18
+ --accent: oklch(0.52 0.08 245);
19
+ --accent-soft: oklch(0.96 0.02 245);
31
20
 
32
- body {
33
- margin: 0;
34
- min-height: 100vh;
35
- background: var(--canvas);
36
- color: var(--text);
37
- font: 14px/1.6 var(--sans);
38
- letter-spacing: 0;
39
- -webkit-font-smoothing: antialiased;
40
- text-rendering: optimizeLegibility;
41
- }
21
+ --ok: oklch(0.62 0.10 155);
22
+ --ok-soft: oklch(0.96 0.03 155);
23
+ --warn: oklch(0.62 0.13 55);
24
+ --warn-soft: oklch(0.97 0.04 60);
25
+ --low: oklch(0.70 0.04 85);
26
+ --low-soft: oklch(0.96 0.01 85);
42
27
 
43
- .ambient {
44
- position: fixed;
45
- inset: 0;
46
- pointer-events: none;
47
- z-index: 0;
48
- background:
49
- radial-gradient(ellipse 70% 55% at 18% 8%, rgba(180, 150, 110, 0.045), transparent 60%),
50
- radial-gradient(ellipse 60% 50% at 92% 90%, rgba(120, 130, 160, 0.035), transparent 60%);
51
- animation: ambient-drift 28s ease-in-out infinite alternate;
52
- }
28
+ --r: 6px;
29
+ --r-sm: 4px;
53
30
 
54
- @keyframes ambient-drift {
55
- 0% { transform: translate3d(0, 0, 0); }
56
- 100% { transform: translate3d(-1.2%, 0.8%, 0); }
31
+ --font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
32
+ --font-mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
57
33
  }
58
34
 
59
- @media (prefers-reduced-motion: reduce) {
60
- .ambient { animation: none; }
35
+ * { box-sizing: border-box; }
36
+ html, body { margin: 0; padding: 0; }
37
+ body {
38
+ font-family: var(--font-sans);
39
+ font-size: 14px;
40
+ line-height: 1.45;
41
+ color: var(--ink);
42
+ background: var(--bg);
43
+ -webkit-font-smoothing: antialiased;
44
+ font-feature-settings: "ss01", "cv11";
61
45
  }
62
46
 
63
- button, input { font: inherit; }
64
- button { color: inherit; }
47
+ button { font-family: inherit; font-size: inherit; color: inherit; background: none; border: none; cursor: pointer; padding: 0; }
48
+ .mono { font-family: var(--font-mono); font-size: 12.5px; letter-spacing: -0.01em; }
49
+ .small { font-size: 12px; }
65
50
 
66
- #app {
67
- position: relative;
68
- z-index: 1;
51
+ /* ---------- App shell ---------- */
52
+ .app {
53
+ display: grid;
54
+ grid-template-columns: 232px 1fr;
69
55
  min-height: 100vh;
70
- padding: 18px;
71
56
  }
72
57
 
73
- .viewer-frame {
74
- min-height: calc(100vh - 36px);
75
- border: 1px solid var(--line);
76
- border-radius: 12px;
77
- background: var(--paper);
78
- overflow: hidden;
79
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.02), 0 12px 40px rgba(40, 30, 10, 0.025);
58
+ /* ---------- Sidebar ---------- */
59
+ .sidebar {
60
+ border-right: 1px solid var(--line);
61
+ background: var(--surface);
62
+ padding: 20px 14px 24px;
63
+ display: flex;
64
+ flex-direction: column;
65
+ gap: 4px;
66
+ position: sticky;
67
+ top: 0;
68
+ height: 100vh;
69
+ overflow-y: auto;
80
70
  }
81
-
82
- .top-bar {
71
+ .brand {
83
72
  display: flex;
84
- align-items: stretch;
85
- height: 60px;
86
- padding: 0 28px;
87
- gap: 28px;
73
+ align-items: center;
74
+ gap: 10px;
75
+ padding: 4px 8px 18px;
88
76
  border-bottom: 1px solid var(--line);
89
- background: var(--paper);
77
+ margin-bottom: 14px;
90
78
  }
91
-
92
79
  .brand-mark {
93
- display: flex;
94
- align-items: center;
95
- flex-shrink: 0;
96
- padding-right: 28px;
97
- border-right: 1px solid var(--line);
98
- font-family: var(--serif);
99
- font-size: 22px;
100
- font-weight: 500;
101
- letter-spacing: -0.025em;
80
+ width: 26px; height: 26px;
81
+ display: grid; place-items: center;
82
+ border: 1px solid var(--line);
83
+ border-radius: var(--r-sm);
84
+ background: var(--bg);
102
85
  color: var(--ink);
103
86
  }
87
+ .brand-name { font-weight: 600; letter-spacing: -0.01em; font-size: 15px; }
104
88
 
105
- .tabs {
106
- position: relative;
89
+ .nav { display: flex; flex-direction: column; gap: 1px; }
90
+ .nav-item {
107
91
  display: flex;
108
- flex: 1;
109
- align-items: stretch;
110
- gap: 6px;
111
- min-width: 0;
112
- }
113
-
114
- .tab.overflow-hidden { display: none; }
115
-
116
- .tab-more {
117
- position: relative;
118
- display: inline-flex;
119
92
  align-items: center;
120
- justify-content: center;
121
- width: 32px;
122
- margin-left: auto;
123
- padding: 0;
124
- border: 0;
125
- background: transparent;
126
- color: var(--muted);
127
- cursor: pointer;
128
- border-radius: 5px;
129
- transition: color 200ms ease, background 200ms ease;
130
- }
131
-
132
- .tab-more:hover { color: var(--ink); background: var(--paper-soft); }
133
-
134
- .tab-more[aria-expanded="true"] {
135
- color: var(--ink);
136
- background: var(--paper-soft);
93
+ gap: 10px;
94
+ width: 100%;
95
+ padding: 7px 9px;
96
+ border-radius: var(--r-sm);
97
+ color: var(--ink-70);
98
+ text-align: left;
99
+ transition: background 90ms, color 90ms;
137
100
  }
138
-
139
- .tab-more.has-active { color: var(--ink); }
140
-
141
- .tab-more.has-active::after {
142
- content: '';
143
- position: absolute;
144
- left: 6px;
145
- right: 6px;
146
- bottom: -1px;
147
- height: 2px;
101
+ .nav-item:hover { background: var(--line-soft); color: var(--ink); }
102
+ .nav-item.is-active {
148
103
  background: var(--ink);
104
+ color: var(--bg);
149
105
  }
150
-
151
- .tab-more svg { display: block; }
152
-
153
- .tab-more.hidden { display: none; }
154
-
155
- .tab-dropdown {
156
- position: absolute;
157
- top: calc(100% + 6px);
158
- right: 0;
159
- min-width: 240px;
160
- max-width: min(320px, 90vw);
161
- max-height: min(420px, 70vh);
162
- overflow-y: auto;
163
- background: var(--paper);
106
+ .nav-item.is-active .nav-ico { color: var(--bg); }
107
+ .nav-ico { width: 16px; display: grid; place-items: center; color: var(--ink-50); }
108
+ .nav-item-count {
109
+ display: grid;
110
+ grid-template-columns: 16px minmax(0, 1fr) auto;
111
+ }
112
+ .nav-label {
113
+ overflow: hidden;
114
+ text-overflow: ellipsis;
115
+ white-space: nowrap;
116
+ }
117
+ .nav-count {
118
+ min-width: 22px;
119
+ height: 18px;
120
+ display: inline-grid;
121
+ place-items: center;
122
+ padding: 0 6px;
164
123
  border: 1px solid var(--line);
165
- border-radius: 10px;
166
- padding: 5px;
167
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.02), 0 8px 28px rgba(40, 30, 10, 0.08);
168
- z-index: 50;
169
- display: none;
124
+ border-radius: 999px;
125
+ background: var(--bg);
126
+ color: var(--ink-50);
127
+ font-size: 10.5px;
128
+ line-height: 1;
170
129
  }
171
-
172
- .tab-dropdown[data-open="true"] {
173
- display: block;
174
- animation: dropdown-in 180ms cubic-bezier(0.16, 1, 0.3, 1);
130
+ .nav-item.is-active .nav-count {
131
+ color: var(--bg);
132
+ border-color: color-mix(in oklch, var(--bg) 32%, transparent);
133
+ background: color-mix(in oklch, var(--bg) 14%, transparent);
175
134
  }
176
135
 
177
- @keyframes dropdown-in {
178
- from { opacity: 0; transform: translateY(-4px); }
179
- to { opacity: 1; transform: translateY(0); }
136
+ .nav-section {
137
+ font-size: 11px;
138
+ text-transform: uppercase;
139
+ letter-spacing: 0.08em;
140
+ color: var(--ink-40);
141
+ padding: 22px 9px 6px;
142
+ font-weight: 500;
180
143
  }
181
144
 
182
- .dropdown-item {
183
- display: flex;
145
+ .sidebar-foot { margin-top: auto; padding-top: 16px; border-top: 1px solid var(--line); }
146
+
147
+ .project-select-v3 {
148
+ display: grid;
149
+ grid-template-columns: 26px minmax(0, 1fr);
150
+ gap: 8px;
184
151
  align-items: center;
185
- justify-content: space-between;
186
- gap: 16px;
152
+ padding: 2px 0 4px;
153
+ }
154
+ .project-select-mark {
155
+ width: 26px;
156
+ height: 26px;
157
+ display: grid;
158
+ place-items: center;
159
+ border: 1px solid var(--line);
160
+ border-radius: var(--r-sm);
161
+ background: var(--bg);
162
+ color: var(--ink-50);
163
+ }
164
+ .project-select-control {
187
165
  width: 100%;
188
- text-align: left;
189
- padding: 9px 11px;
166
+ min-width: 0;
167
+ appearance: none;
190
168
  border: 0;
191
- background: transparent;
192
- color: var(--text);
169
+ border-bottom: 1px dashed var(--ink-25);
170
+ border-radius: 0;
171
+ background:
172
+ linear-gradient(45deg, transparent 50%, var(--ink-50) 50%) calc(100% - 11px) 14px / 5px 5px no-repeat,
173
+ linear-gradient(135deg, var(--ink-50) 50%, transparent 50%) calc(100% - 6px) 14px / 5px 5px no-repeat,
174
+ transparent;
175
+ color: var(--ink);
176
+ font: 600 13.5px/1.25 var(--font-sans);
177
+ padding: 7px 24px 7px 0;
193
178
  cursor: pointer;
194
- border-radius: 6px;
179
+ text-overflow: ellipsis;
180
+ }
181
+ .project-select-control:hover { border-bottom-color: var(--ink); }
182
+ .project-select-control:focus-visible {
183
+ outline: 2px solid var(--accent);
184
+ outline-offset: 2px;
185
+ border-bottom-color: transparent;
186
+ }
187
+
188
+ /* ---------- Topbar ---------- */
189
+ .main { min-width: 0; display: flex; flex-direction: column; }
190
+ .topbar {
191
+ position: sticky; top: 0; z-index: 5;
192
+ display: grid;
193
+ grid-template-columns: minmax(0, 1fr) auto auto;
194
+ align-items: center;
195
+ gap: 24px;
196
+ padding: 14px 32px;
197
+ background: color-mix(in oklab, var(--bg) 90%, transparent);
198
+ backdrop-filter: blur(8px);
199
+ border-bottom: 1px solid var(--line);
200
+ }
201
+ .tb-project { display: flex; align-items: center; gap: 10px; min-width: 0; }
202
+ .tb-title { font-weight: 600; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
203
+ .tb-meta { display: flex; align-items: center; gap: 12px; color: var(--ink-50); font-size: 12.5px; }
204
+ .tb-meta strong { color: var(--ink); font-weight: 500; }
205
+ .tb-sep { width: 3px; height: 3px; background: var(--ink-25); border-radius: 50%; }
206
+ .tb-readonly {
207
+ display: inline-flex; align-items: center; gap: 6px;
208
+ padding: 3px 8px;
209
+ border: 1px solid var(--line);
210
+ border-radius: 999px;
211
+ font-size: 11.5px;
212
+ color: var(--ink-50);
213
+ background: var(--bg);
214
+ }
215
+ .tb-actions { display: flex; gap: 8px; }
216
+ .btn {
217
+ display: inline-flex; align-items: center; gap: 6px;
218
+ padding: 6px 11px;
219
+ border: 1px solid var(--line);
220
+ border-radius: var(--r-sm);
221
+ background: var(--bg);
195
222
  font-size: 13px;
196
- font-weight: 500;
197
- white-space: nowrap;
198
- transition: background 150ms ease, color 150ms ease;
223
+ color: var(--ink-70);
224
+ transition: background 90ms, border-color 90ms, color 90ms;
225
+ }
226
+ .btn:hover { background: var(--line-soft); color: var(--ink); border-color: var(--ink-25); }
227
+ .btn:disabled {
228
+ cursor: default;
229
+ color: var(--ink-40);
230
+ background: var(--line-soft);
231
+ border-color: var(--line);
232
+ }
233
+ .btn-primary {
234
+ background: var(--ink); color: var(--bg); border-color: var(--ink);
199
235
  }
236
+ .btn-primary:hover { background: oklch(0.13 0.008 80); color: var(--bg); }
200
237
 
201
- .dropdown-item:hover { background: var(--paper-soft); color: var(--ink); }
238
+ /* ---------- Page ---------- */
239
+ .content { padding: 36px 48px 64px; max-width: 1320px; width: 100%; align-self: center; }
240
+ .page { display: flex; flex-direction: column; gap: 36px; }
241
+ .page-title { font-size: 26px; font-weight: 600; letter-spacing: -0.018em; margin: 0; }
202
242
 
203
- .dropdown-item.active {
204
- background: var(--paper-soft);
205
- color: var(--ink);
206
- font-weight: 600;
243
+ .overview-v1 {
244
+ gap: 35px;
207
245
  }
208
-
209
- .dropdown-item .count {
210
- font-family: var(--mono);
211
- font-size: 10.5px;
212
- color: var(--faint);
213
- font-weight: 400;
246
+ .overview-v1-head {
247
+ display: grid;
248
+ gap: 18px;
214
249
  }
215
-
216
- .dropdown-item:focus-visible {
217
- outline: 2px solid var(--blue-text);
218
- outline-offset: -2px;
250
+ .overview-signal-strip {
251
+ display: flex;
252
+ flex-wrap: wrap;
253
+ gap: 10px;
219
254
  }
220
-
221
- .tab {
222
- position: relative;
255
+ .signal-pill {
223
256
  display: inline-flex;
224
257
  align-items: center;
225
- gap: 9px;
226
- padding: 0 10px;
227
- border: 0;
228
- background: transparent;
229
- color: var(--muted);
230
- cursor: pointer;
231
- font-size: 13px;
232
- font-weight: 600;
233
- white-space: nowrap;
234
- transition: color 200ms ease;
258
+ gap: 7px;
259
+ padding: 8px 10px;
260
+ border: 1px solid var(--line);
261
+ border-radius: 999px;
262
+ background: var(--surface);
263
+ color: var(--ink-70);
235
264
  }
236
-
237
- .tab:hover { color: var(--ink); }
238
- .tab.active { color: var(--ink); }
239
-
240
- .tab.active::after {
241
- content: '';
242
- position: absolute;
243
- left: 6px;
244
- right: 6px;
245
- bottom: -1px;
246
- height: 2px;
247
- background: var(--ink);
265
+ .signal-pill-warn {
266
+ border-color: color-mix(in oklch, var(--warn) 35%, var(--line));
267
+ background: var(--warn-soft);
268
+ color: var(--ink);
248
269
  }
249
-
250
- .tab .count {
251
- font-family: var(--mono);
252
- font-size: 10.5px;
253
- font-weight: 400;
254
- color: var(--faint);
255
- letter-spacing: 0;
270
+ .signal-color-filled .signal-pill {
271
+ border-color: var(--line);
272
+ background: var(--surface);
273
+ color: var(--ink-70);
256
274
  }
257
-
258
- .tab.active .count { color: var(--muted); }
259
-
260
- .outline-toggle {
261
- align-self: center;
262
- flex-shrink: 0;
263
- border: 1px solid var(--line);
264
- border-radius: 6px;
265
- background: var(--paper);
266
- color: var(--muted);
267
- cursor: pointer;
268
- font-size: 12px;
275
+ .signal-color-filled .signal-pill-warning.has-count,
276
+ .signal-color-filled .signal-pill-blocker.has-count {
277
+ border-color: color-mix(in oklch, var(--warn) 35%, var(--line));
278
+ background: var(--warn-soft);
279
+ color: var(--ink);
280
+ }
281
+ .signal-color-filled .signal-pill-warning.has-count .mono,
282
+ .signal-color-filled .signal-pill-blocker.has-count .mono {
283
+ color: var(--warn);
269
284
  font-weight: 600;
270
- padding: 7px 11px;
271
- transition: color 200ms ease, border-color 200ms ease, background 200ms ease;
272
285
  }
273
-
274
- .outline-toggle:hover {
275
- color: var(--ink);
276
- border-color: #d9d5ce;
277
- background: var(--paper-soft);
286
+ .signal-color-filled .signal-pill-validation .mono,
287
+ .signal-color-filled .signal-pill-progress .mono {
288
+ color: var(--ink-70);
289
+ font-weight: 500;
278
290
  }
279
-
280
- .shell {
291
+ .overview-priority {
292
+ display: block;
293
+ }
294
+ .overview-delivery {
281
295
  display: grid;
282
- grid-template-columns: 380px minmax(0, 1fr);
283
- height: calc(100vh - 98px);
284
- background: var(--paper);
296
+ grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
297
+ gap: 42px;
298
+ align-items: start;
285
299
  }
286
-
287
- .list, .reader, .outline {
300
+ .delivery-panel {
288
301
  min-width: 0;
289
- border-right: 1px solid var(--line);
290
- background: var(--paper);
291
302
  }
292
-
293
- .filter-label, .outline-label, .eyebrow {
294
- color: var(--muted);
295
- font-size: 10px;
296
- font-weight: 750;
297
- text-transform: uppercase;
298
- letter-spacing: 0.08em;
303
+ .delivery-list {
304
+ display: flex;
305
+ flex-direction: column;
299
306
  }
300
-
301
- .count {
302
- color: var(--muted);
303
- font: 11px/1 var(--mono);
307
+ .delivery-row,
308
+ .delivery-task-row {
309
+ display: grid;
310
+ grid-template-columns: minmax(0, 1fr) max-content;
311
+ gap: 16px;
312
+ align-items: center;
313
+ padding: 12px 0;
314
+ border-bottom: 1px solid var(--line-soft);
315
+ text-align: left;
304
316
  }
305
-
306
- .pill {
317
+ .delivery-task-row {
318
+ grid-template-columns: minmax(0, 1.4fr) minmax(110px, 0.8fr) max-content;
319
+ }
320
+ .delivery-row:last-child,
321
+ .delivery-task-row:last-child {
322
+ border-bottom: none;
323
+ }
324
+ .delivery-row:hover .delivery-title {
325
+ border-bottom-color: var(--ink);
326
+ }
327
+ .delivery-row-main,
328
+ .delivery-row-right {
329
+ min-width: 0;
307
330
  display: inline-flex;
308
331
  align-items: center;
309
- justify-content: center;
310
- flex: 0 0 auto;
311
- align-self: flex-start;
312
- min-height: 22px;
313
- max-height: 22px;
314
- border: 1px solid transparent;
315
- background: #f1f0ed;
316
- border-radius: 9999px;
317
- padding: 0 10px;
318
- color: var(--muted);
319
- font-family: var(--mono);
320
- font-size: 10px;
321
- font-weight: 600;
322
- line-height: 1;
323
- letter-spacing: 0.08em;
324
- text-transform: uppercase;
325
- white-space: nowrap;
332
+ gap: 10px;
326
333
  }
327
-
328
- .pill.active, .pill.approved, .pill.complete, .pill.done {
329
- color: var(--green-text);
330
- background: var(--green-bg);
334
+ .delivery-row-main {
335
+ flex-direction: column;
336
+ align-items: flex-start;
337
+ gap: 3px;
331
338
  }
332
-
333
- .pill.in-progress, .pill.planned, .pill.ready {
334
- color: var(--yellow-text);
335
- background: var(--yellow-bg);
339
+ .delivery-title {
340
+ max-width: 100%;
341
+ overflow: hidden;
342
+ text-overflow: ellipsis;
343
+ white-space: nowrap;
344
+ font-weight: 500;
345
+ border-bottom: 1px dashed transparent;
346
+ line-height: 1.25;
336
347
  }
337
-
338
- .pill.blocked {
339
- color: var(--red-text);
340
- background: var(--red-bg);
348
+ .delivery-meta,
349
+ .delivery-count {
350
+ color: var(--ink-50);
351
+ font-size: 12px;
341
352
  }
342
-
343
- .list {
344
- padding: 20px;
345
- overflow: auto;
346
- background: #fcfbf9;
353
+ .delivery-more {
354
+ align-self: flex-start;
355
+ margin-top: 8px;
356
+ color: var(--ink-50);
357
+ font-size: 12.5px;
358
+ border-bottom: 1px dashed var(--ink-25);
347
359
  }
348
-
349
- .search {
350
- width: 100%;
351
- border: 1px solid var(--line);
352
- border-radius: 6px;
353
- padding: 11px 12px;
354
- background: var(--paper);
360
+ .delivery-more:hover {
355
361
  color: var(--ink);
356
- outline: none;
357
- transition: border-color 160ms ease, background 160ms ease;
362
+ border-bottom-color: var(--ink);
358
363
  }
359
-
360
- .search::placeholder { color: var(--faint); }
361
- .search:focus {
362
- border-color: #cfcac2;
363
- background: #fff;
364
+ .preview-list {
365
+ display: grid;
366
+ gap: 10px;
367
+ padding-top: 15px;
364
368
  }
365
-
366
- .filters {
367
- display: flex;
369
+ .preview-row {
370
+ display: grid;
371
+ grid-template-columns: max-content minmax(0, 1.4fr) minmax(0, 1fr);
372
+ gap: 14px;
373
+ align-items: center;
374
+ padding: 11px 0;
375
+ border-bottom: 1px solid var(--line-soft);
376
+ }
377
+ .preview-row-warn {
378
+ border-bottom-color: color-mix(in oklch, var(--warn) 20%, var(--line-soft));
379
+ }
380
+ .preview-row-progress {
381
+ grid-template-columns: minmax(116px, max-content) minmax(160px, 0.55fr) minmax(0, 1.45fr);
368
382
  gap: 8px;
369
- flex-wrap: wrap;
370
- margin: 16px 0 18px;
383
+ align-items: start;
384
+ padding: 6px 0 7px;
371
385
  }
372
-
373
- .filter-group {
374
- display: flex;
375
- gap: 7px;
376
- flex-wrap: wrap;
377
- align-items: center;
378
- width: 100%;
386
+ .preview-meta-time {
387
+ padding-top: 1px;
388
+ color: var(--ink-50);
389
+ white-space: nowrap;
379
390
  }
380
-
381
- .filter-label { margin-right: 4px; }
382
- .filter-note { color: var(--muted); font-size: 12px; width: 100%; padding: 4px 2px; }
383
-
384
- .sort-group {
385
- align-items: center;
391
+ .preview-row-progress .link {
392
+ justify-self: start;
393
+ text-align: left;
394
+ line-height: 1.25;
386
395
  }
387
-
388
- .sort-field {
389
- appearance: none;
390
- -webkit-appearance: none;
391
- -moz-appearance: none;
392
- height: 28px;
393
- padding: 0 26px 0 10px;
394
- border: 1px solid var(--line);
395
- border-radius: 6px;
396
- background-color: var(--paper);
397
- background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23787774' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='4,6 8,10 12,6'/></svg>");
398
- background-repeat: no-repeat;
399
- background-position: right 8px center;
400
- background-size: 12px;
401
- color: var(--ink);
402
- font-family: inherit;
403
- font-size: 12px;
404
- font-weight: 500;
405
- cursor: pointer;
406
- outline: none;
407
- transition: border-color 150ms ease, background-color 150ms ease;
396
+ .preview-copy {
397
+ color: var(--ink-70);
398
+ line-height: 1.45;
408
399
  }
409
-
410
- .sort-field:hover { background-color: var(--paper-soft); border-color: #d9d5ce; }
411
- .sort-field:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
412
-
413
- .sort-dir {
414
- display: inline-flex;
400
+ .preview-list-validation {
401
+ gap: 10px;
402
+ padding-top: 18px;
403
+ }
404
+ .validation-row {
405
+ grid-template-columns: max-content max-content minmax(0, 1fr);
406
+ gap: 17px;
415
407
  align-items: center;
416
- justify-content: center;
417
- width: 28px;
418
- height: 28px;
419
- padding: 0;
420
- border: 1px solid var(--line);
421
- border-radius: 6px;
422
- background: var(--paper);
423
- color: var(--muted);
424
- cursor: pointer;
425
- transition: background 150ms ease, color 150ms ease, border-color 150ms ease;
408
+ padding: 12px 0;
426
409
  }
427
-
428
- .sort-dir:hover { background: var(--paper-soft); border-color: #d9d5ce; color: var(--ink); }
429
- .sort-dir:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
430
-
431
- .workstream-scope, .filter {
432
- border: 1px solid var(--line);
433
- background: var(--paper);
434
- border-radius: 6px;
435
- padding: 6px 9px;
436
- color: var(--muted);
437
- cursor: pointer;
438
- font-size: 12px;
410
+ .validation-row .link {
411
+ justify-self: start;
412
+ max-width: 34ch;
413
+ text-align: left;
439
414
  }
440
-
441
- .workstream-scope, .filter.active {
442
- border-color: transparent;
443
- color: var(--blue-text);
444
- background: var(--blue-bg);
415
+ .source-nav-v2 {
416
+ gap: 1px;
445
417
  }
446
-
447
- .doc {
448
- border: 1px solid var(--line);
449
- border-radius: 12px;
450
- padding: 18px 18px 16px;
451
- margin: 10px 0;
452
- cursor: pointer;
453
- background: var(--paper);
454
- box-shadow: var(--shadow-card-rest);
455
- transition: background 200ms ease, border-color 200ms ease, transform 200ms cubic-bezier(0.16, 1, 0.3, 1), box-shadow 200ms ease;
418
+ .source-nav-v2 .nav-break {
419
+ margin-top: 11px;
420
+ padding: 11px 10px 4px;
421
+ border-top: 1px solid var(--line-soft);
422
+ color: var(--ink-40);
423
+ font: 500 10px/1 var(--font-mono);
424
+ letter-spacing: 0.08em;
425
+ text-transform: uppercase;
456
426
  }
457
427
 
458
- .doc:hover, .doc.active {
459
- border-color: #dedbd5;
460
- background: #fff;
461
- box-shadow: var(--shadow-card-hover);
428
+ .back {
429
+ display: inline-flex; align-items: center; gap: 6px;
430
+ color: var(--ink-50); font-size: 13px;
431
+ margin-bottom: -14px;
462
432
  }
463
-
464
- .doc:hover { transform: translateY(-1px); }
465
- .doc:active { transform: scale(0.995); }
466
-
467
- .doc-title {
468
- color: var(--ink);
469
- font-weight: 760;
470
- letter-spacing: -0.01em;
471
- display: flex;
472
- justify-content: space-between;
473
- align-items: flex-start;
474
- gap: 12px;
433
+ .back:hover { color: var(--ink); }
434
+ .ws-eyebrow {
435
+ font-size: 11px; text-transform: uppercase; letter-spacing: 0.1em;
436
+ color: var(--ink-40); margin-bottom: -22px;
475
437
  }
476
438
 
477
- .doc-title span:first-child {
439
+ /* ---------- Summary strip ---------- */
440
+ .summary {
441
+ display: grid;
442
+ grid-template-columns: repeat(4, 1fr);
443
+ border-top: 1px solid var(--line);
444
+ border-bottom: 1px solid var(--line);
445
+ }
446
+ .summary > .field {
447
+ padding: 16px 22px;
448
+ border-right: 1px solid var(--line);
449
+ }
450
+ .summary > .field:last-child { border-right: none; }
451
+ .summary > .field:first-child { padding-left: 0; }
452
+ .summary-tight > .field { padding: 12px 22px; }
453
+ .summary-tight > .field:first-child { padding-left: 0; }
454
+ .doc-reader-page {
455
+ display: grid;
456
+ grid-template-columns: minmax(0, 1fr) minmax(260px, 320px);
457
+ gap: 44px;
458
+ align-items: start;
459
+ }
460
+ .doc-reader-main {
478
461
  min-width: 0;
479
- overflow-wrap: anywhere;
480
462
  }
481
-
482
- .doc-path {
483
- color: var(--faint);
484
- font: 11px/1.4 var(--mono);
485
- margin-top: 6px;
463
+ .doc-reader-main .md-body {
464
+ margin-top: 34px;
465
+ }
466
+ .content-reader-head-c .doc-reader-main .back {
467
+ margin-bottom: 22px;
468
+ }
469
+ .content-reader-head-c .doc-reader-main .ws-eyebrow {
470
+ margin-bottom: 6px;
471
+ }
472
+ .content-reader-head-c .doc-reader-main .page-title {
473
+ max-width: 17ch;
474
+ }
475
+ .doc-meta-panel {
476
+ position: sticky;
477
+ top: 86px;
478
+ border: 1px solid var(--line);
479
+ border-radius: var(--r);
480
+ background: var(--surface);
486
481
  overflow: hidden;
487
- text-overflow: ellipsis;
488
- white-space: nowrap;
489
482
  }
490
-
491
- .doc-snippet {
492
- color: var(--muted);
483
+ .doc-side {
484
+ min-width: 0;
485
+ position: sticky;
486
+ top: 86px;
487
+ display: flex;
488
+ flex-direction: column;
489
+ gap: 20px;
490
+ }
491
+ .doc-side .doc-meta-panel {
492
+ position: static;
493
+ top: auto;
494
+ }
495
+ .doc-meta-title {
496
+ padding: 12px 14px;
497
+ border-bottom: 1px solid var(--line);
493
498
  font-size: 13px;
494
- margin-top: 10px;
499
+ font-weight: 600;
495
500
  }
496
-
497
- .reader {
501
+ .doc-meta-list {
502
+ max-height: calc(100vh - 150px);
498
503
  overflow: auto;
499
- background: var(--paper);
500
- }
501
-
502
- .reader-inner {
503
- max-width: 940px;
504
- margin: 0 auto;
505
- padding: 64px 80px 112px;
506
504
  }
507
-
508
- .reader-head {
509
- border-bottom: 1px solid var(--line);
510
- padding-bottom: 32px;
511
- margin-bottom: 44px;
505
+ .doc-meta-list dd {
506
+ overflow-wrap: anywhere;
512
507
  }
513
508
 
514
- .reader h1 {
515
- color: var(--ink);
516
- font-family: var(--serif);
517
- font-size: clamp(34px, 3.4vw, 48px);
509
+ .field-label {
510
+ font-size: 11px;
511
+ text-transform: uppercase;
512
+ letter-spacing: 0.08em;
513
+ color: var(--ink-40);
518
514
  font-weight: 500;
519
- line-height: 1.06;
520
- letter-spacing: -0.025em;
521
- margin: 0 0 22px;
515
+ margin-bottom: 6px;
522
516
  }
517
+ .field-value { font-size: 14px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
523
518
 
524
- .reader-top {
525
- display: block;
519
+ /* health */
520
+ .health { display: flex; align-items: center; gap: 10px; }
521
+ .health-bar {
522
+ position: relative;
523
+ width: 80px; height: 6px;
524
+ border-radius: 999px;
525
+ background: var(--line);
526
+ overflow: hidden;
526
527
  }
528
+ .health-fill { position: absolute; inset: 0; right: auto; background: var(--warn); border-radius: inherit; }
529
+ .health-label { font-size: 12.5px; color: var(--ink-70); }
527
530
 
528
- .reader-actions {
529
- display: flex;
530
- gap: 8px;
531
- flex-wrap: wrap;
532
- justify-content: flex-start;
533
- margin-top: 14px;
534
- }
531
+ /* ---------- Block ---------- */
532
+ .block { display: flex; flex-direction: column; }
535
533
 
536
- /* Shadcn-style action buttons. .action = outline variant, .action.primary = default variant. */
537
- .action {
538
- display: inline-flex;
534
+ .section-head {
535
+ display: flex; align-items: center; justify-content: space-between;
536
+ padding: 14px 0 12px;
537
+ border-bottom: 1px solid var(--line);
538
+ }
539
+ .section-head.is-collapsible { cursor: pointer; user-select: none; }
540
+ .section-head.is-collapsible:hover .caret { color: var(--ink); }
541
+ .section-title { display: flex; align-items: baseline; gap: 10px; font-weight: 600; font-size: 16px; letter-spacing: -0.01em; }
542
+ .section-title .count { color: var(--ink-40); font-weight: 500; font-size: 13px; }
543
+ .section-right { display: flex; align-items: center; gap: 14px; color: var(--ink-50); }
544
+ .caret { display: grid; place-items: center; color: var(--ink-50); transition: color 90ms; }
545
+ .link-muted { display: inline-flex; align-items: center; gap: 4px; font-size: 12.5px; color: var(--ink-50); cursor: pointer; }
546
+ .link-muted:hover { color: var(--ink); }
547
+
548
+ /* ---------- Table ---------- */
549
+ .table { display: flex; flex-direction: column; }
550
+ .tr {
551
+ display: grid;
552
+ grid-template-columns: 2fr 1.1fr 1fr 0.9fr 1.5fr 1.2fr;
553
+ gap: 20px;
554
+ padding: 14px 0;
555
+ border-bottom: 1px solid var(--line-soft);
539
556
  align-items: center;
540
- justify-content: center;
541
- gap: 8px;
542
- height: 36px;
543
- padding: 0 16px;
544
- border: 1px solid var(--line);
545
- border-radius: 6px;
546
- background: var(--paper);
547
- color: var(--ink);
548
- cursor: pointer;
549
- font-family: inherit;
550
- font-size: 14px;
551
- font-weight: 500;
552
- letter-spacing: 0;
557
+ font-size: 13.5px;
558
+ }
559
+ .tr > div { min-width: 0; }
560
+ .table-3 .tr { grid-template-columns: 2.4fr 1fr 2fr; }
561
+ .table-4 .tr { grid-template-columns: 2.5fr 1.2fr 1fr 1.5fr; }
562
+ .table-list .tr { grid-template-columns: 2fr 1fr 1fr 1.5fr; }
563
+ .table-workspace .tr { grid-template-columns: 2.2fr 1.4fr 1.3fr 0.9fr; }
564
+ .table-workspace-warnings .tr { grid-template-columns: 0.8fr 1.4fr 2.2fr 1fr; }
565
+ .tr.th {
566
+ font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em;
567
+ color: var(--ink-40); font-weight: 500;
568
+ padding: 12px 0 10px;
569
+ border-bottom: 1px solid var(--line);
570
+ }
571
+ .tr:last-child { border-bottom: none; }
572
+ .td-primary { color: var(--ink); font-weight: 500; }
573
+ .td-muted { color: var(--ink-50); }
574
+ .td-muted-inline { color: var(--ink-50); margin-left: 6px; }
575
+
576
+ .link {
577
+ color: var(--ink); text-decoration: none;
578
+ border-bottom: 1px dashed var(--ink-25);
579
+ padding: 0; line-height: 1.2;
580
+ transition: border-color 90ms, color 90ms;
581
+ }
582
+ .link:hover { border-bottom-color: var(--ink); }
583
+ .table .link,
584
+ .preview-row .link,
585
+ .delivery-task-row .link,
586
+ .workspace-line .link {
587
+ display: inline-block;
588
+ max-width: 100%;
589
+ min-width: 0;
590
+ overflow: hidden;
591
+ text-overflow: ellipsis;
553
592
  white-space: nowrap;
554
- user-select: none;
555
- transition: background-color 150ms ease, border-color 150ms ease, color 150ms ease;
593
+ text-align: left;
594
+ vertical-align: bottom;
556
595
  }
557
-
558
- .action:hover {
559
- background: var(--paper-soft);
560
- border-color: #d9d5ce;
561
- color: var(--ink);
596
+ .table .td-primary .link,
597
+ .preview-row .link,
598
+ .delivery-task-row .link {
599
+ justify-self: start;
562
600
  }
563
601
 
564
- .action:focus-visible {
565
- outline: 2px solid var(--ink);
566
- outline-offset: 2px;
602
+ /* ---------- Workspace dashboard ---------- */
603
+ .project-grid {
604
+ display: grid;
605
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
606
+ gap: 14px;
607
+ padding-top: 16px;
567
608
  }
568
-
569
- .action:active { transform: translateY(0.5px); }
570
-
571
- .action.primary {
572
- background: var(--ink);
573
- border-color: var(--ink);
574
- color: #ffffff;
609
+ .project-card {
610
+ display: grid;
611
+ gap: 16px;
612
+ min-width: 0;
613
+ padding: 15px;
614
+ border: 1px solid var(--line);
615
+ border-radius: var(--r);
616
+ background: var(--surface);
617
+ text-align: left;
618
+ transition: border-color 90ms, background 90ms;
575
619
  }
576
-
577
- .action.primary:hover {
578
- background: #1f1f1f;
579
- border-color: #1f1f1f;
580
- color: #ffffff;
620
+ .project-card:hover {
621
+ border-color: var(--ink-25);
622
+ background: color-mix(in oklch, var(--surface) 72%, var(--bg));
623
+ }
624
+ .project-card-head {
625
+ display: flex;
626
+ align-items: flex-start;
627
+ justify-content: space-between;
628
+ gap: 12px;
629
+ min-width: 0;
630
+ }
631
+ .project-card-title {
632
+ min-width: 0;
633
+ font-weight: 600;
634
+ line-height: 1.25;
635
+ overflow: hidden;
636
+ text-overflow: ellipsis;
637
+ white-space: nowrap;
638
+ }
639
+ .project-card-dates,
640
+ .project-card-stats {
641
+ display: grid;
642
+ gap: 8px;
581
643
  }
582
-
583
- .action.primary:focus-visible {
584
- outline: 2px solid var(--ink);
585
- outline-offset: 2px;
644
+ .project-card-dates {
645
+ grid-template-columns: 1fr 1fr;
646
+ color: var(--ink-50);
647
+ font-size: 12px;
586
648
  }
587
-
588
- .action-icon {
589
- width: 16px;
590
- height: 16px;
591
- flex-shrink: 0;
649
+ .project-card-dates span span {
592
650
  display: block;
593
- pointer-events: none;
651
+ margin-bottom: 2px;
652
+ color: var(--ink-40);
653
+ font: 500 10px/1.2 var(--font-mono);
654
+ letter-spacing: 0.06em;
655
+ text-transform: uppercase;
594
656
  }
595
-
596
- /* Markdown logomark is a monochrome path; tone it down to read as a UI icon. */
597
- .action-icon-md { opacity: 0.78; }
598
- .action:hover .action-icon-md { opacity: 0.9; }
599
- .action.copied .action-icon-md { opacity: 0.9; }
600
-
601
- .action-label { line-height: 1; }
602
-
603
- .open-feedback {
604
- min-height: 18px;
605
- margin-top: 10px;
606
- color: var(--muted);
607
- font-size: 12px;
657
+ .project-card-stats {
658
+ grid-template-columns: repeat(4, minmax(0, 1fr));
659
+ padding-top: 12px;
660
+ border-top: 1px solid var(--line-soft);
661
+ color: var(--ink-50);
662
+ font-size: 11.5px;
608
663
  }
609
-
610
- .path-pill {
611
- max-width: min(100%, 420px);
612
- overflow: hidden;
613
- text-overflow: ellipsis;
664
+ .project-card-stats strong {
665
+ display: block;
666
+ color: var(--ink);
667
+ font-size: 15px;
668
+ font-weight: 600;
614
669
  }
615
670
 
616
- .eyebrow { margin-bottom: 12px; }
617
- .meta { display: flex; gap: 8px; flex-wrap: wrap; color: var(--muted); }
671
+ /* avatars */
672
+ .avatar {
673
+ display: inline-grid; place-items: center;
674
+ width: 22px; height: 22px;
675
+ border-radius: 50%;
676
+ background: var(--line);
677
+ color: var(--ink-70);
678
+ font-size: 10.5px; font-weight: 600;
679
+ letter-spacing: 0;
680
+ }
618
681
 
619
- .properties {
620
- display: grid;
621
- grid-template-columns: 150px minmax(0, 1fr);
622
- gap: 8px 16px;
623
- margin-top: 18px;
624
- padding: 16px;
682
+ /* ---------- Chips ---------- */
683
+ .chip {
684
+ display: inline-flex; align-items: center; gap: 6px;
685
+ padding: 3px 9px 3px 7px;
625
686
  border: 1px solid var(--line);
626
- border-radius: 10px;
627
- background: var(--paper-soft);
687
+ border-radius: 999px;
688
+ background: var(--surface);
689
+ font-size: 12px;
690
+ color: var(--ink-70);
691
+ white-space: nowrap;
692
+ font-weight: 500;
628
693
  }
629
-
630
- .prop-key {
631
- color: var(--muted);
632
- font: 11px/1.4 var(--mono);
633
- padding-top: 3px;
694
+ .chip-dot {
695
+ width: 6px; height: 6px;
696
+ border-radius: 50%;
697
+ background: var(--ink-40);
698
+ flex: none;
699
+ }
700
+ .chip-ok { background: var(--ok-soft); border-color: color-mix(in oklab, var(--ok) 30%, var(--line)); color: oklch(0.38 0.10 155); }
701
+ .chip-ok .chip-dot { background: var(--ok); }
702
+ .chip-warn { background: var(--warn-soft); border-color: color-mix(in oklab, var(--warn) 30%, var(--line)); color: oklch(0.40 0.13 55); }
703
+ .chip-warn .chip-dot { background: var(--warn); }
704
+ .chip-low { background: var(--low-soft); border-color: var(--line); color: var(--ink-70); }
705
+ .chip-low .chip-dot { background: var(--low); }
706
+
707
+ .dot { display: inline-block; width: 6px; height: 6px; border-radius: 50%; margin-right: 8px; vertical-align: middle; transform: translateY(-1px); }
708
+ .dot-warn { background: var(--warn); }
709
+
710
+ /* ---------- Timeline ---------- */
711
+ .timeline { padding: 8px 0 4px; }
712
+ .tl-row {
713
+ display: grid;
714
+ grid-template-columns: 64px 24px 1fr;
715
+ align-items: flex-start;
716
+ padding: 10px 0;
717
+ position: relative;
634
718
  }
635
-
636
- .prop-value {
719
+ .tl-date { color: var(--ink-50); padding-top: 1px; }
720
+ .tl-bullet {
721
+ position: relative;
722
+ display: grid; place-items: center;
723
+ height: 18px;
724
+ }
725
+ .tl-bullet::before {
726
+ content: ""; position: absolute; top: 0; bottom: -32px;
727
+ left: 50%; width: 1px; background: var(--line);
728
+ }
729
+ .tl-row:last-child .tl-bullet::before { display: none; }
730
+ .tl-bullet > span {
731
+ width: 7px; height: 7px; border-radius: 50%;
732
+ background: var(--bg); border: 1.5px solid var(--ink-50);
733
+ position: relative; z-index: 1;
734
+ }
735
+ .tl-body { padding-bottom: 4px; }
736
+ .timeline-workspace { margin-top: 2px; }
737
+ .workspace-line {
637
738
  display: flex;
638
- align-items: flex-start;
739
+ align-items: baseline;
639
740
  gap: 8px;
640
- min-width: 0;
641
- }
642
-
643
- .prop-value .prop-text {
644
- flex: 1;
645
- min-width: 0;
646
- overflow-wrap: anywhere;
741
+ flex-wrap: wrap;
647
742
  }
648
-
649
- .copy-btn {
650
- display: inline-flex;
743
+ .pagination {
744
+ display: flex;
651
745
  align-items: center;
652
- justify-content: center;
653
- width: 24px;
654
- height: 24px;
655
- padding: 0;
656
- border: 1px solid var(--line);
657
- border-radius: 5px;
658
- background: var(--paper);
659
- color: var(--muted);
660
- cursor: pointer;
661
- flex-shrink: 0;
662
- transition: color 200ms ease, border-color 200ms ease, background 200ms ease;
746
+ gap: 12px;
747
+ padding-top: 16px;
748
+ border-top: 1px solid var(--line-soft);
749
+ color: var(--ink-50);
663
750
  }
664
751
 
665
- .copy-btn:hover {
752
+ /* ---------- Project outline ---------- */
753
+ .outline-list {
754
+ display: flex;
755
+ flex-direction: column;
756
+ padding-top: 8px;
757
+ }
758
+ .outline-row {
759
+ border-bottom: 1px solid var(--line-soft);
760
+ padding: 12px 0;
761
+ }
762
+ .outline-row:last-child { border-bottom: none; }
763
+ .outline-main {
764
+ width: 100%;
765
+ display: flex;
766
+ align-items: center;
767
+ justify-content: space-between;
768
+ gap: 20px;
769
+ padding: 8px 0;
770
+ text-align: left;
666
771
  color: var(--ink);
667
- border-color: #d9d5ce;
668
- background: var(--paper-soft);
669
772
  }
670
-
671
- .copy-btn:focus-visible {
672
- outline: 2px solid var(--blue-text);
673
- outline-offset: 1px;
773
+ .outline-main:hover .outline-title,
774
+ .outline-subitem:hover span:nth-child(2) {
775
+ border-bottom-color: var(--ink);
674
776
  }
675
-
676
- .copy-btn.copied {
677
- color: var(--green-text);
678
- border-color: var(--green-bg);
679
- background: var(--green-bg);
777
+ .outline-title {
778
+ font-size: 15px;
779
+ font-weight: 500;
780
+ line-height: 1.35;
781
+ border-bottom: 1px dashed transparent;
680
782
  }
681
-
682
- .copy-btn svg { display: block; }
683
-
684
- .copy-btn.pre-copy {
685
- position: absolute;
686
- top: 8px;
687
- right: 8px;
688
- opacity: 0;
689
- transition: opacity 200ms ease, color 200ms ease, border-color 200ms ease, background 200ms ease;
783
+ .outline-sublist {
784
+ display: flex;
785
+ flex-direction: column;
786
+ gap: 2px;
787
+ margin: 4px 0 0 16px;
788
+ padding-left: 14px;
789
+ border-left: 1px solid var(--line);
690
790
  }
691
-
692
- .markdown pre:hover .copy-btn.pre-copy,
693
- .copy-btn.pre-copy:focus-visible,
694
- .copy-btn.pre-copy.copied {
695
- opacity: 1;
791
+ .outline-subitem {
792
+ display: grid;
793
+ grid-template-columns: 58px minmax(0, 1fr) max-content;
794
+ gap: 12px;
795
+ align-items: center;
796
+ padding: 7px 0;
797
+ text-align: left;
798
+ color: var(--ink);
799
+ font-size: 13px;
696
800
  }
697
-
698
- .action.copied {
699
- color: var(--green-text);
700
- border-color: var(--green-bg);
701
- background: var(--green-bg);
801
+ .outline-subitem .mono {
802
+ color: var(--ink-50);
803
+ font-size: 11.5px;
804
+ }
805
+ .outline-subitem span:nth-child(2) {
806
+ min-width: 0;
807
+ border-bottom: 1px dashed transparent;
808
+ line-height: 1.35;
702
809
  }
703
810
 
704
- .action.primary.copied {
705
- color: var(--green-text);
706
- border-color: var(--green-bg);
707
- background: var(--green-bg);
811
+ /* ---------- Workstream detail ---------- */
812
+ .two-col {
813
+ display: grid;
814
+ grid-template-columns: minmax(0, 1fr) 320px;
815
+ gap: 48px;
816
+ align-items: start;
708
817
  }
709
818
 
710
- .visually-hidden {
711
- position: absolute;
712
- width: 1px;
713
- height: 1px;
714
- margin: -1px;
715
- padding: 0;
819
+ .ws-block { padding: 18px 0; border-bottom: 1px solid var(--line); }
820
+ .ws-block:first-child { padding-top: 8px; }
821
+ .ws-block:last-child { border-bottom: none; }
822
+ .ws-h {
823
+ font-size: 13px;
824
+ font-weight: 600;
825
+ letter-spacing: 0.04em;
826
+ text-transform: uppercase;
827
+ color: var(--ink-50);
828
+ margin: 0 0 10px;
829
+ }
830
+ .ws-body p { margin: 0; color: var(--ink); max-width: 70ch; }
831
+ .ws-body { font-size: 14px; line-height: 1.55; }
832
+
833
+ .bullets { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 6px; }
834
+ .bullets li { padding-left: 18px; position: relative; max-width: 72ch; }
835
+ .bullets li::before {
836
+ content: ""; position: absolute; left: 4px; top: 9px;
837
+ width: 4px; height: 1px; background: var(--ink-40);
838
+ }
839
+
840
+ .checklist { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 8px; }
841
+ .checklist li { display: flex; align-items: center; gap: 10px; min-width: 0; }
842
+ .checklist .cb {
843
+ width: 14px; height: 14px;
844
+ border: 1px solid var(--ink-25);
845
+ border-radius: 3px;
846
+ display: grid; place-items: center;
847
+ flex: none;
848
+ color: transparent;
849
+ }
850
+ .checklist li.done .cb {
851
+ background: var(--ink); border-color: var(--ink); color: var(--bg);
852
+ }
853
+ .checklist li.done { color: var(--ink-50); text-decoration: line-through; text-decoration-thickness: 1px; }
854
+ .checklist .link {
855
+ flex: 1 1 auto;
856
+ min-width: 0;
857
+ max-width: 100%;
716
858
  overflow: hidden;
717
- clip: rect(0, 0, 0, 0);
859
+ text-overflow: ellipsis;
718
860
  white-space: nowrap;
719
- border: 0;
720
861
  }
721
-
722
- .markdown {
723
- max-width: 780px;
724
- font-size: 16px;
725
- line-height: 1.72;
726
- color: var(--text);
862
+ .checklist-meta {
863
+ margin-left: auto;
864
+ display: inline-flex;
865
+ align-items: center;
866
+ gap: 8px;
867
+ flex: none;
868
+ color: var(--ink-50);
727
869
  }
728
870
 
729
- .markdown h1, .markdown h2, .markdown h3 {
730
- color: var(--ink);
731
- line-height: 1.1;
732
- letter-spacing: -0.018em;
733
- margin: 1.7em 0 0.55em;
871
+ .decisions { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; }
872
+ .decisions li {
873
+ display: flex; align-items: baseline; justify-content: space-between;
874
+ gap: 24px; padding: 8px 0; border-top: 1px dashed var(--line);
734
875
  }
876
+ .decisions li:first-child { border-top: none; padding-top: 0; }
735
877
 
736
- .markdown h1 {
737
- font-family: var(--serif);
738
- font-size: 32px;
878
+ /* ---------- Side column ---------- */
879
+ .col-side { display: flex; flex-direction: column; gap: 20px; position: sticky; top: 80px; }
880
+ .side-block {
881
+ border: 1px solid var(--line);
882
+ border-radius: var(--r);
883
+ background: var(--surface);
884
+ overflow: hidden;
885
+ }
886
+ .side-head {
887
+ display: flex; align-items: center; gap: 8px;
888
+ padding: 12px 14px;
889
+ border-bottom: 1px solid var(--line);
890
+ font-weight: 600;
891
+ font-size: 13px;
892
+ letter-spacing: -0.005em;
893
+ }
894
+ .side-head .count { color: var(--ink-40); font-weight: 500; font-size: 12px; }
895
+ .side-link { margin-left: auto; }
896
+ .side-label {
897
+ padding: 10px 14px 5px;
898
+ color: var(--ink-50);
899
+ font-size: 11px;
739
900
  font-weight: 500;
740
- letter-spacing: -0.022em;
901
+ letter-spacing: 0.06em;
902
+ text-transform: uppercase;
741
903
  }
742
-
743
- .markdown h2 {
744
- font-family: var(--display);
745
- font-size: 24px;
746
- font-weight: 620;
904
+ .side-label-list {
905
+ display: flex;
906
+ align-items: center;
907
+ gap: 8px;
908
+ border-top: 1px solid var(--line-soft);
909
+ margin-top: 4px;
747
910
  }
748
-
749
- .markdown h3 { font-size: 18px; }
750
-
751
- .markdown h4, .markdown h5, .markdown h6 {
911
+ .side-label .count {
912
+ color: var(--ink-40);
913
+ font-size: 11px;
914
+ }
915
+ .task-parent-link {
916
+ display: flex;
917
+ align-items: center;
918
+ justify-content: space-between;
919
+ gap: 12px;
920
+ width: 100%;
921
+ padding: 5px 14px 11px;
752
922
  color: var(--ink);
753
- line-height: 1.2;
754
- margin: 1.4em 0 0.45em;
923
+ text-align: left;
924
+ }
925
+ .task-parent-link span {
926
+ min-width: 0;
927
+ overflow: hidden;
928
+ text-overflow: ellipsis;
929
+ white-space: nowrap;
930
+ border-bottom: 1px dashed transparent;
931
+ }
932
+ .task-parent-link:hover span {
933
+ border-bottom-color: var(--ink);
934
+ }
935
+ .task-nav-actions {
936
+ padding: 0 14px 10px;
937
+ }
938
+
939
+ .dl {
940
+ margin: 0; padding: 8px 0;
941
+ display: grid;
942
+ grid-template-columns: max-content 1fr;
943
+ gap: 0 16px;
755
944
  }
756
- .markdown h4 { font-size: 16px; font-weight: 650; letter-spacing: -0.01em; }
757
- .markdown h5 {
758
- font-family: var(--mono);
945
+ .dl dt {
946
+ padding: 8px 14px;
759
947
  font-size: 12px;
760
- font-weight: 650;
948
+ color: var(--ink-50);
761
949
  text-transform: uppercase;
762
950
  letter-spacing: 0.06em;
763
- color: var(--muted);
951
+ font-weight: 500;
764
952
  }
765
- .markdown h6 {
766
- font-family: var(--mono);
767
- font-size: 11px;
768
- font-weight: 650;
769
- text-transform: uppercase;
770
- letter-spacing: 0.08em;
771
- color: var(--faint);
953
+ .dl dd {
954
+ margin: 0;
955
+ padding: 8px 14px;
956
+ font-size: 13px;
957
+ color: var(--ink);
958
+ display: flex; align-items: center;
959
+ gap: 6px;
960
+ flex-wrap: wrap;
772
961
  }
773
962
 
774
- .markdown p { margin: 0 0 1em; }
775
- .markdown ul, .markdown ol { padding-left: 1.5em; margin: 0 0 1em; }
776
- .markdown ul ul, .markdown ol ol, .markdown ul ol, .markdown ol ul { margin: 0.35em 0 0.1em; }
777
- .markdown li { margin: 0.32em 0; }
778
- .markdown li > p:last-child { margin-bottom: 0; }
779
-
780
- .markdown ul.task-list, .markdown ul.task-list ul.task-list { list-style: none; padding-left: 0.2em; }
781
- .markdown .task-item {
963
+ .side-list { margin: 0; padding: 0; list-style: none; }
964
+ .side-list li {
965
+ padding: 0;
966
+ border-top: 1px solid var(--line-soft);
967
+ font-size: 13px;
968
+ color: var(--ink);
969
+ }
970
+ .side-list li:first-child { border-top: none; }
971
+ .side-list li:hover { background: color-mix(in oklab, var(--line-soft) 60%, transparent); }
972
+ .side-list li.is-current {
973
+ background: var(--accent-soft);
974
+ }
975
+ .side-list-button {
976
+ width: 100%;
782
977
  display: flex;
783
- align-items: flex-start;
978
+ align-items: center;
979
+ justify-content: space-between;
784
980
  gap: 10px;
981
+ padding: 10px 14px;
982
+ text-align: left;
785
983
  }
786
- .markdown .task-marker {
787
- flex: 0 0 16px;
788
- width: 16px;
789
- height: 16px;
790
- display: inline-flex;
791
- align-items: center;
792
- justify-content: center;
793
- border: 1px solid var(--line);
794
- border-radius: 4px;
795
- background: var(--paper);
796
- color: var(--green-text);
797
- margin-top: 3px;
984
+ .side-list-button:disabled {
985
+ cursor: default;
798
986
  }
799
- .markdown .task-item.checked .task-marker {
800
- background: var(--green-bg);
801
- border-color: var(--green-bg);
987
+ .side-list-empty {
988
+ padding: 10px 14px !important;
989
+ color: var(--ink-50);
802
990
  }
803
- .markdown .task-text { flex: 1; min-width: 0; overflow-wrap: anywhere; }
804
- .markdown .task-item.checked .task-text { color: var(--muted); }
805
-
806
- .markdown .table-wrap {
807
- margin: 1.3em 0;
808
- border: 1px solid var(--line);
809
- border-radius: 10px;
810
- overflow-x: auto;
991
+ .sl-name { display: inline-flex; align-items: center; gap: 8px; min-width: 0; }
992
+ .sl-name {
993
+ overflow: hidden;
994
+ text-overflow: ellipsis;
995
+ white-space: nowrap;
811
996
  }
812
- .markdown table {
813
- border-collapse: collapse;
814
- width: 100%;
815
- font-size: 14.5px;
997
+ .sl-name svg { color: var(--ink-50); flex: none; }
998
+ .sl-right { display: inline-flex; align-items: center; gap: 8px; color: var(--ink-40); }
999
+ .meta-separator {
1000
+ color: var(--ink-40);
1001
+ margin-right: 2px;
816
1002
  }
817
- .markdown th, .markdown td {
818
- padding: 11px 14px;
819
- text-align: left;
820
- border-bottom: 1px solid var(--line);
821
- vertical-align: top;
1003
+
1004
+ /* ---------- Page foot ---------- */
1005
+ .page-foot {
1006
+ margin-top: 8px;
1007
+ padding-top: 24px;
1008
+ border-top: 1px dashed var(--line);
1009
+ color: var(--ink-40);
1010
+ font-size: 11.5px;
1011
+ letter-spacing: 0.02em;
822
1012
  }
823
- .markdown thead th {
824
- background: var(--paper-soft);
825
- font-weight: 650;
1013
+
1014
+ /* ---------- Search input ---------- */
1015
+ .search-input {
1016
+ width: 100%;
1017
+ padding: 10px 12px;
1018
+ border: 1px solid var(--line);
1019
+ border-radius: var(--r-sm);
1020
+ background: var(--surface);
826
1021
  color: var(--ink);
1022
+ font-family: inherit;
1023
+ font-size: 14px;
1024
+ outline: none;
1025
+ transition: border-color 150ms, background 150ms;
827
1026
  }
828
- .markdown tbody tr:last-child td { border-bottom: 0; }
829
- .markdown tbody tr:hover { background: var(--paper-soft); }
1027
+ .search-input::placeholder { color: var(--ink-40); }
1028
+ .search-input:focus { border-color: var(--ink-25); background: var(--bg); }
830
1029
 
831
- .markdown pre.has-lang code { display: block; margin-top: 18px; }
832
- .markdown pre .code-lang {
833
- position: absolute;
834
- top: 9px;
835
- left: 14px;
836
- font-family: var(--mono);
837
- font-size: 10.5px;
838
- letter-spacing: 0.05em;
839
- text-transform: uppercase;
840
- color: var(--faint);
841
- pointer-events: none;
842
- user-select: none;
1030
+ /* ---------- Empty state ---------- */
1031
+ .empty-state {
1032
+ padding: 18px 0;
1033
+ color: var(--ink-50);
1034
+ font-size: 13.5px;
843
1035
  }
844
1036
 
845
- .markdown .mermaid-block {
846
- margin: 1.3em 0;
847
- padding: 0;
1037
+ /* ============================================================
1038
+ Markdown body (document reader)
1039
+ ============================================================ */
1040
+ .md-body {
1041
+ max-width: 780px;
1042
+ font-size: 15px;
1043
+ line-height: 1.65;
1044
+ color: var(--ink);
848
1045
  }
849
- .markdown .mermaid-block figcaption {
850
- font-family: var(--mono);
851
- font-size: 10.5px;
852
- letter-spacing: 0.06em;
1046
+
1047
+ .md-body h1, .md-body h2, .md-body h3, .md-body h4 {
1048
+ color: var(--ink);
1049
+ line-height: 1.15;
1050
+ letter-spacing: -0.012em;
1051
+ }
1052
+ .md-body h1 { font-size: 24px; font-weight: 600; margin: 1.7em 0 0.55em; }
1053
+ .md-body h2 { font-size: 20px; font-weight: 600; margin: 1.5em 0 0.5em; }
1054
+ .md-body h3 { font-size: 16px; font-weight: 600; margin: 1.4em 0 0.45em; }
1055
+ .md-body h4 { font-size: 14px; font-weight: 600; margin: 1.3em 0 0.4em; }
1056
+ .md-body h5 {
1057
+ font-family: var(--font-mono);
1058
+ font-size: 12px; font-weight: 600;
853
1059
  text-transform: uppercase;
854
- color: var(--muted);
855
- margin-bottom: 6px;
1060
+ letter-spacing: 0.06em;
1061
+ color: var(--ink-50);
1062
+ margin: 1.3em 0 0.4em;
856
1063
  }
857
- .markdown .mermaid-block pre { margin: 0; }
858
-
859
- .markdown hr.rule {
860
- border: 0;
861
- border-top: 1px solid var(--line);
862
- margin: 2em 0;
1064
+ .md-body h6 {
1065
+ font-family: var(--font-mono);
1066
+ font-size: 11px; font-weight: 600;
1067
+ text-transform: uppercase;
1068
+ letter-spacing: 0.08em;
1069
+ color: var(--ink-40);
1070
+ margin: 1.2em 0 0.35em;
863
1071
  }
864
1072
 
865
- .markdown a, .wikilink {
866
- color: var(--blue-text);
867
- text-decoration: none;
868
- border-bottom: 1px solid rgba(31, 108, 159, 0.25);
869
- cursor: pointer;
870
- }
1073
+ .md-body p { margin: 0 0 1em; }
1074
+ .md-body ul, .md-body ol { padding-left: 1.5em; margin: 0 0 1em; }
1075
+ .md-body ul ul, .md-body ol ol, .md-body ul ol, .md-body ol ul { margin: 0.35em 0 0.1em; }
1076
+ .md-body li { margin: 0.32em 0; }
1077
+ .md-body li > p:last-child { margin-bottom: 0; }
871
1078
 
872
- .markdown code {
873
- background: #f1f0ed;
1079
+ .md-body code {
1080
+ background: var(--line-soft);
874
1081
  border: 1px solid var(--line);
875
- border-radius: 4px;
1082
+ border-radius: var(--r-sm);
876
1083
  padding: 0.1em 0.35em;
877
- font-family: var(--mono);
1084
+ font-family: var(--font-mono);
878
1085
  font-size: 0.88em;
879
1086
  }
880
-
881
- .markdown pre {
1087
+ .md-body pre {
882
1088
  position: relative;
883
- background: #fbfbfa;
884
- color: var(--ink);
1089
+ background: var(--surface);
885
1090
  border: 1px solid var(--line);
886
- border-radius: 10px;
1091
+ border-radius: var(--r);
887
1092
  padding: 18px;
888
1093
  overflow: auto;
1094
+ margin: 1.3em 0;
889
1095
  }
890
-
891
- .markdown pre code {
1096
+ .md-body pre code {
892
1097
  background: transparent;
893
1098
  border: 0;
894
- color: inherit;
895
1099
  padding: 0;
1100
+ font-size: 13px;
1101
+ color: inherit;
1102
+ }
1103
+ .md-body pre.has-lang code { display: block; margin-top: 18px; }
1104
+ .md-body .code-lang {
1105
+ position: absolute;
1106
+ top: 9px; left: 14px;
1107
+ font-family: var(--font-mono);
1108
+ font-size: 10.5px;
1109
+ letter-spacing: 0.05em;
1110
+ text-transform: uppercase;
1111
+ color: var(--ink-40);
1112
+ pointer-events: none;
1113
+ user-select: none;
896
1114
  }
897
1115
 
898
- .markdown blockquote {
1116
+ .md-body blockquote {
899
1117
  margin: 1.4em 0;
900
1118
  padding: 2px 0 2px 20px;
901
- border-left: 2px solid #d9d5ce;
902
- color: var(--muted);
903
- font-family: var(--serif);
1119
+ border-left: 2px solid var(--line);
1120
+ color: var(--ink-50);
904
1121
  font-style: italic;
905
- font-size: 17px;
906
1122
  line-height: 1.55;
907
1123
  }
908
1124
 
909
- .empty {
910
- color: var(--muted);
911
- padding: 40px;
912
- text-align: center;
913
- }
914
-
915
- .outline {
916
- border-right: 0;
917
- overflow: auto;
918
- padding: 28px 18px;
919
- background: var(--paper-soft);
920
- display: none;
921
- }
922
-
923
- .viewer-frame.outline-open .shell {
924
- grid-template-columns: 380px minmax(0, 1fr) 320px;
925
- }
926
-
927
- .viewer-frame.outline-open .outline {
928
- display: block;
929
- }
930
-
931
- .outline-title {
932
- color: var(--ink);
933
- font-family: var(--serif);
934
- font-size: 26px;
935
- font-weight: 500;
936
- line-height: 1.04;
937
- letter-spacing: -0.025em;
1125
+ .md-body hr {
1126
+ border: 0;
1127
+ border-top: 1px solid var(--line);
1128
+ margin: 2em 0;
938
1129
  }
939
1130
 
940
- .outline-help {
941
- color: var(--muted);
942
- font-size: 12.5px;
943
- line-height: 1.55;
944
- margin: 10px 0 24px;
945
- max-width: 36ch;
1131
+ .md-body .table-wrap {
1132
+ margin: 1.3em 0;
1133
+ border: 1px solid var(--line);
1134
+ border-radius: var(--r);
1135
+ overflow-x: auto;
946
1136
  }
947
-
948
- .outline-section { margin: 18px 0; }
949
- .outline-label { margin: 18px 4px 8px; }
950
-
951
- .outline-link {
952
- width: 100%;
953
- border: 1px solid transparent;
954
- background: transparent;
1137
+ .md-body table { border-collapse: collapse; width: 100%; font-size: 13.5px; }
1138
+ .md-body th, .md-body td {
1139
+ padding: 11px 14px;
955
1140
  text-align: left;
956
- border-radius: 8px;
957
- padding: 8px 9px;
958
- display: flex;
959
- gap: 9px;
960
- align-items: center;
961
- justify-content: space-between;
962
- cursor: pointer;
963
- }
964
-
965
- .outline-link span:first-child {
966
- min-width: 0;
967
- overflow-wrap: anywhere;
968
- }
969
-
970
- .outline-link:hover, .outline-link.active, .workstream-block.active > .outline-link {
971
- background: var(--paper);
972
- border-color: var(--line);
1141
+ border-bottom: 1px solid var(--line);
1142
+ vertical-align: top;
973
1143
  }
974
-
975
- .workstream-block {
976
- border-left: 1px solid var(--line);
977
- margin-left: 4px;
978
- padding-left: 8px;
1144
+ .md-body thead th {
1145
+ background: var(--surface);
1146
+ font-weight: 600;
1147
+ color: var(--ink);
979
1148
  }
1149
+ .md-body tbody tr:last-child td { border-bottom: 0; }
1150
+ .md-body tbody tr:hover { background: var(--line-soft); }
980
1151
 
981
- .subtasks { margin: 5px 0 10px 10px; }
982
- .subtasks .outline-link { font-size: 12px; padding: 7px 8px; }
983
- .small { padding: 10px; text-align: left; font-size: 12px; }
984
-
985
- .reveal {
986
- opacity: 0;
987
- transform: translateY(12px);
988
- transition: opacity 600ms cubic-bezier(0.16, 1, 0.3, 1), transform 600ms cubic-bezier(0.16, 1, 0.3, 1);
989
- transition-delay: calc(var(--index, 0) * 60ms);
1152
+ .md-body a {
1153
+ color: var(--ink);
1154
+ text-decoration: none;
1155
+ border-bottom: 1px dashed var(--ink-25);
1156
+ transition: border-color 90ms;
990
1157
  }
1158
+ .md-body a:hover { border-bottom-color: var(--ink); }
1159
+ .md-body strong { color: var(--ink); font-weight: 600; }
991
1160
 
992
- .reveal.visible {
993
- opacity: 1;
994
- transform: translateY(0);
1161
+ .md-body .task-list, .md-body .task-list .task-list { list-style: none; padding-left: 0.2em; }
1162
+ .md-body .task-item { display: flex; align-items: flex-start; gap: 10px; }
1163
+ .md-body .task-marker {
1164
+ flex: 0 0 16px; width: 16px; height: 16px;
1165
+ display: inline-flex; align-items: center; justify-content: center;
1166
+ border: 1px solid var(--line);
1167
+ border-radius: var(--r-sm);
1168
+ background: var(--surface);
1169
+ color: var(--ok);
1170
+ margin-top: 3px;
995
1171
  }
996
-
997
- @media (prefers-reduced-motion: reduce) {
998
- .reveal {
999
- opacity: 1;
1000
- transform: none;
1001
- transition: none;
1002
- }
1172
+ .md-body .task-item.checked .task-marker {
1173
+ background: var(--ok-soft);
1174
+ border-color: var(--ok-soft);
1003
1175
  }
1176
+ .md-body .task-text { flex: 1; min-width: 0; overflow-wrap: anywhere; }
1177
+ .md-body .task-item.checked .task-text { color: var(--ink-50); }
1004
1178
 
1005
- @media (max-width: 1180px) {
1006
- .shell { grid-template-columns: 320px minmax(0, 1fr); }
1007
- .viewer-frame.outline-open .shell { grid-template-columns: 320px minmax(0, 1fr); }
1008
- .reader-inner { padding: 52px 56px 92px; }
1179
+ /* ---------- Responsive ---------- */
1180
+ @media (max-width: 1100px) {
1181
+ .two-col { grid-template-columns: 1fr; }
1182
+ .col-side { position: static; }
1009
1183
  }
1010
1184
 
1011
- @media (max-width: 820px) {
1012
- #app { padding: 10px; }
1013
- .viewer-frame { min-height: calc(100vh - 20px); }
1014
- .top-bar {
1185
+ @media (max-width: 860px) {
1186
+ .app { grid-template-columns: 1fr; }
1187
+ .sidebar {
1188
+ position: static;
1015
1189
  height: auto;
1190
+ flex-direction: row;
1016
1191
  flex-wrap: wrap;
1017
- gap: 12px 18px;
1018
- padding: 14px 18px;
1019
- }
1020
- .brand-mark {
1021
- padding-right: 0;
1022
- border-right: 0;
1023
- font-size: 20px;
1024
- }
1025
- .tabs { width: 100%; gap: 4px; flex-wrap: wrap; }
1026
- .tab-more { display: none; }
1027
- .tab-dropdown { display: none !important; }
1028
- .shell { display: block; height: auto; }
1029
- .list, .reader, .outline {
1030
- height: auto;
1192
+ gap: 4px;
1193
+ padding: 12px;
1031
1194
  border-right: 0;
1032
1195
  border-bottom: 1px solid var(--line);
1033
1196
  }
1034
- .outline { display: none; }
1035
- .viewer-frame.outline-open .outline { display: block; }
1036
- .list, .outline { padding: 20px; }
1037
- .reader-top { display: block; }
1038
- .reader-actions { margin: 14px 0 0; }
1039
- .reader-inner { padding: 32px 24px 56px; }
1040
- .reader h1 { font-size: 34px; }
1041
- .properties { grid-template-columns: 1fr; }
1197
+ .brand { border-bottom: 0; padding-bottom: 4px; margin-bottom: 0; }
1198
+ .nav { flex-direction: row; flex-wrap: wrap; gap: 2px; }
1199
+ .nav-section { padding: 6px 9px; width: 100%; }
1200
+ .sidebar-foot { margin-top: 0; padding-top: 0; border-top: 0; }
1201
+ .content { padding: 24px 20px 48px; }
1202
+ .topbar { padding: 12px 20px; gap: 12px; }
1203
+ .summary { grid-template-columns: 1fr 1fr; }
1204
+ .overview-delivery { grid-template-columns: 1fr; gap: 24px; }
1205
+ .overview-priority { grid-template-columns: 1fr; }
1206
+ .preview-row { grid-template-columns: 1fr; gap: 5px; }
1207
+ .delivery-task-row { grid-template-columns: 1fr; gap: 5px; }
1208
+ .project-card-stats { grid-template-columns: 1fr 1fr; }
1209
+ .doc-reader-page,
1210
+ .two-col { grid-template-columns: 1fr; }
1211
+ .doc-side,
1212
+ .col-side { position: static; }
1213
+ .outline-subitem { grid-template-columns: 1fr; gap: 5px; }
1042
1214
  }