token-larper 1.0.0 → 1.6.1
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/README.md +37 -10
- package/bin/cli.js +3 -1
- package/llms.txt +2 -2
- package/package.json +6 -4
- package/scripts/run-server.ps1 +6 -1
- package/scripts/tray-host.ps1 +158 -9
- package/src/ccusage.ts +40 -11
- package/src/client/App.tsx +53 -22
- package/src/client/components/Logo.tsx +19 -0
- package/src/client/components/SettingsDialog.tsx +21 -9
- package/src/client/components/ThemeSettings.tsx +116 -41
- package/src/client/components/UpdateBanner.tsx +42 -0
- package/src/client/components/UpdateSettings.tsx +65 -0
- package/src/client/index.html +19 -28
- package/src/client/lib/shareCard.ts +2 -6
- package/src/client/lib/trayTheme.ts +71 -0
- package/src/client/lib/updates.ts +94 -0
- package/src/client/logoMark.ts +103 -0
- package/src/client/main.tsx +3 -0
- package/src/client/styles.css +337 -77
- package/src/client/themes.ts +171 -34
- package/src/paths.ts +48 -0
- package/src/projects.ts +3 -2
- package/src/semver.ts +9 -0
- package/src/server.ts +118 -28
- package/src/startup.ts +36 -4
- package/src/tray.ts +226 -48
- package/src/trayStatus.ts +91 -0
- package/src/types.ts +10 -0
- package/src/updates.ts +62 -0
- package/src/client/logo.svg +0 -8
package/src/client/styles.css
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Token Larper: one theme, defined by tokens. Light is the default; dark swaps the
|
|
2
2
|
tokens on html[data-theme="dark"] (set before first paint by index.html). */
|
|
3
3
|
|
|
4
|
-
:root {
|
|
4
|
+
:root, [data-style="grove"] {
|
|
5
5
|
color-scheme: light;
|
|
6
6
|
--bg: #f7f8f6;
|
|
7
7
|
--surface: #ffffff;
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
--radius-sm: 6px;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
html[data-theme="dark"] {
|
|
50
|
+
html[data-theme="dark"], [data-theme="dark"] [data-style="grove"] {
|
|
51
51
|
color-scheme: dark;
|
|
52
52
|
--bg: #141916;
|
|
53
53
|
--surface: #1b221e;
|
|
@@ -86,77 +86,184 @@ html[data-theme="dark"] {
|
|
|
86
86
|
--heat-4: #a6d8b0;
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
html[data-palette="slate"] {
|
|
98
|
-
color-scheme: light;
|
|
99
|
-
--bg: #f5f6f8; --surface: #fff; --surface-2: #eef1f4; --surface-3: #e5e9ee;
|
|
100
|
-
--border: #dce1e7; --border-strong: #c1cad5; --text: #202833; --text-2: #4c5967; --text-3: #667381;
|
|
101
|
-
--accent: #495d75; --accent-ink: #fff; --accent-soft: #e6edf4; --focus: #536b89;
|
|
102
|
-
}
|
|
103
|
-
html[data-palette="slate"][data-theme="dark"] {
|
|
104
|
-
color-scheme: dark;
|
|
105
|
-
--bg: #14181d; --surface: #1b2128; --surface-2: #232b34; --surface-3: #2c3641;
|
|
106
|
-
--border: #303a45; --border-strong: #46525f; --text: #e8edf3; --text-2: #bbc5d0; --text-3: #9da8b4;
|
|
107
|
-
--accent: #9bb4d2; --accent-ink: #111a24; --accent-soft: #2a3747; --focus: #bfd4eb;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
html[data-palette="ocean"] {
|
|
111
|
-
color-scheme: light;
|
|
112
|
-
--bg: #f3f8fb; --surface: #fff; --surface-2: #eaf2f6; --surface-3: #dce9ef;
|
|
113
|
-
--border: #d4e1e8; --border-strong: #b5cbd6; --text: #18303a; --text-2: #41616e; --text-3: #5d7782;
|
|
114
|
-
--accent: #17627a; --accent-ink: #fff; --accent-soft: #deedf2; --focus: #19718d;
|
|
115
|
-
}
|
|
116
|
-
html[data-palette="ocean"][data-theme="dark"] {
|
|
117
|
-
color-scheme: dark;
|
|
118
|
-
--bg: #111a20; --surface: #17232a; --surface-2: #202f37; --surface-3: #293b44;
|
|
119
|
-
--border: #2a3a43; --border-strong: #405761; --text: #e5f0f3; --text-2: #b0c8d0; --text-3: #91adb7;
|
|
120
|
-
--accent: #78c5d8; --accent-ink: #10232a; --accent-soft: #203d47; --focus: #a5ddeb;
|
|
121
|
-
}
|
|
89
|
+
/* ---------- Styles ----------
|
|
90
|
+
A style is the whole look: fonts, radius, spacing, borders, shadows and label casing,
|
|
91
|
+
plus its own light and dark colors. These blocks also match the preview tiles in
|
|
92
|
+
Settings (an element with data-style), which is how each tile renders in its own style.
|
|
93
|
+
Grove's structure tokens are the defaults for every style (and tile); the style layer
|
|
94
|
+
further down applies them. */
|
|
122
95
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
--
|
|
126
|
-
--
|
|
127
|
-
--
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
--
|
|
132
|
-
--
|
|
133
|
-
--
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
--
|
|
139
|
-
--
|
|
140
|
-
--
|
|
96
|
+
:root, [data-style] {
|
|
97
|
+
--font: "Segoe UI Variable Text", "Segoe UI", system-ui, -apple-system, sans-serif;
|
|
98
|
+
--font-heading: var(--font);
|
|
99
|
+
--font-display: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Palatino, Georgia, serif;
|
|
100
|
+
--heading-weight: 700;
|
|
101
|
+
--heading-tracking: -0.01em;
|
|
102
|
+
--label-transform: none;
|
|
103
|
+
--label-tracking: 0;
|
|
104
|
+
--radius: 10px;
|
|
105
|
+
--radius-sm: 6px;
|
|
106
|
+
--radius-control: 6px;
|
|
107
|
+
--radius-pill: 999px;
|
|
108
|
+
--bar-radius: 4px 4px 0 0;
|
|
109
|
+
--border-w: 1px;
|
|
110
|
+
--panel-border: var(--border);
|
|
111
|
+
--shadow-card: none;
|
|
112
|
+
--shadow-control: none;
|
|
113
|
+
--pad: 20px 22px;
|
|
114
|
+
--kpi-pad: 18px 20px 16px;
|
|
115
|
+
--gap: 20px;
|
|
116
|
+
--control-h: 34px;
|
|
117
|
+
--cell-y: 10px;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* Terminal: monospace everywhere, square corners, dense rows, uppercase labels. */
|
|
121
|
+
[data-style="terminal"] {
|
|
122
|
+
--font: "Cascadia Code", "Cascadia Mono", Consolas, ui-monospace, monospace;
|
|
123
|
+
--font-heading: var(--font);
|
|
124
|
+
--font-display: var(--font);
|
|
125
|
+
--heading-weight: 700;
|
|
126
|
+
--heading-tracking: 0;
|
|
127
|
+
--label-transform: uppercase;
|
|
128
|
+
--label-tracking: 0.06em;
|
|
129
|
+
--radius: 2px;
|
|
130
|
+
--radius-sm: 2px;
|
|
131
|
+
--radius-control: 2px;
|
|
132
|
+
--radius-pill: 2px;
|
|
133
|
+
--bar-radius: 0;
|
|
134
|
+
--pad: 16px 18px;
|
|
135
|
+
--kpi-pad: 14px 16px 12px;
|
|
136
|
+
--gap: 14px;
|
|
137
|
+
--control-h: 30px;
|
|
138
|
+
--cell-y: 7px;
|
|
139
|
+
--bg: #f4f6f1; --surface: #fbfcf8; --surface-2: #eef2ea; --surface-3: #e3e9dd;
|
|
140
|
+
--border: #d3dccd; --border-strong: #aab8a3; --panel-border: var(--border);
|
|
141
|
+
--text: #121a13; --text-2: #34473a; --text-3: #4b5f50;
|
|
142
|
+
--accent: #146c36; --accent-ink: #ffffff; --accent-soft: #dcecdf; --focus: #146c36; --gold: #8a6412;
|
|
143
|
+
}
|
|
144
|
+
[data-theme="dark"][data-style="terminal"], [data-theme="dark"] [data-style="terminal"] {
|
|
145
|
+
--bg: #0b0f0c; --surface: #0f1511; --surface-2: #141c16; --surface-3: #1b261e;
|
|
146
|
+
--border: #1f3024; --border-strong: #2f4a36; --panel-border: var(--border);
|
|
147
|
+
--text: #c8f7d0; --text-2: #8fd19a; --text-3: #74b481;
|
|
148
|
+
--accent: #5cf08a; --accent-ink: #06140a; --accent-soft: #123020; --focus: #5cf08a; --gold: #e8c35a;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* Paper: serif headings on warm paper, hairlines, and generous spacing. */
|
|
152
|
+
[data-style="paper"] {
|
|
153
|
+
--font-heading: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Palatino, Georgia, serif;
|
|
154
|
+
--font-display: var(--font-heading);
|
|
155
|
+
--heading-weight: 600;
|
|
156
|
+
--heading-tracking: 0;
|
|
157
|
+
--radius: 4px;
|
|
158
|
+
--radius-sm: 3px;
|
|
159
|
+
--radius-control: 3px;
|
|
160
|
+
--bar-radius: 1px 1px 0 0;
|
|
161
|
+
--pad: 26px 28px;
|
|
162
|
+
--kpi-pad: 22px 24px 20px;
|
|
163
|
+
--gap: 28px;
|
|
164
|
+
--control-h: 36px;
|
|
165
|
+
--cell-y: 12px;
|
|
166
|
+
--bg: #f5efe3; --surface: #fbf7ee; --surface-2: #f1e9d9; --surface-3: #e7dcc6;
|
|
167
|
+
--border: #e2d6bf; --border-strong: #cbb994; --panel-border: var(--border);
|
|
168
|
+
--text: #2a2118; --text-2: #5b4c3a; --text-3: #6b5a46;
|
|
169
|
+
--accent: #8c2f2b; --accent-ink: #ffffff; --accent-soft: #f1dfd6; --focus: #8c2f2b; --gold: #9a6b16;
|
|
170
|
+
}
|
|
171
|
+
[data-theme="dark"][data-style="paper"], [data-theme="dark"] [data-style="paper"] {
|
|
172
|
+
--bg: #1b1712; --surface: #221d17; --surface-2: #2a241c; --surface-3: #342c22;
|
|
173
|
+
--border: #3a3127; --border-strong: #56483a; --panel-border: var(--border);
|
|
174
|
+
--text: #f1e8da; --text-2: #cdbca4; --text-3: #b3a189;
|
|
175
|
+
--accent: #e0907f; --accent-ink: #2a120e; --accent-soft: #3a2520; --focus: #e0907f; --gold: #e2b867;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/* Brutal: thick ink outlines, hard offset shadows, no rounding, heavy headings. */
|
|
179
|
+
[data-style="brutal"] {
|
|
180
|
+
--font-heading: "Segoe UI Variable Display", "Segoe UI", system-ui, sans-serif;
|
|
181
|
+
--font-display: var(--font-heading);
|
|
182
|
+
--heading-weight: 800;
|
|
183
|
+
--heading-tracking: -0.02em;
|
|
184
|
+
--label-transform: uppercase;
|
|
185
|
+
--label-tracking: 0.04em;
|
|
186
|
+
--radius: 0;
|
|
187
|
+
--radius-sm: 0;
|
|
188
|
+
--radius-control: 0;
|
|
189
|
+
--radius-pill: 0;
|
|
190
|
+
--bar-radius: 0;
|
|
191
|
+
--border-w: 2px;
|
|
192
|
+
--pad: 18px 20px;
|
|
193
|
+
--gap: 22px;
|
|
194
|
+
--control-h: 36px;
|
|
195
|
+
--cell-y: 9px;
|
|
196
|
+
--bg: #fff8e7; --surface: #ffffff; --surface-2: #fff1c9; --surface-3: #ffe79c;
|
|
197
|
+
--border: #111111; --border-strong: #111111; --panel-border: #111111;
|
|
198
|
+
--text: #111111; --text-2: #333333; --text-3: #474747;
|
|
199
|
+
--accent: #d81b60; --accent-ink: #ffffff; --accent-soft: #ffd6e6; --focus: #111111; --gold: #a06d00;
|
|
200
|
+
--shadow-card: 4px 4px 0 #111111;
|
|
201
|
+
--shadow-control: 2px 2px 0 #111111;
|
|
202
|
+
}
|
|
203
|
+
[data-theme="dark"][data-style="brutal"], [data-theme="dark"] [data-style="brutal"] {
|
|
204
|
+
--bg: #121212; --surface: #1c1c1c; --surface-2: #262626; --surface-3: #333333;
|
|
205
|
+
--border: #f5f5f5; --border-strong: #f5f5f5; --panel-border: #f5f5f5;
|
|
206
|
+
--text: #f5f5f5; --text-2: #d4d4d4; --text-3: #bdbdbd;
|
|
207
|
+
--accent: #ff79b0; --accent-ink: #1a0010; --accent-soft: #3d1628; --focus: #ff79b0; --gold: #ffd166;
|
|
208
|
+
--shadow-card: 4px 4px 0 #ff79b0;
|
|
209
|
+
--shadow-control: 2px 2px 0 #ff79b0;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* Soft: big radii, pill controls, borderless cards on soft shadows. */
|
|
213
|
+
[data-style="soft"] {
|
|
214
|
+
--font: "Segoe UI Variable Display", "Segoe UI", system-ui, sans-serif;
|
|
215
|
+
--font-heading: var(--font);
|
|
216
|
+
--heading-weight: 650;
|
|
217
|
+
--heading-tracking: -0.015em;
|
|
218
|
+
--radius: 18px;
|
|
219
|
+
--radius-sm: 12px;
|
|
220
|
+
--radius-control: 999px;
|
|
221
|
+
--bar-radius: 999px 999px 0 0;
|
|
222
|
+
--pad: 24px 26px;
|
|
223
|
+
--kpi-pad: 20px 22px 18px;
|
|
224
|
+
--gap: 24px;
|
|
225
|
+
--control-h: 36px;
|
|
226
|
+
--cell-y: 11px;
|
|
227
|
+
--bg: #f4f2fb; --surface: #ffffff; --surface-2: #f1eefa; --surface-3: #e6e1f5;
|
|
228
|
+
--border: #e7e2f3; --border-strong: #d4cdea; --panel-border: transparent;
|
|
229
|
+
--text: #26213a; --text-2: #585173; --text-3: #635c80;
|
|
230
|
+
--accent: #6d5bd0; --accent-ink: #ffffff; --accent-soft: #ece8fb; --focus: #6d5bd0; --gold: #a86d12;
|
|
231
|
+
--shadow-card: 0 1px 2px rgb(38 33 58 / 6%), 0 10px 30px rgb(38 33 58 / 8%);
|
|
232
|
+
}
|
|
233
|
+
[data-theme="dark"][data-style="soft"], [data-theme="dark"] [data-style="soft"] {
|
|
234
|
+
--bg: #16141f; --surface: #1f1c2b; --surface-2: #272337; --surface-3: #302b42;
|
|
235
|
+
--border: #2e2940; --border-strong: #443d5c; --panel-border: transparent;
|
|
236
|
+
--text: #efecf8; --text-2: #c3bddb; --text-3: #a59fc0;
|
|
237
|
+
--accent: #b3a6ff; --accent-ink: #1b1535; --accent-soft: #2c2645; --focus: #b3a6ff; --gold: #e8b95c;
|
|
238
|
+
--shadow-card: 0 1px 2px rgb(0 0 0 / 30%), 0 12px 32px rgb(0 0 0 / 35%);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/* Mono: black on white in light mode, white on black in dark; the accent is the ink.
|
|
242
|
+
Chart series keep their colors, since tools must stay distinguishable. */
|
|
243
|
+
[data-style="mono"] {
|
|
244
|
+
--radius: 8px;
|
|
245
|
+
--radius-sm: 6px;
|
|
246
|
+
--radius-control: 6px;
|
|
247
|
+
--bar-radius: 2px 2px 0 0;
|
|
248
|
+
--bg: #ffffff; --surface: #ffffff; --surface-2: #f4f4f4; --surface-3: #e8e8e8;
|
|
249
|
+
--border: #e2e2e2; --border-strong: #c4c4c4; --panel-border: var(--border);
|
|
250
|
+
--text: #0a0a0a; --text-2: #404040; --text-3: #595959;
|
|
251
|
+
--accent: #0a0a0a; --accent-ink: #ffffff; --accent-soft: #efefef; --focus: #0a0a0a; --gold: #3a3a3a;
|
|
141
252
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
--
|
|
145
|
-
--
|
|
146
|
-
--accent: #
|
|
253
|
+
[data-theme="dark"][data-style="mono"], [data-theme="dark"] [data-style="mono"] {
|
|
254
|
+
--bg: #000000; --surface: #0a0a0a; --surface-2: #161616; --surface-3: #222222;
|
|
255
|
+
--border: #262626; --border-strong: #3d3d3d; --panel-border: var(--border);
|
|
256
|
+
--text: #fafafa; --text-2: #c4c4c4; --text-3: #a3a3a3;
|
|
257
|
+
--accent: #fafafa; --accent-ink: #0a0a0a; --accent-soft: #1f1f1f; --focus: #fafafa; --gold: #d4d4d4;
|
|
147
258
|
}
|
|
148
259
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
--
|
|
152
|
-
--
|
|
153
|
-
--
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
color-scheme: dark;
|
|
157
|
-
--bg: #1e151a; --surface: #281c22; --surface-2: #35252d; --surface-3: #402d37;
|
|
158
|
-
--border: #45303a; --border-strong: #604450; --text: #f4e9ee; --text-2: #d0b8c2; --text-3: #b499a5;
|
|
159
|
-
--accent: #dfa1b4; --accent-ink: #301a22; --accent-soft: #402a34; --focus: #efbdcc;
|
|
260
|
+
/* Styles other than Grove, and any accent override, derive the calendar ramp from the accent. */
|
|
261
|
+
html[data-style]:not([data-style="grove"]), html[data-accent="custom"] {
|
|
262
|
+
--heat-0: color-mix(in srgb, var(--bg) 94%, var(--text));
|
|
263
|
+
--heat-1: color-mix(in srgb, var(--bg) 78%, var(--accent));
|
|
264
|
+
--heat-2: color-mix(in srgb, var(--bg) 55%, var(--accent));
|
|
265
|
+
--heat-3: color-mix(in srgb, var(--bg) 30%, var(--accent));
|
|
266
|
+
--heat-4: var(--accent);
|
|
160
267
|
}
|
|
161
268
|
|
|
162
269
|
/* ---------- Base ---------- */
|
|
@@ -218,7 +325,7 @@ img { display: block; }
|
|
|
218
325
|
}
|
|
219
326
|
|
|
220
327
|
.brand { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; min-width: 0; }
|
|
221
|
-
.brand-logo { width: 32px; height: 32px; }
|
|
328
|
+
.brand-logo { width: 32px; height: 32px; color: var(--text); }
|
|
222
329
|
.brand h1 { font-size: 15px; font-weight: 700; letter-spacing: -0.01em; }
|
|
223
330
|
|
|
224
331
|
.topbar-actions { display: flex; align-items: center; gap: 8px; }
|
|
@@ -308,6 +415,28 @@ img { display: block; }
|
|
|
308
415
|
font-size: 13px;
|
|
309
416
|
}
|
|
310
417
|
|
|
418
|
+
/* ---------- Update banner ---------- */
|
|
419
|
+
.update-banner {
|
|
420
|
+
display: flex;
|
|
421
|
+
align-items: center;
|
|
422
|
+
gap: 10px;
|
|
423
|
+
margin-bottom: 14px;
|
|
424
|
+
padding: 8px 8px 8px 14px;
|
|
425
|
+
border-radius: var(--radius);
|
|
426
|
+
background: var(--accent-soft);
|
|
427
|
+
color: var(--text);
|
|
428
|
+
font-size: 13px;
|
|
429
|
+
}
|
|
430
|
+
.update-banner > svg { flex: none; color: var(--accent); }
|
|
431
|
+
.update-banner p { flex: 1; min-width: 0; }
|
|
432
|
+
.update-banner p span { color: var(--text-2); }
|
|
433
|
+
.update-banner-actions { display: flex; align-items: center; gap: 6px; flex: none; }
|
|
434
|
+
.update-banner .btn { min-height: 30px; padding: 0 12px; }
|
|
435
|
+
.update-link { color: var(--text-2); font-weight: 500; padding: 0 6px; text-decoration: none; }
|
|
436
|
+
.update-link:hover { color: var(--text); text-decoration: underline; }
|
|
437
|
+
.setting-copy code { font-size: 11.5px; }
|
|
438
|
+
.setting-copy a { color: inherit; }
|
|
439
|
+
|
|
311
440
|
/* ---------- Filters ---------- */
|
|
312
441
|
|
|
313
442
|
.filters {
|
|
@@ -934,12 +1063,6 @@ img { display: block; }
|
|
|
934
1063
|
.settings-section-heading { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
|
|
935
1064
|
.settings-section-heading h4 { font-size: 12.5px; }
|
|
936
1065
|
.settings-section-heading span { color: var(--text-3); font-size: 12px; }
|
|
937
|
-
.theme-mode-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 0 10px; color: var(--text-2); font-size: 12.5px; }
|
|
938
|
-
.palette-picker { margin-bottom: 5px; }
|
|
939
|
-
.palette-picker .select-menu-trigger { height: 50px; padding: 5px 10px; }
|
|
940
|
-
.palette-picker .select-menu-list { width: 100%; }
|
|
941
|
-
.palette-picker .select-menu-option { min-height: 46px; }
|
|
942
|
-
.palette-color { display: block; width: 24px; height: 24px; flex: 0 0 24px; border-radius: 5px; }
|
|
943
1066
|
.theme-import { margin-top: 14px; border-top: 1px solid var(--border); }
|
|
944
1067
|
.theme-import > summary {
|
|
945
1068
|
display: flex;
|
|
@@ -1036,6 +1159,13 @@ html[data-theme="dark"] .toggle.on .toggle-knob { background: var(--accent-ink);
|
|
|
1036
1159
|
.settings-quit { display: inline-flex; align-items: center; gap: 7px; min-height: 34px; padding: 0 8px; border-radius: var(--radius-sm); color: var(--text-2); font-size: 13px; font-weight: 600; }
|
|
1037
1160
|
.settings-quit:hover { background: var(--surface-2); color: var(--error-text); }
|
|
1038
1161
|
|
|
1162
|
+
/* ---------- Credit ---------- */
|
|
1163
|
+
|
|
1164
|
+
.credit { display: flex; justify-content: center; flex-wrap: wrap; gap: 6px 10px; margin-top: 48px; color: var(--text-3); font-size: 12px; }
|
|
1165
|
+
.credit a { color: inherit; text-decoration: underline; text-decoration-color: var(--border-strong); text-underline-offset: 3px; }
|
|
1166
|
+
.credit a:hover { color: var(--text); text-decoration-color: currentColor; }
|
|
1167
|
+
.credit-heart { vertical-align: -1px; color: var(--accent); fill: currentColor; }
|
|
1168
|
+
|
|
1039
1169
|
/* ---------- Splash screens ---------- */
|
|
1040
1170
|
|
|
1041
1171
|
.splash { display: grid; place-items: center; min-height: 100vh; padding: 24px; }
|
|
@@ -1052,7 +1182,135 @@ html[data-theme="dark"] .toggle.on .toggle-knob { background: var(--accent-ink);
|
|
|
1052
1182
|
text-align: center;
|
|
1053
1183
|
}
|
|
1054
1184
|
.splash-card h2 { color: var(--text); font-size: 19px; }
|
|
1055
|
-
.splash-logo { width: 64px; height: 64px; }
|
|
1185
|
+
.splash-logo { width: 64px; height: 64px; color: var(--text); }
|
|
1186
|
+
|
|
1187
|
+
/* ---------- Style layer ----------
|
|
1188
|
+
Maps the style tokens onto components. It sits after the component rules so a style
|
|
1189
|
+
can change them, and before the responsive rules so small screens still win. */
|
|
1190
|
+
|
|
1191
|
+
.brand h1, .intro h2, .panel-head h2, .kpi-value, .mix-list dd strong, .modal-header h3, .splash-card h2 {
|
|
1192
|
+
font-family: var(--font-heading);
|
|
1193
|
+
font-weight: var(--heading-weight);
|
|
1194
|
+
letter-spacing: var(--heading-tracking);
|
|
1195
|
+
}
|
|
1196
|
+
.sheet { --sheet-serif: var(--font-display); }
|
|
1197
|
+
.field-label, .kpi-label, .table th, .subhead, .sheet-row-label, .sheet-numbers dt, .settings-section-heading h4, .theme-row-label {
|
|
1198
|
+
text-transform: var(--label-transform);
|
|
1199
|
+
letter-spacing: var(--label-tracking);
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
.content, .split { gap: var(--gap); }
|
|
1203
|
+
.panel, .kpi-grid {
|
|
1204
|
+
border-width: var(--border-w);
|
|
1205
|
+
border-color: var(--panel-border);
|
|
1206
|
+
border-radius: var(--radius);
|
|
1207
|
+
box-shadow: var(--shadow-card);
|
|
1208
|
+
}
|
|
1209
|
+
.panel { padding: var(--pad); }
|
|
1210
|
+
.kpi { padding: var(--kpi-pad); }
|
|
1211
|
+
.kpi + .kpi { border-left-width: var(--border-w); border-left-color: var(--panel-border); }
|
|
1212
|
+
.table td { padding-top: var(--cell-y); padding-bottom: var(--cell-y); }
|
|
1213
|
+
.uchart-stack { border-radius: var(--bar-radius); }
|
|
1214
|
+
|
|
1215
|
+
.btn, .icon-btn, .field select, .range-trigger, .search, .select-menu-trigger, .segmented {
|
|
1216
|
+
border-width: var(--border-w);
|
|
1217
|
+
border-radius: var(--radius-control);
|
|
1218
|
+
box-shadow: var(--shadow-control);
|
|
1219
|
+
}
|
|
1220
|
+
.btn { min-height: var(--control-h); }
|
|
1221
|
+
.icon-btn { width: var(--control-h); height: var(--control-h); }
|
|
1222
|
+
.segmented button { border-radius: max(0px, calc(var(--radius-control) - 2px)); }
|
|
1223
|
+
.pill, .rank-chip { border-radius: var(--radius-pill); }
|
|
1224
|
+
.rank-chip { border-width: var(--border-w); }
|
|
1225
|
+
.modal, .range-popover, .uchart-tip, .splash-card { border-width: var(--border-w); border-radius: var(--radius); }
|
|
1226
|
+
|
|
1227
|
+
/* Brutal controls press into their shadow. */
|
|
1228
|
+
[data-style="brutal"] .btn:active, [data-style="brutal"] .icon-btn:active {
|
|
1229
|
+
transform: translate(2px, 2px);
|
|
1230
|
+
box-shadow: none;
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
/* ---------- Appearance settings ---------- */
|
|
1234
|
+
|
|
1235
|
+
.theme-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 0 10px; }
|
|
1236
|
+
.theme-row-label { color: var(--text-2); font-size: 12.5px; font-weight: 600; }
|
|
1237
|
+
.theme-block { display: grid; gap: 8px; padding: 8px 0 10px; }
|
|
1238
|
+
|
|
1239
|
+
.style-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(148px, 1fr)); gap: 8px; }
|
|
1240
|
+
.style-card {
|
|
1241
|
+
position: relative;
|
|
1242
|
+
display: grid;
|
|
1243
|
+
gap: 8px;
|
|
1244
|
+
padding: 7px;
|
|
1245
|
+
border: 1px solid var(--border);
|
|
1246
|
+
border-radius: 10px;
|
|
1247
|
+
background: var(--surface);
|
|
1248
|
+
text-align: left;
|
|
1249
|
+
}
|
|
1250
|
+
.style-card:hover { border-color: var(--border-strong); }
|
|
1251
|
+
.style-card[aria-checked="true"] { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); }
|
|
1252
|
+
.style-card-text { display: grid; gap: 1px; padding: 0 3px 2px; }
|
|
1253
|
+
.style-card-text strong { color: var(--text); font-size: 12.5px; font-weight: 650; }
|
|
1254
|
+
.style-card-text span { color: var(--text-3); font-size: 11.5px; line-height: 1.35; }
|
|
1255
|
+
.style-card-check { position: absolute; top: 12px; right: 12px; padding: 2px; border-radius: 50%; background: var(--accent); color: var(--accent-ink); }
|
|
1256
|
+
|
|
1257
|
+
/* Everything inside the preview reads the tile's own style tokens. */
|
|
1258
|
+
.style-preview {
|
|
1259
|
+
display: block;
|
|
1260
|
+
height: 66px;
|
|
1261
|
+
padding: 8px;
|
|
1262
|
+
border-radius: 7px;
|
|
1263
|
+
background: var(--bg);
|
|
1264
|
+
color: var(--text);
|
|
1265
|
+
font-family: var(--font-heading);
|
|
1266
|
+
overflow: hidden;
|
|
1267
|
+
}
|
|
1268
|
+
.sp-panel {
|
|
1269
|
+
display: grid;
|
|
1270
|
+
grid-template-columns: auto minmax(0, 1fr) auto;
|
|
1271
|
+
align-items: end;
|
|
1272
|
+
gap: 10px;
|
|
1273
|
+
height: 100%;
|
|
1274
|
+
padding: 6px 9px;
|
|
1275
|
+
border: var(--border-w) solid var(--panel-border);
|
|
1276
|
+
border-radius: min(var(--radius), 10px);
|
|
1277
|
+
background: var(--surface);
|
|
1278
|
+
box-shadow: var(--shadow-card);
|
|
1279
|
+
}
|
|
1280
|
+
.sp-title { align-self: center; font-size: 19px; font-weight: var(--heading-weight); letter-spacing: var(--heading-tracking); line-height: 1; }
|
|
1281
|
+
.sp-bars { display: flex; align-items: flex-end; gap: 3px; height: 100%; }
|
|
1282
|
+
.sp-bars i { width: 8px; border-radius: var(--bar-radius); background: var(--accent); }
|
|
1283
|
+
.sp-button { align-self: center; width: 26px; height: 12px; border-radius: min(var(--radius-control), 6px); background: var(--accent); box-shadow: var(--shadow-control); }
|
|
1284
|
+
|
|
1285
|
+
.accent-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
|
|
1286
|
+
.accent-default {
|
|
1287
|
+
height: 30px;
|
|
1288
|
+
padding: 0 11px;
|
|
1289
|
+
border: 1px solid var(--border-strong);
|
|
1290
|
+
border-radius: 999px;
|
|
1291
|
+
color: var(--text-2);
|
|
1292
|
+
font-size: 12px;
|
|
1293
|
+
font-weight: 600;
|
|
1294
|
+
}
|
|
1295
|
+
.accent-default[aria-checked="true"] { border-color: var(--text); color: var(--text); }
|
|
1296
|
+
.accent-swatch { width: 28px; height: 28px; border: 2px solid var(--surface); border-radius: 50%; box-shadow: 0 0 0 1px var(--border-strong); }
|
|
1297
|
+
.accent-swatch[aria-checked="true"] { box-shadow: 0 0 0 2px var(--text); }
|
|
1298
|
+
.accent-custom {
|
|
1299
|
+
position: relative;
|
|
1300
|
+
display: grid;
|
|
1301
|
+
place-items: center;
|
|
1302
|
+
width: 28px;
|
|
1303
|
+
height: 28px;
|
|
1304
|
+
border: 1px dashed var(--border-strong);
|
|
1305
|
+
border-radius: 50%;
|
|
1306
|
+
color: var(--text-2);
|
|
1307
|
+
cursor: pointer;
|
|
1308
|
+
overflow: hidden;
|
|
1309
|
+
}
|
|
1310
|
+
.accent-custom.is-selected { border: 2px solid var(--surface); box-shadow: 0 0 0 2px var(--text); color: #fff; }
|
|
1311
|
+
.accent-custom.is-selected svg { mix-blend-mode: difference; }
|
|
1312
|
+
.accent-custom input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }
|
|
1313
|
+
.accent-custom:focus-within { outline: 2px solid var(--focus); outline-offset: 2px; }
|
|
1056
1314
|
|
|
1057
1315
|
/* ---------- Responsive ---------- */
|
|
1058
1316
|
|
|
@@ -1064,6 +1322,8 @@ html[data-theme="dark"] .toggle.on .toggle-knob { background: var(--accent-ink);
|
|
|
1064
1322
|
}
|
|
1065
1323
|
|
|
1066
1324
|
@media (max-width: 700px) {
|
|
1325
|
+
.update-banner { flex-wrap: wrap; }
|
|
1326
|
+
.update-banner-actions { width: 100%; justify-content: flex-end; }
|
|
1067
1327
|
.app { padding: 0 16px 48px; }
|
|
1068
1328
|
.topbar { margin: 0 -16px; padding: 12px 16px; }
|
|
1069
1329
|
.updated { display: none; }
|