@dstally/vue 1.0.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 +47 -0
- package/dist/index.d.ts +539 -0
- package/dist/style.css +1 -0
- package/dist/tally-vue.js +1047 -0
- package/dist/tally-vue.umd.cjs +1 -0
- package/package.json +46 -0
package/README.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# @dstally/vue
|
|
2
|
+
|
|
3
|
+
Vue 3 components for Tally, built only on `@dstally/tokens` variables.
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
pnpm add @dstally/vue @dstally/tokens vue
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
```vue
|
|
10
|
+
<script setup lang="ts">
|
|
11
|
+
import { TButton, TTimerPill, TIcon } from '@dstally/vue'
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<template>
|
|
15
|
+
<TButton size="xl"><template #iconLeft><TIcon name="download" :size="17" /></template>Download for macOS</TButton>
|
|
16
|
+
<TTimerPill project="Acme rebrand" task="Logo exploration" :seconds="8047" running :parallel-count="3" />
|
|
17
|
+
</template>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Importing anything from `@dstally/vue` also loads `@dstally/tokens/styles.css`; no separate CSS import needed. Dark is default — put `data-theme="light"` on `<html>` for light.
|
|
21
|
+
|
|
22
|
+
## Components
|
|
23
|
+
|
|
24
|
+
| | Purpose |
|
|
25
|
+
|---|---|
|
|
26
|
+
| `TButton` | primary (amber, one per view) · secondary (blue) · outline · ghost · danger; sm/md/lg/xl |
|
|
27
|
+
| `TIconButton` | square icon control; `label` required |
|
|
28
|
+
| `TInput` `TSelect` `TCheckbox` `TSwitch` `TSegmentedControl` | forms; all `v-model` |
|
|
29
|
+
| `TIcon` | Lucide glyph via CSS mask, follows `currentColor` |
|
|
30
|
+
| `TCard` `TBadge` `TTag` `TTooltip` `TDialog` `TProgressBar` | surfaces and feedback |
|
|
31
|
+
| `TLogo` | the mark, correct artwork per size |
|
|
32
|
+
| `TDurationText` | every duration; mono + tabular |
|
|
33
|
+
| `TProjectDot` `TProjectRow` | project identity and the 38px list line |
|
|
34
|
+
| `TTimerPill` | the floating always-visible timer |
|
|
35
|
+
| `TWaterfallTimeline` | parallel-time visualisation for reports |
|
|
36
|
+
|
|
37
|
+
Also exported: `formatDuration(seconds, 'clock' | 'short' | 'compact')`, `PROJECT_COLORS`.
|
|
38
|
+
|
|
39
|
+
## Rules
|
|
40
|
+
|
|
41
|
+
- `TBadge tone="soon"` with the words "Coming soon" on every roadmap item.
|
|
42
|
+
- Amber = running, blue = selected. Never both on one element.
|
|
43
|
+
- Project colours come from `PROJECT_COLORS` (Okabe-Ito). Nothing else.
|
|
44
|
+
|
|
45
|
+
## Develop
|
|
46
|
+
|
|
47
|
+
`pnpm dev` opens the playground with every component and state, and a dark/light switch.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
import { ComponentOptionsMixin } from 'vue';
|
|
2
|
+
import { ComponentProvideOptions } from 'vue';
|
|
3
|
+
import { DefineComponent } from 'vue';
|
|
4
|
+
import { PublicProps } from 'vue';
|
|
5
|
+
|
|
6
|
+
declare const __VLS_component: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
7
|
+
click: (e: MouseEvent) => any;
|
|
8
|
+
}, string, PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
9
|
+
onClick?: ((e: MouseEvent) => any) | undefined;
|
|
10
|
+
}>, {
|
|
11
|
+
variant: "primary" | "secondary" | "outline" | "ghost" | "danger";
|
|
12
|
+
size: "sm" | "md" | "lg" | "xl";
|
|
13
|
+
disabled: boolean;
|
|
14
|
+
fullWidth: boolean;
|
|
15
|
+
type: "button" | "submit" | "reset";
|
|
16
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLButtonElement>;
|
|
17
|
+
|
|
18
|
+
declare const __VLS_component_2: DefineComponent<__VLS_Props_2, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
19
|
+
click: (e: MouseEvent) => any;
|
|
20
|
+
}, string, PublicProps, Readonly<__VLS_Props_2> & Readonly<{
|
|
21
|
+
onClick?: ((e: MouseEvent) => any) | undefined;
|
|
22
|
+
}>, {
|
|
23
|
+
variant: "ghost" | "outline";
|
|
24
|
+
size: "sm" | "md" | "lg";
|
|
25
|
+
disabled: boolean;
|
|
26
|
+
active: boolean;
|
|
27
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLButtonElement>;
|
|
28
|
+
|
|
29
|
+
declare const __VLS_component_3: DefineComponent<__VLS_Props_3, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
30
|
+
"update:modelValue": (v: string) => any;
|
|
31
|
+
}, string, PublicProps, Readonly<__VLS_Props_3> & Readonly<{
|
|
32
|
+
"onUpdate:modelValue"?: ((v: string) => any) | undefined;
|
|
33
|
+
}>, {
|
|
34
|
+
size: "sm" | "md" | "lg";
|
|
35
|
+
disabled: boolean;
|
|
36
|
+
type: string;
|
|
37
|
+
mono: boolean;
|
|
38
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
|
|
39
|
+
|
|
40
|
+
declare const __VLS_component_4: DefineComponent<__VLS_Props_9, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_9> & Readonly<{}>, {
|
|
41
|
+
padding: number;
|
|
42
|
+
interactive: boolean;
|
|
43
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
44
|
+
|
|
45
|
+
declare const __VLS_component_5: DefineComponent<__VLS_Props_10, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_10> & Readonly<{}>, {
|
|
46
|
+
tone: "neutral" | "running" | "success" | "danger" | "info" | "soon";
|
|
47
|
+
dot: boolean;
|
|
48
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
|
|
49
|
+
|
|
50
|
+
declare const __VLS_component_6: DefineComponent<__VLS_Props_11, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
51
|
+
remove: () => any;
|
|
52
|
+
}, string, PublicProps, Readonly<__VLS_Props_11> & Readonly<{
|
|
53
|
+
onRemove?: (() => any) | undefined;
|
|
54
|
+
}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
|
|
55
|
+
|
|
56
|
+
declare const __VLS_component_7: DefineComponent<__VLS_Props_12, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_12> & Readonly<{}>, {
|
|
57
|
+
side: "top" | "bottom" | "left" | "right";
|
|
58
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
|
|
59
|
+
|
|
60
|
+
declare const __VLS_component_8: DefineComponent<__VLS_Props_13, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
61
|
+
close: () => any;
|
|
62
|
+
}, string, PublicProps, Readonly<__VLS_Props_13> & Readonly<{
|
|
63
|
+
onClose?: (() => any) | undefined;
|
|
64
|
+
}>, {
|
|
65
|
+
width: number;
|
|
66
|
+
teleport: boolean;
|
|
67
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
|
|
68
|
+
|
|
69
|
+
declare type __VLS_Props = {
|
|
70
|
+
/** Only one primary per view. */
|
|
71
|
+
variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger';
|
|
72
|
+
size?: 'sm' | 'md' | 'lg' | 'xl';
|
|
73
|
+
disabled?: boolean;
|
|
74
|
+
fullWidth?: boolean;
|
|
75
|
+
type?: 'button' | 'submit' | 'reset';
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
/** Status pill. tone="soon" is mandatory on every roadmap item. */
|
|
79
|
+
declare type __VLS_Props_10 = {
|
|
80
|
+
tone?: 'neutral' | 'running' | 'success' | 'danger' | 'info' | 'soon';
|
|
81
|
+
/** Leading dot — pair with running so state is never colour-only. */
|
|
82
|
+
dot?: boolean;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/** Task / client / label chip. 6px radius so it never reads as a status badge. */
|
|
86
|
+
declare type __VLS_Props_11 = {
|
|
87
|
+
/** Okabe-Ito token, e.g. var(--chart-2). */
|
|
88
|
+
color?: string;
|
|
89
|
+
removable?: boolean;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
declare type __VLS_Props_12 = {
|
|
93
|
+
content: string;
|
|
94
|
+
/** e.g. ⌘N — mono, muted, at the end. */
|
|
95
|
+
shortcut?: string;
|
|
96
|
+
side?: 'top' | 'bottom' | 'left' | 'right';
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
/** Centred modal over a blurred scrim. Teleports to body by default; set teleport=false to host inside a positioned frame. */
|
|
100
|
+
declare type __VLS_Props_13 = {
|
|
101
|
+
open: boolean;
|
|
102
|
+
title?: string;
|
|
103
|
+
description?: string;
|
|
104
|
+
width?: number;
|
|
105
|
+
teleport?: boolean;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
declare type __VLS_Props_14 = {
|
|
109
|
+
value?: number;
|
|
110
|
+
max?: number;
|
|
111
|
+
/** Okabe-Ito --chart-* when the bar stands for a project. */
|
|
112
|
+
color?: string;
|
|
113
|
+
label?: string;
|
|
114
|
+
height?: number;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/** The Tally mark from shipped artwork. Below 64px it swaps to the three-upright small-size PNGs. */
|
|
118
|
+
declare type __VLS_Props_15 = {
|
|
119
|
+
size?: number;
|
|
120
|
+
wordmark?: boolean;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
/** Every duration in Tally. Mono, tabular, so ticking digits never shift layout. */
|
|
124
|
+
declare type __VLS_Props_16 = {
|
|
125
|
+
seconds?: number;
|
|
126
|
+
format?: DurationFormat;
|
|
127
|
+
size?: 'sm' | 'md' | 'lg' | 'xl';
|
|
128
|
+
tone?: 'default' | 'running' | 'muted';
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/** A project's colour identity. Okabe-Ito only. Never carries meaning alone. */
|
|
132
|
+
declare type __VLS_Props_17 = {
|
|
133
|
+
color?: string;
|
|
134
|
+
size?: number;
|
|
135
|
+
running?: boolean;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/** 38px list line with inline start/stop. Running = amber halo + the word + a stop button. Selected = blue. */
|
|
139
|
+
declare type __VLS_Props_18 = {
|
|
140
|
+
project: string;
|
|
141
|
+
task?: string;
|
|
142
|
+
color?: string;
|
|
143
|
+
seconds?: number;
|
|
144
|
+
running?: boolean;
|
|
145
|
+
selected?: boolean;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
/** The floating always-visible timer — Tally's signature object. Amber border + glow while running. */
|
|
149
|
+
declare type __VLS_Props_19 = {
|
|
150
|
+
project: string;
|
|
151
|
+
task?: string;
|
|
152
|
+
color?: string;
|
|
153
|
+
seconds?: number;
|
|
154
|
+
running?: boolean;
|
|
155
|
+
/** Total timers running; >1 shows a +n chip. */
|
|
156
|
+
parallelCount?: number;
|
|
157
|
+
/** 34px variant for menu bars. */
|
|
158
|
+
compact?: boolean;
|
|
159
|
+
expandable?: boolean;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
declare type __VLS_Props_2 = {
|
|
163
|
+
/** Accessible name and tooltip. Required. */
|
|
164
|
+
label: string;
|
|
165
|
+
size?: 'sm' | 'md' | 'lg';
|
|
166
|
+
variant?: 'ghost' | 'outline';
|
|
167
|
+
/** Toggled-on: blue selected wash. Never use for "running". */
|
|
168
|
+
active?: boolean;
|
|
169
|
+
disabled?: boolean;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
/** Parallel-time waterfall: one row per project, overlaps visible. shared segments render at 55% with a dashed edge. */
|
|
173
|
+
declare type __VLS_Props_20 = {
|
|
174
|
+
rows: WaterfallRow[];
|
|
175
|
+
startHour?: number;
|
|
176
|
+
endHour?: number;
|
|
177
|
+
rowHeight?: number;
|
|
178
|
+
showAxis?: boolean;
|
|
179
|
+
labelWidth?: number;
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
declare type __VLS_Props_3 = {
|
|
183
|
+
modelValue?: string | number;
|
|
184
|
+
label?: string;
|
|
185
|
+
hint?: string;
|
|
186
|
+
/** Replaces hint and turns the field red. */
|
|
187
|
+
error?: string;
|
|
188
|
+
size?: 'sm' | 'md' | 'lg';
|
|
189
|
+
/** Mono + tabular. Required for durations, times, rates. */
|
|
190
|
+
mono?: boolean;
|
|
191
|
+
disabled?: boolean;
|
|
192
|
+
placeholder?: string;
|
|
193
|
+
type?: string;
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
declare type __VLS_Props_4 = {
|
|
197
|
+
modelValue?: string;
|
|
198
|
+
options: SelectOption[];
|
|
199
|
+
label?: string;
|
|
200
|
+
size?: 'sm' | 'md' | 'lg';
|
|
201
|
+
disabled?: boolean;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
declare type __VLS_Props_5 = {
|
|
205
|
+
modelValue?: boolean;
|
|
206
|
+
label: string;
|
|
207
|
+
description?: string;
|
|
208
|
+
indeterminate?: boolean;
|
|
209
|
+
disabled?: boolean;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
declare type __VLS_Props_6 = {
|
|
213
|
+
modelValue?: boolean;
|
|
214
|
+
label: string;
|
|
215
|
+
description?: string;
|
|
216
|
+
disabled?: boolean;
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
declare type __VLS_Props_7 = {
|
|
220
|
+
modelValue: string;
|
|
221
|
+
options: {
|
|
222
|
+
value: string;
|
|
223
|
+
label: string;
|
|
224
|
+
}[];
|
|
225
|
+
size?: 'sm' | 'md';
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Lucide glyph painted with a CSS mask so it follows currentColor.
|
|
230
|
+
* SUBSTITUTION: Tally has no icon set of its own yet; Lucide is the closest match to the mark.
|
|
231
|
+
*/
|
|
232
|
+
declare type __VLS_Props_8 = {
|
|
233
|
+
/** Lucide kebab-case name: play, pause, square, layers, file-text… */
|
|
234
|
+
name: string;
|
|
235
|
+
/** 16 in the app, 20 in the site header, 24 in marketing rows. */
|
|
236
|
+
size?: number;
|
|
237
|
+
color?: string;
|
|
238
|
+
/** Override the CDN base if you self-host lucide-static. */
|
|
239
|
+
base?: string;
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
/** Surface + hairline + 12px radius. No shadow on dark unless it genuinely floats. */
|
|
243
|
+
declare type __VLS_Props_9 = {
|
|
244
|
+
title?: string;
|
|
245
|
+
subtitle?: string;
|
|
246
|
+
/** Body padding px. 16 default; 12 in dense app panels. */
|
|
247
|
+
padding?: number;
|
|
248
|
+
interactive?: boolean;
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
declare function __VLS_template(): {
|
|
252
|
+
attrs: Partial<{}>;
|
|
253
|
+
slots: {
|
|
254
|
+
iconLeft?(_: {}): any;
|
|
255
|
+
default?(_: {}): any;
|
|
256
|
+
iconRight?(_: {}): any;
|
|
257
|
+
};
|
|
258
|
+
refs: {};
|
|
259
|
+
rootEl: HTMLButtonElement;
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
declare function __VLS_template_2(): {
|
|
263
|
+
attrs: Partial<{}>;
|
|
264
|
+
slots: {
|
|
265
|
+
default?(_: {}): any;
|
|
266
|
+
};
|
|
267
|
+
refs: {};
|
|
268
|
+
rootEl: HTMLButtonElement;
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
declare function __VLS_template_3(): {
|
|
272
|
+
attrs: Partial<{}>;
|
|
273
|
+
slots: {
|
|
274
|
+
prefix?(_: {}): any;
|
|
275
|
+
suffix?(_: {}): any;
|
|
276
|
+
};
|
|
277
|
+
refs: {};
|
|
278
|
+
rootEl: HTMLLabelElement;
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
declare function __VLS_template_4(): {
|
|
282
|
+
attrs: Partial<{}>;
|
|
283
|
+
slots: {
|
|
284
|
+
actions?(_: {}): any;
|
|
285
|
+
default?(_: {}): any;
|
|
286
|
+
footer?(_: {}): any;
|
|
287
|
+
};
|
|
288
|
+
refs: {};
|
|
289
|
+
rootEl: HTMLDivElement;
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
declare function __VLS_template_5(): {
|
|
293
|
+
attrs: Partial<{}>;
|
|
294
|
+
slots: {
|
|
295
|
+
default?(_: {}): any;
|
|
296
|
+
};
|
|
297
|
+
refs: {};
|
|
298
|
+
rootEl: HTMLSpanElement;
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
declare function __VLS_template_6(): {
|
|
302
|
+
attrs: Partial<{}>;
|
|
303
|
+
slots: {
|
|
304
|
+
default?(_: {}): any;
|
|
305
|
+
};
|
|
306
|
+
refs: {};
|
|
307
|
+
rootEl: HTMLSpanElement;
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
declare function __VLS_template_7(): {
|
|
311
|
+
attrs: Partial<{}>;
|
|
312
|
+
slots: {
|
|
313
|
+
default?(_: {}): any;
|
|
314
|
+
};
|
|
315
|
+
refs: {};
|
|
316
|
+
rootEl: HTMLSpanElement;
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
declare function __VLS_template_8(): {
|
|
320
|
+
attrs: Partial<{}>;
|
|
321
|
+
slots: {
|
|
322
|
+
default?(_: {}): any;
|
|
323
|
+
footer?(_: {}): any;
|
|
324
|
+
};
|
|
325
|
+
refs: {};
|
|
326
|
+
rootEl: any;
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
|
|
330
|
+
|
|
331
|
+
declare type __VLS_TemplateResult_2 = ReturnType<typeof __VLS_template_2>;
|
|
332
|
+
|
|
333
|
+
declare type __VLS_TemplateResult_3 = ReturnType<typeof __VLS_template_3>;
|
|
334
|
+
|
|
335
|
+
declare type __VLS_TemplateResult_4 = ReturnType<typeof __VLS_template_4>;
|
|
336
|
+
|
|
337
|
+
declare type __VLS_TemplateResult_5 = ReturnType<typeof __VLS_template_5>;
|
|
338
|
+
|
|
339
|
+
declare type __VLS_TemplateResult_6 = ReturnType<typeof __VLS_template_6>;
|
|
340
|
+
|
|
341
|
+
declare type __VLS_TemplateResult_7 = ReturnType<typeof __VLS_template_7>;
|
|
342
|
+
|
|
343
|
+
declare type __VLS_TemplateResult_8 = ReturnType<typeof __VLS_template_8>;
|
|
344
|
+
|
|
345
|
+
declare type __VLS_WithTemplateSlots<T, S> = T & {
|
|
346
|
+
new (): {
|
|
347
|
+
$slots: S;
|
|
348
|
+
};
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
declare type __VLS_WithTemplateSlots_2<T, S> = T & {
|
|
352
|
+
new (): {
|
|
353
|
+
$slots: S;
|
|
354
|
+
};
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
declare type __VLS_WithTemplateSlots_3<T, S> = T & {
|
|
358
|
+
new (): {
|
|
359
|
+
$slots: S;
|
|
360
|
+
};
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
declare type __VLS_WithTemplateSlots_4<T, S> = T & {
|
|
364
|
+
new (): {
|
|
365
|
+
$slots: S;
|
|
366
|
+
};
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
declare type __VLS_WithTemplateSlots_5<T, S> = T & {
|
|
370
|
+
new (): {
|
|
371
|
+
$slots: S;
|
|
372
|
+
};
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
declare type __VLS_WithTemplateSlots_6<T, S> = T & {
|
|
376
|
+
new (): {
|
|
377
|
+
$slots: S;
|
|
378
|
+
};
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
declare type __VLS_WithTemplateSlots_7<T, S> = T & {
|
|
382
|
+
new (): {
|
|
383
|
+
$slots: S;
|
|
384
|
+
};
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
declare type __VLS_WithTemplateSlots_8<T, S> = T & {
|
|
388
|
+
new (): {
|
|
389
|
+
$slots: S;
|
|
390
|
+
};
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
export declare type DurationFormat = 'clock' | 'short' | 'compact';
|
|
394
|
+
|
|
395
|
+
/** 8047 → "2:14:07" (clock) · "2:14" (short) · "2h 14m" (compact) */
|
|
396
|
+
export declare function formatDuration(seconds: number, format?: DurationFormat): string;
|
|
397
|
+
|
|
398
|
+
/** Okabe-Ito, the only palette permitted for projects and charts. */
|
|
399
|
+
export declare const PROJECT_COLORS: string[];
|
|
400
|
+
|
|
401
|
+
export declare interface SelectOption {
|
|
402
|
+
value: string;
|
|
403
|
+
label: string;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
export declare const TBadge: __VLS_WithTemplateSlots_5<typeof __VLS_component_5, __VLS_TemplateResult_5["slots"]>;
|
|
407
|
+
|
|
408
|
+
export declare const TButton: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
|
|
409
|
+
|
|
410
|
+
export declare const TCard: __VLS_WithTemplateSlots_4<typeof __VLS_component_4, __VLS_TemplateResult_4["slots"]>;
|
|
411
|
+
|
|
412
|
+
export declare const TCheckbox: DefineComponent<__VLS_Props_5, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
413
|
+
"update:modelValue": (v: boolean) => any;
|
|
414
|
+
}, string, PublicProps, Readonly<__VLS_Props_5> & Readonly<{
|
|
415
|
+
"onUpdate:modelValue"?: ((v: boolean) => any) | undefined;
|
|
416
|
+
}>, {
|
|
417
|
+
disabled: boolean;
|
|
418
|
+
modelValue: boolean;
|
|
419
|
+
indeterminate: boolean;
|
|
420
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
|
|
421
|
+
|
|
422
|
+
export declare const TDialog: __VLS_WithTemplateSlots_8<typeof __VLS_component_8, __VLS_TemplateResult_8["slots"]>;
|
|
423
|
+
|
|
424
|
+
export declare const TDurationText: DefineComponent<__VLS_Props_16, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_16> & Readonly<{}>, {
|
|
425
|
+
size: "sm" | "md" | "lg" | "xl";
|
|
426
|
+
tone: "default" | "running" | "muted";
|
|
427
|
+
seconds: number;
|
|
428
|
+
format: DurationFormat;
|
|
429
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
|
|
430
|
+
|
|
431
|
+
export declare const TIcon: DefineComponent<__VLS_Props_8, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_8> & Readonly<{}>, {
|
|
432
|
+
size: number;
|
|
433
|
+
base: string;
|
|
434
|
+
color: string;
|
|
435
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
|
|
436
|
+
|
|
437
|
+
export declare const TIconButton: __VLS_WithTemplateSlots_2<typeof __VLS_component_2, __VLS_TemplateResult_2["slots"]>;
|
|
438
|
+
|
|
439
|
+
export declare const TInput: __VLS_WithTemplateSlots_3<typeof __VLS_component_3, __VLS_TemplateResult_3["slots"]>;
|
|
440
|
+
|
|
441
|
+
export declare const TLogo: DefineComponent<__VLS_Props_15, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_15> & Readonly<{}>, {
|
|
442
|
+
size: number;
|
|
443
|
+
wordmark: boolean;
|
|
444
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
|
|
445
|
+
|
|
446
|
+
export declare const TProgressBar: DefineComponent<__VLS_Props_14, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_14> & Readonly<{}>, {
|
|
447
|
+
height: number;
|
|
448
|
+
color: string;
|
|
449
|
+
value: number;
|
|
450
|
+
max: number;
|
|
451
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
452
|
+
|
|
453
|
+
export declare const TProjectDot: DefineComponent<__VLS_Props_17, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_17> & Readonly<{}>, {
|
|
454
|
+
size: number;
|
|
455
|
+
color: string;
|
|
456
|
+
running: boolean;
|
|
457
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
|
|
458
|
+
|
|
459
|
+
export declare const TProjectRow: DefineComponent<__VLS_Props_18, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
460
|
+
select: () => any;
|
|
461
|
+
start: () => any;
|
|
462
|
+
}, string, PublicProps, Readonly<__VLS_Props_18> & Readonly<{
|
|
463
|
+
onSelect?: (() => any) | undefined;
|
|
464
|
+
onStart?: (() => any) | undefined;
|
|
465
|
+
}>, {
|
|
466
|
+
color: string;
|
|
467
|
+
running: boolean;
|
|
468
|
+
seconds: number;
|
|
469
|
+
selected: boolean;
|
|
470
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
471
|
+
|
|
472
|
+
export declare const TSegmentedControl: DefineComponent<__VLS_Props_7, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
473
|
+
"update:modelValue": (v: string) => any;
|
|
474
|
+
}, string, PublicProps, Readonly<__VLS_Props_7> & Readonly<{
|
|
475
|
+
"onUpdate:modelValue"?: ((v: string) => any) | undefined;
|
|
476
|
+
}>, {
|
|
477
|
+
size: "sm" | "md";
|
|
478
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
479
|
+
|
|
480
|
+
export declare const TSelect: DefineComponent<__VLS_Props_4, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
481
|
+
"update:modelValue": (v: string) => any;
|
|
482
|
+
}, string, PublicProps, Readonly<__VLS_Props_4> & Readonly<{
|
|
483
|
+
"onUpdate:modelValue"?: ((v: string) => any) | undefined;
|
|
484
|
+
}>, {
|
|
485
|
+
size: "sm" | "md" | "lg";
|
|
486
|
+
disabled: boolean;
|
|
487
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
|
|
488
|
+
|
|
489
|
+
export declare const TSwitch: DefineComponent<__VLS_Props_6, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
490
|
+
"update:modelValue": (v: boolean) => any;
|
|
491
|
+
}, string, PublicProps, Readonly<__VLS_Props_6> & Readonly<{
|
|
492
|
+
"onUpdate:modelValue"?: ((v: boolean) => any) | undefined;
|
|
493
|
+
}>, {
|
|
494
|
+
disabled: boolean;
|
|
495
|
+
modelValue: boolean;
|
|
496
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
|
|
497
|
+
|
|
498
|
+
export declare const TTag: __VLS_WithTemplateSlots_6<typeof __VLS_component_6, __VLS_TemplateResult_6["slots"]>;
|
|
499
|
+
|
|
500
|
+
export declare const TTimerPill: DefineComponent<__VLS_Props_19, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
501
|
+
stop: () => any;
|
|
502
|
+
toggle: () => any;
|
|
503
|
+
expand: () => any;
|
|
504
|
+
}, string, PublicProps, Readonly<__VLS_Props_19> & Readonly<{
|
|
505
|
+
onStop?: (() => any) | undefined;
|
|
506
|
+
onToggle?: (() => any) | undefined;
|
|
507
|
+
onExpand?: (() => any) | undefined;
|
|
508
|
+
}>, {
|
|
509
|
+
color: string;
|
|
510
|
+
running: boolean;
|
|
511
|
+
compact: boolean;
|
|
512
|
+
seconds: number;
|
|
513
|
+
parallelCount: number;
|
|
514
|
+
expandable: boolean;
|
|
515
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
516
|
+
|
|
517
|
+
export declare const TTooltip: __VLS_WithTemplateSlots_7<typeof __VLS_component_7, __VLS_TemplateResult_7["slots"]>;
|
|
518
|
+
|
|
519
|
+
export declare const TWaterfallTimeline: DefineComponent<__VLS_Props_20, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_20> & Readonly<{}>, {
|
|
520
|
+
startHour: number;
|
|
521
|
+
endHour: number;
|
|
522
|
+
rowHeight: number;
|
|
523
|
+
showAxis: boolean;
|
|
524
|
+
labelWidth: number;
|
|
525
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
526
|
+
|
|
527
|
+
export declare interface WaterfallRow {
|
|
528
|
+
label: string;
|
|
529
|
+
color: string;
|
|
530
|
+
segments: WaterfallSegment[];
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
export declare interface WaterfallSegment {
|
|
534
|
+
start: number;
|
|
535
|
+
end: number;
|
|
536
|
+
shared?: boolean;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
export { }
|
package/dist/style.css
ADDED
|
@@ -0,0 +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)}
|