@zyncat/ui 0.8.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 +133 -0
- package/dist/alert.css +132 -0
- package/dist/alert.d.ts +46 -0
- package/dist/alert.js +80 -0
- package/dist/alert.js.map +1 -0
- package/dist/avatar-group.d.ts +24 -0
- package/dist/avatar-group.js +23 -0
- package/dist/avatar-group.js.map +1 -0
- package/dist/avatar.css +200 -0
- package/dist/avatar.d.ts +35 -0
- package/dist/avatar.js +67 -0
- package/dist/avatar.js.map +1 -0
- package/dist/badge.css +182 -0
- package/dist/badge.d.ts +34 -0
- package/dist/badge.js +4 -0
- package/dist/badge.js.map +1 -0
- package/dist/button.css +269 -0
- package/dist/button.d.ts +44 -0
- package/dist/button.js +4 -0
- package/dist/button.js.map +1 -0
- package/dist/checkbox.css +177 -0
- package/dist/checkbox.d.ts +35 -0
- package/dist/checkbox.js +5 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chunk-2ERBBFZS.js +12 -0
- package/dist/chunk-2ERBBFZS.js.map +1 -0
- package/dist/chunk-2HORSLXJ.js +191 -0
- package/dist/chunk-2HORSLXJ.js.map +1 -0
- package/dist/chunk-36WVAQKL.js +40 -0
- package/dist/chunk-36WVAQKL.js.map +1 -0
- package/dist/chunk-3SBCBYB7.js +575 -0
- package/dist/chunk-3SBCBYB7.js.map +1 -0
- package/dist/chunk-4R2GQO43.js +125 -0
- package/dist/chunk-4R2GQO43.js.map +1 -0
- package/dist/chunk-64UU4LGU.js +258 -0
- package/dist/chunk-64UU4LGU.js.map +1 -0
- package/dist/chunk-7SZCJ7WI.js +35 -0
- package/dist/chunk-7SZCJ7WI.js.map +1 -0
- package/dist/chunk-BIDVNLJO.js +38 -0
- package/dist/chunk-BIDVNLJO.js.map +1 -0
- package/dist/chunk-CONSWNIV.js +17 -0
- package/dist/chunk-CONSWNIV.js.map +1 -0
- package/dist/chunk-EQ32F2QJ.js +75 -0
- package/dist/chunk-EQ32F2QJ.js.map +1 -0
- package/dist/chunk-GY7JOPUQ.js +111 -0
- package/dist/chunk-GY7JOPUQ.js.map +1 -0
- package/dist/chunk-I4XQ4PV2.js +30 -0
- package/dist/chunk-I4XQ4PV2.js.map +1 -0
- package/dist/chunk-JSKXZMLH.js +67 -0
- package/dist/chunk-JSKXZMLH.js.map +1 -0
- package/dist/chunk-L3Q3VDIW.js +295 -0
- package/dist/chunk-L3Q3VDIW.js.map +1 -0
- package/dist/chunk-LDC3RIYA.js +62 -0
- package/dist/chunk-LDC3RIYA.js.map +1 -0
- package/dist/chunk-MKIQFK7S.js +43 -0
- package/dist/chunk-MKIQFK7S.js.map +1 -0
- package/dist/chunk-MMRIQNEN.js +20 -0
- package/dist/chunk-MMRIQNEN.js.map +1 -0
- package/dist/chunk-MXOPCFWR.js +59 -0
- package/dist/chunk-MXOPCFWR.js.map +1 -0
- package/dist/chunk-NEF5XAHG.js +17 -0
- package/dist/chunk-NEF5XAHG.js.map +1 -0
- package/dist/chunk-NNXJCLTV.js +22 -0
- package/dist/chunk-NNXJCLTV.js.map +1 -0
- package/dist/chunk-O4N2OBTR.js +94 -0
- package/dist/chunk-O4N2OBTR.js.map +1 -0
- package/dist/chunk-PMECHR3A.js +38 -0
- package/dist/chunk-PMECHR3A.js.map +1 -0
- package/dist/chunk-QDK66S4G.js +44 -0
- package/dist/chunk-QDK66S4G.js.map +1 -0
- package/dist/chunk-QGNC7LH5.js +8 -0
- package/dist/chunk-QGNC7LH5.js.map +1 -0
- package/dist/chunk-QMSJZCK3.js +398 -0
- package/dist/chunk-QMSJZCK3.js.map +1 -0
- package/dist/chunk-S5ZTZANS.js +57 -0
- package/dist/chunk-S5ZTZANS.js.map +1 -0
- package/dist/chunk-S7B34VGN.js +14 -0
- package/dist/chunk-S7B34VGN.js.map +1 -0
- package/dist/chunk-TCUCYFT7.js +25 -0
- package/dist/chunk-TCUCYFT7.js.map +1 -0
- package/dist/chunk-TYHR4VNM.js +193 -0
- package/dist/chunk-TYHR4VNM.js.map +1 -0
- package/dist/chunk-U5QQZC3U.js +56 -0
- package/dist/chunk-U5QQZC3U.js.map +1 -0
- package/dist/chunk-UE63OOVG.js +13 -0
- package/dist/chunk-UE63OOVG.js.map +1 -0
- package/dist/chunk-VTJTGVZZ.js +22 -0
- package/dist/chunk-VTJTGVZZ.js.map +1 -0
- package/dist/chunk-W3SHPKSB.js +49 -0
- package/dist/chunk-W3SHPKSB.js.map +1 -0
- package/dist/chunk-XZAEIQDR.js +188 -0
- package/dist/chunk-XZAEIQDR.js.map +1 -0
- package/dist/chunk-YGGCQNNU.js +92 -0
- package/dist/chunk-YGGCQNNU.js.map +1 -0
- package/dist/collapse.css +88 -0
- package/dist/collapse.d.ts +46 -0
- package/dist/collapse.js +5 -0
- package/dist/collapse.js.map +1 -0
- package/dist/count-badge.d.ts +13 -0
- package/dist/count-badge.js +13 -0
- package/dist/count-badge.js.map +1 -0
- package/dist/date-field.d.ts +25 -0
- package/dist/date-field.js +87 -0
- package/dist/date-field.js.map +1 -0
- package/dist/date-picker.css +595 -0
- package/dist/date-range-field.d.ts +33 -0
- package/dist/date-range-field.js +404 -0
- package/dist/date-range-field.js.map +1 -0
- package/dist/datetime-field.d.ts +29 -0
- package/dist/datetime-field.js +155 -0
- package/dist/datetime-field.js.map +1 -0
- package/dist/dialog.css +180 -0
- package/dist/dialog.d.ts +42 -0
- package/dist/dialog.js +128 -0
- package/dist/dialog.js.map +1 -0
- package/dist/dom-props-C0jrllBw.d.ts +5 -0
- package/dist/field-chrome-CMPOQSLs.d.ts +28 -0
- package/dist/field-shell-Cuda-feL.d.ts +24 -0
- package/dist/glide.d.ts +15 -0
- package/dist/glide.js +5 -0
- package/dist/glide.js.map +1 -0
- package/dist/icon.css +33 -0
- package/dist/input.css +333 -0
- package/dist/mcp.js +359 -0
- package/dist/motion-devtools.css +265 -0
- package/dist/motion-devtools.d.ts +51 -0
- package/dist/motion-devtools.js +354 -0
- package/dist/motion-devtools.js.map +1 -0
- package/dist/motion-scale-Canq4stZ.d.ts +18 -0
- package/dist/motion-tokens.d.ts +28 -0
- package/dist/motion-tokens.js +3 -0
- package/dist/motion-tokens.js.map +1 -0
- package/dist/multi-select.d.ts +44 -0
- package/dist/multi-select.js +109 -0
- package/dist/multi-select.js.map +1 -0
- package/dist/number-field.d.ts +36 -0
- package/dist/number-field.js +112 -0
- package/dist/number-field.js.map +1 -0
- package/dist/odometer.css +62 -0
- package/dist/otp-field.d.ts +31 -0
- package/dist/otp-field.js +98 -0
- package/dist/otp-field.js.map +1 -0
- package/dist/overlay.css +23 -0
- package/dist/pagination.css +43 -0
- package/dist/pagination.d.ts +29 -0
- package/dist/pagination.js +107 -0
- package/dist/pagination.js.map +1 -0
- package/dist/popover.css +69 -0
- package/dist/popover.d.ts +35 -0
- package/dist/popover.js +15 -0
- package/dist/popover.js.map +1 -0
- package/dist/radio-group.css +300 -0
- package/dist/radio-group.d.ts +52 -0
- package/dist/radio-group.js +115 -0
- package/dist/radio-group.js.map +1 -0
- package/dist/select.css +416 -0
- package/dist/select.d.ts +49 -0
- package/dist/select.js +99 -0
- package/dist/select.js.map +1 -0
- package/dist/sheet.css +26 -0
- package/dist/sheet.d.ts +31 -0
- package/dist/sheet.js +14 -0
- package/dist/sheet.js.map +1 -0
- package/dist/status-badge.d.ts +19 -0
- package/dist/status-badge.js +72 -0
- package/dist/status-badge.js.map +1 -0
- package/dist/table.css +348 -0
- package/dist/table.d.ts +75 -0
- package/dist/table.js +262 -0
- package/dist/table.js.map +1 -0
- package/dist/tabs.css +208 -0
- package/dist/tabs.d.ts +71 -0
- package/dist/tabs.js +181 -0
- package/dist/tabs.js.map +1 -0
- package/dist/tag.css +248 -0
- package/dist/tag.d.ts +52 -0
- package/dist/tag.js +72 -0
- package/dist/tag.js.map +1 -0
- package/dist/text-field.d.ts +28 -0
- package/dist/text-field.js +69 -0
- package/dist/text-field.js.map +1 -0
- package/dist/textarea.css +219 -0
- package/dist/textarea.d.ts +38 -0
- package/dist/textarea.js +144 -0
- package/dist/textarea.js.map +1 -0
- package/dist/time-field.d.ts +28 -0
- package/dist/time-field.js +66 -0
- package/dist/time-field.js.map +1 -0
- package/dist/timing-7JA_zQHP.d.ts +27 -0
- package/dist/toast-store.d.ts +86 -0
- package/dist/toast-store.js +3 -0
- package/dist/toast-store.js.map +1 -0
- package/dist/toast.css +257 -0
- package/dist/toast.d.ts +12 -0
- package/dist/toast.js +310 -0
- package/dist/toast.js.map +1 -0
- package/dist/toggle-tag.d.ts +34 -0
- package/dist/toggle-tag.js +57 -0
- package/dist/toggle-tag.js.map +1 -0
- package/dist/toggle.css +152 -0
- package/dist/toggle.d.ts +31 -0
- package/dist/toggle.js +75 -0
- package/dist/toggle.js.map +1 -0
- package/dist/tooltip.css +86 -0
- package/dist/tooltip.d.ts +30 -0
- package/dist/tooltip.js +268 -0
- package/dist/tooltip.js.map +1 -0
- package/dist/types-SGMShK7R.d.ts +22 -0
- package/llms.txt +196 -0
- package/next.d.mts +7 -0
- package/next.mjs +59 -0
- package/package.json +257 -0
- package/src/components/composites/alert/Alert.tsx +141 -0
- package/src/components/composites/alert/alert.css +132 -0
- package/src/components/composites/date-picker/DateField.tsx +80 -0
- package/src/components/composites/date-picker/DateRangeField.tsx +110 -0
- package/src/components/composites/date-picker/DateTimeField.tsx +162 -0
- package/src/components/composites/date-picker/TimeField.tsx +78 -0
- package/src/components/composites/date-picker/calendar-panel.tsx +216 -0
- package/src/components/composites/date-picker/date-picker.css +595 -0
- package/src/components/composites/date-picker/date-utils.ts +56 -0
- package/src/components/composites/date-picker/field-shell.tsx +85 -0
- package/src/components/composites/date-picker/range-panel.tsx +363 -0
- package/src/components/composites/date-picker/time-core.tsx +290 -0
- package/src/components/composites/date-picker/use-day-focus.ts +35 -0
- package/src/components/composites/dialog/Dialog.tsx +198 -0
- package/src/components/composites/dialog/dialog.css +180 -0
- package/src/components/composites/pagination/Pagination.tsx +131 -0
- package/src/components/composites/pagination/pagination.css +43 -0
- package/src/components/composites/popover/Popover.tsx +141 -0
- package/src/components/composites/popover/popover.css +69 -0
- package/src/components/composites/select/MultiSelect.tsx +133 -0
- package/src/components/composites/select/Select.tsx +122 -0
- package/src/components/composites/select/core/index.ts +4 -0
- package/src/components/composites/select/core/menu.tsx +100 -0
- package/src/components/composites/select/core/panel.tsx +154 -0
- package/src/components/composites/select/core/trigger.tsx +74 -0
- package/src/components/composites/select/core/types.ts +39 -0
- package/src/components/composites/select/core/use-listbox.ts +182 -0
- package/src/components/composites/select/select.css +416 -0
- package/src/components/composites/sheet/Sheet.tsx +135 -0
- package/src/components/composites/sheet/sheet.css +26 -0
- package/src/components/composites/sheet/use-sheet-drag.ts +126 -0
- package/src/components/composites/table/Table.tsx +377 -0
- package/src/components/composites/table/table.css +348 -0
- package/src/components/composites/tabs/Tabs.tsx +278 -0
- package/src/components/composites/tabs/tabs.css +208 -0
- package/src/components/composites/toast/Toast.tsx +380 -0
- package/src/components/composites/toast/toast-store.ts +295 -0
- package/src/components/composites/toast/toast.css +257 -0
- package/src/components/composites/tooltip/Tooltip.tsx +110 -0
- package/src/components/composites/tooltip/tooltip-host.tsx +184 -0
- package/src/components/composites/tooltip/tooltip-store.ts +81 -0
- package/src/components/composites/tooltip/tooltip.css +86 -0
- package/src/components/dev/MotionDevtools.tsx +200 -0
- package/src/components/dev/motion-devtools.css +265 -0
- package/src/components/dev/slowmo-engine.ts +230 -0
- package/src/components/internal/glass/glass.css +100 -0
- package/src/components/internal/glass/glint.ts +9 -0
- package/src/components/internal/hooks/use-controllable.ts +21 -0
- package/src/components/internal/hooks/use-scroll-edges.ts +46 -0
- package/src/components/internal/icon/Icon.tsx +66 -0
- package/src/components/internal/icon/IconSlot.tsx +10 -0
- package/src/components/internal/icon/icon.css +33 -0
- package/src/components/internal/overlay/focus.ts +68 -0
- package/src/components/internal/overlay/layer.tsx +149 -0
- package/src/components/internal/overlay/modal.tsx +141 -0
- package/src/components/internal/overlay/overlay.css +23 -0
- package/src/components/internal/overlay/position.ts +103 -0
- package/src/components/internal/utils/cx.ts +3 -0
- package/src/components/internal/utils/token-px.ts +8 -0
- package/src/components/primitives/avatar/Avatar.tsx +120 -0
- package/src/components/primitives/avatar/AvatarGroup.tsx +56 -0
- package/src/components/primitives/avatar/avatar.css +200 -0
- package/src/components/primitives/badge/Badge.tsx +75 -0
- package/src/components/primitives/badge/CountBadge.tsx +20 -0
- package/src/components/primitives/badge/StatusBadge.tsx +111 -0
- package/src/components/primitives/badge/badge.css +182 -0
- package/src/components/primitives/badge/odometer.css +62 -0
- package/src/components/primitives/badge/odometer.tsx +36 -0
- package/src/components/primitives/button/Button.tsx +102 -0
- package/src/components/primitives/button/button.css +269 -0
- package/src/components/primitives/checkbox/Checkbox.tsx +76 -0
- package/src/components/primitives/checkbox/check-glyph.tsx +28 -0
- package/src/components/primitives/checkbox/checkbox.css +177 -0
- package/src/components/primitives/collapse/Collapse.tsx +86 -0
- package/src/components/primitives/collapse/collapse.css +88 -0
- package/src/components/primitives/collapse/collapse.typecheck.tsx +29 -0
- package/src/components/primitives/input/NumberField.tsx +139 -0
- package/src/components/primitives/input/OtpField.tsx +134 -0
- package/src/components/primitives/input/TextField.tsx +110 -0
- package/src/components/primitives/input/field-chrome.tsx +83 -0
- package/src/components/primitives/input/input.css +333 -0
- package/src/components/primitives/radio-group/RadioGroup.tsx +183 -0
- package/src/components/primitives/radio-group/radio-group.css +300 -0
- package/src/components/primitives/tag/Tag.tsx +143 -0
- package/src/components/primitives/tag/ToggleTag.tsx +97 -0
- package/src/components/primitives/tag/tag.css +248 -0
- package/src/components/primitives/textarea/Textarea.tsx +190 -0
- package/src/components/primitives/textarea/textarea.css +219 -0
- package/src/components/primitives/toggle/Toggle.tsx +105 -0
- package/src/components/primitives/toggle/toggle.css +152 -0
- package/src/css.d.ts +1 -0
- package/src/dom-props.ts +1 -0
- package/src/engine/animate.ts +141 -0
- package/src/engine/drag.ts +53 -0
- package/src/engine/ease.ts +155 -0
- package/src/engine/flip.ts +59 -0
- package/src/engine/index.ts +13 -0
- package/src/mcp/server.ts +420 -0
- package/src/motion/element.tsx +53 -0
- package/src/motion/flip.tsx +87 -0
- package/src/motion/glide.tsx +47 -0
- package/src/motion/motion-timing.ts +33 -0
- package/src/motion/presence-context.ts +18 -0
- package/src/motion/presence.tsx +91 -0
- package/src/motion/timing.ts +49 -0
- package/src/motion/use-motion.ts +64 -0
- package/src/styles.css +26 -0
- package/src/tokens/avatar.css +20 -0
- package/src/tokens/color.css +58 -0
- package/src/tokens/elevation.css +22 -0
- package/src/tokens/fonts.css +3 -0
- package/src/tokens/glass.css +20 -0
- package/src/tokens/icons.css +7 -0
- package/src/tokens/layers.css +6 -0
- package/src/tokens/motion-scale.ts +17 -0
- package/src/tokens/motion-tokens.ts +92 -0
- package/src/tokens/motion.css +49 -0
- package/src/tokens/radius.css +11 -0
- package/src/tokens/semantic.css +65 -0
- package/src/tokens/spacing.css +26 -0
- package/src/tokens/typography.css +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/date-picker/time-core.tsx"],"names":[],"mappings":"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","file":"chunk-64UU4LGU.js","sourcesContent":["'use client';\n\nimport './date-picker.css';\nimport { useEffect, useRef, useState, type ClipboardEvent, type KeyboardEvent, type RefObject } from 'react';\nimport { cx } from '../../internal/utils/cx';\nimport { pad } from './date-utils';\n\ntype Meridiem = 'AM' | 'PM';\ntype Segment = 'h' | 'm';\ninterface Pending {\n seg: Segment;\n d: number;\n}\n\nexport interface TimeSegmentsProps {\n value?: string | null;\n onCommit?: (value: string) => void;\n format?: '24h' | '12h';\n minuteStep?: number;\n min?: string | null;\n max?: string | null;\n disabled?: boolean;\n ariaLabel?: string;\n className?: string;\n}\n\nexport const disp12 = (h24: number): number => ((h24 + 11) % 12) + 1;\nconst tsgToH24 = (d12: number, mer: Meridiem): number => (d12 % 12) + (mer === 'PM' ? 12 : 0);\n\nfunction tsgFeed(pend: number | null, d: number, hi: number): { val: number; done: boolean } {\n if (pend != null) {\n const n = pend * 10 + d;\n if (n <= hi) return { val: n, done: true };\n }\n return { val: d, done: d * 10 > hi };\n}\n\nexport function TimeSegments({\n value = null,\n onCommit,\n format = '24h',\n minuteStep = 5,\n min = null,\n max = null,\n disabled = false,\n ariaLabel = 'Time',\n className = '',\n}: TimeSegmentsProps) {\n const is12 = format === '12h';\n const seed = value ? value.split(':').map(Number) : [null, null];\n\n const [h, setHState] = useState<number | null>(seed[0]);\n const [m, setMState] = useState<number | null>(seed[1]);\n const [mer, setMer] = useState<Meridiem>(seed[0] != null && seed[0] >= 12 ? 'PM' : 'AM');\n const [pend, setPendState] = useState<Pending | null>(null);\n\n const hLive = useRef<number | null>(seed[0]);\n const mLive = useRef<number | null>(seed[1]);\n const pendLive = useRef<Pending | null>(null);\n const setH = (v: number | null) => {\n hLive.current = v;\n setHState(v);\n };\n const setM = (v: number | null) => {\n mLive.current = v;\n setMState(v);\n };\n const setPend = (v: Pending | null) => {\n pendLive.current = v;\n setPendState(v);\n };\n\n const hRef = useRef<HTMLSpanElement>(null);\n const mRef = useRef<HTMLSpanElement>(null);\n const merRef = useRef<HTMLSpanElement>(null);\n const lastRef = useRef<string | null>(value || null);\n\n useEffect(() => {\n if ((value || null) === lastRef.current) return;\n lastRef.current = value || null;\n const p = value ? value.split(':').map(Number) : [null, null];\n setH(p[0]);\n setM(p[1]);\n if (p[0] != null) setMer(p[0] >= 12 ? 'PM' : 'AM');\n setPend(null);\n }, [value]);\n\n function tryCommit(nh: number | null, nm: number | null) {\n if (nh == null || nm == null) return;\n let t = pad(nh) + ':' + pad(nm);\n if (min && t < min) t = min;\n if (max && t > max) t = max;\n const p = t.split(':').map(Number);\n if (p[0] !== nh) {\n setH(p[0]);\n setMer(p[0] >= 12 ? 'PM' : 'AM');\n setPend(null);\n }\n if (p[1] !== nm) setM(p[1]);\n if (t === lastRef.current) return;\n lastRef.current = t;\n if (onCommit) onCommit(t);\n }\n\n const focusSeg = (r: RefObject<HTMLSpanElement | null>) => {\n if (r.current) r.current.focus();\n };\n\n function onHKey(e: KeyboardEvent<HTMLSpanElement>) {\n const k = e.key;\n if (/^[0-9]$/.test(k)) {\n const pd = pend && pend.seg === 'h' ? pend.d : null;\n const r = tsgFeed(pd, +k, is12 ? 12 : 23);\n const nh = is12 ? tsgToH24(r.val === 0 ? 12 : r.val, mer) : r.val;\n setH(nh);\n if (!is12) setMer(nh >= 12 ? 'PM' : 'AM');\n setPend(r.done ? null : { seg: 'h', d: r.val });\n if (r.done) {\n focusSeg(mRef);\n tryCommit(nh, mLive.current);\n }\n } else if (k === 'ArrowUp' || k === 'ArrowDown') {\n const dir = k === 'ArrowUp' ? 1 : -1;\n const nh = h == null ? new Date().getHours() : (h + dir + 24) % 24;\n setH(nh);\n setMer(nh >= 12 ? 'PM' : 'AM');\n setPend(null);\n tryCommit(nh, mLive.current);\n } else if (k === 'Backspace' || k === 'Delete') {\n setH(null);\n setPend(null);\n } else if (k === 'ArrowRight' || k === ':' || k === ';') {\n focusSeg(mRef);\n } else if (k === 'Tab') {\n return;\n } else if (k.length === 1 && !e.metaKey && !e.ctrlKey) {\n } else return;\n e.preventDefault();\n }\n\n function onMKey(e: KeyboardEvent<HTMLSpanElement>) {\n const k = e.key;\n if (/^[0-9]$/.test(k)) {\n const pd = pend && pend.seg === 'm' ? pend.d : null;\n const r = tsgFeed(pd, +k, 59);\n setM(r.val);\n setPend(r.done ? null : { seg: 'm', d: r.val });\n if (r.done) {\n if (is12) focusSeg(merRef);\n tryCommit(hLive.current, r.val);\n }\n } else if (k === 'ArrowUp' || k === 'ArrowDown') {\n const dir = k === 'ArrowUp' ? 1 : -1;\n let nm;\n if (m == null) {\n nm = (Math.round(new Date().getMinutes() / minuteStep) * minuteStep) % 60;\n } else {\n const next =\n dir > 0 ? (Math.floor(m / minuteStep) + 1) * minuteStep : (Math.ceil(m / minuteStep) - 1) * minuteStep;\n nm = ((next % 60) + 60) % 60;\n }\n setM(nm);\n setPend(null);\n tryCommit(hLive.current, nm);\n } else if (k === 'Backspace' || k === 'Delete') {\n if (m == null && !(pend && pend.seg === 'm')) {\n focusSeg(hRef);\n } else {\n setM(null);\n setPend(null);\n }\n } else if (k === 'ArrowLeft') {\n focusSeg(hRef);\n } else if (k === 'ArrowRight' && is12) {\n focusSeg(merRef);\n } else if (k === 'Tab') {\n return;\n } else if (k.length === 1 && !e.metaKey && !e.ctrlKey) {\n } else return;\n e.preventDefault();\n }\n\n function setMeridiem(next: Meridiem) {\n setMer(next);\n if (h != null) {\n const nh = tsgToH24(disp12(h), next);\n setH(nh);\n tryCommit(nh, mLive.current);\n }\n }\n function onMerKey(e: KeyboardEvent<HTMLSpanElement>) {\n const k = e.key;\n if (k === 'a' || k === 'A') setMeridiem('AM');\n else if (k === 'p' || k === 'P') setMeridiem('PM');\n else if (k === 'ArrowUp' || k === 'ArrowDown') setMeridiem(mer === 'AM' ? 'PM' : 'AM');\n else if (k === 'ArrowLeft') focusSeg(mRef);\n else if (k === 'Tab') {\n return;\n } else if (k.length === 1 && !e.metaKey && !e.ctrlKey) {\n } else return;\n e.preventDefault();\n }\n\n function onPaste(e: ClipboardEvent<HTMLDivElement>) {\n if (disabled) return;\n const txt = (e.clipboardData.getData('text') || '').trim();\n const mt = txt.match(/^(\\d{1,2})[:h.\\s]?(\\d{2})?\\s*([ap])\\.?m?\\.?$/i) || txt.match(/^(\\d{1,2})[:h.\\s]?(\\d{2})?$/);\n if (!mt) return;\n e.preventDefault();\n let hh = +mt[1];\n const mm = mt[2] != null ? +mt[2] : 0;\n if (mt[3]) hh = tsgToH24(hh, /^p/i.test(mt[3]) ? 'PM' : 'AM');\n if (hh > 23 || mm > 59) return;\n setH(hh);\n setM(mm);\n setMer(hh >= 12 ? 'PM' : 'AM');\n setPend(null);\n tryCommit(hh, mm);\n }\n\n const onSegBlur = (seg: Segment) => () => {\n if (pendLive.current && pendLive.current.seg === seg) {\n setPend(null);\n tryCommit(hLive.current, mLive.current);\n }\n };\n\n const hText = pend && pend.seg === 'h' ? pad(pend.d) : h == null ? '--' : pad(is12 ? disp12(h) : h);\n const mText = pend && pend.seg === 'm' ? pad(pend.d) : m == null ? '--' : pad(m);\n\n const segCls = (empty: boolean): string => 'tsg__seg' + (empty ? ' is-empty' : '');\n const tab = disabled ? -1 : 0;\n\n return (\n <div\n className={cx('tsg', disabled && 'is-disabled', className)}\n role=\"group\"\n aria-label={ariaLabel}\n aria-disabled={disabled || undefined}\n onPaste={onPaste}\n >\n <span\n ref={hRef}\n className={segCls(h == null && !(pend && pend.seg === 'h'))}\n role=\"spinbutton\"\n tabIndex={tab}\n aria-label=\"Hours\"\n aria-valuemin={is12 ? 1 : 0}\n aria-valuemax={is12 ? 12 : 23}\n aria-valuenow={h == null ? undefined : is12 ? disp12(h) : h}\n aria-valuetext={h == null ? 'Empty' : hText}\n onKeyDown={disabled ? undefined : onHKey}\n onBlur={onSegBlur('h')}\n >\n {hText}\n </span>\n <span className=\"tsg__sep\" aria-hidden=\"true\">\n :\n </span>\n <span\n ref={mRef}\n className={segCls(m == null && !(pend && pend.seg === 'm'))}\n role=\"spinbutton\"\n tabIndex={tab}\n aria-label=\"Minutes\"\n aria-valuemin={0}\n aria-valuemax={59}\n aria-valuenow={m == null ? undefined : m}\n aria-valuetext={m == null ? 'Empty' : mText}\n onKeyDown={disabled ? undefined : onMKey}\n onBlur={onSegBlur('m')}\n >\n {mText}\n </span>\n {is12 ? (\n <span\n ref={merRef}\n className=\"tsg__seg tsg__seg--mer\"\n role=\"spinbutton\"\n tabIndex={tab}\n aria-label=\"AM or PM\"\n aria-valuetext={mer}\n onKeyDown={disabled ? undefined : onMerKey}\n >\n {mer}\n </span>\n ) : null}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use client';import { timingVars } from './chunk-VTJTGVZZ.js';
|
|
2
|
+
import { cx } from './chunk-QGNC7LH5.js';
|
|
3
|
+
import './collapse.css';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function Collapse({
|
|
7
|
+
open = false,
|
|
8
|
+
axis = "height",
|
|
9
|
+
fade = false,
|
|
10
|
+
animation,
|
|
11
|
+
className = "",
|
|
12
|
+
innerClassName = "",
|
|
13
|
+
style,
|
|
14
|
+
children,
|
|
15
|
+
as: As = "div",
|
|
16
|
+
htmlProps
|
|
17
|
+
}) {
|
|
18
|
+
const cls = cx("collapse", fade && "collapse--fade", className);
|
|
19
|
+
const vars = timingVars("collapse", animation);
|
|
20
|
+
return /* @__PURE__ */ jsx(
|
|
21
|
+
"div",
|
|
22
|
+
{
|
|
23
|
+
className: cls,
|
|
24
|
+
"data-open": open ? "true" : "false",
|
|
25
|
+
"data-axis": axis,
|
|
26
|
+
style: vars || style ? { ...style, ...vars } : void 0,
|
|
27
|
+
...htmlProps,
|
|
28
|
+
children: /* @__PURE__ */ jsx(As, { className: cx("collapse__inner", innerClassName), style: vars, children })
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { Collapse };
|
|
34
|
+
//# sourceMappingURL=chunk-7SZCJ7WI.js.map
|
|
35
|
+
//# sourceMappingURL=chunk-7SZCJ7WI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/collapse/Collapse.tsx"],"names":[],"mappings":";;;;;AAwDO,SAAS,QAAA,CAAS;AAAA,EACvB,IAAA,GAAO,KAAA;AAAA,EACP,IAAA,GAAO,QAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,SAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,cAAA,GAAiB,EAAA;AAAA,EACjB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAI,EAAA,GAAK,KAAA;AAAA,EACT;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,UAAA,EAAY,IAAA,IAAQ,kBAAkB,SAAS,CAAA;AAE9D,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,UAAA,EAAY,SAAS,CAAA;AAE7C,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,GAAA;AAAA,MACX,WAAA,EAAW,OAAO,MAAA,GAAS,OAAA;AAAA,MAC3B,WAAA,EAAW,IAAA;AAAA,MACX,KAAA,EAAO,QAAQ,KAAA,GAAS,EAAE,GAAG,KAAA,EAAO,GAAG,MAAK,GAAsB,MAAA;AAAA,MACjE,GAAG,SAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA,CAAC,MAAG,SAAA,EAAW,EAAA,CAAG,mBAAmB,cAAc,CAAA,EAAG,KAAA,EAAO,IAAA,EAC1D,QAAA,EACH;AAAA;AAAA,GACF;AAEJ","file":"chunk-7SZCJ7WI.js","sourcesContent":["'use client';\n\nimport './collapse.css';\nimport type { CSSProperties, HTMLAttributes, JSX, ReactNode } from 'react';\nimport type { DataAttributes } from '../../../dom-props';\nimport type { DurationToken, EaseToken } from '../../../tokens/motion-scale';\nimport {\n timingVars,\n type AnimationTiming,\n type DirectionalToken,\n type DisableableAnimation,\n type TimingProps,\n} from '../../../motion/timing';\nimport { cx } from '../../internal/utils/cx';\n\n/** Motion-scale duration tokens - the only values Collapse timing accepts. */\nexport type CollapseDuration = DurationToken;\n/** Motion-scale ease tokens - the only values Collapse timing accepts. */\nexport type CollapseEase = EaseToken;\n/** One token for both directions, or split per direction; an omitted direction keeps its default. */\nexport type CollapseTiming<Token extends string> = DirectionalToken<Token>;\n/** Grouped `{ duration, ease }` timing for the size/fade transition. */\nexport type CollapseAnimation = AnimationTiming;\n\ninterface CollapseOwnProps extends TimingProps {\n /** Open/closed state. Closed content is also removed from the tab order, the accessibility\n * tree and hit-testing once the exit transition completes; reopening restores it before\n * the entrance runs. */\n open?: boolean;\n /** Axis to animate. @default 'height' */\n axis?: 'height' | 'width';\n /** Also cross-fade contents while resizing; follows `duration` / `ease`. */\n fade?: boolean;\n /** Class applied to the inner measured wrapper - the clipping element (overflow: hidden).\n * Content whose focus ring sits flush to its edge needs padding there, or the ring clips. */\n innerClassName?: string;\n /** Size (and fade) transition timing - motion tokens only, each field one token or\n * `{ open, close }`, e.g. `{ duration: { close: 'fast' }, ease: { close: 'exit' } }`.\n * `null` disables the transition (open/close snap instantly).\n * @default duration 'slow' + ease 'entrance' (fade-out: 'base' + 'standard') */\n animation?: DisableableAnimation;\n /** Tag to render as. @default 'div' */\n as?: keyof JSX.IntrinsicElements;\n /** Extra class(es) merged onto the root. */\n className?: string;\n /** Inline styles merged onto the root (composed with the timing custom properties). */\n style?: CSSProperties;\n /** The collapsing content. */\n children?: ReactNode;\n}\n\nexport interface CollapseProps extends CollapseOwnProps {\n /** Standard <div> attributes (aria-*, data-*, ...) forwarded to the root. */\n htmlProps?: Omit<HTMLAttributes<HTMLDivElement>, keyof CollapseOwnProps> & DataAttributes;\n}\n\nexport function Collapse({\n open = false,\n axis = 'height',\n fade = false,\n animation,\n className = '',\n innerClassName = '',\n style,\n children,\n as: As = 'div',\n htmlProps,\n}: CollapseProps) {\n const cls = cx('collapse', fade && 'collapse--fade', className);\n\n const vars = timingVars('collapse', animation);\n\n return (\n <div\n className={cls}\n data-open={open ? 'true' : 'false'}\n data-axis={axis}\n style={vars || style ? ({ ...style, ...vars } as CSSProperties) : undefined}\n {...htmlProps}\n >\n <As className={cx('collapse__inner', innerClassName)} style={vars}>\n {children}\n </As>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use client';import { useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/components/internal/hooks/use-scroll-edges.ts
|
|
4
|
+
function useScrollEdges(ref, onChange, { content = false } = {}) {
|
|
5
|
+
const cb = useRef(onChange);
|
|
6
|
+
cb.current = onChange;
|
|
7
|
+
const sync = useCallback(() => {
|
|
8
|
+
const el = ref.current;
|
|
9
|
+
if (!el) return;
|
|
10
|
+
cb.current(
|
|
11
|
+
{
|
|
12
|
+
top: el.scrollTop > 1,
|
|
13
|
+
bottom: el.scrollTop + el.clientHeight < el.scrollHeight - 1,
|
|
14
|
+
left: el.scrollLeft > 1,
|
|
15
|
+
right: el.scrollLeft + el.clientWidth < el.scrollWidth - 1
|
|
16
|
+
},
|
|
17
|
+
el
|
|
18
|
+
);
|
|
19
|
+
}, [ref]);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const el = ref.current;
|
|
22
|
+
if (!el) return void 0;
|
|
23
|
+
sync();
|
|
24
|
+
el.addEventListener("scroll", sync, { passive: true });
|
|
25
|
+
const ro = new ResizeObserver(sync);
|
|
26
|
+
ro.observe(el);
|
|
27
|
+
if (content && el.firstElementChild) ro.observe(el.firstElementChild);
|
|
28
|
+
return () => {
|
|
29
|
+
el.removeEventListener("scroll", sync);
|
|
30
|
+
ro.disconnect();
|
|
31
|
+
};
|
|
32
|
+
}, [sync, content]);
|
|
33
|
+
return sync;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { useScrollEdges };
|
|
37
|
+
//# sourceMappingURL=chunk-BIDVNLJO.js.map
|
|
38
|
+
//# sourceMappingURL=chunk-BIDVNLJO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/internal/hooks/use-scroll-edges.ts"],"names":[],"mappings":";;;AAWO,SAAS,cAAA,CACd,KACA,QAAA,EACA,EAAE,UAAU,KAAA,EAAM,GAA2B,EAAC,EAClC;AACZ,EAAA,MAAM,EAAA,GAAK,OAAO,QAAQ,CAAA;AAC1B,EAAA,EAAA,CAAG,OAAA,GAAU,QAAA;AACb,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,EAAA,CAAG,OAAA;AAAA,MACD;AAAA,QACE,GAAA,EAAK,GAAG,SAAA,GAAY,CAAA;AAAA,QACpB,QAAQ,EAAA,CAAG,SAAA,GAAY,EAAA,CAAG,YAAA,GAAe,GAAG,YAAA,GAAe,CAAA;AAAA,QAC3D,IAAA,EAAM,GAAG,UAAA,GAAa,CAAA;AAAA,QACtB,OAAO,EAAA,CAAG,UAAA,GAAa,EAAA,CAAG,WAAA,GAAc,GAAG,WAAA,GAAc;AAAA,OAC3D;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACR,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,IAAI,OAAO,MAAA;AAChB,IAAA,IAAA,EAAK;AACL,IAAA,EAAA,CAAG,iBAAiB,QAAA,EAAU,IAAA,EAAM,EAAE,OAAA,EAAS,MAAM,CAAA;AACrD,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,IAAI,CAAA;AAClC,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,IAAI,WAAW,EAAA,CAAG,iBAAA,EAAmB,EAAA,CAAG,OAAA,CAAQ,GAAG,iBAAiB,CAAA;AACpE,IAAA,OAAO,MAAM;AACX,MAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,IAAI,CAAA;AACrC,MAAA,EAAA,CAAG,UAAA,EAAW;AAAA,IAChB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAClB,EAAA,OAAO,IAAA;AACT","file":"chunk-BIDVNLJO.js","sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef, type RefObject } from 'react';\n\nexport interface ScrollEdges {\n top: boolean;\n bottom: boolean;\n left: boolean;\n right: boolean;\n}\n\nexport function useScrollEdges(\n ref: RefObject<HTMLElement | null>,\n onChange: (edges: ScrollEdges, el: HTMLElement) => void,\n { content = false }: { content?: boolean } = {},\n): () => void {\n const cb = useRef(onChange);\n cb.current = onChange;\n const sync = useCallback(() => {\n const el = ref.current;\n if (!el) return;\n cb.current(\n {\n top: el.scrollTop > 1,\n bottom: el.scrollTop + el.clientHeight < el.scrollHeight - 1,\n left: el.scrollLeft > 1,\n right: el.scrollLeft + el.clientWidth < el.scrollWidth - 1,\n },\n el,\n );\n }, [ref]);\n useEffect(() => {\n const el = ref.current;\n if (!el) return undefined;\n sync();\n el.addEventListener('scroll', sync, { passive: true });\n const ro = new ResizeObserver(sync);\n ro.observe(el);\n if (content && el.firstElementChild) ro.observe(el.firstElementChild);\n return () => {\n el.removeEventListener('scroll', sync);\n ro.disconnect();\n };\n }, [sync, content]);\n return sync;\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use client';import './odometer.css';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/components/primitives/badge/odometer.tsx
|
|
5
|
+
function Digit({ d }) {
|
|
6
|
+
return /* @__PURE__ */ jsx("span", { className: "odo__col", "aria-hidden": "true", children: /* @__PURE__ */ jsx("span", { className: "odo__strip odo__strip--" + d, children: Array.from({ length: 10 }, (_, i) => /* @__PURE__ */ jsx("span", { children: i }, i)) }) });
|
|
7
|
+
}
|
|
8
|
+
function Odometer({ value }) {
|
|
9
|
+
const str = String(value);
|
|
10
|
+
return /* @__PURE__ */ jsx("span", { className: "odo", role: "text", "aria-label": str, children: str.split("").map(
|
|
11
|
+
(ch, i) => /\d/.test(ch) ? /* @__PURE__ */ jsx(Digit, { d: Number(ch) }, i) : /* @__PURE__ */ jsx("span", { className: "odo__fixed", "aria-hidden": "true", children: ch }, i)
|
|
12
|
+
) });
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { Odometer };
|
|
16
|
+
//# sourceMappingURL=chunk-CONSWNIV.js.map
|
|
17
|
+
//# sourceMappingURL=chunk-CONSWNIV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/badge/odometer.tsx"],"names":[],"mappings":";;;;AAIA,SAAS,KAAA,CAAM,EAAE,CAAA,EAAE,EAAkB;AACnC,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,aAAA,EAAY,MAAA,EACrC,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,yBAAA,GAA4B,CAAA,EAC1C,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAC,CAAA,EAAG,CAAA,qBAC9B,GAAA,CAAC,MAAA,EAAA,EAAc,QAAA,EAAA,CAAA,EAAA,EAAJ,CAAM,CAClB,CAAA,EACH,CAAA,EACF,CAAA;AAEJ;AAMO,SAAS,QAAA,CAAS,EAAE,KAAA,EAAM,EAAkB;AACjD,EAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,YAAA,EAAY,GAAA,EAC3C,QAAA,EAAA,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA;AAAA,IAAI,CAAC,IAAI,CAAA,KACtB,IAAA,CAAK,KAAK,EAAE,CAAA,mBACV,GAAA,CAAC,KAAA,EAAA,EAAc,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA,EAAA,EAAf,CAAkB,oBAE9B,GAAA,CAAC,MAAA,EAAA,EAAa,WAAU,YAAA,EAAa,aAAA,EAAY,MAAA,EAC9C,QAAA,EAAA,EAAA,EAAA,EADQ,CAEX;AAAA,GAEJ,EACF,CAAA;AAEJ","file":"chunk-CONSWNIV.js","sourcesContent":["'use client';\n\nimport './odometer.css';\n\nfunction Digit({ d }: { d: number }) {\n return (\n <span className=\"odo__col\" aria-hidden=\"true\">\n <span className={'odo__strip odo__strip--' + d}>\n {Array.from({ length: 10 }, (_, i) => (\n <span key={i}>{i}</span>\n ))}\n </span>\n </span>\n );\n}\n\nexport interface OdometerProps {\n value: string | number;\n}\n\nexport function Odometer({ value }: OdometerProps) {\n const str = String(value);\n return (\n <span className=\"odo\" role=\"text\" aria-label={str}>\n {str.split('').map((ch, i) =>\n /\\d/.test(ch) ? (\n <Digit key={i} d={Number(ch)} />\n ) : (\n <span key={i} className=\"odo__fixed\" aria-hidden=\"true\">\n {ch}\n </span>\n ),\n )}\n </span>\n );\n}\n"]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
'use client';import { tokenPx } from './chunk-UE63OOVG.js';
|
|
2
|
+
import { useLayoutEffect } from 'react';
|
|
3
|
+
|
|
4
|
+
function useAnchorPosition({ side, align, arrow, triggerRef, panelRef }) {
|
|
5
|
+
useLayoutEffect(() => {
|
|
6
|
+
const place = () => {
|
|
7
|
+
const t = triggerRef.current;
|
|
8
|
+
const p = panelRef.current;
|
|
9
|
+
if (!t || !p) return;
|
|
10
|
+
const r = t.getBoundingClientRect();
|
|
11
|
+
const pw = p.offsetWidth;
|
|
12
|
+
const ph = p.offsetHeight;
|
|
13
|
+
const edge = tokenPx("--space-2");
|
|
14
|
+
const gap = arrow ? tokenPx("--space-2") + 3 : 0;
|
|
15
|
+
const vw = window.innerWidth;
|
|
16
|
+
const vh = window.innerHeight;
|
|
17
|
+
const room = { top: r.top, bottom: vh - r.bottom, left: r.left, right: vw - r.right };
|
|
18
|
+
const opposite = {
|
|
19
|
+
top: "bottom",
|
|
20
|
+
bottom: "top",
|
|
21
|
+
left: "right",
|
|
22
|
+
right: "left"
|
|
23
|
+
};
|
|
24
|
+
const vertical = side === "top" || side === "bottom";
|
|
25
|
+
let s = side;
|
|
26
|
+
if (room[s] < (vertical ? ph : pw) + gap && room[opposite[s]] > room[s]) {
|
|
27
|
+
s = opposite[s];
|
|
28
|
+
}
|
|
29
|
+
let x;
|
|
30
|
+
let y;
|
|
31
|
+
if (vertical) {
|
|
32
|
+
y = s === "top" ? r.top - ph - gap : r.bottom + gap;
|
|
33
|
+
x = align === "start" ? r.left : align === "end" ? r.right - pw : r.left + (r.width - pw) / 2;
|
|
34
|
+
x = Math.min(Math.max(x, edge), vw - pw - edge);
|
|
35
|
+
y = Math.max(Math.min(y, vh - ph - edge), edge);
|
|
36
|
+
} else {
|
|
37
|
+
x = s === "left" ? r.left - pw - gap : r.right + gap;
|
|
38
|
+
y = align === "start" ? r.top : align === "end" ? r.bottom - ph : r.top + (r.height - ph) / 2;
|
|
39
|
+
y = Math.min(Math.max(y, edge), vh - ph - edge);
|
|
40
|
+
x = Math.max(Math.min(x, vw - pw - edge), edge);
|
|
41
|
+
}
|
|
42
|
+
p.style.left = Math.round(x) + "px";
|
|
43
|
+
p.style.top = Math.round(y) + "px";
|
|
44
|
+
p.setAttribute("data-side", s);
|
|
45
|
+
p.setAttribute("data-align", align);
|
|
46
|
+
if (arrow) {
|
|
47
|
+
if (vertical) {
|
|
48
|
+
p.style.setProperty(
|
|
49
|
+
"--overlay-arrow-x",
|
|
50
|
+
Math.round(Math.min(Math.max(r.left + r.width / 2 - x, 12), pw - 12)) + "px"
|
|
51
|
+
);
|
|
52
|
+
} else {
|
|
53
|
+
p.style.setProperty(
|
|
54
|
+
"--overlay-arrow-y",
|
|
55
|
+
Math.round(Math.min(Math.max(r.top + r.height / 2 - y, 12), ph - 12)) + "px"
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
place();
|
|
61
|
+
window.addEventListener("scroll", place, true);
|
|
62
|
+
window.addEventListener("resize", place);
|
|
63
|
+
const ro = new ResizeObserver(place);
|
|
64
|
+
ro.observe(panelRef.current);
|
|
65
|
+
return () => {
|
|
66
|
+
window.removeEventListener("scroll", place, true);
|
|
67
|
+
window.removeEventListener("resize", place);
|
|
68
|
+
ro.disconnect();
|
|
69
|
+
};
|
|
70
|
+
}, [side, align, arrow]);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { useAnchorPosition };
|
|
74
|
+
//# sourceMappingURL=chunk-EQ32F2QJ.js.map
|
|
75
|
+
//# sourceMappingURL=chunk-EQ32F2QJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/internal/overlay/position.ts"],"names":[],"mappings":"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","file":"chunk-EQ32F2QJ.js","sourcesContent":["'use client';\n\nimport { useLayoutEffect, type RefObject } from 'react';\nimport { tokenPx } from '../utils/token-px';\n\ninterface UseAnchorPositionProps {\n side: 'top' | 'bottom' | 'left' | 'right';\n align: 'start' | 'center' | 'end';\n arrow: boolean;\n triggerRef: RefObject<HTMLElement>;\n panelRef: RefObject<HTMLElement>;\n}\n\nexport function useAnchorPosition({ side, align, arrow, triggerRef, panelRef }: UseAnchorPositionProps) {\n useLayoutEffect(() => {\n const place = () => {\n const t = triggerRef.current;\n const p = panelRef.current;\n if (!t || !p) return;\n\n const r = t.getBoundingClientRect();\n const pw = p.offsetWidth;\n const ph = p.offsetHeight;\n\n const edge = tokenPx('--space-2');\n\n const gap = arrow ? tokenPx('--space-2') + 3 : 0;\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n const room: Record<string, number> = { top: r.top, bottom: vh - r.bottom, left: r.left, 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\n const vertical = side === 'top' || side === 'bottom';\n\n let s = side;\n if (room[s] < (vertical ? ph : pw) + gap && room[opposite[s]] > room[s]) {\n s = opposite[s];\n }\n\n let x: number;\n let y: number;\n\n if (vertical) {\n y = s === 'top' ? r.top - ph - gap : r.bottom + gap;\n\n x = align === 'start' ? r.left : align === 'end' ? r.right - pw : r.left + (r.width - pw) / 2;\n\n x = Math.min(Math.max(x, edge), vw - pw - edge);\n\n y = Math.max(Math.min(y, vh - ph - edge), edge);\n } else {\n x = s === 'left' ? r.left - pw - gap : r.right + gap;\n\n y = align === 'start' ? r.top : align === 'end' ? r.bottom - ph : r.top + (r.height - ph) / 2;\n\n y = Math.min(Math.max(y, edge), vh - ph - edge);\n x = Math.max(Math.min(x, vw - pw - edge), edge);\n }\n\n p.style.left = Math.round(x) + 'px';\n p.style.top = Math.round(y) + 'px';\n\n p.setAttribute('data-side', s);\n p.setAttribute('data-align', align);\n\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 };\n\n place();\n\n window.addEventListener('scroll', place, true);\n window.addEventListener('resize', place);\n\n const ro = new ResizeObserver(place);\n ro.observe(panelRef.current!);\n\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"]}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
'use client';import { useRef, useLayoutEffect, useEffect, cloneElement } from 'react';
|
|
2
|
+
import { createPortal } from 'react-dom';
|
|
3
|
+
|
|
4
|
+
// src/components/internal/overlay/layer.tsx
|
|
5
|
+
var ovStack = [];
|
|
6
|
+
function ovOnDocKeyDown(e) {
|
|
7
|
+
if (e.key !== "Escape" || e.defaultPrevented || ovStack.length === 0) return;
|
|
8
|
+
const top = ovStack[ovStack.length - 1];
|
|
9
|
+
if (!top.isDismissible()) return;
|
|
10
|
+
e.preventDefault();
|
|
11
|
+
top.requestClose();
|
|
12
|
+
}
|
|
13
|
+
function ovIsTop(entry) {
|
|
14
|
+
return ovStack[ovStack.length - 1] === entry;
|
|
15
|
+
}
|
|
16
|
+
function ovInOverlayAbove(entry, target) {
|
|
17
|
+
const i = ovStack.indexOf(entry);
|
|
18
|
+
return i >= 0 && ovStack.slice(i + 1).some((e) => e.contains(target));
|
|
19
|
+
}
|
|
20
|
+
function useOverlayEntry({
|
|
21
|
+
nodeRef,
|
|
22
|
+
dismissible,
|
|
23
|
+
requestClose
|
|
24
|
+
}) {
|
|
25
|
+
const ref = useRef(null);
|
|
26
|
+
if (!ref.current) {
|
|
27
|
+
ref.current = {
|
|
28
|
+
contains: (t) => Boolean(nodeRef.current && nodeRef.current.contains(t)),
|
|
29
|
+
isDismissible: () => ref.current._dismissible,
|
|
30
|
+
requestClose: () => ref.current._close()
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
ref.current._dismissible = dismissible;
|
|
34
|
+
ref.current._close = requestClose;
|
|
35
|
+
useLayoutEffect(() => {
|
|
36
|
+
const entry = ref.current;
|
|
37
|
+
if (ovStack.length === 0) document.addEventListener("keydown", ovOnDocKeyDown);
|
|
38
|
+
ovStack.push(entry);
|
|
39
|
+
if (nodeRef.current) nodeRef.current.style.zIndex = "calc(var(--layer-overlay) + " + (ovStack.length - 1) + ")";
|
|
40
|
+
return () => {
|
|
41
|
+
const i = ovStack.indexOf(entry);
|
|
42
|
+
if (i >= 0) ovStack.splice(i, 1);
|
|
43
|
+
if (ovStack.length === 0) document.removeEventListener("keydown", ovOnDocKeyDown);
|
|
44
|
+
};
|
|
45
|
+
}, []);
|
|
46
|
+
return ref.current;
|
|
47
|
+
}
|
|
48
|
+
function useOutsidePress({
|
|
49
|
+
entry,
|
|
50
|
+
refs,
|
|
51
|
+
enabled,
|
|
52
|
+
onPress
|
|
53
|
+
}) {
|
|
54
|
+
const latest = useRef(null);
|
|
55
|
+
latest.current = { enabled, onPress };
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
const onDown = (e) => {
|
|
58
|
+
if (!latest.current.enabled) return;
|
|
59
|
+
const t = e.target;
|
|
60
|
+
if (refs.some((r) => r.current && r.current.contains(t))) return;
|
|
61
|
+
if (ovInOverlayAbove(entry, t)) return;
|
|
62
|
+
latest.current.onPress();
|
|
63
|
+
};
|
|
64
|
+
document.addEventListener("pointerdown", onDown, true);
|
|
65
|
+
return () => document.removeEventListener("pointerdown", onDown, true);
|
|
66
|
+
}, []);
|
|
67
|
+
}
|
|
68
|
+
function ovCloneTrigger(trigger, {
|
|
69
|
+
open,
|
|
70
|
+
onPress,
|
|
71
|
+
panelId,
|
|
72
|
+
haspopup,
|
|
73
|
+
triggerRef
|
|
74
|
+
}) {
|
|
75
|
+
if (!trigger) return null;
|
|
76
|
+
const own = trigger.props;
|
|
77
|
+
const ownRef = trigger.ref;
|
|
78
|
+
return cloneElement(trigger, {
|
|
79
|
+
"aria-haspopup": haspopup,
|
|
80
|
+
"aria-expanded": open,
|
|
81
|
+
"aria-controls": open ? panelId : void 0,
|
|
82
|
+
onClick: (...args) => {
|
|
83
|
+
own.onClick?.(...args);
|
|
84
|
+
onPress();
|
|
85
|
+
},
|
|
86
|
+
ref: (node) => {
|
|
87
|
+
triggerRef.current = node;
|
|
88
|
+
if (typeof ownRef === "function") ownRef(node);
|
|
89
|
+
else if (ownRef) ownRef.current = node;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function OverlayPortal({ children }) {
|
|
94
|
+
const hostRef = useRef(null);
|
|
95
|
+
if (typeof document !== "undefined" && !hostRef.current) {
|
|
96
|
+
hostRef.current = document.createElement("div");
|
|
97
|
+
hostRef.current.setAttribute("data-overlay-root", "");
|
|
98
|
+
}
|
|
99
|
+
useLayoutEffect(() => {
|
|
100
|
+
const el = hostRef.current;
|
|
101
|
+
if (!el) return;
|
|
102
|
+
document.body.appendChild(el);
|
|
103
|
+
return () => el.remove();
|
|
104
|
+
}, []);
|
|
105
|
+
if (!hostRef.current) return null;
|
|
106
|
+
return createPortal(children, hostRef.current);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export { OverlayPortal, ovCloneTrigger, ovInOverlayAbove, ovIsTop, useOutsidePress, useOverlayEntry };
|
|
110
|
+
//# sourceMappingURL=chunk-GY7JOPUQ.js.map
|
|
111
|
+
//# sourceMappingURL=chunk-GY7JOPUQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/internal/overlay/layer.tsx"],"names":[],"mappings":"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","file":"chunk-GY7JOPUQ.js","sourcesContent":["'use client';\n\nimport {\n cloneElement,\n useEffect,\n useLayoutEffect,\n useRef,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\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\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\nfunction useOverlayEntry({\n nodeRef,\n dismissible,\n requestClose,\n}: {\n nodeRef: RefObject<HTMLElement>;\n dismissible: boolean;\n requestClose: () => void;\n}): OverlayEntry {\n const ref = useRef<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 useLayoutEffect(() => {\n const entry = ref.current;\n if (ovStack.length === 0) document.addEventListener('keydown', ovOnDocKeyDown);\n ovStack.push(entry);\n if (nodeRef.current) 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\nfunction useOutsidePress({\n entry,\n refs,\n enabled,\n onPress,\n}: {\n entry: OverlayEntry;\n refs: RefObject<HTMLElement>[];\n enabled: boolean;\n onPress: () => void;\n}) {\n const latest = useRef<{ enabled: boolean; onPress: () => void }>(null);\n latest.current = { enabled, onPress };\n useEffect(() => {\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\nfunction ovCloneTrigger(\n trigger: ReactElement | null,\n {\n open,\n onPress,\n panelId,\n haspopup,\n triggerRef,\n }: { open: boolean; onPress: () => void; panelId: string; haspopup: string; triggerRef: RefObject<HTMLElement> },\n): ReactElement | null {\n if (!trigger) return null;\n const own = trigger.props as { onClick?: (...args: unknown[]) => void };\n const ownRef = (trigger as ReactElement & { ref?: Ref<HTMLElement> }).ref;\n return cloneElement(trigger, {\n 'aria-haspopup': haspopup,\n 'aria-expanded': open,\n 'aria-controls': open ? panelId : undefined,\n onClick: (...args: unknown[]) => {\n own.onClick?.(...args);\n onPress();\n },\n ref: (node: HTMLElement | null) => {\n triggerRef.current = node;\n if (typeof ownRef === 'function') ownRef(node);\n else if (ownRef) ownRef.current = node;\n },\n } as Partial<typeof trigger.props>);\n}\n\nfunction OverlayPortal({ children }: { children: ReactNode }) {\n const hostRef = useRef<HTMLDivElement | null>(null);\n if (typeof document !== 'undefined' && !hostRef.current) {\n hostRef.current = document.createElement('div');\n hostRef.current.setAttribute('data-overlay-root', '');\n }\n useLayoutEffect(() => {\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\nexport { ovIsTop, ovInOverlayAbove, useOverlayEntry, useOutsidePress, ovCloneTrigger, OverlayPortal };\nexport type { OverlayEntry };\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use client';import { Icon } from './chunk-3SBCBYB7.js';
|
|
2
|
+
import { Collapse } from './chunk-7SZCJ7WI.js';
|
|
3
|
+
import './input.css';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function FieldLabel({ id, label, required, optional }) {
|
|
7
|
+
if (!label) return null;
|
|
8
|
+
return /* @__PURE__ */ jsxs("label", { className: "fld__label", htmlFor: id, children: [
|
|
9
|
+
label,
|
|
10
|
+
required && /* @__PURE__ */ jsx("span", { className: "fld__req", "aria-hidden": "true", children: "*" }),
|
|
11
|
+
optional && /* @__PURE__ */ jsx("span", { className: "fld__optional", children: "(optional)" })
|
|
12
|
+
] });
|
|
13
|
+
}
|
|
14
|
+
function FieldMessage({ message, icon }) {
|
|
15
|
+
return /* @__PURE__ */ jsx(Collapse, { open: !!message, className: "fld__msg-wrap", children: /* @__PURE__ */ jsxs("div", { className: "fld__msg", children: [
|
|
16
|
+
icon && /* @__PURE__ */ jsx(Icon, { name: icon, size: "sm", weight: "fill" }),
|
|
17
|
+
message
|
|
18
|
+
] }) });
|
|
19
|
+
}
|
|
20
|
+
function resolveFieldMessage(error, warning, success, helper) {
|
|
21
|
+
return {
|
|
22
|
+
state: error ? "is-error" : warning ? "is-warning" : success ? "is-success" : "",
|
|
23
|
+
msg: error || warning || success || helper,
|
|
24
|
+
msgIcon: error ? "warning-circle" : warning ? "warning" : success ? "check-circle" : null
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export { FieldLabel, FieldMessage, resolveFieldMessage };
|
|
29
|
+
//# sourceMappingURL=chunk-I4XQ4PV2.js.map
|
|
30
|
+
//# sourceMappingURL=chunk-I4XQ4PV2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/input/field-chrome.tsx"],"names":[],"mappings":";;;;;AAwCO,SAAS,WAAW,EAAE,EAAA,EAAI,KAAA,EAAO,QAAA,EAAU,UAAS,EAAoB;AAC7E,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,YAAA,EAAa,SAAS,EAAA,EACpC,QAAA,EAAA;AAAA,IAAA,KAAA;AAAA,IACA,4BACC,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EAAW,aAAA,EAAY,QAAO,QAAA,EAAA,GAAA,EAE9C,CAAA;AAAA,IAED,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,YAAA,EAAU;AAAA,GAAA,EACzD,CAAA;AAEJ;AAOO,SAAS,YAAA,CAAa,EAAE,OAAA,EAAS,IAAA,EAAK,EAAsB;AACjE,EAAA,uBACE,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,CAAC,CAAC,OAAA,EAAS,SAAA,EAAU,eAAA,EACnC,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA,wBAAS,IAAA,EAAA,EAAK,IAAA,EAAM,MAAM,IAAA,EAAK,IAAA,EAAK,QAAO,MAAA,EAAO,CAAA;AAAA,IAClD;AAAA,GAAA,EACH,CAAA,EACF,CAAA;AAEJ;AAEO,SAAS,mBAAA,CACd,KAAA,EACA,OAAA,EACA,OAAA,EACA,MAAA,EAC6D;AAC7D,EAAA,OAAO;AAAA,IACL,OAAO,KAAA,GAAQ,UAAA,GAAa,OAAA,GAAU,YAAA,GAAe,UAAU,YAAA,GAAe,EAAA;AAAA,IAC9E,GAAA,EAAK,KAAA,IAAS,OAAA,IAAW,OAAA,IAAW,MAAA;AAAA,IACpC,SAAS,KAAA,GAAQ,gBAAA,GAAmB,OAAA,GAAU,SAAA,GAAY,UAAU,cAAA,GAAiB;AAAA,GACvF;AACF","file":"chunk-I4XQ4PV2.js","sourcesContent":["'use client';\n\nimport './input.css';\nimport type { ReactNode } from 'react';\nimport { Icon, type IconName } from '../../internal/icon/Icon';\nimport { Collapse } from '../collapse/Collapse';\n\nexport interface FieldIdProps {\n /** Field id, ties the label to the control. */\n id?: string;\n}\n\nexport interface FieldRequirementProps {\n /** Mark the control required - reaches the native element and shows a danger `*` after the label. */\n required?: boolean;\n /** Show a muted \"(optional)\" after the label. */\n optional?: boolean;\n}\n\nexport interface FieldCoreMessagingProps {\n /** Label text (sentence case). */\n label?: ReactNode;\n /** Neutral helper text - shown when there's no validation message. */\n helper?: ReactNode;\n /** Error message - sets the error state (border + icon + colour). Wins over warning/success/helper. */\n error?: ReactNode;\n}\n\nexport interface FieldMessagingProps extends FieldIdProps, FieldRequirementProps, FieldCoreMessagingProps {\n /** Warning message - amber state. Loses to `error`; wins over `success`/`helper`. */\n warning?: ReactNode;\n /** Success message - green state. Loses to `error`/`warning`; wins over `helper`. */\n success?: ReactNode;\n}\n\nexport interface FieldLabelProps extends FieldIdProps, FieldRequirementProps {\n /** Label text (sentence case). */\n label?: ReactNode;\n}\n\nexport function FieldLabel({ id, label, required, optional }: FieldLabelProps) {\n if (!label) return null;\n return (\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}\n\nexport interface FieldMessageProps {\n message?: ReactNode;\n icon?: IconName | null;\n}\n\nexport function FieldMessage({ message, icon }: FieldMessageProps) {\n return (\n <Collapse open={!!message} className=\"fld__msg-wrap\">\n <div className=\"fld__msg\">\n {icon && <Icon name={icon} size=\"sm\" weight=\"fill\" />}\n {message}\n </div>\n </Collapse>\n );\n}\n\nexport function resolveFieldMessage(\n error: ReactNode,\n warning: ReactNode,\n success: ReactNode,\n helper: ReactNode,\n): { state: string; msg: ReactNode; msgIcon: IconName | null } {\n return {\n state: error ? 'is-error' : warning ? 'is-warning' : success ? 'is-success' : '',\n msg: error || warning || success || helper,\n msgIcon: error ? 'warning-circle' : warning ? 'warning' : success ? 'check-circle' : null,\n };\n}\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use client';import { measure, flip, readShared, keepShared, dropShared } from './chunk-L3Q3VDIW.js';
|
|
2
|
+
import { UIMotion } from './chunk-S5ZTZANS.js';
|
|
3
|
+
import { useRef, useLayoutEffect } from 'react';
|
|
4
|
+
|
|
5
|
+
function useSelfFlip(tuning = {}, enabled = true) {
|
|
6
|
+
const ref = useRef(null);
|
|
7
|
+
const previous = useRef(null);
|
|
8
|
+
const playing = useRef(null);
|
|
9
|
+
const { scale, timing } = tuning;
|
|
10
|
+
useLayoutEffect(() => {
|
|
11
|
+
const el = ref.current;
|
|
12
|
+
if (!el || !enabled) return;
|
|
13
|
+
const from = playing.current ? measure(el) : previous.current;
|
|
14
|
+
playing.current?.stop();
|
|
15
|
+
previous.current = measure(el);
|
|
16
|
+
const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;
|
|
17
|
+
playing.current = next;
|
|
18
|
+
next?.finished.then(() => {
|
|
19
|
+
if (playing.current === next) playing.current = null;
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
useLayoutEffect(
|
|
23
|
+
() => () => {
|
|
24
|
+
playing.current?.stop();
|
|
25
|
+
},
|
|
26
|
+
[]
|
|
27
|
+
);
|
|
28
|
+
return ref;
|
|
29
|
+
}
|
|
30
|
+
function useSharedFlip(id, tuning = {}, enabled = true) {
|
|
31
|
+
const ref = useRef(null);
|
|
32
|
+
const playing = useRef(null);
|
|
33
|
+
const { scale, timing } = tuning;
|
|
34
|
+
useLayoutEffect(() => {
|
|
35
|
+
const el = ref.current;
|
|
36
|
+
if (!el || !enabled) return;
|
|
37
|
+
const live = playing.current;
|
|
38
|
+
const from = live && live.el === el ? measure(el) : readShared(id);
|
|
39
|
+
live?.play.stop();
|
|
40
|
+
keepShared(id, measure(el));
|
|
41
|
+
const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;
|
|
42
|
+
playing.current = next ? { play: next, el } : null;
|
|
43
|
+
next?.finished.then(() => {
|
|
44
|
+
if (playing.current?.play === next) playing.current = null;
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
useLayoutEffect(() => {
|
|
48
|
+
if (!enabled) return;
|
|
49
|
+
return () => {
|
|
50
|
+
const live = playing.current;
|
|
51
|
+
if (live) {
|
|
52
|
+
const box = measure(live.el);
|
|
53
|
+
if (box.width && box.height) keepShared(id, box);
|
|
54
|
+
live.play.stop();
|
|
55
|
+
}
|
|
56
|
+
const mine = readShared(id);
|
|
57
|
+
queueMicrotask(() => {
|
|
58
|
+
if (readShared(id) === mine) dropShared(id);
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
}, [id, enabled]);
|
|
62
|
+
return ref;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { useSelfFlip, useSharedFlip };
|
|
66
|
+
//# sourceMappingURL=chunk-JSKXZMLH.js.map
|
|
67
|
+
//# sourceMappingURL=chunk-JSKXZMLH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/motion/flip.tsx"],"names":[],"mappings":"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","file":"chunk-JSKXZMLH.js","sourcesContent":["'use client';\n\nimport { useLayoutEffect, useRef, type RefObject } from 'react';\nimport {\n dropShared,\n flip,\n keepShared,\n measure,\n readShared,\n type Box,\n type FlipOptions,\n type Playback,\n} from '../engine';\nimport { UIMotion } from '../tokens/motion-tokens';\n\nexport type FlipTuning = FlipOptions;\n\nexport function useSelfFlip<T extends HTMLElement>(tuning: FlipTuning = {}, enabled = true): RefObject<T | null> {\n const ref = useRef<T | null>(null);\n const previous = useRef<Box | null>(null);\n const playing = useRef<Playback | null>(null);\n const { scale, timing } = tuning;\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n const from = playing.current ? measure(el) : previous.current;\n playing.current?.stop();\n previous.current = measure(el);\n const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;\n playing.current = next;\n next?.finished.then(() => {\n if (playing.current === next) playing.current = null;\n });\n });\n\n useLayoutEffect(\n () => () => {\n playing.current?.stop();\n },\n [],\n );\n\n return ref;\n}\n\nexport function useSharedFlip<T extends HTMLElement>(\n id: string,\n tuning: FlipTuning = {},\n enabled = true,\n): RefObject<T | null> {\n const ref = useRef<T | null>(null);\n const playing = useRef<{ play: Playback; el: T } | null>(null);\n const { scale, timing } = tuning;\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n const live = playing.current;\n const from = live && live.el === el ? measure(el) : readShared(id);\n live?.play.stop();\n keepShared(id, measure(el));\n const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;\n playing.current = next ? { play: next, el } : null;\n next?.finished.then(() => {\n if (playing.current?.play === next) playing.current = null;\n });\n });\n\n useLayoutEffect(() => {\n if (!enabled) return;\n return () => {\n const live = playing.current;\n if (live) {\n const box = measure(live.el);\n if (box.width && box.height) keepShared(id, box);\n live.play.stop();\n }\n const mine = readShared(id);\n queueMicrotask(() => {\n if (readShared(id) === mine) dropShared(id);\n });\n };\n }, [id, enabled]);\n\n return ref;\n}\n"]}
|