@heyramzi/ui 3.1.0 → 3.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.
Files changed (144) hide show
  1. package/dist/lib/sliding-pill.js +2 -2
  2. package/dist/record/measure-clamp.js +23 -0
  3. package/dist/shadcn/button-group/index.js +6 -0
  4. package/dist/shadcn/checkbox/checkbox-box.js +3 -0
  5. package/dist/shadcn/input-group/index.js +9 -0
  6. package/dist/shadcn/item/index.js +13 -0
  7. package/dist/shadcn/native-select/index.js +6 -0
  8. package/dist/shadcn/pagination/index.js +12 -0
  9. package/package.json +1 -1
  10. package/scripts/sync-shadcn.mjs +0 -5
  11. package/src/ai/generation-progress/GenerationProgress.svelte +14 -12
  12. package/src/canvas/pen/PenOverlay.svelte +1 -30
  13. package/src/canvas/screen/PartView.svelte +13 -8
  14. package/src/canvas/screen/ScreenBody.svelte +18 -11
  15. package/src/canvas/ui/BarTooltip.svelte +46 -0
  16. package/src/canvas/ui/BarTooltip.svelte.d.ts +17 -0
  17. package/src/canvas/ui/CanvasToolbar.svelte +170 -156
  18. package/src/canvas/ui/StylePanel.svelte +179 -102
  19. package/src/canvas/ui/canvas-ui.css +12 -76
  20. package/src/charts/dashboard/data-table.svelte +80 -80
  21. package/src/charts/dashboard/hint.svelte +34 -0
  22. package/src/charts/dashboard/hint.svelte.d.ts +10 -0
  23. package/src/charts/dashboard/rating-chip.svelte +4 -3
  24. package/src/charts/legend.css +0 -8
  25. package/src/charts/legend.svelte +26 -30
  26. package/src/components/copy/copy-button.svelte +10 -2
  27. package/src/components/copy/copy-button.test.ts +7 -0
  28. package/src/components/data-table/table-skeleton.svelte +15 -7
  29. package/src/components/data-table/table-skeleton.svelte.d.ts +4 -0
  30. package/src/components/docs/on-this-page.svelte +2 -2
  31. package/src/components/hold-to-confirm/hold-to-confirm.svelte +2 -1
  32. package/src/components/list-page/filter-item.svelte +20 -7
  33. package/src/components/list-page/filter-popover.svelte +41 -16
  34. package/src/components/list-page/filter-popover.svelte.d.ts +1 -1
  35. package/src/components/list-page/grouped-list.svelte +41 -23
  36. package/src/components/picker/picker.svelte +8 -3
  37. package/src/components/picker/picker.svelte.d.ts +2 -1
  38. package/src/components/segmented/segmented-filter.svelte +19 -10
  39. package/src/components/segmented/segmented-track.svelte +11 -3
  40. package/src/components/table-view/table-view.svelte +22 -6
  41. package/src/components/tags-input/tags-input.svelte +94 -77
  42. package/src/components/toolbar/toolbar.svelte +2 -1
  43. package/src/components/toolbar/toolbar.test.ts +5 -4
  44. package/src/components/work-parts/group-head.svelte +28 -9
  45. package/src/components/work-parts/group-head.svelte.d.ts +5 -2
  46. package/src/editor/editor-toolbar.svelte +223 -193
  47. package/src/editor/editor.svelte +56 -38
  48. package/src/editor/image-toolbar.svelte +99 -37
  49. package/src/editor/image-toolbar.svelte.d.ts +4 -5
  50. package/src/editor/url-dialog.svelte +96 -0
  51. package/src/editor/url-dialog.svelte.d.ts +15 -0
  52. package/src/effects/theme-toggle/ThemeToggle.css +8 -8
  53. package/src/effects/theme-toggle/ThemeToggle.svelte +20 -6
  54. package/src/inbox/thread-inbox.svelte +9 -1
  55. package/src/lib/live-region.svelte +12 -4
  56. package/src/lib/live-region.svelte.d.ts +5 -1
  57. package/src/lib/sliding-pill.ts +3 -2
  58. package/src/record/info-list.svelte +33 -59
  59. package/src/record/measure-clamp.ts +31 -0
  60. package/src/record/record-shell.svelte +38 -39
  61. package/src/record/record-timeline.svelte +10 -5
  62. package/src/record/steps-rail.svelte +50 -36
  63. package/src/record/where-we-are.svelte +5 -19
  64. package/src/shadcn/button-group/button-group-separator.svelte +23 -0
  65. package/src/shadcn/button-group/button-group-separator.svelte.d.ts +13 -0
  66. package/src/shadcn/button-group/button-group-text.svelte +28 -0
  67. package/src/shadcn/button-group/button-group-text.svelte.d.ts +11 -0
  68. package/src/shadcn/button-group/button-group.svelte +46 -0
  69. package/src/shadcn/button-group/button-group.svelte.d.ts +16 -0
  70. package/src/shadcn/button-group/index.ts +15 -0
  71. package/src/shadcn/checkbox/checkbox-box.ts +4 -0
  72. package/src/shadcn/checkbox/checkbox.svelte +2 -4
  73. package/src/shadcn/input-group/index.ts +22 -0
  74. package/src/shadcn/input-group/input-group-addon.svelte +51 -0
  75. package/src/shadcn/input-group/input-group-addon.svelte.d.ts +18 -0
  76. package/src/shadcn/input-group/input-group-button.svelte +49 -0
  77. package/src/shadcn/input-group/input-group-button.svelte.d.ts +18 -0
  78. package/src/shadcn/input-group/input-group-input.svelte +20 -0
  79. package/src/shadcn/input-group/input-group-input.svelte.d.ts +11 -0
  80. package/src/shadcn/input-group/input-group-text.svelte +19 -0
  81. package/src/shadcn/input-group/input-group-text.svelte.d.ts +5 -0
  82. package/src/shadcn/input-group/input-group-textarea.svelte +20 -0
  83. package/src/shadcn/input-group/input-group-textarea.svelte.d.ts +3 -0
  84. package/src/shadcn/input-group/input-group.svelte +24 -0
  85. package/src/shadcn/input-group/input-group.svelte.d.ts +5 -0
  86. package/src/shadcn/item/index.ts +34 -0
  87. package/src/shadcn/item/item-actions.svelte +20 -0
  88. package/src/shadcn/item/item-actions.svelte.d.ts +5 -0
  89. package/src/shadcn/item/item-content.svelte +23 -0
  90. package/src/shadcn/item/item-content.svelte.d.ts +5 -0
  91. package/src/shadcn/item/item-description.svelte +23 -0
  92. package/src/shadcn/item/item-description.svelte.d.ts +5 -0
  93. package/src/shadcn/item/item-footer.svelte +20 -0
  94. package/src/shadcn/item/item-footer.svelte.d.ts +5 -0
  95. package/src/shadcn/item/item-group.svelte +21 -0
  96. package/src/shadcn/item/item-group.svelte.d.ts +5 -0
  97. package/src/shadcn/item/item-header.svelte +20 -0
  98. package/src/shadcn/item/item-header.svelte.d.ts +5 -0
  99. package/src/shadcn/item/item-media.svelte +42 -0
  100. package/src/shadcn/item/item-media.svelte.d.ts +17 -0
  101. package/src/shadcn/item/item-separator.svelte +19 -0
  102. package/src/shadcn/item/item-separator.svelte.d.ts +13 -0
  103. package/src/shadcn/item/item-title.svelte +20 -0
  104. package/src/shadcn/item/item-title.svelte.d.ts +5 -0
  105. package/src/shadcn/item/item.svelte +61 -0
  106. package/src/shadcn/item/item.svelte.d.ts +28 -0
  107. package/src/shadcn/native-select/index.ts +13 -0
  108. package/src/shadcn/native-select/native-select-opt-group.svelte +20 -0
  109. package/src/shadcn/native-select/native-select-opt-group.svelte.d.ts +5 -0
  110. package/src/shadcn/native-select/native-select-option.svelte +20 -0
  111. package/src/shadcn/native-select/native-select-option.svelte.d.ts +5 -0
  112. package/src/shadcn/native-select/native-select.svelte +45 -0
  113. package/src/shadcn/native-select/native-select.svelte.d.ts +8 -0
  114. package/src/shadcn/pagination/index.ts +31 -0
  115. package/src/shadcn/pagination/pagination-content.svelte +20 -0
  116. package/src/shadcn/pagination/pagination-content.svelte.d.ts +5 -0
  117. package/src/shadcn/pagination/pagination-ellipsis.svelte +22 -0
  118. package/src/shadcn/pagination/pagination-ellipsis.svelte.d.ts +5 -0
  119. package/src/shadcn/pagination/pagination-item.svelte +14 -0
  120. package/src/shadcn/pagination/pagination-item.svelte.d.ts +5 -0
  121. package/src/shadcn/pagination/pagination-link.svelte +41 -0
  122. package/src/shadcn/pagination/pagination-link.svelte.d.ts +9 -0
  123. package/src/shadcn/pagination/pagination-next-button.svelte +34 -0
  124. package/src/shadcn/pagination/pagination-next-button.svelte.d.ts +4 -0
  125. package/src/shadcn/pagination/pagination-next.svelte +26 -0
  126. package/src/shadcn/pagination/pagination-next.svelte.d.ts +4 -0
  127. package/src/shadcn/pagination/pagination-prev-button.svelte +34 -0
  128. package/src/shadcn/pagination/pagination-prev-button.svelte.d.ts +4 -0
  129. package/src/shadcn/pagination/pagination-previous.svelte +30 -0
  130. package/src/shadcn/pagination/pagination-previous.svelte.d.ts +4 -0
  131. package/src/shadcn/pagination/pagination.svelte +27 -0
  132. package/src/shadcn/pagination/pagination.svelte.d.ts +4 -0
  133. package/src/slides/Controls.svelte +39 -36
  134. package/src/slides/Deck.svelte +11 -8
  135. package/src/thread/thread.svelte +15 -8
  136. package/src/work/detail/task-detail.svelte +1 -1
  137. package/src/work/gantt/gantt-task-row.svelte +3 -6
  138. package/src/work/inbox/inbox-card.svelte +7 -5
  139. package/src/work/inbox/inbox-trace.svelte +14 -10
  140. package/src/work/kanban-board.svelte +40 -25
  141. package/src/work/kanban-hidden-rail.svelte +67 -65
  142. package/src/work/task-list.svelte +145 -124
  143. package/src/work/task-list.svelte.test.ts +5 -2
  144. package/src/work/time/time-tracker.svelte +35 -10
@@ -1,5 +1,6 @@
1
1
  <script lang="ts" generics="T">
2
2
  import type { Snippet } from "svelte";
3
+ import { Meter } from "bits-ui";
3
4
  import { cn } from "../../lib/utils.js";
4
5
  import { initial } from "../../lib/initials.js";
5
6
  import { TONE_COLOR, TONE_TEXT } from "../../lib/tone.js";
@@ -84,6 +85,10 @@
84
85
 
85
86
  let labels = $derived({ ...DEFAULT_TIME_LABELS, ...labelOverrides });
86
87
 
88
+ const uid = $props.id();
89
+ const invalidId = `${uid}-invalid`;
90
+ const loggedId = `${uid}-logged`;
91
+
87
92
  // ---- timer
88
93
  let now = $state(Date.now());
89
94
  let open = $state(false);
@@ -143,7 +148,7 @@
143
148
  let note = $state("");
144
149
  let saving = $state(false);
145
150
  let invalid = $state(false);
146
- let durationInput = $state<HTMLInputElement>();
151
+ let durationInput = $state<HTMLInputElement | null>(null);
147
152
  let parsed = $derived(parseMinutes(duration));
148
153
  let preview = $derived(
149
154
  parsed !== null && parsed >= 1 && parsed <= 1440 ? formatMinutes(parsed) : "",
@@ -170,6 +175,14 @@
170
175
 
171
176
  // ---- summary
172
177
  let total = $derived(entries.reduce((sum, entry) => sum + getMinutes(entry), 0));
178
+ // What the trigger shows, so its name holds it (WCAG 2.5.3, label in name).
179
+ let shown = $derived(
180
+ running
181
+ ? `${clock.hours}:${clock.minutes}:${clock.seconds}`
182
+ : total > 0
183
+ ? `${formatMinutes(total)}${estimate ? ` / ${formatMinutes(estimate)}` : ""}`
184
+ : labels.timer,
185
+ );
173
186
  let liveTotal = $derived(total + elapsedMinutes);
174
187
  let tone = $derived(budgetTone(liveTotal, estimate));
175
188
  let percent = $derived(estimate ? Math.round((liveTotal / estimate) * 100) : 0);
@@ -245,7 +258,7 @@
245
258
  buttonVariants({ variant: "ghost", size: "sm" }),
246
259
  "time-open gap-1.5 ps-1 pe-2 text-(length:--text-control) tabular-nums data-[state=open]:bg-muted",
247
260
  )}
248
- aria-label={labels.title}
261
+ aria-label="{labels.title}: {shown}"
249
262
  >
250
263
  {#if running}
251
264
  <TimeDot running size={6} />
@@ -278,7 +291,7 @@
278
291
  placeholder={labels.durationPlaceholder}
279
292
  aria-label={labels.duration}
280
293
  aria-invalid={invalid}
281
- aria-describedby={invalid ? "time-invalid" : undefined}
294
+ aria-describedby={invalid ? invalidId : undefined}
282
295
  autocomplete="off"
283
296
  inputmode="text"
284
297
  class={cn(
@@ -313,20 +326,33 @@
313
326
  </Button>
314
327
  </form>
315
328
  {#if invalid}
316
- <p id="time-invalid" class="text-xs text-destructive-ink" role="alert">{labels.invalid}</p>
329
+ <p id={invalidId} class="text-xs text-destructive-ink" role="alert">{labels.invalid}</p>
317
330
  {/if}
318
331
 
319
332
  {#if entries.length > 0 || estimate}
320
333
  <div class="flex flex-col gap-2 border-t border-border/60 pt-3">
321
334
  <div class="flex items-baseline justify-between gap-2">
322
- <span class="text-xs font-medium text-muted-foreground">{labels.logged}</span>
335
+ <span id={loggedId} class="text-xs font-medium text-muted-foreground"
336
+ >{labels.logged}</span
337
+ >
323
338
  {#key total}
324
339
  <span class="time-pop font-medium tabular-nums">{formatMinutes(total)}</span>
325
340
  {/key}
326
341
  </div>
327
342
  {#if estimate}
343
+ {@const budget =
344
+ liveTotal > estimate
345
+ ? labels.over(formatMinutes(liveTotal - estimate), formatMinutes(estimate))
346
+ : labels.remaining(formatMinutes(estimate - liveTotal), formatMinutes(estimate))}
328
347
  <div class="flex flex-col gap-1">
329
- <div class={cn("h-1 overflow-hidden bg-muted", ganttLooks.track)} aria-hidden="true">
348
+ <!-- The meter speaks the budget line, so the line below stays out of the reading order. -->
349
+ <Meter.Root
350
+ value={Math.min(liveTotal, estimate)}
351
+ max={estimate}
352
+ aria-labelledby={loggedId}
353
+ aria-valuetext={budget}
354
+ class={cn("h-1 overflow-hidden bg-muted", ganttLooks.track)}
355
+ >
330
356
  <div
331
357
  class={cn("time-segment h-full", ganttLooks.track)}
332
358
  style:background={tone === "neutral"
@@ -334,16 +360,15 @@
334
360
  : TONE_COLOR[tone]}
335
361
  style:width="{Math.min(100, percent)}%"
336
362
  ></div>
337
- </div>
363
+ </Meter.Root>
338
364
  <p
339
365
  class={cn(
340
366
  "text-xs tabular-nums",
341
367
  tone === "neutral" ? "text-muted-foreground" : TONE_TEXT[tone],
342
368
  )}
369
+ aria-hidden="true"
343
370
  >
344
- {liveTotal > estimate
345
- ? labels.over(formatMinutes(liveTotal - estimate), formatMinutes(estimate))
346
- : labels.remaining(formatMinutes(estimate - liveTotal), formatMinutes(estimate))}
371
+ {budget}
347
372
  </p>
348
373
  </div>
349
374
  {/if}