@timebraid/vue 1.4.0 → 1.6.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
@@ -13,7 +13,7 @@ import { TBtn, TPill, TIcon } from '@timebraid/vue'
13
13
 
14
14
  <template>
15
15
  <TBtn size="xl" icon="download">Download for macOS</TBtn>
16
- <TPill :running="[{ id: '1', task: 'Logo exploration', project: 'Acme rebrand', color: 'var(--chart-1)', since: '9:12', seconds: 8047 }]" />
16
+ <TPill :running="[{ id: '1', task: 'Logo exploration', project: 'Acme rebrand', projectId: 'acme', color: 'var(--chart-1)', since: '9:12', seconds: 8047 }]" />
17
17
  <TIcon name="play" :size="16" />
18
18
  </template>
19
19
  ```
@@ -34,21 +34,26 @@ Import `@timebraid/tokens/styles.css` once in `main.ts` (or `@timebraid/vue/styl
34
34
  | `TSelect` | Trailing-value select with `chevrons-up-down`, used inside `TRow`; name the control with `label` (rendered visually hidden) or `ariaLabel` |
35
35
  | `TBadge` | Status pill: neutral, running, green, red, soon |
36
36
  | `TBar` | Animated value bar |
37
- | `TAvatar` | Initials avatar |
38
- | `TLargeTitle` | Large collapsing page title |
39
- | `TSheet` | Centred sheet on desktop, bottom sheet on phones |
37
+ | `TAvatar` | Initials avatar; pass `src` for a photo instead |
38
+ | `TAvatarStack` | Overlapping `TAvatar`s with a `+N` overflow count |
39
+ | `TLargeTitle` | Large collapsing page title; `sticky` pins it above its scrolling content |
40
+ | `TSheet` | Centred sheet on desktop, bottom sheet on phones; on phones drag the grabber, the header or, at the top of its scroll, the content to dismiss - it follows the finger and closes or springs back by release direction |
40
41
  | `TDot` | Status dot with a pulsing ring when running |
41
42
  | `TDur` | Duration readout, mono and tabular |
42
- | `TWaterfall` | Parallel-time waterfall timeline for reports |
43
- | `TPill` | The floating always-visible timer pill; the `popover` slot (scoped with `running`) replaces the popover body, and `open` is consumer-owned through `update:open` |
44
- | `TWorkspaceSwitcher` | Workspace picker popover |
45
- | `TTimerBar` | Phone bottom timer bar |
43
+ | `TWaterfall` | Parallel-time waterfall timeline for reports, one lane per task grouped under its project; `showWs` adds a workspace tag per project |
44
+ | `TPill` | The floating always-visible timer pill: count first, the longest timer leads; the `popover` slot (scoped with `running`) replaces the popover body, grouped by workspace then project, and `open` is consumer-owned through `update:open` |
45
+ | `TWsIcon` | Workspace glyph: a coloured initial square, or the app mark when `all` |
46
+ | `TWsTag` | Small workspace label, the square plus its name; appears only in the All-workspaces scope |
47
+ | `TWorkspaceSwitcher` | Scope selector: All workspaces or one |
48
+ | `TWorkspaceMenu` | The workspace list shared by the switcher's popover and the drawer; `embedded` drops its shadow for inline use |
49
+ | `TWorkspaceDrawer` | Full-height phone workspace list; drag the panel to dismiss |
50
+ | `TTimerBar` | Phone bottom timer bar: takes the full `timers` array, count first with the longest leading |
46
51
  | `TStrokes` | Oversized faded tally strokes behind sign-in and empty states |
47
- | `TIOSNav` | iOS large-title nav bar that collapses on scroll |
52
+ | `TIOSNav` | iOS nav bar under the status-bar inset (`--inset-top`); the `leading` control, the large title and the `right` actions share one line and the title collapses in place on scroll |
48
53
  | `TIOSTabBar` | iOS tab bar |
49
- | `TAndroidTop` | Android top app bar |
54
+ | `TAndroidTop` | Android top app bar under the status-bar inset (`--inset-top`); `sub` for a subtitle, `scrolled` for its elevated state, `title` slot to replace the text |
50
55
  | `TAndroidNavBar` | Android bottom navigation bar |
51
- | `TIcon` | Lucide glyph via CSS mask, follows `currentColor` |
56
+ | `TIcon` | Bundled inline Lucide glyph, follows `currentColor` |
52
57
  | `TLogo` | The stopwatch mark, correct artwork per size; `mono` paints it in currentColor |
53
58
  | `TCodeInput` | 6-digit code entry |
54
59
  | `TAuthCard` | Sign-in layout card |
@@ -57,14 +62,7 @@ Import `@timebraid/tokens/styles.css` once in `main.ts` (or `@timebraid/vue/styl
57
62
 
58
63
  Also exported: `formatDuration(seconds, 'clock' | 'short' | 'compact')`, `PROJECT_COLORS`, `TIMEBRAID_ICON_BASE`, `DEFAULT_ICON_BASE`, `resolveTheme`, `applyTheme`, `watchTheme`, `THEME_PREFERENCES`.
59
64
 
60
- `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:
61
-
62
- ```ts
63
- import { TIMEBRAID_ICON_BASE } from '@timebraid/vue'
64
- app.provide(TIMEBRAID_ICON_BASE, '/icons/')
65
- ```
66
-
67
- A `base` prop on a single `TIcon` still wins over the provided value.
65
+ `TIcon` ships its glyphs: `scripts/glyphs.mjs` writes the Lucide paths for every name the products use into `packages/vue/src/icons/glyphs.ts`, and the component renders them inline in `currentColor`. Nothing is fetched at runtime. To add a glyph, add its name to `NAMES` in the script and run `pnpm glyphs`. `ICON_NAMES` and `hasIcon()` are exported so an app can assert every name it uses is bundled. A name missing from the table still masks from `TIMEBRAID_ICON_BASE` (or the `base` prop) with a dev warning, so nothing breaks while the table catches up.
68
66
 
69
67
  ## Rules
70
68
 
package/dist/index.d.ts CHANGED
@@ -9,11 +9,11 @@ flat: boolean;
9
9
  plainTitle: boolean;
10
10
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLElement>;
11
11
 
12
- declare const __VLS_component_10: DefineComponent<__VLS_Props_27, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_27> & Readonly<{}>, {
12
+ declare const __VLS_component_10: DefineComponent<__VLS_Props_32, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_32> & Readonly<{}>, {
13
13
  width: number;
14
14
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
15
15
 
16
- declare const __VLS_component_11: DefineComponent<__VLS_Props_29, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_29> & Readonly<{}>, {
16
+ declare const __VLS_component_11: DefineComponent<__VLS_Props_34, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_34> & Readonly<{}>, {
17
17
  side: "top" | "bottom" | "left" | "right";
18
18
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
19
19
 
@@ -46,28 +46,31 @@ declare const __VLS_component_4: DefineComponent<__VLS_Props_8, {}, {}, {}, {},
46
46
  tone: keyof typeof TONES_2;
47
47
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
48
48
 
49
- declare const __VLS_component_5: DefineComponent<__VLS_Props_11, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_11> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
49
+ declare const __VLS_component_5: DefineComponent<__VLS_Props_14, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_14> & Readonly<{}>, {
50
+ sticky: boolean;
51
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
50
52
 
51
- declare const __VLS_component_6: DefineComponent<__VLS_Props_12, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
53
+ declare const __VLS_component_6: DefineComponent<__VLS_Props_15, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
52
54
  close: () => any;
53
- }, string, PublicProps, Readonly<__VLS_Props_12> & Readonly<{
55
+ }, string, PublicProps, Readonly<__VLS_Props_15> & Readonly<{
54
56
  onClose?: (() => any) | undefined;
55
57
  }>, {
56
58
  inline: boolean;
57
59
  width: number;
58
60
  mobile: boolean;
59
61
  teleport: boolean;
62
+ cancelLabel: string;
60
63
  }, {}, {}, {}, string, ComponentProvideOptions, false, {
61
64
  dialog: HTMLDivElement;
62
65
  }, any>;
63
66
 
64
- declare const __VLS_component_7: DefineComponent<__VLS_Props_16, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
67
+ declare const __VLS_component_7: DefineComponent<__VLS_Props_19, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
65
68
  stop: (id: string) => any;
66
69
  start: () => any;
67
70
  "update:open": (v: boolean) => any;
68
71
  stopAll: () => any;
69
72
  openApp: () => any;
70
- }, string, PublicProps, Readonly<__VLS_Props_16> & Readonly<{
73
+ }, string, PublicProps, Readonly<__VLS_Props_19> & Readonly<{
71
74
  onStop?: ((id: string) => any) | undefined;
72
75
  onStart?: (() => any) | undefined;
73
76
  "onUpdate:open"?: ((v: boolean) => any) | undefined;
@@ -79,9 +82,11 @@ paused: boolean;
79
82
  compact: boolean;
80
83
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
81
84
 
82
- declare const __VLS_component_8: DefineComponent<__VLS_Props_20, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_20> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
85
+ declare const __VLS_component_8: DefineComponent<__VLS_Props_25, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_25> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
83
86
 
84
- declare const __VLS_component_9: DefineComponent<__VLS_Props_22, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_22> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
87
+ declare const __VLS_component_9: DefineComponent<__VLS_Props_27, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_27> & Readonly<{}>, {
88
+ scrolled: boolean;
89
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
85
90
 
86
91
  declare type __VLS_Props = {
87
92
  title?: string;
@@ -94,29 +99,50 @@ declare type __VLS_Props_10 = {
94
99
  name: string;
95
100
  size?: number;
96
101
  color?: string;
102
+ src?: string;
97
103
  };
98
104
 
99
105
  declare type __VLS_Props_11 = {
106
+ people: Person[];
107
+ size?: number;
108
+ max?: number;
109
+ };
110
+
111
+ declare type __VLS_Props_12 = {
112
+ name: string;
113
+ color: string;
114
+ };
115
+
116
+ declare type __VLS_Props_13 = {
117
+ name?: string;
118
+ color?: string;
119
+ all?: boolean;
120
+ size?: number;
121
+ };
122
+
123
+ declare type __VLS_Props_14 = {
100
124
  title: string;
101
125
  sub?: string;
126
+ sticky?: boolean;
102
127
  };
103
128
 
104
- declare type __VLS_Props_12 = {
129
+ declare type __VLS_Props_15 = {
105
130
  open: boolean;
106
131
  title: string;
107
132
  mobile?: boolean;
108
133
  width?: number;
109
134
  inline?: boolean;
110
135
  teleport?: boolean;
136
+ cancelLabel?: string;
111
137
  };
112
138
 
113
- declare type __VLS_Props_13 = {
139
+ declare type __VLS_Props_16 = {
114
140
  color: string;
115
141
  size?: number;
116
142
  running?: boolean;
117
143
  };
118
144
 
119
- declare type __VLS_Props_14 = {
145
+ declare type __VLS_Props_17 = {
120
146
  seconds: number;
121
147
  mode?: DurationFormat;
122
148
  size?: number;
@@ -124,41 +150,23 @@ declare type __VLS_Props_14 = {
124
150
  tone?: keyof typeof TONES_3;
125
151
  };
126
152
 
127
- declare type __VLS_Props_15 = {
128
- rows: WaterfallRow[];
153
+ declare type __VLS_Props_18 = {
154
+ rows: WaterfallProject[];
129
155
  start?: number;
130
156
  end?: number;
131
157
  labelW?: number;
132
158
  rowH?: number;
133
159
  compact?: boolean;
160
+ showWs?: boolean;
134
161
  };
135
162
 
136
- declare type __VLS_Props_16 = {
163
+ declare type __VLS_Props_19 = {
137
164
  running: PillTimer[];
138
165
  compact?: boolean;
139
166
  paused?: boolean;
140
167
  open?: boolean;
141
168
  };
142
169
 
143
- declare type __VLS_Props_17 = {
144
- workspaces: WorkspaceOption[];
145
- modelValue: string;
146
- };
147
-
148
- declare type __VLS_Props_18 = {
149
- task: string;
150
- project: string;
151
- color?: string;
152
- seconds: number;
153
- more?: number;
154
- android?: boolean;
155
- bottom?: number;
156
- };
157
-
158
- declare type __VLS_Props_19 = {
159
- opacity?: number;
160
- };
161
-
162
170
  declare type __VLS_Props_2 = {
163
171
  icon?: string;
164
172
  iconBg?: string;
@@ -173,62 +181,104 @@ declare type __VLS_Props_2 = {
173
181
  };
174
182
 
175
183
  declare type __VLS_Props_20 = {
184
+ workspaces: WorkspaceOption[];
185
+ modelValue: string;
186
+ showAll?: boolean;
187
+ };
188
+
189
+ declare type __VLS_Props_21 = {
190
+ workspaces: WorkspaceOption[];
191
+ modelValue: string;
192
+ showAll?: boolean;
193
+ embedded?: boolean;
194
+ };
195
+
196
+ declare type __VLS_Props_22 = {
197
+ open: boolean;
198
+ workspaces: WorkspaceOption[];
199
+ modelValue: string;
200
+ showAll?: boolean;
201
+ teleport?: boolean;
202
+ };
203
+
204
+ declare type __VLS_Props_23 = {
205
+ timers: PillTimer[];
206
+ android?: boolean;
207
+ bottom?: number;
208
+ };
209
+
210
+ declare type __VLS_Props_24 = {
211
+ opacity?: number;
212
+ };
213
+
214
+ declare type __VLS_Props_25 = {
176
215
  title: string;
177
216
  sub?: string;
178
217
  scrolled: boolean;
179
218
  };
180
219
 
181
- declare type __VLS_Props_21 = {
220
+ declare type __VLS_Props_26 = {
182
221
  items: TabItem[];
183
222
  modelValue: string;
184
223
  indicator?: boolean;
185
224
  };
186
225
 
187
- declare type __VLS_Props_22 = {
226
+ declare type __VLS_Props_27 = {
188
227
  title: string;
228
+ sub?: string;
229
+ scrolled?: boolean;
189
230
  };
190
231
 
191
- declare type __VLS_Props_23 = {
232
+ declare type __VLS_Props_28 = {
192
233
  items: TabItem[];
193
234
  modelValue: string;
194
235
  indicator?: boolean;
195
236
  };
196
237
 
197
238
  /**
198
- * Lucide glyph painted with a CSS mask so it follows currentColor.
239
+ * Lucide glyph rendered inline from the bundled table, so it follows currentColor and fetches nothing.
199
240
  * SUBSTITUTION: Timebraid has no icon set of its own yet; Lucide is the closest match to the mark.
200
241
  */
201
- declare type __VLS_Props_24 = {
202
- /** Lucide kebab-case name: play, pause, square, layers, file-text… */
242
+ declare type __VLS_Props_29 = {
243
+ /** Lucide kebab-case name from the bundled table: play, square, plus, folder-kanban... */
203
244
  name: string;
204
245
  /** 16 in the app, 20 in the site header, 24 in marketing rows. */
205
246
  size?: number;
206
247
  color?: string;
207
- /** Where this one glyph is masked from. Wins over the `TIMEBRAID_ICON_BASE` injection key, which every app can set once with `app.provide(TIMEBRAID_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. */
248
+ /** Only for a name that is not bundled: where that one glyph is masked from. Wins over the `TIMEBRAID_ICON_BASE` injection key. Bundled names never fetch. */
208
249
  base?: string;
209
250
  };
210
251
 
252
+ declare type __VLS_Props_3 = {
253
+ modelValue: string;
254
+ options: {
255
+ value: string;
256
+ label: string;
257
+ }[];
258
+ size?: 'sm' | 'md';
259
+ };
260
+
211
261
  /** The Timebraid stopwatch from shipped artwork: the detailed PNG plate at 64px and up, the flat small mark below, the 16px PNG under 24px. `mono` paints the one-colour mark in currentColor. */
212
- declare type __VLS_Props_25 = {
262
+ declare type __VLS_Props_30 = {
213
263
  size?: number;
214
264
  wordmark?: boolean;
215
265
  mono?: boolean;
216
266
  };
217
267
 
218
- declare type __VLS_Props_26 = {
268
+ declare type __VLS_Props_31 = {
219
269
  modelValue?: string;
220
270
  length?: number;
221
271
  error?: string;
222
272
  autofocus?: boolean;
223
273
  };
224
274
 
225
- declare type __VLS_Props_27 = {
275
+ declare type __VLS_Props_32 = {
226
276
  title: string;
227
277
  description?: string;
228
278
  width?: number;
229
279
  };
230
280
 
231
- declare type __VLS_Props_28 = {
281
+ declare type __VLS_Props_33 = {
232
282
  modelValue?: boolean;
233
283
  label: string;
234
284
  description?: string;
@@ -236,22 +286,13 @@ declare type __VLS_Props_28 = {
236
286
  disabled?: boolean;
237
287
  };
238
288
 
239
- declare type __VLS_Props_29 = {
289
+ declare type __VLS_Props_34 = {
240
290
  content: string;
241
291
  /** e.g. ⌘N - mono, muted, at the end. */
242
292
  shortcut?: string;
243
293
  side?: 'top' | 'bottom' | 'left' | 'right';
244
294
  };
245
295
 
246
- declare type __VLS_Props_3 = {
247
- modelValue: string;
248
- options: {
249
- value: string;
250
- label: string;
251
- }[];
252
- size?: 'sm' | 'md';
253
- };
254
-
255
296
  declare type __VLS_Props_4 = {
256
297
  kind?: keyof typeof KINDS;
257
298
  size?: keyof typeof SIZES;
@@ -396,6 +437,7 @@ declare function __VLS_template_7(): {
396
437
  declare function __VLS_template_8(): {
397
438
  attrs: Partial<{}>;
398
439
  slots: {
440
+ leading?(_: {}): any;
399
441
  right?(_: {}): any;
400
442
  };
401
443
  refs: {};
@@ -405,6 +447,7 @@ declare function __VLS_template_8(): {
405
447
  declare function __VLS_template_9(): {
406
448
  attrs: Partial<{}>;
407
449
  slots: {
450
+ title?(_: {}): any;
408
451
  right?(_: {}): any;
409
452
  };
410
453
  refs: {};
@@ -499,16 +542,26 @@ declare type __VLS_WithTemplateSlots_9<T, S> = T & {
499
542
  };
500
543
  };
501
544
 
545
+ export declare const ALL_WORKSPACES = "all";
546
+
502
547
  export declare function applyTheme(root: HTMLElement, theme: ResolvedTheme): void;
503
548
 
504
549
  /** Where TIcon masks from when nothing overrides it. */
505
- export declare const DEFAULT_ICON_BASE = "https://unpkg.com/lucide-static@latest/icons/";
550
+ export declare const DEFAULT_ICON_BASE = "https://unpkg.com/lucide-static@0.545.0/icons/";
506
551
 
507
552
  export declare type DurationFormat = 'clock' | 'short' | 'compact';
508
553
 
554
+ export declare const FILLED_NAMES: ReadonlySet<string>;
555
+
509
556
  /** 8047 → "2:14:07" (clock) · "2:14" (short) · "2h 14m" (compact) */
510
557
  export declare function formatDuration(seconds: number, format?: DurationFormat): string;
511
558
 
559
+ export declare function groupTimers(timers: PillTimer[]): TimerGroup[];
560
+
561
+ export declare const hasIcon: (name: string) => boolean;
562
+
563
+ export declare const ICON_NAMES: readonly string[];
564
+
512
565
  declare const KINDS: {
513
566
  readonly primary: {
514
567
  readonly background: "var(--accent)";
@@ -537,13 +590,27 @@ declare const KINDS: {
537
590
  };
538
591
  };
539
592
 
593
+ export declare function longestTimer(timers: PillTimer[]): PillTimer | null;
594
+
595
+ export declare interface Person {
596
+ name: string;
597
+ src?: string;
598
+ color?: string;
599
+ }
600
+
540
601
  export declare interface PillTimer {
541
602
  id: string;
542
603
  task: string;
543
604
  project: string;
605
+ projectId: string;
544
606
  color: string;
545
607
  since: string;
546
608
  seconds: number;
609
+ workspace?: {
610
+ id: string;
611
+ name: string;
612
+ color: string;
613
+ };
547
614
  }
548
615
 
549
616
  /** Okabe-Ito, the only palette permitted for projects and charts. */
@@ -591,9 +658,9 @@ export declare interface TabItem {
591
658
  icon: string;
592
659
  }
593
660
 
594
- export declare const TAndroidNavBar: DefineComponent<__VLS_Props_23, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
661
+ export declare const TAndroidNavBar: DefineComponent<__VLS_Props_28, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
595
662
  "update:modelValue": (id: string) => any;
596
- }, string, PublicProps, Readonly<__VLS_Props_23> & Readonly<{
663
+ }, string, PublicProps, Readonly<__VLS_Props_28> & Readonly<{
597
664
  "onUpdate:modelValue"?: ((id: string) => any) | undefined;
598
665
  }>, {
599
666
  indicator: boolean;
@@ -605,6 +672,11 @@ export declare const TAuthCard: __VLS_WithTemplateSlots_10<typeof __VLS_componen
605
672
 
606
673
  export declare const TAvatar: DefineComponent<__VLS_Props_10, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_10> & Readonly<{}>, {
607
674
  size: number;
675
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
676
+
677
+ export declare const TAvatarStack: DefineComponent<__VLS_Props_11, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_11> & Readonly<{}>, {
678
+ size: number;
679
+ max: number;
608
680
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
609
681
 
610
682
  export declare const TBadge: __VLS_WithTemplateSlots_4<typeof __VLS_component_4, __VLS_TemplateResult_4["slots"]>;
@@ -616,9 +688,9 @@ h: number;
616
688
 
617
689
  export declare const TBtn: __VLS_WithTemplateSlots_3<typeof __VLS_component_3, __VLS_TemplateResult_3["slots"]>;
618
690
 
619
- export declare const TCheckbox: DefineComponent<__VLS_Props_28, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
691
+ export declare const TCheckbox: DefineComponent<__VLS_Props_33, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
620
692
  "update:modelValue": (v: boolean) => any;
621
- }, string, PublicProps, Readonly<__VLS_Props_28> & Readonly<{
693
+ }, string, PublicProps, Readonly<__VLS_Props_33> & Readonly<{
622
694
  "onUpdate:modelValue"?: ((v: boolean) => any) | undefined;
623
695
  }>, {
624
696
  modelValue: boolean;
@@ -626,9 +698,9 @@ disabled: boolean;
626
698
  indeterminate: boolean;
627
699
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
628
700
 
629
- export declare const TCodeInput: DefineComponent<__VLS_Props_26, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
701
+ export declare const TCodeInput: DefineComponent<__VLS_Props_31, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
630
702
  "update:modelValue": (v: string) => any;
631
- }, string, PublicProps, Readonly<__VLS_Props_26> & Readonly<{
703
+ }, string, PublicProps, Readonly<__VLS_Props_31> & Readonly<{
632
704
  "onUpdate:modelValue"?: ((v: string) => any) | undefined;
633
705
  }>, {
634
706
  length: number;
@@ -636,12 +708,12 @@ modelValue: string;
636
708
  autofocus: boolean;
637
709
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
638
710
 
639
- export declare const TDot: DefineComponent<__VLS_Props_13, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_13> & Readonly<{}>, {
711
+ export declare const TDot: DefineComponent<__VLS_Props_16, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_16> & Readonly<{}>, {
640
712
  size: number;
641
713
  running: boolean;
642
714
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
643
715
 
644
- export declare const TDur: DefineComponent<__VLS_Props_14, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_14> & Readonly<{}>, {
716
+ export declare const TDur: DefineComponent<__VLS_Props_17, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_17> & Readonly<{}>, {
645
717
  size: number;
646
718
  tone: keyof typeof TONES_3;
647
719
  mode: DurationFormat;
@@ -668,10 +740,10 @@ export declare const THEME_PREFERENCES: ThemePreference[];
668
740
 
669
741
  export declare type ThemePreference = 'system' | 'light' | 'dark';
670
742
 
671
- export declare const TIcon: DefineComponent<__VLS_Props_24, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_24> & Readonly<{}>, {
743
+ export declare const TIcon: DefineComponent<__VLS_Props_29, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_29> & Readonly<{}>, {
672
744
  color: string;
673
745
  size: number;
674
- }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
746
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
675
747
 
676
748
  export declare const TIconBtn: DefineComponent<__VLS_Props_5, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
677
749
  click: (e: MouseEvent) => any;
@@ -686,11 +758,29 @@ tone: keyof typeof TONES;
686
758
  /** App-wide base URL every TIcon masks from: `app.provide(TIMEBRAID_ICON_BASE, '/icons/')`. */
687
759
  export declare const TIMEBRAID_ICON_BASE: InjectionKey<string>;
688
760
 
761
+ export declare interface TimerGroup {
762
+ workspace: TimerWorkspace | null;
763
+ projects: TimerProjectGroup[];
764
+ }
765
+
766
+ export declare interface TimerProjectGroup {
767
+ id: string;
768
+ name: string;
769
+ color: string;
770
+ timers: PillTimer[];
771
+ }
772
+
773
+ export declare interface TimerWorkspace {
774
+ id: string;
775
+ name: string;
776
+ color: string;
777
+ }
778
+
689
779
  export declare const TIOSNav: __VLS_WithTemplateSlots_8<typeof __VLS_component_8, __VLS_TemplateResult_8["slots"]>;
690
780
 
691
- export declare const TIOSTabBar: DefineComponent<__VLS_Props_21, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
781
+ export declare const TIOSTabBar: DefineComponent<__VLS_Props_26, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
692
782
  "update:modelValue": (id: string) => any;
693
- }, string, PublicProps, Readonly<__VLS_Props_21> & Readonly<{
783
+ }, string, PublicProps, Readonly<__VLS_Props_26> & Readonly<{
694
784
  "onUpdate:modelValue"?: ((id: string) => any) | undefined;
695
785
  }>, {
696
786
  indicator: boolean;
@@ -698,7 +788,7 @@ indicator: boolean;
698
788
 
699
789
  export declare const TLargeTitle: __VLS_WithTemplateSlots_5<typeof __VLS_component_5, __VLS_TemplateResult_5["slots"]>;
700
790
 
701
- export declare const TLogo: DefineComponent<__VLS_Props_25, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_25> & Readonly<{}>, {
791
+ export declare const TLogo: DefineComponent<__VLS_Props_30, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_30> & Readonly<{}>, {
702
792
  size: number;
703
793
  mono: boolean;
704
794
  wordmark: boolean;
@@ -768,22 +858,22 @@ disabled: boolean;
768
858
 
769
859
  export declare const TSheet: __VLS_WithTemplateSlots_6<typeof __VLS_component_6, __VLS_TemplateResult_6["slots"]>;
770
860
 
771
- export declare const TStrokes: DefineComponent<__VLS_Props_19, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_19> & Readonly<{}>, {
861
+ export declare const TStrokes: DefineComponent<__VLS_Props_24, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_24> & Readonly<{}>, {
772
862
  opacity: number;
773
863
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
774
864
 
775
- export declare const TTimerBar: DefineComponent<__VLS_Props_18, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
776
- stop: () => any;
865
+ export declare const TTimerBar: DefineComponent<__VLS_Props_23, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
866
+ stop: (id: string) => any;
777
867
  open: () => any;
778
- }, string, PublicProps, Readonly<__VLS_Props_18> & Readonly<{
779
- onStop?: (() => any) | undefined;
868
+ stopAll: () => any;
869
+ }, string, PublicProps, Readonly<__VLS_Props_23> & Readonly<{
870
+ onStop?: ((id: string) => any) | undefined;
780
871
  onOpen?: (() => any) | undefined;
872
+ onStopAll?: (() => any) | undefined;
781
873
  }>, {
782
- color: string;
783
874
  bottom: number;
784
- more: number;
785
875
  android: boolean;
786
- }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
876
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
787
877
 
788
878
  export declare const TToggle: DefineComponent<__VLS_Props_6, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
789
879
  "update:modelValue": (v: boolean) => any;
@@ -795,32 +885,83 @@ disabled: boolean;
795
885
 
796
886
  export declare const TTooltip: __VLS_WithTemplateSlots_11<typeof __VLS_component_11, __VLS_TemplateResult_11["slots"]>;
797
887
 
798
- export declare const TWaterfall: DefineComponent<__VLS_Props_15, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_15> & Readonly<{}>, {
888
+ export declare const TWaterfall: DefineComponent<__VLS_Props_18, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_18> & Readonly<{}>, {
799
889
  end: number;
800
890
  start: number;
801
891
  compact: boolean;
802
892
  labelW: number;
803
893
  rowH: number;
894
+ showWs: boolean;
804
895
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
805
896
 
806
- export declare const TWorkspaceSwitcher: DefineComponent<__VLS_Props_17, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
897
+ export declare const TWorkspaceDrawer: DefineComponent<__VLS_Props_22, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
898
+ help: () => any;
807
899
  "update:modelValue": (id: string) => any;
900
+ close: () => any;
808
901
  create: () => any;
809
- }, string, PublicProps, Readonly<__VLS_Props_17> & Readonly<{
902
+ preferences: () => any;
903
+ actions: () => any;
904
+ }, string, PublicProps, Readonly<__VLS_Props_22> & Readonly<{
905
+ onHelp?: (() => any) | undefined;
810
906
  "onUpdate:modelValue"?: ((id: string) => any) | undefined;
907
+ onClose?: (() => any) | undefined;
811
908
  onCreate?: (() => any) | undefined;
812
- }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
909
+ onPreferences?: (() => any) | undefined;
910
+ onActions?: (() => any) | undefined;
911
+ }>, {
912
+ teleport: boolean;
913
+ showAll: boolean;
914
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
915
+
916
+ export declare const TWorkspaceMenu: DefineComponent<__VLS_Props_21, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
917
+ "update:modelValue": (id: string) => any;
918
+ create: () => any;
919
+ }, string, PublicProps, Readonly<__VLS_Props_21> & Readonly<{
920
+ "onUpdate:modelValue"?: ((id: string) => any) | undefined;
921
+ onCreate?: (() => any) | undefined;
922
+ }>, {
923
+ showAll: boolean;
924
+ embedded: boolean;
925
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
926
+
927
+ export declare const TWorkspaceSwitcher: DefineComponent<__VLS_Props_20, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
928
+ "update:modelValue": (id: string) => any;
929
+ create: () => any;
930
+ }, string, PublicProps, Readonly<__VLS_Props_20> & Readonly<{
931
+ "onUpdate:modelValue"?: ((id: string) => any) | undefined;
932
+ onCreate?: (() => any) | undefined;
933
+ }>, {
934
+ showAll: boolean;
935
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {
813
936
  root: HTMLDivElement;
814
937
  }, HTMLDivElement>;
815
938
 
939
+ export declare const TWsIcon: DefineComponent<__VLS_Props_13, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_13> & Readonly<{}>, {
940
+ color: string;
941
+ name: string;
942
+ size: number;
943
+ all: boolean;
944
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
945
+
946
+ export declare const TWsTag: DefineComponent<__VLS_Props_12, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_12> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
947
+
816
948
  export declare function watchTheme(pref: () => ThemePreference, root: HTMLElement, media?: MediaQueryList | null): {
817
949
  refresh(): void;
818
950
  stop(): void;
819
951
  };
820
952
 
953
+ export declare interface WaterfallProject {
954
+ project: string;
955
+ color: string;
956
+ ws?: {
957
+ name: string;
958
+ color: string;
959
+ };
960
+ tasks: WaterfallRow[];
961
+ }
962
+
821
963
  export declare interface WaterfallRow {
822
964
  label: string;
823
- color: string;
824
965
  segments: WaterfallSegment[];
825
966
  }
826
967
 
@@ -835,6 +976,7 @@ export declare interface WorkspaceOption {
835
976
  name: string;
836
977
  color: string;
837
978
  memberCount: number;
979
+ projectCount?: number;
838
980
  isDefault: boolean;
839
981
  personal: boolean;
840
982
  }