@enigmax/dashboard 0.1.112 → 0.1.114
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/assets/index.html +29 -20
- package/package.json +1 -1
package/assets/index.html
CHANGED
|
@@ -25,6 +25,9 @@
|
|
|
25
25
|
--elev: linear-gradient(180deg, rgba(255,255,255,0.045), rgba(255,255,255,0) 42%);
|
|
26
26
|
--shadow-1: 0 1px 2px rgba(0,0,0,0.4);
|
|
27
27
|
--shadow-2: 0 18px 40px -22px rgba(0,0,0,0.75);
|
|
28
|
+
/* Hover borders, scrollbars and the text that sits on a filled accent or good pill. */
|
|
29
|
+
--border-strong: #2f3744; --scrollbar: #2b3340;
|
|
30
|
+
--on-accent: #1a1206; --on-good: #06210f;
|
|
28
31
|
}
|
|
29
32
|
* { box-sizing: border-box; }
|
|
30
33
|
/* An icon never gives up its size to the text beside it. Every svg here is an icon, and
|
|
@@ -60,6 +63,8 @@
|
|
|
60
63
|
otherwise stay glued to the sidebar with all the empty space piled on the right. */
|
|
61
64
|
.content { flex: 1; min-width: 0; padding: 30px 30px 48px; max-width: 1560px; margin-inline: auto; }
|
|
62
65
|
.iconbtn.nav-burger { display: none; }
|
|
66
|
+
/* The rail carries the wordmark; once the rail is a drawer the header shows it instead. */
|
|
67
|
+
.wordmark.mob-brand { display: none; }
|
|
63
68
|
.nav-scrim { position: fixed; inset: 0; z-index: 25; background: rgba(0,0,0,0.6); }
|
|
64
69
|
a { color: var(--accent2); }
|
|
65
70
|
/* Quality floor: one visible keyboard-focus ring for every interactive control
|
|
@@ -133,7 +138,7 @@
|
|
|
133
138
|
}
|
|
134
139
|
/* A faint top-edge highlight so a card reads as a lit surface, not a flat rectangle. */
|
|
135
140
|
.card::before { content: ""; position: absolute; inset: 0; background: var(--elev); pointer-events: none; }
|
|
136
|
-
.card:hover { border-color:
|
|
141
|
+
.card:hover { border-color: var(--border-strong); transform: translateY(-2px); box-shadow: var(--shadow-1), var(--shadow-2); }
|
|
137
142
|
/* Hero KPI (Money Saved): spans two columns, accent-lit - the loudest thing on the page. */
|
|
138
143
|
.card.hero { grid-column: span 2; border-color: rgba(224,164,88,0.35); background: linear-gradient(135deg, var(--accent-weak), transparent 62%), var(--surface); }
|
|
139
144
|
.card.hero .value { font-size: 42px; }
|
|
@@ -171,7 +176,7 @@
|
|
|
171
176
|
transition: color .15s, background .15s, border-color .15s;
|
|
172
177
|
}
|
|
173
178
|
.ranges button:hover { color: var(--text); }
|
|
174
|
-
.ranges button.active { background: var(--accent); color:
|
|
179
|
+
.ranges button.active { background: var(--accent); color: var(--on-accent); border-color: var(--accent); font-weight: 600; }
|
|
175
180
|
.chartwrap { position: relative; width: 100%; height: 280px; }
|
|
176
181
|
/* Suppress the charting library's attribution logo. */
|
|
177
182
|
#tv-attr-logo { display: none !important; }
|
|
@@ -271,8 +276,8 @@
|
|
|
271
276
|
.iconbtn.spinning svg { animation: spin .7s linear infinite; }
|
|
272
277
|
.toggle.with-icon { display: inline-flex; align-items: center; gap: 6px; }
|
|
273
278
|
.toggle.with-icon svg { width: 14px; height: 14px; display: block; }
|
|
274
|
-
.toggle:hover { color: var(--text); border-color:
|
|
275
|
-
.toggle.on { background: var(--good); color:
|
|
279
|
+
.toggle:hover { color: var(--text); border-color: var(--border-strong); }
|
|
280
|
+
.toggle.on { background: var(--good); color: var(--on-good); border-color: var(--good); font-weight: 600; }
|
|
276
281
|
/* Boolean settings render as a sliding switch. Only the bool controls carry
|
|
277
282
|
data-kind="bool" - action buttons reuse .toggle and stay buttons. The On/Off
|
|
278
283
|
text is kept for screen readers but pushed off-screen; the knob is drawn with
|
|
@@ -288,12 +293,12 @@
|
|
|
288
293
|
width: 18px; height: 18px; border-radius: 50%; background: #cdd2da;
|
|
289
294
|
transition: left .18s, background .18s;
|
|
290
295
|
}
|
|
291
|
-
.toggle[data-kind="bool"]:hover { border-color:
|
|
296
|
+
.toggle[data-kind="bool"]:hover { border-color: var(--border-strong); }
|
|
292
297
|
.toggle[data-kind="bool"].on { background: var(--good); border-color: var(--good); }
|
|
293
|
-
.toggle[data-kind="bool"].on::after { left: 23px; background:
|
|
298
|
+
.toggle[data-kind="bool"].on::after { left: 23px; background: var(--on-good); }
|
|
294
299
|
/* Compact icon-only button (e.g. Edit), instead of a text button. */
|
|
295
300
|
.iconbtn { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 30px; padding: 0; background: var(--surface2); color: var(--muted); border: 1px solid var(--border); border-radius: var(--radius-sm); cursor: pointer; transition: color .15s, border-color .15s, transform .1s; }
|
|
296
|
-
.iconbtn:hover { color: var(--accent); border-color:
|
|
301
|
+
.iconbtn:hover { color: var(--accent); border-color: var(--border-strong); }
|
|
297
302
|
.iconbtn svg { width: 15px; height: 15px; display: block; }
|
|
298
303
|
select.choice {
|
|
299
304
|
background: var(--surface2); color: var(--text); border: 1px solid var(--border);
|
|
@@ -432,8 +437,8 @@
|
|
|
432
437
|
/* Per-agent skill toggles: one pill per app (the app's icon), green when the skill is on for it; the app name is the tooltip. */
|
|
433
438
|
.set-agents { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 8px; }
|
|
434
439
|
.achip { display: inline-flex; align-items: center; justify-content: center; padding: 5px 8px; border-radius: 999px; border: 1px solid var(--border); background: var(--surface2); color: var(--muted); cursor: pointer; text-decoration: none; transition: color .15s, background .15s, border-color .15s; }
|
|
435
|
-
.achip:hover { border-color:
|
|
436
|
-
.achip.on { background: var(--good); color:
|
|
440
|
+
.achip:hover { border-color: var(--border-strong); color: var(--text); }
|
|
441
|
+
.achip.on { background: var(--good); color: var(--on-good); border-color: var(--good); }
|
|
437
442
|
.achip:disabled { opacity: .35; cursor: not-allowed; }
|
|
438
443
|
.achip svg { width: 14px; height: 14px; display: block; }
|
|
439
444
|
/* Inline app icons in the "where deployed" tag (static, name in tooltip). */
|
|
@@ -494,10 +499,10 @@
|
|
|
494
499
|
/* Both halves hold text of unpredictable length (a setting label, a port, a model id, a
|
|
495
500
|
command), so the row is built to shrink rather than to push: min-width:0 defeats the
|
|
496
501
|
default min-width:auto that makes a flex/grid item refuse to go below its content
|
|
497
|
-
width,
|
|
498
|
-
|
|
502
|
+
width, the two grid columns keep the state on the right of every card (a wrapping
|
|
503
|
+
flex row put it under the label in some cards and beside it in others), and overflow-wrap:anywhere lets a long unbroken label break (unlike break-word,
|
|
499
504
|
it also lowers min-content, which is what stops the grid track being forced wider). */
|
|
500
|
-
.sys-item { display:
|
|
505
|
+
.sys-item { display: grid; grid-template-columns: minmax(min(100%, 140px), 1fr) minmax(0, auto); align-items: center; gap: 6px 12px; min-width: 0; padding: 11px 14px; font-size: 13px; background: var(--surface2); border: 1px solid var(--border-soft); border-radius: var(--radius-sm); }
|
|
501
506
|
.sys-item .k { color: var(--text); min-width: 0; overflow-wrap: anywhere; }
|
|
502
507
|
.sys-item .v { display: flex; gap: 6px; flex-wrap: wrap; justify-content: flex-end; flex: 0 1 auto; min-width: 0; }
|
|
503
508
|
.sys-item .v .tag { overflow-wrap: anywhere; }
|
|
@@ -505,13 +510,13 @@
|
|
|
505
510
|
.sys-item .pill.off { background: transparent; }
|
|
506
511
|
/* Rows whose value is a list of chips span the full width and let the chips wrap with
|
|
507
512
|
even spacing, instead of cramming many tags into one compact half-column cell. */
|
|
508
|
-
.sys-item.wide { grid-column: 1 / -1; flex-direction: column; align-items: stretch; gap: 8px; }
|
|
513
|
+
.sys-item.wide { grid-column: 1 / -1; display: flex; flex-direction: column; align-items: stretch; gap: 8px; }
|
|
509
514
|
.sys-item.wide .v { display: flex; flex-wrap: wrap; gap: 6px; justify-content: flex-start; }
|
|
510
515
|
.sys-item.wide .v .tag { margin-left: 0; }
|
|
511
516
|
.pill { font-size: 11px; border-radius: 6px; padding: 2px 9px; border: 1px solid var(--border); white-space: nowrap; }
|
|
512
|
-
.pill.on { color:
|
|
517
|
+
.pill.on { color: var(--on-good); background: var(--good); border-color: var(--good); font-weight: 600; }
|
|
513
518
|
.pill.off { color: var(--muted); background: var(--surface2); }
|
|
514
|
-
.pill.lvl { color:
|
|
519
|
+
.pill.lvl { color: var(--on-accent); background: var(--accent); border-color: var(--accent); font-weight: 600; }
|
|
515
520
|
/* Claude operational-status pill (status.claude.com). */
|
|
516
521
|
.cstatus { display: inline-flex; align-items: center; gap: 7px; font-family: var(--mono); font-size: 12px; color: var(--muted); padding: 5px 11px; background: rgba(0,0,0,0.25); border: 1px solid var(--border-soft); border-radius: 999px; white-space: nowrap; }
|
|
517
522
|
.cdot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); flex: 0 0 auto; }
|
|
@@ -577,6 +582,7 @@
|
|
|
577
582
|
}
|
|
578
583
|
.sidebar.open { transform: none; }
|
|
579
584
|
.iconbtn.side-x, .iconbtn.nav-burger { display: inline-flex; }
|
|
585
|
+
.wordmark.mob-brand { display: inline-flex; font-size: 18px; }
|
|
580
586
|
.content { padding: 18px; }
|
|
581
587
|
.tabs .tab { padding: 11px 12px; font-size: 13.5px; }
|
|
582
588
|
body.nav-open { overflow: hidden; }
|
|
@@ -585,7 +591,9 @@
|
|
|
585
591
|
.content { padding: 16px; }
|
|
586
592
|
.grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
587
593
|
header { gap: 12px; }
|
|
588
|
-
|
|
594
|
+
/* Burger and wordmark share the first row; the toolbar takes a full row below. */
|
|
595
|
+
.nav { margin-left: 0; flex-basis: 100%; flex-wrap: wrap; gap: 10px; }
|
|
596
|
+
.nav .cmdk { flex: 1 1 auto; }
|
|
589
597
|
/* A settings row is label + controls side by side, and the control cluster is
|
|
590
598
|
flex-shrink: 0 so a wide one (account actions, a select plus three buttons)
|
|
591
599
|
pushes the row past the viewport. Here the row wraps and the cluster is
|
|
@@ -600,11 +608,11 @@
|
|
|
600
608
|
.set-ctl { flex-shrink: 1; min-width: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
|
|
601
609
|
}
|
|
602
610
|
/* Pretty scrollbars across the whole dashboard (thin, rounded, themed). */
|
|
603
|
-
* { scrollbar-width: thin; scrollbar-color:
|
|
611
|
+
* { scrollbar-width: thin; scrollbar-color: var(--scrollbar) transparent; }
|
|
604
612
|
::-webkit-scrollbar { width: 10px; height: 10px; }
|
|
605
613
|
::-webkit-scrollbar-track { background: transparent; }
|
|
606
614
|
::-webkit-scrollbar-corner { background: transparent; }
|
|
607
|
-
::-webkit-scrollbar-thumb { background:
|
|
615
|
+
::-webkit-scrollbar-thumb { background: var(--scrollbar); border-radius: 999px; }
|
|
608
616
|
::-webkit-scrollbar-thumb:hover { background: #3a4150; }
|
|
609
617
|
/* Scope selector (global vs a project) in the header. */
|
|
610
618
|
.scope-wrap { display: inline-flex; align-items: center; gap: 6px; }
|
|
@@ -719,7 +727,7 @@
|
|
|
719
727
|
picker is a custom listbox - the logo shows on the button AND inside every option. */
|
|
720
728
|
.dd { position: relative; }
|
|
721
729
|
.dd-btn { display: inline-flex; align-items: center; gap: 8px; min-width: 170px; background: var(--surface2); color: var(--text); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 6px 10px; font-size: 12px; font-family: var(--mono); cursor: pointer; }
|
|
722
|
-
.dd-btn:hover { border-color:
|
|
730
|
+
.dd-btn:hover { border-color: var(--border-strong); }
|
|
723
731
|
.dd-btn .dd-label { flex: 1; text-align: left; }
|
|
724
732
|
.dd-btn .dd-caret { width: 13px; height: 13px; flex: 0 0 auto; color: var(--muted); }
|
|
725
733
|
.dd-ic { display: inline-flex; align-items: center; }
|
|
@@ -749,7 +757,7 @@
|
|
|
749
757
|
border-radius: var(--radius-sm); padding: 11px 13px; font-size: 13px; font-family: var(--mono);
|
|
750
758
|
transition: border-color .15s, background .15s, transform .1s;
|
|
751
759
|
}
|
|
752
|
-
.pick-card:hover { border-color:
|
|
760
|
+
.pick-card:hover { border-color: var(--border-strong); }
|
|
753
761
|
.pick-card:active { transform: scale(0.98); }
|
|
754
762
|
.pick-card.sel { border-color: var(--accent); }
|
|
755
763
|
.pick-card svg { width: 20px; height: 20px; display: block; flex: none; color: var(--muted); }
|
|
@@ -897,6 +905,7 @@
|
|
|
897
905
|
<button type="button" id="navOpen" class="iconbtn nav-burger" title="Menu" aria-label="Open the menu" aria-expanded="false" aria-controls="sidebar">
|
|
898
906
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M3 6h18M3 12h18M3 18h18"/></svg>
|
|
899
907
|
</button>
|
|
908
|
+
<div class="wordmark mob-brand" aria-hidden="true">Enigma<span>.</span></div>
|
|
900
909
|
<div class="nav">
|
|
901
910
|
<button type="button" id="palOpen" class="cmdk" aria-label="Search views and projects" aria-haspopup="dialog">
|
|
902
911
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enigmax/dashboard",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.114",
|
|
4
4
|
"description": "Local browser dashboard UI for enigma: the static page and chart assets enigma serves on its loopback dashboard (savings, real tool usage, in-browser settings). Installed on demand by enigma-cli; not a runtime dependency.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|