@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/toast/Toast.tsx"],"names":[],"mappings":"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","file":"toast.js","sourcesContent":["'use client';\n\nimport './toast.css';\nimport {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type FocusEvent as ReactFocusEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { animate, startDrag, type Layer, type Playback } from '../../../engine';\nimport { Presence } from '../../../motion/presence';\nimport { Motion } from '../../../motion/element';\nimport { UIMotion } from '../../../tokens/motion-tokens';\nimport { fireGlint } from '../../internal/glass/glint';\nimport { tokenPx } from '../../internal/utils/token-px';\nimport { Icon, type IconName } from '../../internal/icon/Icon';\nimport { Button } from '../../primitives/button/Button';\nimport { UIToast, DEFAULT_TOASTER_CONFIG, type ToastRecord, type ToastTone, type ToasterConfig } from './toast-store';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\nconst SM = UIMotion;\nconst store = UIToast;\n\nconst COLLAPSE_GRACE = 140;\nconst SWIPE_X = 64;\nconst SWIPE_V = 480;\n\nlet GAP = 0;\nfunction stackGap() {\n if (!GAP) GAP = tokenPx('--space-3') || 12;\n return GAP;\n}\n\nconst TONE_ICON: Partial<Record<ToastTone, IconName>> = {\n success: 'check-circle',\n danger: 'warning-circle',\n warning: 'warning',\n info: 'info',\n};\n\nfunction useToneGesture(tone: ToastTone, ref: RefObject<HTMLElement>) {\n const prevTone = useRef<ToastTone | null>(null);\n useEffect(() => {\n const prev = prevTone.current;\n prevTone.current = tone;\n if (tone === prev) return;\n if (tone === 'success') return fireGlint(ref.current);\n if (tone === 'danger' && ref.current) {\n const shake = ref.current.firstElementChild as HTMLElement | null;\n if (!shake) return;\n const fall = animate(shake, {\n x: [0, -7, 5, -2, 0],\n timing: { duration: SM.dur.slow, ease: SM.ease.standard, delay: SM.dur.base },\n });\n fall.finished.then(() => fall.stop());\n return () => fall.stop();\n }\n }, [tone]);\n}\n\nfunction useReplay<T extends HTMLElement>(token: unknown, build: () => Layer[]) {\n const ref = useRef<T>(null);\n const latest = useRef(build);\n latest.current = build;\n useLayoutEffect(() => {\n if (ref.current) animate(ref.current, ...latest.current());\n }, [token]);\n return ref;\n}\n\nfunction ToastItem({\n t,\n depth,\n offset,\n hidden,\n behind,\n frameHeight,\n isTop,\n onHeight,\n}: {\n t: ToastRecord;\n depth: number;\n offset: number;\n hidden: boolean;\n behind: boolean;\n frameHeight: number | null;\n isTop: boolean;\n onHeight: (id: string, h: number) => void;\n}) {\n const ref = useRef<HTMLLIElement>(null);\n const settled = useRef(false);\n const swipeBack = useRef<Playback | null>(null);\n useToneGesture(t.tone, ref);\n\n useLayoutEffect(() => {\n if (ref.current && ref.current.firstElementChild)\n onHeight(t.id, (ref.current.firstElementChild as HTMLElement).offsetHeight);\n });\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n el.style.pointerEvents = hidden ? 'none' : 'auto';\n const y = isTop ? offset : -offset;\n const scale = 1 - depth * 0.05;\n if (settled.current) {\n animate(\n el,\n { y: [y], scale: [scale], height: [frameHeight ?? 'auto'], timing: SM.t.settle },\n { opacity: [hidden ? 0 : 1], timing: SM.t.enter },\n );\n return;\n }\n settled.current = true;\n animate(\n el,\n { y: [isTop ? -24 : 24, y], scale: [0.97, scale], timing: SM.t.settle },\n { opacity: [0, hidden ? 0 : 1], timing: SM.t.enter },\n );\n }, [offset, depth, hidden, frameHeight, isTop]);\n\n const onPointerDown = (e: ReactPointerEvent) => {\n const inner = ref.current?.firstElementChild as HTMLElement | null;\n if (!t.dismissible || e.button !== 0 || !inner) return;\n swipeBack.current?.stop();\n startDrag(e, {\n onMove: (info) => {\n const dx = info.offset.x;\n inner.style.translate = `${dx > 0 ? dx * 0.9 : dx * 0.04}px 0px`;\n },\n onEnd: (info) => {\n if (info.offset.x > SWIPE_X || info.velocity.x > SWIPE_V) {\n animate(inner, { x: [420], timing: SM.t.exit }).finished.then(() => store.dismiss(t.id));\n return;\n }\n const back = animate(inner, { x: [0], timing: SM.t.settle });\n swipeBack.current = back;\n back.finished.then(() => back.stop());\n },\n });\n };\n\n return (\n <Motion\n as=\"li\"\n ref={ref}\n exit={{ opacity: [0], scale: [0.96], timing: SM.t.exit }}\n className=\"toast glass\"\n data-tone={t.tone}\n data-behind={behind ? '' : undefined}\n role={t.tone === 'danger' ? 'alert' : 'status'}\n aria-atomic=\"true\"\n onPointerDown={onPointerDown}\n onKeyDown={(e: ReactKeyboardEvent) => {\n if (e.key === 'Escape' && t.dismissible) store.dismiss(t.id);\n }}\n >\n {t.node ? <div className=\"toast__custom\">{t.node as ReactNode}</div> : <ToastBody t={t} />}\n </Motion>\n );\n}\n\nfunction ToastBody({ t }: { t: ToastRecord }) {\n const glyphRef = useReplay<HTMLSpanElement>(t.tone, () => [\n { scale: [0.5, 1], timing: SM.t.settle },\n { opacity: [0, 1], timing: SM.t.enter },\n ]);\n const textRef = useReplay<HTMLDivElement>(String(t.message) + '-' + String(t.description), () => [\n { opacity: [0, 1], timing: SM.t.enter },\n ]);\n const countRef = useReplay<HTMLSpanElement>(t.count, () => [{ scale: [0.6, 1], timing: SM.t.settle }]);\n\n return (\n <div className=\"toast__inner\">\n {(t.tone !== 'default' || isFinite(t.duration)) && (\n <span className=\"toast__icon\">\n {t.tone !== 'default' && (\n <span ref={glyphRef} className=\"toast__icon-glyph\">\n {t.tone === 'loading' ? (\n <span className=\"toast__spinner\" aria-hidden=\"true\"></span>\n ) : (\n <Icon name={TONE_ICON[t.tone] || 'info'} weight=\"fill\" />\n )}\n </span>\n )}\n {isFinite(t.duration) && (\n <svg key={'ring-' + t.timerKey} className=\"toast__ring\" viewBox=\"0 0 36 36\" aria-hidden=\"true\">\n <circle className=\"toast__ring-track\" cx=\"18\" cy=\"18\" r=\"16.5\"></circle>\n <circle\n className=\"toast__ring-arc\"\n cx=\"18\"\n cy=\"18\"\n r=\"16.5\"\n pathLength={1}\n style={{ animationDuration: t.duration + 'ms' }}\n ></circle>\n </svg>\n )}\n </span>\n )}\n <div ref={textRef} className=\"toast__text\">\n <p className=\"toast__message\">{t.message}</p>\n {t.description != null && <p className=\"toast__desc\">{t.description}</p>}\n </div>\n {t.count > 1 && (\n <span ref={countRef} className=\"toast__count\">\n ×{t.count}\n </span>\n )}\n {t.action && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n className=\"toast__action\"\n onClick={() => {\n if (t.action.onClick) t.action.onClick();\n store.dismiss(t.id);\n }}\n >\n {t.action.label}\n </Button>\n )}\n {t.dismissible && (\n <button type=\"button\" className=\"toast__close\" aria-label=\"Dismiss\" onClick={() => store.dismiss(t.id)}>\n <Icon name=\"close\" size=\"sm\" />\n </button>\n )}\n </div>\n );\n}\n\nfunction ToastHost({ config, htmlProps }: { config: ToasterConfig; htmlProps?: HTMLAttributes<HTMLOListElement> }) {\n const { toasts, paused, expanded: hoverExpanded } = useSyncExternalStore(store.subscribe, store.get, store.get);\n const [heights, setHeights] = useState<Record<string, number>>({});\n const [ready, setReady] = useState(false);\n const collapseTimer = useRef<ReturnType<typeof setTimeout> | 0>(0);\n const hovering = useRef(false);\n\n useEffect(() => setReady(true), []);\n\n const onHeight = (id: string, h: number) => setHeights((prev) => (prev[id] === h ? prev : { ...prev, [id]: h }));\n\n const onHold = () => {\n hovering.current = true;\n clearTimeout(collapseTimer.current);\n store.setExpanded(true);\n store.pause();\n };\n const onRelease = (graced: boolean) => {\n hovering.current = false;\n clearTimeout(collapseTimer.current);\n collapseTimer.current = setTimeout(\n () => {\n store.setExpanded(false);\n store.resume();\n },\n graced ? COLLAPSE_GRACE : 0,\n );\n };\n\n useEffect(() => {\n const onVis = () => {\n if (document.hidden) store.pause();\n else if (!hovering.current) store.resume();\n };\n document.addEventListener('visibilitychange', onVis);\n return () => document.removeEventListener('visibilitychange', onVis);\n }, []);\n\n useEffect(() => {\n if (toasts.length === 0) {\n hovering.current = false;\n clearTimeout(collapseTimer.current);\n store.setExpanded(false);\n store.resume();\n }\n }, [toasts.length]);\n\n if (!ready) return null;\n\n const isTop = config.position.startsWith('top');\n const visible = config.visibleToasts;\n const rendered = visible * 2;\n const gap = config.gap || stackGap();\n const expanded = config.expand || hoverExpanded;\n\n const slice = toasts.slice(-rendered);\n const n = slice.length;\n const frontH = n ? heights[slice[n - 1].id] || 0 : 0;\n\n return createPortal(\n <ol\n {...htmlProps}\n className={cx('toast-viewport', paused && 'is-paused', htmlProps?.className)}\n data-position={config.position}\n style={\n config.offset\n ? ({ ...htmlProps?.style, '--toast-offset': `${config.offset}px` } as CSSProperties)\n : htmlProps?.style\n }\n aria-label=\"Notifications\"\n onPointerOver={(e: ReactPointerEvent<HTMLOListElement>) => {\n if (e.pointerType !== 'touch') onHold();\n }}\n onPointerOut={(e: ReactPointerEvent<HTMLOListElement>) => {\n if (!e.relatedTarget || !e.currentTarget.contains(e.relatedTarget as Node)) onRelease(true);\n }}\n onFocus={onHold}\n onBlur={(e: ReactFocusEvent<HTMLOListElement>) => {\n if (!e.relatedTarget || !e.currentTarget.contains(e.relatedTarget as Node)) onRelease(false);\n }}\n >\n <Presence>\n {slice.map((t, i) => {\n const depth = n - 1 - i;\n let offset = depth * gap;\n if (expanded) {\n offset = 0;\n for (let j = i + 1; j < n; j++) offset += (heights[slice[j].id] || 0) + gap;\n }\n return (\n <ToastItem\n key={t.id}\n t={t}\n depth={expanded ? 0 : depth}\n offset={offset}\n hidden={!expanded && depth >= visible}\n behind={!expanded && depth > 0}\n frameHeight={!expanded && depth > 0 && frontH ? frontH : null}\n isTop={isTop}\n onHeight={onHeight}\n />\n );\n })}\n </Presence>\n </ol>,\n document.body,\n );\n}\n\nfunction stripUndefined<T extends object>(o: T): Partial<T> {\n const out: Partial<T> = {};\n (Object.keys(o) as (keyof T)[]).forEach((k) => {\n if (o[k] !== undefined) out[k] = o[k];\n });\n return out;\n}\n\nexport interface ToasterProps extends Partial<ToasterConfig> {\n /** Standard <ol> attributes (className, style, data-*, ...) forwarded to the toast viewport. */\n htmlProps?: HTMLAttributes<HTMLOListElement> & DataAttributes;\n}\n\nexport function Toaster({ htmlProps, ...props }: ToasterProps): ReactElement {\n const config: ToasterConfig = { ...DEFAULT_TOASTER_CONFIG, ...stripUndefined(props) };\n\n useEffect(() => {\n store.config = config;\n store.mounted = true;\n if (config.expand) store.setExpanded(true);\n return () => {\n store.mounted = false;\n };\n }, [config.position, config.duration, config.visibleToasts, config.gap, config.offset, config.expand]);\n\n return <ToastHost config={config} htmlProps={htmlProps} />;\n}\n\nexport { toast } from './toast-store';\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, CSSProperties, ButtonHTMLAttributes } from 'react';
|
|
3
|
+
import { D as DataAttributes } from './dom-props-C0jrllBw.js';
|
|
4
|
+
|
|
5
|
+
interface ToggleTagOwnProps {
|
|
6
|
+
/** Chip content; the label shown beside the tick or `icon`. */
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
/** Controlled selected value. Omit for uncontrolled. */
|
|
9
|
+
selected?: boolean;
|
|
10
|
+
/** Uncontrolled initial value. */
|
|
11
|
+
defaultSelected?: boolean;
|
|
12
|
+
/** Fires with the next value on every toggle. */
|
|
13
|
+
onChange?: (selected: boolean) => void;
|
|
14
|
+
/** Your own icon node; replaces the tick. Selected state reads from the wash. */
|
|
15
|
+
icon?: ReactNode | null;
|
|
16
|
+
/** Optional result count - rendered mono/tabular. */
|
|
17
|
+
count?: ReactNode;
|
|
18
|
+
/** 'md' = 28px (default) - 'sm' = 24px for dense rows. */
|
|
19
|
+
size?: 'md' | 'sm';
|
|
20
|
+
/** Disable the button, blocking toggles. @default false */
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
/** Extra class(es) merged onto the root element. */
|
|
23
|
+
className?: string;
|
|
24
|
+
/** Inline styles merged onto the root element. */
|
|
25
|
+
style?: CSSProperties;
|
|
26
|
+
}
|
|
27
|
+
/** ToggleTag - the on/off filter chip (<button aria-pressed>). */
|
|
28
|
+
interface ToggleTagProps extends ToggleTagOwnProps {
|
|
29
|
+
/** Standard <button> attributes forwarded to the chip. */
|
|
30
|
+
htmlProps?: Omit<ButtonHTMLAttributes<HTMLButtonElement>, keyof ToggleTagOwnProps> & DataAttributes;
|
|
31
|
+
}
|
|
32
|
+
declare function ToggleTag({ children, selected: selectedProp, defaultSelected, onChange, icon, count, size, disabled, className, style, htmlProps, }: ToggleTagProps): react.JSX.Element;
|
|
33
|
+
|
|
34
|
+
export { ToggleTag, type ToggleTagProps };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use client';import { IconSlot } from './chunk-2ERBBFZS.js';
|
|
2
|
+
import { useControllable } from './chunk-MMRIQNEN.js';
|
|
3
|
+
import { cx } from './chunk-QGNC7LH5.js';
|
|
4
|
+
import './tag.css';
|
|
5
|
+
import './collapse.css';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
function ToggleTagTick({ selected }) {
|
|
9
|
+
return /* @__PURE__ */ jsx("span", { className: "tag__check collapse", "data-axis": "width", "data-open": selected ? "true" : "false", "aria-hidden": "true", children: /* @__PURE__ */ jsx("span", { className: "collapse__inner", children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 12 12", fill: "none", children: /* @__PURE__ */ jsx(
|
|
10
|
+
"path",
|
|
11
|
+
{
|
|
12
|
+
d: "M2.5 6.5 L5 9 L9.5 3.5",
|
|
13
|
+
pathLength: "1",
|
|
14
|
+
strokeWidth: "1.5",
|
|
15
|
+
strokeLinecap: "round",
|
|
16
|
+
strokeLinejoin: "round"
|
|
17
|
+
}
|
|
18
|
+
) }) }) });
|
|
19
|
+
}
|
|
20
|
+
function ToggleTag({
|
|
21
|
+
children,
|
|
22
|
+
selected: selectedProp,
|
|
23
|
+
defaultSelected = false,
|
|
24
|
+
onChange,
|
|
25
|
+
icon = null,
|
|
26
|
+
count = null,
|
|
27
|
+
size = "md",
|
|
28
|
+
disabled = false,
|
|
29
|
+
className = "",
|
|
30
|
+
style,
|
|
31
|
+
htmlProps
|
|
32
|
+
}) {
|
|
33
|
+
const [selected, setSelected] = useControllable(selectedProp, defaultSelected, onChange);
|
|
34
|
+
const toggle = () => setSelected(!selected);
|
|
35
|
+
const cls = cx("tag", "tag--toggle", size === "sm" && "tag--sm", className);
|
|
36
|
+
return /* @__PURE__ */ jsxs(
|
|
37
|
+
"button",
|
|
38
|
+
{
|
|
39
|
+
type: "button",
|
|
40
|
+
className: cls,
|
|
41
|
+
style,
|
|
42
|
+
"aria-pressed": selected,
|
|
43
|
+
disabled,
|
|
44
|
+
onClick: toggle,
|
|
45
|
+
...htmlProps,
|
|
46
|
+
children: [
|
|
47
|
+
icon ? /* @__PURE__ */ jsx("span", { className: "tag__icon", children: /* @__PURE__ */ jsx(IconSlot, { size: "sm", children: icon }) }) : /* @__PURE__ */ jsx(ToggleTagTick, { selected }),
|
|
48
|
+
/* @__PURE__ */ jsx("span", { className: "tag__label", children }),
|
|
49
|
+
count != null && /* @__PURE__ */ jsx("span", { className: "tag__count", children: count })
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { ToggleTag };
|
|
56
|
+
//# sourceMappingURL=toggle-tag.js.map
|
|
57
|
+
//# sourceMappingURL=toggle-tag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/tag/ToggleTag.tsx"],"names":[],"mappings":";;;;;;;AAuCA,SAAS,aAAA,CAAc,EAAE,QAAA,EAAS,EAA0B;AAC1D,EAAA,uBACE,GAAA,CAAC,UAAK,SAAA,EAAU,qBAAA,EAAsB,aAAU,OAAA,EAAQ,WAAA,EAAW,WAAW,MAAA,GAAS,OAAA,EAAS,eAAY,MAAA,EAC1G,QAAA,kBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,iBAAA,EACd,8BAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAC5B,QAAA,kBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,CAAA,EAAE,wBAAA;AAAA,MACF,UAAA,EAAW,GAAA;AAAA,MACX,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe;AAAA;AAAA,GACjB,EACF,GACF,CAAA,EACF,CAAA;AAEJ;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,QAAA;AAAA,EACA,QAAA,EAAU,YAAA;AAAA,EACV,eAAA,GAAkB,KAAA;AAAA,EAClB,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,KAAA,GAAQ,IAAA;AAAA,EACR,IAAA,GAAO,IAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,IAAI,eAAA,CAAgB,YAAA,EAAc,iBAAiB,QAAQ,CAAA;AACvF,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,CAAC,QAAQ,CAAA;AAE1C,EAAA,MAAM,MAAM,EAAA,CAAG,KAAA,EAAO,eAAe,IAAA,KAAS,IAAA,IAAQ,WAAW,SAAS,CAAA;AAE1E,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,GAAA;AAAA,MACX,KAAA;AAAA,MACA,cAAA,EAAc,QAAA;AAAA,MACd,QAAA;AAAA,MACA,OAAA,EAAS,MAAA;AAAA,MACR,GAAG,SAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA,mBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EACd,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,IAAA,EAAM,QAAA,EAAA,IAAA,EAAK,CAAA,EAC5B,CAAA,mBAEA,GAAA,CAAC,iBAAc,QAAA,EAAoB,CAAA;AAAA,wBAErC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAc,QAAA,EAAS,CAAA;AAAA,QACtC,SAAS,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAc,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACxD;AAEJ","file":"toggle-tag.js","sourcesContent":["'use client';\n\nimport './tag.css';\nimport '../collapse/collapse.css';\nimport type { ButtonHTMLAttributes, CSSProperties, ReactNode } from 'react';\nimport { IconSlot } from '../../internal/icon/IconSlot';\nimport { useControllable } from '../../internal/hooks/use-controllable';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\ninterface ToggleTagOwnProps {\n /** Chip content; the label shown beside the tick or `icon`. */\n children: ReactNode;\n /** Controlled selected value. Omit for uncontrolled. */\n selected?: boolean;\n /** Uncontrolled initial value. */\n defaultSelected?: boolean;\n /** Fires with the next value on every toggle. */\n onChange?: (selected: boolean) => void;\n /** Your own icon node; replaces the tick. Selected state reads from the wash. */\n icon?: ReactNode | null;\n /** Optional result count - rendered mono/tabular. */\n count?: ReactNode;\n /** 'md' = 28px (default) - 'sm' = 24px for dense rows. */\n size?: 'md' | 'sm';\n /** Disable the button, blocking toggles. @default false */\n disabled?: boolean;\n /** Extra class(es) merged onto the root element. */\n className?: string;\n /** Inline styles merged onto the root element. */\n style?: CSSProperties;\n}\n\n/** ToggleTag - the on/off filter chip (<button aria-pressed>). */\nexport interface ToggleTagProps extends ToggleTagOwnProps {\n /** Standard <button> attributes forwarded to the chip. */\n htmlProps?: Omit<ButtonHTMLAttributes<HTMLButtonElement>, keyof ToggleTagOwnProps> & DataAttributes;\n}\n\nfunction ToggleTagTick({ selected }: { selected: boolean }) {\n return (\n <span className=\"tag__check collapse\" data-axis=\"width\" data-open={selected ? 'true' : 'false'} aria-hidden=\"true\">\n <span className=\"collapse__inner\">\n <svg viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M2.5 6.5 L5 9 L9.5 3.5\"\n pathLength=\"1\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </span>\n );\n}\n\nexport function ToggleTag({\n children,\n selected: selectedProp,\n defaultSelected = false,\n onChange,\n icon = null,\n count = null,\n size = 'md',\n disabled = false,\n className = '',\n style,\n htmlProps,\n}: ToggleTagProps) {\n const [selected, setSelected] = useControllable(selectedProp, defaultSelected, onChange);\n const toggle = () => setSelected(!selected);\n\n const cls = cx('tag', 'tag--toggle', size === 'sm' && 'tag--sm', className);\n\n return (\n <button\n type=\"button\"\n className={cls}\n style={style}\n aria-pressed={selected}\n disabled={disabled}\n onClick={toggle}\n {...htmlProps}\n >\n {icon ? (\n <span className=\"tag__icon\">\n <IconSlot size=\"sm\">{icon}</IconSlot>\n </span>\n ) : (\n <ToggleTagTick selected={selected} />\n )}\n <span className=\"tag__label\">{children}</span>\n {count != null && <span className=\"tag__count\">{count}</span>}\n </button>\n );\n}\n"]}
|
package/dist/toggle.css
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/* Toggle (switch) - immediate on/off; native input hidden, track + thumb painted, thumb travels on a CSS spring. */
|
|
2
|
+
|
|
3
|
+
.sw {
|
|
4
|
+
--sw-on-fill: linear-gradient(180deg, var(--accent), var(--accent-hover));
|
|
5
|
+
--sw-off-fill: var(--bg-muted);
|
|
6
|
+
--sw-on-border: var(--accent);
|
|
7
|
+
--sw-off-border: var(--border-strong);
|
|
8
|
+
--sw-ring: var(--ring-accent);
|
|
9
|
+
/* track size is the only input; thumb + travel derive from it */
|
|
10
|
+
--sw-w: var(--control-height);
|
|
11
|
+
--sw-h: var(--control-switch);
|
|
12
|
+
--sw-inset: calc(2 * var(--space-px));
|
|
13
|
+
/* inner track height minus both borders and the gap each side, so the inset is uniform on all edges */
|
|
14
|
+
--sw-thumb: calc(var(--sw-h) - 2 * var(--border-hairline) - 2 * var(--sw-inset));
|
|
15
|
+
/* colors read this flag; the thumb is moved by transform, not by it */
|
|
16
|
+
--on: 0;
|
|
17
|
+
|
|
18
|
+
display: inline-flex;
|
|
19
|
+
align-items: flex-start;
|
|
20
|
+
gap: var(--space-3);
|
|
21
|
+
padding: var(--space-2);
|
|
22
|
+
border-radius: var(--radius-md);
|
|
23
|
+
cursor: pointer;
|
|
24
|
+
-webkit-tap-highlight-color: transparent;
|
|
25
|
+
transition: background-color var(--duration-fast) var(--ease-standard);
|
|
26
|
+
|
|
27
|
+
&:has(:checked) {
|
|
28
|
+
--on: 1;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
&:not(.sw--disabled):hover {
|
|
32
|
+
background: var(--bg-muted);
|
|
33
|
+
}
|
|
34
|
+
&:not(.sw--disabled):hover:not(:has(:checked)) {
|
|
35
|
+
--sw-off-border: var(--text-subtle);
|
|
36
|
+
}
|
|
37
|
+
&:has(:focus-visible) .sw__track {
|
|
38
|
+
box-shadow: var(--sw-ring);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.sw__input {
|
|
43
|
+
position: absolute;
|
|
44
|
+
width: 1px;
|
|
45
|
+
height: 1px;
|
|
46
|
+
margin: 0;
|
|
47
|
+
padding: 0;
|
|
48
|
+
border: 0;
|
|
49
|
+
opacity: 0;
|
|
50
|
+
clip-path: inset(50%);
|
|
51
|
+
white-space: nowrap;
|
|
52
|
+
overflow: hidden;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.sw__track {
|
|
56
|
+
position: relative;
|
|
57
|
+
flex: none;
|
|
58
|
+
display: flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
justify-content: flex-start;
|
|
61
|
+
padding: var(--sw-inset);
|
|
62
|
+
width: var(--sw-w);
|
|
63
|
+
height: var(--sw-h);
|
|
64
|
+
margin-top: calc((var(--leading-body) - var(--sw-h)) / 2);
|
|
65
|
+
border: var(--border-hairline) solid
|
|
66
|
+
color-mix(in oklab, var(--sw-on-border) calc(var(--on) * 100%), var(--sw-off-border));
|
|
67
|
+
border-radius: var(--radius-full);
|
|
68
|
+
background: var(--sw-off-fill);
|
|
69
|
+
transform: scale(1);
|
|
70
|
+
transition:
|
|
71
|
+
border-color var(--duration-base) var(--ease-standard),
|
|
72
|
+
background-color var(--duration-base) var(--ease-standard),
|
|
73
|
+
box-shadow var(--duration-fast) var(--ease-standard),
|
|
74
|
+
transform var(--duration-fast) var(--ease-spring);
|
|
75
|
+
|
|
76
|
+
&::before {
|
|
77
|
+
content: '';
|
|
78
|
+
position: absolute;
|
|
79
|
+
inset: 0;
|
|
80
|
+
border-radius: inherit;
|
|
81
|
+
background: var(--sw-on-fill);
|
|
82
|
+
opacity: var(--on);
|
|
83
|
+
transition: opacity var(--duration-base) var(--ease-standard);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/* --tx (travel) + --sx (press-stretch) compose one transform, so press and travel never fight over it */
|
|
87
|
+
.sw__thumb {
|
|
88
|
+
--tx: 0px;
|
|
89
|
+
--sx: 1;
|
|
90
|
+
position: relative;
|
|
91
|
+
z-index: 1;
|
|
92
|
+
flex: none;
|
|
93
|
+
width: var(--sw-thumb);
|
|
94
|
+
height: var(--sw-thumb);
|
|
95
|
+
border-radius: var(--radius-full);
|
|
96
|
+
background: var(--bg-surface);
|
|
97
|
+
box-shadow: var(--shadow-sm);
|
|
98
|
+
transform: translateX(var(--tx)) scaleX(var(--sx));
|
|
99
|
+
transition: transform var(--duration-base) var(--ease-spring);
|
|
100
|
+
}
|
|
101
|
+
/* React-set [data-on] drives travel - no :has() twin to move the thumb out from under the spring and snap it */
|
|
102
|
+
.sw__track[data-on='true'] .sw__thumb {
|
|
103
|
+
--tx: calc(var(--sw-w) - var(--sw-h));
|
|
104
|
+
}
|
|
105
|
+
.sw__track[data-pressed='true'] {
|
|
106
|
+
transform: scale(0.96);
|
|
107
|
+
}
|
|
108
|
+
.sw__track[data-pressed='true'] .sw__thumb {
|
|
109
|
+
--sx: 1.16;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.sw__text {
|
|
113
|
+
display: grid;
|
|
114
|
+
gap: var(--space-1);
|
|
115
|
+
}
|
|
116
|
+
.sw__label {
|
|
117
|
+
font: var(--type-label);
|
|
118
|
+
color: var(--text-strong);
|
|
119
|
+
}
|
|
120
|
+
.sw__desc {
|
|
121
|
+
font: var(--type-caption);
|
|
122
|
+
color: var(--text-muted);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.sw--sm {
|
|
126
|
+
--sw-w: var(--control-height-sm);
|
|
127
|
+
--sw-h: var(--space-4);
|
|
128
|
+
& .sw__label {
|
|
129
|
+
font: var(--type-caption);
|
|
130
|
+
font-weight: var(--weight-medium);
|
|
131
|
+
color: var(--text-strong);
|
|
132
|
+
}
|
|
133
|
+
& .sw__track {
|
|
134
|
+
margin-top: calc((var(--leading-caption) - var(--sw-h)) / 2);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* disabled leaves the flag untouched, so the thumb keeps its correct position */
|
|
139
|
+
.sw--disabled {
|
|
140
|
+
cursor: not-allowed;
|
|
141
|
+
--sw-on-fill: var(--accent-disabled);
|
|
142
|
+
--sw-off-fill: var(--bg-muted);
|
|
143
|
+
--sw-on-border: var(--accent-disabled);
|
|
144
|
+
--sw-off-border: var(--border-default);
|
|
145
|
+
& .sw__thumb {
|
|
146
|
+
box-shadow: var(--shadow-xs);
|
|
147
|
+
}
|
|
148
|
+
& .sw__label,
|
|
149
|
+
& .sw__desc {
|
|
150
|
+
color: var(--text-disabled);
|
|
151
|
+
}
|
|
152
|
+
}
|
package/dist/toggle.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, ChangeEventHandler, CSSProperties, InputHTMLAttributes } from 'react';
|
|
3
|
+
import { D as DataAttributes } from './dom-props-C0jrllBw.js';
|
|
4
|
+
|
|
5
|
+
interface ToggleOwnProps {
|
|
6
|
+
/** Controlled checked state. Omit for uncontrolled (use `defaultChecked`). */
|
|
7
|
+
checked?: boolean;
|
|
8
|
+
/** Uncontrolled initial state. */
|
|
9
|
+
defaultChecked?: boolean;
|
|
10
|
+
/** Disabled - inert and de-emphasized (faded track, retains its position). */
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
/** Track size: `md` 36x20 - `sm` 28x16 for dense settings/table rows. @default 'md' */
|
|
13
|
+
size?: 'sm' | 'md';
|
|
14
|
+
/** Label text beside the track. */
|
|
15
|
+
label?: ReactNode;
|
|
16
|
+
/** Optional secondary line under the label (settings rows). */
|
|
17
|
+
description?: ReactNode;
|
|
18
|
+
/** Fires on flip - read `e.target.checked`. */
|
|
19
|
+
onChange?: ChangeEventHandler<HTMLInputElement>;
|
|
20
|
+
/** Extra class(es) merged onto the root label. */
|
|
21
|
+
className?: string;
|
|
22
|
+
/** Inline styles merged onto the root label. */
|
|
23
|
+
style?: CSSProperties;
|
|
24
|
+
}
|
|
25
|
+
interface ToggleProps extends ToggleOwnProps {
|
|
26
|
+
/** Standard <input> attributes (name, value, required, aria-*, ...) forwarded to the switch input. */
|
|
27
|
+
htmlProps?: Omit<InputHTMLAttributes<HTMLInputElement>, keyof ToggleOwnProps | 'type'> & DataAttributes;
|
|
28
|
+
}
|
|
29
|
+
declare function Toggle({ checked, defaultChecked, disabled, size, label, description, className, style, onChange, htmlProps, }: ToggleProps): react.JSX.Element;
|
|
30
|
+
|
|
31
|
+
export { Toggle, type ToggleProps };
|
package/dist/toggle.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
'use client';import { useControllable } from './chunk-MMRIQNEN.js';
|
|
2
|
+
import { cx } from './chunk-QGNC7LH5.js';
|
|
3
|
+
import './toggle.css';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function Toggle({
|
|
8
|
+
checked,
|
|
9
|
+
defaultChecked = false,
|
|
10
|
+
disabled = false,
|
|
11
|
+
size = "md",
|
|
12
|
+
label,
|
|
13
|
+
description,
|
|
14
|
+
className = "",
|
|
15
|
+
style,
|
|
16
|
+
onChange,
|
|
17
|
+
htmlProps
|
|
18
|
+
}) {
|
|
19
|
+
const [isOn, setOn] = useControllable(checked, !!defaultChecked);
|
|
20
|
+
const cls = cx("sw", size === "sm" && "sw--sm", disabled && "sw--disabled", className);
|
|
21
|
+
const [pressed, setPressed] = useState(false);
|
|
22
|
+
function press(on) {
|
|
23
|
+
return () => {
|
|
24
|
+
if (!disabled) setPressed(on);
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function handleChange(e) {
|
|
28
|
+
setOn(e.target.checked);
|
|
29
|
+
if (onChange) onChange(e);
|
|
30
|
+
}
|
|
31
|
+
return /* @__PURE__ */ jsxs(
|
|
32
|
+
"label",
|
|
33
|
+
{
|
|
34
|
+
className: cls,
|
|
35
|
+
style,
|
|
36
|
+
onPointerDown: press(true),
|
|
37
|
+
onPointerUp: press(false),
|
|
38
|
+
onPointerLeave: press(false),
|
|
39
|
+
onPointerCancel: press(false),
|
|
40
|
+
children: [
|
|
41
|
+
/* @__PURE__ */ jsx(
|
|
42
|
+
"input",
|
|
43
|
+
{
|
|
44
|
+
type: "checkbox",
|
|
45
|
+
role: "switch",
|
|
46
|
+
className: "sw__input",
|
|
47
|
+
disabled,
|
|
48
|
+
checked: isOn,
|
|
49
|
+
onChange: handleChange,
|
|
50
|
+
...htmlProps,
|
|
51
|
+
defaultChecked: void 0
|
|
52
|
+
}
|
|
53
|
+
),
|
|
54
|
+
/* @__PURE__ */ jsx(
|
|
55
|
+
"span",
|
|
56
|
+
{
|
|
57
|
+
className: "sw__track",
|
|
58
|
+
"data-on": isOn ? "true" : void 0,
|
|
59
|
+
"data-pressed": pressed ? "true" : void 0,
|
|
60
|
+
"aria-hidden": "true",
|
|
61
|
+
children: /* @__PURE__ */ jsx("span", { className: "sw__thumb" })
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
label || description ? /* @__PURE__ */ jsxs("span", { className: "sw__text", children: [
|
|
65
|
+
label ? /* @__PURE__ */ jsx("span", { className: "sw__label", children: label }) : null,
|
|
66
|
+
description ? /* @__PURE__ */ jsx("span", { className: "sw__desc", children: description }) : null
|
|
67
|
+
] }) : null
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { Toggle };
|
|
74
|
+
//# sourceMappingURL=toggle.js.map
|
|
75
|
+
//# sourceMappingURL=toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/toggle/Toggle.tsx"],"names":[],"mappings":";;;;;;AAyCO,SAAS,MAAA,CAAO;AAAA,EACrB,OAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,QAAA,GAAW,KAAA;AAAA,EACX,IAAA,GAAO,IAAA;AAAA,EACP,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAgB;AACd,EAAA,MAAM,CAAC,MAAM,KAAK,CAAA,GAAI,gBAAgB,OAAA,EAAS,CAAC,CAAC,cAAc,CAAA;AAE/D,EAAA,MAAM,GAAA,GAAM,GAAG,IAAA,EAAM,IAAA,KAAS,QAAQ,QAAA,EAAU,QAAA,IAAY,gBAAgB,SAAS,CAAA;AAErF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,SAAS,MAAM,EAAA,EAAa;AAC1B,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAAC,QAAA,EAAU,UAAA,CAAW,EAAE,CAAA;AAAA,IAC9B,CAAA;AAAA,EACF;AAEA,EAAA,SAAS,aAAa,CAAA,EAAkC;AACtD,IAAA,KAAA,CAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACtB,IAAA,IAAI,QAAA,WAAmB,CAAC,CAAA;AAAA,EAC1B;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,GAAA;AAAA,MACX,KAAA;AAAA,MACA,aAAA,EAAe,MAAM,IAAI,CAAA;AAAA,MACzB,WAAA,EAAa,MAAM,KAAK,CAAA;AAAA,MACxB,cAAA,EAAgB,MAAM,KAAK,CAAA;AAAA,MAC3B,eAAA,EAAiB,MAAM,KAAK,CAAA;AAAA,MAE5B,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,WAAA;AAAA,YACV,QAAA;AAAA,YACA,OAAA,EAAS,IAAA;AAAA,YACT,QAAA,EAAU,YAAA;AAAA,YACT,GAAG,SAAA;AAAA,YACJ,cAAA,EAAgB;AAAA;AAAA,SAClB;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,WAAA;AAAA,YACV,SAAA,EAAS,OAAO,MAAA,GAAS,MAAA;AAAA,YACzB,cAAA,EAAc,UAAU,MAAA,GAAS,MAAA;AAAA,YACjC,aAAA,EAAY,MAAA;AAAA,YAEZ,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAY;AAAA;AAAA,SAC9B;AAAA,QACC,KAAA,IAAS,WAAA,mBACR,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EACb,QAAA,EAAA;AAAA,UAAA,KAAA,mBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAa,iBAAM,CAAA,GAAU,IAAA;AAAA,UACrD,8BAAc,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,uBAAY,CAAA,GAAU;AAAA,SAAA,EACnE,CAAA,GACE;AAAA;AAAA;AAAA,GACN;AAEJ","file":"toggle.js","sourcesContent":["'use client';\n\nimport './toggle.css';\nimport {\n useState,\n type ChangeEvent,\n type ChangeEventHandler,\n type CSSProperties,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { useControllable } from '../../internal/hooks/use-controllable';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\ninterface ToggleOwnProps {\n /** Controlled checked state. Omit for uncontrolled (use `defaultChecked`). */\n checked?: boolean;\n /** Uncontrolled initial state. */\n defaultChecked?: boolean;\n /** Disabled - inert and de-emphasized (faded track, retains its position). */\n disabled?: boolean;\n /** Track size: `md` 36x20 - `sm` 28x16 for dense settings/table rows. @default 'md' */\n size?: 'sm' | 'md';\n /** Label text beside the track. */\n label?: ReactNode;\n /** Optional secondary line under the label (settings rows). */\n description?: ReactNode;\n /** Fires on flip - read `e.target.checked`. */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /** Extra class(es) merged onto the root label. */\n className?: string;\n /** Inline styles merged onto the root label. */\n style?: CSSProperties;\n}\n\nexport interface ToggleProps extends ToggleOwnProps {\n /** Standard <input> attributes (name, value, required, aria-*, ...) forwarded to the switch input. */\n htmlProps?: Omit<InputHTMLAttributes<HTMLInputElement>, keyof ToggleOwnProps | 'type'> & DataAttributes;\n}\n\nexport function Toggle({\n checked,\n defaultChecked = false,\n disabled = false,\n size = 'md',\n label,\n description,\n className = '',\n style,\n onChange,\n htmlProps,\n}: ToggleProps) {\n const [isOn, setOn] = useControllable(checked, !!defaultChecked);\n\n const cls = cx('sw', size === 'sm' && 'sw--sm', disabled && 'sw--disabled', className);\n\n const [pressed, setPressed] = useState(false);\n function press(on: boolean) {\n return () => {\n if (!disabled) setPressed(on);\n };\n }\n\n function handleChange(e: ChangeEvent<HTMLInputElement>) {\n setOn(e.target.checked);\n if (onChange) onChange(e);\n }\n\n return (\n <label\n className={cls}\n style={style}\n onPointerDown={press(true)}\n onPointerUp={press(false)}\n onPointerLeave={press(false)}\n onPointerCancel={press(false)}\n >\n <input\n type=\"checkbox\"\n role=\"switch\"\n className=\"sw__input\"\n disabled={disabled}\n checked={isOn}\n onChange={handleChange}\n {...htmlProps}\n defaultChecked={undefined}\n />\n <span\n className=\"sw__track\"\n data-on={isOn ? 'true' : undefined}\n data-pressed={pressed ? 'true' : undefined}\n aria-hidden=\"true\"\n >\n <span className=\"sw__thumb\"></span>\n </span>\n {label || description ? (\n <span className=\"sw__text\">\n {label ? <span className=\"sw__label\">{label}</span> : null}\n {description ? <span className=\"sw__desc\">{description}</span> : null}\n </span>\n ) : null}\n </label>\n );\n}\n"]}
|
package/dist/tooltip.css
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/* tooltip.css - the floating tooltip surface (one shared bubble). */
|
|
2
|
+
|
|
3
|
+
.tooltip {
|
|
4
|
+
position: fixed;
|
|
5
|
+
left: 0;
|
|
6
|
+
top: 0;
|
|
7
|
+
box-sizing: border-box;
|
|
8
|
+
overflow: hidden; /* clips content while the box morphs */
|
|
9
|
+
z-index: var(--layer-tooltip);
|
|
10
|
+
pointer-events: none;
|
|
11
|
+
width: max-content; /* the live bubble gets an animated width; this also sizes the measuring clone */
|
|
12
|
+
padding: var(--space-2) var(--space-3);
|
|
13
|
+
background: var(--bg-surface-raised);
|
|
14
|
+
color: var(--text-body);
|
|
15
|
+
border: var(--border-hairline) solid var(--border-default);
|
|
16
|
+
border-radius: var(--radius-md);
|
|
17
|
+
box-shadow: var(--shadow-lg);
|
|
18
|
+
font: var(--type-caption);
|
|
19
|
+
letter-spacing: var(--tracking-normal);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* the hidden twin the host measures the NEXT box from (same styles, no motion) */
|
|
23
|
+
.tooltip--measure {
|
|
24
|
+
visibility: hidden;
|
|
25
|
+
left: -9999px;
|
|
26
|
+
top: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* default trigger wrapper - display:contents, so it adds no layout; carries the listeners + rect */
|
|
30
|
+
.tooltip-anchor {
|
|
31
|
+
display: contents;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* wraps at the measure cap; the live body also gets its measured width inline (locked wrapping during the morph) */
|
|
35
|
+
.tooltip__body {
|
|
36
|
+
display: block;
|
|
37
|
+
width: max-content;
|
|
38
|
+
max-inline-size: var(--measure-floating);
|
|
39
|
+
text-wrap: pretty;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* grow from the trigger's edge (per placement) */
|
|
43
|
+
.tooltip[data-placement='top'] {
|
|
44
|
+
transform-origin: center bottom;
|
|
45
|
+
}
|
|
46
|
+
.tooltip[data-placement='bottom'] {
|
|
47
|
+
transform-origin: center top;
|
|
48
|
+
}
|
|
49
|
+
.tooltip[data-placement='left'] {
|
|
50
|
+
transform-origin: right center;
|
|
51
|
+
}
|
|
52
|
+
.tooltip[data-placement='right'] {
|
|
53
|
+
transform-origin: left center;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.tooltip__row {
|
|
57
|
+
display: flex;
|
|
58
|
+
align-items: baseline;
|
|
59
|
+
gap: var(--space-3);
|
|
60
|
+
}
|
|
61
|
+
.tooltip__shortcut {
|
|
62
|
+
flex: 0 0 auto;
|
|
63
|
+
font-family: var(--font-mono);
|
|
64
|
+
font-size: var(--size-micro);
|
|
65
|
+
font-variant-numeric: tabular-nums;
|
|
66
|
+
color: var(--text-subtle);
|
|
67
|
+
background: var(--bg-muted);
|
|
68
|
+
padding: 0 var(--space-1);
|
|
69
|
+
border-radius: var(--radius-sm);
|
|
70
|
+
white-space: nowrap;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* Multi-line content - rich nodes style themselves with these; keep hierarchy minimal. */
|
|
74
|
+
.tooltip strong {
|
|
75
|
+
font-weight: var(--weight-medium);
|
|
76
|
+
color: var(--text-strong);
|
|
77
|
+
}
|
|
78
|
+
.tooltip p {
|
|
79
|
+
margin: 0;
|
|
80
|
+
}
|
|
81
|
+
.tooltip p + p {
|
|
82
|
+
margin-top: var(--space-1);
|
|
83
|
+
}
|
|
84
|
+
.tooltip .tooltip__muted {
|
|
85
|
+
color: var(--text-muted);
|
|
86
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, ReactElement, HTMLAttributes } from 'react';
|
|
3
|
+
import { D as DataAttributes } from './dom-props-C0jrllBw.js';
|
|
4
|
+
|
|
5
|
+
type Placement = 'top' | 'bottom' | 'left' | 'right';
|
|
6
|
+
|
|
7
|
+
interface TooltipProps {
|
|
8
|
+
/** The hint - a string or small node; never interactive content. */
|
|
9
|
+
content: ReactNode;
|
|
10
|
+
/** Optional keyboard hint, rendered as mono metadata ("⌘↩", "S"). */
|
|
11
|
+
shortcut?: string | null;
|
|
12
|
+
/** Preferred side; flips automatically when out of viewport room. */
|
|
13
|
+
placement?: Placement;
|
|
14
|
+
/** Suppress the tooltip entirely (trigger renders untouched). */
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
/** ms before a cold hover shows; warm hovers + focus are instant. Default 350. */
|
|
17
|
+
openDelay?: number;
|
|
18
|
+
/** ms the bubble lingers after leaving (bridges moving to a neighbour). Default 140. */
|
|
19
|
+
closeDelay?: number;
|
|
20
|
+
/** Stable id for this trigger's store entry - lets overlapping triggers race safely under
|
|
21
|
+
* the one shared tooltip host. Not rendered to the DOM. Auto-generated when omitted. */
|
|
22
|
+
id?: string;
|
|
23
|
+
/** Exactly one element. */
|
|
24
|
+
children: ReactElement;
|
|
25
|
+
/** Standard <span> attributes forwarded to the anchor wrapper. */
|
|
26
|
+
htmlProps?: HTMLAttributes<HTMLSpanElement> & DataAttributes;
|
|
27
|
+
}
|
|
28
|
+
declare function Tooltip({ content, shortcut, placement, disabled, openDelay, closeDelay, id, children, htmlProps, }: TooltipProps): react.JSX.Element;
|
|
29
|
+
|
|
30
|
+
export { Tooltip, type TooltipProps };
|