@ansh-ui/react 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chunk-5CFQFMP5.js +178 -0
  3. package/dist/chunk-5CFQFMP5.js.map +1 -0
  4. package/dist/chunk-6VRF7X5C.cjs +164 -0
  5. package/dist/chunk-6VRF7X5C.cjs.map +1 -0
  6. package/dist/chunk-AVPEA5PB.cjs +718 -0
  7. package/dist/chunk-AVPEA5PB.cjs.map +1 -0
  8. package/dist/chunk-C32LKF23.cjs +198 -0
  9. package/dist/chunk-C32LKF23.cjs.map +1 -0
  10. package/dist/chunk-C5JG6TMM.cjs +1200 -0
  11. package/dist/chunk-C5JG6TMM.cjs.map +1 -0
  12. package/dist/chunk-DATBU46V.cjs +614 -0
  13. package/dist/chunk-DATBU46V.cjs.map +1 -0
  14. package/dist/chunk-EGG4CP7C.js +320 -0
  15. package/dist/chunk-EGG4CP7C.js.map +1 -0
  16. package/dist/chunk-H34OXXJU.js +55 -0
  17. package/dist/chunk-H34OXXJU.js.map +1 -0
  18. package/dist/chunk-HO2YSF5O.js +187 -0
  19. package/dist/chunk-HO2YSF5O.js.map +1 -0
  20. package/dist/chunk-HPGCILO4.js +760 -0
  21. package/dist/chunk-HPGCILO4.js.map +1 -0
  22. package/dist/chunk-IBXLC5IE.js +154 -0
  23. package/dist/chunk-IBXLC5IE.js.map +1 -0
  24. package/dist/chunk-LDCZQP3R.js +1185 -0
  25. package/dist/chunk-LDCZQP3R.js.map +1 -0
  26. package/dist/chunk-LXCIXR5T.js +27 -0
  27. package/dist/chunk-LXCIXR5T.js.map +1 -0
  28. package/dist/chunk-O2PX54KX.js +94 -0
  29. package/dist/chunk-O2PX54KX.js.map +1 -0
  30. package/dist/chunk-OHBWBXLO.cjs +101 -0
  31. package/dist/chunk-OHBWBXLO.cjs.map +1 -0
  32. package/dist/chunk-OJN5JBNP.cjs +776 -0
  33. package/dist/chunk-OJN5JBNP.cjs.map +1 -0
  34. package/dist/chunk-OLTS6G5M.js +606 -0
  35. package/dist/chunk-OLTS6G5M.js.map +1 -0
  36. package/dist/chunk-PO5DU3FU.cjs +29 -0
  37. package/dist/chunk-PO5DU3FU.cjs.map +1 -0
  38. package/dist/chunk-QO3E7TJS.js +2940 -0
  39. package/dist/chunk-QO3E7TJS.js.map +1 -0
  40. package/dist/chunk-RHTLNSVW.cjs +2976 -0
  41. package/dist/chunk-RHTLNSVW.cjs.map +1 -0
  42. package/dist/chunk-SFU5EPSN.cjs +61 -0
  43. package/dist/chunk-SFU5EPSN.cjs.map +1 -0
  44. package/dist/chunk-T4AK2KLM.js +699 -0
  45. package/dist/chunk-T4AK2KLM.js.map +1 -0
  46. package/dist/chunk-WGYNCSTP.cjs +333 -0
  47. package/dist/chunk-WGYNCSTP.cjs.map +1 -0
  48. package/dist/chunk-XEP6P7E6.js +279 -0
  49. package/dist/chunk-XEP6P7E6.js.map +1 -0
  50. package/dist/chunk-XMXECSQO.cjs +286 -0
  51. package/dist/chunk-XMXECSQO.cjs.map +1 -0
  52. package/dist/chunk-ZWAFLHC2.cjs +181 -0
  53. package/dist/chunk-ZWAFLHC2.cjs.map +1 -0
  54. package/dist/data.cjs +71 -0
  55. package/dist/data.cjs.map +1 -0
  56. package/dist/data.d.cts +316 -0
  57. package/dist/data.d.ts +316 -0
  58. package/dist/data.js +6 -0
  59. package/dist/data.js.map +1 -0
  60. package/dist/form.cjs +153 -0
  61. package/dist/form.cjs.map +1 -0
  62. package/dist/form.d.cts +660 -0
  63. package/dist/form.d.ts +660 -0
  64. package/dist/form.js +8 -0
  65. package/dist/form.js.map +1 -0
  66. package/dist/index.cjs +1641 -0
  67. package/dist/index.cjs.map +1 -0
  68. package/dist/index.d.cts +552 -0
  69. package/dist/index.d.ts +552 -0
  70. package/dist/index.js +956 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/layout.cjs +68 -0
  73. package/dist/layout.cjs.map +1 -0
  74. package/dist/layout.d.cts +169 -0
  75. package/dist/layout.d.ts +169 -0
  76. package/dist/layout.js +7 -0
  77. package/dist/layout.js.map +1 -0
  78. package/dist/motion-CQmCq6_k.d.ts +395 -0
  79. package/dist/motion-CSX4g2N8.d.cts +395 -0
  80. package/dist/motion.cjs +79 -0
  81. package/dist/motion.cjs.map +1 -0
  82. package/dist/motion.d.cts +4 -0
  83. package/dist/motion.d.ts +4 -0
  84. package/dist/motion.js +6 -0
  85. package/dist/motion.js.map +1 -0
  86. package/dist/navigation.cjs +48 -0
  87. package/dist/navigation.cjs.map +1 -0
  88. package/dist/navigation.d.cts +210 -0
  89. package/dist/navigation.d.ts +210 -0
  90. package/dist/navigation.js +7 -0
  91. package/dist/navigation.js.map +1 -0
  92. package/dist/overlay.cjs +69 -0
  93. package/dist/overlay.cjs.map +1 -0
  94. package/dist/overlay.d.cts +330 -0
  95. package/dist/overlay.d.ts +330 -0
  96. package/dist/overlay.js +8 -0
  97. package/dist/overlay.js.map +1 -0
  98. package/dist/position-DVScKcaa.d.cts +66 -0
  99. package/dist/position-DVScKcaa.d.ts +66 -0
  100. package/dist/primitives.cjs +162 -0
  101. package/dist/primitives.cjs.map +1 -0
  102. package/dist/primitives.d.cts +294 -0
  103. package/dist/primitives.d.ts +294 -0
  104. package/dist/primitives.js +9 -0
  105. package/dist/primitives.js.map +1 -0
  106. package/dist/sidebar-D-PafAXw.d.cts +71 -0
  107. package/dist/sidebar-D-PafAXw.d.ts +71 -0
  108. package/dist/styles.css +5575 -0
  109. package/dist/use-observers-B9qtimrk.d.cts +99 -0
  110. package/dist/use-observers-B9qtimrk.d.ts +99 -0
  111. package/package.json +92 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/portal.tsx","../src/primitives/use-dismiss.ts","../src/primitives/position.ts","../src/primitives/use-anchored-position.ts"],"names":["useLayoutEffect","useEffect","useState","jsx","Fragment","createPortal","useId","useCallback"],"mappings":"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","file":"chunk-XMXECSQO.cjs","sourcesContent":["import { type ReactNode, useEffect, useLayoutEffect, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\n/**\n * `useLayoutEffect` in the browser, `useEffect` on the server.\n *\n * React warns that `useLayoutEffect` does nothing on the server — correctly, since there is no\n * layout to read. Swapping to `useEffect` there keeps the console clean without changing client\n * behaviour, where the distinction genuinely matters (see below).\n */\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport interface PortalProps {\n children: ReactNode\n /** Where to mount. Defaults to `document.body`. */\n container?: Element | null\n /** Skip the portal and render in place. Useful inside an already-portalled surface. */\n disabled?: boolean\n}\n\n/**\n * Render children elsewhere in the DOM.\n *\n * Overlays must escape their parent's stacking and clipping context. A popover inside a container\n * with `overflow: hidden` gets clipped; one inside a `transform`ed ancestor has its `position:\n * fixed` resolved against that ancestor instead of the viewport, so it lands in the wrong place.\n * Neither is fixable with z-index, and both are the single most common overlay bug.\n *\n * SSR-safe: renders nothing on the server and on the first client render, then portals after mount.\n * Portalling during SSR is impossible (no DOM), and portalling on the first client render would\n * produce markup the server didn't emit — a hydration mismatch.\n */\nexport function Portal({ children, container, disabled }: PortalProps) {\n const [mounted, setMounted] = useState(false)\n\n /**\n * A **layout** effect, not a passive one, and the difference is load-bearing.\n *\n * React flushes every layout effect during commit, then runs passive effects after paint. With\n * `useEffect` here, the portal's children do not exist yet when a parent's passive effect runs —\n * so a parent that opens an overlay and immediately focuses into it finds a null ref and focus\n * stays on `<body>`. That is not a hypothetical: it is exactly how `Select` silently stopped\n * moving focus into its listbox, which breaks `aria-activedescendant` entirely.\n *\n * Promoting this to a layout effect means the portal mounts and re-renders before any parent\n * passive effect runs, so refs into portalled content are populated by the time they are read.\n */\n useIsomorphicLayoutEffect(() => setMounted(true), [])\n\n if (disabled) return <>{children}</>\n if (!mounted) return null\n\n const target = container ?? (typeof document !== 'undefined' ? document.body : null)\n if (!target) return null\n\n return createPortal(children, target)\n}\n","import { type RefObject, useEffect, useId } from 'react'\n\n/**\n * Dismissing layered surfaces.\n *\n * The hard part isn't detecting an outside click — it's nesting. A dropdown inside a dialog, with a\n * tooltip inside that: pressing Escape must close **one** layer, the innermost. Every component\n * attaching its own `document` keydown listener closes all three at once, which is the single most\n * common overlay bug in hand-rolled implementations.\n *\n * A module-level stack fixes it. Surfaces push on open and pop on close, and only the top of the\n * stack responds to Escape.\n */\n\nconst layers: string[] = []\n\n/** Ids of the currently open dismissable layers, outermost first. Exposed for tests. */\nexport function getLayerStack(): readonly string[] {\n return layers\n}\n\nexport interface DismissOptions {\n /** Close on pointer press outside the surface. Default `true`. */\n outsidePress?: boolean\n /** Close on Escape. Only the topmost layer responds. Default `true`. */\n escapeKey?: boolean\n /**\n * Extra elements that count as \"inside\" — normally the trigger.\n *\n * Without this the trigger's own click closes the surface via the outside handler and then\n * immediately reopens it via its own onClick, so the surface appears not to close at all.\n */\n ignore?: Array<RefObject<HTMLElement | null>>\n}\n\nexport function useDismiss(\n ref: RefObject<HTMLElement | null>,\n open: boolean,\n onDismiss: () => void,\n options: DismissOptions = {},\n): void {\n const { outsidePress = true, escapeKey = true, ignore = [] } = options\n const id = useId()\n\n useEffect(() => {\n if (!open) return\n\n layers.push(id)\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!escapeKey || event.key !== 'Escape') return\n // Innermost only.\n if (layers[layers.length - 1] !== id) return\n event.stopPropagation()\n onDismiss()\n }\n\n const onPointerDown = (event: PointerEvent | MouseEvent) => {\n if (!outsidePress) return\n const target = event.target as Node | null\n if (!target) return\n\n // A click that lands on a node already detached from the document (a menu item that removed\n // itself on click) reads as \"outside\" by containment but isn't. Ignore those.\n if (!target.isConnected) return\n\n if (ref.current?.contains(target)) return\n for (const other of ignore) {\n if (other.current?.contains(target)) return\n }\n onDismiss()\n }\n\n // `pointerdown` rather than `click`: a click fires after mouseup, so dragging a text selection\n // out of a popover and releasing outside would close it mid-selection.\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('keydown', onKeyDown, true)\n\n return () => {\n const index = layers.indexOf(id)\n if (index >= 0) layers.splice(index, 1)\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown, true)\n }\n // `ignore` is typically an inline array literal; its identity changes every render, and\n // resubscribing on every render would drop events fired in between.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, id, outsidePress, escapeKey, onDismiss, ref])\n}\n\n/**\n * Lock body scroll while a modal surface is open.\n *\n * Reference-counted, so two stacked modals don't fight over the original value — the inner one\n * closing must not restore scrolling while the outer one is still open.\n *\n * The scrollbar's width is replaced with padding. Without that, hiding the scrollbar reflows the\n * whole page a few pixels wider the instant a dialog opens, which reads as a flash.\n */\nlet scrollLocks = 0\nlet restoreStyles: { overflow: string; paddingRight: string } | null = null\n\nexport function useScrollLock(active: boolean): void {\n useEffect(() => {\n if (!active || typeof document === 'undefined') return\n\n scrollLocks += 1\n if (scrollLocks === 1) {\n const { body } = document\n restoreStyles = { overflow: body.style.overflow, paddingRight: body.style.paddingRight }\n\n const gutter = window.innerWidth - document.documentElement.clientWidth\n body.style.overflow = 'hidden'\n if (gutter > 0) {\n const current = Number.parseFloat(window.getComputedStyle(body).paddingRight) || 0\n body.style.paddingRight = `${current + gutter}px`\n }\n }\n\n return () => {\n scrollLocks -= 1\n if (scrollLocks === 0 && restoreStyles) {\n document.body.style.overflow = restoreStyles.overflow\n document.body.style.paddingRight = restoreStyles.paddingRight\n restoreStyles = null\n }\n }\n }, [active])\n}\n","/**\n * Anchored positioning.\n *\n * Popovers, tooltips, menus and comboboxes all need the same thing: place a floating box next to an\n * anchor, keep it on screen, and report where it actually ended up so the arrow can point the right\n * way. This is that calculation, as a **pure function** of rectangles.\n *\n * Keeping it pure is deliberate. Positioning bugs are notoriously hard to reproduce — they depend\n * on scroll offset, viewport size and element dimensions all at once. As a pure function the whole\n * space is testable in milliseconds without a browser, which is why the edge cases below (flipping\n * into *less* space, shifting past the anchor, both axes at once) are covered by tests rather than\n * by hoping.\n *\n * This is a focused ~200-line implementation, not a Floating UI replacement: it does offset, flip,\n * shift, size-matching and arrow placement, which is what these components need. It does not do\n * auto-placement search, virtual elements or `position: absolute` containing-block resolution —\n * everything here assumes `position: fixed` against the viewport, which is the only strategy that\n * is correct inside transformed and clipped ancestors.\n */\n\nexport type Side = 'top' | 'right' | 'bottom' | 'left'\nexport type Align = 'start' | 'center' | 'end'\nexport type Placement = Side | `${Side}-${Align}`\n\nexport interface Rect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport interface PositionOptions {\n /** Preferred placement. Default `'bottom'`. */\n placement?: Placement\n /** Gap between anchor and floating element, in px. Default `8`. */\n offset?: number\n /** Minimum distance to keep from the viewport edge, in px. Default `8`. */\n padding?: number\n /** Flip to the opposite side when there isn't room. Default `true`. */\n flip?: boolean\n /** Slide along the cross axis to stay on screen. Default `true`. */\n shift?: boolean\n /** Size of the arrow, in px, if one is being positioned. Default `0` (no arrow). */\n arrowSize?: number\n}\n\nexport interface PositionResult {\n /** Viewport coordinates for the floating element's top-left corner. */\n x: number\n y: number\n /** Where it actually ended up — may differ from the request if it flipped. */\n placement: Placement\n side: Side\n align: Align\n /** Arrow offset along the anchor's edge, or `null` when `arrowSize` is 0. */\n arrow: { x: number; y: number } | null\n /** True when the anchor is entirely outside the viewport — callers usually hide the surface. */\n hidden: boolean\n}\n\nfunction parse(placement: Placement): { side: Side; align: Align } {\n const [side, align = 'center'] = placement.split('-') as [Side, Align?]\n return { side, align }\n}\n\nconst OPPOSITE: Record<Side, Side> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' }\n\n/** Free space on each side of the anchor, within the padded viewport. */\nfunction space(anchor: Rect, viewport: Rect, padding: number) {\n return {\n top: anchor.y - viewport.y - padding,\n bottom: viewport.y + viewport.height - (anchor.y + anchor.height) - padding,\n left: anchor.x - viewport.x - padding,\n right: viewport.x + viewport.width - (anchor.x + anchor.width) - padding,\n }\n}\n\n/** Place `floating` next to `anchor` on `side`, aligned by `align`, without clamping. */\nfunction place(anchor: Rect, floating: Rect, side: Side, align: Align, offset: number) {\n let x = 0\n let y = 0\n\n // Main axis: the gap between the two boxes.\n switch (side) {\n case 'top':\n y = anchor.y - floating.height - offset\n break\n case 'bottom':\n y = anchor.y + anchor.height + offset\n break\n case 'left':\n x = anchor.x - floating.width - offset\n break\n case 'right':\n x = anchor.x + anchor.width + offset\n break\n }\n\n // Cross axis: alignment along the anchor's edge.\n const vertical = side === 'top' || side === 'bottom'\n if (vertical) {\n if (align === 'start') x = anchor.x\n else if (align === 'end') x = anchor.x + anchor.width - floating.width\n else x = anchor.x + anchor.width / 2 - floating.width / 2\n } else {\n if (align === 'start') y = anchor.y\n else if (align === 'end') y = anchor.y + anchor.height - floating.height\n else y = anchor.y + anchor.height / 2 - floating.height / 2\n }\n\n return { x, y }\n}\n\n/**\n * Compute where a floating element should sit.\n *\n * All rectangles are in viewport coordinates, as `getBoundingClientRect` returns them.\n */\nexport function computePosition(\n anchor: Rect,\n floating: Rect,\n viewport: Rect,\n options: PositionOptions = {},\n): PositionResult {\n const {\n placement = 'bottom',\n offset = 8,\n padding = 8,\n flip = true,\n shift = true,\n arrowSize = 0,\n } = options\n\n const requested = parse(placement)\n let side = requested.side\n const align = requested.align\n\n // --- Flip ---------------------------------------------------------------\n // Only flip if the opposite side has *more* room. Flipping unconditionally when the preferred\n // side doesn't fit is the classic bug: a tall menu near the bottom of a short viewport fits\n // nowhere, flips upward into even less space, and ends up worse than if it had stayed put.\n if (flip) {\n const available = space(anchor, viewport, padding)\n const needed = side === 'top' || side === 'bottom' ? floating.height : floating.width\n const opposite = OPPOSITE[side]\n if (available[side] < needed + offset && available[opposite] > available[side]) {\n side = opposite\n }\n }\n\n let { x, y } = place(anchor, floating, side, align, offset)\n\n // --- Shift --------------------------------------------------------------\n // Slide along the cross axis to stay within the padded viewport. Clamped so a floating element\n // wider than the viewport pins to the left edge rather than oscillating between both.\n const minX = viewport.x + padding\n const maxX = viewport.x + viewport.width - floating.width - padding\n const minY = viewport.y + padding\n const maxY = viewport.y + viewport.height - floating.height - padding\n\n if (shift) {\n if (side === 'top' || side === 'bottom') {\n x = maxX < minX ? minX : Math.min(Math.max(x, minX), maxX)\n } else {\n y = maxY < minY ? minY : Math.min(Math.max(y, minY), maxY)\n }\n }\n\n // --- Arrow --------------------------------------------------------------\n // Positioned against the *anchor's* centre, then clamped inside the floating box so it never\n // pokes out of a rounded corner after a shift. This is why `shift` runs first.\n let arrow: { x: number; y: number } | null = null\n if (arrowSize > 0) {\n const half = arrowSize / 2\n // Keep the arrow clear of the corner radius, and clamp to a valid range even when the\n // floating box is narrower than the arrow plus its inset.\n const inset = arrowSize + 4\n if (side === 'top' || side === 'bottom') {\n const centre = anchor.x + anchor.width / 2 - x - half\n const limit = Math.max(inset, floating.width - inset - arrowSize)\n arrow = {\n x: Math.min(Math.max(centre, inset), limit),\n y: side === 'top' ? floating.height : -arrowSize,\n }\n } else {\n const centre = anchor.y + anchor.height / 2 - y - half\n const limit = Math.max(inset, floating.height - inset - arrowSize)\n arrow = {\n x: side === 'left' ? floating.width : -arrowSize,\n y: Math.min(Math.max(centre, inset), limit),\n }\n }\n }\n\n // The anchor having scrolled out of its clipping container is the caller's cue to hide the\n // surface — a tooltip left floating over unrelated content is worse than no tooltip.\n const hidden =\n anchor.y + anchor.height < viewport.y ||\n anchor.y > viewport.y + viewport.height ||\n anchor.x + anchor.width < viewport.x ||\n anchor.x > viewport.x + viewport.width\n\n return {\n // Rounded to whole pixels. Sub-pixel translation makes text render through a different\n // rasterisation path, which reads as a subtle blur on non-retina displays.\n x: Math.round(x),\n y: Math.round(y),\n placement: align === 'center' ? side : (`${side}-${align}` as Placement),\n side,\n align,\n arrow,\n hidden,\n }\n}\n","import { type CSSProperties, type RefObject, useCallback, useEffect, useState } from 'react'\nimport { type PositionOptions, type PositionResult, computePosition } from './position'\n\nexport interface AnchoredPositionOptions extends PositionOptions {\n /** Set the floating element's width to the anchor's — what a combobox listbox wants. */\n matchWidth?: boolean\n /** Recompute while open. Default `true`. */\n enabled?: boolean\n}\n\nexport interface AnchoredPosition {\n style: CSSProperties\n arrowStyle: CSSProperties | undefined\n placement: PositionResult['placement']\n side: PositionResult['side']\n /** Force a recompute — call after content changes size in a way observers can't see. */\n update: () => void\n}\n\nconst HIDDEN: CSSProperties = {\n position: 'fixed',\n top: 0,\n left: 0,\n // Rendered off-screen rather than `display: none` for the first frame, so the element has real\n // dimensions to measure. Measuring a `display: none` element returns a zero rect, which would\n // place the surface at the anchor's corner for one frame — a visible jump on every open.\n transform: 'translate3d(0, -200vh, 0)',\n pointerEvents: 'none',\n}\n\n/**\n * Keep a floating element positioned against an anchor.\n *\n * Recomputes on scroll (capture phase, so nested scroll containers are caught), on viewport\n * resize, and whenever either element changes size. It deliberately does **not** poll on every\n * frame: that costs a forced layout per frame for a value that changes only on discrete events,\n * and it is the reason some popover libraries make scrolling janky.\n */\nexport function useAnchoredPosition(\n anchorRef: RefObject<HTMLElement | null>,\n floatingRef: RefObject<HTMLElement | null>,\n open: boolean,\n options: AnchoredPositionOptions = {},\n): AnchoredPosition {\n const {\n matchWidth = false,\n enabled = true,\n placement = 'bottom',\n offset = 8,\n padding = 8,\n flip = true,\n shift = true,\n arrowSize = 0,\n } = options\n\n const [result, setResult] = useState<PositionResult | null>(null)\n const [anchorWidth, setAnchorWidth] = useState<number | null>(null)\n\n const update = useCallback(() => {\n const anchor = anchorRef.current\n const floating = floatingRef.current\n if (!anchor || !floating) return\n\n const anchorRect = anchor.getBoundingClientRect()\n const floatingRect = floating.getBoundingClientRect()\n\n // jsdom reports every rect as zero. Positioning against a zero-size floating box would place\n // it at the anchor's corner, so bail and leave the off-screen style in place; tests assert on\n // `computePosition` directly, where the geometry is real.\n if (floatingRect.width === 0 && floatingRect.height === 0) return\n\n setAnchorWidth(matchWidth ? anchorRect.width : null)\n setResult(\n computePosition(\n anchorRect,\n floatingRect,\n { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight },\n { placement, offset, padding, flip, shift, arrowSize },\n ),\n )\n }, [anchorRef, floatingRef, matchWidth, placement, offset, padding, flip, shift, arrowSize])\n\n useEffect(() => {\n if (!open || !enabled) {\n setResult(null)\n return\n }\n\n update()\n\n // Capture phase catches scrolling in any ancestor container, not just the document. A popover\n // inside a scrollable panel is the common case and the one that non-capturing listeners miss.\n const onScroll = () => update()\n window.addEventListener('scroll', onScroll, { capture: true, passive: true })\n window.addEventListener('resize', onScroll, { passive: true })\n\n // Content that grows — an async-loaded menu, a combobox filtering down — changes the required\n // placement. `ResizeObserver` catches that without polling.\n let observer: ResizeObserver | undefined\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(() => update())\n if (anchorRef.current) observer.observe(anchorRef.current)\n if (floatingRef.current) observer.observe(floatingRef.current)\n }\n\n return () => {\n window.removeEventListener('scroll', onScroll, { capture: true })\n window.removeEventListener('resize', onScroll)\n observer?.disconnect()\n }\n }, [open, enabled, update, anchorRef, floatingRef])\n\n if (!result) {\n return {\n style: matchWidth && anchorWidth !== null ? { ...HIDDEN, width: anchorWidth } : HIDDEN,\n arrowStyle: undefined,\n placement,\n side: placement.split('-')[0] as PositionResult['side'],\n update,\n }\n }\n\n const style: CSSProperties = {\n position: 'fixed',\n top: 0,\n left: 0,\n // `transform` rather than `top`/`left`: it is composited, so repositioning during scroll does\n // not invalidate layout for the rest of the page.\n transform: `translate3d(${result.x}px, ${result.y}px, 0)`,\n ...(result.hidden ? { visibility: 'hidden' as const, pointerEvents: 'none' as const } : null),\n ...(anchorWidth !== null ? { width: anchorWidth } : null),\n }\n\n return {\n style,\n arrowStyle: result.arrow\n ? { position: 'absolute', left: result.arrow.x, top: result.arrow.y }\n : undefined,\n placement: result.placement,\n side: result.side,\n update,\n }\n}\n"]}
@@ -0,0 +1,181 @@
1
+ 'use strict';
2
+
3
+ var chunkPO5DU3FU_cjs = require('./chunk-PO5DU3FU.cjs');
4
+ var chunkSFU5EPSN_cjs = require('./chunk-SFU5EPSN.cjs');
5
+ var react = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function Sidebar({
9
+ sections,
10
+ activeId,
11
+ onNavigate,
12
+ collapsed,
13
+ defaultCollapsed = false,
14
+ onCollapsedChange,
15
+ header,
16
+ footer,
17
+ collapsible = true,
18
+ label = "Main",
19
+ className
20
+ }) {
21
+ const [isCollapsed, setCollapsed] = chunkPO5DU3FU_cjs.useControllableState({
22
+ value: collapsed,
23
+ defaultValue: defaultCollapsed,
24
+ onChange: onCollapsedChange
25
+ });
26
+ return /* @__PURE__ */ jsxRuntime.jsxs(
27
+ "nav",
28
+ {
29
+ className: chunkSFU5EPSN_cjs.cx("ansh-sidebar", isCollapsed && "ansh-sidebar--collapsed", className),
30
+ "aria-label": label,
31
+ "data-collapsed": isCollapsed || void 0,
32
+ children: [
33
+ header ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ansh-sidebar__header", children: header }) : null,
34
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ansh-sidebar__scroll", children: sections.map((section) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ansh-sidebar__section", children: [
35
+ section.label ? (
36
+ // Hidden visually when collapsed but kept for assistive technology, so the grouping
37
+ // survives the rail layout.
38
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: chunkSFU5EPSN_cjs.cx("ansh-sidebar__heading", isCollapsed && "ansh-visually-hidden"), children: section.label })
39
+ ) : null,
40
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "ansh-sidebar__list", children: section.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
41
+ SidebarItem,
42
+ {
43
+ item,
44
+ activeId,
45
+ collapsed: isCollapsed,
46
+ onNavigate,
47
+ depth: 0
48
+ },
49
+ item.id
50
+ )) })
51
+ ] }, section.id)) }),
52
+ footer ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ansh-sidebar__footer", children: footer }) : null,
53
+ collapsible ? /* @__PURE__ */ jsxRuntime.jsx(
54
+ "button",
55
+ {
56
+ type: "button",
57
+ className: "ansh-sidebar__toggle ansh-focusable",
58
+ "aria-label": isCollapsed ? "Expand sidebar" : "Collapse sidebar",
59
+ "aria-pressed": isCollapsed,
60
+ onClick: () => setCollapsed(!isCollapsed),
61
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 16 16", width: "14", height: "14", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
62
+ "path",
63
+ {
64
+ d: isCollapsed ? "M6 3.5L10.5 8L6 12.5" : "M10 3.5L5.5 8L10 12.5",
65
+ stroke: "currentColor",
66
+ strokeWidth: "1.6",
67
+ fill: "none",
68
+ strokeLinecap: "round",
69
+ strokeLinejoin: "round"
70
+ }
71
+ ) })
72
+ }
73
+ ) : null
74
+ ]
75
+ }
76
+ );
77
+ }
78
+ function SidebarItem({ item, activeId, collapsed, onNavigate, depth }) {
79
+ const hasChildren = Boolean(item.items && item.items.length > 0);
80
+ const containsActive = hasChildren && item.items.some((child) => child.id === activeId);
81
+ const [open, setOpen] = react.useState(containsActive);
82
+ const panelId = react.useId();
83
+ react.useEffect(() => {
84
+ if (containsActive) setOpen(true);
85
+ }, [containsActive]);
86
+ const isActive = item.id === activeId;
87
+ if (hasChildren) {
88
+ return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "ansh-sidebar__item", children: [
89
+ /* @__PURE__ */ jsxRuntime.jsxs(
90
+ "button",
91
+ {
92
+ type: "button",
93
+ className: chunkSFU5EPSN_cjs.cx(
94
+ "ansh-sidebar__link",
95
+ "ansh-sidebar__link--group",
96
+ containsActive && "ansh-sidebar__link--within",
97
+ "ansh-focusable"
98
+ ),
99
+ "aria-expanded": open,
100
+ "aria-controls": panelId,
101
+ disabled: item.disabled,
102
+ onClick: () => setOpen((v) => !v),
103
+ children: [
104
+ item.icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ansh-sidebar__icon", children: item.icon }) : null,
105
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkSFU5EPSN_cjs.cx("ansh-sidebar__label", collapsed && "ansh-visually-hidden"), children: item.label }),
106
+ /* @__PURE__ */ jsxRuntime.jsx(
107
+ "span",
108
+ {
109
+ className: chunkSFU5EPSN_cjs.cx("ansh-sidebar__chevron", open && "ansh-sidebar__chevron--open"),
110
+ "aria-hidden": "true",
111
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 12 12", width: "10", height: "10", children: /* @__PURE__ */ jsxRuntime.jsx(
112
+ "path",
113
+ {
114
+ d: "M3 4.5L6 7.5l3-3",
115
+ stroke: "currentColor",
116
+ strokeWidth: "1.5",
117
+ fill: "none",
118
+ strokeLinecap: "round",
119
+ strokeLinejoin: "round"
120
+ }
121
+ ) })
122
+ }
123
+ )
124
+ ]
125
+ }
126
+ ),
127
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "ansh-sidebar__list ansh-sidebar__list--nested", id: panelId, hidden: !open, children: item.items.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
128
+ SidebarItem,
129
+ {
130
+ item: child,
131
+ activeId,
132
+ collapsed,
133
+ onNavigate,
134
+ depth: depth + 1
135
+ },
136
+ child.id
137
+ )) })
138
+ ] });
139
+ }
140
+ const Component = item.href ? "a" : "button";
141
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { className: "ansh-sidebar__item", children: /* @__PURE__ */ jsxRuntime.jsxs(
142
+ Component,
143
+ {
144
+ ...item.href ? { href: item.href } : { type: "button" },
145
+ className: chunkSFU5EPSN_cjs.cx(
146
+ "ansh-sidebar__link",
147
+ isActive && "ansh-sidebar__link--active",
148
+ "ansh-focusable"
149
+ ),
150
+ "aria-current": isActive ? "page" : void 0,
151
+ "aria-disabled": item.disabled || void 0,
152
+ title: collapsed ? item.label : void 0,
153
+ onClick: (event) => {
154
+ if (item.disabled) {
155
+ event.preventDefault();
156
+ return;
157
+ }
158
+ item.onClick?.();
159
+ onNavigate?.(item);
160
+ },
161
+ children: [
162
+ item.icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ansh-sidebar__icon", children: item.icon }) : null,
163
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkSFU5EPSN_cjs.cx("ansh-sidebar__label", collapsed && "ansh-visually-hidden"), children: item.label }),
164
+ item.badge !== void 0 && !collapsed ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ansh-sidebar__badge", children: item.badge }) : null
165
+ ]
166
+ }
167
+ ) });
168
+ }
169
+ function AppShell({ sidebar, header, children, className }) {
170
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkSFU5EPSN_cjs.cx("ansh-shell", Boolean(sidebar) && "ansh-shell--with-sidebar", className), children: [
171
+ /* @__PURE__ */ jsxRuntime.jsx("a", { href: "#ansh-main", className: "ansh-skip-link", children: "Skip to main content" }),
172
+ header ? /* @__PURE__ */ jsxRuntime.jsx("header", { className: "ansh-shell__header", children: header }) : null,
173
+ sidebar ? /* @__PURE__ */ jsxRuntime.jsx("aside", { className: "ansh-shell__sidebar", children: sidebar }) : null,
174
+ /* @__PURE__ */ jsxRuntime.jsx("main", { className: "ansh-shell__main", id: "ansh-main", tabIndex: -1, children })
175
+ ] });
176
+ }
177
+
178
+ exports.AppShell = AppShell;
179
+ exports.Sidebar = Sidebar;
180
+ //# sourceMappingURL=chunk-ZWAFLHC2.cjs.map
181
+ //# sourceMappingURL=chunk-ZWAFLHC2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/navigation/sidebar.tsx"],"names":["useControllableState","jsxs","cx","jsx","useState","useId","useEffect"],"mappings":"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","file":"chunk-ZWAFLHC2.cjs","sourcesContent":["import { type ReactNode, useEffect, useId, useState } from 'react'\nimport { cx } from '../../primitives/compose'\nimport { useControllableState } from '../../primitives/use-controllable-state'\n\nexport interface NavItem {\n id: string\n label: string\n href?: string\n icon?: ReactNode\n /** Count or status shown on the right. */\n badge?: ReactNode\n disabled?: boolean\n onClick?: () => void\n /** Nested items, rendered in a collapsible group. */\n items?: readonly NavItem[]\n}\n\nexport interface NavSection {\n id: string\n /** Heading above the group. Omit for an unlabelled block. */\n label?: string\n items: readonly NavItem[]\n}\n\nexport interface SidebarProps {\n sections: readonly NavSection[]\n /** Id of the active item. */\n activeId?: string\n onNavigate?: (item: NavItem) => void\n /** Collapse to an icon rail. */\n collapsed?: boolean\n defaultCollapsed?: boolean\n onCollapsedChange?: (collapsed: boolean) => void\n /** Content above the nav — a logo, a workspace switcher. */\n header?: ReactNode\n /** Content pinned to the bottom — the user menu, usually. */\n footer?: ReactNode\n /** Show the collapse toggle. Default `true`. */\n collapsible?: boolean\n label?: string\n className?: string\n}\n\n/**\n * The application sidebar.\n *\n * A `<nav>` containing lists of links — the structure a screen reader user navigates by landmark,\n * and the reason this isn't a stack of divs. Nested groups are `<button aria-expanded>` controlling\n * a `<ul>`, so their state is announced.\n *\n * Collapsing to an icon rail keeps the labels in the DOM (visually hidden), rather than removing\n * them. Removing them would leave a rail of unlabelled icons for anyone using assistive technology,\n * which is exactly the population for whom the space saving is irrelevant.\n */\nexport function Sidebar({\n sections,\n activeId,\n onNavigate,\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n header,\n footer,\n collapsible = true,\n label = 'Main',\n className,\n}: SidebarProps) {\n const [isCollapsed, setCollapsed] = useControllableState<boolean>({\n value: collapsed,\n defaultValue: defaultCollapsed,\n onChange: onCollapsedChange,\n })\n\n return (\n <nav\n className={cx('ansh-sidebar', isCollapsed && 'ansh-sidebar--collapsed', className)}\n aria-label={label}\n data-collapsed={isCollapsed || undefined}\n >\n {header ? <div className=\"ansh-sidebar__header\">{header}</div> : null}\n\n <div className=\"ansh-sidebar__scroll\">\n {sections.map((section) => (\n <div className=\"ansh-sidebar__section\" key={section.id}>\n {section.label ? (\n // Hidden visually when collapsed but kept for assistive technology, so the grouping\n // survives the rail layout.\n <h2 className={cx('ansh-sidebar__heading', isCollapsed && 'ansh-visually-hidden')}>\n {section.label}\n </h2>\n ) : null}\n\n <ul className=\"ansh-sidebar__list\">\n {section.items.map((item) => (\n <SidebarItem\n key={item.id}\n item={item}\n activeId={activeId}\n collapsed={isCollapsed}\n onNavigate={onNavigate}\n depth={0}\n />\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n {footer ? <div className=\"ansh-sidebar__footer\">{footer}</div> : null}\n\n {collapsible ? (\n <button\n type=\"button\"\n className=\"ansh-sidebar__toggle ansh-focusable\"\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n aria-pressed={isCollapsed}\n onClick={() => setCollapsed(!isCollapsed)}\n >\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\">\n <path\n d={isCollapsed ? 'M6 3.5L10.5 8L6 12.5' : 'M10 3.5L5.5 8L10 12.5'}\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n ) : null}\n </nav>\n )\n}\n\ninterface SidebarItemProps {\n item: NavItem\n activeId: string | undefined\n collapsed: boolean\n onNavigate: ((item: NavItem) => void) | undefined\n depth: number\n}\n\nfunction SidebarItem({ item, activeId, collapsed, onNavigate, depth }: SidebarItemProps) {\n const hasChildren = Boolean(item.items && item.items.length > 0)\n const containsActive = hasChildren && item.items!.some((child) => child.id === activeId)\n\n // Groups start open when they contain the active page — landing on a nested route with the group\n // collapsed leaves the user with no visible indication of where they are.\n const [open, setOpen] = useState(containsActive)\n const panelId = useId()\n\n useEffect(() => {\n if (containsActive) setOpen(true)\n }, [containsActive])\n\n const isActive = item.id === activeId\n\n if (hasChildren) {\n return (\n <li className=\"ansh-sidebar__item\">\n <button\n type=\"button\"\n className={cx(\n 'ansh-sidebar__link',\n 'ansh-sidebar__link--group',\n containsActive && 'ansh-sidebar__link--within',\n 'ansh-focusable',\n )}\n aria-expanded={open}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => setOpen((v) => !v)}\n >\n {item.icon ? <span className=\"ansh-sidebar__icon\">{item.icon}</span> : null}\n <span className={cx('ansh-sidebar__label', collapsed && 'ansh-visually-hidden')}>\n {item.label}\n </span>\n <span\n className={cx('ansh-sidebar__chevron', open && 'ansh-sidebar__chevron--open')}\n aria-hidden=\"true\"\n >\n <svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\">\n <path\n d=\"M3 4.5L6 7.5l3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </button>\n\n {/* `hidden` rather than unmounting: the group's open state is cheap to keep, and\n unmounting would lose scroll position within a long nested list. */}\n <ul className=\"ansh-sidebar__list ansh-sidebar__list--nested\" id={panelId} hidden={!open}>\n {item.items!.map((child) => (\n <SidebarItem\n key={child.id}\n item={child}\n activeId={activeId}\n collapsed={collapsed}\n onNavigate={onNavigate}\n depth={depth + 1}\n />\n ))}\n </ul>\n </li>\n )\n }\n\n const Component = item.href ? 'a' : 'button'\n\n return (\n <li className=\"ansh-sidebar__item\">\n <Component\n {...(item.href ? { href: item.href } : { type: 'button' as const })}\n className={cx(\n 'ansh-sidebar__link',\n isActive && 'ansh-sidebar__link--active',\n 'ansh-focusable',\n )}\n // The current page, announced. A colour change alone conveys nothing.\n aria-current={isActive ? 'page' : undefined}\n aria-disabled={item.disabled || undefined}\n // A collapsed rail shows only icons, so the label becomes the accessible name via `title`\n // for pointer users and stays in the DOM for everyone else.\n title={collapsed ? item.label : undefined}\n onClick={(event: React.MouseEvent) => {\n if (item.disabled) {\n event.preventDefault()\n return\n }\n item.onClick?.()\n onNavigate?.(item)\n }}\n >\n {item.icon ? <span className=\"ansh-sidebar__icon\">{item.icon}</span> : null}\n <span className={cx('ansh-sidebar__label', collapsed && 'ansh-visually-hidden')}>\n {item.label}\n </span>\n {item.badge !== undefined && !collapsed ? (\n <span className=\"ansh-sidebar__badge\">{item.badge}</span>\n ) : null}\n </Component>\n </li>\n )\n}\n\nexport interface AppShellProps {\n sidebar?: ReactNode\n header?: ReactNode\n children: ReactNode\n className?: string\n}\n\n/**\n * The header + sidebar + content frame.\n *\n * A grid rather than nested flex containers, so the sidebar and header can be `position: sticky`\n * without the content needing compensating margins — the arrangement that breaks the moment the\n * header's height changes.\n *\n * The skip link is the first focusable element on the page. It is the cheapest accessibility win\n * available and it is missing from almost every application shell: without it, a keyboard user\n * traverses the entire navigation on every single page load.\n */\nexport function AppShell({ sidebar, header, children, className }: AppShellProps) {\n return (\n <div className={cx('ansh-shell', Boolean(sidebar) && 'ansh-shell--with-sidebar', className)}>\n <a href=\"#ansh-main\" className=\"ansh-skip-link\">\n Skip to main content\n </a>\n {header ? <header className=\"ansh-shell__header\">{header}</header> : null}\n {sidebar ? <aside className=\"ansh-shell__sidebar\">{sidebar}</aside> : null}\n <main className=\"ansh-shell__main\" id=\"ansh-main\" tabIndex={-1}>\n {children}\n </main>\n </div>\n )\n}\n"]}
package/dist/data.cjs ADDED
@@ -0,0 +1,71 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var chunkOJN5JBNP_cjs = require('./chunk-OJN5JBNP.cjs');
5
+ require('./chunk-PO5DU3FU.cjs');
6
+ require('./chunk-SFU5EPSN.cjs');
7
+
8
+
9
+
10
+ Object.defineProperty(exports, "Avatar", {
11
+ enumerable: true,
12
+ get: function () { return chunkOJN5JBNP_cjs.Avatar; }
13
+ });
14
+ Object.defineProperty(exports, "AvatarGroup", {
15
+ enumerable: true,
16
+ get: function () { return chunkOJN5JBNP_cjs.AvatarGroup; }
17
+ });
18
+ Object.defineProperty(exports, "Badge", {
19
+ enumerable: true,
20
+ get: function () { return chunkOJN5JBNP_cjs.Badge; }
21
+ });
22
+ Object.defineProperty(exports, "CircularProgress", {
23
+ enumerable: true,
24
+ get: function () { return chunkOJN5JBNP_cjs.CircularProgress; }
25
+ });
26
+ Object.defineProperty(exports, "CodeBlock", {
27
+ enumerable: true,
28
+ get: function () { return chunkOJN5JBNP_cjs.CodeBlock; }
29
+ });
30
+ Object.defineProperty(exports, "DataTable", {
31
+ enumerable: true,
32
+ get: function () { return chunkOJN5JBNP_cjs.DataTable; }
33
+ });
34
+ Object.defineProperty(exports, "DescriptionList", {
35
+ enumerable: true,
36
+ get: function () { return chunkOJN5JBNP_cjs.DescriptionList; }
37
+ });
38
+ Object.defineProperty(exports, "EmptyState", {
39
+ enumerable: true,
40
+ get: function () { return chunkOJN5JBNP_cjs.EmptyState; }
41
+ });
42
+ Object.defineProperty(exports, "Kbd", {
43
+ enumerable: true,
44
+ get: function () { return chunkOJN5JBNP_cjs.Kbd; }
45
+ });
46
+ Object.defineProperty(exports, "Meter", {
47
+ enumerable: true,
48
+ get: function () { return chunkOJN5JBNP_cjs.Meter; }
49
+ });
50
+ Object.defineProperty(exports, "Pagination", {
51
+ enumerable: true,
52
+ get: function () { return chunkOJN5JBNP_cjs.Pagination; }
53
+ });
54
+ Object.defineProperty(exports, "Progress", {
55
+ enumerable: true,
56
+ get: function () { return chunkOJN5JBNP_cjs.Progress; }
57
+ });
58
+ Object.defineProperty(exports, "Stat", {
59
+ enumerable: true,
60
+ get: function () { return chunkOJN5JBNP_cjs.Stat; }
61
+ });
62
+ Object.defineProperty(exports, "Table", {
63
+ enumerable: true,
64
+ get: function () { return chunkOJN5JBNP_cjs.Table; }
65
+ });
66
+ Object.defineProperty(exports, "Timeline", {
67
+ enumerable: true,
68
+ get: function () { return chunkOJN5JBNP_cjs.Timeline; }
69
+ });
70
+ //# sourceMappingURL=data.cjs.map
71
+ //# sourceMappingURL=data.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"data.cjs"}