@heyramzi/ui 2.20.0 → 2.21.1

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 (193) hide show
  1. package/README.md +2 -0
  2. package/dist/charts/dashboard/data-table.js +1 -2
  3. package/dist/components/list-page/filter-section.js +1 -1
  4. package/dist/components/list-page/list-table.js +5 -6
  5. package/dist/components/list-page/queue-rail.js +2 -1
  6. package/dist/components/picker/trigger.js +3 -3
  7. package/dist/components/segmented/segmented.js +5 -5
  8. package/dist/components/work-parts/looks.js +1 -1
  9. package/dist/shadcn/alert/alert-variants.js +9 -0
  10. package/dist/shadcn/alert/index.js +1 -1
  11. package/dist/shadcn/badge/badge-variants.js +17 -0
  12. package/dist/shadcn/badge/index.js +1 -1
  13. package/dist/shadcn/dialog/index.js +3 -2
  14. package/dist/shadcn/dropdown-menu/menu-item.js +1 -1
  15. package/dist/shadcn/sheet/index.js +3 -2
  16. package/dist/shadcn/skeleton/index.js +3 -2
  17. package/dist/shadcn/toggle/index.js +1 -1
  18. package/dist/shadcn/toggle/toggle-variants.js +20 -0
  19. package/dist/status/index.js +2 -0
  20. package/dist/status/pill-tint.js +13 -0
  21. package/dist/work/kanban-drag.js +13 -7
  22. package/package.json +23 -23
  23. package/src/ai/confirmation/ConfirmationTitle.svelte +1 -4
  24. package/src/ai/loading-state/PixelLoader.svelte +1 -1
  25. package/src/animations/dropdown.css +19 -10
  26. package/src/animations/modal.css +7 -2
  27. package/src/charts/charts.css +3 -5
  28. package/src/charts/dashboard/dashboard-section.svelte +1 -1
  29. package/src/charts/dashboard/data-table.ts +1 -2
  30. package/src/charts/dashboard/stat-tile.svelte +1 -1
  31. package/src/charts/number-chart.css +8 -7
  32. package/src/charts/pop-value.svelte +68 -0
  33. package/src/charts/primitives/chart-tooltip.svelte +1 -1
  34. package/src/charts/reference-line.css +1 -1
  35. package/src/charts/stat-card.css +4 -4
  36. package/src/components/copy/copy-button.svelte +11 -10
  37. package/src/components/data-table/row-arrow.svelte +1 -1
  38. package/src/components/data-table/row-context-menu.svelte +1 -1
  39. package/src/components/data-table/sortable-head.svelte +2 -2
  40. package/src/components/data-table/table-skeleton.svelte +5 -5
  41. package/src/components/docs/doc-page.svelte +1 -3
  42. package/src/components/docs/on-this-page.svelte +4 -4
  43. package/src/components/field-row/field-row.svelte +1 -1
  44. package/src/components/list-page/detail-empty.svelte +3 -8
  45. package/src/components/list-page/detail-header.svelte +1 -1
  46. package/src/components/list-page/detail-row.svelte +2 -1
  47. package/src/components/list-page/empty-state.svelte +15 -7
  48. package/src/components/list-page/filter-item.svelte +2 -2
  49. package/src/components/list-page/filter-popover.svelte +1 -1
  50. package/src/components/list-page/filter-section.ts +1 -4
  51. package/src/components/list-page/grouped-list.svelte +37 -8
  52. package/src/components/list-page/list-page-shell.svelte +1 -1
  53. package/src/components/list-page/list-table.ts +6 -6
  54. package/src/components/list-page/master-detail.svelte +1 -1
  55. package/src/components/list-page/queue-rail.ts +2 -2
  56. package/src/components/list-page/rail-empty.svelte +1 -1
  57. package/src/components/list-page/rail-row.svelte +5 -5
  58. package/src/components/open-in/open-in.svelte +2 -1
  59. package/src/components/picker/trigger.ts +6 -5
  60. package/src/components/section-card/section-card.svelte +1 -1
  61. package/src/components/section-header/section-header.svelte +4 -2
  62. package/src/components/section-header/section-label.svelte +2 -2
  63. package/src/components/segmented/animated-tabs.svelte +1 -1
  64. package/src/components/segmented/section-runs.svelte +1 -1
  65. package/src/components/segmented/segment.svelte +4 -6
  66. package/src/components/segmented/segmented-track.svelte +18 -52
  67. package/src/components/segmented/segmented.ts +5 -5
  68. package/src/components/table-view/table-view.svelte +43 -24
  69. package/src/components/tags-input/tags-input.svelte +17 -31
  70. package/src/components/work-parts/looks.ts +1 -1
  71. package/src/editor/content.css +3 -3
  72. package/src/editor/editor.svelte +1 -1
  73. package/src/inbox/thread-inbox.svelte +2 -9
  74. package/src/panel/side-panel.svelte +9 -4
  75. package/src/record/info-list.svelte +7 -8
  76. package/src/record/project-list.svelte +1 -1
  77. package/src/record/record-demo.svelte +2 -4
  78. package/src/record/record-rail.svelte +5 -1
  79. package/src/record/record-shell.svelte +1 -1
  80. package/src/record/record-stats.svelte +9 -3
  81. package/src/record/steps-rail.svelte +7 -11
  82. package/src/shadcn/accordion/accordion-trigger.svelte +1 -1
  83. package/src/shadcn/alert/alert-variants.ts +17 -0
  84. package/src/shadcn/alert/alert.svelte +2 -16
  85. package/src/shadcn/alert/index.ts +1 -1
  86. package/src/shadcn/alert-dialog/alert-dialog-content.svelte +5 -1
  87. package/src/shadcn/alert-dialog/alert-dialog-footer.svelte +12 -2
  88. package/src/shadcn/alert-dialog/alert-dialog-header.svelte +1 -1
  89. package/src/shadcn/alert-dialog/alert-dialog-title.svelte +1 -1
  90. package/src/shadcn/badge/badge-variants.ts +23 -0
  91. package/src/shadcn/badge/badge.svelte +2 -20
  92. package/src/shadcn/badge/index.ts +1 -1
  93. package/src/shadcn/bubble/bubble-content.svelte +1 -1
  94. package/src/shadcn/bubble/bubble.svelte +1 -1
  95. package/src/shadcn/button/button.svelte +11 -5
  96. package/src/shadcn/calendar/calendar-month-select.svelte +1 -1
  97. package/src/shadcn/calendar/calendar-year-select.svelte +1 -1
  98. package/src/shadcn/calendar/calendar.svelte +1 -1
  99. package/src/shadcn/card/card.svelte +2 -1
  100. package/src/shadcn/checkbox/checkbox.svelte +1 -1
  101. package/src/shadcn/code-block/code-block-actions.svelte +1 -1
  102. package/src/shadcn/command/command-dialog.svelte +2 -2
  103. package/src/shadcn/command/command-group.svelte +1 -1
  104. package/src/shadcn/command/command-input.svelte +1 -1
  105. package/src/shadcn/command/command-item.svelte +1 -1
  106. package/src/shadcn/dialog/dialog-body.svelte +22 -0
  107. package/src/shadcn/dialog/dialog-content.svelte +19 -4
  108. package/src/shadcn/dialog/dialog-footer.svelte +19 -1
  109. package/src/shadcn/dialog/dialog-header.svelte +6 -1
  110. package/src/shadcn/dialog/dialog-title.svelte +2 -1
  111. package/src/shadcn/dialog/index.ts +3 -0
  112. package/src/shadcn/dropdown-menu/dropdown-menu-content.svelte +5 -1
  113. package/src/shadcn/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  114. package/src/shadcn/dropdown-menu/menu-item.ts +1 -1
  115. package/src/shadcn/field/field-separator.svelte +1 -1
  116. package/src/shadcn/hover-card/hover-card-content.svelte +1 -1
  117. package/src/shadcn/input/input.svelte +2 -2
  118. package/src/shadcn/input-otp/input-otp-slot.svelte +1 -1
  119. package/src/shadcn/message-scroller/message-scroller-button.svelte +1 -1
  120. package/src/shadcn/popover/popover-content.svelte +1 -1
  121. package/src/shadcn/radio-group/radio-group-item.svelte +1 -1
  122. package/src/shadcn/scroll-area/scroll-area.svelte +1 -1
  123. package/src/shadcn/select/select-content.svelte +6 -2
  124. package/src/shadcn/select/select-item.svelte +1 -1
  125. package/src/shadcn/select/select-trigger.svelte +1 -1
  126. package/src/shadcn/sheet/index.ts +3 -0
  127. package/src/shadcn/sheet/sheet-body.svelte +22 -0
  128. package/src/shadcn/sheet/sheet-content.svelte +27 -5
  129. package/src/shadcn/sheet/sheet-footer.svelte +14 -2
  130. package/src/shadcn/sheet/sheet-header.svelte +1 -1
  131. package/src/shadcn/sheet/sheet-title.svelte +1 -1
  132. package/src/shadcn/sheet/sheet.css +11 -5
  133. package/src/shadcn/sidebar/sidebar-group-action.svelte +1 -1
  134. package/src/shadcn/sidebar/sidebar-group-label.svelte +1 -1
  135. package/src/shadcn/sidebar/sidebar-inset.svelte +1 -1
  136. package/src/shadcn/sidebar/sidebar-menu-action.svelte +1 -1
  137. package/src/shadcn/sidebar/sidebar-menu-button.svelte +2 -2
  138. package/src/shadcn/sidebar/sidebar-menu-sub-button.svelte +1 -1
  139. package/src/shadcn/sidebar/sidebar-menu.svelte +1 -1
  140. package/src/shadcn/sidebar/sidebar.svelte +1 -1
  141. package/src/shadcn/skeleton/index.ts +3 -0
  142. package/src/shadcn/skeleton/skeleton-delay.svelte +63 -0
  143. package/src/shadcn/skeleton/skeleton-delay.svelte.test.ts +57 -0
  144. package/src/shadcn/skeleton/skeleton.svelte +5 -1
  145. package/src/shadcn/slider/slider.svelte +1 -1
  146. package/src/shadcn/switch/switch.svelte +2 -2
  147. package/src/shadcn/table/table-row.svelte +1 -1
  148. package/src/shadcn/tabs/tabs-list.svelte +1 -1
  149. package/src/shadcn/tabs/tabs-trigger.svelte +2 -1
  150. package/src/shadcn/textarea/textarea.svelte +1 -1
  151. package/src/shadcn/toggle/index.ts +1 -1
  152. package/src/shadcn/toggle/toggle-variants.ts +26 -0
  153. package/src/shadcn/toggle/toggle.svelte +7 -25
  154. package/src/shadcn/toggle-group/toggle-group.svelte +1 -1
  155. package/src/shadcn/tooltip/tooltip-content.svelte +1 -1
  156. package/src/shadcn/trace/trace-collapsible-trigger.svelte +1 -1
  157. package/src/shadcn/trace/trace.svelte +1 -1
  158. package/src/status/README.md +1 -1
  159. package/src/status/index.ts +2 -0
  160. package/src/status/pill-tint.ts +16 -0
  161. package/src/status/status-badge.svelte +21 -7
  162. package/src/status/status-dot.svelte +6 -11
  163. package/src/status/status-pill.svelte +40 -0
  164. package/src/svelte-reexports.test.ts +43 -0
  165. package/src/thread/thread.svelte +54 -136
  166. package/src/tokens/craft.css +55 -36
  167. package/src/tokens/palette.css +16 -9
  168. package/src/work/demo.svelte +48 -42
  169. package/src/work/detail/detail-demo.svelte +33 -24
  170. package/src/work/detail/task-chip.svelte +4 -4
  171. package/src/work/detail/task-detail.svelte +41 -108
  172. package/src/work/detail/task-property.svelte +7 -13
  173. package/src/work/detail/task-thread.svelte +48 -119
  174. package/src/work/docs/doc-editor-page.svelte +5 -4
  175. package/src/work/docs/doc-menu.svelte +9 -4
  176. package/src/work/docs/docs-demo.svelte +4 -4
  177. package/src/work/docs/edited-chip.svelte +11 -4
  178. package/src/work/gantt/gantt-bar.svelte +18 -14
  179. package/src/work/gantt/gantt-grid.svelte +7 -7
  180. package/src/work/gantt/gantt-group-row.svelte +7 -10
  181. package/src/work/gantt/gantt-header.svelte +3 -1
  182. package/src/work/gantt/gantt-task-row.svelte +19 -9
  183. package/src/work/gantt/gantt.css +4 -5
  184. package/src/work/inbox/inbox-card.svelte +32 -10
  185. package/src/work/inbox/inbox-draft.svelte +2 -2
  186. package/src/work/kanban-column.svelte +7 -15
  187. package/src/work/kanban-drag.ts +13 -8
  188. package/src/work/task-gantt.svelte +2 -1
  189. package/src/work/task-list.svelte +54 -53
  190. package/src/work/time/time-chip.svelte +16 -19
  191. package/src/work/time/time-dot.svelte +2 -1
  192. package/src/work/time/time-ring.svelte +2 -3
  193. package/src/work/time/time-tracker.svelte +72 -166
@@ -4,6 +4,10 @@
4
4
  import { initial } from "../../lib/initials.js";
5
5
  import { TONE_COLOR, TONE_TEXT } from "../../lib/tone.js";
6
6
  import * as Popover from "../../shadcn/popover/index.js";
7
+ import { Button, buttonVariants } from "../../shadcn/button/index.js";
8
+ import { Input } from "../../shadcn/input/index.js";
9
+ import * as Avatar from "../../shadcn/avatar/index.js";
10
+ import { ganttLooks, workLooks } from "../../components/work-parts/looks.js";
7
11
  import {
8
12
  budgetTone,
9
13
  dayLabel,
@@ -214,22 +218,35 @@
214
218
  <div class="sr-only" role="status" aria-live="polite">{status}</div>
215
219
 
216
220
  <Popover.Root bind:open>
217
- <div class="time-chip" class:is-running={!!running}>
218
- <button
219
- type="button"
221
+ <div
222
+ class={cn(
223
+ "time-chip inline-flex items-stretch text-(length:--text-control) text-foreground",
224
+ workLooks.row,
225
+ )}
226
+ class:is-running={!!running}
227
+ >
228
+ <Button
229
+ variant="ghost"
230
+ size="sm"
231
+ icon
220
232
  onclick={toggle}
221
233
  aria-label={running ? labels.stop : labels.start}
222
234
  aria-keyshortcuts="Alt+S"
223
235
  title="{running ? labels.stop : labels.start} (Alt+S)"
224
- class="time-toggle"
225
236
  >
226
237
  {#if running}
227
238
  <Stop weight="fill" class="size-3.5" aria-hidden="true" />
228
239
  {:else}
229
240
  <Play weight="fill" class="size-3.5" aria-hidden="true" />
230
241
  {/if}
231
- </button>
232
- <Popover.Trigger class="time-open" aria-label={labels.title}>
242
+ </Button>
243
+ <Popover.Trigger
244
+ class={cn(
245
+ buttonVariants({ variant: "ghost", size: "sm" }),
246
+ "time-open gap-1.5 ps-1 pe-2 text-(length:--text-control) tabular-nums data-[state=open]:bg-muted",
247
+ )}
248
+ aria-label={labels.title}
249
+ >
233
250
  {#if running}
234
251
  <TimeDot running size={6} />
235
252
  <span role="timer" aria-label={labels.elapsed}
@@ -248,11 +265,14 @@
248
265
  </Popover.Trigger>
249
266
  </div>
250
267
 
251
- <Popover.Content align="start" class="flex w-80 flex-col gap-3 p-3 text-[13px]">
268
+ <Popover.Content
269
+ align="start"
270
+ class="flex w-80 flex-col gap-3 p-3 text-(length:--text-control)"
271
+ >
252
272
  <form onsubmit={submit} class="grid grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)] gap-2">
253
273
  <div class="relative">
254
- <input
255
- bind:this={durationInput}
274
+ <Input
275
+ bind:ref={durationInput}
256
276
  bind:value={duration}
257
277
  oninput={() => (invalid = false)}
258
278
  placeholder={labels.durationPlaceholder}
@@ -261,7 +281,10 @@
261
281
  aria-describedby={invalid ? "time-invalid" : undefined}
262
282
  autocomplete="off"
263
283
  inputmode="text"
264
- class={cn("time-field w-full tabular-nums", preview && "pr-12")}
284
+ class={cn(
285
+ "h-7 text-(length:--text-control) tabular-nums md:text-(length:--text-control)",
286
+ preview && "pr-12",
287
+ )}
265
288
  />
266
289
  {#if preview && preview !== duration.trim()}
267
290
  <span
@@ -272,22 +295,22 @@
272
295
  </span>
273
296
  {/if}
274
297
  </div>
275
- <input
298
+ <Input
276
299
  type="date"
277
300
  bind:value={day}
278
301
  aria-label={labels.date}
279
- class="time-field w-full tabular-nums"
302
+ class="h-7 text-(length:--text-control) tabular-nums md:text-(length:--text-control)"
280
303
  />
281
- <input
304
+ <Input
282
305
  bind:value={note}
283
306
  placeholder={labels.notePlaceholder}
284
307
  aria-label={labels.note}
285
308
  autocomplete="off"
286
- class="time-field"
309
+ class="h-7 text-(length:--text-control) md:text-(length:--text-control)"
287
310
  />
288
- <button type="submit" disabled={saving || !duration.trim()} class="time-log">
311
+ <Button type="submit" variant="outline" size="sm" disabled={saving || !duration.trim()}>
289
312
  {saving ? labels.saving : labels.log}
290
- </button>
313
+ </Button>
291
314
  </form>
292
315
  {#if invalid}
293
316
  <p id="time-invalid" class="text-xs text-destructive" role="alert">{labels.invalid}</p>
@@ -303,9 +326,9 @@
303
326
  </div>
304
327
  {#if estimate}
305
328
  <div class="flex flex-col gap-1">
306
- <div class="h-1 overflow-hidden rounded-full bg-muted" aria-hidden="true">
329
+ <div class={cn("h-1 overflow-hidden bg-muted", ganttLooks.track)} aria-hidden="true">
307
330
  <div
308
- class="time-segment h-full rounded-full"
331
+ class={cn("time-segment h-full", ganttLooks.track)}
309
332
  style:background={tone === "neutral"
310
333
  ? "var(--color-foreground)"
311
334
  : TONE_COLOR[tone]}
@@ -329,7 +352,7 @@
329
352
  {#each people as person (person.key)}
330
353
  <li class="flex items-center gap-1.5 text-xs">
331
354
  <span
332
- class="size-2 rounded-full"
355
+ class={cn("size-2", ganttLooks.day)}
333
356
  style:background={personColor(person.key)}
334
357
  aria-hidden="true"
335
358
  ></span>
@@ -359,18 +382,20 @@
359
382
  {@const name = getPerson(entry)}
360
383
  {@const text = getNote?.(entry)}
361
384
  <li
362
- class="time-row group flex h-7 items-center gap-2 rounded-md px-1 transition-colors hover:bg-muted/50 focus-within:bg-muted/50"
385
+ class={cn(
386
+ "time-row group flex h-7 items-center gap-2 px-1 transition-colors duration-quick ease-smooth-out hover:bg-muted/50 focus-within:bg-muted/50",
387
+ workLooks.row,
388
+ )}
363
389
  class:is-new={!firstIds.has(getId(entry))}
364
390
  class:opacity-50={deleting === getId(entry)}
365
391
  >
366
- <span
367
- class="grid size-5 shrink-0 place-items-center rounded-full text-xs font-semibold text-white"
368
- style:background={personColor(getPersonId?.(entry) ?? name)}
369
- title={name}
370
- aria-hidden="true"
371
- >
372
- {initial(name)}
373
- </span>
392
+ <Avatar.Root class="size-5" title={name} aria-hidden="true">
393
+ <Avatar.Fallback
394
+ class="text-xs font-semibold text-white"
395
+ style="background: {personColor(getPersonId?.(entry) ?? name)}"
396
+ >{initial(name)}</Avatar.Fallback
397
+ >
398
+ </Avatar.Root>
374
399
  <span class="min-w-0 flex-1 truncate">
375
400
  <span class="sr-only">{name},</span>
376
401
  {#if text}{text}{:else}<span class="text-muted-foreground">{name}</span>{/if}
@@ -382,15 +407,17 @@
382
407
  >{formatMinutes(getMinutes(entry))}</span
383
408
  >
384
409
  {#if onDelete && (canDelete?.(entry) ?? true)}
385
- <button
386
- type="button"
410
+ <Button
411
+ variant="ghost"
412
+ size="sm"
413
+ icon
387
414
  onclick={() => remove(entry)}
388
415
  disabled={deleting === getId(entry)}
389
416
  aria-label={labels.deleteEntry(formatMinutes(getMinutes(entry)))}
390
- class="time-delete grid size-6 shrink-0 place-items-center rounded-md text-muted-foreground outline-none transition-colors hover:bg-destructive/10 hover:text-destructive focus-visible:ring-[3px] focus-visible:ring-ring/50"
417
+ class="time-delete size-6 text-muted-foreground hover:bg-destructive/10 hover:text-destructive"
391
418
  >
392
419
  <X weight="bold" class="size-3" aria-hidden="true" />
393
- </button>
420
+ </Button>
394
421
  {/if}
395
422
  </li>
396
423
  {/each}
@@ -406,14 +433,9 @@
406
433
  </section>
407
434
 
408
435
  <style>
436
+ /* A running timer tints the whole split button in the accent. */
409
437
  .time-chip {
410
- display: inline-flex;
411
- align-items: stretch;
412
- height: 1.75rem;
413
- border-radius: var(--radius-md, 0.5rem);
414
- font-size: 0.8125rem;
415
- color: var(--color-foreground);
416
- transition: background-color var(--duration-fast, 250ms) var(--ease-smooth-out, ease-out);
438
+ transition: background-color var(--duration-fast) var(--ease-smooth-out);
417
439
  }
418
440
 
419
441
  .time-chip.is-running {
@@ -424,173 +446,57 @@
424
446
  color: var(--tone-accent, var(--color-primary));
425
447
  }
426
448
 
427
- .time-toggle,
428
- :global(.time-open) {
429
- display: inline-flex;
430
- align-items: center;
431
- outline: none;
432
- transition: background-color var(--duration-quick, 150ms) var(--ease-smooth-out, ease-out);
433
- }
434
-
435
- .time-toggle {
436
- justify-content: center;
437
- width: 1.75rem;
438
- border-start-start-radius: inherit;
439
- border-end-start-radius: inherit;
440
- }
441
-
442
- :global(.time-open) {
443
- gap: 0.375rem;
444
- padding-inline: 0.25rem 0.5rem;
445
- font-variant-numeric: tabular-nums;
446
- white-space: nowrap;
447
- border-start-end-radius: inherit;
448
- border-end-end-radius: inherit;
449
- }
450
-
451
- :global(.time-open[data-state="open"]) {
452
- background: color-mix(in oklab, var(--color-foreground) 7%, transparent);
453
- }
454
-
455
- @media (hover: hover) and (pointer: fine) {
456
- .time-toggle:hover,
457
- :global(.time-open:hover) {
458
- background: color-mix(in oklab, var(--color-foreground) 7%, transparent);
459
- }
460
- }
461
-
462
- .time-toggle:focus-visible,
463
- :global(.time-open:focus-visible) {
464
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-ring) 50%, transparent);
465
- }
466
-
467
- .time-toggle:active {
468
- transform: scale(0.96);
469
- }
470
-
471
- @media (any-pointer: coarse) {
472
- .time-chip {
473
- height: 2.5rem;
474
- }
475
-
476
- .time-toggle {
477
- width: 2.5rem;
478
- }
479
- }
480
-
481
- .time-field {
482
- height: 1.75rem;
483
- min-width: 0;
484
- border-radius: var(--radius-md, 0.5rem);
485
- border: 1px solid var(--color-input, var(--color-border));
486
- background: var(--color-background);
487
- padding-inline: 0.5rem;
488
- font-size: 0.8125rem;
489
- color: var(--color-foreground);
490
- outline: none;
491
- transition:
492
- border-color var(--duration-quick, 150ms) var(--ease-smooth-out, ease-out),
493
- box-shadow var(--duration-quick, 150ms) var(--ease-smooth-out, ease-out);
494
- }
495
-
496
- .time-field::placeholder {
497
- color: var(--color-muted-foreground);
498
- opacity: 0.7;
499
- }
500
-
501
- .time-field:focus-visible {
502
- border-color: var(--color-ring);
503
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-ring) 40%, transparent);
504
- }
505
-
506
- .time-field[aria-invalid="true"] {
507
- border-color: var(--color-destructive);
508
- }
509
-
510
- .time-log {
511
- height: 1.75rem;
512
- border-radius: var(--radius-md, 0.5rem);
513
- border: 1px solid var(--color-border);
514
- background: var(--color-background);
515
- padding-inline: 0.75rem;
516
- font-size: 0.8125rem;
517
- font-weight: 500;
518
- outline: none;
519
- transition: background-color var(--duration-quick, 150ms) var(--ease-smooth-out, ease-out);
520
- }
521
-
522
- @media (hover: hover) and (pointer: fine) {
523
- .time-log:hover:not(:disabled) {
524
- background: var(--color-muted);
525
- }
526
- }
527
-
528
- .time-log:focus-visible {
529
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-ring) 50%, transparent);
530
- }
531
-
532
- .time-log:disabled {
533
- opacity: 0.5;
534
- pointer-events: none;
535
- }
536
-
537
449
  .time-segment {
538
- transition: width var(--duration-slow, 300ms)
539
- var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
450
+ transition: width var(--duration-slow) var(--ease-smooth-out);
540
451
  }
541
452
 
542
- .time-delete {
453
+ .time-row :global(.time-delete) {
543
454
  opacity: 0;
544
455
  }
545
456
 
546
- .time-row:focus-within .time-delete {
457
+ .time-row:focus-within :global(.time-delete) {
547
458
  opacity: 1;
548
459
  }
549
460
 
550
461
  @media (hover: hover) and (pointer: fine) {
551
- .time-row:hover .time-delete {
462
+ .time-row:hover :global(.time-delete) {
552
463
  opacity: 1;
553
464
  }
554
465
  }
555
466
 
556
467
  @media (hover: none) {
557
- .time-delete {
468
+ .time-row :global(.time-delete) {
558
469
  opacity: 1;
559
470
  }
560
471
  }
561
472
 
562
473
  .time-pop,
563
474
  .time-preview {
564
- animation: time-pop var(--duration-quick, 150ms) var(--ease-smooth-out, ease-out) backwards;
475
+ animation: time-pop var(--duration-quick) var(--ease-smooth-out) backwards;
565
476
  }
566
477
 
567
478
  .time-row.is-new {
568
- animation: time-row-in var(--duration-fast, 250ms)
569
- var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) backwards;
479
+ animation: time-row-in var(--duration-fast) var(--ease-smooth-out) backwards;
570
480
  }
571
481
 
572
482
  @keyframes time-pop {
573
483
  from {
574
484
  opacity: 0;
575
- transform: translateY(4px);
576
- filter: blur(var(--blur-small, 2px));
485
+ transform: translateY(var(--distance-micro));
486
+ filter: blur(var(--blur-small));
577
487
  }
578
488
  }
579
489
 
580
490
  @keyframes time-row-in {
581
491
  from {
582
492
  opacity: 0;
583
- transform: translateY(var(--distance-base, 8px));
584
- filter: blur(var(--blur-small, 2px));
493
+ transform: translateY(var(--distance-base));
494
+ filter: blur(var(--blur-small));
585
495
  }
586
496
  }
587
497
 
588
498
  @media (prefers-reduced-motion: reduce) {
589
499
  .time-chip,
590
- .time-toggle,
591
- :global(.time-open),
592
- .time-field,
593
- .time-log,
594
500
  .time-segment {
595
501
  transition: none;
596
502
  }