premium-ds 0.1.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.
- package/LICENSE +21 -0
- package/README.md +113 -0
- package/dist/alert.d.ts +31 -0
- package/dist/alert.js +6 -0
- package/dist/alert.js.map +1 -0
- package/dist/avatar-group.d.ts +13 -0
- package/dist/avatar-group.js +3 -0
- package/dist/avatar-group.js.map +1 -0
- package/dist/avatar.d.ts +25 -0
- package/dist/avatar.js +3 -0
- package/dist/avatar.js.map +1 -0
- package/dist/badge.d.ts +23 -0
- package/dist/badge.js +3 -0
- package/dist/badge.js.map +1 -0
- package/dist/button.d.ts +20 -0
- package/dist/button.js +3 -0
- package/dist/button.js.map +1 -0
- package/dist/checkbox.d.ts +25 -0
- package/dist/checkbox.js +3 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chunk-2OWHZ4JT.js +36 -0
- package/dist/chunk-2OWHZ4JT.js.map +1 -0
- package/dist/chunk-34SIXSYL.js +64 -0
- package/dist/chunk-34SIXSYL.js.map +1 -0
- package/dist/chunk-37O2ZXD6.js +55 -0
- package/dist/chunk-37O2ZXD6.js.map +1 -0
- package/dist/chunk-4AZL76UJ.js +89 -0
- package/dist/chunk-4AZL76UJ.js.map +1 -0
- package/dist/chunk-4HSCN5TZ.js +86 -0
- package/dist/chunk-4HSCN5TZ.js.map +1 -0
- package/dist/chunk-5DDOOT33.js +258 -0
- package/dist/chunk-5DDOOT33.js.map +1 -0
- package/dist/chunk-5FVHWIMY.js +117 -0
- package/dist/chunk-5FVHWIMY.js.map +1 -0
- package/dist/chunk-5K6KRJGX.js +147 -0
- package/dist/chunk-5K6KRJGX.js.map +1 -0
- package/dist/chunk-5PQMQBQC.js +74 -0
- package/dist/chunk-5PQMQBQC.js.map +1 -0
- package/dist/chunk-7OCTVQ7C.js +95 -0
- package/dist/chunk-7OCTVQ7C.js.map +1 -0
- package/dist/chunk-7OPMOET7.js +39 -0
- package/dist/chunk-7OPMOET7.js.map +1 -0
- package/dist/chunk-BXXS7YRC.js +270 -0
- package/dist/chunk-BXXS7YRC.js.map +1 -0
- package/dist/chunk-CV2Q4YXX.js +272 -0
- package/dist/chunk-CV2Q4YXX.js.map +1 -0
- package/dist/chunk-EIMMDWIW.js +282 -0
- package/dist/chunk-EIMMDWIW.js.map +1 -0
- package/dist/chunk-EZ2CWTBE.js +230 -0
- package/dist/chunk-EZ2CWTBE.js.map +1 -0
- package/dist/chunk-FGHDG3Y4.js +89 -0
- package/dist/chunk-FGHDG3Y4.js.map +1 -0
- package/dist/chunk-FPP2XLKX.js +127 -0
- package/dist/chunk-FPP2XLKX.js.map +1 -0
- package/dist/chunk-G6OY35DI.js +295 -0
- package/dist/chunk-G6OY35DI.js.map +1 -0
- package/dist/chunk-H6KWJNOE.js +65 -0
- package/dist/chunk-H6KWJNOE.js.map +1 -0
- package/dist/chunk-HGILYGY3.js +45 -0
- package/dist/chunk-HGILYGY3.js.map +1 -0
- package/dist/chunk-I3BCB4Z5.js +88 -0
- package/dist/chunk-I3BCB4Z5.js.map +1 -0
- package/dist/chunk-KBWNUUWM.js +582 -0
- package/dist/chunk-KBWNUUWM.js.map +1 -0
- package/dist/chunk-KN7JFAZ6.js +113 -0
- package/dist/chunk-KN7JFAZ6.js.map +1 -0
- package/dist/chunk-MEF7PI6U.js +16 -0
- package/dist/chunk-MEF7PI6U.js.map +1 -0
- package/dist/chunk-NKGMQL6I.js +310 -0
- package/dist/chunk-NKGMQL6I.js.map +1 -0
- package/dist/chunk-NMFQRGLL.js +127 -0
- package/dist/chunk-NMFQRGLL.js.map +1 -0
- package/dist/chunk-OUBWD6CX.js +433 -0
- package/dist/chunk-OUBWD6CX.js.map +1 -0
- package/dist/chunk-PFNXVBLU.js +96 -0
- package/dist/chunk-PFNXVBLU.js.map +1 -0
- package/dist/chunk-PUPZ4HME.js +165 -0
- package/dist/chunk-PUPZ4HME.js.map +1 -0
- package/dist/chunk-QFS52OK5.js +690 -0
- package/dist/chunk-QFS52OK5.js.map +1 -0
- package/dist/chunk-QNC6O3PG.js +45 -0
- package/dist/chunk-QNC6O3PG.js.map +1 -0
- package/dist/chunk-QUHOXWBK.js +82 -0
- package/dist/chunk-QUHOXWBK.js.map +1 -0
- package/dist/chunk-UIQGSTBJ.js +106 -0
- package/dist/chunk-UIQGSTBJ.js.map +1 -0
- package/dist/chunk-UJQKVP6V.js +193 -0
- package/dist/chunk-UJQKVP6V.js.map +1 -0
- package/dist/chunk-VVPGEAC6.js +11 -0
- package/dist/chunk-VVPGEAC6.js.map +1 -0
- package/dist/chunk-XA3T5KWA.js +58 -0
- package/dist/chunk-XA3T5KWA.js.map +1 -0
- package/dist/chunk-YSHJHSJM.js +19 -0
- package/dist/chunk-YSHJHSJM.js.map +1 -0
- package/dist/chunk-YVHOAVSM.js +182 -0
- package/dist/chunk-YVHOAVSM.js.map +1 -0
- package/dist/collapse.d.ts +16 -0
- package/dist/collapse.js +3 -0
- package/dist/collapse.js.map +1 -0
- package/dist/count-badge.d.ts +11 -0
- package/dist/count-badge.js +4 -0
- package/dist/count-badge.js.map +1 -0
- package/dist/date-field.d.ts +39 -0
- package/dist/date-field.js +8 -0
- package/dist/date-field.js.map +1 -0
- package/dist/date-range-field.d.ts +30 -0
- package/dist/date-range-field.js +8 -0
- package/dist/date-range-field.js.map +1 -0
- package/dist/datetime-field.d.ts +28 -0
- package/dist/datetime-field.js +10 -0
- package/dist/datetime-field.js.map +1 -0
- package/dist/dialog.d.ts +26 -0
- package/dist/dialog.js +7 -0
- package/dist/dialog.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/motion-tokens.d.ts +29 -0
- package/dist/motion-tokens.js +3 -0
- package/dist/motion-tokens.js.map +1 -0
- package/dist/multi-select.d.ts +25 -0
- package/dist/multi-select.js +7 -0
- package/dist/multi-select.js.map +1 -0
- package/dist/number-field.d.ts +24 -0
- package/dist/number-field.js +4 -0
- package/dist/number-field.js.map +1 -0
- package/dist/otp-field.d.ts +20 -0
- package/dist/otp-field.js +3 -0
- package/dist/otp-field.js.map +1 -0
- package/dist/overlay.d.ts +31 -0
- package/dist/overlay.js +4 -0
- package/dist/overlay.js.map +1 -0
- package/dist/pagination.d.ts +24 -0
- package/dist/pagination.js +5 -0
- package/dist/pagination.js.map +1 -0
- package/dist/radio-group.d.ts +46 -0
- package/dist/radio-group.js +6 -0
- package/dist/radio-group.js.map +1 -0
- package/dist/select-core-SAyS-8w0.d.ts +16 -0
- package/dist/select.d.ts +27 -0
- package/dist/select.js +7 -0
- package/dist/select.js.map +1 -0
- package/dist/status-badge.d.ts +17 -0
- package/dist/status-badge.js +5 -0
- package/dist/status-badge.js.map +1 -0
- package/dist/table.d.ts +65 -0
- package/dist/table.js +5 -0
- package/dist/table.js.map +1 -0
- package/dist/tabs.d.ts +44 -0
- package/dist/tabs.js +5 -0
- package/dist/tabs.js.map +1 -0
- package/dist/tag.d.ts +28 -0
- package/dist/tag.js +5 -0
- package/dist/tag.js.map +1 -0
- package/dist/text-field.d.ts +30 -0
- package/dist/text-field.js +6 -0
- package/dist/text-field.js.map +1 -0
- package/dist/textarea.d.ts +33 -0
- package/dist/textarea.js +5 -0
- package/dist/textarea.js.map +1 -0
- package/dist/time-field.d.ts +27 -0
- package/dist/time-field.js +6 -0
- package/dist/time-field.js.map +1 -0
- package/dist/toast-store.d.ts +75 -0
- package/dist/toast-store.js +3 -0
- package/dist/toast-store.js.map +1 -0
- package/dist/toast.d.ts +3 -0
- package/dist/toast.js +6 -0
- package/dist/toast.js.map +1 -0
- package/dist/toggle-tag.d.ts +24 -0
- package/dist/toggle-tag.js +4 -0
- package/dist/toggle-tag.js.map +1 -0
- package/dist/toggle.d.ts +21 -0
- package/dist/toggle.js +3 -0
- package/dist/toggle.js.map +1 -0
- package/dist/tooltip.d.ts +27 -0
- package/dist/tooltip.js +4 -0
- package/dist/tooltip.js.map +1 -0
- package/llms.txt +165 -0
- package/package.json +205 -0
- package/src/components/alert/Alert.tsx +118 -0
- package/src/components/alert/alert.css +136 -0
- package/src/components/avatar/Avatar.tsx +128 -0
- package/src/components/avatar/AvatarGroup.tsx +50 -0
- package/src/components/avatar/avatar.css +200 -0
- package/src/components/badge/Badge.tsx +66 -0
- package/src/components/badge/CountBadge.tsx +46 -0
- package/src/components/badge/StatusBadge.tsx +132 -0
- package/src/components/badge/badge.css +243 -0
- package/src/components/button/Button.tsx +68 -0
- package/src/components/button/button.css +222 -0
- package/src/components/checkbox/Checkbox.tsx +90 -0
- package/src/components/checkbox/checkbox.css +179 -0
- package/src/components/date-picker/DateField.tsx +362 -0
- package/src/components/date-picker/DateRangeField.tsx +533 -0
- package/src/components/date-picker/DateTimeField.tsx +177 -0
- package/src/components/date-picker/TimeField.tsx +100 -0
- package/src/components/date-picker/date-picker.css +591 -0
- package/src/components/date-picker/date-utils.ts +55 -0
- package/src/components/date-picker/field-shell.tsx +78 -0
- package/src/components/date-picker/glide-pill.tsx +81 -0
- package/src/components/date-picker/time-core.tsx +305 -0
- package/src/components/dialog/Dialog.tsx +181 -0
- package/src/components/dialog/dialog.css +170 -0
- package/src/components/glass/glass.css +100 -0
- package/src/components/icon/Icon.tsx +76 -0
- package/src/components/icon/IconSlot.tsx +11 -0
- package/src/components/icon/icon.css +33 -0
- package/src/components/input/NumberField.tsx +117 -0
- package/src/components/input/OtpField.tsx +118 -0
- package/src/components/input/TextField.tsx +123 -0
- package/src/components/input/input.css +335 -0
- package/src/components/motion/Collapse.tsx +33 -0
- package/src/components/motion/collapse.css +41 -0
- package/src/components/overlay/Overlay.tsx +239 -0
- package/src/components/overlay/overlay-core.tsx +565 -0
- package/src/components/overlay/overlay.css +119 -0
- package/src/components/overlay/sheet-drag.tsx +146 -0
- package/src/components/pagination/Pagination.tsx +140 -0
- package/src/components/pagination/pagination.css +48 -0
- package/src/components/radio-group/RadioGroup.tsx +182 -0
- package/src/components/radio-group/radio-group.css +277 -0
- package/src/components/select/MultiSelect.tsx +251 -0
- package/src/components/select/Select.tsx +235 -0
- package/src/components/select/select-core.tsx +417 -0
- package/src/components/select/select.css +386 -0
- package/src/components/table/Table.tsx +433 -0
- package/src/components/table/table.css +348 -0
- package/src/components/tabs/Tabs.tsx +371 -0
- package/src/components/tabs/tabs.css +228 -0
- package/src/components/tag/Tag.tsx +145 -0
- package/src/components/tag/ToggleTag.tsx +125 -0
- package/src/components/tag/tag.css +248 -0
- package/src/components/textarea/Textarea.tsx +197 -0
- package/src/components/textarea/textarea.css +219 -0
- package/src/components/toast/Toast.tsx +349 -0
- package/src/components/toast/toast-store.ts +266 -0
- package/src/components/toast/toast.css +233 -0
- package/src/components/toggle/Toggle.tsx +94 -0
- package/src/components/toggle/toggle.css +152 -0
- package/src/components/tooltip/Tooltip.tsx +365 -0
- package/src/components/tooltip/tooltip.css +86 -0
- package/src/index.ts +42 -0
- package/src/styles.css +39 -0
- package/src/tokens/avatar.css +20 -0
- package/src/tokens/color.css +56 -0
- package/src/tokens/elevation.css +20 -0
- package/src/tokens/fonts.css +3 -0
- package/src/tokens/glass.css +21 -0
- package/src/tokens/icons.css +7 -0
- package/src/tokens/layers.css +6 -0
- package/src/tokens/motion-tokens.ts +72 -0
- package/src/tokens/motion.css +49 -0
- package/src/tokens/radius.css +11 -0
- package/src/tokens/semantic.css +75 -0
- package/src/tokens/spacing.css +26 -0
- package/src/tokens/typography.css +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/overlay/overlay-core.tsx","../src/components/overlay/sheet-drag.tsx","../src/components/overlay/Overlay.tsx"],"names":["ovMotion","React","jsx","jsxs","React3","OvAnimatePresence"],"mappings":"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","file":"chunk-QFS52OK5.js","sourcesContent":["'use client';\n\n/* overlay-core - the headless mechanics under popover, dialog and sheet. */\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion as ovMotion, AnimatePresence as OvAnimatePresence } from 'motion/react';\nimport { UIMotion } from '../../tokens/motion-tokens';\n\nconst ovSM = UIMotion;\nconst {\n useState: ovUseState,\n useEffect: ovUseEffect,\n useLayoutEffect: ovUseLayoutEffect,\n useRef: ovUseRef,\n} = React;\n\nfunction useControllable<T>(\n controlled: T | undefined,\n initial: T,\n onChange?: (next: T) => void,\n): [T, (next: T) => void] {\n const [internal, setInternal] = ovUseState(initial);\n const isControlled = controlled !== undefined;\n const value = isControlled ? controlled : internal;\n const setValue = (next: T) => {\n if (!isControlled) setInternal(next);\n if (onChange) onChange(next);\n };\n return [value, setValue];\n}\n\n/* Token length - px; parseFloat alone reads \"0.5rem\" as 0.5px, so convert rem. */\nfunction ovReadPx(token: string): number {\n const root = document.documentElement;\n const v = getComputedStyle(root).getPropertyValue(token).trim();\n const n = parseFloat(v);\n if (Number.isNaN(n)) return 0;\n return v.endsWith('rem') ? n * parseFloat(getComputedStyle(root).fontSize) : n;\n}\n\nfunction ovResolveChildren(\n children: React.ReactNode | ((api: { close: () => void }) => React.ReactNode),\n close: () => void,\n): React.ReactNode {\n return typeof children === 'function' ? children({ close }) : children;\n}\n\nfunction ovCloneTrigger(\n trigger: React.ReactElement | null,\n {\n open,\n onPress,\n panelId,\n haspopup,\n triggerRef,\n }: {\n open: boolean;\n onPress: () => void;\n panelId: string;\n haspopup: string;\n triggerRef: React.RefObject<HTMLElement>;\n },\n): React.ReactElement | null {\n if (!trigger) return null;\n const setRef = (node: HTMLElement | null) => {\n if (triggerRef) triggerRef.current = node;\n const r = (trigger as any).ref;\n if (typeof r === 'function') r(node);\n else if (r) r.current = node;\n };\n return React.cloneElement(trigger as React.ReactElement<any>, {\n ref: setRef,\n onClick: (e: React.MouseEvent) => {\n const oc = (trigger.props as { onClick?: (e: React.MouseEvent) => void }).onClick;\n if (oc) oc(e);\n onPress();\n },\n 'aria-haspopup': haspopup,\n 'aria-expanded': open,\n 'aria-controls': open ? panelId : undefined,\n });\n}\n\n/* The overlay stack: one Esc listener closes only the topmost dismissible, and defers to inner handlers that already consumed the key (defaultPrevented). */\ninterface OverlayEntry {\n contains: (t: EventTarget | null) => boolean;\n isDismissible: () => boolean;\n requestClose: () => void;\n _dismissible?: boolean;\n _close?: () => void;\n}\n\nconst ovStack: OverlayEntry[] = [];\n\nfunction ovOnDocKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Escape' || e.defaultPrevented || ovStack.length === 0) return;\n const top = ovStack[ovStack.length - 1];\n if (!top.isDismissible()) return;\n e.preventDefault();\n top.requestClose();\n}\n\nfunction ovIsTop(entry: OverlayEntry) {\n return ovStack[ovStack.length - 1] === entry;\n}\n\n/* true if `target` sits in an overlay opened after `entry` (a nested child owns it). */\nfunction ovInOverlayAbove(entry: OverlayEntry, target: EventTarget | null) {\n const i = ovStack.indexOf(entry);\n return i >= 0 && ovStack.slice(i + 1).some((e) => e.contains(target));\n}\n\n/* Join the stack for the panel's lifetime; set z = --layer-overlay + depth. */\nfunction useOverlayEntry({\n nodeRef,\n dismissible,\n requestClose,\n}: {\n nodeRef: React.RefObject<HTMLElement>;\n dismissible: boolean;\n requestClose: () => void;\n}): OverlayEntry {\n const ref = ovUseRef<OverlayEntry>(null);\n if (!ref.current) {\n ref.current = {\n contains: (t) => Boolean(nodeRef.current && nodeRef.current.contains(t as Node)),\n isDismissible: () => ref.current._dismissible,\n requestClose: () => ref.current._close(),\n };\n }\n ref.current._dismissible = dismissible;\n ref.current._close = requestClose;\n\n ovUseLayoutEffect(() => {\n const entry = ref.current;\n if (ovStack.length === 0) document.addEventListener('keydown', ovOnDocKeyDown);\n ovStack.push(entry);\n if (nodeRef.current)\n nodeRef.current.style.zIndex = 'calc(var(--layer-overlay) + ' + (ovStack.length - 1) + ')';\n return () => {\n const i = ovStack.indexOf(entry);\n if (i >= 0) ovStack.splice(i, 1);\n if (ovStack.length === 0) document.removeEventListener('keydown', ovOnDocKeyDown);\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return ref.current;\n}\n\n/* Light dismiss - close on a press outside the panel, trigger, and any overlay above. */\nfunction useOutsidePress({\n entry,\n refs,\n enabled,\n onPress,\n}: {\n entry: OverlayEntry;\n refs: React.RefObject<HTMLElement>[];\n enabled: boolean;\n onPress: () => void;\n}) {\n const latest = ovUseRef<{ enabled: boolean; onPress: () => void }>(null);\n latest.current = { enabled, onPress };\n ovUseEffect(() => {\n const onDown = (e: PointerEvent) => {\n if (!latest.current.enabled) return;\n const t = e.target;\n if (refs.some((r) => r.current && r.current.contains(t as Node))) return;\n if (ovInOverlayAbove(entry, t)) return;\n latest.current.onPress();\n };\n document.addEventListener('pointerdown', onDown, true);\n return () => document.removeEventListener('pointerdown', onDown, true);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\n/* Restore focus to the opener on unmount, but only if it would otherwise be lost; a microtask dodges the inert-release ordering race. */\nfunction useReturnFocus(nodeRef: React.RefObject<HTMLElement>) {\n ovUseEffect(() => {\n const prev = document.activeElement as HTMLElement | null;\n return () => {\n const a = document.activeElement;\n const orphaned =\n !a || a === document.body || (nodeRef.current && nodeRef.current.contains(a));\n if (orphaned && prev && prev.isConnected && typeof prev.focus === 'function') {\n queueMicrotask(() => {\n if (prev.isConnected) prev.focus({ preventScroll: true });\n });\n }\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nconst OV_FOCUSABLE =\n 'a[href], button:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), ' +\n 'select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/* Hard focus trap: seed in, cycle Tab inside, recapture stray focus unless not topmost or it's in an overlay above. */\nfunction useFocusTrap({\n panelRef,\n entry,\n}: {\n panelRef: React.RefObject<HTMLElement>;\n entry: OverlayEntry;\n}) {\n ovUseEffect(() => {\n const panel = panelRef.current;\n if (!panel) return undefined;\n const focusables = () =>\n Array.from(panel.querySelectorAll<HTMLElement>(OV_FOCUSABLE)).filter(\n (el) => el.offsetParent !== null || el === document.activeElement,\n );\n\n const seed =\n panel.querySelector<HTMLElement>('[autofocus], [data-autofocus]') || focusables()[0] || panel;\n seed.focus({ preventScroll: true });\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const f = focusables();\n if (f.length === 0) {\n e.preventDefault();\n return;\n }\n const cur = document.activeElement;\n if (e.shiftKey) {\n if (cur === f[0] || cur === panel) {\n e.preventDefault();\n f[f.length - 1].focus();\n }\n } else if (cur === f[f.length - 1]) {\n e.preventDefault();\n f[0].focus();\n }\n };\n const onFocusIn = (e: FocusEvent) => {\n if (panel.contains(e.target as Node)) return;\n if (!ovIsTop(entry) || ovInOverlayAbove(entry, e.target)) return;\n (focusables()[0] || panel).focus({ preventScroll: true });\n };\n\n panel.addEventListener('keydown', onKeyDown);\n document.addEventListener('focusin', onFocusIn);\n return () => {\n panel.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('focusin', onFocusIn);\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nlet ovLocks = 0;\nlet ovSavedOverflow = '';\nlet ovSavedPad = '';\nfunction useScrollLock() {\n ovUseEffect(() => {\n if (++ovLocks === 1) {\n const body = document.body;\n const gutter = window.innerWidth - document.documentElement.clientWidth;\n ovSavedOverflow = body.style.overflow;\n ovSavedPad = body.style.paddingRight;\n body.style.overflow = 'hidden';\n if (gutter > 0)\n body.style.paddingRight =\n (parseFloat(getComputedStyle(body).paddingRight) || 0) + gutter + 'px';\n }\n return () => {\n if (--ovLocks === 0) {\n document.body.style.overflow = ovSavedOverflow;\n document.body.style.paddingRight = ovSavedPad;\n }\n };\n }, []);\n}\n\n/* `inert` on every non-overlay <body> child (refcounted); content mounted while a modal is already up is not swept. */\nlet ovInertCount = 0;\nconst ovInerted = new Set<HTMLElement>();\nfunction useInertOutside() {\n ovUseEffect(() => {\n if (++ovInertCount === 1) {\n for (const el of Array.from(document.body.children) as HTMLElement[]) {\n if (\n el.hasAttribute('data-overlay-root') ||\n el.tagName === 'SCRIPT' ||\n el.tagName === 'STYLE' ||\n el.inert\n )\n continue;\n el.inert = true;\n ovInerted.add(el);\n }\n }\n return () => {\n if (--ovInertCount === 0) {\n ovInerted.forEach((el) => {\n el.inert = false;\n });\n ovInerted.clear();\n }\n };\n }, []);\n}\n\n/* Anchored placement: measure, place on the side, flip when cramped, clamp the cross axis; writes data-side/-align + arrow vars in a layout effect. */\nfunction useAnchorPosition({\n side,\n align,\n arrow,\n triggerRef,\n panelRef,\n}: {\n side: 'top' | 'bottom' | 'left' | 'right';\n align: 'start' | 'center' | 'end';\n arrow: boolean;\n triggerRef: React.RefObject<HTMLElement>;\n panelRef: React.RefObject<HTMLElement>;\n}) {\n ovUseLayoutEffect(() => {\n const place = () => {\n const t = triggerRef.current;\n const p = panelRef.current;\n if (!t || !p) return;\n const r = t.getBoundingClientRect();\n const pw = p.offsetWidth,\n ph = p.offsetHeight;\n const edge = ovReadPx('--space-2');\n const gap = edge + (arrow ? 3 : 0);\n const vw = window.innerWidth,\n vh = window.innerHeight;\n\n const room: Record<string, number> = {\n top: r.top,\n bottom: vh - r.bottom,\n left: r.left,\n right: vw - r.right,\n };\n const opposite: Record<string, 'top' | 'bottom' | 'left' | 'right'> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n };\n const vertical = side === 'top' || side === 'bottom';\n let s = side;\n if (room[s] < (vertical ? ph : pw) + gap && room[opposite[s]] > room[s]) s = opposite[s];\n\n let x, y;\n if (vertical) {\n y = s === 'top' ? r.top - ph - gap : r.bottom + gap;\n x =\n align === 'start' ? r.left : align === 'end' ? r.right - pw : r.left + (r.width - pw) / 2;\n x = Math.min(Math.max(x, edge), vw - pw - edge);\n y = Math.max(\n Math.min(y, vh - ph - edge),\n edge,\n ); /* main-axis clamp: keep the leading edge on-screen (max last - may cover the trigger) */\n } else {\n x = s === 'left' ? r.left - pw - gap : r.right + gap;\n y =\n align === 'start' ? r.top : align === 'end' ? r.bottom - ph : r.top + (r.height - ph) / 2;\n y = Math.min(Math.max(y, edge), vh - ph - edge);\n x = Math.max(Math.min(x, vw - pw - edge), edge);\n }\n p.style.left = Math.round(x) + 'px';\n p.style.top = Math.round(y) + 'px';\n p.setAttribute('data-side', s);\n p.setAttribute('data-align', align);\n if (arrow) {\n if (vertical)\n p.style.setProperty(\n '--overlay-arrow-x',\n Math.round(Math.min(Math.max(r.left + r.width / 2 - x, 12), pw - 12)) + 'px',\n );\n else\n p.style.setProperty(\n '--overlay-arrow-y',\n Math.round(Math.min(Math.max(r.top + r.height / 2 - y, 12), ph - 12)) + 'px',\n );\n }\n };\n place();\n window.addEventListener('scroll', place, true);\n window.addEventListener('resize', place);\n const ro = new ResizeObserver(place);\n ro.observe(panelRef.current);\n return () => {\n window.removeEventListener('scroll', place, true);\n window.removeEventListener('resize', place);\n ro.disconnect();\n };\n }, [side, align, arrow]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\n/* Per-instance <body> host (escapes ancestor transforms; skipped by inert); persists across open/close so AnimatePresence can play exits. */\nfunction OverlayPortal({ children }: { children: React.ReactNode }) {\n const hostRef = ovUseRef<HTMLDivElement | null>(null);\n // SSR guard: reached during server render; hooks below stay unconditional.\n if (typeof document !== 'undefined' && !hostRef.current) {\n hostRef.current = document.createElement('div');\n hostRef.current.setAttribute('data-overlay-root', '');\n }\n ovUseLayoutEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n document.body.appendChild(el);\n return () => el.remove();\n }, []);\n if (!hostRef.current) return null;\n return createPortal(children, hostRef.current);\n}\n\n/* Scrim (real motion.div): dialogs fade via variants, sheets via a travel-derived MotionValue; a press must start AND end on it to dismiss. */\nconst ovScrimVariants = {\n closed: { opacity: 0, transition: { duration: ovSM.dur.base, ease: ovSM.ease.standard } },\n open: { opacity: 1, transition: { duration: ovSM.dur.slow, ease: ovSM.ease.entrance } },\n};\nfunction OverlayScrim({\n dismissible,\n onPress,\n opacity = null,\n}: {\n dismissible: boolean;\n onPress: () => void;\n opacity?: any;\n}) {\n const down = ovUseRef(false);\n return (\n <ovMotion.div\n className=\"overlay-scrim\"\n aria-hidden=\"true\"\n {...(opacity ? { style: { opacity } } : { variants: ovScrimVariants })}\n onPointerDown={(e) => {\n down.current = e.target === e.currentTarget;\n }}\n onClick={(e) => {\n if (dismissible && down.current && e.target === e.currentTarget) onPress();\n }}\n ></ovMotion.div>\n );\n}\n\n/* Render the panel: a motion.div wrapper, or with asChild the child's own tag (host element required - component children can't take a ref here). */\nfunction ovPanelElement({\n asChild,\n children,\n prepend = null,\n nodeRef,\n className,\n motionProps,\n}: {\n asChild: boolean;\n children: React.ReactNode;\n prepend?: React.ReactNode;\n nodeRef: React.RefObject<HTMLElement>;\n className: string;\n motionProps: Record<string, any>;\n}): React.ReactElement {\n if (asChild) {\n const child = React.Children.only(children) as React.ReactElement<any>;\n if (typeof child.type === 'string') {\n const Tag = (ovMotion as any)[child.type];\n const composedRef = (node: HTMLElement | null) => {\n nodeRef.current = node;\n const r = (child as any).ref;\n if (typeof r === 'function') r(node);\n else if (r) r.current = node;\n };\n return (\n <Tag\n {...child.props}\n {...motionProps}\n ref={composedRef}\n className={child.props.className ? className + ' ' + child.props.className : className}\n style={{ ...motionProps.style, ...child.props.style }}\n >\n {prepend}\n {child.props.children}\n </Tag>\n );\n }\n console.warn('[Overlay] asChild requires a DOM-element child - falling back to a wrapper');\n }\n return (\n <ovMotion.div\n {...motionProps}\n ref={nodeRef as React.RefObject<HTMLDivElement>}\n className={className}\n >\n {prepend}\n {children}\n </ovMotion.div>\n );\n}\n\n/* Shared modal shell (dialog + sheet): layer > scrim + slot; sets no role/label (the consumer's panel owns semantics); modality hooks live here so they hold until exit. */\nfunction ModalShell({\n layerClass,\n slotClass,\n slotVariants,\n panelId,\n dismissible,\n requestClose,\n asChild = false,\n slotRef: externalSlotRef = null,\n slotProps = {},\n scrimOpacity = null,\n children,\n}: {\n layerClass: string;\n slotClass: string;\n slotVariants: any;\n panelId: string;\n dismissible: boolean;\n requestClose: () => void;\n asChild?: boolean;\n slotRef?: React.RefObject<HTMLElement> | null;\n slotProps?: Record<string, any>;\n scrimOpacity?: any;\n children: React.ReactNode;\n}) {\n const layerRef = ovUseRef<HTMLDivElement>(null);\n const internalSlotRef = ovUseRef<HTMLElement>(null);\n const slotRef = externalSlotRef || internalSlotRef;\n const entry = useOverlayEntry({ nodeRef: layerRef, dismissible, requestClose });\n useScrollLock();\n useInertOutside();\n useReturnFocus(layerRef);\n useFocusTrap({ panelRef: slotRef, entry });\n return (\n <ovMotion.div\n ref={layerRef}\n className={'overlay-layer ' + layerClass}\n initial=\"closed\"\n animate=\"open\"\n exit=\"closed\"\n >\n <OverlayScrim dismissible={dismissible} onPress={requestClose} opacity={scrimOpacity} />\n {ovPanelElement({\n asChild,\n children,\n nodeRef: slotRef,\n className: 'overlay-slot ' + slotClass,\n motionProps: { id: panelId, tabIndex: -1, variants: slotVariants, ...slotProps },\n })}\n </ovMotion.div>\n );\n}\n\nexport {\n ovMotion,\n OvAnimatePresence,\n ovSM,\n useControllable,\n ovResolveChildren,\n ovCloneTrigger,\n useOverlayEntry,\n useOutsidePress,\n useReturnFocus,\n useAnchorPosition,\n OverlayPortal,\n OverlayScrim,\n ovPanelElement,\n ModalShell,\n};\nexport type { OverlayEntry };\n","'use client';\n\n/* sheet-drag - drag-to-dismiss for Overlay's sheet mode (dismiss - scrim - rubber-band - scroll handoff). */\nimport * as React from 'react';\nimport { useMotionValue, useTransform, useDragControls, animate, type PanInfo } from 'motion/react';\nimport { UIMotion } from '../../tokens/motion-tokens';\n\nconst sdSM = UIMotion;\nconst { useEffect: sdUseEffect, useRef: sdUseRef } = React;\n\nconst DISMISS_RATIO = 0.4;\nconst DISMISS_VELOCITY = 500;\nconst INTENT_PX = 4;\nconst STRETCH_MAX = 0.06;\n\n/* nearest scrollable ancestor of `node`, stopping at the slot */\nfunction findScrollable(node: EventTarget | null, stop: HTMLElement | null): HTMLElement | null {\n let el = node instanceof Element ? node : null;\n while (el && el !== stop) {\n const s = getComputedStyle(el);\n if (\n /(auto|scroll)/.test(s.overflowY + s.overflowX) &&\n (el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth)\n )\n return el as HTMLElement;\n el = el.parentElement;\n }\n return null;\n}\n\nfunction useSheetDrag({\n side,\n slotRef,\n enabled,\n requestClose,\n}: {\n side: 'right' | 'bottom';\n slotRef: React.RefObject<HTMLElement>;\n enabled: boolean;\n requestClose: () => void;\n}) {\n const axis = side === 'bottom' ? 'y' : 'x';\n /* matches the `closed` variant so the scrim starts transparent */\n const travel = useMotionValue<string | number>('100%');\n const stretch = useMotionValue(1);\n const controls = useDragControls();\n const savedUserSelect = sdUseRef<string | null>(null);\n\n /* suspend selection only while dragging; restore also covers unmount mid-drag */\n function suspendSelection() {\n const sel = window.getSelection();\n if (sel) sel.removeAllRanges();\n savedUserSelect.current = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n }\n function restoreSelection() {\n if (savedUserSelect.current === null) return;\n document.body.style.userSelect = savedUserSelect.current;\n savedUserSelect.current = null;\n }\n sdUseEffect(() => restoreSelection, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const progress = useTransform(travel, (v) => {\n if (typeof v === 'string') return Math.min(Math.max(parseFloat(v) / 100 || 0, 0), 1);\n const el = slotRef.current;\n const size = el ? (axis === 'y' ? el.offsetHeight : el.offsetWidth) : Infinity;\n return Math.min(Math.max(v / size, 0), 1);\n });\n const scrimOpacity = useTransform(progress, (p) => 1 - p);\n\n /* pointer intent: watch the first few px, then hand off to drag or to scroll/selection */\n function onPointerDown(e: React.PointerEvent) {\n if (e.button !== 0) return;\n const startX = e.clientX,\n startY = e.clientY;\n const scrollable = findScrollable(e.target, slotRef.current);\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX,\n dy = ev.clientY - startY;\n if (Math.max(Math.abs(dx), Math.abs(dy)) < INTENT_PX) return;\n cleanup();\n const along = axis === 'y' ? dy : dx;\n const cross = axis === 'y' ? dx : dy;\n if (Math.abs(along) <= Math.abs(cross)) return;\n if (scrollable) {\n if (along < 0) return;\n if (axis === 'y' ? scrollable.scrollTop > 0 : scrollable.scrollLeft > 0) return;\n }\n suspendSelection();\n /* framer may not fire onDragEnd (release exactly at threshold), so restore here too - idempotent with the onDragEnd restore */\n window.addEventListener('pointerup', restoreSelection, { once: true });\n window.addEventListener('pointercancel', restoreSelection, { once: true });\n controls.start(ev);\n };\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', cleanup);\n window.removeEventListener('pointercancel', cleanup);\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', cleanup);\n window.addEventListener('pointercancel', cleanup);\n }\n\n /* overdrag away from the edge - damped, capped stretch (info.offset is raw; travel is clamped) */\n function onDrag(_ev: PointerEvent | MouseEvent | TouchEvent, info: PanInfo) {\n const el = slotRef.current;\n if (!el) return;\n const size = axis === 'y' ? el.offsetHeight : el.offsetWidth;\n const o = info.offset[axis];\n stretch.set(o < 0 ? 1 + Math.min(-o / size, 1) * STRETCH_MAX : 1);\n }\n\n function onDragEnd(_ev: PointerEvent | MouseEvent | TouchEvent, info: PanInfo) {\n restoreSelection();\n animate(stretch, 1, sdSM.t.settle);\n const el = slotRef.current;\n if (!el) return;\n const size = axis === 'y' ? el.offsetHeight : el.offsetWidth;\n if (info.offset[axis] > size * DISMISS_RATIO || info.velocity[axis] > DISMISS_VELOCITY)\n requestClose();\n }\n\n const stretchStyle =\n axis === 'y' ? { scaleY: stretch, originY: 1 } : { scaleX: stretch, originX: 1 };\n\n const slotProps = enabled\n ? {\n drag: axis,\n dragControls: controls,\n dragListener: false,\n dragMomentum: false,\n dragConstraints: { top: 0, bottom: 0, left: 0, right: 0 },\n /* away from the edge: hard clamp (stretch covers it); toward: free */\n dragElastic: axis === 'y' ? { top: 0, bottom: 1 } : { left: 0, right: 1 },\n onPointerDown,\n onDrag,\n onDragEnd,\n style: { [axis]: travel, ...stretchStyle },\n }\n : { style: { [axis]: travel } }; // scrim coupling still applies\n\n return { slotProps, scrimOpacity };\n}\n\nexport { useSheetDrag };\n","'use client';\n\n/* Overlay - one headless component, three modes: popover - dialog - sheet. */\nimport * as React from 'react';\nimport {\n OvAnimatePresence as AnimatePresence,\n ovSM as SM,\n useControllable,\n ovResolveChildren,\n ovCloneTrigger,\n useOverlayEntry,\n useOutsidePress,\n useReturnFocus,\n useAnchorPosition,\n OverlayPortal,\n ModalShell,\n ovPanelElement,\n} from './overlay-core';\nimport { useSheetDrag } from './sheet-drag';\n\nconst { useRef, useId } = React;\n\nexport interface OverlayProps {\n /** Skin + modality. Default 'popover'. */\n mode?: 'popover' | 'dialog' | 'sheet';\n\n /** Controlled open state. Omit to stay uncontrolled. */\n open?: boolean;\n /** Initial state when uncontrolled. Default false. */\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n\n /** Cloned to toggle (popover) / open (modal); required as the popover anchor. */\n trigger?: React.ReactElement | null;\n\n /** Popover side (default 'bottom', flips) / sheet edge (default 'right'). */\n side?: 'top' | 'bottom' | 'left' | 'right';\n /** Popover only - cross-axis alignment. Default 'start'. */\n align?: 'start' | 'center' | 'end';\n /** Popover only - caret tracking the trigger center. */\n arrow?: boolean;\n\n /** Light/scrim + Esc dismissal (sheet adds drag-to-edge). Default true. */\n dismissible?: boolean;\n\n /** Render no wrapper - your DOM-element child becomes the panel. Default false. */\n asChild?: boolean;\n\n id?: string;\n /** The ENTIRE surface - paint AND semantics. Function form receives { close }. */\n children: React.ReactNode | ((api: { close: () => void }) => React.ReactNode);\n}\n\n/* scales open from the anchored edge (transform-origin set in overlay.css) */\nconst popoverVariants = {\n closed: { opacity: 0, scale: 0.96, transition: SM.t.exit },\n open: { opacity: 1, scale: 1, transition: SM.t.enter },\n};\n\nconst dialogVariants = {\n closed: {\n opacity: 0,\n y: 6,\n scale: 0.98,\n transition: { duration: SM.dur.base, ease: SM.ease.standard },\n },\n open: {\n opacity: 1,\n y: 0,\n scale: 1,\n transition: { duration: SM.dur.slow, ease: SM.ease.entrance },\n },\n};\n\n/* entrance curve, not a spring - overshoot would show a gap behind the panel */\nfunction sheetVariants(side: 'right' | 'bottom') {\n const axis = side === 'bottom' ? 'y' : 'x';\n return {\n closed: { [axis]: '100%', transition: { duration: SM.dur.base, ease: SM.ease.exit } },\n open: { [axis]: 0, transition: { duration: SM.dur.slow, ease: SM.ease.entrance } },\n };\n}\n\ninterface PanelShared {\n panelId: string;\n dismissible: boolean;\n asChild: boolean;\n requestClose: () => void;\n}\n\n/* Popover panel - lifecycle hooks live here so dismiss/placement hold until exit ends. */\nfunction PopoverPanel({\n panelId,\n side,\n align,\n arrow,\n dismissible,\n asChild,\n requestClose,\n triggerRef,\n children,\n}: PanelShared & {\n side: 'top' | 'bottom' | 'left' | 'right';\n align: 'start' | 'center' | 'end';\n arrow: boolean;\n triggerRef: React.RefObject<HTMLElement>;\n children: React.ReactNode;\n}) {\n const panelRef = useRef<HTMLElement>(null);\n const entry = useOverlayEntry({ nodeRef: panelRef, dismissible, requestClose });\n useReturnFocus(panelRef);\n useAnchorPosition({ side, align, arrow, triggerRef, panelRef });\n useOutsidePress({\n entry,\n refs: [triggerRef, panelRef],\n enabled: dismissible,\n onPress: requestClose,\n });\n return ovPanelElement({\n asChild,\n children,\n prepend: arrow ? (\n <span key=\"arrow\" className=\"overlay-popover__arrow\" aria-hidden=\"true\"></span>\n ) : null,\n nodeRef: panelRef,\n className: 'overlay-popover',\n motionProps: {\n id: panelId,\n variants: popoverVariants,\n initial: 'closed',\n animate: 'open',\n exit: 'closed',\n },\n });\n}\n\n/* Sheet shell - owns the drag hook; slotRef must exist before the shell renders. */\nfunction SheetShell({\n side,\n panelId,\n dismissible,\n asChild,\n requestClose,\n children,\n}: PanelShared & {\n side: 'right' | 'bottom';\n children: React.ReactNode;\n}) {\n const slotRef = useRef<HTMLElement>(null);\n const { slotProps, scrimOpacity } = useSheetDrag({\n side,\n slotRef,\n enabled: dismissible,\n requestClose,\n });\n return (\n <ModalShell\n layerClass={'overlay-layer--sheet-' + side}\n slotClass={'overlay-slot--sheet-' + side}\n slotVariants={sheetVariants(side)}\n panelId={panelId}\n dismissible={dismissible}\n requestClose={requestClose}\n asChild={asChild}\n slotRef={slotRef}\n slotProps={slotProps}\n scrimOpacity={scrimOpacity}\n >\n {children}\n </ModalShell>\n );\n}\n\nexport function Overlay({\n mode = 'popover',\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n trigger = null,\n side,\n align = 'start',\n arrow = false,\n dismissible = true,\n asChild = false,\n id,\n children,\n}: OverlayProps) {\n const [open, setOpen] = useControllable(controlledOpen, defaultOpen, onOpenChange);\n const triggerRef = useRef<HTMLElement>(null);\n const panelId = id || 'overlay-' + useId();\n const close = () => setOpen(false);\n const modal = mode !== 'popover';\n const s = side || (mode === 'sheet' ? 'right' : 'bottom');\n const content = ovResolveChildren(children, close);\n const shared: PanelShared = { panelId, dismissible, asChild, requestClose: close };\n\n return (\n <React.Fragment>\n {ovCloneTrigger(trigger, {\n open,\n onPress: () => setOpen(modal ? true : !open),\n panelId,\n haspopup: modal ? 'dialog' : 'true',\n triggerRef,\n })}\n <OverlayPortal>\n <AnimatePresence>\n {open &&\n (mode === 'popover' ? (\n <PopoverPanel\n key=\"panel\"\n {...shared}\n side={s}\n align={align}\n arrow={arrow}\n triggerRef={triggerRef}\n >\n {content}\n </PopoverPanel>\n ) : mode === 'sheet' ? (\n <SheetShell key=\"shell\" {...shared} side={s as 'right' | 'bottom'}>\n {content}\n </SheetShell>\n ) : (\n <ModalShell\n key=\"shell\"\n {...shared}\n layerClass=\"overlay-layer--dialog\"\n slotClass=\"overlay-slot--dialog\"\n slotVariants={dialogVariants}\n >\n {content}\n </ModalShell>\n ))}\n </AnimatePresence>\n </OverlayPortal>\n </React.Fragment>\n );\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use client';import { Icon } from './chunk-KBWNUUWM.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var { useState, useCallback } = React;
|
|
6
|
+
function useControllable(value, defaultValue, onChange) {
|
|
7
|
+
const controlled = value !== void 0;
|
|
8
|
+
const [inner, setInner] = useState(defaultValue);
|
|
9
|
+
const val = controlled ? value : inner;
|
|
10
|
+
const commit = useCallback(
|
|
11
|
+
(next) => {
|
|
12
|
+
if (!controlled) setInner(next);
|
|
13
|
+
if (onChange) onChange(next);
|
|
14
|
+
},
|
|
15
|
+
[controlled, onChange]
|
|
16
|
+
);
|
|
17
|
+
return [val, commit];
|
|
18
|
+
}
|
|
19
|
+
function FieldShell({
|
|
20
|
+
variant,
|
|
21
|
+
label,
|
|
22
|
+
required,
|
|
23
|
+
invalid,
|
|
24
|
+
message,
|
|
25
|
+
icon,
|
|
26
|
+
className,
|
|
27
|
+
children
|
|
28
|
+
}) {
|
|
29
|
+
const cls = ["fld", variant, "fld--has-lead", invalid ? "is-error" : "", className || ""].filter(Boolean).join(" ");
|
|
30
|
+
return /* @__PURE__ */ jsxs("div", { className: cls, children: [
|
|
31
|
+
label ? /* @__PURE__ */ jsxs("span", { className: "fld__label", children: [
|
|
32
|
+
label,
|
|
33
|
+
required ? /* @__PURE__ */ jsx("span", { className: "fld__req", "aria-hidden": "true", children: "*" }) : null
|
|
34
|
+
] }) : null,
|
|
35
|
+
/* @__PURE__ */ jsxs("div", { className: "fld__control", children: [
|
|
36
|
+
children,
|
|
37
|
+
/* @__PURE__ */ jsx("span", { className: "fld__icon fld__icon--lead", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Icon, { name: icon, size: "md" }) })
|
|
38
|
+
] }),
|
|
39
|
+
message ? /* @__PURE__ */ jsx("div", { className: "fld__msg", children: /* @__PURE__ */ jsx("span", { children: message }) }) : null
|
|
40
|
+
] });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { FieldShell, useControllable };
|
|
44
|
+
//# sourceMappingURL=chunk-QNC6O3PG.js.map
|
|
45
|
+
//# sourceMappingURL=chunk-QNC6O3PG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/date-picker/field-shell.tsx"],"names":[],"mappings":";;;;AAQA,IAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,KAAA;AAE3B,SAAS,eAAA,CACd,KAAA,EACA,YAAA,EACA,QAAA,EACwB;AACxB,EAAA,MAAM,aAAa,KAAA,KAAU,MAAA;AAC7B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAY,YAAY,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,aAAc,KAAA,GAAc,KAAA;AACxC,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,CAAC,IAAA,KAAY;AACX,MAAA,IAAI,CAAC,UAAA,EAAY,QAAA,CAAS,IAAI,CAAA;AAC9B,MAAA,IAAI,QAAA,WAAmB,IAAI,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,CAAC,YAAY,QAAQ;AAAA,GACvB;AACA,EAAA,OAAO,CAAC,KAAK,MAAM,CAAA;AACrB;AAaO,SAAS,UAAA,CAAW;AAAA,EACzB,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,GAAA,GAAM,CAAC,KAAA,EAAO,OAAA,EAAS,iBAAiB,OAAA,GAAU,UAAA,GAAa,EAAA,EAAI,SAAA,IAAa,EAAE,CAAA,CACrF,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACX,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAA,EACb,QAAA,EAAA;AAAA,IAAA,KAAA,mBACC,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,QAAA,uBACE,MAAA,EAAA,EAAK,SAAA,EAAU,YAAW,aAAA,EAAY,MAAA,EAAO,eAE9C,CAAA,GACE;AAAA,KAAA,EACN,CAAA,GACE,IAAA;AAAA,oBACJ,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA;AAAA,sBACD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,aAAA,EAAY,MAAA,EACtD,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK,IAAA,EAAK,CAAA,EAC9B;AAAA,KAAA,EACF,CAAA;AAAA,IACC,OAAA,uBACE,KAAA,EAAA,EAAI,SAAA,EAAU,YACb,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,OAAA,EAAQ,CAAA,EACjB,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ","file":"chunk-QNC6O3PG.js","sourcesContent":["'use client';\n\n/* FieldShell + useControllable - the variant-blind .fld chrome and a controlled/uncontrolled state hook. */\n\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport { Icon, type IconName } from '../icon/Icon';\n\nconst { useState, useCallback } = React;\n\nexport function useControllable<T>(\n value: T | undefined,\n defaultValue: T,\n onChange?: (next: T) => void,\n): [T, (next: T) => void] {\n const controlled = value !== undefined;\n const [inner, setInner] = useState<T>(defaultValue);\n const val = controlled ? (value as T) : inner;\n const commit = useCallback(\n (next: T) => {\n if (!controlled) setInner(next);\n if (onChange) onChange(next);\n },\n [controlled, onChange],\n );\n return [val, commit];\n}\n\nexport interface FieldShellProps {\n variant: string;\n label?: string;\n required?: boolean;\n invalid?: boolean;\n message?: ReactNode;\n icon: IconName;\n className?: string;\n children?: ReactNode;\n}\n\nexport function FieldShell({\n variant,\n label,\n required,\n invalid,\n message,\n icon,\n className,\n children,\n}: FieldShellProps) {\n const cls = ['fld', variant, 'fld--has-lead', invalid ? 'is-error' : '', className || '']\n .filter(Boolean)\n .join(' ');\n return (\n <div className={cls}>\n {label ? (\n <span className=\"fld__label\">\n {label}\n {required ? (\n <span className=\"fld__req\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </span>\n ) : null}\n <div className=\"fld__control\">\n {children}\n <span className=\"fld__icon fld__icon--lead\" aria-hidden=\"true\">\n <Icon name={icon} size=\"md\" />\n </span>\n </div>\n {message ? (\n <div className=\"fld__msg\">\n <span>{message}</span>\n </div>\n ) : null}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
'use client';import { IconSlot } from './chunk-VVPGEAC6.js';
|
|
2
|
+
import { Icon } from './chunk-KBWNUUWM.js';
|
|
3
|
+
import { Collapse } from './chunk-YSHJHSJM.js';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function TextField({
|
|
7
|
+
id,
|
|
8
|
+
label,
|
|
9
|
+
required,
|
|
10
|
+
optional,
|
|
11
|
+
placeholder,
|
|
12
|
+
helper,
|
|
13
|
+
error,
|
|
14
|
+
warning,
|
|
15
|
+
success,
|
|
16
|
+
leadingIcon,
|
|
17
|
+
clearable,
|
|
18
|
+
size,
|
|
19
|
+
value,
|
|
20
|
+
onChange,
|
|
21
|
+
disabled,
|
|
22
|
+
readOnly,
|
|
23
|
+
type = "text",
|
|
24
|
+
className = "",
|
|
25
|
+
...rest
|
|
26
|
+
}) {
|
|
27
|
+
const state = error ? "is-error" : warning ? "is-warning" : success ? "is-success" : "";
|
|
28
|
+
const msg = error || warning || success || helper;
|
|
29
|
+
const msgIcon = error ? "warning-circle" : warning ? "warning" : success ? "check-circle" : null;
|
|
30
|
+
const showClear = clearable && value;
|
|
31
|
+
const cls = [
|
|
32
|
+
"fld",
|
|
33
|
+
size === "sm" ? "fld--sm" : size === "lg" ? "fld--lg" : "",
|
|
34
|
+
leadingIcon ? "fld--has-lead" : "",
|
|
35
|
+
showClear ? "fld--has-action" : "",
|
|
36
|
+
state,
|
|
37
|
+
className
|
|
38
|
+
].filter(Boolean).join(" ");
|
|
39
|
+
return /* @__PURE__ */ jsxs("div", { className: cls, children: [
|
|
40
|
+
label && /* @__PURE__ */ jsxs("label", { className: "fld__label", htmlFor: id, children: [
|
|
41
|
+
label,
|
|
42
|
+
required && /* @__PURE__ */ jsx("span", { className: "fld__req", "aria-hidden": "true", children: "*" }),
|
|
43
|
+
optional && /* @__PURE__ */ jsx("span", { className: "fld__optional", children: "(optional)" })
|
|
44
|
+
] }),
|
|
45
|
+
/* @__PURE__ */ jsxs("div", { className: "fld__control", children: [
|
|
46
|
+
leadingIcon && /* @__PURE__ */ jsx("span", { className: "fld__icon fld__icon--lead", children: /* @__PURE__ */ jsx(IconSlot, { children: leadingIcon }) }),
|
|
47
|
+
/* @__PURE__ */ jsx(
|
|
48
|
+
"input",
|
|
49
|
+
{
|
|
50
|
+
id,
|
|
51
|
+
className: "fld__input",
|
|
52
|
+
type,
|
|
53
|
+
value,
|
|
54
|
+
onChange,
|
|
55
|
+
placeholder,
|
|
56
|
+
disabled,
|
|
57
|
+
readOnly,
|
|
58
|
+
"aria-invalid": error ? true : void 0,
|
|
59
|
+
...rest
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
showClear && /* @__PURE__ */ jsx(
|
|
63
|
+
"button",
|
|
64
|
+
{
|
|
65
|
+
type: "button",
|
|
66
|
+
className: "fld__action",
|
|
67
|
+
"aria-label": "Clear",
|
|
68
|
+
onClick: () => onChange && onChange({ target: { value: "" } }),
|
|
69
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "close" })
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
] }),
|
|
73
|
+
/* @__PURE__ */ jsx(Collapse, { open: !!msg, className: "fld__msg-wrap", children: /* @__PURE__ */ jsxs("div", { className: "fld__msg", children: [
|
|
74
|
+
msgIcon && /* @__PURE__ */ jsx(Icon, { name: msgIcon, size: "sm", weight: "fill" }),
|
|
75
|
+
msg
|
|
76
|
+
] }) })
|
|
77
|
+
] });
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { TextField };
|
|
81
|
+
//# sourceMappingURL=chunk-QUHOXWBK.js.map
|
|
82
|
+
//# sourceMappingURL=chunk-QUHOXWBK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/input/TextField.tsx"],"names":[],"mappings":"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","file":"chunk-QUHOXWBK.js","sourcesContent":["'use client';\n\n// TextField.tsx - text input: label - control - message, leading icon, clear action, sizes, validation states.\n\nimport type { ChangeEvent, InputHTMLAttributes, ReactNode } from 'react';\nimport { Icon } from '../icon/Icon';\nimport { IconSlot } from '../icon/IconSlot';\nimport { Collapse } from '../motion/Collapse';\n\nexport interface TextFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Field id, ties the label to the input. */\n id?: string;\n /** Label text (sentence case). */\n label?: ReactNode;\n /** Show a danger `*` after the label. */\n required?: boolean;\n /** Show a muted \"(optional)\" after the label. */\n optional?: boolean;\n /** Neutral helper text - shown when there's no validation message. */\n helper?: ReactNode;\n /** Error message - sets the error state (red border/ring + icon). Wins over warning/success/helper. */\n error?: ReactNode;\n /** Warning message - amber state. */\n warning?: ReactNode;\n /** Success message - green state. */\n success?: ReactNode;\n /** Leading icon - your own icon node (sized to the control). Decorative. */\n leadingIcon?: ReactNode;\n /** Show a clear button when there's a value. */\n clearable?: boolean;\n /** Control height: sm 28 - md 36 (default) - lg 40. */\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport function TextField({\n id,\n label,\n required,\n optional,\n placeholder,\n helper,\n error,\n warning,\n success,\n leadingIcon,\n clearable,\n size,\n value,\n onChange,\n disabled,\n readOnly,\n type = 'text',\n className = '',\n ...rest\n}: TextFieldProps) {\n const state = error ? 'is-error' : warning ? 'is-warning' : success ? 'is-success' : '';\n const msg = error || warning || success || helper;\n const msgIcon = error ? 'warning-circle' : warning ? 'warning' : success ? 'check-circle' : null;\n const showClear = clearable && value;\n const cls = [\n 'fld',\n size === 'sm' ? 'fld--sm' : size === 'lg' ? 'fld--lg' : '',\n leadingIcon ? 'fld--has-lead' : '',\n showClear ? 'fld--has-action' : '',\n state,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={cls}>\n {label && (\n <label className=\"fld__label\" htmlFor={id}>\n {label}\n {required && (\n <span className=\"fld__req\" aria-hidden=\"true\">\n *\n </span>\n )}\n {optional && <span className=\"fld__optional\">(optional)</span>}\n </label>\n )}\n <div className=\"fld__control\">\n {leadingIcon && (\n <span className=\"fld__icon fld__icon--lead\">\n <IconSlot>{leadingIcon}</IconSlot>\n </span>\n )}\n <input\n id={id}\n className=\"fld__input\"\n type={type}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-invalid={error ? true : undefined}\n {...rest}\n />\n {showClear && (\n <button\n type=\"button\"\n className=\"fld__action\"\n aria-label=\"Clear\"\n onClick={() =>\n onChange && onChange({ target: { value: '' } } as ChangeEvent<HTMLInputElement>)\n }\n >\n <Icon name=\"close\" />\n </button>\n )}\n </div>\n <Collapse open={!!msg} className=\"fld__msg-wrap\">\n <div className=\"fld__msg\">\n {msgIcon && <Icon name={msgIcon} size=\"sm\" weight=\"fill\" />}\n {msg}\n </div>\n </Collapse>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
'use client';import { UIMotion } from './chunk-37O2ZXD6.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { motion } from 'motion/react';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var SM = UIMotion;
|
|
7
|
+
var { useRef, useState, useEffect, useCallback } = React;
|
|
8
|
+
function useGlide(containerRef) {
|
|
9
|
+
const [rect, setRect] = useState(null);
|
|
10
|
+
const [active, setActive] = useState(false);
|
|
11
|
+
const enter = useCallback(
|
|
12
|
+
(el) => {
|
|
13
|
+
const c = containerRef.current;
|
|
14
|
+
if (!c || !el) return;
|
|
15
|
+
const cb = c.getBoundingClientRect();
|
|
16
|
+
const tb = el.getBoundingClientRect();
|
|
17
|
+
setRect({ x: tb.left - cb.left, y: tb.top - cb.top, width: tb.width, height: tb.height });
|
|
18
|
+
setActive(true);
|
|
19
|
+
},
|
|
20
|
+
[containerRef]
|
|
21
|
+
);
|
|
22
|
+
const leave = useCallback(() => setActive(false), []);
|
|
23
|
+
return { rect, active, enter, leave };
|
|
24
|
+
}
|
|
25
|
+
function GlidePill({ className, rect, active }) {
|
|
26
|
+
const wasActive = useRef(false);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
wasActive.current = active;
|
|
29
|
+
});
|
|
30
|
+
const travel = wasActive.current && active ? SM.t.settle : { duration: 0 };
|
|
31
|
+
return /* @__PURE__ */ jsx(
|
|
32
|
+
motion.span,
|
|
33
|
+
{
|
|
34
|
+
className,
|
|
35
|
+
"aria-hidden": "true",
|
|
36
|
+
initial: false,
|
|
37
|
+
animate: {
|
|
38
|
+
x: rect ? rect.x : 0,
|
|
39
|
+
y: rect ? rect.y : 0,
|
|
40
|
+
width: rect ? rect.width : 0,
|
|
41
|
+
height: rect ? rect.height : 0,
|
|
42
|
+
opacity: active && rect ? 1 : 0
|
|
43
|
+
},
|
|
44
|
+
transition: {
|
|
45
|
+
x: travel,
|
|
46
|
+
y: travel,
|
|
47
|
+
width: travel,
|
|
48
|
+
height: travel,
|
|
49
|
+
opacity: { duration: SM.dur.fast, ease: active ? SM.ease.standard : SM.ease.exit }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// src/components/date-picker/date-utils.ts
|
|
56
|
+
var MONTHS = [
|
|
57
|
+
"January",
|
|
58
|
+
"February",
|
|
59
|
+
"March",
|
|
60
|
+
"April",
|
|
61
|
+
"May",
|
|
62
|
+
"June",
|
|
63
|
+
"July",
|
|
64
|
+
"August",
|
|
65
|
+
"September",
|
|
66
|
+
"October",
|
|
67
|
+
"November",
|
|
68
|
+
"December"
|
|
69
|
+
];
|
|
70
|
+
var DOW = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"];
|
|
71
|
+
var pad = (n) => String(n).padStart(2, "0");
|
|
72
|
+
var key = (d) => d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate());
|
|
73
|
+
function parse(k) {
|
|
74
|
+
const p = k.split("-").map(Number);
|
|
75
|
+
return new Date(p[0], p[1] - 1, p[2]);
|
|
76
|
+
}
|
|
77
|
+
var today = () => key(/* @__PURE__ */ new Date());
|
|
78
|
+
var add = (k, days) => {
|
|
79
|
+
const d = parse(k);
|
|
80
|
+
d.setDate(d.getDate() + days);
|
|
81
|
+
return key(d);
|
|
82
|
+
};
|
|
83
|
+
var col = (d) => (d.getDay() + 6) % 7;
|
|
84
|
+
function grid(y, m) {
|
|
85
|
+
const lead = (new Date(y, m, 1).getDay() + 6) % 7;
|
|
86
|
+
const days = [];
|
|
87
|
+
for (let i = 0; i < 42; i++) days.push(new Date(y, m, 1 - lead + i));
|
|
88
|
+
return days;
|
|
89
|
+
}
|
|
90
|
+
function tzLabel(tz, dateKey) {
|
|
91
|
+
try {
|
|
92
|
+
const at = dateKey ? parse(dateKey) : /* @__PURE__ */ new Date();
|
|
93
|
+
const parts = new Intl.DateTimeFormat("en-US", {
|
|
94
|
+
timeZone: tz,
|
|
95
|
+
timeZoneName: "shortOffset"
|
|
96
|
+
}).formatToParts(at);
|
|
97
|
+
const name = parts.find((p) => p.type === "timeZoneName");
|
|
98
|
+
return tz.replace(/_/g, " ") + (name ? " - " + name.value : "");
|
|
99
|
+
} catch (_e) {
|
|
100
|
+
return tz;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export { DOW, GlidePill, MONTHS, add, col, grid, key, pad, parse, today, tzLabel, useGlide };
|
|
105
|
+
//# sourceMappingURL=chunk-UIQGSTBJ.js.map
|
|
106
|
+
//# sourceMappingURL=chunk-UIQGSTBJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/date-picker/glide-pill.tsx","../src/components/date-picker/date-utils.ts"],"names":[],"mappings":";;;;;AASA,IAAM,EAAA,GAAK,QAAA;AACX,IAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,aAAY,GAAI,KAAA;AAgB9C,SAAS,SACd,YAAA,EACU;AACV,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAA2B,IAAI,CAAA;AACvD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,WAAA;AAAA,IACZ,CAAC,EAAA,KAA2B;AAC1B,MAAA,MAAM,IAAI,YAAA,CAAa,OAAA;AACvB,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,EAAA,EAAI;AACf,MAAA,MAAM,EAAA,GAAK,EAAE,qBAAA,EAAsB;AACnC,MAAA,MAAM,EAAA,GAAK,GAAG,qBAAA,EAAsB;AACpC,MAAA,OAAA,CAAQ,EAAE,CAAA,EAAG,EAAA,CAAG,IAAA,GAAO,EAAA,CAAG,MAAM,CAAA,EAAG,EAAA,CAAG,GAAA,GAAM,EAAA,CAAG,KAAK,KAAA,EAAO,EAAA,CAAG,OAAO,MAAA,EAAQ,EAAA,CAAG,QAAQ,CAAA;AACxF,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AACA,EAAA,MAAM,QAAQ,WAAA,CAAY,MAAM,UAAU,KAAK,CAAA,EAAG,EAAE,CAAA;AACpD,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAM;AACtC;AAQO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,IAAA,EAAM,QAAO,EAAmB;AAErE,EAAA,MAAM,SAAA,GAAY,OAAO,KAAK,CAAA;AAC9B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAAA,EACtB,CAAC,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,UAAU,OAAA,IAAW,MAAA,GAAS,GAAG,CAAA,CAAE,MAAA,GAAS,EAAE,QAAA,EAAU,CAAA,EAAE;AACzE,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA,CAAO,IAAA;AAAA,IAAP;AAAA,MACC,SAAA;AAAA,MACA,aAAA,EAAY,MAAA;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAA;AAAA,QACnB,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAA;AAAA,QACnB,KAAA,EAAO,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,CAAA;AAAA,QAC3B,MAAA,EAAQ,IAAA,GAAO,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,QAC7B,OAAA,EAAS,MAAA,IAAU,IAAA,GAAO,CAAA,GAAI;AAAA,OAChC;AAAA,MACA,UAAA,EAAY;AAAA,QACV,CAAA,EAAG,MAAA;AAAA,QACH,CAAA,EAAG,MAAA;AAAA,QACH,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,QAAA,EAAU,EAAA,CAAG,GAAA,CAAI,IAAA,EAAM,IAAA,EAAM,MAAA,GAAS,EAAA,CAAG,IAAA,CAAK,QAAA,GAAW,EAAA,CAAG,KAAK,IAAA;AAAK;AACnF;AAAA,GACD;AAEL;;;AC9EO,IAAM,MAAA,GAAmB;AAAA,EAC9B,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AACO,IAAM,GAAA,GAAgB,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI;AAE/D,IAAM,GAAA,GAAM,CAAC,CAAA,KAAsB,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG;AAC5D,IAAM,MAAM,CAAC,CAAA,KAClB,CAAA,CAAE,WAAA,KAAgB,GAAA,GAAM,GAAA,CAAI,CAAA,CAAE,QAAA,KAAa,CAAC,CAAA,GAAI,MAAM,GAAA,CAAI,CAAA,CAAE,SAAS;AAChE,SAAS,MAAM,CAAA,EAAiB;AACrC,EAAA,MAAM,IAAI,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACjC,EAAA,OAAO,IAAI,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AACtC;AACO,IAAM,KAAA,GAAQ,MAAc,GAAA,iBAAI,IAAI,MAAM;AAC1C,IAAM,GAAA,GAAM,CAAC,CAAA,EAAW,IAAA,KAAyB;AACtD,EAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,EAAA,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAI,CAAA;AAC5B,EAAA,OAAO,IAAI,CAAC,CAAA;AACd;AACO,IAAM,MAAM,CAAC,CAAA,KAAA,CAAqB,CAAA,CAAE,MAAA,KAAW,CAAA,IAAK;AAGpD,SAAS,IAAA,CAAK,GAAW,CAAA,EAAmB;AACjD,EAAA,MAAM,IAAA,GAAA,CAAQ,IAAI,IAAA,CAAK,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,MAAA,EAAO,GAAI,CAAA,IAAK,CAAA;AAChD,EAAA,MAAM,OAAe,EAAC;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,KAAK,IAAA,CAAK,IAAA,CAAK,IAAI,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,IAAA,GAAO,CAAC,CAAC,CAAA;AACnE,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,OAAA,CAAQ,IAAY,OAAA,EAA0B;AAC5D,EAAA,IAAI;AACF,IAAA,MAAM,KAAK,OAAA,GAAU,KAAA,CAAM,OAAO,CAAA,uBAAQ,IAAA,EAAK;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS;AAAA,MAC7C,QAAA,EAAU,EAAA;AAAA,MACV,YAAA,EAAc;AAAA,KACf,CAAA,CAAE,aAAA,CAAc,EAAE,CAAA;AACnB,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,cAAc,CAAA;AACxD,IAAA,OAAO,EAAA,CAAG,QAAQ,IAAA,EAAM,GAAG,KAAK,IAAA,GAAO,KAAA,GAAQ,KAAK,KAAA,GAAQ,EAAA,CAAA;AAAA,EAC9D,SAAS,EAAA,EAAI;AACX,IAAA,OAAO,EAAA;AAAA,EACT;AACF","file":"chunk-UIQGSTBJ.js","sourcesContent":["'use client';\n\n/* GlidePill + useGlide - one persistent pill that springs between hovered cells, never a per-cell remount. */\n\nimport * as React from 'react';\nimport type { RefObject } from 'react';\nimport { motion } from 'motion/react';\nimport { UIMotion } from '../../tokens/motion-tokens';\n\nconst SM = UIMotion;\nconst { useRef, useState, useEffect, useCallback } = React;\n\nexport interface GlideRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface GlideApi {\n rect: GlideRect | null;\n active: boolean;\n enter: (el: HTMLElement | null) => void;\n leave: () => void;\n}\n\nexport function useGlide<T extends HTMLElement = HTMLElement>(\n containerRef: RefObject<T | null>,\n): GlideApi {\n const [rect, setRect] = useState<GlideRect | null>(null);\n const [active, setActive] = useState(false);\n const enter = useCallback(\n (el: HTMLElement | null) => {\n const c = containerRef.current;\n if (!c || !el) return;\n const cb = c.getBoundingClientRect();\n const tb = el.getBoundingClientRect();\n setRect({ x: tb.left - cb.left, y: tb.top - cb.top, width: tb.width, height: tb.height });\n setActive(true);\n },\n [containerRef],\n );\n const leave = useCallback(() => setActive(false), []);\n return { rect, active, enter, leave };\n}\n\nexport interface GlidePillProps {\n className?: string;\n rect: GlideRect | null;\n active: boolean;\n}\n\nexport function GlidePill({ className, rect, active }: GlidePillProps) {\n /* `wasActive` trails one render: the first appearance lands in place, later moves travel on the spring. */\n const wasActive = useRef(false);\n useEffect(() => {\n wasActive.current = active;\n });\n const travel = wasActive.current && active ? SM.t.settle : { duration: 0 };\n return (\n <motion.span\n className={className}\n aria-hidden=\"true\"\n initial={false}\n animate={{\n x: rect ? rect.x : 0,\n y: rect ? rect.y : 0,\n width: rect ? rect.width : 0,\n height: rect ? rect.height : 0,\n opacity: active && rect ? 1 : 0,\n }}\n transition={{\n x: travel,\n y: travel,\n width: travel,\n height: travel,\n opacity: { duration: SM.dur.fast, ease: active ? SM.ease.standard : SM.ease.exit },\n }}\n ></motion.span>\n );\n}\n","/* date-picker shared pure helpers - 'YYYY-MM-DD' civil-date math, month/weekday constants, tz-offset label. */\n\nexport const MONTHS: string[] = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\nexport const DOW: string[] = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\n\nexport const pad = (n: number): string => String(n).padStart(2, '0');\nexport const key = (d: Date): string =>\n d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate());\nexport function parse(k: string): Date {\n const p = k.split('-').map(Number);\n return new Date(p[0], p[1] - 1, p[2]);\n}\nexport const today = (): string => key(new Date());\nexport const add = (k: string, days: number): string => {\n const d = parse(k);\n d.setDate(d.getDate() + days);\n return key(d);\n};\nexport const col = (d: Date): number => (d.getDay() + 6) % 7; // Monday-first column 0-6\n\n/* 42 cells, Monday-first, covering the month of (y, m) */\nexport function grid(y: number, m: number): Date[] {\n const lead = (new Date(y, m, 1).getDay() + 6) % 7;\n const days: Date[] = [];\n for (let i = 0; i < 42; i++) days.push(new Date(y, m, 1 - lead + i));\n return days;\n}\n\n/* 'Europe/Riga' - 'Europe/Riga - GMT+3'; dateKey gives the DST-correct offset for that date, else now. */\nexport function tzLabel(tz: string, dateKey?: string): string {\n try {\n const at = dateKey ? parse(dateKey) : new Date();\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone: tz,\n timeZoneName: 'shortOffset',\n }).formatToParts(at);\n const name = parts.find((p) => p.type === 'timeZoneName');\n return tz.replace(/_/g, ' ') + (name ? ' - ' + name.value : '');\n } catch (_e) {\n return tz;\n }\n}\n"]}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
'use client';import { useControllable, normalize, matches, useSelectMenu, SelectTrigger, SelectMenu, SearchField, LoadingRows, FilterRow, EmptyRow } from './chunk-G6OY35DI.js';
|
|
2
|
+
import { IconSlot } from './chunk-VVPGEAC6.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function CheckboxTick({ checked }) {
|
|
7
|
+
return /* @__PURE__ */ jsxs("span", { className: "cbx", "aria-hidden": "true", children: [
|
|
8
|
+
/* @__PURE__ */ jsx("input", { type: "checkbox", className: "cbx__input", tabIndex: -1, checked, readOnly: true }),
|
|
9
|
+
/* @__PURE__ */ jsxs("span", { className: "cbx__box", children: [
|
|
10
|
+
/* @__PURE__ */ jsx("svg", { className: "cbx__mark", viewBox: "0 0 16 16", fill: "none", children: /* @__PURE__ */ jsx("path", { className: "cbx__tick", d: "M3.5 8.5 L6.75 11.5 L12.5 4.75" }) }),
|
|
11
|
+
/* @__PURE__ */ jsx("span", { className: "cbx__dash" })
|
|
12
|
+
] })
|
|
13
|
+
] });
|
|
14
|
+
}
|
|
15
|
+
function MultiSelect({
|
|
16
|
+
options = [],
|
|
17
|
+
value: controlledValue,
|
|
18
|
+
defaultValue = [],
|
|
19
|
+
onChange,
|
|
20
|
+
placeholder = "Select options",
|
|
21
|
+
size = "default",
|
|
22
|
+
disabled = false,
|
|
23
|
+
invalid = false,
|
|
24
|
+
loading = false,
|
|
25
|
+
searchable = false,
|
|
26
|
+
searchPlaceholder = "Filter options",
|
|
27
|
+
leadingIcon = null,
|
|
28
|
+
id,
|
|
29
|
+
ariaLabel
|
|
30
|
+
}) {
|
|
31
|
+
const { useState, useRef, useEffect, useId } = React;
|
|
32
|
+
const [value, setValue] = useControllable(
|
|
33
|
+
controlledValue,
|
|
34
|
+
defaultValue,
|
|
35
|
+
onChange
|
|
36
|
+
);
|
|
37
|
+
const [open, setOpen] = useState(false);
|
|
38
|
+
const [query, setQuery] = useState("");
|
|
39
|
+
const triggerRef = useRef(null), listRef = useRef(null), searchRef = useRef(null);
|
|
40
|
+
const baseId = id || "mselect-" + useId();
|
|
41
|
+
const menuId = baseId + "-menu";
|
|
42
|
+
const listId = baseId + "-list";
|
|
43
|
+
const { groups, flat } = normalize(options);
|
|
44
|
+
const values = Array.isArray(value) ? value : [];
|
|
45
|
+
const isSelected = (v) => values.indexOf(v) !== -1;
|
|
46
|
+
const selectedOptions = flat.filter((o) => isSelected(o.value));
|
|
47
|
+
const navItems = [];
|
|
48
|
+
groups.forEach(
|
|
49
|
+
(g) => g.options.forEach((o) => {
|
|
50
|
+
if (matches(o, query)) navItems.push(o);
|
|
51
|
+
})
|
|
52
|
+
);
|
|
53
|
+
const show = () => {
|
|
54
|
+
if (!disabled && !loading) setOpen(true);
|
|
55
|
+
};
|
|
56
|
+
const hide = () => setOpen(false);
|
|
57
|
+
const returnFocus = () => triggerRef.current && triggerRef.current.focus();
|
|
58
|
+
function commit(opt) {
|
|
59
|
+
if (!opt || opt.disabled) return;
|
|
60
|
+
const next = isSelected(opt.value) ? values.filter((v) => v !== opt.value) : [...values, opt.value];
|
|
61
|
+
setValue(next, opt);
|
|
62
|
+
}
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (!open) setQuery("");
|
|
65
|
+
}, [open]);
|
|
66
|
+
const { activeIdx, setActiveIdx, onMenuKeyDown } = useSelectMenu({
|
|
67
|
+
open,
|
|
68
|
+
close: hide,
|
|
69
|
+
returnFocus,
|
|
70
|
+
triggerRef,
|
|
71
|
+
listRef,
|
|
72
|
+
searchRef,
|
|
73
|
+
menuId,
|
|
74
|
+
navItems,
|
|
75
|
+
isSelected,
|
|
76
|
+
commit,
|
|
77
|
+
searchable
|
|
78
|
+
});
|
|
79
|
+
const isPlaceholder = !loading && selectedOptions.length === 0;
|
|
80
|
+
const adId = open && activeIdx >= 0 ? baseId + "-opt-" + activeIdx : void 0;
|
|
81
|
+
let vIdx = -1;
|
|
82
|
+
return /* @__PURE__ */ jsxs(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
className: "select",
|
|
86
|
+
"data-multiple": "true",
|
|
87
|
+
"data-size": size === "default" ? void 0 : size,
|
|
88
|
+
"data-open": open ? "true" : void 0,
|
|
89
|
+
"data-disabled": disabled ? "true" : void 0,
|
|
90
|
+
"data-invalid": invalid ? "true" : void 0,
|
|
91
|
+
"data-loading": loading ? "true" : void 0,
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ jsx(
|
|
94
|
+
SelectTrigger,
|
|
95
|
+
{
|
|
96
|
+
triggerRef,
|
|
97
|
+
baseId,
|
|
98
|
+
open,
|
|
99
|
+
disabled,
|
|
100
|
+
invalid,
|
|
101
|
+
ariaLabel,
|
|
102
|
+
adId,
|
|
103
|
+
show,
|
|
104
|
+
hide,
|
|
105
|
+
leading: leadingIcon || selectedOptions.length === 1 && selectedOptions[0].icon || null,
|
|
106
|
+
text: loading ? "Loading..." : isPlaceholder ? placeholder : selectedOptions[0].label,
|
|
107
|
+
isPlaceholder,
|
|
108
|
+
count: selectedOptions.length - 1
|
|
109
|
+
}
|
|
110
|
+
),
|
|
111
|
+
/* @__PURE__ */ jsxs(SelectMenu, { open, menuId, children: [
|
|
112
|
+
searchable && !loading && /* @__PURE__ */ jsx(
|
|
113
|
+
SearchField,
|
|
114
|
+
{
|
|
115
|
+
searchRef,
|
|
116
|
+
query,
|
|
117
|
+
onQuery: setQuery,
|
|
118
|
+
onKeyDown: onMenuKeyDown,
|
|
119
|
+
placeholder: searchPlaceholder,
|
|
120
|
+
listId,
|
|
121
|
+
adId
|
|
122
|
+
}
|
|
123
|
+
),
|
|
124
|
+
/* @__PURE__ */ jsx(
|
|
125
|
+
"div",
|
|
126
|
+
{
|
|
127
|
+
className: "select__list",
|
|
128
|
+
ref: listRef,
|
|
129
|
+
id: listId,
|
|
130
|
+
role: "listbox",
|
|
131
|
+
"aria-multiselectable": "true",
|
|
132
|
+
tabIndex: -1,
|
|
133
|
+
"aria-label": ariaLabel,
|
|
134
|
+
onKeyDown: searchable ? void 0 : onMenuKeyDown,
|
|
135
|
+
children: loading ? /* @__PURE__ */ jsx(LoadingRows, {}) : /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
136
|
+
groups.map((g, gi) => /* @__PURE__ */ jsxs(
|
|
137
|
+
"div",
|
|
138
|
+
{
|
|
139
|
+
className: "select__group",
|
|
140
|
+
role: "group",
|
|
141
|
+
"aria-label": g.label || void 0,
|
|
142
|
+
children: [
|
|
143
|
+
g.label && g.options.some((o) => matches(o, query)) && /* @__PURE__ */ jsx("div", { className: "select__group-label", children: g.label }),
|
|
144
|
+
g.options.map((opt) => {
|
|
145
|
+
const visible = matches(opt, query);
|
|
146
|
+
const i = visible ? (vIdx += 1, vIdx) : -1;
|
|
147
|
+
const isSel = isSelected(opt.value);
|
|
148
|
+
const row = /* @__PURE__ */ jsxs(
|
|
149
|
+
"div",
|
|
150
|
+
{
|
|
151
|
+
id: visible ? baseId + "-opt-" + i : void 0,
|
|
152
|
+
"data-idx": visible ? i : void 0,
|
|
153
|
+
className: "select__option",
|
|
154
|
+
role: "option",
|
|
155
|
+
"aria-selected": isSel,
|
|
156
|
+
"aria-hidden": !visible || void 0,
|
|
157
|
+
"aria-disabled": opt.disabled || void 0,
|
|
158
|
+
"data-selected": isSel ? "true" : void 0,
|
|
159
|
+
"data-active": visible && i === activeIdx ? "true" : void 0,
|
|
160
|
+
"data-disabled": opt.disabled ? "true" : void 0,
|
|
161
|
+
onMouseEnter: () => visible && !opt.disabled && setActiveIdx(i),
|
|
162
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
163
|
+
onClick: () => visible && commit(opt),
|
|
164
|
+
children: [
|
|
165
|
+
opt.icon && /* @__PURE__ */ jsx("span", { className: "select__option-icon", children: /* @__PURE__ */ jsx(IconSlot, { size: "sm", children: opt.icon }) }),
|
|
166
|
+
/* @__PURE__ */ jsxs("span", { className: "select__option-text", children: [
|
|
167
|
+
/* @__PURE__ */ jsx("span", { className: "select__option-label", children: opt.label }),
|
|
168
|
+
opt.description && /* @__PURE__ */ jsx("span", { className: "select__option-desc", children: opt.description })
|
|
169
|
+
] }),
|
|
170
|
+
/* @__PURE__ */ jsx("span", { className: "select__option-check", children: /* @__PURE__ */ jsx(CheckboxTick, { checked: isSel }) })
|
|
171
|
+
]
|
|
172
|
+
},
|
|
173
|
+
opt.value
|
|
174
|
+
);
|
|
175
|
+
return searchable ? /* @__PURE__ */ jsx(FilterRow, { visible, children: row }, opt.value) : row;
|
|
176
|
+
})
|
|
177
|
+
]
|
|
178
|
+
},
|
|
179
|
+
gi
|
|
180
|
+
)),
|
|
181
|
+
navItems.length === 0 && /* @__PURE__ */ jsx(EmptyRow, { query })
|
|
182
|
+
] })
|
|
183
|
+
}
|
|
184
|
+
)
|
|
185
|
+
] })
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export { MultiSelect };
|
|
192
|
+
//# sourceMappingURL=chunk-UJQKVP6V.js.map
|
|
193
|
+
//# sourceMappingURL=chunk-UJQKVP6V.js.map
|