@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/dev/slowmo-engine.ts","../src/components/dev/MotionDevtools.tsx"],"names":["active"],"mappings":"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","file":"motion-devtools.js","sourcesContent":["import { clock } from '../../engine';\n\nexport interface SlowmoState {\n /** 1 = real time. >1 = that many times slower (4 = quarter speed). */\n factor: number;\n /** Freeze motion in place - useful for inspecting a transition mid-flight. */\n paused: boolean;\n}\n\nexport interface SlowmoOptions {\n /** Also scale setTimeout/setInterval so duration-coupled JS cleanups don't truncate\n * slowed CSS. Turn off if stretched app timers get in your way. @default true */\n scaleTimers: boolean;\n}\n\nconst CANONICAL: Record<string, number> = {\n '--duration-fast': 140,\n '--duration-base': 200,\n '--duration-slow': 300,\n '--duration-slower': 450,\n '--duration-slowest': 900,\n '--duration-spin': 600,\n '--duration-pulse': 1600,\n};\nconst DURATION_TOKENS = Object.keys(CANONICAL);\nconst COLLAPSED_MS = 4;\nconst FROZEN_MS = 600_000;\nconst MAX_TIMER_DELAY = 2 ** 30;\n\nconst clamp = (min: number, max: number, v: number) => (v < min ? min : v > max ? max : v);\nconst hasDOM = typeof document !== 'undefined' && typeof window !== 'undefined';\n\nconst state: SlowmoState = { factor: 1, paused: false };\nconst options: SlowmoOptions = { scaleTimers: true };\nconst listeners = new Set<(s: SlowmoState) => void>();\n\nlet active = false;\nlet baseMs: Record<string, number> = {};\n\ntype SetTimer = (handler: TimerHandler, timeout?: number, ...args: unknown[]) => number;\nlet origSetTimeout: SetTimer | null = null;\nlet origSetInterval: SetTimer | null = null;\n\ntype AnimateFn = (this: Element, ...args: unknown[]) => Animation;\nlet origAnimate: AnimateFn | null = null;\nconst trackedRates = new Map<Animation, number>();\n\nfunction readBaseMs(token: string): number {\n const raw = getComputedStyle(document.documentElement).getPropertyValue(token).trim();\n const n = raw.endsWith('ms') ? parseFloat(raw) : raw.endsWith('s') ? parseFloat(raw) * 1000 : parseFloat(raw);\n if (isNaN(n) || n <= COLLAPSED_MS) return CANONICAL[token];\n return n;\n}\n\nfunction applyCssTokens() {\n const root = document.documentElement.style;\n for (const token of DURATION_TOKENS) {\n const ms = state.paused ? FROZEN_MS : baseMs[token] * state.factor;\n root.setProperty(token, `${ms}ms`);\n }\n}\n\nfunction clearCssTokens() {\n const root = document.documentElement.style;\n for (const token of DURATION_TOKENS) root.removeProperty(token);\n}\n\nfunction scaleDelay(delay?: number): number | undefined {\n if (typeof delay !== 'number' || !isFinite(delay)) return delay;\n return Math.min(delay * state.factor, MAX_TIMER_DELAY);\n}\n\nfunction patchTimers() {\n if (origSetTimeout) return;\n origSetTimeout = window.setTimeout as unknown as SetTimer;\n origSetInterval = window.setInterval as unknown as SetTimer;\n const nativeTimeout = origSetTimeout.bind(window);\n const nativeInterval = origSetInterval.bind(window);\n window.setTimeout = ((h: TimerHandler, t?: number, ...a: unknown[]) =>\n nativeTimeout(h, scaleDelay(t), ...a)) as typeof window.setTimeout;\n window.setInterval = ((h: TimerHandler, t?: number, ...a: unknown[]) =>\n nativeInterval(h, scaleDelay(t), ...a)) as typeof window.setInterval;\n}\n\nfunction restoreTimers() {\n if (origSetTimeout) window.setTimeout = origSetTimeout as typeof window.setTimeout;\n if (origSetInterval) window.setInterval = origSetInterval as typeof window.setInterval;\n origSetTimeout = origSetInterval = null;\n}\n\nfunction liveRate(): number {\n return state.paused ? 0 : 1 / state.factor;\n}\n\nfunction track(anim: Animation, original: number) {\n if (trackedRates.has(anim)) return;\n trackedRates.set(anim, original);\n const forget = () => trackedRates.delete(anim);\n anim.finished.then(forget).catch(forget);\n}\n\nfunction patchAnimate() {\n if (origAnimate) return;\n origAnimate = Element.prototype.animate as unknown as AnimateFn;\n const original = origAnimate;\n Element.prototype.animate = function (this: Element, ...args: unknown[]): Animation {\n const anim = original.apply(this, args);\n try {\n track(anim, anim.playbackRate);\n anim.playbackRate = liveRate();\n } catch {}\n return anim;\n } as typeof Element.prototype.animate;\n}\n\nfunction restoreAnimate() {\n if (origAnimate) Element.prototype.animate = origAnimate as typeof Element.prototype.animate;\n origAnimate = null;\n}\n\nfunction sweepExisting() {\n const rate = liveRate();\n for (const anim of document.getAnimations()) {\n try {\n track(anim, anim.playbackRate);\n anim.playbackRate = rate;\n } catch {}\n }\n}\n\nfunction applyTrackedRates() {\n const rate = liveRate();\n for (const anim of trackedRates.keys()) {\n try {\n anim.playbackRate = rate;\n } catch {}\n }\n}\n\nfunction restoreTrackedRates() {\n for (const [anim, original] of trackedRates) {\n try {\n anim.playbackRate = original;\n } catch {}\n }\n trackedRates.clear();\n}\n\nfunction applyEngineClock() {\n clock.scale = state.paused ? Infinity : state.factor;\n}\n\nfunction install() {\n active = true;\n baseMs = {};\n for (const token of DURATION_TOKENS) baseMs[token] = readBaseMs(token);\n applyCssTokens();\n applyEngineClock();\n if (options.scaleTimers) patchTimers();\n patchAnimate();\n sweepExisting();\n}\n\nfunction reconfigure() {\n applyCssTokens();\n applyEngineClock();\n applyTrackedRates();\n}\n\nfunction uninstall() {\n active = false;\n clearCssTokens();\n clock.scale = 1;\n restoreTimers();\n restoreAnimate();\n restoreTrackedRates();\n}\n\nfunction notify() {\n const snapshot = { ...state };\n for (const cb of listeners) cb(snapshot);\n}\n\nexport function shouldBeActive(factor: number, paused: boolean): boolean {\n return factor > 1 || paused;\n}\n\n/** Imperative control surface - drive slow-mo from a console, a hotkey, or the panel.\n * Safe to call during SSR (no-ops the DOM work, still tracks state for hydration). */\nexport const motionSlowmo = {\n /** Current state (a copy). */\n get(): SlowmoState {\n return { ...state };\n },\n\n /** Merge a partial state. factor is clamped to [1, 64]. */\n set(patch: Partial<SlowmoState>): void {\n if (typeof patch.factor === 'number') state.factor = clamp(1, 64, patch.factor);\n if (typeof patch.paused === 'boolean') state.paused = patch.paused;\n\n if (hasDOM) {\n const wantActive = shouldBeActive(state.factor, state.paused);\n if (!active && wantActive) install();\n else if (active && !wantActive) uninstall();\n else if (active) reconfigure();\n }\n notify();\n },\n\n /** Tune engine behaviour (e.g. stop scaling timers). Applies immediately if active. */\n configure(patch: Partial<SlowmoOptions>): void {\n if (typeof patch.scaleTimers === 'boolean' && patch.scaleTimers !== options.scaleTimers) {\n options.scaleTimers = patch.scaleTimers;\n if (active) options.scaleTimers ? patchTimers() : restoreTimers();\n }\n },\n\n /** Convenience: back to real time and unpaused. */\n reset(): void {\n this.set({ factor: 1, paused: false });\n },\n\n /** Subscribe to state changes; returns an unsubscribe fn. */\n subscribe(cb: (s: SlowmoState) => void): () => void {\n listeners.add(cb);\n return () => listeners.delete(cb);\n },\n};\n\nexport type MotionSlowmo = typeof motionSlowmo;\n","'use client';\n\nimport './motion-devtools.css';\nimport { useEffect, useState, type CSSProperties } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button } from '../primitives/button/Button';\nimport { Checkbox } from '../primitives/checkbox/Checkbox';\nimport { Collapse } from '../primitives/collapse/Collapse';\nimport { motionSlowmo, shouldBeActive, type SlowmoState } from './slowmo-engine';\nimport { cx } from '../internal/utils/cx';\n\nexport type MotionDevtoolsPlacement = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\nexport interface MotionDevtoolsProps {\n /** Which corner of the viewport to pin to. @default 'bottom-right' */\n placement?: MotionDevtoolsPlacement;\n /** Distance from the viewport edges, in px. @default 16 */\n offset?: number;\n /** Quick-select slow-down factors (1 = real time). @default [1, 2, 4, 8, 16] */\n presets?: number[];\n /** Upper bound of the fine slider. @default 16 */\n maxFactor?: number;\n /** Slow-down factor to start at. @default 1 */\n defaultFactor?: number;\n /** Scale setTimeout/setInterval too, so duration-coupled JS cleanups don't truncate\n * slowed CSS. Exposed as a live toggle in the panel. @default true */\n scaleTimers?: boolean;\n /** Remember the chosen factor across reloads (localStorage). @default true */\n persist?: boolean;\n /** Start with the full panel open rather than collapsed to its header. @default false */\n defaultOpen?: boolean;\n}\n\nconst STORAGE_KEY = 'zyncat-ui:motion-devtools';\nconst fmt = (n: number) => (Number.isInteger(n) ? String(n) : n.toFixed(1));\n\nfunction GaugeGlyph() {\n return (\n <svg className=\"mdt__glyph\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n d=\"M12 4a8 8 0 0 1 8 8 8 8 0 0 1-.6 3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M12 4a8 8 0 0 0-8 8 8 8 0 0 0 .6 3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n opacity=\"0.35\"\n />\n <path d=\"M12 12l4-2.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function MotionDevtools({\n placement = 'bottom-right',\n offset = 16,\n presets = [1, 2, 4, 8, 16],\n maxFactor = 16,\n defaultFactor = 1,\n scaleTimers = true,\n persist = true,\n defaultOpen = false,\n}: MotionDevtoolsProps) {\n const [mounted, setMounted] = useState(false);\n const [open, setOpen] = useState(defaultOpen);\n const [snap, setSnap] = useState<SlowmoState>(() => motionSlowmo.get());\n const [timers, setTimers] = useState(scaleTimers);\n\n useEffect(() => motionSlowmo.subscribe(setSnap), []);\n\n useEffect(() => {\n setMounted(true);\n let initial: Partial<SlowmoState> = { factor: defaultFactor, paused: false };\n if (persist) {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) initial = { ...initial, ...JSON.parse(raw) };\n } catch {}\n }\n motionSlowmo.set(initial);\n if ((initial.factor ?? 1) > 1 || initial.paused) setOpen(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n motionSlowmo.configure({ scaleTimers: timers });\n }, [timers]);\n\n useEffect(() => {\n if (!persist) return;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ factor: snap.factor, paused: snap.paused }));\n } catch {}\n }, [snap.factor, snap.paused, persist]);\n\n if (!mounted) return null;\n\n const active = shouldBeActive(snap.factor, snap.paused);\n const rootClass = cx('mdt', `mdt--${placement}`, active && 'mdt--active', snap.paused && 'mdt--paused');\n\n const setFactor = (factor: number) => motionSlowmo.set({ factor, paused: false });\n const fill = `${((Math.min(snap.factor, maxFactor) - 1) / Math.max(1, maxFactor - 1)) * 100}%`;\n const pillBadge = snap.factor === 1 ? '1×' : `${fmt(snap.factor)}×`;\n\n return createPortal(\n <div className={rootClass} style={{ '--mdt-offset': `${offset}px` } as CSSProperties}>\n <div className={'mdt__panel' + (open ? ' is-open' : '')} role=\"group\" aria-label=\"Motion devtools\">\n <button\n className=\"mdt__head\"\n onClick={() => setOpen((o) => !o)}\n aria-expanded={open}\n title=\"Motion devtools\"\n aria-label={open ? 'Collapse motion devtools' : 'Expand motion devtools'}\n >\n <GaugeGlyph />\n <span className=\"mdt__spacer\" />\n <span className=\"mdt__badge\">{pillBadge}</span>\n <svg\n className={'mdt__chevron' + (open ? ' mdt__chevron--open' : '')}\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden=\"true\"\n >\n <path d=\"M2.5 4.5 6 8l3.5-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n </button>\n\n <Collapse open={open} fade>\n <div className=\"mdt__body\">\n <span className=\"mdt__title\">Motion</span>\n <div className=\"mdt__readout\">\n <span className=\"mdt__value\">\n {snap.paused ? 'Paused' : snap.factor === 1 ? 'Normal' : `${fmt(snap.factor)}×`}\n </span>\n <span className=\"mdt__unit\">{snap.paused ? 'frozen' : snap.factor === 1 ? 'real-time' : 'slower'}</span>\n </div>\n\n <input\n className=\"mdt__slider\"\n type=\"range\"\n min={1}\n max={maxFactor}\n step={0.5}\n value={Math.min(snap.factor, maxFactor)}\n onChange={(e) => setFactor(Number(e.target.value))}\n style={{ '--mdt-fill': fill } as CSSProperties}\n aria-label=\"Slow-down factor\"\n />\n\n <div className=\"mdt__chips\">\n {presets.map((p) => (\n <Button\n key={p}\n size=\"sm\"\n variant={!snap.paused && snap.factor === p ? 'primary' : 'secondary'}\n onClick={() => setFactor(p)}\n >\n {p}×\n </Button>\n ))}\n </div>\n\n <div className=\"mdt__row\">\n <Button\n size=\"sm\"\n variant={snap.paused ? 'primary' : 'secondary'}\n onClick={() => motionSlowmo.set({ paused: !snap.paused })}\n >\n {snap.paused ? 'Resume' : 'Freeze'}\n </Button>\n <Button size=\"sm\" variant=\"ghost\" disabled={!active} onClick={() => motionSlowmo.reset()}>\n Reset\n </Button>\n </div>\n\n <div className=\"mdt__opt\">\n <Checkbox size=\"sm\" checked={timers} onChange={(e) => setTimers(e.target.checked)} label=\"Scale timers\" />\n <p className=\"mdt__hint\">\n Slows CSS, Motion & WAAPI together. Timer scaling keeps duration-based cleanups from cutting\n animations short.\n </p>\n </div>\n </div>\n </Collapse>\n </div>\n </div>,\n document.body,\n );\n}\n\nexport { motionSlowmo, type SlowmoState } from './slowmo-engine';\nexport default MotionDevtools;\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Names of the UI-transition duration scale (`--duration-*`):
|
|
2
|
+
* - `fast` 140ms - micro feedback: hover washes, presses, control tint/border/shadow.
|
|
3
|
+
* - `base` 200ms - standard element transitions: fades, toggles, badge morphs.
|
|
4
|
+
* - `slow` 300ms - layout-scale movement: Collapse, panel resizes, reordering.
|
|
5
|
+
* - `slower` 450ms - large-surface movement: dialogs, sheets, page-scale reveals.
|
|
6
|
+
* - `slowest` 900ms - hero-scale movement: card expansion, container transforms. The scale's
|
|
7
|
+
* ceiling: anything longer is choreography and belongs to Motion, not a transition token. */
|
|
8
|
+
type DurationToken = 'fast' | 'base' | 'slow' | 'slower' | 'slowest';
|
|
9
|
+
/** Names of the brand easing curves (`--ease-*`):
|
|
10
|
+
* - `standard` cubic-bezier(0.2, 0, 0, 1) - brisk start, soft landing; the default for state changes.
|
|
11
|
+
* - `entrance` cubic-bezier(0.16, 1, 0.3, 1) - hard deceleration; content arriving on screen.
|
|
12
|
+
* - `exit` cubic-bezier(0.4, 0, 1, 1) - accelerates away; content leaving (pair with a faster duration).
|
|
13
|
+
* - `spring` cubic-bezier(0.34, 1.4, 0.5, 1) - overshoots then settles; playful confirmations.
|
|
14
|
+
* - `glide` cubic-bezier(0.55, 0, 0.15, 1) - symmetric in-out travel; a persistent element moving
|
|
15
|
+
* between positions, never enter/exit. */
|
|
16
|
+
type EaseToken = 'standard' | 'entrance' | 'exit' | 'spring' | 'glide';
|
|
17
|
+
|
|
18
|
+
export type { DurationToken as D, EaseToken as E };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { D as DurationToken, E as EaseToken } from './motion-scale-Canq4stZ.js';
|
|
2
|
+
|
|
3
|
+
interface MotionTransition {
|
|
4
|
+
type?: 'spring' | 'tween' | 'inertia' | 'keyframes';
|
|
5
|
+
duration?: number;
|
|
6
|
+
ease?: Bezier | 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' | 'circIn' | 'circOut' | 'circInOut' | 'backIn' | 'backOut' | 'backInOut' | 'anticipate';
|
|
7
|
+
bounce?: number;
|
|
8
|
+
visualDuration?: number;
|
|
9
|
+
delay?: number;
|
|
10
|
+
}
|
|
11
|
+
type Bezier = [number, number, number, number];
|
|
12
|
+
|
|
13
|
+
interface MotionTokens {
|
|
14
|
+
/** seconds - fast 0.14 - base 0.2 - slow 0.3 - slower 0.45 - slowest 0.9 */
|
|
15
|
+
dur: Record<DurationToken, number>;
|
|
16
|
+
ease: Record<EaseToken, Bezier>;
|
|
17
|
+
/** ready-made Motion transitions */
|
|
18
|
+
t: {
|
|
19
|
+
enter: MotionTransition;
|
|
20
|
+
exit: MotionTransition;
|
|
21
|
+
layout: MotionTransition;
|
|
22
|
+
settle: MotionTransition;
|
|
23
|
+
};
|
|
24
|
+
reduced: boolean;
|
|
25
|
+
}
|
|
26
|
+
declare const UIMotion: MotionTokens;
|
|
27
|
+
|
|
28
|
+
export { type Bezier, DurationToken, EaseToken, type MotionTokens, type MotionTransition, UIMotion, UIMotion as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"motion-tokens.js"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, HTMLAttributes } from 'react';
|
|
3
|
+
import { S as SelectOption, a as SelectGroup } from './types-SGMShK7R.js';
|
|
4
|
+
import { D as DataAttributes } from './dom-props-C0jrllBw.js';
|
|
5
|
+
import { D as DisableableAnimation } from './timing-7JA_zQHP.js';
|
|
6
|
+
import './motion-scale-Canq4stZ.js';
|
|
7
|
+
|
|
8
|
+
interface MultiSelectProps {
|
|
9
|
+
/** The choices - a flat `SelectOption[]`, or `SelectGroup[]` to render labeled sections. @default [] */
|
|
10
|
+
options: SelectOption[] | SelectGroup[];
|
|
11
|
+
/** Controlled value - the array of selected option `value`s. Omit for uncontrolled (use `defaultValue`). */
|
|
12
|
+
value?: string[];
|
|
13
|
+
/** Initial selection when uncontrolled. @default [] */
|
|
14
|
+
defaultValue?: string[];
|
|
15
|
+
/** Fires with the NEXT array and the option that was toggled. Committing keeps the menu open. */
|
|
16
|
+
onChange?: (value: string[], toggled: SelectOption) => void;
|
|
17
|
+
/** Trigger text when nothing is selected. @default 'Select options' */
|
|
18
|
+
placeholder?: string;
|
|
19
|
+
/** Control height. @default 'md' */
|
|
20
|
+
size?: 'sm' | 'md' | 'lg';
|
|
21
|
+
/** Disabled - trigger is inert and the menu cannot open. @default false */
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
/** Danger ring + border. @default false */
|
|
24
|
+
invalid?: boolean;
|
|
25
|
+
/** Skeleton rows in the menu; trigger reads "Loading...". @default false */
|
|
26
|
+
loading?: boolean;
|
|
27
|
+
/** Type-to-filter field pinned above the list. @default false */
|
|
28
|
+
searchable?: boolean;
|
|
29
|
+
/** Placeholder for the `searchable` filter input. @default 'Filter options' */
|
|
30
|
+
searchPlaceholder?: string;
|
|
31
|
+
/** Your own icon node pinned before the trigger label; else the sole selected option's icon. */
|
|
32
|
+
leadingIcon?: ReactNode;
|
|
33
|
+
/** Base id for the trigger/menu/list ids and a11y wiring; auto-generated if omitted. */
|
|
34
|
+
id?: string;
|
|
35
|
+
/** Accessible name for the trigger and listbox - supply when there is no visible label. */
|
|
36
|
+
ariaLabel?: string;
|
|
37
|
+
/** Standard <div> attributes (className, style, data-*, ...) forwarded to the select root. */
|
|
38
|
+
htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;
|
|
39
|
+
/** Menu open/close timing - motion tokens only, or `null` to disable. @default duration 'base' + ease 'entrance'/'exit' */
|
|
40
|
+
animation?: DisableableAnimation;
|
|
41
|
+
}
|
|
42
|
+
declare function MultiSelect({ options, value: controlledValue, defaultValue, onChange, placeholder, size, disabled, invalid, loading, searchable, searchPlaceholder, leadingIcon, id, ariaLabel, htmlProps, animation, }: MultiSelectProps): react.JSX.Element;
|
|
43
|
+
|
|
44
|
+
export { MultiSelect, type MultiSelectProps, SelectGroup, SelectOption };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
'use client';import { useListbox, SelectTrigger, ListboxPanel } from './chunk-QMSJZCK3.js';
|
|
2
|
+
import './chunk-EQ32F2QJ.js';
|
|
3
|
+
import './chunk-GY7JOPUQ.js';
|
|
4
|
+
import './chunk-UE63OOVG.js';
|
|
5
|
+
import './chunk-MKIQFK7S.js';
|
|
6
|
+
import './chunk-NEF5XAHG.js';
|
|
7
|
+
import './chunk-MXOPCFWR.js';
|
|
8
|
+
import './chunk-W3SHPKSB.js';
|
|
9
|
+
import './chunk-L3Q3VDIW.js';
|
|
10
|
+
import './chunk-2ERBBFZS.js';
|
|
11
|
+
import './chunk-3SBCBYB7.js';
|
|
12
|
+
import { useControllable } from './chunk-MMRIQNEN.js';
|
|
13
|
+
import './chunk-S5ZTZANS.js';
|
|
14
|
+
import './chunk-U5QQZC3U.js';
|
|
15
|
+
import { CheckGlyph } from './chunk-NNXJCLTV.js';
|
|
16
|
+
import './chunk-7SZCJ7WI.js';
|
|
17
|
+
import './chunk-VTJTGVZZ.js';
|
|
18
|
+
import { cx } from './chunk-QGNC7LH5.js';
|
|
19
|
+
import './select.css';
|
|
20
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
21
|
+
|
|
22
|
+
function CheckboxTick({ checked }) {
|
|
23
|
+
return /* @__PURE__ */ jsx("span", { className: "cbx", "aria-hidden": "true", children: /* @__PURE__ */ jsx(CheckGlyph, { checked, readOnly: true, tabIndex: -1 }) });
|
|
24
|
+
}
|
|
25
|
+
function MultiSelect({
|
|
26
|
+
options = [],
|
|
27
|
+
value: controlledValue,
|
|
28
|
+
defaultValue = [],
|
|
29
|
+
onChange,
|
|
30
|
+
placeholder = "Select options",
|
|
31
|
+
size = "md",
|
|
32
|
+
disabled = false,
|
|
33
|
+
invalid = false,
|
|
34
|
+
loading = false,
|
|
35
|
+
searchable = false,
|
|
36
|
+
searchPlaceholder = "Filter options",
|
|
37
|
+
leadingIcon = null,
|
|
38
|
+
id,
|
|
39
|
+
ariaLabel,
|
|
40
|
+
htmlProps,
|
|
41
|
+
animation
|
|
42
|
+
}) {
|
|
43
|
+
const [value, setValue] = useControllable(
|
|
44
|
+
controlledValue,
|
|
45
|
+
defaultValue,
|
|
46
|
+
onChange
|
|
47
|
+
);
|
|
48
|
+
const values = Array.isArray(value) ? value : [];
|
|
49
|
+
const isSelected = (v) => values.indexOf(v) !== -1;
|
|
50
|
+
const lb = useListbox({
|
|
51
|
+
options,
|
|
52
|
+
disabled,
|
|
53
|
+
loading,
|
|
54
|
+
searchable,
|
|
55
|
+
id,
|
|
56
|
+
idPrefix: "mselect-",
|
|
57
|
+
isSelected,
|
|
58
|
+
onCommit: (opt) => setValue(isSelected(opt.value) ? values.filter((v) => v !== opt.value) : [...values, opt.value], opt),
|
|
59
|
+
closeOnCommit: false
|
|
60
|
+
});
|
|
61
|
+
const selectedOptions = lb.flat.filter((o) => isSelected(o.value));
|
|
62
|
+
const isPlaceholder = !loading && selectedOptions.length === 0;
|
|
63
|
+
return /* @__PURE__ */ jsxs(
|
|
64
|
+
"div",
|
|
65
|
+
{
|
|
66
|
+
...htmlProps,
|
|
67
|
+
className: cx("select", htmlProps?.className),
|
|
68
|
+
"data-multiple": "true",
|
|
69
|
+
"data-size": size,
|
|
70
|
+
"data-open": lb.open ? "true" : void 0,
|
|
71
|
+
"data-disabled": disabled ? "true" : void 0,
|
|
72
|
+
"data-invalid": invalid ? "true" : void 0,
|
|
73
|
+
"data-loading": loading ? "true" : void 0,
|
|
74
|
+
children: [
|
|
75
|
+
/* @__PURE__ */ jsx(
|
|
76
|
+
SelectTrigger,
|
|
77
|
+
{
|
|
78
|
+
lb,
|
|
79
|
+
disabled,
|
|
80
|
+
invalid,
|
|
81
|
+
ariaLabel,
|
|
82
|
+
leading: leadingIcon || selectedOptions.length === 1 && selectedOptions[0].icon || null,
|
|
83
|
+
text: loading ? "Loading..." : isPlaceholder ? placeholder : selectedOptions[0].label,
|
|
84
|
+
isPlaceholder,
|
|
85
|
+
count: selectedOptions.length - 1
|
|
86
|
+
}
|
|
87
|
+
),
|
|
88
|
+
/* @__PURE__ */ jsx(
|
|
89
|
+
ListboxPanel,
|
|
90
|
+
{
|
|
91
|
+
lb,
|
|
92
|
+
loading,
|
|
93
|
+
searchable,
|
|
94
|
+
searchPlaceholder,
|
|
95
|
+
ariaLabel,
|
|
96
|
+
multiple: true,
|
|
97
|
+
animation,
|
|
98
|
+
size,
|
|
99
|
+
check: (sel) => /* @__PURE__ */ jsx(CheckboxTick, { checked: sel })
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { MultiSelect };
|
|
108
|
+
//# sourceMappingURL=multi-select.js.map
|
|
109
|
+
//# sourceMappingURL=multi-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/select/MultiSelect.tsx"],"names":[],"mappings":"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","file":"multi-select.js","sourcesContent":["'use client';\n\nimport './select.css';\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport { useControllable } from '../../internal/hooks/use-controllable';\nimport { CheckGlyph } from '../../primitives/checkbox/check-glyph';\nimport { useListbox, ListboxPanel, SelectTrigger, type SelectOption, type SelectGroup } from './core';\nimport type { DisableableAnimation } from '../../../motion/timing';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\nexport type { SelectOption, SelectGroup } from './core';\n\nexport interface MultiSelectProps {\n /** The choices - a flat `SelectOption[]`, or `SelectGroup[]` to render labeled sections. @default [] */\n options: SelectOption[] | SelectGroup[];\n /** Controlled value - the array of selected option `value`s. Omit for uncontrolled (use `defaultValue`). */\n value?: string[];\n /** Initial selection when uncontrolled. @default [] */\n defaultValue?: string[];\n /** Fires with the NEXT array and the option that was toggled. Committing keeps the menu open. */\n onChange?: (value: string[], toggled: SelectOption) => void;\n /** Trigger text when nothing is selected. @default 'Select options' */\n placeholder?: string;\n /** Control height. @default 'md' */\n size?: 'sm' | 'md' | 'lg';\n /** Disabled - trigger is inert and the menu cannot open. @default false */\n disabled?: boolean;\n /** Danger ring + border. @default false */\n invalid?: boolean;\n /** Skeleton rows in the menu; trigger reads \"Loading...\". @default false */\n loading?: boolean;\n /** Type-to-filter field pinned above the list. @default false */\n searchable?: boolean;\n /** Placeholder for the `searchable` filter input. @default 'Filter options' */\n searchPlaceholder?: string;\n /** Your own icon node pinned before the trigger label; else the sole selected option's icon. */\n leadingIcon?: ReactNode;\n /** Base id for the trigger/menu/list ids and a11y wiring; auto-generated if omitted. */\n id?: string;\n /** Accessible name for the trigger and listbox - supply when there is no visible label. */\n ariaLabel?: string;\n /** Standard <div> attributes (className, style, data-*, ...) forwarded to the select root. */\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n /** Menu open/close timing - motion tokens only, or `null` to disable. @default duration 'base' + ease 'entrance'/'exit' */\n animation?: DisableableAnimation;\n}\n\nfunction CheckboxTick({ checked }: { checked: boolean }) {\n return (\n <span className=\"cbx\" aria-hidden=\"true\">\n <CheckGlyph checked={checked} readOnly tabIndex={-1} />\n </span>\n );\n}\n\nexport function MultiSelect({\n options = [],\n value: controlledValue,\n defaultValue = [],\n onChange,\n placeholder = 'Select options',\n size = 'md',\n disabled = false,\n invalid = false,\n loading = false,\n searchable = false,\n searchPlaceholder = 'Filter options',\n leadingIcon = null,\n id,\n ariaLabel,\n htmlProps,\n animation,\n}: MultiSelectProps) {\n const [value, setValue] = useControllable<string[], SelectOption>(\n controlledValue,\n defaultValue,\n onChange as ((next: string[], opt?: SelectOption) => void) | undefined,\n );\n const values = Array.isArray(value) ? value : [];\n const isSelected = (v: string) => values.indexOf(v) !== -1;\n\n const lb = useListbox({\n options,\n disabled,\n loading,\n searchable,\n id,\n idPrefix: 'mselect-',\n isSelected,\n onCommit: (opt) =>\n setValue(isSelected(opt.value) ? values.filter((v) => v !== opt.value) : [...values, opt.value], opt),\n closeOnCommit: false,\n });\n\n const selectedOptions = lb.flat.filter((o) => isSelected(o.value));\n const isPlaceholder = !loading && selectedOptions.length === 0;\n\n return (\n <div\n {...htmlProps}\n className={cx('select', htmlProps?.className)}\n data-multiple=\"true\"\n data-size={size}\n data-open={lb.open ? 'true' : undefined}\n data-disabled={disabled ? 'true' : undefined}\n data-invalid={invalid ? 'true' : undefined}\n data-loading={loading ? 'true' : undefined}\n >\n <SelectTrigger\n lb={lb}\n disabled={disabled}\n invalid={invalid}\n ariaLabel={ariaLabel}\n leading={leadingIcon || (selectedOptions.length === 1 && selectedOptions[0].icon) || null}\n text={loading ? 'Loading...' : isPlaceholder ? placeholder : selectedOptions[0].label}\n isPlaceholder={isPlaceholder}\n count={selectedOptions.length - 1}\n />\n <ListboxPanel\n lb={lb}\n loading={loading}\n searchable={searchable}\n searchPlaceholder={searchPlaceholder}\n ariaLabel={ariaLabel}\n multiple\n animation={animation}\n size={size}\n check={(sel) => <CheckboxTick checked={sel} />}\n />\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { CSSProperties, InputHTMLAttributes } from 'react';
|
|
3
|
+
import { F as FieldIdProps, a as FieldCoreMessagingProps } from './field-chrome-CMPOQSLs.js';
|
|
4
|
+
import { D as DataAttributes } from './dom-props-C0jrllBw.js';
|
|
5
|
+
|
|
6
|
+
interface NumberFieldOwnProps extends FieldIdProps, FieldCoreMessagingProps {
|
|
7
|
+
/** Unit suffix shown inside the field (e.g. "days", "%"). */
|
|
8
|
+
unit?: string;
|
|
9
|
+
/** Minimum value - steps and committed typing clamp up to this; the decrease stepper disables here. @default 0 */
|
|
10
|
+
min?: number;
|
|
11
|
+
/** Maximum value - steps and committed typing clamp down to this; the increase stepper disables here. @default Infinity */
|
|
12
|
+
max?: number;
|
|
13
|
+
/** Amount added/removed per ArrowUp/ArrowDown press and per caret stepper click. Decimals work. @default 1 */
|
|
14
|
+
step?: number;
|
|
15
|
+
/** Controlled numeric value. Omit for uncontrolled (use `defaultValue`). */
|
|
16
|
+
value?: number | string;
|
|
17
|
+
/** Uncontrolled initial value. Use instead of `value`. @default 0 */
|
|
18
|
+
defaultValue?: number;
|
|
19
|
+
/** Called with the next clamped number. */
|
|
20
|
+
onChange?: (value: number) => void;
|
|
21
|
+
/** Disabled - the input and both steppers go inert. */
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
/** Control height: sm - md (default) - lg. */
|
|
24
|
+
size?: 'sm' | 'md' | 'lg';
|
|
25
|
+
/** Extra class(es) merged onto the field root. */
|
|
26
|
+
className?: string;
|
|
27
|
+
/** Inline styles merged onto the field root. */
|
|
28
|
+
style?: CSSProperties;
|
|
29
|
+
}
|
|
30
|
+
interface NumberFieldProps extends NumberFieldOwnProps {
|
|
31
|
+
/** Standard <input> attributes (name, aria-*, ...) forwarded to the input. */
|
|
32
|
+
htmlProps?: Omit<InputHTMLAttributes<HTMLInputElement>, keyof NumberFieldOwnProps | 'size' | 'value' | 'onChange' | 'min' | 'max' | 'step'> & DataAttributes;
|
|
33
|
+
}
|
|
34
|
+
declare function NumberField({ id, label, helper, error, unit, min, max, step, value, defaultValue, onChange, disabled, size, className, style, htmlProps, }: NumberFieldProps): react.JSX.Element;
|
|
35
|
+
|
|
36
|
+
export { NumberField, type NumberFieldProps };
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
'use client';import { FieldLabel, FieldMessage } from './chunk-I4XQ4PV2.js';
|
|
2
|
+
import { Icon } from './chunk-3SBCBYB7.js';
|
|
3
|
+
import { useControllable } from './chunk-MMRIQNEN.js';
|
|
4
|
+
import './chunk-7SZCJ7WI.js';
|
|
5
|
+
import './chunk-VTJTGVZZ.js';
|
|
6
|
+
import { cx } from './chunk-QGNC7LH5.js';
|
|
7
|
+
import './input.css';
|
|
8
|
+
import { useState } from 'react';
|
|
9
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
function NumberField({
|
|
12
|
+
id,
|
|
13
|
+
label,
|
|
14
|
+
helper,
|
|
15
|
+
error,
|
|
16
|
+
unit,
|
|
17
|
+
min = 0,
|
|
18
|
+
max = Infinity,
|
|
19
|
+
step = 1,
|
|
20
|
+
value,
|
|
21
|
+
defaultValue = 0,
|
|
22
|
+
onChange,
|
|
23
|
+
disabled,
|
|
24
|
+
size,
|
|
25
|
+
className = "",
|
|
26
|
+
style,
|
|
27
|
+
htmlProps
|
|
28
|
+
}) {
|
|
29
|
+
const resolvedValue = value === void 0 ? void 0 : typeof value === "number" ? value : parseFloat(value) || 0;
|
|
30
|
+
const [num, setNum] = useControllable(resolvedValue, defaultValue, onChange);
|
|
31
|
+
const [draft, setDraft] = useState(null);
|
|
32
|
+
const v = draft !== null ? parseFloat(draft) || 0 : num;
|
|
33
|
+
const snap = (n) => parseFloat(n.toFixed(10));
|
|
34
|
+
const clamp = (n) => Math.min(max, Math.max(min, snap(n)));
|
|
35
|
+
const commit = (n) => {
|
|
36
|
+
setDraft(null);
|
|
37
|
+
setNum(clamp(n));
|
|
38
|
+
};
|
|
39
|
+
const cls = cx(
|
|
40
|
+
"fld",
|
|
41
|
+
"numf",
|
|
42
|
+
unit && "numf--unit",
|
|
43
|
+
size === "sm" ? "fld--sm" : size === "lg" ? "fld--lg" : "",
|
|
44
|
+
error && "is-error",
|
|
45
|
+
className
|
|
46
|
+
);
|
|
47
|
+
return /* @__PURE__ */ jsxs("div", { className: cls, style, children: [
|
|
48
|
+
/* @__PURE__ */ jsx(FieldLabel, { id, label }),
|
|
49
|
+
/* @__PURE__ */ jsxs("div", { className: "fld__control", children: [
|
|
50
|
+
/* @__PURE__ */ jsx(
|
|
51
|
+
"input",
|
|
52
|
+
{
|
|
53
|
+
id,
|
|
54
|
+
className: "fld__input",
|
|
55
|
+
type: "text",
|
|
56
|
+
inputMode: "decimal",
|
|
57
|
+
disabled,
|
|
58
|
+
"aria-invalid": error ? true : void 0,
|
|
59
|
+
value: draft !== null ? draft : String(num),
|
|
60
|
+
onChange: (e) => {
|
|
61
|
+
const text = e.target.value.replace(/[^\d.-]/g, "");
|
|
62
|
+
setDraft(text);
|
|
63
|
+
setNum(clamp(parseFloat(text) || 0));
|
|
64
|
+
},
|
|
65
|
+
onBlur: () => commit(v),
|
|
66
|
+
onKeyDown: (e) => {
|
|
67
|
+
if (e.key === "ArrowUp") {
|
|
68
|
+
e.preventDefault();
|
|
69
|
+
commit(v + step);
|
|
70
|
+
}
|
|
71
|
+
if (e.key === "ArrowDown") {
|
|
72
|
+
e.preventDefault();
|
|
73
|
+
commit(v - step);
|
|
74
|
+
}
|
|
75
|
+
if (e.key === "Enter") commit(v);
|
|
76
|
+
},
|
|
77
|
+
...htmlProps
|
|
78
|
+
}
|
|
79
|
+
),
|
|
80
|
+
unit && /* @__PURE__ */ jsx("span", { className: "numf__unit", children: unit }),
|
|
81
|
+
/* @__PURE__ */ jsxs("div", { className: "numf__steppers", children: [
|
|
82
|
+
/* @__PURE__ */ jsx(
|
|
83
|
+
"button",
|
|
84
|
+
{
|
|
85
|
+
type: "button",
|
|
86
|
+
className: "numf__step",
|
|
87
|
+
"aria-label": "Increase",
|
|
88
|
+
disabled: disabled || v >= max,
|
|
89
|
+
onClick: () => commit(v + step),
|
|
90
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "caret-up", size: "sm" })
|
|
91
|
+
}
|
|
92
|
+
),
|
|
93
|
+
/* @__PURE__ */ jsx(
|
|
94
|
+
"button",
|
|
95
|
+
{
|
|
96
|
+
type: "button",
|
|
97
|
+
className: "numf__step",
|
|
98
|
+
"aria-label": "Decrease",
|
|
99
|
+
disabled: disabled || v <= min,
|
|
100
|
+
onClick: () => commit(v - step),
|
|
101
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "caret-down", size: "sm" })
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
] })
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ jsx(FieldMessage, { message: error || helper, icon: error ? "warning-circle" : null })
|
|
107
|
+
] });
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export { NumberField };
|
|
111
|
+
//# sourceMappingURL=number-field.js.map
|
|
112
|
+
//# sourceMappingURL=number-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/input/NumberField.tsx"],"names":[],"mappings":"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","file":"number-field.js","sourcesContent":["'use client';\n\nimport './input.css';\nimport { useState } from 'react';\nimport type { CSSProperties, InputHTMLAttributes } from 'react';\nimport { Icon } from '../../internal/icon/Icon';\nimport { FieldLabel, FieldMessage, type FieldCoreMessagingProps, type FieldIdProps } from './field-chrome';\nimport { useControllable } from '../../internal/hooks/use-controllable';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\ninterface NumberFieldOwnProps extends FieldIdProps, FieldCoreMessagingProps {\n /** Unit suffix shown inside the field (e.g. \"days\", \"%\"). */\n unit?: string;\n /** Minimum value - steps and committed typing clamp up to this; the decrease stepper disables here. @default 0 */\n min?: number;\n /** Maximum value - steps and committed typing clamp down to this; the increase stepper disables here. @default Infinity */\n max?: number;\n /** Amount added/removed per ArrowUp/ArrowDown press and per caret stepper click. Decimals work. @default 1 */\n step?: number;\n /** Controlled numeric value. Omit for uncontrolled (use `defaultValue`). */\n value?: number | string;\n /** Uncontrolled initial value. Use instead of `value`. @default 0 */\n defaultValue?: number;\n /** Called with the next clamped number. */\n onChange?: (value: number) => void;\n /** Disabled - the input and both steppers go inert. */\n disabled?: boolean;\n /** Control height: sm - md (default) - lg. */\n size?: 'sm' | 'md' | 'lg';\n /** Extra class(es) merged onto the field root. */\n className?: string;\n /** Inline styles merged onto the field root. */\n style?: CSSProperties;\n}\n\nexport interface NumberFieldProps extends NumberFieldOwnProps {\n /** Standard <input> attributes (name, aria-*, ...) forwarded to the input. */\n htmlProps?: Omit<\n InputHTMLAttributes<HTMLInputElement>,\n keyof NumberFieldOwnProps | 'size' | 'value' | 'onChange' | 'min' | 'max' | 'step'\n > &\n DataAttributes;\n}\n\nexport function NumberField({\n id,\n label,\n helper,\n error,\n unit,\n min = 0,\n max = Infinity,\n step = 1,\n value,\n defaultValue = 0,\n onChange,\n disabled,\n size,\n className = '',\n style,\n htmlProps,\n}: NumberFieldProps) {\n const resolvedValue = value === undefined ? undefined : typeof value === 'number' ? value : parseFloat(value) || 0;\n const [num, setNum] = useControllable<number>(resolvedValue, defaultValue, onChange);\n const [draft, setDraft] = useState<string | null>(null);\n const v = draft !== null ? parseFloat(draft) || 0 : num;\n const snap = (n: number) => parseFloat(n.toFixed(10));\n const clamp = (n: number) => Math.min(max, Math.max(min, snap(n)));\n const commit = (n: number) => {\n setDraft(null);\n setNum(clamp(n));\n };\n const cls = cx(\n 'fld',\n 'numf',\n unit && 'numf--unit',\n size === 'sm' ? 'fld--sm' : size === 'lg' ? 'fld--lg' : '',\n error && 'is-error',\n className,\n );\n\n return (\n <div className={cls} style={style}>\n <FieldLabel id={id} label={label} />\n <div className=\"fld__control\">\n <input\n id={id}\n className=\"fld__input\"\n type=\"text\"\n inputMode=\"decimal\"\n disabled={disabled}\n aria-invalid={error ? true : undefined}\n value={draft !== null ? draft : String(num)}\n onChange={(e) => {\n const text = e.target.value.replace(/[^\\d.-]/g, '');\n setDraft(text);\n setNum(clamp(parseFloat(text) || 0));\n }}\n onBlur={() => commit(v)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n commit(v + step);\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n commit(v - step);\n }\n if (e.key === 'Enter') commit(v);\n }}\n {...htmlProps}\n />\n {unit && <span className=\"numf__unit\">{unit}</span>}\n <div className=\"numf__steppers\">\n <button\n type=\"button\"\n className=\"numf__step\"\n aria-label=\"Increase\"\n disabled={disabled || v >= max}\n onClick={() => commit(v + step)}\n >\n <Icon name=\"caret-up\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n className=\"numf__step\"\n aria-label=\"Decrease\"\n disabled={disabled || v <= min}\n onClick={() => commit(v - step)}\n >\n <Icon name=\"caret-down\" size=\"sm\" />\n </button>\n </div>\n </div>\n <FieldMessage message={error || helper} icon={error ? 'warning-circle' : null} />\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/* Odometer - each digit is a column clipping a 0-9 strip; .odo__strip--N sets the translateY (no inline styles). */
|
|
2
|
+
.odo {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
}
|
|
6
|
+
.odo__col {
|
|
7
|
+
display: inline-block;
|
|
8
|
+
height: 1em;
|
|
9
|
+
line-height: 1;
|
|
10
|
+
overflow: hidden;
|
|
11
|
+
}
|
|
12
|
+
.odo__strip {
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
transition: transform var(--duration-slow) var(--ease-entrance);
|
|
16
|
+
will-change: transform;
|
|
17
|
+
}
|
|
18
|
+
.odo__strip > span {
|
|
19
|
+
height: 1em;
|
|
20
|
+
line-height: 1;
|
|
21
|
+
display: block;
|
|
22
|
+
text-align: center;
|
|
23
|
+
}
|
|
24
|
+
.odo__fixed {
|
|
25
|
+
display: inline-block;
|
|
26
|
+
}
|
|
27
|
+
.odo__strip--0 {
|
|
28
|
+
transform: translateY(0);
|
|
29
|
+
}
|
|
30
|
+
.odo__strip--1 {
|
|
31
|
+
transform: translateY(-1em);
|
|
32
|
+
}
|
|
33
|
+
.odo__strip--2 {
|
|
34
|
+
transform: translateY(-2em);
|
|
35
|
+
}
|
|
36
|
+
.odo__strip--3 {
|
|
37
|
+
transform: translateY(-3em);
|
|
38
|
+
}
|
|
39
|
+
.odo__strip--4 {
|
|
40
|
+
transform: translateY(-4em);
|
|
41
|
+
}
|
|
42
|
+
.odo__strip--5 {
|
|
43
|
+
transform: translateY(-5em);
|
|
44
|
+
}
|
|
45
|
+
.odo__strip--6 {
|
|
46
|
+
transform: translateY(-6em);
|
|
47
|
+
}
|
|
48
|
+
.odo__strip--7 {
|
|
49
|
+
transform: translateY(-7em);
|
|
50
|
+
}
|
|
51
|
+
.odo__strip--8 {
|
|
52
|
+
transform: translateY(-8em);
|
|
53
|
+
}
|
|
54
|
+
.odo__strip--9 {
|
|
55
|
+
transform: translateY(-9em);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@media (prefers-reduced-motion: reduce) {
|
|
59
|
+
.odo__strip {
|
|
60
|
+
transition: none;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { CSSProperties, HTMLAttributes } from 'react';
|
|
3
|
+
import { D as DataAttributes } from './dom-props-C0jrllBw.js';
|
|
4
|
+
|
|
5
|
+
interface OtpFieldOwnProps {
|
|
6
|
+
/** Number of slots. @default 6 */
|
|
7
|
+
length?: number;
|
|
8
|
+
/** Controlled value (digit string). */
|
|
9
|
+
value?: string;
|
|
10
|
+
/** Called with the next value string. */
|
|
11
|
+
onChange?: (value: string) => void;
|
|
12
|
+
/** Insert a separator every N slots (e.g. 3 - "-------"). */
|
|
13
|
+
group?: number;
|
|
14
|
+
/** Error state (red slots + ring). */
|
|
15
|
+
error?: boolean;
|
|
16
|
+
/** Disable every slot. */
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
/** Compact slot sizing. Only `sm`; omit for default. */
|
|
19
|
+
size?: 'sm';
|
|
20
|
+
/** Extra class(es) appended to the root wrapper. */
|
|
21
|
+
className?: string;
|
|
22
|
+
/** Inline styles merged onto the root wrapper. */
|
|
23
|
+
style?: CSSProperties;
|
|
24
|
+
}
|
|
25
|
+
interface OtpFieldProps extends OtpFieldOwnProps {
|
|
26
|
+
/** Standard <div> attributes (aria-*, data-*, ...) forwarded to the root wrapper. */
|
|
27
|
+
htmlProps?: Omit<HTMLAttributes<HTMLDivElement>, keyof OtpFieldOwnProps> & DataAttributes;
|
|
28
|
+
}
|
|
29
|
+
declare function OtpField({ length, value, onChange, group, error, disabled, size, className, style, htmlProps, }: OtpFieldProps): react.JSX.Element;
|
|
30
|
+
|
|
31
|
+
export { OtpField, type OtpFieldProps };
|