@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.
Files changed (334) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +133 -0
  3. package/dist/alert.css +132 -0
  4. package/dist/alert.d.ts +46 -0
  5. package/dist/alert.js +80 -0
  6. package/dist/alert.js.map +1 -0
  7. package/dist/avatar-group.d.ts +24 -0
  8. package/dist/avatar-group.js +23 -0
  9. package/dist/avatar-group.js.map +1 -0
  10. package/dist/avatar.css +200 -0
  11. package/dist/avatar.d.ts +35 -0
  12. package/dist/avatar.js +67 -0
  13. package/dist/avatar.js.map +1 -0
  14. package/dist/badge.css +182 -0
  15. package/dist/badge.d.ts +34 -0
  16. package/dist/badge.js +4 -0
  17. package/dist/badge.js.map +1 -0
  18. package/dist/button.css +269 -0
  19. package/dist/button.d.ts +44 -0
  20. package/dist/button.js +4 -0
  21. package/dist/button.js.map +1 -0
  22. package/dist/checkbox.css +177 -0
  23. package/dist/checkbox.d.ts +35 -0
  24. package/dist/checkbox.js +5 -0
  25. package/dist/checkbox.js.map +1 -0
  26. package/dist/chunk-2ERBBFZS.js +12 -0
  27. package/dist/chunk-2ERBBFZS.js.map +1 -0
  28. package/dist/chunk-2HORSLXJ.js +191 -0
  29. package/dist/chunk-2HORSLXJ.js.map +1 -0
  30. package/dist/chunk-36WVAQKL.js +40 -0
  31. package/dist/chunk-36WVAQKL.js.map +1 -0
  32. package/dist/chunk-3SBCBYB7.js +575 -0
  33. package/dist/chunk-3SBCBYB7.js.map +1 -0
  34. package/dist/chunk-4R2GQO43.js +125 -0
  35. package/dist/chunk-4R2GQO43.js.map +1 -0
  36. package/dist/chunk-64UU4LGU.js +258 -0
  37. package/dist/chunk-64UU4LGU.js.map +1 -0
  38. package/dist/chunk-7SZCJ7WI.js +35 -0
  39. package/dist/chunk-7SZCJ7WI.js.map +1 -0
  40. package/dist/chunk-BIDVNLJO.js +38 -0
  41. package/dist/chunk-BIDVNLJO.js.map +1 -0
  42. package/dist/chunk-CONSWNIV.js +17 -0
  43. package/dist/chunk-CONSWNIV.js.map +1 -0
  44. package/dist/chunk-EQ32F2QJ.js +75 -0
  45. package/dist/chunk-EQ32F2QJ.js.map +1 -0
  46. package/dist/chunk-GY7JOPUQ.js +111 -0
  47. package/dist/chunk-GY7JOPUQ.js.map +1 -0
  48. package/dist/chunk-I4XQ4PV2.js +30 -0
  49. package/dist/chunk-I4XQ4PV2.js.map +1 -0
  50. package/dist/chunk-JSKXZMLH.js +67 -0
  51. package/dist/chunk-JSKXZMLH.js.map +1 -0
  52. package/dist/chunk-L3Q3VDIW.js +295 -0
  53. package/dist/chunk-L3Q3VDIW.js.map +1 -0
  54. package/dist/chunk-LDC3RIYA.js +62 -0
  55. package/dist/chunk-LDC3RIYA.js.map +1 -0
  56. package/dist/chunk-MKIQFK7S.js +43 -0
  57. package/dist/chunk-MKIQFK7S.js.map +1 -0
  58. package/dist/chunk-MMRIQNEN.js +20 -0
  59. package/dist/chunk-MMRIQNEN.js.map +1 -0
  60. package/dist/chunk-MXOPCFWR.js +59 -0
  61. package/dist/chunk-MXOPCFWR.js.map +1 -0
  62. package/dist/chunk-NEF5XAHG.js +17 -0
  63. package/dist/chunk-NEF5XAHG.js.map +1 -0
  64. package/dist/chunk-NNXJCLTV.js +22 -0
  65. package/dist/chunk-NNXJCLTV.js.map +1 -0
  66. package/dist/chunk-O4N2OBTR.js +94 -0
  67. package/dist/chunk-O4N2OBTR.js.map +1 -0
  68. package/dist/chunk-PMECHR3A.js +38 -0
  69. package/dist/chunk-PMECHR3A.js.map +1 -0
  70. package/dist/chunk-QDK66S4G.js +44 -0
  71. package/dist/chunk-QDK66S4G.js.map +1 -0
  72. package/dist/chunk-QGNC7LH5.js +8 -0
  73. package/dist/chunk-QGNC7LH5.js.map +1 -0
  74. package/dist/chunk-QMSJZCK3.js +398 -0
  75. package/dist/chunk-QMSJZCK3.js.map +1 -0
  76. package/dist/chunk-S5ZTZANS.js +57 -0
  77. package/dist/chunk-S5ZTZANS.js.map +1 -0
  78. package/dist/chunk-S7B34VGN.js +14 -0
  79. package/dist/chunk-S7B34VGN.js.map +1 -0
  80. package/dist/chunk-TCUCYFT7.js +25 -0
  81. package/dist/chunk-TCUCYFT7.js.map +1 -0
  82. package/dist/chunk-TYHR4VNM.js +193 -0
  83. package/dist/chunk-TYHR4VNM.js.map +1 -0
  84. package/dist/chunk-U5QQZC3U.js +56 -0
  85. package/dist/chunk-U5QQZC3U.js.map +1 -0
  86. package/dist/chunk-UE63OOVG.js +13 -0
  87. package/dist/chunk-UE63OOVG.js.map +1 -0
  88. package/dist/chunk-VTJTGVZZ.js +22 -0
  89. package/dist/chunk-VTJTGVZZ.js.map +1 -0
  90. package/dist/chunk-W3SHPKSB.js +49 -0
  91. package/dist/chunk-W3SHPKSB.js.map +1 -0
  92. package/dist/chunk-XZAEIQDR.js +188 -0
  93. package/dist/chunk-XZAEIQDR.js.map +1 -0
  94. package/dist/chunk-YGGCQNNU.js +92 -0
  95. package/dist/chunk-YGGCQNNU.js.map +1 -0
  96. package/dist/collapse.css +88 -0
  97. package/dist/collapse.d.ts +46 -0
  98. package/dist/collapse.js +5 -0
  99. package/dist/collapse.js.map +1 -0
  100. package/dist/count-badge.d.ts +13 -0
  101. package/dist/count-badge.js +13 -0
  102. package/dist/count-badge.js.map +1 -0
  103. package/dist/date-field.d.ts +25 -0
  104. package/dist/date-field.js +87 -0
  105. package/dist/date-field.js.map +1 -0
  106. package/dist/date-picker.css +595 -0
  107. package/dist/date-range-field.d.ts +33 -0
  108. package/dist/date-range-field.js +404 -0
  109. package/dist/date-range-field.js.map +1 -0
  110. package/dist/datetime-field.d.ts +29 -0
  111. package/dist/datetime-field.js +155 -0
  112. package/dist/datetime-field.js.map +1 -0
  113. package/dist/dialog.css +180 -0
  114. package/dist/dialog.d.ts +42 -0
  115. package/dist/dialog.js +128 -0
  116. package/dist/dialog.js.map +1 -0
  117. package/dist/dom-props-C0jrllBw.d.ts +5 -0
  118. package/dist/field-chrome-CMPOQSLs.d.ts +28 -0
  119. package/dist/field-shell-Cuda-feL.d.ts +24 -0
  120. package/dist/glide.d.ts +15 -0
  121. package/dist/glide.js +5 -0
  122. package/dist/glide.js.map +1 -0
  123. package/dist/icon.css +33 -0
  124. package/dist/input.css +333 -0
  125. package/dist/mcp.js +359 -0
  126. package/dist/motion-devtools.css +265 -0
  127. package/dist/motion-devtools.d.ts +51 -0
  128. package/dist/motion-devtools.js +354 -0
  129. package/dist/motion-devtools.js.map +1 -0
  130. package/dist/motion-scale-Canq4stZ.d.ts +18 -0
  131. package/dist/motion-tokens.d.ts +28 -0
  132. package/dist/motion-tokens.js +3 -0
  133. package/dist/motion-tokens.js.map +1 -0
  134. package/dist/multi-select.d.ts +44 -0
  135. package/dist/multi-select.js +109 -0
  136. package/dist/multi-select.js.map +1 -0
  137. package/dist/number-field.d.ts +36 -0
  138. package/dist/number-field.js +112 -0
  139. package/dist/number-field.js.map +1 -0
  140. package/dist/odometer.css +62 -0
  141. package/dist/otp-field.d.ts +31 -0
  142. package/dist/otp-field.js +98 -0
  143. package/dist/otp-field.js.map +1 -0
  144. package/dist/overlay.css +23 -0
  145. package/dist/pagination.css +43 -0
  146. package/dist/pagination.d.ts +29 -0
  147. package/dist/pagination.js +107 -0
  148. package/dist/pagination.js.map +1 -0
  149. package/dist/popover.css +69 -0
  150. package/dist/popover.d.ts +35 -0
  151. package/dist/popover.js +15 -0
  152. package/dist/popover.js.map +1 -0
  153. package/dist/radio-group.css +300 -0
  154. package/dist/radio-group.d.ts +52 -0
  155. package/dist/radio-group.js +115 -0
  156. package/dist/radio-group.js.map +1 -0
  157. package/dist/select.css +416 -0
  158. package/dist/select.d.ts +49 -0
  159. package/dist/select.js +99 -0
  160. package/dist/select.js.map +1 -0
  161. package/dist/sheet.css +26 -0
  162. package/dist/sheet.d.ts +31 -0
  163. package/dist/sheet.js +14 -0
  164. package/dist/sheet.js.map +1 -0
  165. package/dist/status-badge.d.ts +19 -0
  166. package/dist/status-badge.js +72 -0
  167. package/dist/status-badge.js.map +1 -0
  168. package/dist/table.css +348 -0
  169. package/dist/table.d.ts +75 -0
  170. package/dist/table.js +262 -0
  171. package/dist/table.js.map +1 -0
  172. package/dist/tabs.css +208 -0
  173. package/dist/tabs.d.ts +71 -0
  174. package/dist/tabs.js +181 -0
  175. package/dist/tabs.js.map +1 -0
  176. package/dist/tag.css +248 -0
  177. package/dist/tag.d.ts +52 -0
  178. package/dist/tag.js +72 -0
  179. package/dist/tag.js.map +1 -0
  180. package/dist/text-field.d.ts +28 -0
  181. package/dist/text-field.js +69 -0
  182. package/dist/text-field.js.map +1 -0
  183. package/dist/textarea.css +219 -0
  184. package/dist/textarea.d.ts +38 -0
  185. package/dist/textarea.js +144 -0
  186. package/dist/textarea.js.map +1 -0
  187. package/dist/time-field.d.ts +28 -0
  188. package/dist/time-field.js +66 -0
  189. package/dist/time-field.js.map +1 -0
  190. package/dist/timing-7JA_zQHP.d.ts +27 -0
  191. package/dist/toast-store.d.ts +86 -0
  192. package/dist/toast-store.js +3 -0
  193. package/dist/toast-store.js.map +1 -0
  194. package/dist/toast.css +257 -0
  195. package/dist/toast.d.ts +12 -0
  196. package/dist/toast.js +310 -0
  197. package/dist/toast.js.map +1 -0
  198. package/dist/toggle-tag.d.ts +34 -0
  199. package/dist/toggle-tag.js +57 -0
  200. package/dist/toggle-tag.js.map +1 -0
  201. package/dist/toggle.css +152 -0
  202. package/dist/toggle.d.ts +31 -0
  203. package/dist/toggle.js +75 -0
  204. package/dist/toggle.js.map +1 -0
  205. package/dist/tooltip.css +86 -0
  206. package/dist/tooltip.d.ts +30 -0
  207. package/dist/tooltip.js +268 -0
  208. package/dist/tooltip.js.map +1 -0
  209. package/dist/types-SGMShK7R.d.ts +22 -0
  210. package/llms.txt +196 -0
  211. package/next.d.mts +7 -0
  212. package/next.mjs +59 -0
  213. package/package.json +257 -0
  214. package/src/components/composites/alert/Alert.tsx +141 -0
  215. package/src/components/composites/alert/alert.css +132 -0
  216. package/src/components/composites/date-picker/DateField.tsx +80 -0
  217. package/src/components/composites/date-picker/DateRangeField.tsx +110 -0
  218. package/src/components/composites/date-picker/DateTimeField.tsx +162 -0
  219. package/src/components/composites/date-picker/TimeField.tsx +78 -0
  220. package/src/components/composites/date-picker/calendar-panel.tsx +216 -0
  221. package/src/components/composites/date-picker/date-picker.css +595 -0
  222. package/src/components/composites/date-picker/date-utils.ts +56 -0
  223. package/src/components/composites/date-picker/field-shell.tsx +85 -0
  224. package/src/components/composites/date-picker/range-panel.tsx +363 -0
  225. package/src/components/composites/date-picker/time-core.tsx +290 -0
  226. package/src/components/composites/date-picker/use-day-focus.ts +35 -0
  227. package/src/components/composites/dialog/Dialog.tsx +198 -0
  228. package/src/components/composites/dialog/dialog.css +180 -0
  229. package/src/components/composites/pagination/Pagination.tsx +131 -0
  230. package/src/components/composites/pagination/pagination.css +43 -0
  231. package/src/components/composites/popover/Popover.tsx +141 -0
  232. package/src/components/composites/popover/popover.css +69 -0
  233. package/src/components/composites/select/MultiSelect.tsx +133 -0
  234. package/src/components/composites/select/Select.tsx +122 -0
  235. package/src/components/composites/select/core/index.ts +4 -0
  236. package/src/components/composites/select/core/menu.tsx +100 -0
  237. package/src/components/composites/select/core/panel.tsx +154 -0
  238. package/src/components/composites/select/core/trigger.tsx +74 -0
  239. package/src/components/composites/select/core/types.ts +39 -0
  240. package/src/components/composites/select/core/use-listbox.ts +182 -0
  241. package/src/components/composites/select/select.css +416 -0
  242. package/src/components/composites/sheet/Sheet.tsx +135 -0
  243. package/src/components/composites/sheet/sheet.css +26 -0
  244. package/src/components/composites/sheet/use-sheet-drag.ts +126 -0
  245. package/src/components/composites/table/Table.tsx +377 -0
  246. package/src/components/composites/table/table.css +348 -0
  247. package/src/components/composites/tabs/Tabs.tsx +278 -0
  248. package/src/components/composites/tabs/tabs.css +208 -0
  249. package/src/components/composites/toast/Toast.tsx +380 -0
  250. package/src/components/composites/toast/toast-store.ts +295 -0
  251. package/src/components/composites/toast/toast.css +257 -0
  252. package/src/components/composites/tooltip/Tooltip.tsx +110 -0
  253. package/src/components/composites/tooltip/tooltip-host.tsx +184 -0
  254. package/src/components/composites/tooltip/tooltip-store.ts +81 -0
  255. package/src/components/composites/tooltip/tooltip.css +86 -0
  256. package/src/components/dev/MotionDevtools.tsx +200 -0
  257. package/src/components/dev/motion-devtools.css +265 -0
  258. package/src/components/dev/slowmo-engine.ts +230 -0
  259. package/src/components/internal/glass/glass.css +100 -0
  260. package/src/components/internal/glass/glint.ts +9 -0
  261. package/src/components/internal/hooks/use-controllable.ts +21 -0
  262. package/src/components/internal/hooks/use-scroll-edges.ts +46 -0
  263. package/src/components/internal/icon/Icon.tsx +66 -0
  264. package/src/components/internal/icon/IconSlot.tsx +10 -0
  265. package/src/components/internal/icon/icon.css +33 -0
  266. package/src/components/internal/overlay/focus.ts +68 -0
  267. package/src/components/internal/overlay/layer.tsx +149 -0
  268. package/src/components/internal/overlay/modal.tsx +141 -0
  269. package/src/components/internal/overlay/overlay.css +23 -0
  270. package/src/components/internal/overlay/position.ts +103 -0
  271. package/src/components/internal/utils/cx.ts +3 -0
  272. package/src/components/internal/utils/token-px.ts +8 -0
  273. package/src/components/primitives/avatar/Avatar.tsx +120 -0
  274. package/src/components/primitives/avatar/AvatarGroup.tsx +56 -0
  275. package/src/components/primitives/avatar/avatar.css +200 -0
  276. package/src/components/primitives/badge/Badge.tsx +75 -0
  277. package/src/components/primitives/badge/CountBadge.tsx +20 -0
  278. package/src/components/primitives/badge/StatusBadge.tsx +111 -0
  279. package/src/components/primitives/badge/badge.css +182 -0
  280. package/src/components/primitives/badge/odometer.css +62 -0
  281. package/src/components/primitives/badge/odometer.tsx +36 -0
  282. package/src/components/primitives/button/Button.tsx +102 -0
  283. package/src/components/primitives/button/button.css +269 -0
  284. package/src/components/primitives/checkbox/Checkbox.tsx +76 -0
  285. package/src/components/primitives/checkbox/check-glyph.tsx +28 -0
  286. package/src/components/primitives/checkbox/checkbox.css +177 -0
  287. package/src/components/primitives/collapse/Collapse.tsx +86 -0
  288. package/src/components/primitives/collapse/collapse.css +88 -0
  289. package/src/components/primitives/collapse/collapse.typecheck.tsx +29 -0
  290. package/src/components/primitives/input/NumberField.tsx +139 -0
  291. package/src/components/primitives/input/OtpField.tsx +134 -0
  292. package/src/components/primitives/input/TextField.tsx +110 -0
  293. package/src/components/primitives/input/field-chrome.tsx +83 -0
  294. package/src/components/primitives/input/input.css +333 -0
  295. package/src/components/primitives/radio-group/RadioGroup.tsx +183 -0
  296. package/src/components/primitives/radio-group/radio-group.css +300 -0
  297. package/src/components/primitives/tag/Tag.tsx +143 -0
  298. package/src/components/primitives/tag/ToggleTag.tsx +97 -0
  299. package/src/components/primitives/tag/tag.css +248 -0
  300. package/src/components/primitives/textarea/Textarea.tsx +190 -0
  301. package/src/components/primitives/textarea/textarea.css +219 -0
  302. package/src/components/primitives/toggle/Toggle.tsx +105 -0
  303. package/src/components/primitives/toggle/toggle.css +152 -0
  304. package/src/css.d.ts +1 -0
  305. package/src/dom-props.ts +1 -0
  306. package/src/engine/animate.ts +141 -0
  307. package/src/engine/drag.ts +53 -0
  308. package/src/engine/ease.ts +155 -0
  309. package/src/engine/flip.ts +59 -0
  310. package/src/engine/index.ts +13 -0
  311. package/src/mcp/server.ts +420 -0
  312. package/src/motion/element.tsx +53 -0
  313. package/src/motion/flip.tsx +87 -0
  314. package/src/motion/glide.tsx +47 -0
  315. package/src/motion/motion-timing.ts +33 -0
  316. package/src/motion/presence-context.ts +18 -0
  317. package/src/motion/presence.tsx +91 -0
  318. package/src/motion/timing.ts +49 -0
  319. package/src/motion/use-motion.ts +64 -0
  320. package/src/styles.css +26 -0
  321. package/src/tokens/avatar.css +20 -0
  322. package/src/tokens/color.css +58 -0
  323. package/src/tokens/elevation.css +22 -0
  324. package/src/tokens/fonts.css +3 -0
  325. package/src/tokens/glass.css +20 -0
  326. package/src/tokens/icons.css +7 -0
  327. package/src/tokens/layers.css +6 -0
  328. package/src/tokens/motion-scale.ts +17 -0
  329. package/src/tokens/motion-tokens.ts +92 -0
  330. package/src/tokens/motion.css +49 -0
  331. package/src/tokens/radius.css +11 -0
  332. package/src/tokens/semantic.css +65 -0
  333. package/src/tokens/spacing.css +26 -0
  334. 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"]}
@@ -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
+ }
@@ -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"]}
@@ -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 };