@tenonhq/dovetail-dashboard 0.0.25 → 0.0.27

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tenonhq/dovetail-dashboard",
3
- "version": "0.0.25",
3
+ "version": "0.0.27",
4
4
  "description": "Update Set Dashboard for Dovetail",
5
5
  "main": "server.js",
6
6
  "scripts": {
@@ -1088,57 +1088,95 @@
1088
1088
 
1089
1089
  /* ════════════════════════════════════════════════════════════════════════════
1090
1090
  Dark theme overrides.
1091
- The page already flows through the semantic tokens, so only the semantic
1092
- color chips that hardcode light pastels need explicit dark variants here.
1091
+ Status pills, badges, and callouts route through the tag tokens which
1092
+ tokens.css redefines for dark so no hex literals are needed here. Each
1093
+ selector picks the tag pair whose semantic meaning matches the chip.
1093
1094
  The .cp-theme-toggle button itself is styled in styles.css (shared).
1094
1095
  ════════════════════════════════════════════════════════════════════════════ */
1095
- [data-theme="dark"] .cp-status-DRAFT { background: #322d0c; color: #e8d860; border-color: #f4dc0033; }
1096
- [data-theme="dark"] .cp-status-APPROVED { background: #14301c; color: #8fe39d; border-color: #62dc4433; }
1096
+ [data-theme="dark"] .cp-status-DRAFT {
1097
+ background: var(--tag-yellow-bg);
1098
+ color: var(--tag-yellow-fg);
1099
+ border-color: var(--tag-yellow-fg);
1100
+ border-color: color-mix(in srgb, var(--tag-yellow-fg) 20%, transparent);
1101
+ }
1102
+ [data-theme="dark"] .cp-status-APPROVED {
1103
+ background: var(--tag-green-bg);
1104
+ color: var(--tag-green-fg);
1105
+ border-color: color-mix(in srgb, var(--tag-green-fg) 20%, transparent);
1106
+ }
1097
1107
 
1098
- [data-theme="dark"] .cp-c-badge-success { background: #14301c; color: #8fe39d; border-color: #62dc4433; }
1099
- [data-theme="dark"] .cp-c-badge-warning { background: #322d0c; color: #e8d860; border-color: #f4dc0033; }
1100
- [data-theme="dark"] .cp-c-badge-danger { background: #371616; color: #f08f8f; border-color: #f4393933; }
1101
- [data-theme="dark"] .cp-c-badge-info { background: #0e2c3a; color: #8fd9f5; border-color: #76d6ff33; }
1108
+ [data-theme="dark"] .cp-c-badge-success {
1109
+ background: var(--tag-green-bg);
1110
+ color: var(--tag-green-fg);
1111
+ border-color: color-mix(in srgb, var(--tag-green-fg) 20%, transparent);
1112
+ }
1113
+ [data-theme="dark"] .cp-c-badge-warning {
1114
+ background: var(--tag-yellow-bg);
1115
+ color: var(--tag-yellow-fg);
1116
+ border-color: color-mix(in srgb, var(--tag-yellow-fg) 20%, transparent);
1117
+ }
1118
+ [data-theme="dark"] .cp-c-badge-danger {
1119
+ background: var(--tag-red-bg);
1120
+ color: var(--tag-red-fg);
1121
+ border-color: color-mix(in srgb, var(--tag-red-fg) 20%, transparent);
1122
+ }
1123
+ [data-theme="dark"] .cp-c-badge-info {
1124
+ background: var(--tag-cyan-bg);
1125
+ color: var(--tag-cyan-fg);
1126
+ border-color: color-mix(in srgb, var(--tag-cyan-fg) 20%, transparent);
1127
+ }
1102
1128
 
1103
- [data-theme="dark"] .cp-c-callout-info { background: #0e2c3a55; border-color: #76d6ff33; }
1104
- [data-theme="dark"] .cp-c-callout-success { background: #14301c55; border-color: #62dc4433; }
1105
- [data-theme="dark"] .cp-c-callout-warning { background: #322d0c55; border-color: #f4dc0033; }
1106
- [data-theme="dark"] .cp-c-callout-danger { background: #37161655; border-color: #f4393933; }
1107
- [data-theme="dark"] .cp-c-callout-info .cp-c-callout-icon { color: #8fd9f5; }
1108
- [data-theme="dark"] .cp-c-callout-success .cp-c-callout-icon { color: #8fe39d; }
1109
- [data-theme="dark"] .cp-c-callout-warning .cp-c-callout-icon { color: #e8d860; }
1110
- [data-theme="dark"] .cp-c-callout-danger .cp-c-callout-icon { color: #f08f8f; }
1129
+ [data-theme="dark"] .cp-c-callout-info {
1130
+ background: color-mix(in srgb, var(--tag-cyan-bg) 60%, transparent);
1131
+ border-color: color-mix(in srgb, var(--tag-cyan-fg) 20%, transparent);
1132
+ }
1133
+ [data-theme="dark"] .cp-c-callout-success {
1134
+ background: color-mix(in srgb, var(--tag-green-bg) 60%, transparent);
1135
+ border-color: color-mix(in srgb, var(--tag-green-fg) 20%, transparent);
1136
+ }
1137
+ [data-theme="dark"] .cp-c-callout-warning {
1138
+ background: color-mix(in srgb, var(--tag-yellow-bg) 60%, transparent);
1139
+ border-color: color-mix(in srgb, var(--tag-yellow-fg) 20%, transparent);
1140
+ }
1141
+ [data-theme="dark"] .cp-c-callout-danger {
1142
+ background: color-mix(in srgb, var(--tag-red-bg) 60%, transparent);
1143
+ border-color: color-mix(in srgb, var(--tag-red-fg) 20%, transparent);
1144
+ }
1145
+ [data-theme="dark"] .cp-c-callout-info .cp-c-callout-icon { color: var(--tag-cyan-fg); }
1146
+ [data-theme="dark"] .cp-c-callout-success .cp-c-callout-icon { color: var(--tag-green-fg); }
1147
+ [data-theme="dark"] .cp-c-callout-warning .cp-c-callout-icon { color: var(--tag-yellow-fg); }
1148
+ [data-theme="dark"] .cp-c-callout-danger .cp-c-callout-icon { color: var(--tag-red-fg); }
1111
1149
 
1112
1150
  [data-theme="dark"] .cp-mermaid-error {
1113
- background: #37161655;
1114
- border-color: #f4393933;
1151
+ background: color-mix(in srgb, var(--tag-red-bg) 60%, transparent);
1152
+ border-color: color-mix(in srgb, var(--tag-red-fg) 20%, transparent);
1115
1153
  }
1116
1154
 
1117
1155
  [data-theme="dark"] .cp-pr-badge {
1118
- background: #0e2c3a;
1119
- color: #8fd9f5;
1120
- border-color: #76d6ff33;
1156
+ background: var(--tag-cyan-bg);
1157
+ color: var(--tag-cyan-fg);
1158
+ border-color: color-mix(in srgb, var(--tag-cyan-fg) 20%, transparent);
1121
1159
  }
1122
1160
  [data-theme="dark"] .cp-pr-badge:hover {
1123
- background: #14384a;
1124
- color: #b6e8ff;
1161
+ background: var(--tag-cyan-hover);
1162
+ color: var(--tag-cyan-fg);
1125
1163
  }
1126
1164
 
1127
1165
  /* ─── Topics cloud ─────────────────────────────────────────────────────────── */
1128
1166
 
1129
1167
  .cp-topics {
1130
- margin: 0 24px 12px;
1131
- background: var(--surface-raised);
1132
- border: 1px solid var(--border);
1133
- border-radius: var(--radius-md, 8px);
1134
- box-shadow: var(--shadow-1, 0 1px 2px rgba(0,0,0,0.04));
1168
+ background: transparent;
1169
+ border: none;
1170
+ border-bottom: 1px solid var(--border);
1171
+ box-shadow: none;
1172
+ border-radius: 0;
1135
1173
  }
1136
1174
 
1137
1175
  .cp-topics-summary {
1138
1176
  display: flex;
1139
1177
  align-items: center;
1140
1178
  gap: 8px;
1141
- padding: 10px 14px;
1179
+ padding: 8px 12px;
1142
1180
  cursor: pointer;
1143
1181
  list-style: none;
1144
1182
  user-select: none;
@@ -1196,7 +1234,7 @@
1196
1234
  display: flex;
1197
1235
  flex-wrap: wrap;
1198
1236
  gap: 6px 8px;
1199
- padding: 10px 14px 14px;
1237
+ padding: 8px 12px 10px;
1200
1238
  border-top: 1px solid var(--border-subtle, var(--border));
1201
1239
  line-height: 1.3;
1202
1240
  }
@@ -36,33 +36,32 @@
36
36
  </div>
37
37
  </header>
38
38
 
39
- <details class="cp-topics" id="cp-topics" open>
40
- <summary class="cp-topics-summary">
41
- <span class="cp-topics-caret" aria-hidden="true">▾</span>
42
- <span class="cp-topics-title">Topics</span>
43
- <span class="cp-topics-count" id="cp-topics-count">0</span>
44
- <button
45
- type="button"
46
- class="cp-topics-clear"
47
- id="cp-topics-clear"
48
- hidden
49
- title="Clear topic filter"
50
- aria-label="Clear topic filter"
51
- >Clear filter</button>
52
- </summary>
53
- <div class="cp-topics-cloud" id="cp-topics-cloud" role="group" aria-label="Plan topics">
54
- <span class="cp-topics-empty" id="cp-topics-empty">
55
- No topics yet. Push a plan and topics will appear here.
56
- </span>
57
- </div>
58
- </details>
59
-
60
39
  <main class="cp-layout">
61
40
  <aside class="cp-rail" id="cp-rail">
62
41
  <div class="cp-rail-header">
63
42
  <span class="cp-rail-title">Plans</span>
64
43
  <span class="cp-count" id="cp-count">0</span>
65
44
  </div>
45
+ <details class="cp-topics" id="cp-topics" open>
46
+ <summary class="cp-topics-summary">
47
+ <span class="cp-topics-caret" aria-hidden="true">▾</span>
48
+ <span class="cp-topics-title">Topics</span>
49
+ <span class="cp-topics-count" id="cp-topics-count">0</span>
50
+ <button
51
+ type="button"
52
+ class="cp-topics-clear"
53
+ id="cp-topics-clear"
54
+ hidden
55
+ title="Clear topic filter"
56
+ aria-label="Clear topic filter"
57
+ >Clear filter</button>
58
+ </summary>
59
+ <div class="cp-topics-cloud" id="cp-topics-cloud" role="group" aria-label="Plan topics">
60
+ <span class="cp-topics-empty" id="cp-topics-empty">
61
+ No topics yet. Push a plan and topics will appear here.
62
+ </span>
63
+ </div>
64
+ </details>
66
65
  <div class="cp-search">
67
66
  <input
68
67
  type="search"
package/public/tokens.css CHANGED
@@ -163,35 +163,38 @@
163
163
 
164
164
  /* ============================================================================
165
165
  Dark theme — activated by <html data-theme="dark">.
166
- Used by the Claude Plans page; safe to adopt dashboard-wide later.
167
- Overrides the semantic aliases only — the raw color scales above are shared.
168
- Brand emerald and neon accent are preserved; grounds invert to dark woodgrain.
166
+ Mirrors the canonical [data-theme="dark"] block in the Tenon design system
167
+ (ClaudeDesign/project/colors_and_type.css). Overrides semantic aliases only;
168
+ the raw color scales above are shared. Grounds invert to a deep woodgrain-
169
+ emerald palette (#0A1A11 → #16352A two-step elevation). Brand emerald and
170
+ neon accent preserved; ink on neon stays emerald-900. Status tokens shift
171
+ from the 700 ramp to the 300 ramp for readability on dark.
169
172
  ============================================================================ */
170
173
  [data-theme="dark"] {
171
- --bg: #0d1410;
172
- --bg-subtle: #121c16;
173
- --bg-muted: #18241c;
174
- --bg-paper: #121c16;
175
- --bg-oak: #20302554;
174
+ --bg: #0a1a11;
175
+ --bg-subtle: #0f2418;
176
+ --bg-muted: #16352a;
177
+ --bg-paper: #1a2418;
178
+ --bg-oak: #2a2a1f;
176
179
  --bg-deep: #060b08;
177
180
  --bg-overlay: rgba(0, 0, 0, 0.66);
178
181
 
179
- --surface: #121c16;
180
- --surface-raised: #18241c;
182
+ --surface: #10241a;
183
+ --surface-raised: #16352a;
181
184
 
182
- --fg: #e9efe9;
183
- --fg-muted: #8da095;
184
- --fg-subtle: #5f7167;
185
- --fg-on-dark: #e9efe9;
186
- --fg-on-neon: var(--emerald-700);
185
+ --fg: #ecf3ef;
186
+ --fg-muted: #a3b8aa; /* lifted to clear AA 4.5:1 on --surface */
187
+ --fg-subtle: #6f8378;
188
+ --fg-on-dark: #ecf3ef;
189
+ --fg-on-neon: var(--emerald-900);
187
190
 
188
191
  --accent: var(--neon-300);
189
192
  --accent-hover: var(--neon-500);
190
193
  --accent-press: var(--neon-700);
191
- --accent-fg: #0d1410;
194
+ --accent-fg: var(--emerald-900);
192
195
 
193
196
  --brand: var(--emerald-50);
194
- --brand-deep: #e9efe9;
197
+ --brand-deep: #ecf3ef;
195
198
 
196
199
  --success: var(--success-300);
197
200
  --warning: var(--warning-300);
@@ -199,8 +202,8 @@
199
202
  --danger-hover: var(--error-500);
200
203
  --info: var(--blue-300);
201
204
 
202
- --border: #26342b;
203
- --border-strong: #344538;
205
+ --border: #2b4233;
206
+ --border-strong: #3d5847;
204
207
  --border-subtle: #1d2922;
205
208
  --border-focus: var(--neon-500);
206
209
 
@@ -214,7 +217,7 @@
214
217
  --tag-blue-bg: #182040; --tag-blue-fg: #aab4ff;
215
218
  --tag-cyan-bg: #0e2c3a; --tag-cyan-fg: #8fd9f5;
216
219
  --tag-sage-bg: #1d2922; --tag-sage-fg: #b6c6bc;
217
- --tag-warm-bg: #2c2417; --tag-warm-fg: #d8c4a2;
220
+ --tag-warm-bg: #2c2417; --tag-warm-fg: #e6d3ae; /* lifted from #d8c4a2 */
218
221
  --tag-yellow-bg: #322d0c; --tag-yellow-fg: #e8d860;
219
222
  --tag-purple-bg: #2a1633; --tag-purple-fg: #e29bf0;
220
223
  --tag-orange-bg: #331c0c; --tag-orange-fg: #f0a878;