@dstally/vue 1.0.0 → 1.2.0
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 +15 -1
- package/dist/index.d.ts +197 -2
- package/dist/style.css +1 -1
- package/dist/tally-vue.js +746 -366
- package/dist/tally-vue.umd.cjs +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -33,8 +33,22 @@ Importing anything from `@dstally/vue` also loads `@dstally/tokens/styles.css`;
|
|
|
33
33
|
| `TProjectDot` `TProjectRow` | project identity and the 38px list line |
|
|
34
34
|
| `TTimerPill` | the floating always-visible timer |
|
|
35
35
|
| `TWaterfallTimeline` | parallel-time visualisation for reports |
|
|
36
|
+
| `TBudgetBar` | budget burn-down, pro-rated target, red when over |
|
|
37
|
+
| `TWindowChrome` | desktop title bar per platform (mac / windows / linux) |
|
|
38
|
+
| `TTabBar` `TTimerBar` | phone navigation and the pill's mobile form |
|
|
39
|
+
| `TAuthCard` `TCodeInput` | auth layout unit and 6-digit code entry |
|
|
40
|
+
| `TEmptyState` `TAvatar` | empty lists; initials avatar |
|
|
36
41
|
|
|
37
|
-
Also exported: `formatDuration(seconds, 'clock' | 'short' | 'compact')`, `PROJECT_COLORS`.
|
|
42
|
+
Also exported: `formatDuration(seconds, 'clock' | 'short' | 'compact')`, `PROJECT_COLORS`, `TALLY_ICON_BASE`, `DEFAULT_ICON_BASE`.
|
|
43
|
+
|
|
44
|
+
`TIcon` masks its glyph from `https://unpkg.com/lucide-static@latest/icons/`. Self-host the glyphs and point every icon at them in one line — an iOS WebView under `tauri://localhost` needs this, because it cannot paint a cross-origin mask:
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import { TALLY_ICON_BASE } from '@dstally/vue'
|
|
48
|
+
app.provide(TALLY_ICON_BASE, '/icons/')
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
A `base` prop on a single `TIcon` still wins over the provided value.
|
|
38
52
|
|
|
39
53
|
## Rules
|
|
40
54
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ComponentOptionsMixin } from 'vue';
|
|
2
2
|
import { ComponentProvideOptions } from 'vue';
|
|
3
3
|
import { DefineComponent } from 'vue';
|
|
4
|
+
import { InjectionKey } from 'vue';
|
|
4
5
|
import { PublicProps } from 'vue';
|
|
5
6
|
|
|
6
7
|
declare const __VLS_component: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
@@ -15,6 +16,15 @@ fullWidth: boolean;
|
|
|
15
16
|
type: "button" | "submit" | "reset";
|
|
16
17
|
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLButtonElement>;
|
|
17
18
|
|
|
19
|
+
declare const __VLS_component_10: DefineComponent<__VLS_Props_25, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_25> & Readonly<{}>, {
|
|
20
|
+
width: number;
|
|
21
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
22
|
+
|
|
23
|
+
declare const __VLS_component_11: DefineComponent<__VLS_Props_26, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_26> & Readonly<{}>, {
|
|
24
|
+
compact: boolean;
|
|
25
|
+
icon: string;
|
|
26
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
27
|
+
|
|
18
28
|
declare const __VLS_component_2: DefineComponent<__VLS_Props_2, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
19
29
|
click: (e: MouseEvent) => any;
|
|
20
30
|
}, string, PublicProps, Readonly<__VLS_Props_2> & Readonly<{
|
|
@@ -66,6 +76,19 @@ width: number;
|
|
|
66
76
|
teleport: boolean;
|
|
67
77
|
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
|
|
68
78
|
|
|
79
|
+
declare const __VLS_component_9: DefineComponent<__VLS_Props_21, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
80
|
+
close: () => any;
|
|
81
|
+
minimize: () => any;
|
|
82
|
+
maximize: () => any;
|
|
83
|
+
}, string, PublicProps, Readonly<__VLS_Props_21> & Readonly<{
|
|
84
|
+
onClose?: (() => any) | undefined;
|
|
85
|
+
onMinimize?: (() => any) | undefined;
|
|
86
|
+
onMaximize?: (() => any) | undefined;
|
|
87
|
+
}>, {
|
|
88
|
+
height: number;
|
|
89
|
+
platform: "mac" | "windows" | "linux";
|
|
90
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
91
|
+
|
|
69
92
|
declare type __VLS_Props = {
|
|
70
93
|
/** Only one primary per view. */
|
|
71
94
|
variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger';
|
|
@@ -179,6 +202,65 @@ declare type __VLS_Props_20 = {
|
|
|
179
202
|
labelWidth?: number;
|
|
180
203
|
};
|
|
181
204
|
|
|
205
|
+
/** Title-bar affordances per desktop platform. In Tauri: decorations=false, this element is the drag region (data-tauri-drag-region). */
|
|
206
|
+
declare type __VLS_Props_21 = {
|
|
207
|
+
platform?: 'mac' | 'windows' | 'linux';
|
|
208
|
+
title?: string;
|
|
209
|
+
height?: number;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
declare type __VLS_Props_22 = {
|
|
213
|
+
items: TabBarItem[];
|
|
214
|
+
modelValue: string;
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
/** The pill's mobile form: persistent 56px bar above the tab bar. Tap opens the running-timers sheet. */
|
|
218
|
+
declare type __VLS_Props_23 = {
|
|
219
|
+
project: string;
|
|
220
|
+
task?: string;
|
|
221
|
+
color?: string;
|
|
222
|
+
seconds?: number;
|
|
223
|
+
running?: boolean;
|
|
224
|
+
parallelCount?: number;
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
declare type __VLS_Props_24 = {
|
|
228
|
+
modelValue?: string;
|
|
229
|
+
length?: number;
|
|
230
|
+
error?: string;
|
|
231
|
+
autofocus?: boolean;
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
/** Auth layout unit: mark, headline, one line of context, form slot, footer slot. 400px max; fills width on phones. */
|
|
235
|
+
declare type __VLS_Props_25 = {
|
|
236
|
+
title: string;
|
|
237
|
+
description?: string;
|
|
238
|
+
width?: number;
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
declare type __VLS_Props_26 = {
|
|
242
|
+
icon?: string;
|
|
243
|
+
title: string;
|
|
244
|
+
description?: string;
|
|
245
|
+
compact?: boolean;
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
declare type __VLS_Props_27 = {
|
|
249
|
+
name: string;
|
|
250
|
+
src?: string;
|
|
251
|
+
size?: number;
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
/** Budget burn-down: used vs pro-rated target. Red when over. Caption states the period and that the target is pro-rated. */
|
|
255
|
+
declare type __VLS_Props_28 = {
|
|
256
|
+
label: string;
|
|
257
|
+
color?: string;
|
|
258
|
+
usedSeconds?: number;
|
|
259
|
+
targetSeconds?: number;
|
|
260
|
+
period?: string;
|
|
261
|
+
compact?: boolean;
|
|
262
|
+
};
|
|
263
|
+
|
|
182
264
|
declare type __VLS_Props_3 = {
|
|
183
265
|
modelValue?: string | number;
|
|
184
266
|
label?: string;
|
|
@@ -235,7 +317,7 @@ declare type __VLS_Props_8 = {
|
|
|
235
317
|
/** 16 in the app, 20 in the site header, 24 in marketing rows. */
|
|
236
318
|
size?: number;
|
|
237
319
|
color?: string;
|
|
238
|
-
/**
|
|
320
|
+
/** Where this one glyph is masked from. Wins over the `TALLY_ICON_BASE` injection key, which every app can set once with `app.provide(TALLY_ICON_BASE, '/icons/')` and which itself falls back to `https://unpkg.com/lucide-static@latest/icons/`. Self-host and provide the key in an iOS WebView, which cannot paint a cross-origin mask. */
|
|
239
321
|
base?: string;
|
|
240
322
|
};
|
|
241
323
|
|
|
@@ -259,6 +341,26 @@ declare function __VLS_template(): {
|
|
|
259
341
|
rootEl: HTMLButtonElement;
|
|
260
342
|
};
|
|
261
343
|
|
|
344
|
+
declare function __VLS_template_10(): {
|
|
345
|
+
attrs: Partial<{}>;
|
|
346
|
+
slots: {
|
|
347
|
+
description?(_: {}): any;
|
|
348
|
+
default?(_: {}): any;
|
|
349
|
+
footer?(_: {}): any;
|
|
350
|
+
};
|
|
351
|
+
refs: {};
|
|
352
|
+
rootEl: HTMLDivElement;
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
declare function __VLS_template_11(): {
|
|
356
|
+
attrs: Partial<{}>;
|
|
357
|
+
slots: {
|
|
358
|
+
default?(_: {}): any;
|
|
359
|
+
};
|
|
360
|
+
refs: {};
|
|
361
|
+
rootEl: HTMLDivElement;
|
|
362
|
+
};
|
|
363
|
+
|
|
262
364
|
declare function __VLS_template_2(): {
|
|
263
365
|
attrs: Partial<{}>;
|
|
264
366
|
slots: {
|
|
@@ -326,8 +428,21 @@ declare function __VLS_template_8(): {
|
|
|
326
428
|
rootEl: any;
|
|
327
429
|
};
|
|
328
430
|
|
|
431
|
+
declare function __VLS_template_9(): {
|
|
432
|
+
attrs: Partial<{}>;
|
|
433
|
+
slots: {
|
|
434
|
+
default?(_: {}): any;
|
|
435
|
+
};
|
|
436
|
+
refs: {};
|
|
437
|
+
rootEl: HTMLDivElement;
|
|
438
|
+
};
|
|
439
|
+
|
|
329
440
|
declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
|
|
330
441
|
|
|
442
|
+
declare type __VLS_TemplateResult_10 = ReturnType<typeof __VLS_template_10>;
|
|
443
|
+
|
|
444
|
+
declare type __VLS_TemplateResult_11 = ReturnType<typeof __VLS_template_11>;
|
|
445
|
+
|
|
331
446
|
declare type __VLS_TemplateResult_2 = ReturnType<typeof __VLS_template_2>;
|
|
332
447
|
|
|
333
448
|
declare type __VLS_TemplateResult_3 = ReturnType<typeof __VLS_template_3>;
|
|
@@ -342,12 +457,26 @@ declare type __VLS_TemplateResult_7 = ReturnType<typeof __VLS_template_7>;
|
|
|
342
457
|
|
|
343
458
|
declare type __VLS_TemplateResult_8 = ReturnType<typeof __VLS_template_8>;
|
|
344
459
|
|
|
460
|
+
declare type __VLS_TemplateResult_9 = ReturnType<typeof __VLS_template_9>;
|
|
461
|
+
|
|
345
462
|
declare type __VLS_WithTemplateSlots<T, S> = T & {
|
|
346
463
|
new (): {
|
|
347
464
|
$slots: S;
|
|
348
465
|
};
|
|
349
466
|
};
|
|
350
467
|
|
|
468
|
+
declare type __VLS_WithTemplateSlots_10<T, S> = T & {
|
|
469
|
+
new (): {
|
|
470
|
+
$slots: S;
|
|
471
|
+
};
|
|
472
|
+
};
|
|
473
|
+
|
|
474
|
+
declare type __VLS_WithTemplateSlots_11<T, S> = T & {
|
|
475
|
+
new (): {
|
|
476
|
+
$slots: S;
|
|
477
|
+
};
|
|
478
|
+
};
|
|
479
|
+
|
|
351
480
|
declare type __VLS_WithTemplateSlots_2<T, S> = T & {
|
|
352
481
|
new (): {
|
|
353
482
|
$slots: S;
|
|
@@ -390,6 +519,15 @@ declare type __VLS_WithTemplateSlots_8<T, S> = T & {
|
|
|
390
519
|
};
|
|
391
520
|
};
|
|
392
521
|
|
|
522
|
+
declare type __VLS_WithTemplateSlots_9<T, S> = T & {
|
|
523
|
+
new (): {
|
|
524
|
+
$slots: S;
|
|
525
|
+
};
|
|
526
|
+
};
|
|
527
|
+
|
|
528
|
+
/** Where TIcon masks from when nothing overrides it. */
|
|
529
|
+
export declare const DEFAULT_ICON_BASE = "https://unpkg.com/lucide-static@latest/icons/";
|
|
530
|
+
|
|
393
531
|
export declare type DurationFormat = 'clock' | 'short' | 'compact';
|
|
394
532
|
|
|
395
533
|
/** 8047 → "2:14:07" (clock) · "2:14" (short) · "2h 14m" (compact) */
|
|
@@ -403,8 +541,31 @@ export declare interface SelectOption {
|
|
|
403
541
|
label: string;
|
|
404
542
|
}
|
|
405
543
|
|
|
544
|
+
export declare interface TabBarItem {
|
|
545
|
+
id: string;
|
|
546
|
+
label: string;
|
|
547
|
+
icon: string;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/** App-wide base URL every TIcon masks from: `app.provide(TALLY_ICON_BASE, '/icons/')`. */
|
|
551
|
+
export declare const TALLY_ICON_BASE: InjectionKey<string>;
|
|
552
|
+
|
|
553
|
+
export declare const TAuthCard: __VLS_WithTemplateSlots_10<typeof __VLS_component_10, __VLS_TemplateResult_10["slots"]>;
|
|
554
|
+
|
|
555
|
+
export declare const TAvatar: DefineComponent<__VLS_Props_27, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_27> & Readonly<{}>, {
|
|
556
|
+
size: number;
|
|
557
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
|
|
558
|
+
|
|
406
559
|
export declare const TBadge: __VLS_WithTemplateSlots_5<typeof __VLS_component_5, __VLS_TemplateResult_5["slots"]>;
|
|
407
560
|
|
|
561
|
+
export declare const TBudgetBar: DefineComponent<__VLS_Props_28, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_28> & Readonly<{}>, {
|
|
562
|
+
color: string;
|
|
563
|
+
compact: boolean;
|
|
564
|
+
usedSeconds: number;
|
|
565
|
+
targetSeconds: number;
|
|
566
|
+
period: string;
|
|
567
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
568
|
+
|
|
408
569
|
export declare const TButton: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
|
|
409
570
|
|
|
410
571
|
export declare const TCard: __VLS_WithTemplateSlots_4<typeof __VLS_component_4, __VLS_TemplateResult_4["slots"]>;
|
|
@@ -419,6 +580,16 @@ modelValue: boolean;
|
|
|
419
580
|
indeterminate: boolean;
|
|
420
581
|
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
|
|
421
582
|
|
|
583
|
+
export declare const TCodeInput: DefineComponent<__VLS_Props_24, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
584
|
+
"update:modelValue": (v: string) => any;
|
|
585
|
+
}, string, PublicProps, Readonly<__VLS_Props_24> & Readonly<{
|
|
586
|
+
"onUpdate:modelValue"?: ((v: string) => any) | undefined;
|
|
587
|
+
}>, {
|
|
588
|
+
length: number;
|
|
589
|
+
modelValue: string;
|
|
590
|
+
autofocus: boolean;
|
|
591
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
592
|
+
|
|
422
593
|
export declare const TDialog: __VLS_WithTemplateSlots_8<typeof __VLS_component_8, __VLS_TemplateResult_8["slots"]>;
|
|
423
594
|
|
|
424
595
|
export declare const TDurationText: DefineComponent<__VLS_Props_16, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_16> & Readonly<{}>, {
|
|
@@ -428,9 +599,10 @@ seconds: number;
|
|
|
428
599
|
format: DurationFormat;
|
|
429
600
|
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
|
|
430
601
|
|
|
602
|
+
export declare const TEmptyState: __VLS_WithTemplateSlots_11<typeof __VLS_component_11, __VLS_TemplateResult_11["slots"]>;
|
|
603
|
+
|
|
431
604
|
export declare const TIcon: DefineComponent<__VLS_Props_8, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_8> & Readonly<{}>, {
|
|
432
605
|
size: number;
|
|
433
|
-
base: string;
|
|
434
606
|
color: string;
|
|
435
607
|
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
|
|
436
608
|
|
|
@@ -495,8 +667,29 @@ disabled: boolean;
|
|
|
495
667
|
modelValue: boolean;
|
|
496
668
|
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
|
|
497
669
|
|
|
670
|
+
export declare const TTabBar: DefineComponent<__VLS_Props_22, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
671
|
+
"update:modelValue": (id: string) => any;
|
|
672
|
+
}, string, PublicProps, Readonly<__VLS_Props_22> & Readonly<{
|
|
673
|
+
"onUpdate:modelValue"?: ((id: string) => any) | undefined;
|
|
674
|
+
}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLElement>;
|
|
675
|
+
|
|
498
676
|
export declare const TTag: __VLS_WithTemplateSlots_6<typeof __VLS_component_6, __VLS_TemplateResult_6["slots"]>;
|
|
499
677
|
|
|
678
|
+
export declare const TTimerBar: DefineComponent<__VLS_Props_23, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
679
|
+
stop: () => any;
|
|
680
|
+
open: () => any;
|
|
681
|
+
toggle: () => any;
|
|
682
|
+
}, string, PublicProps, Readonly<__VLS_Props_23> & Readonly<{
|
|
683
|
+
onStop?: (() => any) | undefined;
|
|
684
|
+
onOpen?: (() => any) | undefined;
|
|
685
|
+
onToggle?: (() => any) | undefined;
|
|
686
|
+
}>, {
|
|
687
|
+
color: string;
|
|
688
|
+
running: boolean;
|
|
689
|
+
seconds: number;
|
|
690
|
+
parallelCount: number;
|
|
691
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
692
|
+
|
|
500
693
|
export declare const TTimerPill: DefineComponent<__VLS_Props_19, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
501
694
|
stop: () => any;
|
|
502
695
|
toggle: () => any;
|
|
@@ -524,6 +717,8 @@ showAxis: boolean;
|
|
|
524
717
|
labelWidth: number;
|
|
525
718
|
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
526
719
|
|
|
720
|
+
export declare const TWindowChrome: __VLS_WithTemplateSlots_9<typeof __VLS_component_9, __VLS_TemplateResult_9["slots"]>;
|
|
721
|
+
|
|
527
722
|
export declare interface WaterfallRow {
|
|
528
723
|
label: string;
|
|
529
724
|
color: string;
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@import"https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&family=JetBrains+Mono:wght@400;500;700&display=swap";:root{--font-sans:"Instrument Sans","Helvetica Neue",-apple-system,BlinkMacSystemFont,sans-serif;--font-mono:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,monospace;--font-display:var(--font-sans);--font-ui:var(--font-sans);--font-numeric:var(--font-mono)}:root{--indigo-100:#E4E7FA;--indigo-200:#C3C8F3;--indigo-300:#9AA2EA;--indigo-400:#6C77DE;--indigo-500:#4A57D2;--indigo-600:#3A44AF;--indigo-700:#2C3391;--indigo-800:#1F2470;--indigo-900:#151A54;--indigo-950:#0E1138;--amber-200:#FDE3B4;--amber-300:#FBCC7C;--amber-400:#F8B547;--amber-500:#F5A524;--amber-600:#D98C10;--amber-700:#A96A08;--blue-300:#7FB4EE;--blue-400:#3D8BDB;--blue-500:#1565C0;--blue-600:#0F4E97;--blue-700:#0B3A70;--neutral-0:#FFFFFF;--neutral-25:#FAFBFD;--neutral-50:#F4F6FA;--neutral-100:#E8EBF2;--neutral-200:#D5DAE6;--neutral-300:#B3BAC9;--neutral-400:#8B93A5;--neutral-500:#697084;--neutral-600:#4C5365;--neutral-650:#3C4356;--neutral-700:#2B3143;--neutral-800:#1D2230;--neutral-850:#161A26;--neutral-900:#10131C;--neutral-950:#0A0C13;--chart-1:#0072B2;--chart-2:#E69F00;--chart-3:#009E73;--chart-4:#CC79A7;--chart-5:#56B4E9;--chart-6:#D55E00;--chart-7:#F0E442;--chart-8:#4C5566;--gradient-brand:linear-gradient(160deg,#4A57D2 0%,#2C3391 52%,#151A54 100%);--gradient-brand-lift:linear-gradient(180deg,rgba(255,255,255,.16) 0%,rgba(255,255,255,0) 46%);--gradient-page:radial-gradient(120% 80% at 50% -10%,#1F2470 0%,#10131C 62%);--surface-page:var(--neutral-900);--surface-sunken:var(--neutral-950);--surface-card:var(--neutral-850);--surface-raised:var(--neutral-800);--surface-overlay:rgba(16,19,28,.72);--surface-inset:rgba(255,255,255,.04);--surface-hover:rgba(255,255,255,.06);--surface-active:rgba(255,255,255,.1);--surface-brand:var(--indigo-900);--surface-brand-subtle:rgba(74,87,210,.16);--surface-accent-subtle:rgba(245,165,36,.14);--text-strong:var(--neutral-0);--text-body:#DCE1EC;--text-muted:var(--neutral-300);--text-subtle:var(--neutral-400);--text-inverse:var(--neutral-900);--text-accent:var(--amber-400);--text-link:var(--blue-300);--text-link-hover:var(--amber-400);--text-on-brand:var(--neutral-0);--border-subtle:rgba(255,255,255,.08);--border-default:rgba(255,255,255,.14);--border-strong:rgba(255,255,255,.24);--border-accent:var(--amber-500);--border-focus:var(--amber-400);--action-primary:var(--amber-500);--action-primary-hover:var(--amber-400);--action-primary-active:var(--amber-600);--action-primary-text:#20160A;--action-secondary:var(--blue-500);--action-secondary-hover:var(--blue-400);--action-secondary-active:var(--blue-600);--action-secondary-text:var(--neutral-0);--status-running:var(--amber-500);--status-paused:var(--neutral-400);--status-success:#00B383;--status-warning:var(--amber-500);--status-danger:#E8663A;--status-info:#3D9BE0;--status-success-surface:rgba(0,158,115,.16);--status-warning-surface:rgba(245,165,36,.16);--status-danger-surface:rgba(213,94,0,.18);--status-info-surface:rgba(0,114,178,.18)}[data-theme=light]{--surface-page:var(--neutral-25);--surface-sunken:var(--neutral-50);--surface-card:var(--neutral-0);--surface-raised:var(--neutral-0);--surface-overlay:rgba(16,19,28,.4);--surface-inset:var(--neutral-50);--surface-hover:rgba(21,26,84,.05);--surface-active:rgba(21,26,84,.09);--surface-brand:var(--indigo-500);--surface-brand-subtle:rgba(74,87,210,.08);--surface-accent-subtle:rgba(245,165,36,.16);--text-strong:var(--neutral-900);--text-body:var(--neutral-800);--text-muted:var(--neutral-500);--text-subtle:var(--neutral-400);--text-inverse:var(--neutral-0);--text-accent:var(--amber-700);--text-link:var(--blue-500);--text-link-hover:var(--indigo-700);--text-on-brand:var(--neutral-0);--border-subtle:var(--neutral-100);--border-default:var(--neutral-200);--border-strong:var(--neutral-300);--action-primary:var(--amber-500);--action-primary-hover:var(--amber-400);--action-primary-active:var(--amber-600);--action-primary-text:#20160A;--status-success:#007A5A;--status-warning:var(--amber-700);--status-danger:#C24A12;--status-info:var(--blue-500);--chart-8:#000000}:root{--text-display-1:64px;--leading-display-1:1.02;--tracking-display-1:-.03em;--text-display-2:48px;--leading-display-2:1.06;--tracking-display-2:-.025em;--text-title-1:34px;--leading-title-1:1.14;--tracking-title-1:-.02em;--text-title-2:26px;--leading-title-2:1.2;--tracking-title-2:-.015em;--text-title-3:20px;--leading-title-3:1.3;--tracking-title-3:-.01em;--text-body-lg:18px;--leading-body-lg:1.6;--tracking-body-lg:-.005em;--text-body:16px;--leading-body:1.6;--tracking-body:0em;--text-body-sm:14px;--leading-body-sm:1.55;--tracking-body-sm:0em;--text-caption:12px;--leading-caption:1.4;--tracking-caption:.005em;--text-overline:11px;--leading-overline:1.2;--tracking-overline:.12em;--weight-regular:400;--weight-medium:500;--weight-semibold:600;--weight-bold:700;--text-timer-xl:44px;--text-timer-lg:28px;--text-timer-md:18px;--text-timer-sm:13px;--numeric-features:"tnum" 1,"cv01" 1}:root{--space-0:0px;--space-1:2px;--space-2:4px;--space-3:8px;--space-4:12px;--space-5:16px;--space-6:20px;--space-7:24px;--space-8:32px;--space-9:40px;--space-10:48px;--space-11:64px;--space-12:80px;--space-13:112px;--space-14:160px;--section-y:112px;--section-y-tight:72px;--container-max:1160px;--container-prose:660px;--gutter:24px;--control-h-sm:26px;--control-h-md:32px;--control-h-lg:40px;--control-h-xl:48px;--row-h:38px}:root{--radius-xs:4px;--radius-sm:6px;--radius-md:9px;--radius-lg:12px;--radius-xl:16px;--radius-2xl:22px;--radius-pill:999px;--radius-icon-ratio:22%;--shadow-none:none;--shadow-xs:0 1px 2px rgba(6,8,16,.32);--shadow-sm:0 1px 3px rgba(6,8,16,.36),0 1px 1px rgba(6,8,16,.24);--shadow-md:0 6px 16px -4px rgba(6,8,16,.44),0 2px 4px rgba(6,8,16,.28);--shadow-lg:0 18px 40px -12px rgba(6,8,16,.55),0 4px 10px rgba(6,8,16,.3);--shadow-pill:0 10px 30px -8px rgba(6,8,16,.6),0 0 0 1px rgba(255,255,255,.08) inset;--shadow-focus:0 0 0 3px rgba(245,165,36,.34);--shadow-inset-hairline:inset 0 1px 0 rgba(255,255,255,.06);--glow-amber:0 0 0 1px rgba(245,165,36,.5),0 0 24px -6px rgba(245,165,36,.45);--blur-panel:saturate(140%) blur(20px);--blur-scrim:blur(6px);--scrim-bottom:linear-gradient(180deg,rgba(10,12,19,0) 0%,rgba(10,12,19,.82) 100%)}:root{--duration-instant:80ms;--duration-fast:.14s;--duration-base:.2s;--duration-slow:.32s;--duration-enter:.42s;--ease-standard:cubic-bezier(.2,0,.2,1);--ease-out:cubic-bezier(.16,1,.3,1);--ease-in:cubic-bezier(.4,0,1,1);--ease-tick:steps(1,end);--transition-control:background-color var(--duration-fast) var(--ease-standard),border-color var(--duration-fast) var(--ease-standard),color var(--duration-fast) var(--ease-standard),box-shadow var(--duration-fast) var(--ease-standard);--press-scale:.985}@media (prefers-reduced-motion:reduce){:root{--duration-fast:0ms;--duration-base:0ms;--duration-slow:0ms;--duration-enter:0ms;--press-scale:1}}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--surface-page);color:var(--text-body);font-family:var(--font-sans);font-size:var(--text-body);line-height:var(--leading-body);letter-spacing:var(--tracking-body);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4{margin:0;color:var(--text-strong);font-weight:var(--weight-semibold);text-wrap:balance}h1{font-size:var(--text-display-2);line-height:var(--leading-display-2);letter-spacing:var(--tracking-display-2)}h2{font-size:var(--text-title-1);line-height:var(--leading-title-1);letter-spacing:var(--tracking-title-1)}h3{font-size:var(--text-title-2);line-height:var(--leading-title-2);letter-spacing:var(--tracking-title-2)}h4{font-size:var(--text-title-3);line-height:var(--leading-title-3);letter-spacing:var(--tracking-title-3)}p{margin:0 0 var(--space-5);text-wrap:pretty;max-width:var(--container-prose)}a{color:var(--text-link);text-decoration:none;transition:color var(--duration-fast) var(--ease-standard)}a:hover{color:var(--text-link-hover)}a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}small{font-size:var(--text-caption);line-height:var(--leading-caption)}code,kbd,samp,pre{font-family:var(--font-mono);font-size:.92em}hr{border:0;border-top:1px solid var(--border-subtle);margin:var(--space-8) 0}::selection{background:#f5a52447;color:var(--text-strong)}.tally-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-feature-settings:var(--numeric-features)}.tally-overline{font-size:var(--text-overline);letter-spacing:var(--tracking-overline);text-transform:uppercase;font-weight:var(--weight-semibold);color:var(--text-muted)}.tally-container{max-width:var(--container-max);margin:0 auto;padding:0 var(--gutter)}
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&family=JetBrains+Mono:wght@400;500;700&display=swap";:root{--font-sans:"Instrument Sans","Helvetica Neue",-apple-system,BlinkMacSystemFont,sans-serif;--font-mono:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,monospace;--font-display:var(--font-sans);--font-ui:var(--font-sans);--font-numeric:var(--font-mono)}:root{--indigo-100:#E4E7FA;--indigo-200:#C3C8F3;--indigo-300:#9AA2EA;--indigo-400:#6C77DE;--indigo-500:#4A57D2;--indigo-600:#3A44AF;--indigo-700:#2C3391;--indigo-800:#1F2470;--indigo-900:#151A54;--indigo-950:#0E1138;--amber-200:#FDE3B4;--amber-300:#FBCC7C;--amber-400:#F8B547;--amber-500:#F5A524;--amber-600:#D98C10;--amber-700:#A96A08;--blue-300:#7FB4EE;--blue-400:#3D8BDB;--blue-500:#1565C0;--blue-600:#0F4E97;--blue-700:#0B3A70;--neutral-0:#FFFFFF;--neutral-25:#FAFBFD;--neutral-50:#F4F6FA;--neutral-100:#E8EBF2;--neutral-200:#D5DAE6;--neutral-300:#B3BAC9;--neutral-400:#8B93A5;--neutral-500:#697084;--neutral-600:#4C5365;--neutral-650:#3C4356;--neutral-700:#2B3143;--neutral-800:#1D2230;--neutral-850:#161A26;--neutral-900:#10131C;--neutral-950:#0A0C13;--chart-1:#0072B2;--chart-2:#E69F00;--chart-3:#009E73;--chart-4:#CC79A7;--chart-5:#56B4E9;--chart-6:#D55E00;--chart-7:#F0E442;--chart-8:#4C5566;--gradient-brand:linear-gradient(160deg,#4A57D2 0%,#2C3391 52%,#151A54 100%);--gradient-brand-lift:linear-gradient(180deg,rgba(255,255,255,.16) 0%,rgba(255,255,255,0) 46%);--gradient-page:radial-gradient(120% 80% at 50% -10%,#1F2470 0%,#10131C 62%);--surface-page:var(--neutral-900);--surface-sunken:var(--neutral-950);--surface-card:var(--neutral-850);--surface-raised:var(--neutral-800);--surface-overlay:rgba(16,19,28,.72);--surface-inset:rgba(255,255,255,.04);--surface-hover:rgba(255,255,255,.06);--surface-active:rgba(255,255,255,.1);--surface-brand:var(--indigo-900);--surface-brand-subtle:rgba(74,87,210,.16);--surface-accent-subtle:rgba(245,165,36,.14);--text-strong:var(--neutral-0);--text-body:#DCE1EC;--text-muted:var(--neutral-300);--text-subtle:var(--neutral-400);--text-inverse:var(--neutral-900);--text-accent:var(--amber-400);--text-link:var(--blue-300);--text-link-hover:var(--amber-400);--text-on-brand:var(--neutral-0);--border-subtle:rgba(255,255,255,.08);--border-default:rgba(255,255,255,.14);--border-strong:rgba(255,255,255,.24);--border-accent:var(--amber-500);--border-focus:var(--amber-400);--action-primary:var(--amber-500);--action-primary-hover:var(--amber-400);--action-primary-active:var(--amber-600);--action-primary-text:#20160A;--action-secondary:var(--blue-500);--action-secondary-hover:var(--blue-400);--action-secondary-active:var(--blue-600);--action-secondary-text:var(--neutral-0);--status-running:var(--amber-500);--status-paused:var(--neutral-400);--status-success:#00B383;--status-warning:var(--amber-500);--status-danger:#E8663A;--status-info:#3D9BE0;--status-success-surface:rgba(0,158,115,.16);--status-warning-surface:rgba(245,165,36,.16);--status-danger-surface:rgba(213,94,0,.18);--status-info-surface:rgba(0,114,178,.18)}[data-theme=light]{--surface-page:var(--neutral-25);--surface-sunken:var(--neutral-50);--surface-card:var(--neutral-0);--surface-raised:var(--neutral-0);--surface-overlay:rgba(16,19,28,.4);--surface-inset:var(--neutral-50);--surface-hover:rgba(21,26,84,.05);--surface-active:rgba(21,26,84,.09);--surface-brand:var(--indigo-500);--surface-brand-subtle:rgba(74,87,210,.08);--surface-accent-subtle:rgba(245,165,36,.16);--text-strong:var(--neutral-900);--text-body:var(--neutral-800);--text-muted:var(--neutral-500);--text-subtle:var(--neutral-400);--text-inverse:var(--neutral-0);--text-accent:var(--amber-700);--text-link:var(--blue-500);--text-link-hover:var(--indigo-700);--text-on-brand:var(--neutral-0);--border-subtle:var(--neutral-100);--border-default:var(--neutral-200);--border-strong:var(--neutral-300);--action-primary:var(--amber-500);--action-primary-hover:var(--amber-400);--action-primary-active:var(--amber-600);--action-primary-text:#20160A;--status-success:#007A5A;--status-warning:var(--amber-700);--status-danger:#C24A12;--status-info:var(--blue-500);--chart-8:#000000}:root{--text-display-1:64px;--leading-display-1:1.02;--tracking-display-1:-.03em;--text-display-2:48px;--leading-display-2:1.06;--tracking-display-2:-.025em;--text-title-1:34px;--leading-title-1:1.14;--tracking-title-1:-.02em;--text-title-2:26px;--leading-title-2:1.2;--tracking-title-2:-.015em;--text-title-3:20px;--leading-title-3:1.3;--tracking-title-3:-.01em;--text-body-lg:18px;--leading-body-lg:1.6;--tracking-body-lg:-.005em;--text-body-md:16px;--leading-body-md:1.6;--tracking-body-md:0em;--text-body-sm:14px;--leading-body-sm:1.55;--tracking-body-sm:0em;--text-caption:12px;--leading-caption:1.4;--tracking-caption:.005em;--text-overline:11px;--leading-overline:1.2;--tracking-overline:.12em;--weight-regular:400;--weight-medium:500;--weight-semibold:600;--weight-bold:700;--text-timer-xl:44px;--text-timer-lg:28px;--text-timer-md:18px;--text-timer-sm:13px;--numeric-features:"tnum" 1,"cv01" 1}:root{--space-0:0px;--space-1:2px;--space-2:4px;--space-3:8px;--space-4:12px;--space-5:16px;--space-6:20px;--space-7:24px;--space-8:32px;--space-9:40px;--space-10:48px;--space-11:64px;--space-12:80px;--space-13:112px;--space-14:160px;--section-y:112px;--section-y-tight:72px;--container-max:1160px;--container-prose:660px;--gutter:24px;--control-h-sm:26px;--control-h-md:32px;--control-h-lg:40px;--control-h-xl:48px;--row-h:38px}:root{--radius-xs:4px;--radius-sm:6px;--radius-md:9px;--radius-lg:12px;--radius-xl:16px;--radius-2xl:22px;--radius-pill:999px;--radius-icon-ratio:22%;--shadow-none:none;--shadow-xs:0 1px 2px rgba(6,8,16,.32);--shadow-sm:0 1px 3px rgba(6,8,16,.36),0 1px 1px rgba(6,8,16,.24);--shadow-md:0 6px 16px -4px rgba(6,8,16,.44),0 2px 4px rgba(6,8,16,.28);--shadow-lg:0 18px 40px -12px rgba(6,8,16,.55),0 4px 10px rgba(6,8,16,.3);--shadow-pill:0 10px 30px -8px rgba(6,8,16,.6),0 0 0 1px rgba(255,255,255,.08) inset;--shadow-focus:0 0 0 3px rgba(245,165,36,.34);--shadow-inset-hairline:inset 0 1px 0 rgba(255,255,255,.06);--glow-amber:0 0 0 1px rgba(245,165,36,.5),0 0 24px -6px rgba(245,165,36,.45);--blur-panel:saturate(140%) blur(20px);--blur-scrim:blur(6px);--scrim-bottom:linear-gradient(180deg,rgba(10,12,19,0) 0%,rgba(10,12,19,.82) 100%)}:root{--duration-instant:80ms;--duration-fast:.14s;--duration-base:.2s;--duration-slow:.32s;--duration-enter:.42s;--ease-standard:cubic-bezier(.2,0,.2,1);--ease-out:cubic-bezier(.16,1,.3,1);--ease-in:cubic-bezier(.4,0,1,1);--ease-tick:steps(1,end);--transition-control:background-color var(--duration-fast) var(--ease-standard),border-color var(--duration-fast) var(--ease-standard),color var(--duration-fast) var(--ease-standard),box-shadow var(--duration-fast) var(--ease-standard);--press-scale:.985}@media (prefers-reduced-motion:reduce){:root{--duration-fast:0ms;--duration-base:0ms;--duration-slow:0ms;--duration-enter:0ms;--press-scale:1}}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--surface-page);color:var(--text-body);font-family:var(--font-sans);font-size:var(--text-body-md);line-height:var(--leading-body-md);letter-spacing:var(--tracking-body-md);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4{margin:0;color:var(--text-strong);font-weight:var(--weight-semibold);text-wrap:balance}h1{font-size:var(--text-display-2);line-height:var(--leading-display-2);letter-spacing:var(--tracking-display-2)}h2{font-size:var(--text-title-1);line-height:var(--leading-title-1);letter-spacing:var(--tracking-title-1)}h3{font-size:var(--text-title-2);line-height:var(--leading-title-2);letter-spacing:var(--tracking-title-2)}h4{font-size:var(--text-title-3);line-height:var(--leading-title-3);letter-spacing:var(--tracking-title-3)}p{margin:0 0 var(--space-5);text-wrap:pretty;max-width:var(--container-prose)}a{color:var(--text-link);text-decoration:none;transition:color var(--duration-fast) var(--ease-standard)}a:hover{color:var(--text-link-hover)}a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}small{font-size:var(--text-caption);line-height:var(--leading-caption)}code,kbd,samp,pre{font-family:var(--font-mono);font-size:.92em}hr{border:0;border-top:1px solid var(--border-subtle);margin:var(--space-8) 0}::selection{background:#f5a52447;color:var(--text-strong)}.tally-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-feature-settings:var(--numeric-features)}.tally-overline{font-size:var(--text-overline);letter-spacing:var(--tracking-overline);text-transform:uppercase;font-weight:var(--weight-semibold);color:var(--text-muted)}.tally-container{max-width:var(--container-max);margin:0 auto;padding:0 var(--gutter)}
|