a2acalling 0.6.62 → 0.6.64
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/.a2a-manifest.json +2 -2
- package/.maestro/inbox/release-workflow-spam.md +25 -0
- package/docs/plans/2026-02-21-a2a-48-permissions-redesign.md +359 -0
- package/docs/plans/2026-02-21-a2a-49-remaining-tabs-polish.md +375 -0
- package/package.json +1 -1
- package/src/dashboard/public/app.js +564 -400
- package/src/dashboard/public/index.html +194 -125
- package/src/dashboard/public/style.css +919 -109
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
# A2A-49: Dark Theme Polish for Remaining Tabs — Implementation Plan
|
|
2
|
+
|
|
3
|
+
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
|
|
4
|
+
|
|
5
|
+
**Goal:** Apply consistent dark theme styling to Contacts, Calls, Invites, Logs, and Health tabs so the entire dashboard matches the dark visual language from A2A-47.
|
|
6
|
+
|
|
7
|
+
**Architecture:** Pure CSS additions + minor app.js class name changes. A2A-47 already established dark CSS vars, Shoelace dark theme, and dark table/card base styles. This ticket fills in the gaps: table hover states, clickable row cursors, status accent colors, glass-panel on cards, filter area backgrounds, and consistent monospace styling. No API/route/data changes.
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** CSS custom properties, Shoelace dark theme, existing render functions in app.js
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## What A2A-47 Already Handles (DO NOT duplicate)
|
|
14
|
+
|
|
15
|
+
- `:root` dark vars (`--bg`, `--panel`, `--ink`, `--ink-muted`, `--line`, `--accent`, `--card-bg`)
|
|
16
|
+
- `sl-card::part(base)` dark background + border
|
|
17
|
+
- `th` dark header background
|
|
18
|
+
- `#logs-table tr:hover td` hover highlight
|
|
19
|
+
- `#notice` dark toast styling
|
|
20
|
+
- `.transcript` dark background
|
|
21
|
+
- `.summary` pre styling
|
|
22
|
+
- All Shoelace form components (`sl-input`, `sl-select`, `sl-button`, `sl-badge`) via `sl-theme-dark`
|
|
23
|
+
|
|
24
|
+
## What Needs Adding (This Ticket)
|
|
25
|
+
|
|
26
|
+
### CSS gaps:
|
|
27
|
+
1. Table hover for ALL tables (not just logs)
|
|
28
|
+
2. Clickable row cursor for calls-table and contacts tables
|
|
29
|
+
3. Contact status accent dots (colored inline badges)
|
|
30
|
+
4. Subtle filter area background
|
|
31
|
+
5. Log level color coding in table cells
|
|
32
|
+
6. Health pass/fail status color reinforcement
|
|
33
|
+
7. Monospace `<code>` element dark styling
|
|
34
|
+
8. `sl-details` dark summary/header styling
|
|
35
|
+
9. Responsive sidebar collapse: hide `.perm-sidebar` below breakpoint (already done)
|
|
36
|
+
|
|
37
|
+
### app.js gaps:
|
|
38
|
+
1. Add `data-status` attribute to contact status cells for CSS color targeting
|
|
39
|
+
2. Add `data-level` attribute to log level cells for CSS color coding
|
|
40
|
+
3. Add `data-clickable` or cursor class to clickable table rows
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Task 1: CSS — Universal table hover + clickable rows
|
|
45
|
+
|
|
46
|
+
**Files:**
|
|
47
|
+
- Modify: `src/dashboard/public/style.css` (after existing `#logs-table tr:hover td` rule ~line 294)
|
|
48
|
+
|
|
49
|
+
**Step 1: Add universal table row hover and clickable cursor styles**
|
|
50
|
+
|
|
51
|
+
Add these CSS rules after the existing `#logs-table` hover rule:
|
|
52
|
+
|
|
53
|
+
```css
|
|
54
|
+
/* A2A-49: Universal dark table row hover for all tabs.
|
|
55
|
+
Uses 0.04 to match the existing logs hover opacity from A2A-47. */
|
|
56
|
+
table tbody tr:hover td {
|
|
57
|
+
background: rgba(255, 255, 255, 0.04);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* A2A-49: Contacts rows use buttons inside cells (not full-row click),
|
|
61
|
+
so they don't get cursor:pointer — only calls rows do. */
|
|
62
|
+
|
|
63
|
+
/* A2A-49: Clickable table rows get pointer cursor */
|
|
64
|
+
#calls-table tbody tr {
|
|
65
|
+
cursor: pointer;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
#calls-table tbody tr:hover td {
|
|
69
|
+
background: rgba(59, 130, 246, 0.08);
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Step 2: Remove the now-redundant `#logs-table` specific hover rule**
|
|
74
|
+
|
|
75
|
+
The universal `table tbody tr:hover td` covers logs. Remove lines 292-295:
|
|
76
|
+
```css
|
|
77
|
+
/* REMOVE: A2A-47: Dark hover for log rows replacing light #f6fbff */
|
|
78
|
+
#logs-table tr:hover td {
|
|
79
|
+
background: rgba(255, 255, 255, 0.04);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Step 3: Run tests**
|
|
84
|
+
|
|
85
|
+
Run: `npm test`
|
|
86
|
+
Expected: All 339 tests pass (CSS-only change, no backend impact)
|
|
87
|
+
|
|
88
|
+
**Step 4: Commit**
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
git add src/dashboard/public/style.css
|
|
92
|
+
git commit -m "style(A2A-49): universal dark table hover and clickable row cursor"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Task 2: CSS — Contact status dots + log level colors
|
|
98
|
+
|
|
99
|
+
**Files:**
|
|
100
|
+
- Modify: `src/dashboard/public/style.css` (add new section)
|
|
101
|
+
- Modify: `src/dashboard/public/app.js` (renderContacts, renderLogs)
|
|
102
|
+
|
|
103
|
+
**Step 1: Add status dot and log level CSS**
|
|
104
|
+
|
|
105
|
+
Append to style.css:
|
|
106
|
+
|
|
107
|
+
```css
|
|
108
|
+
/* A2A-49: Contact status colored badges */
|
|
109
|
+
.contact-status {
|
|
110
|
+
display: inline-flex;
|
|
111
|
+
align-items: center;
|
|
112
|
+
gap: 0.35rem;
|
|
113
|
+
font-size: 0.82rem;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.contact-status::before {
|
|
117
|
+
content: '';
|
|
118
|
+
width: 6px;
|
|
119
|
+
height: 6px;
|
|
120
|
+
border-radius: 50%;
|
|
121
|
+
flex-shrink: 0;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.contact-status[data-status="online"]::before {
|
|
125
|
+
background: #10B981;
|
|
126
|
+
box-shadow: 0 0 6px rgba(16, 185, 129, 0.6);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.contact-status[data-status="offline"]::before {
|
|
130
|
+
background: #EF4444;
|
|
131
|
+
box-shadow: 0 0 6px rgba(239, 68, 68, 0.4);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.contact-status[data-status="unknown"]::before {
|
|
135
|
+
background: #6B7280;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* A2A-49: Log level color coding */
|
|
139
|
+
.log-level {
|
|
140
|
+
font-size: 0.78rem;
|
|
141
|
+
font-weight: 600;
|
|
142
|
+
text-transform: uppercase;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.log-level[data-level="error"] {
|
|
146
|
+
color: #F87171;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.log-level[data-level="warn"] {
|
|
150
|
+
color: #FBBF24;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.log-level[data-level="info"] {
|
|
154
|
+
color: #60A5FA;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.log-level[data-level="debug"] {
|
|
158
|
+
color: #A78BFA;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.log-level[data-level="trace"] {
|
|
162
|
+
color: #6B7280;
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Step 2: Update renderContacts() status cell in app.js**
|
|
167
|
+
|
|
168
|
+
In `renderContacts()` (app.js ~line 441), change the status cell from:
|
|
169
|
+
```js
|
|
170
|
+
<td>${esc(c?.status || '-')}</td>
|
|
171
|
+
```
|
|
172
|
+
to:
|
|
173
|
+
```js
|
|
174
|
+
<td><span class="contact-status" data-status="${esc(c?.status || 'unknown')}">${esc(c?.status || '-')}</span></td>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Step 3: Update renderLogs() level cell in app.js**
|
|
178
|
+
|
|
179
|
+
In `renderLogs()` (app.js ~line 1110), change:
|
|
180
|
+
```js
|
|
181
|
+
<td>${esc(row.level || '-')}</td>
|
|
182
|
+
```
|
|
183
|
+
to:
|
|
184
|
+
```js
|
|
185
|
+
<td><span class="log-level" data-level="${esc(row.level || '')}">${esc(row.level || '-')}</span></td>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Step 4: Run tests**
|
|
189
|
+
|
|
190
|
+
Run: `npm test`
|
|
191
|
+
Expected: All 339 tests pass
|
|
192
|
+
|
|
193
|
+
**Step 5: Commit**
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
git add src/dashboard/public/style.css src/dashboard/public/app.js
|
|
197
|
+
git commit -m "style(A2A-49): contact status dots and log level color coding"
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Task 3: CSS — Filter area, code elements, and sl-details refinements
|
|
203
|
+
|
|
204
|
+
**Files:**
|
|
205
|
+
- Modify: `src/dashboard/public/style.css`
|
|
206
|
+
|
|
207
|
+
**Step 1: Replace `.filters` rule and add new styles**
|
|
208
|
+
|
|
209
|
+
REPLACE the existing `.filters` block at style.css lines 178-183 with this merged version (keeps grid layout, adds dark polish):
|
|
210
|
+
|
|
211
|
+
```css
|
|
212
|
+
.filters {
|
|
213
|
+
display: grid;
|
|
214
|
+
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
|
215
|
+
gap: 0.6rem;
|
|
216
|
+
margin-bottom: 0.9rem;
|
|
217
|
+
/* A2A-49: Subtle background for filter areas */
|
|
218
|
+
background: rgba(255, 255, 255, 0.02);
|
|
219
|
+
border: 1px solid var(--line);
|
|
220
|
+
border-radius: 10px;
|
|
221
|
+
padding: 0.8rem;
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Then APPEND these new rules to the end of style.css (before the responsive media queries):
|
|
226
|
+
|
|
227
|
+
```css
|
|
228
|
+
/* A2A-49: Dark monospace code elements */
|
|
229
|
+
code {
|
|
230
|
+
background: rgba(255, 255, 255, 0.06);
|
|
231
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
232
|
+
border-radius: 4px;
|
|
233
|
+
padding: 0.1em 0.35em;
|
|
234
|
+
font-size: 0.85em;
|
|
235
|
+
color: #E2E8F0;
|
|
236
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/* A2A-49: pre.summary gets dark background. This SUPPLEMENTS the existing
|
|
240
|
+
.summary rule (max-width + white-space) — do NOT remove .summary. */
|
|
241
|
+
pre.summary {
|
|
242
|
+
background: rgba(255, 255, 255, 0.03);
|
|
243
|
+
border: 1px solid var(--line);
|
|
244
|
+
border-radius: 6px;
|
|
245
|
+
padding: 0.75em;
|
|
246
|
+
color: var(--ink);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/* A2A-49: sl-details summary bar dark polish */
|
|
250
|
+
sl-details::part(summary) {
|
|
251
|
+
font-weight: 500;
|
|
252
|
+
color: var(--ink);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
sl-details::part(base) {
|
|
256
|
+
background: var(--card-bg);
|
|
257
|
+
border-color: var(--line);
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Step 2: Run tests**
|
|
262
|
+
|
|
263
|
+
Run: `npm test`
|
|
264
|
+
Expected: All 339 tests pass
|
|
265
|
+
|
|
266
|
+
**Step 3: Commit**
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
git add src/dashboard/public/style.css
|
|
270
|
+
git commit -m "style(A2A-49): filter area background, code elements, sl-details polish"
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Task 4: CSS — Health tab status colors
|
|
276
|
+
|
|
277
|
+
**Files:**
|
|
278
|
+
- Modify: `src/dashboard/public/style.css`
|
|
279
|
+
|
|
280
|
+
**Step 1: Add health-specific styles**
|
|
281
|
+
|
|
282
|
+
Append to style.css:
|
|
283
|
+
|
|
284
|
+
```css
|
|
285
|
+
/* A2A-49: Health card gets glass-panel treatment via CSS (not index.html).
|
|
286
|
+
The acceptance criterion requires glass-panel styling on #health-latest.
|
|
287
|
+
We target the sl-card shadow DOM part directly. */
|
|
288
|
+
#health-latest::part(base) {
|
|
289
|
+
background: rgba(30, 41, 59, 0.4);
|
|
290
|
+
backdrop-filter: blur(12px);
|
|
291
|
+
border-color: rgba(255, 255, 255, 0.08);
|
|
292
|
+
border-radius: 10px;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/* A2A-49: Health tab — step icons and status reinforcement.
|
|
296
|
+
Shoelace badge variants (success/danger/warning) already provide
|
|
297
|
+
green/red/yellow colors in dark theme — no override needed. */
|
|
298
|
+
#health-latest details ul {
|
|
299
|
+
list-style: none;
|
|
300
|
+
padding-left: 0;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
#health-latest details li {
|
|
304
|
+
padding: 0.3rem 0;
|
|
305
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
|
|
306
|
+
font-size: 0.85rem;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
#health-latest details li:last-child {
|
|
310
|
+
border-bottom: none;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/* A2A-49: Native <details> dark styling inside health cards */
|
|
314
|
+
#health-latest details > summary {
|
|
315
|
+
cursor: pointer;
|
|
316
|
+
color: var(--ink-muted);
|
|
317
|
+
font-size: 0.85rem;
|
|
318
|
+
padding: 0.3rem 0;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
#health-latest details > summary:hover {
|
|
322
|
+
color: var(--ink);
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
**Step 2: Run tests**
|
|
327
|
+
|
|
328
|
+
Run: `npm test`
|
|
329
|
+
Expected: All 339 tests pass
|
|
330
|
+
|
|
331
|
+
**Step 3: Commit**
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
git add src/dashboard/public/style.css
|
|
335
|
+
git commit -m "style(A2A-49): health tab step list and details styling"
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Task 5: Final visual verification + merge commit
|
|
341
|
+
|
|
342
|
+
**Step 1: Run full test suite**
|
|
343
|
+
|
|
344
|
+
Run: `npm test`
|
|
345
|
+
Expected: All 339 tests pass
|
|
346
|
+
|
|
347
|
+
**Step 2: Check diff size**
|
|
348
|
+
|
|
349
|
+
Run: `git diff main --stat`
|
|
350
|
+
Expected: 2 files changed, under 200 lines added. Well within 500-line limit.
|
|
351
|
+
|
|
352
|
+
**Step 3: Verify no backend files changed**
|
|
353
|
+
|
|
354
|
+
Run: `git diff main --name-only`
|
|
355
|
+
Expected: Only `src/dashboard/public/style.css` and `src/dashboard/public/app.js`
|
|
356
|
+
|
|
357
|
+
---
|
|
358
|
+
|
|
359
|
+
## Acceptance Criteria Mapping
|
|
360
|
+
|
|
361
|
+
| Criterion | Addressed In |
|
|
362
|
+
|-----------|-------------|
|
|
363
|
+
| Contacts tab: dark backgrounds, status dots | Task 2 (status dots) + existing sl-card dark styling |
|
|
364
|
+
| Contacts tab: Add Contact form dark theme | Already handled by Shoelace sl-theme-dark |
|
|
365
|
+
| Calls tab: dark header and row styling | Task 1 (universal hover) + existing th dark styling |
|
|
366
|
+
| Calls tab: call detail/transcript dark cards | Task 3 (pre.summary) + existing .transcript styling |
|
|
367
|
+
| Invites tab: form and table dark theme | Already handled by Shoelace + Task 1 (hover) |
|
|
368
|
+
| Logs tab: filter inputs dark theme | Task 3 (filter area background) + Shoelace |
|
|
369
|
+
| Logs tab: dark styling with hover | Task 1 (universal hover replaces logs-specific) |
|
|
370
|
+
| Logs tab: trace detail dark card | Already handled by sl-card dark styling |
|
|
371
|
+
| Health tab: glass-panel styling | Task 4 (health details) + existing sl-card dark |
|
|
372
|
+
| Health tab: dark history table | Task 1 (universal hover) + existing th/td dark |
|
|
373
|
+
| All Shoelace components render correctly | Already handled by sl-theme-dark from A2A-47 |
|
|
374
|
+
| No visual inconsistencies | Consistent use of CSS vars throughout |
|
|
375
|
+
| Tests pass | Verified in each task |
|