@tenonhq/dovetail-dashboard 0.0.13 → 0.0.15

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.
@@ -0,0 +1,643 @@
1
+ /* Layout for /claude-plans. Reuses the wood palette from styles.css. */
2
+
3
+ .cp-body { min-height: 100vh; }
4
+
5
+ .cp-nav-link {
6
+ color: var(--text);
7
+ text-decoration: none;
8
+ font-size: 13px;
9
+ padding: 6px 10px;
10
+ border: 1px solid var(--border);
11
+ border-radius: 4px;
12
+ }
13
+ .cp-nav-link:hover { background: var(--wood-light); }
14
+ .cp-storage {
15
+ font-size: 11px;
16
+ color: var(--text-muted);
17
+ max-width: 320px;
18
+ overflow: hidden;
19
+ text-overflow: ellipsis;
20
+ white-space: nowrap;
21
+ }
22
+
23
+ .cp-layout {
24
+ display: grid;
25
+ grid-template-columns: 320px 1fr;
26
+ gap: 0;
27
+ height: calc(100vh - 65px);
28
+ }
29
+
30
+ .cp-rail {
31
+ border-right: 1px solid var(--border);
32
+ background: var(--wood-medium);
33
+ overflow-y: auto;
34
+ display: flex;
35
+ flex-direction: column;
36
+ }
37
+ .cp-rail-header {
38
+ padding: 12px 16px;
39
+ border-bottom: 1px solid var(--border);
40
+ display: flex;
41
+ justify-content: space-between;
42
+ align-items: center;
43
+ font-size: 12px;
44
+ text-transform: uppercase;
45
+ letter-spacing: 0.1em;
46
+ color: var(--text-muted);
47
+ }
48
+ .cp-count {
49
+ background: var(--card-bg);
50
+ color: var(--text);
51
+ padding: 2px 8px;
52
+ border-radius: 10px;
53
+ font-size: 11px;
54
+ }
55
+ .cp-rail-empty {
56
+ padding: 20px 16px;
57
+ color: var(--text-muted);
58
+ font-size: 13px;
59
+ line-height: 1.5;
60
+ }
61
+ .cp-rail-empty code {
62
+ background: var(--card-bg);
63
+ padding: 1px 6px;
64
+ border-radius: 3px;
65
+ font-size: 12px;
66
+ }
67
+ .cp-list { list-style: none; }
68
+ .cp-list-item {
69
+ padding: 12px 16px;
70
+ border-bottom: 1px solid var(--border);
71
+ cursor: pointer;
72
+ display: flex;
73
+ flex-direction: column;
74
+ gap: 6px;
75
+ }
76
+ .cp-list-item:hover { background: var(--wood-light); }
77
+ .cp-list-item.active { background: var(--wood-light); border-left: 3px solid var(--accent); }
78
+ .cp-list-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
79
+ .cp-list-title { font-weight: 600; font-size: 13px; }
80
+ .cp-list-meta { font-size: 11px; color: var(--text-muted); display: flex; gap: 8px; }
81
+ .cp-list-meta-slug { font-family: inherit; opacity: 0.8; }
82
+
83
+ .cp-status-pill {
84
+ padding: 2px 8px;
85
+ border-radius: 10px;
86
+ font-size: 10px;
87
+ text-transform: uppercase;
88
+ letter-spacing: 0.08em;
89
+ border: 1px solid transparent;
90
+ }
91
+ .cp-status-DRAFT { background: rgba(212, 148, 58, 0.18); color: #f0c275; border-color: rgba(212, 148, 58, 0.45); }
92
+ .cp-status-APPROVED { background: rgba(74, 140, 92, 0.18); color: #92d3a4; border-color: rgba(74, 140, 92, 0.45); }
93
+ .cp-status-EXITED { background: rgba(168, 146, 121, 0.18); color: #a89279; border-color: rgba(168, 146, 121, 0.45); }
94
+
95
+ .cp-artifact-badge {
96
+ font-size: 10px;
97
+ background: var(--card-bg);
98
+ padding: 1px 6px;
99
+ border-radius: 8px;
100
+ color: var(--text-muted);
101
+ }
102
+
103
+ .cp-detail { overflow-y: auto; padding: 24px 32px; }
104
+ .cp-detail-empty { color: var(--text-muted); font-size: 14px; padding-top: 80px; text-align: center; }
105
+ .cp-detail-header { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 16px; }
106
+ .cp-detail-header h2 { font-size: 20px; margin: 0; }
107
+ .cp-stamp { font-size: 11px; color: var(--text-muted); margin-left: auto; }
108
+ .cp-tabs { display: flex; gap: 0; align-items: center; border-bottom: 1px solid var(--border); margin-bottom: 16px; }
109
+ .cp-tab {
110
+ background: transparent;
111
+ border: none;
112
+ color: var(--text-muted);
113
+ padding: 10px 16px;
114
+ cursor: pointer;
115
+ font-family: inherit;
116
+ font-size: 13px;
117
+ border-bottom: 2px solid transparent;
118
+ }
119
+ .cp-tab.active { color: var(--text); border-bottom-color: var(--accent); }
120
+ .cp-tab-count {
121
+ background: var(--card-bg);
122
+ padding: 1px 6px;
123
+ border-radius: 8px;
124
+ font-size: 10px;
125
+ margin-left: 4px;
126
+ }
127
+ .cp-tab-panel { font-size: 14px; line-height: 1.6; }
128
+ .cp-tab-panel h1, .cp-tab-panel h2, .cp-tab-panel h3 { margin-top: 1em; margin-bottom: 0.4em; }
129
+ .cp-tab-panel code { background: var(--card-bg); padding: 1px 6px; border-radius: 3px; font-size: 13px; }
130
+ .cp-tab-panel pre { background: var(--input-bg); padding: 12px; border-radius: 4px; overflow-x: auto; }
131
+ .cp-tab-panel pre code { background: transparent; padding: 0; }
132
+ .cp-tab-panel ul, .cp-tab-panel ol { margin-left: 24px; }
133
+ .cp-tab-panel table { border-collapse: collapse; margin: 12px 0; }
134
+ .cp-tab-panel th, .cp-tab-panel td { border: 1px solid var(--border); padding: 6px 10px; }
135
+ .cp-tab-panel blockquote {
136
+ border-left: 3px solid var(--accent);
137
+ padding-left: 12px;
138
+ color: var(--text-muted);
139
+ margin: 12px 0;
140
+ }
141
+
142
+ .cp-artifact-card {
143
+ background: var(--card-bg);
144
+ border: 1px solid var(--border);
145
+ border-radius: 6px;
146
+ padding: 16px;
147
+ margin-bottom: 16px;
148
+ }
149
+ .cp-artifact-head {
150
+ display: flex;
151
+ align-items: center;
152
+ gap: 8px;
153
+ margin-bottom: 12px;
154
+ }
155
+ .cp-artifact-title { font-weight: 600; font-size: 14px; }
156
+ .cp-kind-pill {
157
+ font-size: 10px;
158
+ text-transform: uppercase;
159
+ background: var(--wood-light);
160
+ padding: 2px 8px;
161
+ border-radius: 8px;
162
+ letter-spacing: 0.08em;
163
+ }
164
+ .cp-mermaid {
165
+ background: #faf7f0;
166
+ border-radius: 4px;
167
+ padding: 12px;
168
+ display: flex;
169
+ justify-content: center;
170
+ }
171
+ .cp-mermaid svg { max-width: 100%; height: auto; }
172
+ .cp-mermaid-error {
173
+ color: #f0a0a0;
174
+ font-size: 12px;
175
+ background: var(--input-bg);
176
+ padding: 12px;
177
+ border-radius: 4px;
178
+ white-space: pre-wrap;
179
+ font-family: inherit;
180
+ }
181
+
182
+ /* ─── cp-c-* Structured Component Library ─────────────────────────────────────
183
+ Classes rendered server-side by renderer.ts. DOMPurify-safe — no scripts.
184
+ All components consume the wood palette via CSS variables.
185
+ ─────────────────────────────────────────────────────────────────────────── */
186
+
187
+ .cp-structured {
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 16px;
191
+ font-size: 14px;
192
+ line-height: 1.5;
193
+ }
194
+
195
+ /* Shared label above a component */
196
+ .cp-c-label {
197
+ font-size: 10px;
198
+ text-transform: uppercase;
199
+ letter-spacing: 0.12em;
200
+ color: var(--text-muted);
201
+ margin-bottom: 8px;
202
+ font-weight: 600;
203
+ }
204
+
205
+ /* ── Header ── */
206
+ .cp-c-header {
207
+ border-left: 3px solid var(--accent);
208
+ padding: 4px 0 4px 14px;
209
+ }
210
+ .cp-c-header-title {
211
+ font-size: 20px;
212
+ font-weight: 700;
213
+ color: var(--text);
214
+ letter-spacing: -0.01em;
215
+ }
216
+ .cp-c-header-sub {
217
+ font-size: 13px;
218
+ color: var(--text-muted);
219
+ margin-top: 3px;
220
+ }
221
+
222
+ /* ── Meta key-value table ── */
223
+ .cp-c-meta { }
224
+ .cp-c-meta-table {
225
+ border-collapse: collapse;
226
+ width: 100%;
227
+ }
228
+ .cp-c-meta-table tr + tr td {
229
+ border-top: 1px solid rgba(90, 61, 46, 0.4);
230
+ }
231
+ .cp-c-meta-key {
232
+ color: var(--text-muted);
233
+ font-size: 12px;
234
+ padding: 5px 16px 5px 0;
235
+ white-space: nowrap;
236
+ width: 1%;
237
+ vertical-align: top;
238
+ }
239
+ .cp-c-meta-val {
240
+ color: var(--text);
241
+ font-size: 13px;
242
+ padding: 5px 0;
243
+ vertical-align: top;
244
+ }
245
+
246
+ /* ── Badges ── */
247
+ .cp-c-badge {
248
+ display: inline-block;
249
+ padding: 1px 8px;
250
+ border-radius: 10px;
251
+ font-size: 10px;
252
+ text-transform: uppercase;
253
+ letter-spacing: 0.08em;
254
+ font-weight: 600;
255
+ border: 1px solid transparent;
256
+ }
257
+ .cp-c-badge-default { background: rgba(168,146,121,0.18); color: var(--text-muted); border-color: rgba(168,146,121,0.35); }
258
+ .cp-c-badge-success { background: rgba(74,140,92,0.18); color: #92d3a4; border-color: rgba(74,140,92,0.4); }
259
+ .cp-c-badge-warning { background: rgba(212,148,58,0.18); color: #f0c275; border-color: rgba(212,148,58,0.4); }
260
+ .cp-c-badge-danger { background: rgba(181,74,74,0.18); color: #e8a0a0; border-color: rgba(181,74,74,0.4); }
261
+ .cp-c-badge-info { background: rgba(100,140,190,0.18); color: #9bbfe0; border-color: rgba(100,140,190,0.4); }
262
+
263
+ /* ── Callout ── */
264
+ .cp-c-callout {
265
+ display: flex;
266
+ gap: 10px;
267
+ align-items: flex-start;
268
+ padding: 12px 14px;
269
+ border-radius: 4px;
270
+ border: 1px solid transparent;
271
+ border-left-width: 3px;
272
+ }
273
+ .cp-c-callout-info { background: rgba(100,140,190,0.1); border-color: rgba(100,140,190,0.5); border-left-color: #6493c0; }
274
+ .cp-c-callout-success { background: rgba(74,140,92,0.1); border-color: rgba(74,140,92,0.5); border-left-color: var(--success); }
275
+ .cp-c-callout-warning { background: rgba(212,148,58,0.1); border-color: rgba(212,148,58,0.5); border-left-color: var(--accent); }
276
+ .cp-c-callout-danger { background: rgba(181,74,74,0.1); border-color: rgba(181,74,74,0.5); border-left-color: var(--danger); }
277
+ .cp-c-callout-icon {
278
+ font-size: 14px;
279
+ flex-shrink: 0;
280
+ margin-top: 1px;
281
+ }
282
+ .cp-c-callout-info .cp-c-callout-icon { color: #9bbfe0; }
283
+ .cp-c-callout-success .cp-c-callout-icon { color: #92d3a4; }
284
+ .cp-c-callout-warning .cp-c-callout-icon { color: #f0c275; }
285
+ .cp-c-callout-danger .cp-c-callout-icon { color: #e8a0a0; }
286
+ .cp-c-callout-body { flex: 1; }
287
+ .cp-c-callout-title {
288
+ font-weight: 600;
289
+ font-size: 13px;
290
+ margin-bottom: 3px;
291
+ color: var(--text);
292
+ }
293
+ .cp-c-callout-msg {
294
+ font-size: 13px;
295
+ color: var(--text-muted);
296
+ line-height: 1.5;
297
+ }
298
+
299
+ /* ── Checklist ── */
300
+ .cp-c-check-list {
301
+ list-style: none;
302
+ display: flex;
303
+ flex-direction: column;
304
+ gap: 6px;
305
+ }
306
+ .cp-c-check-item {
307
+ display: flex;
308
+ align-items: flex-start;
309
+ gap: 8px;
310
+ font-size: 13px;
311
+ }
312
+ .cp-c-check-box {
313
+ flex-shrink: 0;
314
+ width: 16px;
315
+ height: 16px;
316
+ border-radius: 3px;
317
+ border: 1.5px solid var(--border);
318
+ display: inline-flex;
319
+ align-items: center;
320
+ justify-content: center;
321
+ font-size: 10px;
322
+ margin-top: 1px;
323
+ background: var(--input-bg);
324
+ color: transparent;
325
+ }
326
+ .cp-c-check-done .cp-c-check-box {
327
+ background: var(--success);
328
+ border-color: var(--success);
329
+ color: #fff;
330
+ }
331
+ .cp-c-check-label { flex: 1; color: var(--text); }
332
+ .cp-c-check-done .cp-c-check-label {
333
+ color: var(--text-muted);
334
+ text-decoration: line-through;
335
+ text-decoration-color: rgba(168,146,121,0.5);
336
+ }
337
+ .cp-c-check-note {
338
+ font-size: 11px;
339
+ color: var(--text-muted);
340
+ margin-left: auto;
341
+ padding-left: 8px;
342
+ white-space: nowrap;
343
+ }
344
+
345
+ /* ── Pipeline Steps ── */
346
+ .cp-c-steps { }
347
+ .cp-c-step-track {
348
+ display: flex;
349
+ align-items: flex-start;
350
+ flex-wrap: wrap;
351
+ gap: 0;
352
+ margin-top: 4px;
353
+ }
354
+ .cp-c-step {
355
+ display: flex;
356
+ flex-direction: column;
357
+ align-items: center;
358
+ min-width: 64px;
359
+ flex: 0 0 auto;
360
+ }
361
+ .cp-c-step-dot {
362
+ width: 24px;
363
+ height: 24px;
364
+ border-radius: 50%;
365
+ border: 2px solid var(--border);
366
+ background: var(--input-bg);
367
+ position: relative;
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ }
372
+ .cp-c-step-dot::after {
373
+ content: "";
374
+ display: none;
375
+ }
376
+ .cp-c-step-done .cp-c-step-dot {
377
+ background: var(--accent);
378
+ border-color: var(--accent);
379
+ }
380
+ .cp-c-step-done .cp-c-step-dot::after {
381
+ display: block;
382
+ width: 8px;
383
+ height: 5px;
384
+ border-left: 2px solid #2c1810;
385
+ border-bottom: 2px solid #2c1810;
386
+ transform: rotate(-45deg) translate(0, -1px);
387
+ }
388
+ .cp-c-step-active .cp-c-step-dot {
389
+ border-color: var(--accent);
390
+ background: var(--card-bg);
391
+ box-shadow: 0 0 0 3px rgba(212,148,58,0.2);
392
+ }
393
+ .cp-c-step-error .cp-c-step-dot {
394
+ background: var(--danger);
395
+ border-color: var(--danger);
396
+ }
397
+ .cp-c-step-error .cp-c-step-dot::after {
398
+ display: block;
399
+ width: 2px;
400
+ height: 10px;
401
+ background: #fff;
402
+ transform: rotate(45deg);
403
+ box-shadow: 0 0 0 1px var(--danger);
404
+ }
405
+ .cp-c-step-label {
406
+ font-size: 10px;
407
+ text-transform: uppercase;
408
+ letter-spacing: 0.08em;
409
+ margin-top: 6px;
410
+ color: var(--text-muted);
411
+ text-align: center;
412
+ }
413
+ .cp-c-step-done .cp-c-step-label { color: var(--accent); }
414
+ .cp-c-step-active .cp-c-step-label { color: var(--text); font-weight: 600; }
415
+ .cp-c-step-error .cp-c-step-label { color: #e8a0a0; }
416
+ .cp-c-step-note {
417
+ font-size: 10px;
418
+ color: var(--text-muted);
419
+ margin-top: 2px;
420
+ text-align: center;
421
+ }
422
+ .cp-c-step-line {
423
+ flex: 1 1 auto;
424
+ height: 2px;
425
+ background: var(--border);
426
+ margin-top: 11px;
427
+ min-width: 16px;
428
+ }
429
+ .cp-c-step-line-filled { background: var(--accent); opacity: 0.6; }
430
+
431
+ /* ── Metrics ── */
432
+ .cp-c-metrics {
433
+ display: grid;
434
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
435
+ gap: 10px;
436
+ }
437
+ .cp-c-metric {
438
+ background: var(--card-bg);
439
+ border: 1px solid var(--border);
440
+ border-top: 2px solid var(--accent);
441
+ border-radius: 4px;
442
+ padding: 12px 14px 10px;
443
+ }
444
+ .cp-c-metric-success { border-top-color: var(--success); }
445
+ .cp-c-metric-warning { border-top-color: #d4943a; }
446
+ .cp-c-metric-danger { border-top-color: var(--danger); }
447
+ .cp-c-metric-info { border-top-color: #6493c0; }
448
+ .cp-c-metric-default { border-top-color: var(--border); }
449
+ .cp-c-metric-val {
450
+ font-size: 22px;
451
+ font-weight: 700;
452
+ color: var(--text);
453
+ letter-spacing: -0.02em;
454
+ line-height: 1.1;
455
+ }
456
+ .cp-c-metric-label {
457
+ font-size: 10px;
458
+ text-transform: uppercase;
459
+ letter-spacing: 0.1em;
460
+ color: var(--text-muted);
461
+ margin-top: 4px;
462
+ }
463
+ .cp-c-metric-sub {
464
+ font-size: 11px;
465
+ color: var(--text-muted);
466
+ margin-top: 2px;
467
+ }
468
+
469
+ /* ── Section Divider ── */
470
+ .cp-c-section-divider {
471
+ display: flex;
472
+ align-items: center;
473
+ gap: 10px;
474
+ color: var(--text-muted);
475
+ font-size: 10px;
476
+ text-transform: uppercase;
477
+ letter-spacing: 0.12em;
478
+ font-weight: 600;
479
+ }
480
+ .cp-c-section-divider::before,
481
+ .cp-c-section-divider::after {
482
+ content: "";
483
+ flex: 1;
484
+ height: 1px;
485
+ background: var(--border);
486
+ }
487
+
488
+ /* ── Table ── */
489
+ .cp-c-table-wrap { overflow-x: auto; }
490
+ .cp-c-table {
491
+ border-collapse: collapse;
492
+ width: 100%;
493
+ font-size: 13px;
494
+ }
495
+ .cp-c-table th {
496
+ background: var(--card-bg);
497
+ color: var(--text-muted);
498
+ font-size: 10px;
499
+ text-transform: uppercase;
500
+ letter-spacing: 0.1em;
501
+ padding: 7px 10px;
502
+ text-align: left;
503
+ border: 1px solid var(--border);
504
+ font-weight: 600;
505
+ }
506
+ .cp-c-table td {
507
+ padding: 7px 10px;
508
+ border: 1px solid var(--border);
509
+ color: var(--text);
510
+ vertical-align: top;
511
+ }
512
+ .cp-c-table tr:nth-child(even) td { background: rgba(58,37,25,0.4); }
513
+
514
+ /* ── Text ── */
515
+ .cp-c-text {
516
+ font-size: 13px;
517
+ color: var(--text-muted);
518
+ line-height: 1.65;
519
+ }
520
+
521
+ /* ── Code ── */
522
+ .cp-c-code-wrap {
523
+ background: var(--input-bg);
524
+ border: 1px solid var(--border);
525
+ border-radius: 4px;
526
+ overflow: hidden;
527
+ }
528
+ .cp-c-code-header {
529
+ display: flex;
530
+ justify-content: space-between;
531
+ align-items: center;
532
+ padding: 6px 12px;
533
+ border-bottom: 1px solid var(--border);
534
+ background: var(--card-bg);
535
+ }
536
+ .cp-c-code-title {
537
+ font-size: 11px;
538
+ color: var(--text-muted);
539
+ font-weight: 600;
540
+ }
541
+ .cp-c-code-lang {
542
+ font-size: 10px;
543
+ color: var(--text-muted);
544
+ text-transform: uppercase;
545
+ letter-spacing: 0.08em;
546
+ opacity: 0.7;
547
+ }
548
+ .cp-c-code {
549
+ margin: 0;
550
+ padding: 12px;
551
+ overflow-x: auto;
552
+ font-size: 12px;
553
+ line-height: 1.6;
554
+ color: var(--wood-pale);
555
+ background: transparent;
556
+ }
557
+ .cp-c-code code {
558
+ background: transparent;
559
+ padding: 0;
560
+ font-size: inherit;
561
+ }
562
+
563
+ /* ─── Copy buttons ─────────────────────────────────────────────────────────── */
564
+
565
+ .cp-c-copy-wrap {
566
+ position: relative;
567
+ }
568
+
569
+ .cp-copy-btn-group {
570
+ position: absolute;
571
+ top: 6px;
572
+ right: 6px;
573
+ display: flex;
574
+ gap: 4px;
575
+ opacity: 0;
576
+ transition: opacity 0.15s;
577
+ }
578
+
579
+ .cp-c-copy-wrap:hover .cp-copy-btn-group {
580
+ opacity: 1;
581
+ }
582
+
583
+ .cp-copy-btn {
584
+ font-size: 10px;
585
+ font-family: inherit;
586
+ padding: 2px 7px;
587
+ border: 1px solid var(--border);
588
+ border-radius: 3px;
589
+ background: var(--wood-light);
590
+ color: var(--text-muted);
591
+ cursor: pointer;
592
+ letter-spacing: 0.04em;
593
+ line-height: 1.6;
594
+ }
595
+
596
+ .cp-copy-btn:hover {
597
+ background: var(--wood-medium);
598
+ color: var(--text);
599
+ }
600
+
601
+ .cp-copy-btn--copied {
602
+ color: var(--success);
603
+ border-color: var(--success);
604
+ }
605
+
606
+ /* Artifact card copy group — inline in header, always visible */
607
+ .cp-copy-btn-group--artifact {
608
+ position: static;
609
+ opacity: 1;
610
+ margin-left: auto;
611
+ }
612
+
613
+ /* ─── Delete button on sidebar items ──────────────────────────────────────── */
614
+ .cp-list-delete {
615
+ background: none;
616
+ border: none;
617
+ cursor: pointer;
618
+ color: var(--text-muted);
619
+ font-size: 16px;
620
+ line-height: 1;
621
+ padding: 0 2px;
622
+ opacity: 0;
623
+ flex-shrink: 0;
624
+ transition: opacity 0.15s, color 0.15s;
625
+ border-radius: 3px;
626
+ }
627
+ .cp-list-item:hover .cp-list-delete { opacity: 1; }
628
+ .cp-list-delete:hover { color: #c0392b; }
629
+
630
+ /* ─── PR link badge in plan detail header ─────────────────────────────────── */
631
+ .cp-pr-badge {
632
+ display: inline-flex;
633
+ align-items: center;
634
+ padding: 2px 8px;
635
+ border-radius: 4px;
636
+ font-size: 12px;
637
+ background: rgba(100,140,190,0.15);
638
+ color: #9bbfe0;
639
+ text-decoration: none;
640
+ border: 1px solid rgba(100,140,190,0.4);
641
+ white-space: nowrap;
642
+ }
643
+ .cp-pr-badge:hover { background: rgba(100,140,190,0.25); color: var(--text); }
@@ -0,0 +1,61 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Claude Plans — Dovetail Dashboard</title>
7
+ <link rel="stylesheet" href="styles.css" />
8
+ <link rel="stylesheet" href="claude-plans.css" />
9
+ </head>
10
+ <body class="cp-body">
11
+ <header>
12
+ <div class="header-left">
13
+ <h1><span>Dovetail</span> Claude Plans</h1>
14
+ </div>
15
+ <div class="header-right">
16
+ <a class="cp-nav-link" href="/">&larr; Update Sets</a>
17
+ <span class="cp-storage" id="cp-storage" title="storage root"></span>
18
+ </div>
19
+ </header>
20
+
21
+ <main class="cp-layout">
22
+ <aside class="cp-rail" id="cp-rail">
23
+ <div class="cp-rail-header">
24
+ <span class="cp-rail-title">Plans</span>
25
+ <span class="cp-count" id="cp-count">0</span>
26
+ </div>
27
+ <div class="cp-rail-empty" id="cp-rail-empty">
28
+ Waiting for plans. Run <code>push_plan</code> from a Claude Code
29
+ session to populate this list.
30
+ </div>
31
+ <ul class="cp-list" id="cp-list"></ul>
32
+ </aside>
33
+
34
+ <section class="cp-detail" id="cp-detail">
35
+ <div class="cp-detail-empty" id="cp-detail-empty">
36
+ Select a plan from the left rail.
37
+ </div>
38
+ <article class="cp-detail-body" id="cp-detail-body" hidden>
39
+ <header class="cp-detail-header">
40
+ <h2 id="cp-detail-title"></h2>
41
+ <span class="cp-status-pill" id="cp-detail-status"></span>
42
+ <span class="cp-stamp" id="cp-detail-stamp"></span>
43
+ </header>
44
+ <nav class="cp-tabs">
45
+ <button class="cp-tab active" data-tab="plan">Plan</button>
46
+ <button class="cp-tab" data-tab="artifacts">
47
+ Artifacts <span class="cp-tab-count" id="cp-artifact-count">0</span>
48
+ </button>
49
+ </nav>
50
+ <div class="cp-tab-panel" id="cp-tab-plan"></div>
51
+ <div class="cp-tab-panel" id="cp-tab-artifacts" hidden></div>
52
+ </article>
53
+ </section>
54
+ </main>
55
+
56
+ <script src="https://cdn.jsdelivr.net/npm/marked@12.0.2/marked.min.js"></script>
57
+ <script src="https://cdn.jsdelivr.net/npm/dompurify@3.1.5/dist/purify.min.js"></script>
58
+ <script src="https://cdn.jsdelivr.net/npm/mermaid@10.9.1/dist/mermaid.min.js"></script>
59
+ <script src="claude-plans.js"></script>
60
+ </body>
61
+ </html>