gridsmith-ui 0.6.0 → 0.6.2

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 (45) hide show
  1. package/dist/charts.js +2 -2
  2. package/dist/{chunk-XUBVMRIE.js → chunk-GX6O72IV.js} +7 -7
  3. package/dist/chunk-GX6O72IV.js.map +1 -0
  4. package/dist/{chunk-OUYJXVLQ.js → chunk-QGBG72OB.js} +3 -3
  5. package/dist/{chunk-OUYJXVLQ.js.map → chunk-QGBG72OB.js.map} +1 -1
  6. package/dist/{chunk-CHNY75QI.js → chunk-R5QGJURZ.js} +3 -3
  7. package/dist/{chunk-CHNY75QI.js.map → chunk-R5QGJURZ.js.map} +1 -1
  8. package/dist/{chunk-IUBWNDUK.js → chunk-TTZSZNJ6.js} +7 -3
  9. package/dist/chunk-TTZSZNJ6.js.map +1 -0
  10. package/dist/{chunk-4SDKQDYV.js → chunk-TYU2LQGK.js} +5 -5
  11. package/dist/{chunk-4SDKQDYV.js.map → chunk-TYU2LQGK.js.map} +1 -1
  12. package/dist/data-grid.js +3 -3
  13. package/dist/editor.js +6 -6
  14. package/dist/editor.js.map +1 -1
  15. package/dist/{feather-V32UNIQL.js → feather-U45EQTAU.js} +4 -3
  16. package/dist/feather-U45EQTAU.js.map +1 -0
  17. package/dist/{heroicons-CA5OQ76O.js → heroicons-D3G7QU45.js} +4 -3
  18. package/dist/heroicons-D3G7QU45.js.map +1 -0
  19. package/dist/icons.d.ts +1 -1
  20. package/dist/icons.js +1 -1
  21. package/dist/index.js +92 -49
  22. package/dist/index.js.map +1 -1
  23. package/dist/kanban.js +4 -4
  24. package/dist/{lucide-AILUUOAJ.js → lucide-OGUV44TQ.js} +4 -3
  25. package/dist/lucide-OGUV44TQ.js.map +1 -0
  26. package/dist/{phosphor-A4JOBGMT.js → phosphor-QG2ZMEMZ.js} +4 -3
  27. package/dist/phosphor-QG2ZMEMZ.js.map +1 -0
  28. package/dist/resizable.js +3 -3
  29. package/dist/resizable.js.map +1 -1
  30. package/dist/roots.css +4 -3
  31. package/dist/{tabler-TVOR6AFM.js → tabler-MW2HN55L.js} +4 -3
  32. package/dist/tabler-MW2HN55L.js.map +1 -0
  33. package/dist/tokens.css +3 -2
  34. package/dist/utils.d.ts +5 -1
  35. package/dist/utils.js +1 -1
  36. package/dist/virtualized.js +1 -1
  37. package/dist-static/tokens.css +3 -2
  38. package/package.json +1 -1
  39. package/dist/chunk-IUBWNDUK.js.map +0 -1
  40. package/dist/chunk-XUBVMRIE.js.map +0 -1
  41. package/dist/feather-V32UNIQL.js.map +0 -1
  42. package/dist/heroicons-CA5OQ76O.js.map +0 -1
  43. package/dist/lucide-AILUUOAJ.js.map +0 -1
  44. package/dist/phosphor-A4JOBGMT.js.map +0 -1
  45. package/dist/tabler-TVOR6AFM.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
- import { Skeleton } from './chunk-OUYJXVLQ.js';
2
- export { Skeleton } from './chunk-OUYJXVLQ.js';
3
- import { Badge } from './chunk-4SDKQDYV.js';
4
- export { Badge } from './chunk-4SDKQDYV.js';
1
+ import { Skeleton } from './chunk-QGBG72OB.js';
2
+ export { Skeleton } from './chunk-QGBG72OB.js';
3
+ import { Badge } from './chunk-TYU2LQGK.js';
4
+ export { Badge } from './chunk-TYU2LQGK.js';
5
5
  import { useBreakpoint } from './chunk-DPF6776I.js';
6
6
  export { BreakpointWidthProvider, useBreakpoint } from './chunk-DPF6776I.js';
7
- import { Tooltip, useTextOverflow, usePosition, Slot } from './chunk-CHNY75QI.js';
8
- export { Tooltip, useTextOverflow } from './chunk-CHNY75QI.js';
9
- import { Icon } from './chunk-XUBVMRIE.js';
10
- import { cn, GLASS_SURFACE, GLASS_BACKDROP, GLASS_DROPDOWN, lockBodyScroll, unlockBodyScroll, GLASS_OVERLAY } from './chunk-IUBWNDUK.js';
7
+ import { Tooltip, useTextOverflow, usePosition, Slot } from './chunk-R5QGJURZ.js';
8
+ export { Tooltip, useTextOverflow } from './chunk-R5QGJURZ.js';
9
+ import { Icon } from './chunk-GX6O72IV.js';
10
+ import { cn, GLASS_SURFACE, ACTIVE_RING, GLASS_BACKDROP, GLASS_DROPDOWN, lockBodyScroll, unlockBodyScroll, GLASS_OVERLAY, HAS_FOCUS_RING, FOCUS_RING, FOCUS_WITHIN_RING } from './chunk-TTZSZNJ6.js';
11
11
  import { createContext, forwardRef, useContext, useState, useRef, useEffect, useCallback, useId, isValidElement, cloneElement, useMemo, Children, Fragment as Fragment$1, useLayoutEffect } from 'react';
12
12
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
13
13
  import { createPortal } from 'react-dom';
@@ -81,6 +81,7 @@ var Button = forwardRef(function Button2({ variant = "default", size: sizeProp,
81
81
  "button",
82
82
  {
83
83
  ref,
84
+ "data-variant": variant,
84
85
  className: cn(
85
86
  "relative inline-flex items-center justify-center gap-ds-2 whitespace-nowrap font-medium",
86
87
  isLink ? cn(
@@ -323,7 +324,7 @@ function Input({ className, size = "md", error = false, prefix, suffix, ...props
323
324
  "rounded-[var(--ds-radius-md)]",
324
325
  "shadow-[var(--ds-input-shadow)]",
325
326
  hoverBorder,
326
- "has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-[var(--ds-input-focus-ring)] has-[:focus-visible]:border-[var(--ds-input-focus-ring)]",
327
+ HAS_FOCUS_RING,
327
328
  "transition-colors duration-[var(--ds-transition-speed)]",
328
329
  props.disabled && "cursor-not-allowed opacity-disabled",
329
330
  props.readOnly && "bg-[var(--ds-bg-muted)] cursor-default",
@@ -365,7 +366,7 @@ function Input({ className, size = "md", error = false, prefix, suffix, ...props
365
366
  "shadow-[var(--ds-input-shadow)]",
366
367
  "placeholder:text-[var(--ds-text-muted)]",
367
368
  hoverBorder,
368
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]",
369
+ FOCUS_RING,
369
370
  "disabled:cursor-not-allowed disabled:opacity-disabled",
370
371
  "read-only:bg-[var(--ds-bg-muted)] read-only:text-[var(--ds-text-secondary)] read-only:cursor-default",
371
372
  "transition-colors duration-[var(--ds-transition-speed)]",
@@ -405,7 +406,7 @@ function Textarea({ className, autoResize, maxRows, ref, ...props }) {
405
406
  "shadow-[var(--ds-input-shadow)]",
406
407
  "placeholder:text-[var(--ds-text-muted)]",
407
408
  "hover:border-[var(--ds-input-border-hover)]",
408
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]",
409
+ FOCUS_RING,
409
410
  "disabled:cursor-not-allowed disabled:opacity-disabled disabled:hover:border-[var(--ds-input-border)]",
410
411
  "read-only:bg-[var(--ds-bg-muted)] read-only:text-[var(--ds-text-secondary)] read-only:cursor-default read-only:hover:border-[var(--ds-input-border)]",
411
412
  "transition-colors duration-[var(--ds-transition-speed)]",
@@ -598,12 +599,13 @@ function Dropdown({
598
599
  focusOption(current < 0 ? els.length - 1 : current - 1);
599
600
  return;
600
601
  }
601
- if (e.key === "Home") {
602
+ const inSearch = document.activeElement === searchRef.current;
603
+ if (e.key === "Home" && !inSearch) {
602
604
  e.preventDefault();
603
605
  focusOption(0);
604
606
  return;
605
607
  }
606
- if (e.key === "End") {
608
+ if (e.key === "End" && !inSearch) {
607
609
  e.preventDefault();
608
610
  focusOption(els.length - 1);
609
611
  return;
@@ -675,8 +677,8 @@ function Dropdown({
675
677
  "shadow-[var(--ds-input-shadow)]",
676
678
  "transition-colors",
677
679
  !error && !disabled && !open && "hover:border-[var(--ds-input-border-hover)]",
678
- open && !error && "border-[var(--ds-input-focus-ring)] ring-2 ring-[var(--ds-input-focus-ring)]",
679
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]",
680
+ open && !error && ACTIVE_RING,
681
+ FOCUS_RING,
680
682
  "cursor-pointer disabled:cursor-not-allowed disabled:opacity-disabled",
681
683
  !selectedValues.length && "text-[var(--ds-text-muted)]"
682
684
  ),
@@ -883,7 +885,7 @@ function Combobox({ value, onChange, options, placeholder = "Search\u2026", disa
883
885
  "shadow-[var(--ds-input-shadow)]",
884
886
  "transition-colors duration-[var(--ds-transition-speed)]",
885
887
  !error && !disabled && "hover:border-[var(--ds-input-border-hover)]",
886
- "has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-[var(--ds-input-focus-ring)] has-[:focus-visible]:border-[var(--ds-input-focus-ring)]",
888
+ HAS_FOCUS_RING,
887
889
  disabled && "opacity-disabled pointer-events-none"
888
890
  ),
889
891
  children: [
@@ -1152,6 +1154,38 @@ function RadioGroup({ value, onChange, options, orientation = "vertical", classN
1152
1154
  )
1153
1155
  ] });
1154
1156
  }
1157
+ var FOCUSABLE = 'a[href], button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex="-1"])';
1158
+ var FIELD = "input, select, textarea, [contenteditable='true']";
1159
+ var SAFE_BUTTON = 'button:not([data-variant="destructive"])';
1160
+ var OVERLAY_CLOSE_ATTR = "data-overlay-close";
1161
+ function focusInitial(root, opts = {}) {
1162
+ if (!root) return false;
1163
+ const all = Array.from(root.querySelectorAll(FOCUSABLE));
1164
+ if (!all.length) return false;
1165
+ const candidates = all.filter((el) => !el.hasAttribute(OVERLAY_CLOSE_ATTR));
1166
+ if (opts.destructive) {
1167
+ const safe = candidates.find((el) => el.matches(SAFE_BUTTON));
1168
+ if (safe) {
1169
+ safe.focus();
1170
+ return true;
1171
+ }
1172
+ }
1173
+ const target = candidates.find((el) => el.matches(FIELD)) ?? candidates[0] ?? all[0];
1174
+ target.focus();
1175
+ return true;
1176
+ }
1177
+ function useReturnFocus(open) {
1178
+ const triggerRef = useRef(null);
1179
+ useEffect(() => {
1180
+ if (open) {
1181
+ triggerRef.current = document.activeElement;
1182
+ return;
1183
+ }
1184
+ const el = triggerRef.current;
1185
+ triggerRef.current = null;
1186
+ if (el && el.isConnected && typeof el.focus === "function") el.focus();
1187
+ }, [open]);
1188
+ }
1155
1189
  var DAYS = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
1156
1190
  var MONTHS = [
1157
1191
  "January",
@@ -1214,6 +1248,10 @@ function DatePicker({ value, onChange, placeholder = "Pick a date", disabled, cl
1214
1248
  const nextMonth = () => setViewDate(new Date(year, month + 1, 1));
1215
1249
  const startOf = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
1216
1250
  const isDisabledDay = (d) => !!min && d < startOf(min) || !!max && d > startOf(max);
1251
+ useReturnFocus(open);
1252
+ useEffect(() => {
1253
+ if (open) requestAnimationFrame(() => focusInitial(panelRef.current));
1254
+ }, [open]);
1217
1255
  const selectDay = (day) => {
1218
1256
  const d = new Date(year, month, day);
1219
1257
  if (isDisabledDay(d)) return;
@@ -1252,7 +1290,7 @@ function DatePicker({ value, onChange, placeholder = "Pick a date", disabled, cl
1252
1290
  "transition-colors cursor-pointer",
1253
1291
  "px-ds-3 py-ds-2",
1254
1292
  !error && !disabled && !open && "hover:border-[var(--ds-input-border-hover)]",
1255
- open && "border-[var(--ds-accent-primary)] ring-2 ring-[var(--ds-input-focus-ring)]",
1293
+ open && ACTIVE_RING,
1256
1294
  disabled && "opacity-disabled cursor-not-allowed",
1257
1295
  value ? "text-[var(--ds-text-primary)]" : "text-[var(--ds-text-muted)]"
1258
1296
  ),
@@ -1589,6 +1627,10 @@ function DateRangePicker({
1589
1627
  const pos = usePosition(triggerRef, panelRef, open, { side: "bottom", align: "start", offset: 4, flip: true });
1590
1628
  const today = useMemo(() => startOfDay(/* @__PURE__ */ new Date()), []);
1591
1629
  const dayNames = getOrderedDayNamesShort(weekStartsOn);
1630
+ useReturnFocus(open);
1631
+ useEffect(() => {
1632
+ if (open) requestAnimationFrame(() => focusInitial(panelRef.current));
1633
+ }, [open]);
1592
1634
  useEffect(() => {
1593
1635
  if (!open) return;
1594
1636
  const onMouse = (e) => {
@@ -1653,8 +1695,8 @@ function DateRangePicker({
1653
1695
  "transition-colors cursor-pointer",
1654
1696
  "px-ds-3 py-ds-2",
1655
1697
  !error && !disabled && !open && "hover:border-[var(--ds-input-border-hover)]",
1656
- open && "border-[var(--ds-accent-primary)] ring-2 ring-[var(--ds-input-focus-ring)]",
1657
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)]",
1698
+ open && ACTIVE_RING,
1699
+ FOCUS_RING,
1658
1700
  disabled && "opacity-disabled cursor-not-allowed",
1659
1701
  summary ? "text-[var(--ds-text-primary)]" : "text-[var(--ds-text-muted)]"
1660
1702
  ),
@@ -1865,7 +1907,7 @@ function FileUpload({ onFiles, accept, multiple = true, maxSize, className, erro
1865
1907
  "flex flex-col items-center justify-center gap-ds-2 cursor-pointer group",
1866
1908
  "border-2 border-dashed rounded-[var(--ds-radius-md)]",
1867
1909
  "transition-colors",
1868
- error ? "border-[var(--ds-status-error)]" : dragOver ? "border-[var(--ds-accent-primary)] bg-[var(--ds-accent-whisper)]" : "border-[var(--ds-border-default)] hover:border-[var(--ds-accent-primary)] hover:bg-[var(--ds-accent-whisper)]"
1910
+ error ? "border-[var(--ds-status-error)]" : dragOver ? `${ACTIVE_RING} bg-[var(--ds-accent-whisper)]` : "border-[var(--ds-border-default)] hover:border-[var(--ds-accent-primary)] hover:bg-[var(--ds-accent-whisper)]"
1869
1911
  ),
1870
1912
  style: { padding: "var(--ds-space-8) var(--ds-space-4)" },
1871
1913
  children: [
@@ -2148,7 +2190,7 @@ function TimePicker({
2148
2190
  "transition-colors cursor-pointer",
2149
2191
  "px-ds-3 py-ds-2",
2150
2192
  !error && !disabled && !open && "hover:border-[var(--ds-input-border-hover)]",
2151
- open && "border-[var(--ds-accent-primary)] ring-2 ring-[var(--ds-input-focus-ring)]",
2193
+ open && ACTIVE_RING,
2152
2194
  disabled && "opacity-disabled cursor-not-allowed",
2153
2195
  value ? "text-[var(--ds-text-primary)]" : "text-[var(--ds-text-muted)]"
2154
2196
  ),
@@ -2340,7 +2382,8 @@ function NumberInput({
2340
2382
  "bg-[var(--ds-input-bg)]",
2341
2383
  "transition-colors duration-[var(--ds-transition-speed)]",
2342
2384
  !error && !disabled && "hover:border-[var(--ds-input-border-hover)]",
2343
- "focus-within:ring-2 focus-within:ring-[var(--ds-input-focus-ring)] focus-within:border-[var(--ds-input-focus-ring)] focus-within:hover:border-[var(--ds-input-focus-ring)]",
2385
+ FOCUS_WITHIN_RING,
2386
+ "focus-within:hover:border-[var(--ds-border-focus)]",
2344
2387
  disabled && "opacity-disabled cursor-not-allowed",
2345
2388
  className
2346
2389
  ),
@@ -2612,7 +2655,7 @@ function TagInput({
2612
2655
  "shadow-[var(--ds-input-shadow)]",
2613
2656
  "transition-colors duration-[var(--ds-transition-speed)] cursor-text",
2614
2657
  !error && !disabled && "hover:border-[var(--ds-input-border-hover)]",
2615
- "has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-[var(--ds-input-focus-ring)] has-[:focus-visible]:border-[var(--ds-input-focus-ring)]",
2658
+ HAS_FOCUS_RING,
2616
2659
  disabled && "opacity-disabled cursor-not-allowed",
2617
2660
  className
2618
2661
  ),
@@ -2754,7 +2797,7 @@ function PinInput({
2754
2797
  "shadow-[var(--ds-input-shadow)]",
2755
2798
  "transition-colors",
2756
2799
  !error && !disabled && "hover:border-[var(--ds-input-border-hover)]",
2757
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]",
2800
+ FOCUS_RING,
2758
2801
  "placeholder:text-[var(--ds-text-muted)]",
2759
2802
  sizes3[size],
2760
2803
  disabled && "opacity-disabled cursor-not-allowed"
@@ -3115,7 +3158,7 @@ function ColorPicker({
3115
3158
  "border-[length:var(--ds-border-width)] border-[var(--ds-input-border)]",
3116
3159
  "rounded-[var(--ds-radius-sm)]",
3117
3160
  "hover:border-[var(--ds-input-border-hover)]",
3118
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]"
3161
+ FOCUS_RING
3119
3162
  )
3120
3163
  }
3121
3164
  )
@@ -3133,7 +3176,7 @@ function ColorPicker({
3133
3176
  "border-[length:var(--ds-border-width)]",
3134
3177
  "hover:scale-110 transition-transform",
3135
3178
  "focus-visible:shadow-[var(--ds-shadow-focus)] outline-none",
3136
- swatch.toLowerCase() === value.toLowerCase() ? "border-[var(--ds-accent-primary)] ring-1 ring-[var(--ds-accent-primary)]" : "border-[var(--ds-border-default)]"
3179
+ swatch.toLowerCase() === value.toLowerCase() ? ACTIVE_RING : "border-[var(--ds-border-default)]"
3137
3180
  ),
3138
3181
  style: { backgroundColor: swatch },
3139
3182
  "aria-label": swatch
@@ -3724,7 +3767,7 @@ function MentionInput({
3724
3767
  "shadow-[var(--ds-input-shadow)]",
3725
3768
  "placeholder:text-[var(--ds-text-muted)]",
3726
3769
  "hover:border-[var(--ds-input-border-hover)]",
3727
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]",
3770
+ FOCUS_RING,
3728
3771
  "disabled:cursor-not-allowed disabled:opacity-disabled disabled:hover:border-[var(--ds-input-border)]",
3729
3772
  "transition-colors duration-[var(--ds-transition-speed)]"
3730
3773
  )
@@ -3948,8 +3991,8 @@ var Card = forwardRef(function Card2({
3948
3991
  isSelectable && !disabled && "cursor-pointer select-none transition-all duration-[var(--ds-transition-speed)] ease-[var(--ds-transition-ease)]",
3949
3992
  isSelectable && !disabled && !selected && "hover:border-[var(--ds-accent-primary)]",
3950
3993
  isSelectable && "focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]",
3951
- showRing && "border-[var(--ds-accent-primary)] ring-1 ring-[var(--ds-accent-primary)]",
3952
- hasSelectType && selected && "border-[var(--ds-accent-primary)] bg-[var(--ds-accent-subtle)]",
3994
+ (showRing || hasSelectType && selected) && ACTIVE_RING,
3995
+ hasSelectType && selected && "bg-[var(--ds-accent-subtle)]",
3953
3996
  disabled && "opacity-disabled cursor-not-allowed",
3954
3997
  className
3955
3998
  ),
@@ -4494,7 +4537,7 @@ function Table({
4494
4537
  "border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]",
4495
4538
  "rounded-[var(--ds-radius-md)] bg-[var(--ds-bg-surface)]",
4496
4539
  "p-ds-4 space-y-ds-2",
4497
- isSelected && "ring-1 ring-[var(--ds-accent-primary)]",
4540
+ isSelected && ACTIVE_RING,
4498
4541
  onRowClick && "cursor-pointer hover:bg-[var(--ds-bg-muted)] focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]"
4499
4542
  ),
4500
4543
  onClick: onRowClick ? () => onRowClick(row, originalIdx) : void 0,
@@ -7067,7 +7110,7 @@ function ChatInputBar({ onSend }) {
7067
7110
  "border-[length:var(--ds-border-width)] border-[var(--ds-border-default)]",
7068
7111
  "bg-[var(--ds-input-bg)]",
7069
7112
  "shadow-[var(--ds-input-shadow)]",
7070
- "focus-within:ring-2 focus-within:ring-[var(--ds-input-focus-ring)] focus-within:border-[var(--ds-input-focus-ring)]",
7113
+ FOCUS_WITHIN_RING,
7071
7114
  "transition-colors duration-[var(--ds-transition-speed)]"
7072
7115
  ),
7073
7116
  children: [
@@ -7776,7 +7819,7 @@ function Popover({ open, onOpenChange, trigger, children, side = "bottom", align
7776
7819
  };
7777
7820
  }, [open, onOpenChange]);
7778
7821
  useEffect(() => {
7779
- if (open) floatingRef.current?.querySelector("a, button, input, [tabindex]")?.focus();
7822
+ if (open) focusInitial(floatingRef.current);
7780
7823
  }, [open]);
7781
7824
  return /* @__PURE__ */ jsxs(Fragment, { children: [
7782
7825
  /* @__PURE__ */ jsx(
@@ -8061,9 +8104,9 @@ function StepCircle({ status, index, onClick, clickable }) {
8061
8104
  clickable && "cursor-pointer",
8062
8105
  !clickable && "cursor-default",
8063
8106
  status === "complete" && "bg-[var(--ds-accent-primary)] [background-image:var(--ds-gradient)] text-[var(--ds-text-on-primary)]",
8064
- status === "current" && "border-2 border-[var(--ds-accent-primary)] text-[var(--ds-accent-primary)] bg-[var(--ds-bg-surface)]",
8107
+ status === "current" && `border-2 ${ACTIVE_RING} text-[var(--ds-accent-primary)] bg-[var(--ds-bg-surface)]`,
8065
8108
  status === "error" && "bg-[var(--ds-status-error)] text-[var(--ds-text-on-primary)]",
8066
- status === "loading" && "border-2 border-[var(--ds-accent-primary)] text-[var(--ds-accent-primary)] bg-[var(--ds-bg-surface)] animate-pulse",
8109
+ status === "loading" && `border-2 ${ACTIVE_RING} text-[var(--ds-accent-primary)] bg-[var(--ds-bg-surface)] animate-pulse`,
8067
8110
  status === "upcoming" && "border-[length:var(--ds-border-width)] border-[var(--ds-border-default)] text-[var(--ds-text-muted)] bg-[var(--ds-bg-surface)]"
8068
8111
  ),
8069
8112
  children: status === "complete" ? /* @__PURE__ */ jsx(Icon, { name: "check", size: 14 }) : status === "error" ? /* @__PURE__ */ jsx(Icon, { name: "warning", size: 14 }) : index + 1
@@ -9910,11 +9953,12 @@ function Drawer({ open, onClose, position = "right", width = "400px", title, chi
9910
9953
  if (!container) unlockBodyScroll();
9911
9954
  };
9912
9955
  }, [open, container]);
9956
+ useReturnFocus(open);
9913
9957
  useEffect(() => {
9914
- if (!open) return;
9915
- const focusable = panelRef.current?.querySelector("a, button, input, [tabindex]");
9916
- focusable?.focus();
9917
- }, [open]);
9958
+ if (!open || !mounted) return;
9959
+ const raf = requestAnimationFrame(() => focusInitial(panelRef.current));
9960
+ return () => cancelAnimationFrame(raf);
9961
+ }, [open, mounted]);
9918
9962
  if (!mounted) return null;
9919
9963
  const slide = slideClasses[position];
9920
9964
  const isHorizontal = position === "left" || position === "right";
@@ -9984,6 +10028,7 @@ function Drawer({ open, onClose, position = "right", width = "400px", title, chi
9984
10028
  "button",
9985
10029
  {
9986
10030
  onClick: onClose,
10031
+ ...{ [OVERLAY_CLOSE_ATTR]: "" },
9987
10032
  className: "text-[var(--ds-text-muted)] hover:text-[var(--ds-text-primary)] transition-colors cursor-pointer",
9988
10033
  "aria-label": "Close",
9989
10034
  children: /* @__PURE__ */ jsx(Icon, { name: "close", size: 18 })
@@ -10552,7 +10597,6 @@ var sizeClasses = {
10552
10597
  xl: "max-w-4xl",
10553
10598
  full: "max-w-[calc(100vw-2rem)]"
10554
10599
  };
10555
- var FOCUSABLE = 'a[href], button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex="-1"])';
10556
10600
  function Dialog({ open, onClose, title, description, children, footer, variant = "default", size = "md", alert = false, container, onSubmit }) {
10557
10601
  const titleId = useId();
10558
10602
  const descriptionId = useId();
@@ -10584,14 +10628,7 @@ function Dialog({ open, onClose, title, description, children, footer, variant =
10584
10628
  if (!open) return;
10585
10629
  triggerRef.current = document.activeElement;
10586
10630
  requestAnimationFrame(() => {
10587
- const focusable = dialogRef.current?.querySelectorAll(FOCUSABLE);
10588
- if (focusable?.length) {
10589
- if (variant === "destructive" && focusable.length > 1) {
10590
- focusable[focusable.length - 1].focus();
10591
- } else {
10592
- focusable[0].focus();
10593
- }
10594
- }
10631
+ focusInitial(dialogRef.current, { destructive: variant === "destructive" });
10595
10632
  });
10596
10633
  }, [open, variant]);
10597
10634
  useEffect(() => {
@@ -10662,6 +10699,7 @@ function Dialog({ open, onClose, title, description, children, footer, variant =
10662
10699
  {
10663
10700
  type: "button",
10664
10701
  onClick: onClose,
10702
+ ...{ [OVERLAY_CLOSE_ATTR]: "" },
10665
10703
  className: "absolute right-4 top-4 text-[var(--ds-text-muted)] hover:text-[var(--ds-text-primary)] transition-colors cursor-pointer",
10666
10704
  "aria-label": "Close",
10667
10705
  children: /* @__PURE__ */ jsx(Icon, { name: "close", size: 18 })
@@ -11070,6 +11108,12 @@ function Sheet({ open, onClose, title, children, footer, snapPoints = [0.5, 0.92
11070
11108
  function handleTransitionEnd() {
11071
11109
  if (!open) setMounted(false);
11072
11110
  }
11111
+ useReturnFocus(open);
11112
+ useEffect(() => {
11113
+ if (!open || !mounted) return;
11114
+ const raf = requestAnimationFrame(() => focusInitial(panelRef.current));
11115
+ return () => cancelAnimationFrame(raf);
11116
+ }, [open, mounted]);
11073
11117
  useEffect(() => {
11074
11118
  if (!open) return;
11075
11119
  const onKeyDown = (e) => {
@@ -11182,6 +11226,7 @@ function Sheet({ open, onClose, title, children, footer, snapPoints = [0.5, 0.92
11182
11226
  "button",
11183
11227
  {
11184
11228
  onClick: onClose,
11229
+ ...{ [OVERLAY_CLOSE_ATTR]: "" },
11185
11230
  className: "text-[var(--ds-text-muted)] hover:text-[var(--ds-text-primary)] transition-colors cursor-pointer",
11186
11231
  "aria-label": "Close",
11187
11232
  children: /* @__PURE__ */ jsx(Icon, { name: "close", size: 18 })
@@ -11953,8 +11998,6 @@ var toastSeq = 0;
11953
11998
  function ToastProvider({ children, maxVisible = 3, position = "bottom-right", duration = 3e3, mode, pauseOnHover = true }) {
11954
11999
  const [queue, setQueue] = useState([]);
11955
12000
  const isMobile = useBreakpoint("sm");
11956
- const queueRef = useRef(queue);
11957
- queueRef.current = queue;
11958
12001
  const dismiss = useCallback((id) => {
11959
12002
  setQueue((q) => q.filter((t) => t.id !== id));
11960
12003
  }, []);