gridsmith-ui 0.31.0 → 0.31.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 (46) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/dist/charts.js +8 -8
  3. package/dist/chat.js +6 -6
  4. package/dist/{chunk-YFHTREH5.js → chunk-2TCCSKL3.js} +5 -5
  5. package/dist/{chunk-YFHTREH5.js.map → chunk-2TCCSKL3.js.map} +1 -1
  6. package/dist/{chunk-U7WBI4AV.js → chunk-BHTAVJIG.js} +5 -5
  7. package/dist/{chunk-U7WBI4AV.js.map → chunk-BHTAVJIG.js.map} +1 -1
  8. package/dist/{chunk-XSQD3UGY.js → chunk-DR6WEI3A.js} +17 -4
  9. package/dist/chunk-DR6WEI3A.js.map +1 -0
  10. package/dist/{chunk-OWQ7M6R7.js → chunk-EZ3ZGFGA.js} +132 -23
  11. package/dist/chunk-EZ3ZGFGA.js.map +1 -0
  12. package/dist/{chunk-2Q4HOGEI.js → chunk-HQFTP7Y5.js} +15 -5
  13. package/dist/chunk-HQFTP7Y5.js.map +1 -0
  14. package/dist/{chunk-3J67NISC.js → chunk-I6JJ7KKP.js} +8 -8
  15. package/dist/{chunk-3J67NISC.js.map → chunk-I6JJ7KKP.js.map} +1 -1
  16. package/dist/{chunk-V2ARGHJN.js → chunk-IOHGE4EW.js} +7 -7
  17. package/dist/{chunk-V2ARGHJN.js.map → chunk-IOHGE4EW.js.map} +1 -1
  18. package/dist/{chunk-BKYWKMUN.js → chunk-IZW5XHKA.js} +7 -7
  19. package/dist/{chunk-BKYWKMUN.js.map → chunk-IZW5XHKA.js.map} +1 -1
  20. package/dist/{chunk-LE72KHIE.js → chunk-K3NAFQ4S.js} +3 -3
  21. package/dist/{chunk-LE72KHIE.js.map → chunk-K3NAFQ4S.js.map} +1 -1
  22. package/dist/{chunk-GP2COVJC.js → chunk-KSJTMSYA.js} +4 -4
  23. package/dist/{chunk-GP2COVJC.js.map → chunk-KSJTMSYA.js.map} +1 -1
  24. package/dist/{chunk-OFACAHRV.js → chunk-NDL2JGQ7.js} +5 -5
  25. package/dist/{chunk-OFACAHRV.js.map → chunk-NDL2JGQ7.js.map} +1 -1
  26. package/dist/{chunk-GT6M74IZ.js → chunk-SLGGZ3MU.js} +5 -5
  27. package/dist/{chunk-GT6M74IZ.js.map → chunk-SLGGZ3MU.js.map} +1 -1
  28. package/dist/{chunk-EKWXPSTI.js → chunk-TH272DIC.js} +7 -7
  29. package/dist/{chunk-EKWXPSTI.js.map → chunk-TH272DIC.js.map} +1 -1
  30. package/dist/{chunk-HUNEJIKV.js → chunk-W3GY5ROH.js} +3 -3
  31. package/dist/{chunk-HUNEJIKV.js.map → chunk-W3GY5ROH.js.map} +1 -1
  32. package/dist/data-grid.js +8 -8
  33. package/dist/editor-mentions.js +2 -2
  34. package/dist/editor.js +3 -3
  35. package/dist/index.d.ts +9 -0
  36. package/dist/index.js +149 -47
  37. package/dist/index.js.map +1 -1
  38. package/dist/kanban.js +8 -7
  39. package/dist/kanban.js.map +1 -1
  40. package/dist/resizable.js +7 -6
  41. package/dist/resizable.js.map +1 -1
  42. package/dist/virtualized.js +8 -8
  43. package/package.json +1 -1
  44. package/dist/chunk-2Q4HOGEI.js.map +0 -1
  45. package/dist/chunk-OWQ7M6R7.js.map +0 -1
  46. package/dist/chunk-XSQD3UGY.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { useLatest } from './chunk-OWQ7M6R7.js';
2
+ import { useLatest } from './chunk-EZ3ZGFGA.js';
3
3
  import { useState, useRef, useCallback, useEffect } from 'react';
4
4
 
5
5
  var registry = /* @__PURE__ */ new WeakMap();
@@ -106,5 +106,5 @@ function useTextOverflow(options = {}) {
106
106
  }
107
107
 
108
108
  export { useTextOverflow };
109
- //# sourceMappingURL=chunk-HUNEJIKV.js.map
110
- //# sourceMappingURL=chunk-HUNEJIKV.js.map
109
+ //# sourceMappingURL=chunk-W3GY5ROH.js.map
110
+ //# sourceMappingURL=chunk-W3GY5ROH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../showcase/src/lib/use-text-overflow.ts"],"names":[],"mappings":"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","file":"chunk-HUNEJIKV.js","sourcesContent":["import { useState, useCallback, useRef, useEffect } from \"react\";\nimport { useLatest } from \"./use-latest\";\n\n// ─── Shared ResizeObserver (singleton per document) ────────────────────────────\n// All useTextOverflow instances share a single ResizeObserver. This avoids the\n// performance cost of 80+ independent observers on pages with many truncated elements.\n\ntype OverflowCallback = () => void;\n\nconst registry = new WeakMap<Element, Set<OverflowCallback>>();\nlet sharedObserver: ResizeObserver | null = null;\nlet rafId: number | null = null;\nconst pendingElements = new Set<Element>();\n\nfunction getSharedObserver(): ResizeObserver {\n if (sharedObserver) return sharedObserver;\n sharedObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n pendingElements.add(entry.target);\n }\n if (rafId === null) {\n rafId = requestAnimationFrame(flush);\n }\n });\n return sharedObserver;\n}\n\nfunction flush() {\n rafId = null;\n for (const el of pendingElements) {\n const callbacks = registry.get(el);\n if (callbacks) {\n for (const cb of callbacks) cb();\n }\n }\n pendingElements.clear();\n}\n\nfunction observe(el: Element, callback: OverflowCallback) {\n let set = registry.get(el);\n if (!set) {\n set = new Set();\n registry.set(el, set);\n }\n set.add(callback);\n if (set.size === 1) {\n getSharedObserver().observe(el);\n }\n}\n\nfunction unobserve(el: Element, callback: OverflowCallback) {\n const set = registry.get(el);\n if (!set) return;\n set.delete(callback);\n if (set.size === 0) {\n registry.delete(el);\n getSharedObserver().unobserve(el);\n }\n}\n\n// ─── Overflow detection ────────────────────────────────────────────────────────\n\nconst TOLERANCE = 1; // px — accounts for integer rounding in scrollWidth/clientWidth\n\nfunction checkOverflow(el: HTMLElement, lines: number): boolean {\n if (lines <= 1) {\n return el.scrollWidth - el.clientWidth > TOLERANCE;\n }\n return el.scrollHeight - el.clientHeight > TOLERANCE;\n}\n\n// ─── Hook ──────────────────────────────────────────────────────────────────────\n\nexport interface UseTextOverflowOptions {\n /** Number of visible lines before truncation. 1 = single-line ellipsis, >1 = line-clamp. */\n lines?: number;\n /** Disable overflow detection (e.g. when component is hidden) */\n disabled?: boolean;\n /** Content key — triggers re-check when this value changes (use for dynamic text content) */\n content?: unknown;\n}\n\nexport interface UseTextOverflowResult {\n /** Callback ref — attach to the element that has truncation CSS applied */\n ref: (node: HTMLElement | null) => void;\n /** True when the element's text is currently overflowing/truncated */\n isTruncated: boolean;\n}\n\n/**\n * Detects whether an element's text content is overflowing (truncated).\n * Uses a single shared ResizeObserver for all instances on the page.\n *\n * @example\n * const { ref, isTruncated } = useTextOverflow({ lines: 1 });\n * return (\n * <Tooltip content={fullText} disabled={!isTruncated}>\n * <span ref={ref} className=\"truncate\">{fullText}</span>\n * </Tooltip>\n * );\n */\nexport function useTextOverflow(options: UseTextOverflowOptions = {}): UseTextOverflowResult {\n const { lines = 1, disabled = false, content } = options;\n const [isTruncated, setIsTruncated] = useState(false);\n const elementRef = useRef<HTMLElement | null>(null);\n // The observer-registered wrapper delegates to the latest check logic via checkRef.\n const registeredRef = useRef<OverflowCallback | null>(null);\n\n const doCheck = useCallback(() => {\n if (!elementRef.current || disabled) {\n setIsTruncated(false);\n return;\n }\n const next = checkOverflow(elementRef.current, lines);\n setIsTruncated((prev) => (prev !== next ? next : prev));\n }, [lines, disabled]);\n\n // Latest check logic, updated in a layout effect so the stable wrapper never runs a stale closure.\n const checkRef = useLatest<OverflowCallback>(doCheck);\n\n // Re-check when content changes (handles dynamic text like Dropdown selection)\n // or when disabled state changes\n // Measures the committed DOM, so it must stay a post-layout effect.\n /* eslint-disable react-hooks/set-state-in-effect -- overflow is a layout measurement */\n useEffect(() => {\n if (disabled) {\n setIsTruncated(false);\n } else if (elementRef.current) {\n const next = checkOverflow(elementRef.current, lines);\n setIsTruncated((prev) => (prev !== next ? next : prev));\n }\n }, [content, lines, disabled]);\n /* eslint-enable react-hooks/set-state-in-effect */\n\n const ref = useCallback(\n (node: HTMLElement | null) => {\n const prev = elementRef.current;\n\n // Unregister previous element using the SAME function we registered with\n if (prev && registeredRef.current) {\n unobserve(prev, registeredRef.current);\n registeredRef.current = null;\n }\n\n elementRef.current = node;\n\n if (node && !disabled) {\n // Stable wrapper that delegates to the latest check logic\n const wrapper: OverflowCallback = () => checkRef.current?.();\n registeredRef.current = wrapper;\n observe(node, wrapper);\n // Initial check on mount\n const initial = checkOverflow(node, lines);\n setIsTruncated(initial);\n }\n },\n [lines, disabled, checkRef],\n );\n\n // Cleanup on unmount — uses the registered wrapper, not the check function\n useEffect(() => {\n return () => {\n if (elementRef.current && registeredRef.current) {\n unobserve(elementRef.current, registeredRef.current);\n }\n };\n }, []);\n\n return { ref, isTruncated };\n}\n"]}
1
+ {"version":3,"sources":["../../../showcase/src/lib/use-text-overflow.ts"],"names":[],"mappings":"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","file":"chunk-W3GY5ROH.js","sourcesContent":["import { useState, useCallback, useRef, useEffect } from \"react\";\nimport { useLatest } from \"./use-latest\";\n\n// ─── Shared ResizeObserver (singleton per document) ────────────────────────────\n// All useTextOverflow instances share a single ResizeObserver. This avoids the\n// performance cost of 80+ independent observers on pages with many truncated elements.\n\ntype OverflowCallback = () => void;\n\nconst registry = new WeakMap<Element, Set<OverflowCallback>>();\nlet sharedObserver: ResizeObserver | null = null;\nlet rafId: number | null = null;\nconst pendingElements = new Set<Element>();\n\nfunction getSharedObserver(): ResizeObserver {\n if (sharedObserver) return sharedObserver;\n sharedObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n pendingElements.add(entry.target);\n }\n if (rafId === null) {\n rafId = requestAnimationFrame(flush);\n }\n });\n return sharedObserver;\n}\n\nfunction flush() {\n rafId = null;\n for (const el of pendingElements) {\n const callbacks = registry.get(el);\n if (callbacks) {\n for (const cb of callbacks) cb();\n }\n }\n pendingElements.clear();\n}\n\nfunction observe(el: Element, callback: OverflowCallback) {\n let set = registry.get(el);\n if (!set) {\n set = new Set();\n registry.set(el, set);\n }\n set.add(callback);\n if (set.size === 1) {\n getSharedObserver().observe(el);\n }\n}\n\nfunction unobserve(el: Element, callback: OverflowCallback) {\n const set = registry.get(el);\n if (!set) return;\n set.delete(callback);\n if (set.size === 0) {\n registry.delete(el);\n getSharedObserver().unobserve(el);\n }\n}\n\n// ─── Overflow detection ────────────────────────────────────────────────────────\n\nconst TOLERANCE = 1; // px — accounts for integer rounding in scrollWidth/clientWidth\n\nfunction checkOverflow(el: HTMLElement, lines: number): boolean {\n if (lines <= 1) {\n return el.scrollWidth - el.clientWidth > TOLERANCE;\n }\n return el.scrollHeight - el.clientHeight > TOLERANCE;\n}\n\n// ─── Hook ──────────────────────────────────────────────────────────────────────\n\nexport interface UseTextOverflowOptions {\n /** Number of visible lines before truncation. 1 = single-line ellipsis, >1 = line-clamp. */\n lines?: number;\n /** Disable overflow detection (e.g. when component is hidden) */\n disabled?: boolean;\n /** Content key — triggers re-check when this value changes (use for dynamic text content) */\n content?: unknown;\n}\n\nexport interface UseTextOverflowResult {\n /** Callback ref — attach to the element that has truncation CSS applied */\n ref: (node: HTMLElement | null) => void;\n /** True when the element's text is currently overflowing/truncated */\n isTruncated: boolean;\n}\n\n/**\n * Detects whether an element's text content is overflowing (truncated).\n * Uses a single shared ResizeObserver for all instances on the page.\n *\n * @example\n * const { ref, isTruncated } = useTextOverflow({ lines: 1 });\n * return (\n * <Tooltip content={fullText} disabled={!isTruncated}>\n * <span ref={ref} className=\"truncate\">{fullText}</span>\n * </Tooltip>\n * );\n */\nexport function useTextOverflow(options: UseTextOverflowOptions = {}): UseTextOverflowResult {\n const { lines = 1, disabled = false, content } = options;\n const [isTruncated, setIsTruncated] = useState(false);\n const elementRef = useRef<HTMLElement | null>(null);\n // The observer-registered wrapper delegates to the latest check logic via checkRef.\n const registeredRef = useRef<OverflowCallback | null>(null);\n\n const doCheck = useCallback(() => {\n if (!elementRef.current || disabled) {\n setIsTruncated(false);\n return;\n }\n const next = checkOverflow(elementRef.current, lines);\n setIsTruncated((prev) => (prev !== next ? next : prev));\n }, [lines, disabled]);\n\n // Latest check logic, updated in a layout effect so the stable wrapper never runs a stale closure.\n const checkRef = useLatest<OverflowCallback>(doCheck);\n\n // Re-check when content changes (handles dynamic text like Dropdown selection)\n // or when disabled state changes\n // Measures the committed DOM, so it must stay a post-layout effect.\n /* eslint-disable react-hooks/set-state-in-effect -- overflow is a layout measurement */\n useEffect(() => {\n if (disabled) {\n setIsTruncated(false);\n } else if (elementRef.current) {\n const next = checkOverflow(elementRef.current, lines);\n setIsTruncated((prev) => (prev !== next ? next : prev));\n }\n }, [content, lines, disabled]);\n /* eslint-enable react-hooks/set-state-in-effect */\n\n const ref = useCallback(\n (node: HTMLElement | null) => {\n const prev = elementRef.current;\n\n // Unregister previous element using the SAME function we registered with\n if (prev && registeredRef.current) {\n unobserve(prev, registeredRef.current);\n registeredRef.current = null;\n }\n\n elementRef.current = node;\n\n if (node && !disabled) {\n // Stable wrapper that delegates to the latest check logic\n const wrapper: OverflowCallback = () => checkRef.current?.();\n registeredRef.current = wrapper;\n observe(node, wrapper);\n // Initial check on mount\n const initial = checkOverflow(node, lines);\n setIsTruncated(initial);\n }\n },\n [lines, disabled, checkRef],\n );\n\n // Cleanup on unmount — uses the registered wrapper, not the check function\n useEffect(() => {\n return () => {\n if (elementRef.current && registeredRef.current) {\n unobserve(elementRef.current, registeredRef.current);\n }\n };\n }, []);\n\n return { ref, isTruncated };\n}\n"]}
package/dist/data-grid.js CHANGED
@@ -1,19 +1,19 @@
1
1
  "use client";
2
- import { useCardsSwitch, CARDS_BELOW, inferColumnKinds, CardValue, SortIndicator, CutCell, CutEmail, dayKey, DatePicker, Checkbox } from './chunk-3J67NISC.js';
3
- import { usePagination, useWholeListCheck, pagerPart, Pagination, NumberInput } from './chunk-V2ARGHJN.js';
2
+ import { useCardsSwitch, CARDS_BELOW, inferColumnKinds, CardValue, SortIndicator, CutCell, CutEmail, dayKey, DatePicker, Checkbox } from './chunk-I6JJ7KKP.js';
3
+ import { usePagination, useWholeListCheck, pagerPart, Pagination, NumberInput } from './chunk-IOHGE4EW.js';
4
4
  import { useShellPreferences } from './chunk-QOMP4D6V.js';
5
5
  import './chunk-LJYSVZMI.js';
6
- import { Dropdown, Field, Input } from './chunk-BKYWKMUN.js';
6
+ import { Dropdown, Field, Input } from './chunk-IZW5XHKA.js';
7
7
  import './chunk-7QLXYRPD.js';
8
- import './chunk-7RKC5C7G.js';
9
8
  import { FormChangeCtx } from './chunk-72SDAX54.js';
10
9
  import { useFramesItself, TableCardCtx, RowsCtx } from './chunk-V73LHNRL.js';
11
- import './chunk-2Q4HOGEI.js';
10
+ import './chunk-HQFTP7Y5.js';
12
11
  import { useBreakpoint } from './chunk-ZHUVLBCC.js';
13
- import './chunk-HUNEJIKV.js';
14
- import { useRevealFocus } from './chunk-XSQD3UGY.js';
12
+ import './chunk-7RKC5C7G.js';
13
+ import './chunk-W3GY5ROH.js';
14
+ import { useRevealFocus } from './chunk-DR6WEI3A.js';
15
15
  import { Icon, warnOnce } from './chunk-53F7GVBQ.js';
16
- import { cn, useGridKeyboard, FOCUS_INSET, FOCUS_RING, useFocusLeave, focusInitial } from './chunk-OWQ7M6R7.js';
16
+ import { cn, useGridKeyboard, FOCUS_INSET, FOCUS_RING, useFocusLeave, focusInitial } from './chunk-EZ3ZGFGA.js';
17
17
  import { useState, useMemo, useCallback, useRef, useEffect, useLayoutEffect } from 'react';
18
18
  import { useReactTable, getSortedRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
19
19
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { matchMentions, shownMentions, mentionOptionId, MentionList } from './chunk-LE72KHIE.js';
3
- import { useLatest, useOverlayLayer } from './chunk-OWQ7M6R7.js';
2
+ import { matchMentions, shownMentions, mentionOptionId, MentionList } from './chunk-K3NAFQ4S.js';
3
+ import { useLatest, useOverlayLayer } from './chunk-EZ3ZGFGA.js';
4
4
  import { useState, useSyncExternalStore, useId, useRef, useEffect } from 'react';
5
5
  import Mention from '@tiptap/extension-mention';
6
6
  import { exitSuggestion } from '@tiptap/suggestion';
package/dist/editor.js CHANGED
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import { useScrollEdges } from './chunk-3BRQRKDO.js';
3
- import { useInputModality } from './chunk-7RKC5C7G.js';
4
3
  import { FormChangeCtx } from './chunk-72SDAX54.js';
5
4
  import { useBreakpoint } from './chunk-ZHUVLBCC.js';
6
- import { useRevealFocus, AutoTooltip } from './chunk-XSQD3UGY.js';
5
+ import { useInputModality } from './chunk-7RKC5C7G.js';
6
+ import { useRevealFocus, AutoTooltip } from './chunk-DR6WEI3A.js';
7
7
  import { warnOnce, Icon } from './chunk-53F7GVBQ.js';
8
- import { useLatest, cn, FIELD_FOCUS_WITHIN_RING, useOverlayLayer, useCloseOnFocusOut, FOCUS_RING, FIELD_FOCUS_RING } from './chunk-OWQ7M6R7.js';
8
+ import { useLatest, cn, FIELD_FOCUS_WITHIN_RING, useOverlayLayer, useCloseOnFocusOut, FOCUS_RING, FIELD_FOCUS_RING } from './chunk-EZ3ZGFGA.js';
9
9
  import { useState, useCallback, useContext, useRef, useEffect, useImperativeHandle } from 'react';
10
10
  import { Extension, Node, mergeAttributes, useEditor, EditorContent, createDocument } from '@tiptap/react';
11
11
  import { Plugin } from '@tiptap/pm/state';
package/dist/index.d.ts CHANGED
@@ -1813,6 +1813,15 @@ interface CollapsibleContentProps {
1813
1813
  }
1814
1814
  declare function CollapsibleRoot({ open: controlledOpen, defaultOpen, onOpenChange, children, className, }: CollapsibleProps): react_jsx_runtime.JSX.Element;
1815
1815
  declare function CollapsibleTrigger({ children, className }: CollapsibleTriggerProps): react_jsx_runtime.JSX.Element;
1816
+ /**
1817
+ * The content (Sprint 25.32, R29-1: round 29's event form Tabbed into a closed section's fields). Closed, it's `inert`:
1818
+ * out of the Tab order and the accessibility tree as well as out of sight, so a keyboard never lands on a field no one
1819
+ * can see. It clips only while it moves. Open and settled, its height follows its content and nothing is clipped: a
1820
+ * field's outline at its edge, or an error message that appears once it's open. Focus inside it when it closes goes
1821
+ * back to its trigger, as a disclosure's does; with no trigger that takes focus (a page's own button drives `open`, or the
1822
+ * trigger is plain text), to the Tab stop before it, else the last resort (the review of 18 October). Under reduced
1823
+ * motion (a zero transition) it settles at once.
1824
+ */
1816
1825
  declare function CollapsibleContent({ children, className }: CollapsibleContentProps): react_jsx_runtime.JSX.Element;
1817
1826
  declare const Collapsible: typeof CollapsibleRoot & {
1818
1827
  Trigger: typeof CollapsibleTrigger;
package/dist/index.js CHANGED
@@ -1,46 +1,46 @@
1
1
  "use client";
2
- import { useAppShell, REACT_VERSION_PROBLEM, Breadcrumbs, useCrumbFollow, crumbGoes, useCornerInset, NAVBAR_INSET_PRIORITY, useOverlayMark, useDirtyGuard, useScrollbarInset, DrawerFooterCtx, OverlayMarkScope, OverlayCloseCtx, insetLessScrollbar, DiscardConfirm, OVERLAY_ROOT_ATTR, OverlayMarkCtx, useCompact, useElementWidth, DrawerPanel, useCloseSettle, besideRoom, PANEL_INSET_PRIORITY, Drawer, useRememberedWidth, pxOf, ResizeEdge, LAUNCHER_INSET_PRIORITY, defaultMaxWidth } from './chunk-EKWXPSTI.js';
3
- export { AppShell, Breadcrumbs, Drawer, SkipLink, useAppShell, useUnsavedChanges } from './chunk-EKWXPSTI.js';
4
- import { Skeleton, TITLE_TEXT, SegmentedControl } from './chunk-U7WBI4AV.js';
5
- export { SegmentedControl, Skeleton } from './chunk-U7WBI4AV.js';
2
+ import { useAppShell, REACT_VERSION_PROBLEM, Breadcrumbs, useCrumbFollow, crumbGoes, useCornerInset, NAVBAR_INSET_PRIORITY, useOverlayMark, useDirtyGuard, useScrollbarInset, DrawerFooterCtx, OverlayMarkScope, OverlayCloseCtx, insetLessScrollbar, DiscardConfirm, OVERLAY_ROOT_ATTR, OverlayMarkCtx, useCompact, useElementWidth, DrawerPanel, useCloseSettle, besideRoom, PANEL_INSET_PRIORITY, Drawer, useRememberedWidth, pxOf, ResizeEdge, LAUNCHER_INSET_PRIORITY, defaultMaxWidth } from './chunk-TH272DIC.js';
3
+ export { AppShell, Breadcrumbs, Drawer, SkipLink, useAppShell, useUnsavedChanges } from './chunk-TH272DIC.js';
4
+ import { Skeleton, TITLE_TEXT, SegmentedControl } from './chunk-BHTAVJIG.js';
5
+ export { SegmentedControl, Skeleton } from './chunk-BHTAVJIG.js';
6
6
  import { useScrollEdges, EDGE_FADE } from './chunk-3BRQRKDO.js';
7
- import { Avatar, foldForSearch, useActiveOptionInView, shownMentions, matchMentions, mentionOptionId, MentionList, initialsOf } from './chunk-LE72KHIE.js';
8
- export { Avatar } from './chunk-LE72KHIE.js';
9
- import { Link } from './chunk-OFACAHRV.js';
10
- export { CodeBlock, Divider, Link } from './chunk-OFACAHRV.js';
11
- import { DropdownMenu } from './chunk-YFHTREH5.js';
12
- export { DropdownMenu } from './chunk-YFHTREH5.js';
7
+ import { Avatar, foldForSearch, useActiveOptionInView, shownMentions, matchMentions, mentionOptionId, MentionList, initialsOf } from './chunk-K3NAFQ4S.js';
8
+ export { Avatar } from './chunk-K3NAFQ4S.js';
9
+ import { Link } from './chunk-NDL2JGQ7.js';
10
+ export { CodeBlock, Divider, Link } from './chunk-NDL2JGQ7.js';
11
+ import { DropdownMenu } from './chunk-2TCCSKL3.js';
12
+ export { DropdownMenu } from './chunk-2TCCSKL3.js';
13
13
  import { useFillHeight, FillContext } from './chunk-DBHVJ7Z3.js';
14
- import { Badge } from './chunk-GT6M74IZ.js';
15
- export { Badge } from './chunk-GT6M74IZ.js';
16
- import { useKeyboardScroll } from './chunk-GP2COVJC.js';
17
- import { localeCache, startOfDay, addDays, useWeekStart, useDateWords, localeDayFirst, dayKey, moveDay, addMonths, DateSegmentFields, getMonthGrid, isSameMonth, isSameDay, DatePicker, timeSegments, pad2, inferColumnKinds, useCardsSwitch, CARDS_BELOW, kindOfRenderedText, Checkbox, CardValue, SortIndicator, startOfWeek, endOfWeek, addMonthsClamped, isExcludedDay, CutCell, CutEmail, stepValue, separatorMovesOn, TIME_SEPARATORS, typeDigit, getEventsForDay, layoutWeek, isWeekend, getWeekDays, isBarEvent, layoutPieces, dayPieces, groupEventsByDay, timeToFraction } from './chunk-3J67NISC.js';
18
- export { Checkbox, CheckboxGroup, CheckboxGroupItem, DatePicker, HoverCard, TextOverflow } from './chunk-3J67NISC.js';
19
- import { useWholeListCheck, pagerPart, Pagination, NumberInput } from './chunk-V2ARGHJN.js';
20
- export { NumberInput, Pagination, Popover, usePagination } from './chunk-V2ARGHJN.js';
14
+ import { Badge } from './chunk-SLGGZ3MU.js';
15
+ export { Badge } from './chunk-SLGGZ3MU.js';
16
+ import { useKeyboardScroll } from './chunk-KSJTMSYA.js';
17
+ import { localeCache, startOfDay, addDays, useWeekStart, useDateWords, localeDayFirst, dayKey, moveDay, addMonths, DateSegmentFields, getMonthGrid, isSameMonth, isSameDay, DatePicker, timeSegments, pad2, inferColumnKinds, useCardsSwitch, CARDS_BELOW, kindOfRenderedText, Checkbox, CardValue, SortIndicator, startOfWeek, endOfWeek, addMonthsClamped, isExcludedDay, CutCell, CutEmail, stepValue, separatorMovesOn, TIME_SEPARATORS, typeDigit, getEventsForDay, layoutWeek, isWeekend, getWeekDays, isBarEvent, layoutPieces, dayPieces, groupEventsByDay, timeToFraction } from './chunk-I6JJ7KKP.js';
18
+ export { Checkbox, CheckboxGroup, CheckboxGroupItem, DatePicker, HoverCard, TextOverflow } from './chunk-I6JJ7KKP.js';
19
+ import { useWholeListCheck, pagerPart, Pagination, NumberInput } from './chunk-IOHGE4EW.js';
20
+ export { NumberInput, Pagination, Popover, usePagination } from './chunk-IOHGE4EW.js';
21
21
  import { useShellPreferences, PREFERENCE_HOUSE_DEFAULTS, formatRelativeTime, thresholdOf, toMillis, formatFullTime, datedMillis, preferenceActionKey, DAY, HOUR, MINUTE } from './chunk-QOMP4D6V.js';
22
22
  export { PreferencesContext, formatFullTime, formatRelativeTime, preferenceActionKey, usePreferences } from './chunk-QOMP4D6V.js';
23
23
  import { useFormatLocale, useHydrated, useToday, LocaleContext } from './chunk-LJYSVZMI.js';
24
24
  export { useFormatLocale, useHydrated } from './chunk-LJYSVZMI.js';
25
- import { Input, CHECK_FILL, Dropdown, FilterRowContext, SWITCH_KNOB_ON, SWITCH_KNOB_OFF, SWITCH_KNOB_MOTION, SWITCH_TRACK_ON, SWITCH_TRACK_OFF, useFieldControl, useField, OutsideField, InlineFieldError, Label, AddAnotherRowCtx, Field } from './chunk-BKYWKMUN.js';
26
- export { Dropdown, Field, InlineFieldError, Input, Label, Textarea, Toggle } from './chunk-BKYWKMUN.js';
25
+ import { Input, CHECK_FILL, Dropdown, FilterRowContext, SWITCH_KNOB_ON, SWITCH_KNOB_OFF, SWITCH_KNOB_MOTION, SWITCH_TRACK_ON, SWITCH_TRACK_OFF, useFieldControl, useField, OutsideField, InlineFieldError, Label, AddAnotherRowCtx, Field } from './chunk-IZW5XHKA.js';
26
+ export { Dropdown, Field, InlineFieldError, Input, Label, Textarea, Toggle } from './chunk-IZW5XHKA.js';
27
27
  import { formatLocale, localeChoice } from './chunk-7QLXYRPD.js';
28
- import { useInputModality, inputModality } from './chunk-7RKC5C7G.js';
29
- export { INPUT_MODALITY_ATTR, inputModality, installInputModality, useInputModality } from './chunk-7RKC5C7G.js';
30
28
  import { FormChangeCtx, useReportedChange, useOptionalFormContext, FormCtx } from './chunk-72SDAX54.js';
31
29
  export { useFormContext } from './chunk-72SDAX54.js';
32
30
  import { CardSurfaceCtx, useScrollsInside, SplitPaneCtx, RowsCtx, PageActionsCtx, SurfaceBoundary, useFramesItself, TableCardCtx } from './chunk-V73LHNRL.js';
33
- import { Button, elementType, ControlSizeContext, triggerType, Spinner } from './chunk-2Q4HOGEI.js';
34
- export { Button, ButtonSizeContext, ControlSizeContext, Spinner } from './chunk-2Q4HOGEI.js';
31
+ import { Button, elementType, ControlSizeContext, triggerType, Spinner } from './chunk-HQFTP7Y5.js';
32
+ export { Button, ButtonSizeContext, ControlSizeContext, Spinner } from './chunk-HQFTP7Y5.js';
35
33
  import { useBreakpoint, readBreakpointPx } from './chunk-ZHUVLBCC.js';
36
34
  export { BreakpointWidthProvider, useBreakpoint } from './chunk-ZHUVLBCC.js';
37
- import { useTextOverflow } from './chunk-HUNEJIKV.js';
38
- export { useTextOverflow } from './chunk-HUNEJIKV.js';
39
- import { AutoTooltip, mergeRefs, useRevealFocus } from './chunk-XSQD3UGY.js';
40
- export { Tooltip, useRevealFocus } from './chunk-XSQD3UGY.js';
35
+ import { useInputModality, inputModality } from './chunk-7RKC5C7G.js';
36
+ export { INPUT_MODALITY_ATTR, inputModality, installInputModality, useInputModality } from './chunk-7RKC5C7G.js';
37
+ import { useTextOverflow } from './chunk-W3GY5ROH.js';
38
+ export { useTextOverflow } from './chunk-W3GY5ROH.js';
39
+ import { AutoTooltip, mergeRefs, useRevealFocus } from './chunk-DR6WEI3A.js';
40
+ export { Tooltip, useRevealFocus } from './chunk-DR6WEI3A.js';
41
41
  import { Icon, slotIcon, warnOnce } from './chunk-53F7GVBQ.js';
42
- import { cn, FOCUS_RING, focusAfterSelfRemoval, FOCUSABLE, GLASS_SURFACE, useFocusKeptInList, FOCUS_INSET, useLatest, PEER_FOCUS_RING, GLASS_BACKDROP, FIELD, ZOOM_KEYS, rovingTabStop, FOCUS_ROOM, useOverlayLayer, useFocusTrap, useFocusBeforeOpen, rememberOpener, focusInitial, lockBodyScroll, unlockBodyScroll, OVERLAY_CLOSE_ATTR, OVERLAY_SURFACE, GLASS_OVERLAY, usePopupFocus, usePosition, ERROR_HAS_FOCUS_RING, FIELD_HAS_FOCUS_RING, CONTROL_ANCESTOR, GROUP_FOCUS_RING, useGridKeyboard, ERROR_ACTIVE_RING, ACTIVE_RING, ERROR_FOCUS_WITHIN_RING, FIELD_FOCUS_WITHIN_RING, focusAfterRemoval, GLASS_DROPDOWN, ERROR_FOCUS_RING, FIELD_FOCUS_RING, atLeastFocusRoom, useNonModalDialog, useReturnFocus } from './chunk-OWQ7M6R7.js';
43
- export { useGridKeyboard } from './chunk-OWQ7M6R7.js';
42
+ import { cn, FOCUS_RING, focusAfterSelfRemoval, FOCUSABLE, GLASS_SURFACE, useFocusKeptInList, FOCUS_INSET, useLatest, PEER_FOCUS_RING, GLASS_BACKDROP, OPEN_TO_FOCUS, focusOutOf, FIELD, ZOOM_KEYS, rovingTabStop, FOCUS_ROOM, useOverlayLayer, useFocusTrap, useFocusBeforeOpen, rememberOpener, focusInitial, lockBodyScroll, unlockBodyScroll, OVERLAY_CLOSE_ATTR, OVERLAY_SURFACE, GLASS_OVERLAY, usePopupFocus, usePosition, ERROR_HAS_FOCUS_RING, FIELD_HAS_FOCUS_RING, CONTROL_ANCESTOR, GROUP_FOCUS_RING, useGridKeyboard, ERROR_ACTIVE_RING, ACTIVE_RING, ERROR_FOCUS_WITHIN_RING, FIELD_FOCUS_WITHIN_RING, focusAfterRemoval, GLASS_DROPDOWN, ERROR_FOCUS_RING, FIELD_FOCUS_RING, openToFocus, atLeastFocusRoom, useNonModalDialog, useReturnFocus } from './chunk-EZ3ZGFGA.js';
43
+ export { useGridKeyboard } from './chunk-EZ3ZGFGA.js';
44
44
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
45
45
  import { forwardRef, useRef, useId, useEffect, useState, createContext, useCallback, useLayoutEffect, useMemo, useContext, isValidElement, memo, useImperativeHandle, useSyncExternalStore, Children, Fragment as Fragment$1, cloneElement, useReducer } from 'react';
46
46
  import { createPortal, flushSync } from 'react-dom';
@@ -4151,10 +4151,10 @@ function FormWrapper({ onSubmit, validationMode: validationModeProp, children, a
4151
4151
  return;
4152
4152
  }
4153
4153
  const first = form.querySelector("[aria-invalid='true']");
4154
- if (first) {
4154
+ if (first) openToFocus(first, () => {
4155
4155
  if (typeof first.scrollIntoView === "function") first.scrollIntoView({ block: "center", behavior: "smooth" });
4156
4156
  focusTarget(first).focus({ preventScroll: true });
4157
- }
4157
+ });
4158
4158
  }
4159
4159
  }, [submittedRef, errorSummaryRef, focusSummary]);
4160
4160
  useLayoutEffect(() => {
@@ -4236,10 +4236,10 @@ function FormWrapper({ onSubmit, validationMode: validationModeProp, children, a
4236
4236
  const focusField = (id) => (e) => {
4237
4237
  e.preventDefault();
4238
4238
  const el = id ? document.getElementById(id) : null;
4239
- if (el) {
4239
+ if (el) openToFocus(el, () => {
4240
4240
  el.scrollIntoView?.({ block: "center" });
4241
4241
  focusTarget(el).focus();
4242
- }
4242
+ });
4243
4243
  };
4244
4244
  const summaryNode = errorSummary && summary.length >= 2 ? typeof errorSummary === "function" ? errorSummary(summary) : /* @__PURE__ */ jsx(Alert, { variant: "error", title: `${summary.length} fields need attention`, className: "mb-ds-4", children: /* @__PURE__ */ jsx("ul", { className: "list-disc pl-ds-5 flex flex-col gap-ds-1", children: summary.map((f) => /* @__PURE__ */ jsxs("li", { children: [
4245
4245
  /* @__PURE__ */ jsx("a", { href: f.id ? `#${f.id}` : void 0, onClick: focusField(f.id), className: cn("underline underline-offset-2 text-[var(--ds-text-primary)]", FOCUS_RING), children: f.label }),
@@ -8718,7 +8718,11 @@ function Calendar({
8718
8718
  }
8719
8719
  check = setTimeout(settle, SETTLE_MS);
8720
8720
  };
8721
- const onOut = () => {
8721
+ const onOut = (e) => {
8722
+ if (!e.target?.closest?.('[role="dialog"], [role="alertdialog"]')) {
8723
+ stop();
8724
+ return;
8725
+ }
8722
8726
  clearTimeout(check);
8723
8727
  check = setTimeout(settle, SETTLE_MS);
8724
8728
  };
@@ -9378,20 +9382,54 @@ function CollapsibleRoot({
9378
9382
  const [internalOpen, setInternalOpen] = useState(defaultOpen);
9379
9383
  const isControlled = controlledOpen !== void 0;
9380
9384
  const isOpen = isControlled ? controlledOpen : internalOpen;
9385
+ const triggerRef = useRef(null);
9386
+ const setTrigger = useCallback((el) => {
9387
+ triggerRef.current = el;
9388
+ }, []);
9389
+ const trigger = useCallback(() => triggerRef.current, []);
9390
+ const open = () => {
9391
+ if (isOpen) return;
9392
+ if (!isControlled) setInternalOpen(true);
9393
+ onOpenChange?.(true);
9394
+ };
9381
9395
  const toggle = () => {
9382
9396
  const next = !isOpen;
9383
9397
  if (!isControlled) setInternalOpen(next);
9384
9398
  onOpenChange?.(next);
9385
9399
  };
9386
- return /* @__PURE__ */ jsx(CollapsibleContext, { value: { isOpen, toggle }, children: /* @__PURE__ */ jsx("div", { className, "data-state": isOpen ? "open" : "closed", children: typeof children === "function" ? children({ isOpen, toggle }) : children }) });
9400
+ return /* @__PURE__ */ jsx(CollapsibleContext, { value: { isOpen, toggle, setTrigger, trigger, open }, children: /* @__PURE__ */ jsx("div", { className, "data-state": isOpen ? "open" : "closed", children: typeof children === "function" ? children({ isOpen, toggle }) : children }) });
9401
+ }
9402
+ var merged = /* @__PURE__ */ new WeakMap();
9403
+ function withTrigger(own, setTrigger) {
9404
+ if (!own) return setTrigger;
9405
+ let bySetter = merged.get(own);
9406
+ if (!bySetter) merged.set(own, bySetter = /* @__PURE__ */ new WeakMap());
9407
+ let attach = bySetter.get(setTrigger);
9408
+ if (!attach) {
9409
+ attach = (el) => {
9410
+ setTrigger(el);
9411
+ let cleanup;
9412
+ if (typeof own === "function") cleanup = own(el);
9413
+ else own.current = el;
9414
+ return () => {
9415
+ setTrigger(null);
9416
+ if (typeof cleanup === "function") cleanup();
9417
+ else if (typeof own === "function") own(null);
9418
+ else own.current = null;
9419
+ };
9420
+ };
9421
+ bySetter.set(setTrigger, attach);
9422
+ }
9423
+ return attach;
9387
9424
  }
9388
9425
  function CollapsibleTrigger({ children, className }) {
9389
- const { isOpen, toggle } = useCollapsible();
9426
+ const { isOpen, toggle, setTrigger } = useCollapsible();
9390
9427
  if (isValidElement(children)) {
9391
9428
  const child = children;
9392
9429
  return cloneElement(child, {
9393
9430
  // a Button trigger in a form toggles; it never submits the form (0.21.0)
9394
9431
  ...triggerType(child),
9432
+ ref: withTrigger(child.props.ref, setTrigger),
9395
9433
  "aria-expanded": isOpen,
9396
9434
  className: cn(child.props.className, className),
9397
9435
  onClick: (e) => {
@@ -9400,29 +9438,92 @@ function CollapsibleTrigger({ children, className }) {
9400
9438
  }
9401
9439
  });
9402
9440
  }
9403
- return /* @__PURE__ */ jsx("button", { type: "button", className: cn("text-left cursor-pointer", FOCUS_RING, className), onClick: toggle, "aria-expanded": isOpen, children });
9441
+ return /* @__PURE__ */ jsx("button", { ref: withTrigger(void 0, setTrigger), type: "button", className: cn("text-left cursor-pointer", FOCUS_RING, className), onClick: toggle, "aria-expanded": isOpen, children });
9404
9442
  }
9405
9443
  function CollapsibleContent({ children, className }) {
9406
- const { isOpen } = useCollapsible();
9444
+ const { isOpen, trigger, open } = useCollapsible();
9407
9445
  const ref = useRef(null);
9408
- const innerRef = useRef(null);
9409
- const [height, setHeight] = useState(void 0);
9410
- useEffect(() => {
9411
- if (innerRef.current) {
9412
- setHeight(isOpen ? innerRef.current.scrollHeight : 0);
9446
+ const asked = useRef(null);
9447
+ const isOpenNow = useLatest(isOpen);
9448
+ const openNow = useLatest(open);
9449
+ useLayoutEffect(() => {
9450
+ const el = ref.current;
9451
+ if (!el) return;
9452
+ const onAsk = (e) => {
9453
+ if (isOpenNow.current) return;
9454
+ asked.current = e.detail;
9455
+ openNow.current();
9456
+ };
9457
+ el.addEventListener(OPEN_TO_FOCUS, onAsk);
9458
+ return () => el.removeEventListener(OPEN_TO_FOCUS, onAsk);
9459
+ }, [isOpenNow, openNow]);
9460
+ useLayoutEffect(() => {
9461
+ if (asked.current && !isOpen) asked.current = null;
9462
+ });
9463
+ const [height, setHeight] = useState(isOpen ? "auto" : 0);
9464
+ const [inertNow, setInertNow] = useState(!isOpen);
9465
+ const was = useRef(isOpen);
9466
+ useLayoutEffect(() => {
9467
+ const el = ref.current;
9468
+ if (was.current === isOpen) return;
9469
+ was.current = isOpen;
9470
+ if (!el) return;
9471
+ if (!isOpen && el.contains(document.activeElement)) {
9472
+ trigger()?.focus();
9473
+ if (el.contains(document.activeElement)) focusOutOf(el);
9474
+ }
9475
+ const ask = asked.current;
9476
+ asked.current = null;
9477
+ if (isOpen && ask && !ask.done && performance.now() - ask.at < 1e3 && !ask.target.closest("[inert]")) {
9478
+ ask.done = true;
9479
+ ask.step();
9413
9480
  }
9414
- }, [isOpen]);
9481
+ setInertNow(!isOpen);
9482
+ const seconds = parseFloat(getComputedStyle(el).transitionDuration) || 0;
9483
+ if (seconds <= 0) {
9484
+ setHeight(isOpen ? "auto" : 0);
9485
+ return;
9486
+ }
9487
+ let frame = 0;
9488
+ if (isOpen) setHeight(el.scrollHeight);
9489
+ else {
9490
+ setHeight(el.scrollHeight);
9491
+ frame = requestAnimationFrame(() => {
9492
+ void el.offsetHeight;
9493
+ setHeight(0);
9494
+ });
9495
+ }
9496
+ let done = false;
9497
+ const settle = () => {
9498
+ if (done) return;
9499
+ done = true;
9500
+ if (isOpen) setHeight("auto");
9501
+ };
9502
+ const onEnd = (e) => {
9503
+ if (e.target === el && e.propertyName === "height") settle();
9504
+ };
9505
+ el.addEventListener("transitionend", onEnd);
9506
+ const timer = setTimeout(settle, seconds * 1e3 + 100);
9507
+ return () => {
9508
+ cancelAnimationFrame(frame);
9509
+ el.removeEventListener("transitionend", onEnd);
9510
+ clearTimeout(timer);
9511
+ };
9512
+ }, [isOpen, trigger]);
9513
+ const moving = typeof height === "number" && height > 0;
9415
9514
  return /* @__PURE__ */ jsx(
9416
9515
  "div",
9417
9516
  {
9418
9517
  ref,
9419
- className: cn("overflow-hidden transition-[height]", className),
9518
+ "data-state": isOpen ? "open" : "closed",
9519
+ inert: inertNow && !isOpen,
9520
+ className: cn((!isOpen || moving) && "overflow-hidden", "transition-[height]", className),
9420
9521
  style: {
9421
- height: height ?? 0,
9522
+ height: height === "auto" ? void 0 : height,
9422
9523
  transitionDuration: "var(--ds-transition-speed)",
9423
9524
  transitionTimingFunction: "var(--ds-transition-ease)"
9424
9525
  },
9425
- children: /* @__PURE__ */ jsx("div", { ref: innerRef, children })
9526
+ children: /* @__PURE__ */ jsx("div", { children })
9426
9527
  }
9427
9528
  );
9428
9529
  }
@@ -15836,6 +15937,7 @@ function SnappingHeader({
15836
15937
  ([entry]) => {
15837
15938
  if (!entry.isIntersecting && !collapsedRef.current) {
15838
15939
  collapsedRef.current = true;
15940
+ setSpacer(expandedHeightRef.current);
15839
15941
  setCollapsed(true);
15840
15942
  }
15841
15943
  },