@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 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
- /** Override the CDN base if you self-host lucide-static. */
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)}