gridsmith-ui 0.32.0 → 0.33.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 (56) hide show
  1. package/CHANGELOG.md +33 -1
  2. package/README.md +4 -2
  3. package/dist/charts.d.ts +10 -1
  4. package/dist/charts.js +113 -48
  5. package/dist/charts.js.map +1 -1
  6. package/dist/chat.js +2 -2
  7. package/dist/{chunk-NGZJK57C.js → chunk-6NRLTG5W.js} +8 -7
  8. package/dist/chunk-6NRLTG5W.js.map +1 -0
  9. package/dist/{chunk-OVHM55JF.js → chunk-6XCWKLJZ.js} +40 -5
  10. package/dist/chunk-6XCWKLJZ.js.map +1 -0
  11. package/dist/{chunk-JHZ22HQP.js → chunk-AB4UQ4G5.js} +58 -219
  12. package/dist/chunk-AB4UQ4G5.js.map +1 -0
  13. package/dist/{chunk-SIEU4H3H.js → chunk-AVSP6NDX.js} +5 -5
  14. package/dist/{chunk-SIEU4H3H.js.map → chunk-AVSP6NDX.js.map} +1 -1
  15. package/dist/chunk-F2XMZOUP.js +81 -0
  16. package/dist/chunk-F2XMZOUP.js.map +1 -0
  17. package/dist/{chunk-XBVZIN26.js → chunk-FF57N3P7.js} +8 -6
  18. package/dist/chunk-FF57N3P7.js.map +1 -0
  19. package/dist/chunk-GIA4BMGI.js +18 -0
  20. package/dist/chunk-GIA4BMGI.js.map +1 -0
  21. package/dist/{chunk-DO6DLTFK.js → chunk-OWGF362U.js} +4 -4
  22. package/dist/{chunk-DO6DLTFK.js.map → chunk-OWGF362U.js.map} +1 -1
  23. package/dist/chunk-P3NUUIL6.js +9 -0
  24. package/dist/chunk-P3NUUIL6.js.map +1 -0
  25. package/dist/chunk-R7FG4ZQ5.js +16 -0
  26. package/dist/chunk-R7FG4ZQ5.js.map +1 -0
  27. package/dist/{chunk-QY2RA2HO.js → chunk-UBLBVCQN.js} +3 -3
  28. package/dist/{chunk-QY2RA2HO.js.map → chunk-UBLBVCQN.js.map} +1 -1
  29. package/dist/{chunk-HUVZQOU4.js → chunk-WD6T57ZJ.js} +3 -3
  30. package/dist/{chunk-HUVZQOU4.js.map → chunk-WD6T57ZJ.js.map} +1 -1
  31. package/dist/chunk-ZQV26NND.js +213 -0
  32. package/dist/chunk-ZQV26NND.js.map +1 -0
  33. package/dist/dashboard.d.ts +207 -0
  34. package/dist/dashboard.js +1210 -0
  35. package/dist/dashboard.js.map +1 -0
  36. package/dist/data-grid.js +8 -7
  37. package/dist/data-grid.js.map +1 -1
  38. package/dist/index.d.ts +50 -6
  39. package/dist/index.js +190 -128
  40. package/dist/index.js.map +1 -1
  41. package/dist/kanban.js +6 -6
  42. package/dist/resizable.js +7 -6
  43. package/dist/resizable.js.map +1 -1
  44. package/dist/utils.d.ts +51 -1
  45. package/dist/utils.js +55 -4
  46. package/dist/utils.js.map +1 -1
  47. package/dist/virtualized.js +6 -6
  48. package/package.json +6 -1
  49. package/dist/chunk-H732QL56.js +0 -71
  50. package/dist/chunk-H732QL56.js.map +0 -1
  51. package/dist/chunk-JHZ22HQP.js.map +0 -1
  52. package/dist/chunk-LJYSVZMI.js +0 -25
  53. package/dist/chunk-LJYSVZMI.js.map +0 -1
  54. package/dist/chunk-NGZJK57C.js.map +0 -1
  55. package/dist/chunk-OVHM55JF.js.map +0 -1
  56. package/dist/chunk-XBVZIN26.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/components/Skeleton.tsx","../../../showcase/src/components/SegmentedControl.tsx","../../../showcase/src/lib/title-text.ts","../../../showcase/src/lib/dashboard-frame.ts","../../../showcase/src/lib/cell-frame.ts"],"names":["jsx","jsxs"],"mappings":"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","file":"chunk-6XCWKLJZ.js","sourcesContent":["import { cn } from \"../lib/utils\";\n\ninterface SkeletonProps {\n variant?: \"text\" | \"avatar\" | \"card\" | \"table-row\" | \"custom\";\n lines?: number;\n width?: string;\n height?: string;\n className?: string;\n}\n\nfunction Bone({ className, style, \"data-gs\": marker }: { className?: string; style?: React.CSSProperties; \"data-gs\"?: string }) {\n return (\n <div\n data-gs={marker}\n className={cn(\"rounded-[var(--ds-radius-sm)] bg-[var(--ds-bg-emphasis)] animate-pulse\", className)}\n style={style}\n />\n );\n}\n\nexport function Skeleton({ variant = \"text\", lines = 3, width, height, className }: SkeletonProps) {\n if (variant === \"custom\") {\n return <Bone data-gs=\"skeleton\" className={className} style={{ width, height }} />;\n }\n\n if (variant === \"avatar\") {\n return <Bone data-gs=\"skeleton\" className={cn(\"h-10 w-10 rounded-[var(--ds-radius-full)]\", className)} />;\n }\n\n if (variant === \"card\") {\n return (\n <div data-gs=\"skeleton\" className={cn(\"space-y-ds-3\", className)}>\n <Bone className=\"h-32 w-full rounded-[var(--ds-radius-md)]\" />\n <Bone className=\"h-4 w-3/4\" />\n <Bone className=\"h-4 w-1/2\" />\n </div>\n );\n }\n\n if (variant === \"table-row\") {\n return (\n <div data-gs=\"skeleton\" className={cn(\"flex gap-ds-4\", className)}>\n <Bone className=\"h-4 flex-[3]\" />\n <Bone className=\"h-4 flex-[2]\" />\n <Bone className=\"h-4 flex-1\" />\n <Bone className=\"h-4 flex-1\" />\n </div>\n );\n }\n\n // text variant\n const widths = [\"w-3/4\", \"w-1/2\", \"w-5/6\", \"w-2/3\", \"w-4/5\"];\n return (\n <div data-gs=\"skeleton\" className={cn(\"space-y-ds-3\", className)}>\n {Array.from({ length: lines }, (_, i) => (\n <Bone key={i} className={cn(\"h-4\", widths[i % widths.length])} />\n ))}\n </div>\n );\n}\n","import { useRef, useState, useLayoutEffect, useEffect, useCallback, useContext } from \"react\";\nimport { cn, FOCUS_RING } from \"../lib/utils\";\nimport { rovingTabStop } from \"../lib/focus\";\nimport { Dropdown } from \"./Dropdown\";\nimport { ControlSizeContext } from \"./Button\";\nimport { useFieldControl, type FieldControlWiring } from \"./Field\";\nimport { useReportedChange } from \"../lib/form-context\";\n\ninterface SegmentedControlOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\ntype SegmentedControlSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\ninterface SegmentedControlProps extends FieldControlWiring {\n value: string;\n onChange: (value: string) => void;\n options: SegmentedControlOption[];\n /** xs is for dense tool chrome (toolbars, inspectors): 24px tall. */\n size?: SegmentedControlSize;\n variant?: \"default\" | \"ghost\";\n /** Stretch to the container and share the width equally between options. */\n fullWidth?: boolean;\n /**\n * Called with an option's value while the pointer is over it and with null\n * when it leaves, so a picker can preview a choice before committing it.\n */\n onHoverChange?: (value: string | null) => void;\n className?: string;\n /**\n * Accessible name for the radiogroup, for when there is no visible label (e.g. in a toolbar). A control with a visible\n * label sits in a Field instead, which names it and stacks the label above: `<Field label=\"Status\"><SegmentedControl …/></Field>`.\n */\n \"aria-label\"?: string;\n /**\n * Above this many options the control renders a Dropdown with the same value, onChange and options — a row of\n * eleven segments runs off the page (bench round 3). Default 6; raise it only where the row is known to fit. A row\n * that does not fit its container (a four-option range on a phone) renders the Dropdown too, and comes back as a\n * row when the container widens (round 10).\n */\n maxOptions?: number;\n}\n\n/** The options as one string, so the fit re-measures when the labels change. */\nfunction optionsKeyForFit(options: SegmentedControlOption[]): string { return options.map((o) => `${o.value}:${o.label}`).join(\"|\"); }\n\n// Option padding is part of the size (tailwind-merge cannot resolve two ds-\n// spacing classes against each other, so it is not appended as an override).\nconst sizes: Record<SegmentedControlSize, string> = {\n xs: \"text-xs px-ds-2\",\n sm: \"text-xs px-ds-3\",\n md: \"text-sm px-ds-3\",\n lg: \"text-base px-ds-3\",\n};\n\n// xs uses a 2px inset so the whole control stays 24px tall.\nconst containerPadding: Record<SegmentedControlSize, string> = {\n xs: \"p-[2px] gap-[2px]\",\n sm: \"p-ds-1 gap-ds-0.5\",\n md: \"p-ds-1 gap-ds-0.5\",\n lg: \"p-ds-1 gap-ds-0.5\",\n};\n\nconst indicatorInset: Record<SegmentedControlSize, string> = {\n xs: \"2px\",\n sm: \"4px\",\n md: \"4px\",\n lg: \"4px\",\n};\n\n/**\n * The segments' corner: the frame's (a field's, --ds-radius-md) less the gap between the two edges, the selected\n * segment's inset and the frame's border when it draws one, so the curves sit evenly inside each other; never sharper\n * than the theme's small radius, so on a theme of small corners the segments stay slightly rounded, not square (a\n * square theme stays square).\n */\nfunction segmentRadius(inset: string, bordered: boolean): string {\n return `max(var(--ds-radius-sm), calc(var(--ds-radius-md) - ${inset}${bordered ? \" - var(--ds-border-width)\" : \"\"}))`;\n}\n\nexport function SegmentedControl({\n value,\n onChange: onChangeProp,\n options,\n size: sizeProp,\n variant = \"default\",\n fullWidth = false,\n onHoverChange,\n className,\n \"aria-label\": ariaLabel,\n maxOptions = 6,\n ...wiring\n}: SegmentedControlProps) {\n // Sprint 25.12 A15: a new value the user gives this control marks the form's overlay; the page's onChange runs as given\n const onChange = useReportedChange(onChangeProp, value);\n const contextSize = useContext(ControlSizeContext);\n // Inside a Field it takes the Field's label (round 27, R27-10): a radio group is named by aria-labelledby, since\n // <label for> cannot name it, and the Field stacks its label above. It takes the Field's id, hint, error and\n // required state too (round 27 review: without them the summary had no link and focus skipped it); a radio group\n // carries aria-invalid and aria-required itself. As a Dropdown, the Dropdown reads the same Field. The name follows the\n // one rule (useFieldControl; the final review of Sprint 25.31, 2): the Field's label on screen leads it, where a\n // page's aria-label won before (\"Calendar view\" over \"View\"), and a page's name beside it is left out, with a warning\n const control = useFieldControl({ ...wiring, \"aria-label\": ariaLabel }, { component: \"SegmentedControl\" });\n // as a Dropdown, only the names the rule left: the page gave them to this control, not to a Dropdown, which would warn\n const { \"aria-labelledby\": _pageLabelledBy, ...dropdownWiring } = wiring;\n const size: SegmentedControlSize = sizeProp ?? (contextSize as SegmentedControlSize | null) ?? \"md\";\n const containerRef = useRef<HTMLDivElement>(null);\n const [indicator, setIndicator] = useState({ left: 0, width: 0 });\n\n // Round 10 (the owner's review of the analytics overview on a phone): a row that does not fit its container renders\n // the Dropdown too, not only a row of too many options. The row's natural width is remembered from the last time\n // it was laid out; the container (the filters row, the toolbar) is observed in both states, so the row comes back\n // when the container widens. 8 px of hysteresis keeps a row sitting on the edge from flapping.\n const parentRef = useRef<HTMLElement | null>(null);\n const neededRef = useRef(0);\n const [overflows, setOverflows] = useState(false);\n const measureFit = useCallback(() => {\n const row = containerRef.current;\n if (row) {\n parentRef.current = row.parentElement;\n if (row.scrollWidth > 0) neededRef.current = row.scrollWidth;\n }\n const parent = parentRef.current;\n const needed = neededRef.current;\n if (!parent || !needed) return;\n const style = getComputedStyle(parent);\n const available = parent.clientWidth - (parseFloat(style.paddingLeft) || 0) - (parseFloat(style.paddingRight) || 0);\n if (available <= 0) return;\n setOverflows((prev) => (prev ? needed > available - 8 : needed > available));\n }, []);\n useLayoutEffect(() => {\n measureFit();\n const parent = parentRef.current;\n if (!parent || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measureFit);\n observer.observe(parent);\n return () => observer.disconnect();\n }, [measureFit, optionsKeyForFit(options)]); // eslint-disable-line react-hooks/exhaustive-deps\n const collapsed = options.length > maxOptions || overflows;\n\n const updateIndicator = useCallback(() => {\n if (!containerRef.current) return;\n const active = containerRef.current.querySelector<HTMLElement>(\"[data-active='true']\");\n if (active) {\n setIndicator({\n left: active.offsetLeft,\n width: active.offsetWidth,\n });\n }\n }, []);\n\n // The option set can change under the control (a configurator hiding an\n // option), which moves the active segment without changing `value`: re-measure\n // on that too, and watch every segment, not just the container, so a label\n // that changes width also moves the thumb.\n const optionsKey = options.map((o) => `${o.value}:${o.label}`).join(\"|\");\n useLayoutEffect(() => {\n updateIndicator();\n }, [value, optionsKey, updateIndicator]);\n\n // The web font can land after the first measurement and widen the segments (round 5: the thumb was caught\n // mid-slide on every load). Re-measure when the fonts are ready, and animate only after the user's first change:\n // the initial position and the font re-measure snap into place.\n useEffect(() => {\n const fonts = (document as Document & { fonts?: { ready?: Promise<unknown> } }).fonts;\n if (!fonts?.ready) return;\n let live = true;\n fonts.ready.then(() => { if (live) updateIndicator(); });\n return () => { live = false; };\n }, [updateIndicator]);\n const [animate, setAnimate] = useState(false);\n const select = useCallback((v: string) => { setAnimate(true); onChange(v); }, [onChange]);\n\n useLayoutEffect(() => {\n if (collapsed || !containerRef.current || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(updateIndicator);\n observer.observe(containerRef.current);\n containerRef.current.querySelectorAll<HTMLElement>(\"button\").forEach((b) => observer.observe(b));\n return () => observer.disconnect();\n }, [updateIndicator, optionsKey, collapsed]);\n\n const containerHeight: Record<SegmentedControlSize, string> = {\n xs: \"h-ds-6\",\n sm: \"h-[var(--ds-control-height-sm)]\",\n md: \"h-[var(--ds-control-height-md)]\",\n lg: \"h-[var(--ds-control-height-lg)]\",\n };\n\n // Radio-group keyboard pattern: one tab stop (the checked option, or the\n // first enabled one when nothing is checked), arrows move selection between\n // enabled options, Home/End jump to the ends.\n const tabStop = rovingTabStop(options, (o) => o.value === value, (o) => !!o.disabled);\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const enabled = options.filter((o) => !o.disabled);\n if (enabled.length === 0) return;\n const idx = Math.max(0, enabled.findIndex((o) => o.value === value));\n let next: number | null = null;\n if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") next = (idx + 1) % enabled.length;\n else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") next = (idx - 1 + enabled.length) % enabled.length;\n else if (e.key === \"Home\") next = 0;\n else if (e.key === \"End\") next = enabled.length - 1;\n if (next === null) return;\n e.preventDefault();\n select(enabled[next].value);\n const buttons = containerRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]');\n buttons?.forEach((b) => { if (b.dataset.value === enabled[next!].value) b.focus(); });\n };\n\n if (collapsed) {\n return (\n <Dropdown\n {...dropdownWiring}\n aria-label={control.shown ? undefined : control.label}\n aria-labelledby={control.shown ? undefined : wiring[\"aria-labelledby\"]}\n size={size === \"md\" || size === \"lg\" ? \"md\" : \"sm\"}\n options={options.filter((o) => !o.disabled).map((o) => ({ id: o.value, label: o.label }))}\n value={value}\n onChange={(v) => onChange(v as string)}\n className={cn(\"inline-block\", fullWidth ? \"w-full\" : \"w-auto\", className)}\n />\n );\n }\n\n return (\n <div\n ref={containerRef}\n role=\"radiogroup\"\n id={control.id}\n aria-label={control.labelId ? undefined : control.label}\n aria-labelledby={control.labelId}\n aria-describedby={control.describedBy}\n aria-invalid={control.invalid || undefined}\n aria-required={control.required || undefined}\n onKeyDown={handleKeyDown}\n className={cn(\n \"relative items-center\",\n // Sprint 25.14 A21: in a Field's column a track that isn't full width keeps its own width; w-fit, not self-start,\n // so a row or a centred column still aligns it (the review of 30 September)\n fullWidth ? \"flex w-full\" : \"inline-flex w-fit\",\n containerPadding[size],\n containerHeight[size],\n \"bg-[var(--ds-bg-muted)]\",\n // The owner's review of 1 October 2026: the frame's corner is a field's, so the two change together with the\n // theme's radius; the segments inside sit concentric with it (SEGMENT_RADIUS)\n \"rounded-[var(--ds-radius-md)]\",\n // The frame's edge is a button's: each segment is a labelled button, so the frame isn't what identifies the\n // control, and WCAG 1.4.11 asks no 3:1 of it\n variant === \"default\" && \"border-[length:var(--ds-border-width)] border-[var(--ds-border-default)]\",\n control.invalid && \"border-[length:var(--ds-border-width)] border-[var(--ds-status-error)]\",\n className,\n )}\n style={{ \"--ds-segment-radius\": segmentRadius(indicatorInset[size], variant === \"default\" || !!control.invalid) } as React.CSSProperties}\n >\n <div\n className={cn(\n \"absolute rounded-[var(--ds-segment-radius)]\",\n \"bg-[var(--ds-bg-surface)]\",\n // The selected segment is a kind of button, so it takes a secondary button's surface and edge, as the frame\n // takes a button's edge (the owner, 3 October 2026: the 3:1 strong edge it kept from Sprint 25.14 drew the\n // darker outline 25.19 took off the fields). It shows its state as the raised surface on the muted track, with\n // the default variant's shadow and its label's stronger colour. While its segment has keyboard focus the shadow\n // steps aside, as a button's does, so the segment's outline sits clear (Sprint 30, D7)\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-default)]\",\n variant === \"default\" && \"shadow-[var(--ds-shadow-sm)]\",\n \"[[role=radiogroup]:has([aria-checked=true]:focus-visible)_&]:shadow-none\",\n \"transition-all motion-reduce:transition-none\",\n )}\n data-animate={animate ? \"true\" : \"false\"}\n style={{\n left: indicator.left,\n width: indicator.width,\n top: indicatorInset[size],\n bottom: indicatorInset[size],\n transitionDuration: animate ? \"var(--ds-transition-speed)\" : \"0ms\",\n transitionTimingFunction: \"var(--ds-transition-ease)\",\n }}\n />\n {options.map((opt, i) => (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={opt.value === value}\n data-active={opt.value === value}\n data-value={opt.value}\n tabIndex={i === tabStop ? 0 : -1}\n disabled={opt.disabled}\n onClick={() => !opt.disabled && select(opt.value)}\n onMouseEnter={onHoverChange && !opt.disabled ? () => onHoverChange(opt.value) : undefined}\n onMouseLeave={onHoverChange ? () => onHoverChange(null) : undefined}\n className={cn(\n \"relative z-10 inline-flex items-center justify-center self-stretch font-medium whitespace-nowrap\",\n fullWidth && \"flex-1\",\n \"rounded-[var(--ds-segment-radius)]\",\n \"transition-colors cursor-pointer\",\n FOCUS_RING,\n sizes[size],\n opt.value === value\n ? \"text-[var(--ds-text-primary)]\"\n : \"text-[var(--ds-text-muted)] hover:text-[var(--ds-text-secondary)]\",\n opt.disabled && \"opacity-disabled cursor-not-allowed\",\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n","/**\n * A title's text classes: CardTitle's, which a titled Table's band and a ChartContainer's title share (Sprint 25.9, A1),\n * one definition so they cannot drift. A word or a name longer than its line breaks at the line's edge (round 27,\n * R27-16: run 70's \"primary-logo-navy.svg\" ran out of its card); break-word, not anywhere, so a title's words still\n * set its minimum and the actions beside it wrap under it before a word is broken (HEADER_LAYOUT.floor).\n */\nexport const TITLE_TEXT = \"font-[family-name:var(--ds-font-display)] text-lg font-[var(--ds-weight-heading)] text-[var(--ds-text-primary)] break-words\";\n\n/**\n * About eight characters of a title, the basis of a title beside a header's actions: a CardHeader's title truncates\n * down to it, a chart's wraps down to it (Sprint 32 F2), and below it the badges and buttons wrap under the title.\n */\nexport const TITLE_FLOOR = \"basis-[calc(var(--ds-font-size-lg)*4.5)]\";\n","/**\n * Sprint 32 (A4): what a frame does in a dashboard's cell while the grid is in its edit mode. Nothing but styles, keyed\n * on the cell's marks (lib/dashboard-cell.ts: `[data-dashboard-cell]` with `[data-editing]`, and `[data-stacked]` while\n * the grid is one column), so the frames read no context and the main entry gains only these class names. The grid's\n * controls sit beside the frame's content, laid over its header band: the move handle at the start (not on a stacked\n * grid, which has no dragging) and the ⋯ at the end:\n * - room beside the frame's first line, as a Kanban card keeps room for its Move button;\n * - but in a cell under 13rem wide (the cell is an inline-size container named `dashboard-cell`), a band above the first\n * line instead (F2): the controls sit at the frame's top inset and the first line moves down by their height and a\n * gap, so a title keeps the frame's width (beside it, the room left a title under its floor: 2 × 40 px of a quarter of\n * a 640 px grid's 148). The same rule for every frame; each band class undoes the room beside, by the same selector.\n * Each class keys on the cell's own frame (`[data-dashboard-content] >` its root, a paged Table's under its pager's\n * wrapper) and that frame's own header part, never a frame nested in the widget (G8): a titled Table inside a Card\n * widget keeps its actions and its own inset.\n *\n * Literal class names, each written out whole, so a Tailwind that reads the library generates them.\n */\n\n/**\n * Room for the move handle and the ⋯ on a frame's top block that is inset at CardHeader's inset itself (a CardHeader,\n * a titled Table's band): beside it, its inset, the control and a gap, at each end; in a narrow cell, its own inset\n * again at each end and the band above.\n */\nexport const CELL_ROOM = [\n \"[[data-dashboard-cell][data-editing]:not([data-stacked])_:is([data-dashboard-content],[data-dashboard-content]>[data-gs-paged])>*>&]:ps-[calc(var(--ds-space-5)+var(--ds-control-height-sm)+var(--ds-space-2))]\",\n \"[[data-dashboard-cell][data-editing]_:is([data-dashboard-content],[data-dashboard-content]>[data-gs-paged])>*>&]:pe-[calc(var(--ds-space-5)+var(--ds-control-height-sm)+var(--ds-space-2))]\",\n \"[[data-dashboard-cell][data-editing]:not([data-stacked])_:is([data-dashboard-content],[data-dashboard-content]>[data-gs-paged])>*>&]:@max-[13rem]/dashboard-cell:ps-ds-5\",\n \"[[data-dashboard-cell][data-editing]_:is([data-dashboard-content],[data-dashboard-content]>[data-gs-paged])>*>&]:@max-[13rem]/dashboard-cell:pe-ds-5\",\n \"[[data-dashboard-cell][data-editing]_:is([data-dashboard-content],[data-dashboard-content]>[data-gs-paged])>*>&]:@max-[13rem]/dashboard-cell:pt-[calc(var(--ds-space-4)+var(--ds-control-height-sm)+var(--ds-space-2))]\",\n].join(\" \");\n\n/**\n * The same room on a top block inside its frame's own padding (a ChartContainer's title row, a StatsCard's first row):\n * beside it, the control and a gap at each end; in a narrow cell, none beside and the band above. Beside a stat's first\n * row there is none: its room is on its label's line alone (CELL_STAT_ROOM), so its value keeps its width (F4).\n */\nexport const CELL_ROOM_INNER = [\n \"[[data-dashboard-cell][data-editing]:not([data-stacked])_[data-dashboard-content]>:not([data-stats-card])>&]:ps-[calc(var(--ds-control-height-sm)+var(--ds-space-2))]\",\n \"[[data-dashboard-cell][data-editing]_[data-dashboard-content]>:not([data-stats-card])>&]:pe-[calc(var(--ds-control-height-sm)+var(--ds-space-2))]\",\n \"[[data-dashboard-cell][data-editing]:not([data-stacked])_[data-dashboard-content]>:not([data-stats-card])>&]:@max-[13rem]/dashboard-cell:ps-0\",\n \"[[data-dashboard-cell][data-editing]_[data-dashboard-content]>:not([data-stats-card])>&]:@max-[13rem]/dashboard-cell:pe-0\",\n \"[[data-dashboard-cell][data-editing]_[data-dashboard-content]>*>&]:@max-[13rem]/dashboard-cell:pt-[calc(var(--ds-control-height-sm)+var(--ds-space-2))]\",\n].join(\" \");\n\n/**\n * A StatsCard's room beside its label's line only (F4), so the value keeps its width: the handle's at the line's start,\n * and (CELL_STAT_ROOM_END) the ⋯'s at its end, needed only without an icon, as the icon's tile moves down to the value's\n * line, the second of the stat's grid rows (CELL_STAT_TILE), leaving the ⋯ the label line's end. In a narrow cell the stat\n * takes the band (CELL_ROOM_INNER), its whole label below it, and its tile, a picture, is hidden while it's edited: the\n * tile's row is twice the label's, and with the band it pushed the value past a two-row widget's foot (Sprint 32's look\n * check).\n */\nexport const CELL_STAT_ROOM = [\n \"[[data-dashboard-cell][data-editing]:not([data-stacked])_[data-dashboard-content]>[data-stats-card]_&]:ps-[calc(var(--ds-control-height-sm)+var(--ds-space-2))]\",\n \"[[data-dashboard-cell][data-editing]:not([data-stacked])_[data-dashboard-content]>[data-stats-card]_&]:@max-[13rem]/dashboard-cell:ps-0\",\n].join(\" \");\nexport const CELL_STAT_ROOM_END = [\n \"[[data-dashboard-cell][data-editing]_[data-dashboard-content]>[data-stats-card]_&]:pe-[calc(var(--ds-control-height-sm)+var(--ds-space-2))]\",\n \"[[data-dashboard-cell][data-editing]_[data-dashboard-content]>[data-stats-card]_&]:@max-[13rem]/dashboard-cell:pe-0\",\n].join(\" \");\n/**\n * Down by however much more the ⋯, centred on the label's line, reaches below it than the rows' gap does (none in the\n * default density; a few px where a theme's controls are taller, or its spacing tighter).\n */\nexport const CELL_STAT_TILE = [\n \"[[data-dashboard-cell][data-editing]_[data-dashboard-content]>[data-stats-card]_&]:row-[2]\",\n \"[[data-dashboard-cell][data-editing]_[data-dashboard-content]>[data-stats-card]_&]:mt-[max(0px,calc((var(--ds-control-height-sm)-var(--ds-font-size-xs)*var(--text-xs--line-height))/2-var(--ds-space-2)))]\",\n \"[[data-dashboard-cell][data-editing]_[data-dashboard-content]>[data-stats-card]_&]:@max-[13rem]/dashboard-cell:hidden\",\n].join(\" \");\n\n/**\n * A frame's own header controls, hidden while editing (a Card's ⋯ and actions, a Table's actions): the widget shows one ⋯,\n * the grid's, and its content is inert then anyway. A page that wants an action while editing puts it in `itemActions`.\n */\nexport const CELL_HIDE = \"[[data-dashboard-cell][data-editing]_:is([data-dashboard-content],[data-dashboard-content]>[data-gs-paged])>*>:is([data-card-header],[data-table-heading])_&]:hidden\";\n\n/** A ChartContainer's title row hides its slots while editing: the Chart / Table switch, and the page's own actions. */\nexport const CELL_HIDE_CHART_ACTIONS = \"[[data-dashboard-cell][data-editing]_[data-dashboard-content]>*>&_:is([data-chart-actions],[data-chart-page-actions])]:hidden\";\n","/**\n * Sprint 32 (A3): a frame that is a dashboard's widget, found by its cell's marks (lib/dashboard-cell.ts). The main\n * entry's frames (a Card, a titled Table) style themselves in a cell by class names keyed on these marks; what a cell's\n * frame does there that a class can't (a scroll area's Tab stop, a focused row brought into view) runs from the cell,\n * which finds each part by its own mark (lib/cell-frame-scroll.ts, the fix pass's F10). A frame reads this only for what\n * changes what it draws: a clickable Card's role, and a Table's form; a ChartContainer for its sizing (F6).\n */\n\n/** The cell's frame: the one child of the cell's content wrapper, stretched to the cell's height. */\nexport const CELL_FRAME = \"[data-dashboard-content] > *\";\n"]}
@@ -1,15 +1,14 @@
1
1
  "use client";
2
- import { useKeyboardScroll } from './chunk-H732QL56.js';
3
2
  import { PreferencesContext } from './chunk-QOMP4D6V.js';
4
- import { FormChangeCtx } from './chunk-72SDAX54.js';
5
3
  import { SurfaceBoundary } from './chunk-RS624TD5.js';
6
- import { Button } from './chunk-XBVZIN26.js';
7
- import { useBreakpoint, readBreakpointPx } from './chunk-ZHUVLBCC.js';
8
4
  import { useTextOverflow } from './chunk-R2IAK3J3.js';
5
+ import { useOverlayMark, useDirtyGuard, DiscardConfirm, OverlayMarkScope, OverlayCloseCtx, OVERLAY_ROOT_ATTR } from './chunk-ZQV26NND.js';
6
+ import { useBreakpoint } from './chunk-ZHUVLBCC.js';
7
+ import { useKeyboardScroll } from './chunk-F2XMZOUP.js';
9
8
  import { useRevealFocus, AutoTooltip } from './chunk-HCEHTJ5E.js';
10
- import { Icon } from './chunk-53F7GVBQ.js';
9
+ import { warnOnce, Icon } from './chunk-53F7GVBQ.js';
11
10
  import { cn, FOCUS_INSET_WHILE_STOP, usePopupFocus, usePosition, FOCUS_RING, FOCUS_INSET, useLatest, useOverlayLayer, lockBodyScroll, unlockBodyScroll, useReturnFocus, useFocusTrap, inertOutside, focusInitial, useNonModalDialog, OVERLAY_CLOSE_ATTR, OVERLAY_SURFACE, GLASS_OVERLAY, GROUP_FOCUS_RING } from './chunk-2724SJO2.js';
12
- import { createContext, version, forwardRef, useState, useCallback, useRef, useId, useEffect, useContext, useMemo, useLayoutEffect } from 'react';
11
+ import { createContext, version, forwardRef, useState, useRef, useCallback, useLayoutEffect, useId, useEffect, useContext, useMemo } from 'react';
13
12
  import { createPortal } from 'react-dom';
14
13
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
15
14
 
@@ -251,182 +250,6 @@ function defaultMaxWidth(container) {
251
250
  const base = container instanceof HTMLElement ? container.clientWidth : typeof window !== "undefined" ? window.innerWidth : 1200;
252
251
  return Math.round(base * 0.6);
253
252
  }
254
- var OVERLAY_ROOT_ATTR = "data-overlay-root";
255
- function controlsOf(root) {
256
- if (!root) return "";
257
- const controls = root.querySelectorAll("input, select, textarea, [role='combobox'], [role='radiogroup'], [role='checkbox'], [role='switch'], [role='slider'], [role='spinbutton'], [contenteditable='true']");
258
- return Array.from(controls).map((el) => el.id || el.getAttribute("name") || el.getAttribute("role") || el.tagName).join("|");
259
- }
260
- var OverlayMarkCtx = createContext(null);
261
- function OverlayMarkScope({ mark, children }) {
262
- return /* @__PURE__ */ jsx(OverlayMarkCtx, { value: mark, children: /* @__PURE__ */ jsx(FormChangeCtx, { value: null, children }) });
263
- }
264
- function useOverlayMark(open) {
265
- const forms = useRef(/* @__PURE__ */ new Map());
266
- const count = useRef(0);
267
- const round = useRef(0);
268
- const [changed, setChanged] = useState(false);
269
- const [holds, setHolds] = useState(0);
270
- const [pends, setPends] = useState(0);
271
- const [answers, setAnswers] = useState([]);
272
- const [wasOpen, setWasOpen] = useState(open);
273
- if (open !== wasOpen) {
274
- setWasOpen(open);
275
- if (!open) {
276
- setChanged(false);
277
- setAnswers([]);
278
- }
279
- }
280
- useEffect(() => {
281
- if (open) return;
282
- round.current++;
283
- for (const [id, f] of forms.current) {
284
- if (f.mounted) f.stamp = 0;
285
- else forms.current.delete(id);
286
- }
287
- }, [open]);
288
- const mark = useMemo(() => ({
289
- report: (form) => {
290
- const f = forms.current.get(form) ?? { stamp: 0, mounted: true };
291
- f.stamp = ++count.current;
292
- forms.current.set(form, f);
293
- setChanged(true);
294
- },
295
- attach: (form) => {
296
- const f = forms.current.get(form) ?? { stamp: 0, mounted: true };
297
- f.mounted = true;
298
- forms.current.set(form, f);
299
- return () => {
300
- const gone = forms.current.get(form);
301
- if (!gone) return;
302
- if (gone.stamp > 0) gone.mounted = false;
303
- else forms.current.delete(form);
304
- };
305
- },
306
- submit: (form, from) => {
307
- const root = from.element()?.closest(`[${OVERLAY_ROOT_ATTR}]`) ?? null;
308
- const answer = { form, since: count.current, root, controls: controlsOf(root), ...from };
309
- const at = round.current;
310
- let settled = false;
311
- return {
312
- settle: (how) => {
313
- if (settled || at !== round.current) return;
314
- settled = true;
315
- setAnswers((list) => [...list, { ...answer, how }]);
316
- }
317
- };
318
- },
319
- hold: () => {
320
- setHolds((n) => n + 1);
321
- let released = false;
322
- return () => {
323
- if (released) return;
324
- released = true;
325
- setHolds((n) => n - 1);
326
- };
327
- },
328
- pend: () => {
329
- setPends((n) => n + 1);
330
- let released = false;
331
- return () => {
332
- if (released) return;
333
- released = true;
334
- setPends((n) => n - 1);
335
- };
336
- },
337
- open
338
- }), [open]);
339
- useEffect(() => {
340
- if (!answers.length) return;
341
- for (const a of answers) {
342
- const form = a.element();
343
- if (form?.isConnected && (form.querySelector("[aria-invalid='true']") || a.failing())) continue;
344
- if (a.how === "returned") {
345
- const now = a.root?.isConnected ? controlsOf(a.root) : "";
346
- if (now !== "" && now !== a.controls) continue;
347
- }
348
- for (const [id, f] of forms.current) {
349
- if (f.stamp === 0 || f.stamp > a.since || id !== a.form && f.mounted) continue;
350
- if (f.mounted) forms.current.set(id, { ...f, stamp: 0 });
351
- else forms.current.delete(id);
352
- }
353
- }
354
- setAnswers([]);
355
- setChanged([...forms.current.values()].some((f) => f.stamp > 0));
356
- }, [answers]);
357
- return { marked: changed || holds > 0, pending: pends > 0, mark };
358
- }
359
- var OverlayCloseCtx = createContext(null);
360
- function useDirtyGuard(dirty, onClose, onDiscard) {
361
- const [wantsConfirm, setWantsConfirm] = useState(false);
362
- const confirming = wantsConfirm && !!dirty;
363
- const pending = useRef(void 0);
364
- const runAfter = useCallback((then) => {
365
- if (typeof then === "function" && then !== onClose) then();
366
- }, [onClose]);
367
- const requestClose = useCallback((then) => {
368
- if (!dirty) {
369
- onClose();
370
- runAfter(then);
371
- return;
372
- }
373
- pending.current = then;
374
- setWantsConfirm((c) => !c);
375
- }, [dirty, onClose, runAfter]);
376
- const keep = useCallback(() => {
377
- pending.current = void 0;
378
- setWantsConfirm(false);
379
- }, []);
380
- const discard = useCallback(() => {
381
- setWantsConfirm(false);
382
- onDiscard?.();
383
- onClose();
384
- const then = pending.current;
385
- pending.current = void 0;
386
- runAfter(then);
387
- }, [onClose, onDiscard, runAfter]);
388
- return { confirming, requestClose, keep, discard };
389
- }
390
- function DiscardConfirm({ open, onKeep, onDiscard }) {
391
- const keepRef = useRef(null);
392
- const returnTo = useRef(null);
393
- const overlay = useRef(null);
394
- useEffect(() => {
395
- if (!open) return;
396
- const active = document.activeElement instanceof HTMLElement ? document.activeElement : null;
397
- overlay.current = keepRef.current?.closest("[role='dialog'], [role='alertdialog']") ?? null;
398
- returnTo.current = active && active !== document.body && overlay.current?.contains(active) ? active : null;
399
- keepRef.current?.focus();
400
- return () => {
401
- if (document.activeElement !== document.body) return;
402
- const back = returnTo.current;
403
- if (back && back.isConnected) {
404
- back.focus();
405
- return;
406
- }
407
- const first = overlay.current?.querySelector("button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex='-1'])");
408
- (first ?? overlay.current)?.focus();
409
- };
410
- }, [open]);
411
- if (!open) return null;
412
- return /* @__PURE__ */ jsxs(
413
- "div",
414
- {
415
- role: "group",
416
- "aria-label": "Unsaved changes",
417
- "data-discard-confirm": "",
418
- className: "shrink-0 flex flex-wrap items-center justify-between gap-ds-3 border-t-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-status-warning-bg)]",
419
- style: { padding: "var(--ds-space-3) var(--ds-page-gutter)" },
420
- children: [
421
- /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--ds-text-primary)]", children: "You have unsaved changes." }),
422
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-ds-2", children: [
423
- /* @__PURE__ */ jsx(Button, { type: "button", ref: keepRef, variant: "secondary", size: "sm", onClick: onKeep, children: "Keep editing" }),
424
- /* @__PURE__ */ jsx(Button, { type: "button", variant: "destructive", size: "sm", onClick: onDiscard, children: "Discard changes" })
425
- ] })
426
- ]
427
- }
428
- );
429
- }
430
253
  var DrawerWidthCtx = createContext(null);
431
254
  var BulkBarHostCtx = createContext(null);
432
255
  var BulkBarPresenceCtx = createContext(null);
@@ -479,6 +302,7 @@ function useScrollbarInset() {
479
302
  }, []);
480
303
  }
481
304
  var insetLessScrollbar = (gutter) => `max(0px, calc(${gutter} - var(--gs-scrollbar, 0px)))`;
305
+ var AsideSlotContext = createContext(false);
482
306
  var DrawerFooterCtx = createContext(null);
483
307
  var DrawerScopeCtx = createContext(null);
484
308
  var slideClasses = {
@@ -815,7 +639,7 @@ function DrawerPanel({ form, open, onClose, position = "right", width = "400px",
815
639
  ...barStack ? { scrollPaddingBottom: bulkBarRoom(barStack) } : {}
816
640
  },
817
641
  children: [
818
- /* @__PURE__ */ jsx(BulkBarHostCtx, { value: barHost, children: /* @__PURE__ */ jsx(SurfaceBoundary, { children }) }),
642
+ /* @__PURE__ */ jsx(BulkBarHostCtx, { value: barHost, children: /* @__PURE__ */ jsx(SurfaceBoundary, { children: /* @__PURE__ */ jsx(AsideSlotContext, { value: true, children }) }) }),
819
643
  /* @__PURE__ */ jsx(BulkBarSpacer, { room: barStack })
820
644
  ]
821
645
  }
@@ -901,8 +725,47 @@ var AppShell = forwardRef(function AppShell2({
901
725
  }, ref) {
902
726
  if (REACT_VERSION_PROBLEM) throw new Error(REACT_VERSION_PROBLEM);
903
727
  const [sidebarOpen, setSidebarOpen] = useState(false);
904
- const [asideOpen, setAsideOpen] = useState(false);
905
- const [asideFloating, setAsideFloating] = useState(false);
728
+ const [ownAsideOpen, setAsideOpen] = useState(false);
729
+ const [ownAsideFloating, setAsideFloating] = useState(false);
730
+ const [leftAsideHost, setLeftAsideHost] = useState(null);
731
+ const [rightAsideHost, setRightAsideHost] = useState(null);
732
+ const asides = useRef(/* @__PURE__ */ new Map());
733
+ const opened = useRef([]);
734
+ const [openings, setOpenings] = useState(0);
735
+ const [docked, setDocked] = useState(null);
736
+ const [asked, setAsked] = useState([]);
737
+ const reportAside = useCallback((onClose, state) => {
738
+ if (state) asides.current.set(onClose, state);
739
+ else asides.current.delete(onClose);
740
+ if (state?.opened) {
741
+ opened.current.push(onClose);
742
+ setOpenings((n) => n + 1);
743
+ }
744
+ let next = null;
745
+ for (const s of asides.current.values()) if (s.open && s.docked) next = { side: s.side, floating: s.floating };
746
+ setDocked((d) => d?.side === next?.side && d?.floating === next?.floating ? d : next);
747
+ }, []);
748
+ useLayoutEffect(() => {
749
+ const keys = opened.current.filter((key) => asides.current.get(key)?.open);
750
+ opened.current = [];
751
+ if (keys.length === 0) return;
752
+ let winner2 = keys[keys.length - 1];
753
+ for (const key of keys) if (asides.current.get(key)?.page) winner2 = key;
754
+ const closing = [...asides.current].filter(([key, s]) => key !== winner2 && s.open).map(([key]) => key);
755
+ for (const key of closing) key.current();
756
+ if (closing.length > 0) setAsked(closing);
757
+ }, [openings]);
758
+ useLayoutEffect(() => {
759
+ for (const key of asked) {
760
+ const s = asides.current.get(key);
761
+ if (!s?.open) continue;
762
+ const name = typeof document !== "undefined" && document.getElementById(s.name)?.textContent?.trim() || s.name;
763
+ warnOnce("AsidePanel", `"${name}" stayed open as another opened: one AsidePanel is open at a time in a shell, the last opened, so its onClose must close it (set its open to false).`);
764
+ }
765
+ }, [asked]);
766
+ const asideOpen = docked !== null || ownAsideOpen;
767
+ const asideFloating = docked ? docked.floating : ownAsideFloating;
768
+ const asideFloatingSide = docked ? docked.floating ? docked.side : null : ownAsideOpen && ownAsideFloating ? asideSide : null;
906
769
  const isMobile = useBreakpoint("md");
907
770
  const isSmallMobile = useBreakpoint("sm");
908
771
  const isTablet = isMobile && !isSmallMobile;
@@ -987,8 +850,8 @@ var AppShell = forwardRef(function AppShell2({
987
850
  return /* @__PURE__ */ jsx(PreferencesContext, { value: preferences ?? null, children: /* @__PURE__ */ jsx(DrawerWidthCtx, { value: drawerWidth, children: /* @__PURE__ */ jsx(
988
851
  AppShellContext,
989
852
  {
990
- value: { hasSidebar, hasMobileMenu, hasMobileNav, sidebarOpen, setSidebarOpen, isMobile, isTablet, sidebarCollapsed, setSidebarCollapsed: setUserCollapsed, asideOpen, setAsideOpen, asideSide, asideFloating, setAsideFloating, container: shellEl, theme: theme ?? null, isHome, navbarFloating, sidebarFloating, registerChrome, hasLauncher, launcherCorner, registerLauncher, hasFooter, focus: focus ?? null, hasUnsavedChanges: unsavedCount > 0, addUnsavedChanges, drawerWidth, navigate: navigate ?? null, flowLeft: leftCount > 0, markFlowLeft },
991
- children: /* @__PURE__ */ jsxs("div", { ref: (el) => {
853
+ value: { hasSidebar, hasMobileMenu, hasMobileNav, sidebarOpen, setSidebarOpen, isMobile, isTablet, sidebarCollapsed, setSidebarCollapsed: setUserCollapsed, asideOpen, setAsideOpen, asideSide, asideFloating, setAsideFloating, asideFloatingSide, reportAside, asideHosts: { left: leftAsideHost, right: rightAsideHost }, container: shellEl, theme: theme ?? null, isHome, navbarFloating, sidebarFloating, registerChrome, hasLauncher, launcherCorner, registerLauncher, hasFooter, focus: focus ?? null, hasUnsavedChanges: unsavedCount > 0, addUnsavedChanges, drawerWidth, navigate: navigate ?? null, flowLeft: leftCount > 0, markFlowLeft },
854
+ children: /* @__PURE__ */ jsx(AsideSlotContext, { value: false, children: /* @__PURE__ */ jsxs("div", { ref: (el) => {
992
855
  setShellEl(el);
993
856
  if (typeof ref === "function") ref(el);
994
857
  else if (ref) ref.current = el;
@@ -1010,7 +873,8 @@ var AppShell = forwardRef(function AppShell2({
1010
873
  layout === "multi-column" && navbarSlot,
1011
874
  /* @__PURE__ */ jsxs("div", { className: "flex flex-1 min-h-0", children: [
1012
875
  hasSidebar && !isMobile && /* @__PURE__ */ jsx("div", { className: "shrink-0 h-full", children: sidebar }),
1013
- aside && asideSide === "left" && aside,
876
+ aside && asideSide === "left" && /* @__PURE__ */ jsx(AsideSlotContext, { value: true, children: aside }),
877
+ /* @__PURE__ */ jsx("div", { ref: setLeftAsideHost, "data-shell-aside-host": "left", className: "contents" }),
1014
878
  /* @__PURE__ */ jsxs("div", { className: "relative flex-1 flex flex-col min-w-0 min-h-0", children: [
1015
879
  layout === "sidebar" && navbarSlot,
1016
880
  layout === "stacked" && navbarSlot,
@@ -1051,7 +915,8 @@ var AppShell = forwardRef(function AppShell2({
1051
915
  ) }),
1052
916
  /* @__PURE__ */ jsx("div", { ref: setBarLayer, "data-bulk-bar-layer": "", className: BULK_BAR_LAYER, style: { paddingBottom: `calc(${BULK_BAR_GAP}px + ${barSafe})` } })
1053
917
  ] }),
1054
- aside && asideSide === "right" && aside
918
+ /* @__PURE__ */ jsx("div", { ref: setRightAsideHost, "data-shell-aside-host": "right", className: "contents" }),
919
+ aside && asideSide === "right" && /* @__PURE__ */ jsx(AsideSlotContext, { value: true, children: aside })
1055
920
  ] }),
1056
921
  showMobileDrawer && isMobile && // Under the navbar, the menu is modal over the page with the navbar in its scope: the rest inert, Tab cycling the
1057
922
  // two, Escape closing it (the Authoring Practices; Sprint 25.29 item 9). The stacked shell, with no offset, traps
@@ -1076,7 +941,7 @@ var AppShell = forwardRef(function AppShell2({
1076
941
  ) }),
1077
942
  isSmallMobile && hasMobileNav && /* @__PURE__ */ jsx("div", { className: "sticky bottom-0 z-[var(--ds-z-sticky)]", children: mobileNav }),
1078
943
  !isSmallMobile && launcher
1079
- ] })
944
+ ] }) })
1080
945
  }
1081
946
  ) }) });
1082
947
  });
@@ -1379,33 +1244,7 @@ var Breadcrumbs = forwardRef(function Breadcrumbs2({
1379
1244
  dropdown
1380
1245
  ] });
1381
1246
  });
1382
- function useCompact(ref, breakpoint, band = 0) {
1383
- const px = typeof breakpoint === "number" ? breakpoint : readBreakpointPx(breakpoint);
1384
- const width = useElementWidth(ref);
1385
- return useBelow(width, px, band);
1386
- }
1387
- function useBelow(width, threshold, band = 0) {
1388
- const [below, setBelow] = useState(false);
1389
- const next = width > 0 && width < (below ? threshold + band : threshold);
1390
- if (next !== below) setBelow(next);
1391
- return next;
1392
- }
1393
- function useElementWidth(ref) {
1394
- const [width, setWidth] = useState(0);
1395
- const check = useCallback(() => {
1396
- const next = ref.current?.offsetWidth ?? 0;
1397
- if (next > 0) setWidth(next);
1398
- }, [ref]);
1399
- useLayoutEffect(() => {
1400
- check();
1401
- if (!ref.current || typeof ResizeObserver === "undefined") return;
1402
- const observer = new ResizeObserver(check);
1403
- observer.observe(ref.current);
1404
- return () => observer.disconnect();
1405
- }, [check, ref]);
1406
- return width;
1407
- }
1408
1247
 
1409
- export { AppShell, BULK_BAR_LAYER, BULK_BAR_WINDOW_LAYER, Breadcrumbs, BulkBarHostCtx, BulkBarPresenceCtx, BulkBarSpacer, DiscardConfirm, Drawer, DrawerFooterCtx, DrawerPanel, LAUNCHER_INSET_PRIORITY, NAVBAR_INSET_PRIORITY, OVERLAY_ROOT_ATTR, OverlayCloseCtx, OverlayMarkCtx, OverlayMarkScope, PANEL_INSET_PRIORITY, REACT_VERSION_PROBLEM, ResizeEdge, SkipLink, TOAST_INSET_VARS, besideRoom, bulkBarRoom, crumbGoes, defaultMaxWidth, insetLessScrollbar, pxOf, useAppShell, useBelow, useBulkBarHost, useCloseSettle, useCompact, useCornerInset, useCrumbFollow, useDirtyGuard, useElementWidth, useOverlayMark, useRememberedWidth, useScrollbarInset, useUnsavedChanges };
1410
- //# sourceMappingURL=chunk-JHZ22HQP.js.map
1411
- //# sourceMappingURL=chunk-JHZ22HQP.js.map
1248
+ export { AppShell, AsideSlotContext, BULK_BAR_LAYER, BULK_BAR_WINDOW_LAYER, Breadcrumbs, BulkBarHostCtx, BulkBarPresenceCtx, BulkBarSpacer, Drawer, DrawerFooterCtx, DrawerPanel, LAUNCHER_INSET_PRIORITY, NAVBAR_INSET_PRIORITY, PANEL_INSET_PRIORITY, REACT_VERSION_PROBLEM, ResizeEdge, SkipLink, TOAST_INSET_VARS, besideRoom, bulkBarRoom, crumbGoes, defaultMaxWidth, insetLessScrollbar, pxOf, useAppShell, useBulkBarHost, useCloseSettle, useCornerInset, useCrumbFollow, useRememberedWidth, useScrollbarInset, useUnsavedChanges };
1249
+ //# sourceMappingURL=chunk-AB4UQ4G5.js.map
1250
+ //# sourceMappingURL=chunk-AB4UQ4G5.js.map