@zyncat/ui 0.11.0 → 0.13.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 (597) hide show
  1. package/README.md +135 -40
  2. package/dist/alert.css +126 -121
  3. package/dist/alert.js +12 -14
  4. package/dist/alert.js.map +1 -1
  5. package/dist/avatar-group.js.map +1 -1
  6. package/dist/avatar.css +179 -174
  7. package/dist/avatar.js.map +1 -1
  8. package/dist/badge.css +166 -160
  9. package/dist/badge.js +1 -1
  10. package/dist/button.css +272 -246
  11. package/dist/button.js +1 -1
  12. package/dist/checkbox.css +158 -153
  13. package/dist/checkbox.js +2 -2
  14. package/dist/{chunk-AMFGY56I.js → chunk-227ZW4V7.js} +40 -32
  15. package/dist/chunk-227ZW4V7.js.map +1 -0
  16. package/dist/{chunk-2ERBBFZS.js → chunk-3MPF7FZV.js} +2 -2
  17. package/dist/chunk-3MPF7FZV.js.map +1 -0
  18. package/dist/{chunk-AIQXS2XY.js → chunk-43M6GQ4Q.js} +86 -79
  19. package/dist/chunk-43M6GQ4Q.js.map +1 -0
  20. package/dist/{chunk-7SZCJ7WI.js → chunk-45R4Z5XN.js} +3 -3
  21. package/dist/chunk-45R4Z5XN.js.map +1 -0
  22. package/dist/{chunk-I4XQ4PV2.js → chunk-4BSHB7R3.js} +9 -7
  23. package/dist/chunk-4BSHB7R3.js.map +1 -0
  24. package/dist/{chunk-YGGCQNNU.js → chunk-4C5RZXBT.js} +33 -34
  25. package/dist/chunk-4C5RZXBT.js.map +1 -0
  26. package/dist/{chunk-2QWJ6FAX.js → chunk-5PZ43DCG.js} +31 -15
  27. package/dist/chunk-5PZ43DCG.js.map +1 -0
  28. package/dist/{chunk-S5ZTZANS.js → chunk-7IZJERGA.js} +35 -12
  29. package/dist/chunk-7IZJERGA.js.map +1 -0
  30. package/dist/{chunk-DKVUPFQR.js → chunk-A5WTZACK.js} +22 -12
  31. package/dist/chunk-A5WTZACK.js.map +1 -0
  32. package/dist/{chunk-64UU4LGU.js → chunk-AADAJL7D.js} +3 -3
  33. package/dist/{chunk-64UU4LGU.js.map → chunk-AADAJL7D.js.map} +1 -1
  34. package/dist/{chunk-XJQQQJAO.js → chunk-CF4QHO4N.js} +21 -11
  35. package/dist/chunk-CF4QHO4N.js.map +1 -0
  36. package/dist/{chunk-WM5J5TDI.js → chunk-CNWTIMIP.js} +13 -17
  37. package/dist/chunk-CNWTIMIP.js.map +1 -0
  38. package/dist/{chunk-NGTA34V2.js → chunk-DDRSMHN4.js} +16 -10
  39. package/dist/chunk-DDRSMHN4.js.map +1 -0
  40. package/dist/{chunk-VTJTGVZZ.js → chunk-DMX2F6B4.js} +2 -2
  41. package/dist/chunk-DMX2F6B4.js.map +1 -0
  42. package/dist/{chunk-3SBCBYB7.js → chunk-EAI4POPB.js} +2 -2
  43. package/dist/{chunk-3SBCBYB7.js.map → chunk-EAI4POPB.js.map} +1 -1
  44. package/dist/{chunk-Y7AJQVWJ.js → chunk-EF6RPXU7.js} +17 -15
  45. package/dist/chunk-EF6RPXU7.js.map +1 -0
  46. package/dist/{chunk-WFHRAKN3.js → chunk-FONOS5RN.js} +14 -15
  47. package/dist/chunk-FONOS5RN.js.map +1 -0
  48. package/dist/{chunk-PMECHR3A.js → chunk-FQEHSKEI.js} +2 -2
  49. package/dist/chunk-FQEHSKEI.js.map +1 -0
  50. package/dist/chunk-HDSFWZ7L.js +12 -0
  51. package/dist/chunk-HDSFWZ7L.js.map +1 -0
  52. package/dist/{chunk-2F5PITAO.js → chunk-HY5MPISE.js} +2 -2
  53. package/dist/chunk-HY5MPISE.js.map +1 -0
  54. package/dist/{chunk-QDK66S4G.js → chunk-I45AU6KH.js} +3 -3
  55. package/dist/chunk-I45AU6KH.js.map +1 -0
  56. package/dist/{chunk-YGCVWGUG.js → chunk-IJS7TPGV.js} +153 -46
  57. package/dist/chunk-IJS7TPGV.js.map +1 -0
  58. package/dist/{chunk-62P3KD57.js → chunk-IUQAUBVM.js} +18 -11
  59. package/dist/chunk-IUQAUBVM.js.map +1 -0
  60. package/dist/chunk-JY6A2ZJZ.js +44 -0
  61. package/dist/chunk-JY6A2ZJZ.js.map +1 -0
  62. package/dist/{chunk-XWUWYSCT.js → chunk-M43IOM5C.js} +20 -10
  63. package/dist/chunk-M43IOM5C.js.map +1 -0
  64. package/dist/{chunk-S7B34VGN.js → chunk-OWNMRMPN.js} +3 -3
  65. package/dist/{chunk-S7B34VGN.js.map → chunk-OWNMRMPN.js.map} +1 -1
  66. package/dist/chunk-RFRE4WKX.js +22 -0
  67. package/dist/chunk-RFRE4WKX.js.map +1 -0
  68. package/dist/{chunk-NNXJCLTV.js → chunk-RJFGWJ4W.js} +2 -2
  69. package/dist/chunk-RJFGWJ4W.js.map +1 -0
  70. package/dist/{chunk-NEF5XAHG.js → chunk-TUTXXC3W.js} +4 -4
  71. package/dist/chunk-TUTXXC3W.js.map +1 -0
  72. package/dist/chunk-TVYH4AN7.js +70 -0
  73. package/dist/chunk-TVYH4AN7.js.map +1 -0
  74. package/dist/{chunk-U4MHX3KH.js → chunk-VAXCXZ53.js} +33 -12
  75. package/dist/chunk-VAXCXZ53.js.map +1 -0
  76. package/dist/chunk-XNIYSAMJ.js +52 -0
  77. package/dist/chunk-XNIYSAMJ.js.map +1 -0
  78. package/dist/{chunk-CONSWNIV.js → chunk-Y2YA7QRF.js} +6 -6
  79. package/dist/chunk-Y2YA7QRF.js.map +1 -0
  80. package/dist/cli.js +1828 -0
  81. package/dist/collapse.css +70 -61
  82. package/dist/collapse.js +2 -2
  83. package/dist/confetti.css +45 -0
  84. package/dist/confetti.js +540 -0
  85. package/dist/confetti.js.map +1 -0
  86. package/dist/count-badge.js +3 -3
  87. package/dist/count-badge.js.map +1 -1
  88. package/dist/date-field.js +24 -19
  89. package/dist/date-field.js.map +1 -1
  90. package/dist/date-picker.css +563 -559
  91. package/dist/date-range-field.js +58 -41
  92. package/dist/date-range-field.js.map +1 -1
  93. package/dist/datetime-field.js +24 -19
  94. package/dist/datetime-field.js.map +1 -1
  95. package/dist/dialog.css +176 -172
  96. package/dist/dialog.js +30 -19
  97. package/dist/dialog.js.map +1 -1
  98. package/dist/digit-strip.css +65 -0
  99. package/dist/dropdown.css +65 -0
  100. package/dist/dropdown.js +350 -0
  101. package/dist/dropdown.js.map +1 -0
  102. package/dist/emoji-picker.js +713 -0
  103. package/dist/emoji-picker.js.map +1 -0
  104. package/dist/facebook-feed.css +880 -0
  105. package/dist/facebook-feed.js +697 -0
  106. package/dist/facebook-feed.js.map +1 -0
  107. package/dist/flow-field.css +49 -0
  108. package/dist/flow-field.js +269 -0
  109. package/dist/flow-field.js.map +1 -0
  110. package/dist/glide.js +3 -3
  111. package/dist/icon.css +34 -30
  112. package/dist/input.css +296 -318
  113. package/dist/instagram-feed.css +378 -0
  114. package/dist/instagram-feed.js +272 -0
  115. package/dist/instagram-feed.js.map +1 -0
  116. package/dist/lens.css +119 -0
  117. package/dist/lens.js +307 -0
  118. package/dist/lens.js.map +1 -0
  119. package/dist/mcp.js +379 -181
  120. package/dist/menu-surface.css +127 -0
  121. package/dist/modal.css +11 -7
  122. package/dist/modal.js +24 -17
  123. package/dist/modal.js.map +1 -1
  124. package/dist/morphing-text.css +84 -0
  125. package/dist/morphing-text.js +256 -0
  126. package/dist/morphing-text.js.map +1 -0
  127. package/dist/motion-devtools.css +237 -233
  128. package/dist/motion-devtools.js +7 -6
  129. package/dist/motion-devtools.js.map +1 -1
  130. package/dist/motion-tokens.js +1 -1
  131. package/dist/multi-select.js +20 -17
  132. package/dist/multi-select.js.map +1 -1
  133. package/dist/number-field.js +11 -7
  134. package/dist/number-field.js.map +1 -1
  135. package/dist/odometer.css +58 -59
  136. package/dist/odometer.js +109 -0
  137. package/dist/odometer.js.map +1 -0
  138. package/dist/otp-field.js.map +1 -1
  139. package/dist/overlay.css +24 -20
  140. package/dist/pagination.css +42 -38
  141. package/dist/pagination.js +6 -12
  142. package/dist/pagination.js.map +1 -1
  143. package/dist/popover.css +69 -65
  144. package/dist/popover.js +12 -10
  145. package/dist/radio-group.css +275 -276
  146. package/dist/radio-group.js +70 -95
  147. package/dist/radio-group.js.map +1 -1
  148. package/dist/select.css +291 -386
  149. package/dist/select.js +18 -15
  150. package/dist/select.js.map +1 -1
  151. package/dist/sheet.css +47 -23
  152. package/dist/sheet.js +11 -10
  153. package/dist/status-badge.js +3 -3
  154. package/dist/status-badge.js.map +1 -1
  155. package/dist/styles.css +221 -0
  156. package/dist/support-rail.css +421 -0
  157. package/dist/support-rail.js +243 -0
  158. package/dist/support-rail.js.map +1 -0
  159. package/dist/table.css +333 -323
  160. package/dist/table.js +32 -21
  161. package/dist/table.js.map +1 -1
  162. package/dist/tabs.css +163 -156
  163. package/dist/tabs.js +26 -20
  164. package/dist/tabs.js.map +1 -1
  165. package/dist/tag.css +209 -231
  166. package/dist/tag.js +11 -10
  167. package/dist/tag.js.map +1 -1
  168. package/dist/text-field.js +7 -67
  169. package/dist/text-field.js.map +1 -1
  170. package/dist/textarea.css +205 -211
  171. package/dist/textarea.js +12 -12
  172. package/dist/textarea.js.map +1 -1
  173. package/dist/theme.js +69 -0
  174. package/dist/theme.js.map +1 -0
  175. package/dist/tiktok.css +662 -0
  176. package/dist/tiktok.js +494 -0
  177. package/dist/tiktok.js.map +1 -0
  178. package/dist/time-field.js +6 -6
  179. package/dist/time-field.js.map +1 -1
  180. package/dist/toast.css +237 -233
  181. package/dist/toast.js +43 -47
  182. package/dist/toast.js.map +1 -1
  183. package/dist/toggle-tag.js +1 -1
  184. package/dist/toggle-tag.js.map +1 -1
  185. package/dist/toggle.css +139 -135
  186. package/dist/toggle.js.map +1 -1
  187. package/dist/tooltip.css +79 -78
  188. package/dist/tooltip.js +50 -60
  189. package/dist/tooltip.js.map +1 -1
  190. package/dist/trigger.css +13 -0
  191. package/dist/{alert.d.ts → types/components/composites/alert/Alert.d.ts} +13 -15
  192. package/dist/{date-field.d.ts → types/components/composites/date-picker/DateField.d.ts} +4 -10
  193. package/dist/types/components/composites/date-picker/DateRangeField.d.ts +21 -0
  194. package/dist/{datetime-field.d.ts → types/components/composites/date-picker/DateTimeField.d.ts} +4 -10
  195. package/dist/{time-field.d.ts → types/components/composites/date-picker/TimeField.d.ts} +5 -11
  196. package/dist/types/components/composites/date-picker/calendar-panel.d.ts +16 -0
  197. package/dist/types/components/composites/date-picker/date-utils.d.ts +12 -0
  198. package/dist/types/components/composites/date-picker/field-shell.d.ts +46 -0
  199. package/dist/types/components/composites/date-picker/range-panel.d.ts +24 -0
  200. package/dist/types/components/composites/date-picker/time-core.d.ts +14 -0
  201. package/dist/types/components/composites/date-picker/use-day-focus.d.ts +2 -0
  202. package/dist/{dialog.d.ts → types/components/composites/dialog/Dialog.d.ts} +10 -11
  203. package/dist/types/components/composites/dropdown/Dropdown.d.ts +37 -0
  204. package/dist/types/components/composites/dropdown/menu-panel.d.ts +7 -0
  205. package/dist/types/components/composites/dropdown/types.d.ts +71 -0
  206. package/dist/types/components/composites/emoji-picker/EmojiPickerPanel.d.ts +45 -0
  207. package/dist/types/components/composites/emoji-picker/category-icons.d.ts +9 -0
  208. package/dist/types/components/composites/emoji-picker/data.d.ts +33 -0
  209. package/dist/types/components/composites/emoji-picker/dom.d.ts +19 -0
  210. package/dist/types/components/composites/emoji-picker/getEmojiUrl.d.ts +2 -0
  211. package/dist/types/components/composites/emoji-picker/navigation.d.ts +7 -0
  212. package/dist/types/components/composites/emoji-picker/picker.d.ts +20 -0
  213. package/dist/types/components/composites/emoji-picker/react/category-bar.d.ts +6 -0
  214. package/dist/types/components/composites/emoji-picker/react/useEmojiPicker.d.ts +50 -0
  215. package/dist/types/components/composites/emoji-picker/scaffold.d.ts +8 -0
  216. package/dist/types/components/composites/emoji-picker/search.d.ts +1 -0
  217. package/dist/types/components/composites/emoji-picker/types.d.ts +13 -0
  218. package/dist/{modal.d.ts → types/components/composites/modal/Modal.d.ts} +10 -11
  219. package/dist/{pagination.d.ts → types/components/composites/pagination/Pagination.d.ts} +5 -8
  220. package/dist/{popover.d.ts → types/components/composites/popover/Popover.d.ts} +11 -14
  221. package/dist/{multi-select.d.ts → types/components/composites/select/MultiSelect.d.ts} +12 -11
  222. package/dist/{select.d.ts → types/components/composites/select/Select.d.ts} +16 -14
  223. package/dist/types/components/composites/select/core/index.d.ts +4 -0
  224. package/dist/types/components/composites/select/core/menu.d.ts +13 -0
  225. package/dist/types/components/composites/select/core/panel.d.ts +18 -0
  226. package/dist/types/components/composites/select/core/trigger.d.ts +16 -0
  227. package/dist/{types-SGMShK7R.d.ts → types/components/composites/select/core/types.d.ts} +13 -6
  228. package/dist/types/components/composites/select/core/use-listbox.d.ts +42 -0
  229. package/dist/{sheet.d.ts → types/components/composites/sheet/Sheet.d.ts} +10 -11
  230. package/dist/types/components/composites/sheet/use-sheet-drag.d.ts +13 -0
  231. package/dist/{table.d.ts → types/components/composites/table/Table.d.ts} +12 -12
  232. package/dist/{tabs.d.ts → types/components/composites/tabs/Tabs.d.ts} +13 -13
  233. package/dist/types/components/composites/toast/Toast.d.ts +10 -0
  234. package/dist/{toast-store.d.ts → types/components/composites/toast/toast-store.d.ts} +12 -14
  235. package/dist/{tooltip.d.ts → types/components/composites/tooltip/Tooltip.d.ts} +6 -10
  236. package/dist/types/components/composites/tooltip/tooltip-host.d.ts +1 -0
  237. package/dist/types/components/composites/tooltip/tooltip-store.d.ts +29 -0
  238. package/dist/types/components/compound/support-rail/SupportRail.d.ts +41 -0
  239. package/dist/types/components/dev/MotionDevtools.d.ts +24 -0
  240. package/dist/types/components/dev/slowmo-engine.d.ts +27 -0
  241. package/dist/types/components/expressive/confetti/Confetti.d.ts +43 -0
  242. package/dist/types/components/expressive/facebook-feed/FacebookFeed.d.ts +73 -0
  243. package/dist/types/components/expressive/facebook-feed/chrome.d.ts +30 -0
  244. package/dist/types/components/expressive/facebook-feed/icons.d.ts +21 -0
  245. package/dist/types/components/expressive/facebook-feed/post.d.ts +25 -0
  246. package/dist/types/components/expressive/facebook-feed/reel.d.ts +26 -0
  247. package/dist/types/components/expressive/facebook-feed/story.d.ts +20 -0
  248. package/dist/types/components/expressive/flow-field/FlowField.d.ts +23 -0
  249. package/dist/types/components/expressive/instagram-feed/InstagramFeed.d.ts +59 -0
  250. package/dist/types/components/expressive/lens/Lens.d.ts +23 -0
  251. package/dist/types/components/expressive/morphing-text/MorphingText.d.ts +21 -0
  252. package/dist/types/components/expressive/odometer/Odometer.d.ts +21 -0
  253. package/dist/types/components/expressive/tiktok/TikTok.d.ts +85 -0
  254. package/dist/types/components/expressive/tiktok/glyphs.d.ts +40 -0
  255. package/dist/types/components/expressive/typing-lines/TypingLines.d.ts +25 -0
  256. package/dist/types/components/expressive/weight-field/WeightField.d.ts +19 -0
  257. package/dist/types/components/expressive/youtube/YouTube.d.ts +73 -0
  258. package/dist/types/components/expressive/youtube/format.d.ts +2 -0
  259. package/dist/types/components/expressive/youtube/glyphs.d.ts +16 -0
  260. package/dist/types/components/expressive/youtube/media.d.ts +8 -0
  261. package/dist/types/components/expressive/youtube/post.d.ts +19 -0
  262. package/dist/types/components/expressive/youtube/short.d.ts +18 -0
  263. package/dist/types/components/expressive/youtube/video.d.ts +14 -0
  264. package/dist/types/components/internal/collection/collection.d.ts +19 -0
  265. package/dist/types/components/internal/glass/glint.d.ts +1 -0
  266. package/dist/types/components/internal/hooks/use-controllable.d.ts +1 -0
  267. package/dist/types/components/internal/hooks/use-media-query.d.ts +1 -0
  268. package/dist/types/components/internal/hooks/use-scroll-edges.d.ts +10 -0
  269. package/dist/types/components/internal/hooks/use-typeahead.d.ts +5 -0
  270. package/dist/types/components/internal/icon/Icon.d.ts +33 -0
  271. package/dist/types/components/internal/icon/IconSlot.d.ts +7 -0
  272. package/dist/types/components/internal/menu/menu-row.d.ts +11 -0
  273. package/dist/types/components/internal/overlay/focus.d.ts +8 -0
  274. package/dist/types/components/internal/overlay/layer.d.ts +38 -0
  275. package/dist/types/components/internal/overlay/modal.d.ts +18 -0
  276. package/dist/types/components/internal/overlay/position.d.ts +14 -0
  277. package/dist/types/components/internal/support/types.d.ts +15 -0
  278. package/dist/types/components/internal/utils/activation.d.ts +23 -0
  279. package/dist/types/components/internal/utils/cx.d.ts +1 -0
  280. package/dist/types/components/internal/utils/token-px.d.ts +1 -0
  281. package/dist/{avatar.d.ts → types/components/primitives/avatar/Avatar.d.ts} +10 -12
  282. package/dist/{avatar-group.d.ts → types/components/primitives/avatar/AvatarGroup.d.ts} +7 -9
  283. package/dist/{badge.d.ts → types/components/primitives/badge/Badge.d.ts} +8 -10
  284. package/dist/types/components/primitives/badge/CountBadge.d.ts +8 -0
  285. package/dist/types/components/primitives/badge/StatusBadge.d.ts +15 -0
  286. package/dist/types/components/primitives/badge/digit-strip.d.ts +5 -0
  287. package/dist/{button.d.ts → types/components/primitives/button/Button.d.ts} +6 -8
  288. package/dist/{checkbox.d.ts → types/components/primitives/checkbox/Checkbox.d.ts} +6 -8
  289. package/dist/types/components/primitives/checkbox/check-glyph.d.ts +6 -0
  290. package/dist/{collapse.d.ts → types/components/primitives/collapse/Collapse.d.ts} +12 -13
  291. package/dist/types/components/primitives/collapse/collapse.typecheck.d.ts +2 -0
  292. package/dist/{number-field.d.ts → types/components/primitives/input/NumberField.d.ts} +7 -9
  293. package/dist/{otp-field.d.ts → types/components/primitives/input/OtpField.d.ts} +6 -8
  294. package/dist/{text-field.d.ts → types/components/primitives/input/TextField.d.ts} +7 -9
  295. package/dist/types/components/primitives/input/field-chrome.d.ts +45 -0
  296. package/dist/{radio-group.d.ts → types/components/primitives/radio-group/RadioGroup.d.ts} +8 -10
  297. package/dist/{tag.d.ts → types/components/primitives/tag/Tag.d.ts} +9 -12
  298. package/dist/{toggle-tag.d.ts → types/components/primitives/tag/ToggleTag.d.ts} +7 -8
  299. package/dist/{textarea.d.ts → types/components/primitives/textarea/Textarea.d.ts} +7 -9
  300. package/dist/{toggle.d.ts → types/components/primitives/toggle/Toggle.d.ts} +6 -8
  301. package/dist/{dom-props-C0jrllBw.d.ts → types/dom-props.d.ts} +1 -3
  302. package/dist/types/engine/animate.d.ts +30 -0
  303. package/dist/types/engine/drag.d.ts +17 -0
  304. package/dist/types/engine/ease.d.ts +15 -0
  305. package/dist/types/engine/flip.d.ts +18 -0
  306. package/dist/types/engine/index.d.ts +4 -0
  307. package/dist/types/engine/loop.d.ts +9 -0
  308. package/dist/types/motion/element.d.ts +17 -0
  309. package/dist/types/motion/flip.d.ts +4 -0
  310. package/dist/types/motion/glide.d.ts +11 -0
  311. package/dist/types/motion/motion-timing.d.ts +16 -0
  312. package/dist/types/motion/presence-context.d.ts +11 -0
  313. package/dist/types/motion/presence.d.ts +12 -0
  314. package/dist/types/motion/presets.d.ts +6 -0
  315. package/dist/{timing-7JA_zQHP.d.ts → types/motion/timing.d.ts} +9 -9
  316. package/dist/types/motion/use-motion.d.ts +17 -0
  317. package/dist/types/tokens/component-styles.generated.d.ts +262 -0
  318. package/dist/{motion-scale-Canq4stZ.d.ts → types/tokens/motion-scale.d.ts} +4 -4
  319. package/dist/{motion-tokens.d.ts → types/tokens/motion-tokens.d.ts} +9 -9
  320. package/dist/types/tokens/theme-tokens.generated.d.ts +1249 -0
  321. package/dist/types/tokens/theme.d.ts +12 -0
  322. package/dist/typing-lines.css +92 -0
  323. package/dist/typing-lines.js +139 -0
  324. package/dist/typing-lines.js.map +1 -0
  325. package/dist/weight-field.css +84 -0
  326. package/dist/weight-field.js +17 -0
  327. package/dist/weight-field.js.map +1 -0
  328. package/dist/youtube.css +611 -0
  329. package/dist/youtube.js +814 -0
  330. package/dist/youtube.js.map +1 -0
  331. package/package.json +155 -49
  332. package/skills/zyncat-ui/SKILL.md +95 -0
  333. package/skills/zyncat-ui/references/components.md +85 -0
  334. package/skills/zyncat-ui/references/recipes.md +171 -0
  335. package/skills/zyncat-ui/references/theming.md +83 -0
  336. package/src/components/composites/alert/Alert.tsx +13 -11
  337. package/src/components/composites/alert/Alert.usage.md +15 -0
  338. package/src/components/composites/alert/alert.css +126 -121
  339. package/src/components/composites/date-picker/DateField.tsx +7 -2
  340. package/src/components/composites/date-picker/DateField.usage.md +10 -0
  341. package/src/components/composites/date-picker/DateRangeField.tsx +18 -16
  342. package/src/components/composites/date-picker/DateRangeField.usage.md +10 -0
  343. package/src/components/composites/date-picker/DateTimeField.tsx +10 -5
  344. package/src/components/composites/date-picker/DateTimeField.usage.md +12 -0
  345. package/src/components/composites/date-picker/TimeField.tsx +3 -1
  346. package/src/components/composites/date-picker/TimeField.usage.md +12 -0
  347. package/src/components/composites/date-picker/calendar-panel.tsx +15 -10
  348. package/src/components/composites/date-picker/date-picker.css +563 -559
  349. package/src/components/composites/date-picker/field-shell.tsx +9 -3
  350. package/src/components/composites/date-picker/range-panel.tsx +23 -8
  351. package/src/components/composites/date-picker/time-core.tsx +2 -0
  352. package/src/components/composites/dialog/Dialog.tsx +30 -15
  353. package/src/components/composites/dialog/Dialog.usage.md +17 -0
  354. package/src/components/composites/dialog/dialog.css +176 -172
  355. package/src/components/composites/dropdown/Dropdown.tsx +184 -0
  356. package/src/components/composites/dropdown/Dropdown.usage.md +19 -0
  357. package/src/components/composites/dropdown/dropdown.css +65 -0
  358. package/src/components/composites/dropdown/menu-panel.tsx +255 -0
  359. package/src/components/composites/dropdown/types.ts +95 -0
  360. package/src/components/composites/emoji-picker/EmojiPickerPanel.tsx +153 -0
  361. package/src/components/composites/emoji-picker/EmojiPickerPanel.usage.md +26 -0
  362. package/src/components/composites/emoji-picker/category-icons.ts +29 -0
  363. package/src/components/composites/emoji-picker/data.ts +83 -0
  364. package/src/components/composites/emoji-picker/dom.ts +79 -0
  365. package/src/components/composites/emoji-picker/getEmojiUrl.ts +17 -0
  366. package/src/components/composites/emoji-picker/navigation.ts +86 -0
  367. package/src/components/composites/emoji-picker/picker.ts +169 -0
  368. package/src/components/composites/emoji-picker/react/category-bar.tsx +77 -0
  369. package/src/components/composites/emoji-picker/react/useEmojiPicker.ts +139 -0
  370. package/src/components/composites/emoji-picker/scaffold.ts +74 -0
  371. package/src/components/composites/emoji-picker/search.ts +79 -0
  372. package/src/components/composites/emoji-picker/styles.css +221 -0
  373. package/src/components/composites/emoji-picker/types.ts +14 -0
  374. package/src/components/composites/modal/Modal.tsx +24 -13
  375. package/src/components/composites/modal/Modal.usage.md +24 -0
  376. package/src/components/composites/modal/modal.css +11 -7
  377. package/src/components/composites/pagination/Pagination.tsx +6 -11
  378. package/src/components/composites/pagination/Pagination.usage.md +12 -0
  379. package/src/components/composites/pagination/pagination.css +42 -38
  380. package/src/components/composites/popover/Popover.tsx +22 -7
  381. package/src/components/composites/popover/Popover.usage.md +15 -0
  382. package/src/components/composites/popover/popover.css +69 -65
  383. package/src/components/composites/select/MultiSelect.tsx +13 -5
  384. package/src/components/composites/select/MultiSelect.usage.md +12 -0
  385. package/src/components/composites/select/Select.tsx +23 -7
  386. package/src/components/composites/select/Select.usage.md +20 -0
  387. package/src/components/composites/select/core/index.ts +1 -1
  388. package/src/components/composites/select/core/menu.tsx +8 -6
  389. package/src/components/composites/select/core/panel.tsx +25 -26
  390. package/src/components/composites/select/core/trigger.tsx +36 -24
  391. package/src/components/composites/select/core/types.ts +17 -15
  392. package/src/components/composites/select/core/use-listbox.ts +22 -21
  393. package/src/components/composites/select/select.css +291 -386
  394. package/src/components/composites/sheet/Sheet.tsx +28 -18
  395. package/src/components/composites/sheet/Sheet.usage.md +15 -0
  396. package/src/components/composites/sheet/sheet.css +47 -23
  397. package/src/components/composites/sheet/use-sheet-drag.ts +19 -15
  398. package/src/components/composites/table/Table.tsx +17 -6
  399. package/src/components/composites/table/Table.usage.md +19 -0
  400. package/src/components/composites/table/table.css +333 -323
  401. package/src/components/composites/tabs/Tabs.tsx +31 -23
  402. package/src/components/composites/tabs/Tabs.usage.md +13 -0
  403. package/src/components/composites/tabs/tabs.css +163 -156
  404. package/src/components/composites/toast/Toast.tsx +48 -51
  405. package/src/components/composites/toast/Toast.usage.md +23 -0
  406. package/src/components/composites/toast/toast-store.usage.md +16 -0
  407. package/src/components/composites/toast/toast.css +237 -233
  408. package/src/components/composites/tooltip/Tooltip.tsx +13 -8
  409. package/src/components/composites/tooltip/Tooltip.usage.md +14 -0
  410. package/src/components/composites/tooltip/tooltip-host.tsx +29 -61
  411. package/src/components/composites/tooltip/tooltip-store.ts +10 -0
  412. package/src/components/composites/tooltip/tooltip.css +79 -78
  413. package/src/components/compound/support-rail/SupportRail.tsx +343 -0
  414. package/src/components/compound/support-rail/SupportRail.usage.md +18 -0
  415. package/src/components/compound/support-rail/support-rail.css +421 -0
  416. package/src/components/dev/MotionDevtools.tsx +3 -1
  417. package/src/components/dev/MotionDevtools.usage.md +16 -0
  418. package/src/components/dev/motion-devtools.css +237 -233
  419. package/src/components/expressive/confetti/Confetti.tsx +727 -0
  420. package/src/components/expressive/confetti/Confetti.usage.md +18 -0
  421. package/src/components/expressive/confetti/confetti.css +45 -0
  422. package/src/components/expressive/facebook-feed/FacebookFeed.tsx +200 -0
  423. package/src/components/expressive/facebook-feed/FacebookFeed.usage.md +18 -0
  424. package/src/components/expressive/facebook-feed/chrome.tsx +120 -0
  425. package/src/components/expressive/facebook-feed/facebook-feed.css +880 -0
  426. package/src/components/expressive/facebook-feed/icons.tsx +145 -0
  427. package/src/components/expressive/facebook-feed/post.tsx +213 -0
  428. package/src/components/expressive/facebook-feed/reel.tsx +199 -0
  429. package/src/components/expressive/facebook-feed/story.tsx +132 -0
  430. package/src/components/expressive/flow-field/FlowField.tsx +348 -0
  431. package/src/components/expressive/flow-field/FlowField.usage.md +19 -0
  432. package/src/components/expressive/flow-field/flow-field.css +49 -0
  433. package/src/components/expressive/instagram-feed/InstagramFeed.tsx +374 -0
  434. package/src/components/expressive/instagram-feed/InstagramFeed.usage.md +18 -0
  435. package/src/components/expressive/instagram-feed/instagram-feed.css +378 -0
  436. package/src/components/expressive/lens/Lens.tsx +415 -0
  437. package/src/components/expressive/lens/Lens.usage.md +20 -0
  438. package/src/components/expressive/lens/lens.css +119 -0
  439. package/src/components/expressive/morphing-text/MorphingText.tsx +328 -0
  440. package/src/components/expressive/morphing-text/MorphingText.usage.md +19 -0
  441. package/src/components/expressive/morphing-text/morphing-text.css +84 -0
  442. package/src/components/expressive/odometer/Odometer.tsx +158 -0
  443. package/src/components/expressive/odometer/Odometer.usage.md +17 -0
  444. package/src/components/expressive/odometer/odometer.css +61 -0
  445. package/src/components/expressive/tiktok/TikTok.tsx +542 -0
  446. package/src/components/expressive/tiktok/TikTok.usage.md +17 -0
  447. package/src/components/expressive/tiktok/glyphs.tsx +163 -0
  448. package/src/components/expressive/tiktok/tiktok.css +662 -0
  449. package/src/components/expressive/typing-lines/TypingLines.tsx +0 -0
  450. package/src/components/expressive/typing-lines/TypingLines.usage.md +17 -0
  451. package/src/components/expressive/typing-lines/typing-lines.css +92 -0
  452. package/src/components/expressive/weight-field/WeightField.tsx +41 -0
  453. package/src/components/expressive/weight-field/WeightField.usage.md +20 -0
  454. package/src/components/expressive/weight-field/weight-field.css +84 -0
  455. package/src/components/expressive/youtube/YouTube.tsx +192 -0
  456. package/src/components/expressive/youtube/YouTube.usage.md +18 -0
  457. package/src/components/expressive/youtube/format.ts +22 -0
  458. package/src/components/expressive/youtube/glyphs.tsx +235 -0
  459. package/src/components/expressive/youtube/media.tsx +18 -0
  460. package/src/components/expressive/youtube/post.tsx +282 -0
  461. package/src/components/expressive/youtube/short.tsx +212 -0
  462. package/src/components/expressive/youtube/video.tsx +75 -0
  463. package/src/components/expressive/youtube/youtube.css +611 -0
  464. package/src/components/internal/collection/collection.ts +44 -0
  465. package/src/components/internal/glass/glass.css +88 -84
  466. package/src/components/internal/hooks/use-media-query.ts +20 -0
  467. package/src/components/internal/hooks/use-typeahead.ts +28 -0
  468. package/src/components/internal/icon/Icon.tsx +2 -0
  469. package/src/components/internal/icon/IconSlot.tsx +2 -0
  470. package/src/components/internal/icon/icon.css +34 -30
  471. package/src/components/internal/menu/menu-row.tsx +34 -0
  472. package/src/components/internal/menu/menu-surface.css +127 -0
  473. package/src/components/internal/overlay/focus.ts +26 -10
  474. package/src/components/internal/overlay/layer.tsx +50 -9
  475. package/src/components/internal/overlay/modal.tsx +14 -12
  476. package/src/components/internal/overlay/overlay.css +24 -20
  477. package/src/components/internal/overlay/position.ts +19 -9
  478. package/src/components/internal/overlay/trigger.css +13 -0
  479. package/src/components/internal/support/types.ts +16 -0
  480. package/src/components/internal/utils/activation.ts +78 -0
  481. package/src/components/primitives/avatar/Avatar.tsx +2 -0
  482. package/src/components/primitives/avatar/Avatar.usage.md +12 -0
  483. package/src/components/primitives/avatar/AvatarGroup.tsx +3 -1
  484. package/src/components/primitives/avatar/AvatarGroup.usage.md +15 -0
  485. package/src/components/primitives/avatar/avatar.css +179 -174
  486. package/src/components/primitives/badge/Badge.tsx +3 -1
  487. package/src/components/primitives/badge/Badge.usage.md +14 -0
  488. package/src/components/primitives/badge/CountBadge.tsx +2 -2
  489. package/src/components/primitives/badge/CountBadge.usage.md +13 -0
  490. package/src/components/primitives/badge/StatusBadge.tsx +3 -1
  491. package/src/components/primitives/badge/StatusBadge.usage.md +14 -0
  492. package/src/components/primitives/badge/badge.css +166 -160
  493. package/src/components/primitives/badge/digit-strip.css +65 -0
  494. package/src/components/primitives/badge/{odometer.tsx → digit-strip.tsx} +3 -3
  495. package/src/components/primitives/button/Button.tsx +2 -0
  496. package/src/components/primitives/button/Button.usage.md +14 -0
  497. package/src/components/primitives/button/button.css +272 -246
  498. package/src/components/primitives/checkbox/Checkbox.tsx +3 -1
  499. package/src/components/primitives/checkbox/Checkbox.usage.md +12 -0
  500. package/src/components/primitives/checkbox/check-glyph.tsx +1 -0
  501. package/src/components/primitives/checkbox/checkbox.css +158 -153
  502. package/src/components/primitives/collapse/Collapse.tsx +3 -1
  503. package/src/components/primitives/collapse/Collapse.usage.md +17 -0
  504. package/src/components/primitives/collapse/collapse.css +70 -61
  505. package/src/components/primitives/collapse/collapse.typecheck.tsx +2 -0
  506. package/src/components/primitives/input/NumberField.tsx +18 -5
  507. package/src/components/primitives/input/NumberField.usage.md +12 -0
  508. package/src/components/primitives/input/OtpField.tsx +2 -0
  509. package/src/components/primitives/input/OtpField.usage.md +12 -0
  510. package/src/components/primitives/input/TextField.tsx +16 -4
  511. package/src/components/primitives/input/TextField.usage.md +13 -0
  512. package/src/components/primitives/input/field-chrome.tsx +11 -2
  513. package/src/components/primitives/input/input.css +296 -318
  514. package/src/components/primitives/radio-group/RadioGroup.tsx +20 -44
  515. package/src/components/primitives/radio-group/RadioGroup.usage.md +13 -0
  516. package/src/components/primitives/radio-group/radio-group.css +275 -276
  517. package/src/components/primitives/tag/Tag.tsx +10 -6
  518. package/src/components/primitives/tag/Tag.usage.md +14 -0
  519. package/src/components/primitives/tag/ToggleTag.tsx +4 -2
  520. package/src/components/primitives/tag/ToggleTag.usage.md +14 -0
  521. package/src/components/primitives/tag/tag.css +209 -231
  522. package/src/components/primitives/textarea/Textarea.tsx +17 -7
  523. package/src/components/primitives/textarea/Textarea.usage.md +12 -0
  524. package/src/components/primitives/textarea/textarea.css +205 -211
  525. package/src/components/primitives/toggle/Toggle.tsx +3 -1
  526. package/src/components/primitives/toggle/Toggle.usage.md +12 -0
  527. package/src/components/primitives/toggle/toggle.css +139 -135
  528. package/src/engine/animate.ts +40 -13
  529. package/src/engine/ease.ts +1 -0
  530. package/src/engine/flip.ts +32 -15
  531. package/src/engine/index.ts +2 -1
  532. package/src/engine/loop.ts +97 -0
  533. package/src/mcp/server.ts +315 -218
  534. package/src/motion/element.tsx +1 -0
  535. package/src/motion/flip.ts +29 -10
  536. package/src/motion/glide.tsx +11 -14
  537. package/src/motion/glide.usage.md +15 -0
  538. package/src/motion/motion-timing.ts +3 -3
  539. package/src/motion/presence.tsx +12 -5
  540. package/src/motion/presets.ts +13 -0
  541. package/src/motion/timing.ts +1 -0
  542. package/src/motion/use-motion.ts +16 -3
  543. package/src/styles.css +5 -0
  544. package/src/tokens/avatar.css +20 -16
  545. package/src/tokens/color.css +67 -56
  546. package/src/tokens/component-styles.generated.ts +270 -0
  547. package/src/tokens/elevation.css +28 -17
  548. package/src/tokens/fonts.css +1 -1
  549. package/src/tokens/glass.css +19 -15
  550. package/src/tokens/icons.css +8 -4
  551. package/src/tokens/layers.css +9 -4
  552. package/src/tokens/motion-scale.ts +4 -0
  553. package/src/tokens/motion-tokens.ts +42 -12
  554. package/src/tokens/motion-tokens.usage.md +16 -0
  555. package/src/tokens/motion.css +63 -45
  556. package/src/tokens/radius.css +12 -8
  557. package/src/tokens/semantic.css +62 -54
  558. package/src/tokens/spacing.css +25 -21
  559. package/src/tokens/theme-tokens.generated.ts +1278 -0
  560. package/src/tokens/theme.tsx +83 -0
  561. package/src/tokens/theme.usage.md +36 -0
  562. package/src/tokens/typography.css +53 -49
  563. package/dist/chunk-2ERBBFZS.js.map +0 -1
  564. package/dist/chunk-2F5PITAO.js.map +0 -1
  565. package/dist/chunk-2QWJ6FAX.js.map +0 -1
  566. package/dist/chunk-62P3KD57.js.map +0 -1
  567. package/dist/chunk-7SZCJ7WI.js.map +0 -1
  568. package/dist/chunk-AIQXS2XY.js.map +0 -1
  569. package/dist/chunk-AMFGY56I.js.map +0 -1
  570. package/dist/chunk-CONSWNIV.js.map +0 -1
  571. package/dist/chunk-DKVUPFQR.js.map +0 -1
  572. package/dist/chunk-I4XQ4PV2.js.map +0 -1
  573. package/dist/chunk-NEF5XAHG.js.map +0 -1
  574. package/dist/chunk-NGTA34V2.js.map +0 -1
  575. package/dist/chunk-NNXJCLTV.js.map +0 -1
  576. package/dist/chunk-PMECHR3A.js.map +0 -1
  577. package/dist/chunk-QDK66S4G.js.map +0 -1
  578. package/dist/chunk-S5ZTZANS.js.map +0 -1
  579. package/dist/chunk-U4MHX3KH.js.map +0 -1
  580. package/dist/chunk-VTJTGVZZ.js.map +0 -1
  581. package/dist/chunk-WFHRAKN3.js.map +0 -1
  582. package/dist/chunk-WM5J5TDI.js.map +0 -1
  583. package/dist/chunk-XJQQQJAO.js.map +0 -1
  584. package/dist/chunk-XWUWYSCT.js.map +0 -1
  585. package/dist/chunk-Y7AJQVWJ.js.map +0 -1
  586. package/dist/chunk-YGCVWGUG.js.map +0 -1
  587. package/dist/chunk-YGGCQNNU.js.map +0 -1
  588. package/dist/count-badge.d.ts +0 -13
  589. package/dist/date-range-field.d.ts +0 -33
  590. package/dist/field-chrome-CMPOQSLs.d.ts +0 -28
  591. package/dist/field-shell-Cuda-feL.d.ts +0 -24
  592. package/dist/glide.d.ts +0 -15
  593. package/dist/motion-devtools.d.ts +0 -51
  594. package/dist/status-badge.d.ts +0 -19
  595. package/dist/toast.d.ts +0 -12
  596. package/llms.txt +0 -220
  597. package/src/components/primitives/badge/odometer.css +0 -62
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: zyncat-ui
3
+ description: Use when writing or reviewing React code in a project that uses @zyncat/ui - picking which component fits a job, rendering or composing components, styling/theming them, or debugging their behavior. Load BEFORE importing or rendering any @zyncat/ui component.
4
+ ---
5
+
6
+ # Building with @zyncat/ui
7
+
8
+ React 19 design system: accessible, animated components on a closed CSS token vocabulary.
9
+ No Tailwind, no CSS-in-JS, no animation library - a built-in WAAPI motion engine drives everything.
10
+
11
+ ## The contract
12
+
13
+ 1. **Never write a component's props from memory or from this skill.** Before writing any JSX that
14
+ renders a Zyncat UI component, call the `get_component` MCP tool with EVERY component the change
15
+ touches, in one call: `get_component(["select", "text-field", "dialog"])`. It returns the
16
+ maintainers' usage notes, the live docs URL and the complete prop types for the version actually
17
+ installed. An unknown name returns the full catalog, so a wrong guess self-corrects.
18
+ 2. Unsure which component owns a behavior? `search_api("drag dismiss")` - ranked, and a miss
19
+ returns the catalog.
20
+ 3. Styling or theming? Read [references/theming.md](references/theming.md) first, then `get_tokens`
21
+ for the real values.
22
+ 4. Full component inventory: [references/components.md](references/components.md) - generated, and
23
+ stamped with the version it came from. If `node_modules/@zyncat/ui/package.json` shows a
24
+ different version, trust `get_component` over the file and re-run `npx zyncat-ui init`.
25
+ 5. If the MCP tools are missing, register the server and reinstall this skill: `npx zyncat-ui init`
26
+ (one command: installs the package if absent, imports the stylesheet, writes `.mcp.json`,
27
+ `.claude/skills/` and the theme scaffold).
28
+
29
+ ## Setup (once per app)
30
+
31
+ Everything here is what `npx zyncat-ui init` wires up - when a piece is missing, prefer re-running
32
+ init over hand-wiring it.
33
+
34
+ - `import '@zyncat/ui/styles.css'` once at the root - fonts + tokens; each component lazy-loads its
35
+ own CSS.
36
+ - Theming: `defineTheme` + `<ZyncatTheme theme={{ base, dark }} />` from `@zyncat/ui/theme`, once at
37
+ the root. Typed, server-rendered, no build config. See references/theming.md before writing one.
38
+ - One subpath per component: `import { Button } from '@zyncat/ui/button'`. There is no barrel.
39
+ - Peers: react and react-dom 19. Ships built ESM with `'use client'` intact - no bundler or
40
+ transpile config, works as-is in the Next.js App Router.
41
+ - Icons: the library bundles its own internal glyphs but exports NO Icon component. Every
42
+ icon-shaped prop or slot takes YOUR ReactNode (e.g. an `@phosphor-icons/react` element).
43
+
44
+ ## Picking the component
45
+
46
+ The catalog is 9 groups (~50 components): primitives, forms, data display, date/time & tabs,
47
+ overlays & feedback, expressive, compound, replicas, dev tools. The full index is in
48
+ [references/components.md](references/components.md). The choices agents get wrong:
49
+
50
+ | Job | Use |
51
+ | ------------------------------------------------ | -------------------------------------------------------------------------------------------------- |
52
+ | Standard modal: title, body, actions | **Dialog** - the default choice for modals |
53
+ | Modality with zero chrome (lightbox, full-bleed) | **Modal** - you supply the surface AND role="dialog" |
54
+ | Edge-docked panel, drag-to-dismiss | **Sheet** |
55
+ | Anchored non-modal panel | **Popover** |
56
+ | Menu of actions on a trigger | **Dropdown** - commands only, never holds a value |
57
+ | Pick one value from options | **Select** (or **RadioGroup** when all options should be visible) |
58
+ | Pick many values | **MultiSelect** (form value) / **ToggleTag** (filter chips) |
59
+ | Transient hint on hover/focus | **Tooltip** |
60
+ | Persistent in-flow status | **Alert** |
61
+ | Transient notification | **toast()** - needs `<Toaster />` mounted once |
62
+ | Ambient status chip | **Badge** / **StatusBadge** (canonical post status) |
63
+ | User-owned removable label | **Tag** |
64
+ | Rolling number | **CountBadge roll** (inline) / **Odometer** (display size) |
65
+ | Persistent support entry point | **SupportRail** (edge tab) |
66
+ | Social post mock | **InstagramFeed / FacebookFeed / TikTok / YouTube** - pixel-pinned replicas, unthemeable by design |
67
+
68
+ ## Conventions the system assumes
69
+
70
+ - Sentence case everywhere; no emoji or exclamation marks in UI copy.
71
+ - Exactly one primary `<Button>` per view.
72
+ - Numbers, times, IDs and status read mono + tabular.
73
+ - Status hues (info/success/warning/danger) only for genuine status; hierarchy comes from the
74
+ neutral ramp.
75
+
76
+ ## Pitfalls that bite
77
+
78
+ - `toast()` silently no-ops until `<Toaster />` is mounted once at the app root.
79
+ - `EmojiPickerPanel` throws unless `loadEmojiData(...)` ran before first open; `getEmojiUrl` is
80
+ required.
81
+ - Overlays (Dialog, Modal, Sheet, Popover, Tooltip, Dropdown) take no `className` - pass
82
+ `htmlProps={{ className }}` to reach the panel.
83
+ - `Modal` renders zero semantics - you render `role="dialog"` plus a label yourself.
84
+ - `Collapse`'s `animation` takes motion TOKENS only (`fast|base|slow|...`), never millisecond
85
+ values.
86
+ - Replicas pin platform metrics as constants - tokens cannot move them, on purpose.
87
+ - Every component's docs page is live at the `Docs:` URL `get_component` returns
88
+ (`https://ui.zyncat.app/<slug>`) - open or screenshot it to see the component rendered.
89
+
90
+ ## References
91
+
92
+ - [references/components.md](references/components.md) - the generated component index
93
+ - [references/theming.md](references/theming.md) - the four override levels + token vocabulary
94
+ - [references/recipes.md](references/recipes.md) - assembled patterns: forms, tables, confirm
95
+ flows, notifications, drawers
@@ -0,0 +1,85 @@
1
+ # @zyncat/ui component index
2
+
3
+ Generated from @zyncat/ui v0.13.0 by `pnpm sync:skill` - do not edit by hand.
4
+ If node_modules/@zyncat/ui/package.json shows a DIFFERENT version, this index is stale:
5
+ trust the get_component MCP tool and re-run `npx zyncat-ui init` to refresh the skill.
6
+
7
+ This is an index, not the API - prop lists here are incomplete by design.
8
+ Call get_component (it accepts a list) before writing any JSX.
9
+
10
+ == Primitives ==
11
+ Button - @zyncat/ui/button - One control for every click; exactly one primary per view.
12
+ Collapse - @zyncat/ui/collapse - Layout-transition primitive; eases height open/closed, never teleports.
13
+ Badge - @zyncat/ui/badge - Glass or outline chip for ambient status - toned, dotted, live or pill.
14
+ StatusBadge - @zyncat/ui/status-badge - Canonical post status - tone + one-word label.
15
+ CountBadge - @zyncat/ui/count-badge - Mono tabular count; `roll` animates digits like an odometer.
16
+ Glide / GlidePill - @zyncat/ui/glide - A persistent background pill that glides smoothly between hovered/active elements.
17
+
18
+ == Forms ==
19
+ Every form field takes label, helper/error/warning/success, size sm|md|lg, disabled.
20
+ TextField - @zyncat/ui/text-field - Base text input; states disclose via Collapse.
21
+ NumberField - @zyncat/ui/number-field - Tabular figures, caret steppers, unit suffix, clamp to [min,max].
22
+ OtpField - @zyncat/ui/otp-field - Segmented one-time code; auto-advance, paste-to-fill.
23
+ Textarea - @zyncat/ui/textarea - Auto-grow, char meter (max), ⌘/Ctrl+↵ submit (onSubmit).
24
+ Checkbox - @zyncat/ui/checkbox - Stages a choice the form commits later - pick Toggle when the effect is immediate.
25
+ Toggle - @zyncat/ui/toggle - Actuates a setting on the spot - pick Checkbox when the form commits the choice later.
26
+ RadioGroup - @zyncat/ui/radio-group - Pick exactly one from options that stay visible - rows or cards; pick Select for long lists.
27
+ Select - @zyncat/ui/select - Single-select listbox in a popover, searchable; holds value: string | null.
28
+ MultiSelect - @zyncat/ui/multi-select - Many-of listbox; stays open while toggling, trigger summarises as first +N.
29
+
30
+ == Data display ==
31
+ Avatar - @zyncat/ui/avatar - Identity mark: image, initials, or silhouette.
32
+ AvatarGroup - @zyncat/ui/avatar-group - Overlapping avatars with +N overflow.
33
+ Tag / TagGroup - @zyncat/ui/tag - User-owned label (a control, not a status).
34
+ ToggleTag - @zyncat/ui/toggle-tag - Many-of-many filter chip.
35
+ Table - @zyncat/ui/table - Declare columns + rows; owns sort, selection, stickiness, overflow.
36
+ Pagination - @zyncat/ui/pagination - Cursor strip: mono range readout + prev/next pair.
37
+
38
+ == Date, time & tabs ==
39
+ The date and time fields share: value is a string, onChange(value | null), timezone, min/max, disabled.
40
+ DateField - @zyncat/ui/date-field - Month calendar in a popover; value 'YYYY-MM-DD'.
41
+ DateTimeField - @zyncat/ui/datetime-field - Calendar + segmented HH:MM; value 'YYYY-MM-DDTHH:mm'.
42
+ DateRangeField - @zyncat/ui/date-range-field - Two-tap auto-ordering window; value DateRange { start, end } | null; commits when both ends exist.
43
+ TimeField - @zyncat/ui/time-field - Standalone segmented time; value 'HH:mm'; bounds saturate.
44
+ Tabs / TabPanel - @zyncat/ui/tabs - Line tabs; the ink reaches then releases; panels enter from the side you moved toward.
45
+
46
+ == Overlays & feedback ==
47
+ Dropdown - @zyncat/ui/dropdown - Menu button - a list of ACTIONS the trigger commits, with submenus.
48
+ Popover - @zyncat/ui/popover - Headless anchored panel, non-modal.
49
+ Sheet - @zyncat/ui/sheet - Edge-docked modal panel, drag-to-dismiss.
50
+ Dialog - @zyncat/ui/dialog - DEFAULT CHOICE for modals - the styled surface: header (icon/title/description/close), scrolling body, footer actions, on top of scrim + focus trap + scroll lock.
51
+ Modal - @zyncat/ui/modal - The SAME modality as Dialog (scrim, focus trap, scroll lock, inert, Esc, motion) with ZERO paint - no header, no body padding, no width cap, no border/radius/shadow.
52
+ Tooltip - @zyncat/ui/tooltip - Transient hint on hover/focus; wraps any child (no ref wiring needed).
53
+ Alert - @zyncat/ui/alert - Persistent, in-flow status.
54
+ Toast - @zyncat/ui/toast - Imperative transient notifications: mount <Toaster /> once at the app root, then call toast() from anywhere.
55
+ toast-store - @zyncat/ui/toast-store - The headless store behind Toast: subscribe to the toast queue and drive it without rendering <Toaster />.
56
+ EmojiPickerPanel - @zyncat/ui/emoji-picker - Searchable emoji panel - grid, scrollspy category rail, recents in localStorage - living in a Popover, becoming a bottom Sheet on narrow viewports.
57
+
58
+ == Expressive ==
59
+ Creative motion components. Each publishes scoped --<component>-* custom properties as its theming surface.
60
+ Odometer - @zyncat/ui/odometer - Rolling number display for display-size figures - each digit column springs on its own.
61
+ TypingLines - @zyncat/ui/typing-lines - A single line that types itself, holds, deletes, then moves to the next one and repeats.
62
+ Lens - @zyncat/ui/lens - An optical loupe that magnifies whatever you wrap.
63
+ Confetti - @zyncat/ui/confetti - A canvas particle burst you fire yourself: paper flakes, curls, ribbons and foil sequins tumbling on real drag, lift and flip, across three depth layers.
64
+ FlowField - @zyncat/ui/flow-field - A canvas field of needles that breathe on a noise loop, then swing away from the pointer with per-cell lag - a decorative backdrop for a hero or a card.
65
+ MorphingText - @zyncat/ui/morphing-text - A headline that cycles a word list, morphing each word into the next.
66
+ WeightField - @zyncat/ui/weight-field - A display headline where hovering one letter ramps its variable-font wght to the peak and its two neighbours either side part-way, so weight spills outward from the cursor.
67
+
68
+ == Compound ==
69
+ Whole assembled patterns on the expressive contract - scoped --support-rail-* properties, no tone/corner/density enums. Actions are a SupportAction[]: id, label, icon, meta, description, onSelect.
70
+ SupportRail - @zyncat/ui/support-rail - An edge tab that grows a support panel out of its own measured box.
71
+
72
+ == Replicas ==
73
+ Each reproduces an external platform surface; fidelity is the contract. Platform metrics are pinned constants - only --font-sans, --focus-ring and the duration tokens are read, so your theme cannot move them. None ever fetches media or autoplays: media and avatar take a URL string or your own node, with CSS-only placeholders.
74
+ FacebookFeed - @zyncat/ui/facebook-feed - Replica of Facebook's three post surfaces, pinned to the platform's real metrics: the feed card, the reels stage and the story stage.
75
+ InstagramFeed - @zyncat/ui/instagram-feed - A replica of one Instagram feed post, pixel-pinned to the platform and immune to your theme.
76
+ TikTok - @zyncat/ui/tiktok - A replica of TikTok's post surface: pick surface="desktop" for the 1584x912 web player with the photo carousel, or surface="mobile" for the 452x822 mobile-web viewport.
77
+ YouTube - @zyncat/ui/youtube - Replica of three YouTube surfaces, picked with surface: a feed grid card (video), a Shorts player with its action rail (short), or a community post (post).
78
+
79
+ == Dev tools ==
80
+ motion-tokens - @zyncat/ui/motion-tokens - TypeScript readers for the motion token vocabulary - duration/ease/distance/scale token names resolved to the live CSS values.
81
+ MotionDevtools - @zyncat/ui/motion-devtools - Dev-only floating panel that slows or freezes EVERY animation at once (CSS and WAAPI) for motion debugging.
82
+ Theme - @zyncat/ui/theme - Typed theming - defineTheme groups every token with autocomplete and hover docs; ZyncatTheme renders the themes as unlayered CSS above the library layers, with no build step.
83
+
84
+ == Types-only modules (documented by their .d.ts alone) ==
85
+ @zyncat/ui/next - get_component("next")
@@ -0,0 +1,171 @@
1
+ # Recipes - assembled @zyncat/ui patterns
2
+
3
+ Templates, not truth: they show which components compose and how state flows between them.
4
+ Before shipping one, run `get_component` on the parts you use - props here are the common subset,
5
+ not the full API of your installed version.
6
+
7
+ ## Settings form
8
+
9
+ TextField + Select + Toggle + Button, submitted with a loading state and a toast.
10
+
11
+ ```tsx
12
+ import { Button } from '@zyncat/ui/button';
13
+ import { Select } from '@zyncat/ui/select';
14
+ import { TextField } from '@zyncat/ui/text-field';
15
+ import { toast } from '@zyncat/ui/toast';
16
+ import { Toggle } from '@zyncat/ui/toggle';
17
+
18
+ function WorkspaceSettings() {
19
+ const [name, setName] = useState('');
20
+ const [tz, setTz] = useState<string | null>(null);
21
+ const [autosave, setAutosave] = useState(true);
22
+ const [saving, setSaving] = useState(false);
23
+
24
+ const save = async () => {
25
+ setSaving(true);
26
+ try {
27
+ await api.save({ name, tz, autosave });
28
+ toast.success('Settings saved');
29
+ } finally {
30
+ setSaving(false);
31
+ }
32
+ };
33
+
34
+ return (
35
+ <form
36
+ onSubmit={(e) => {
37
+ e.preventDefault();
38
+ save();
39
+ }}
40
+ >
41
+ <TextField id="ws" label="Workspace name" required value={name} onChange={(e) => setName(e.target.value)} />
42
+ <Select
43
+ options={TIMEZONES}
44
+ value={tz}
45
+ onChange={setTz}
46
+ searchable
47
+ placeholder="Choose a time zone"
48
+ ariaLabel="Time zone"
49
+ />
50
+ <Toggle label="Auto-save drafts" checked={autosave} onChange={(e) => setAutosave(e.target.checked)} />
51
+ <Button type="submit" loading={saving}>
52
+ Save changes
53
+ </Button>
54
+ </form>
55
+ );
56
+ }
57
+ ```
58
+
59
+ ## Data table page
60
+
61
+ ToggleTag filters above a sortable Table, a Pagination cursor strip below.
62
+
63
+ ```tsx
64
+ import { Pagination } from '@zyncat/ui/pagination';
65
+ import { Table } from '@zyncat/ui/table';
66
+ import { ToggleTag } from '@zyncat/ui/toggle-tag';
67
+
68
+ <ToggleTag selected={onlyFailed} onChange={setOnlyFailed} count={counts.failed}>Failed</ToggleTag>
69
+ <Table<Invoice>
70
+ ariaLabel="Invoices"
71
+ columns={COLUMNS}
72
+ rows={page.rows}
73
+ selectable
74
+ defaultSort={{ key: 'amount', dir: 'desc' }}
75
+ />
76
+ <Pagination ariaLabel="Rows" range={[page.from, page.to]} total={page.total}
77
+ hasPrev={page.from > 1} hasNext={page.to < page.total} onPrev={prev} onNext={next} />
78
+ ```
79
+
80
+ ## Destructive confirm
81
+
82
+ Dialog owns the modality; the danger action lives in its footer and reports back with a toast.
83
+
84
+ ```tsx
85
+ import { Button } from '@zyncat/ui/button';
86
+ import { Dialog } from '@zyncat/ui/dialog';
87
+ import { toast } from '@zyncat/ui/toast';
88
+
89
+ <Dialog
90
+ open={confirming}
91
+ onOpenChange={setConfirming}
92
+ tone="danger"
93
+ title="Delete this project?"
94
+ description="Every scheduled post in it is deleted with it."
95
+ footer={(close) => (
96
+ <>
97
+ <Button variant="secondary" onClick={close}>
98
+ Cancel
99
+ </Button>
100
+ <Button
101
+ variant="danger"
102
+ onClick={async () => {
103
+ await api.remove(id);
104
+ close();
105
+ toast.success('Project deleted');
106
+ }}
107
+ >
108
+ Delete project
109
+ </Button>
110
+ </>
111
+ )}
112
+ >
113
+ This cannot be undone.
114
+ </Dialog>;
115
+ ```
116
+
117
+ ## App-wide notifications
118
+
119
+ Mount `<Toaster />` once at the root; every module calls `toast()` - without the mount it no-ops.
120
+
121
+ ```tsx
122
+ import { toast, Toaster } from '@zyncat/ui/toast';
123
+
124
+ // root layout, once:
125
+ <Toaster position="bottom-right" />;
126
+
127
+ // anywhere else:
128
+ toast.promise(publish(), {
129
+ loading: 'Publishing...',
130
+ success: (r) => `Published to ${r.count} channels`,
131
+ error: (e) => `Publish failed - ${e.message}`,
132
+ });
133
+ ```
134
+
135
+ ## Detail drawer
136
+
137
+ Sheet for an edge-docked record view; you own the panel's semantics.
138
+
139
+ ```tsx
140
+ import { Sheet } from '@zyncat/ui/sheet';
141
+
142
+ <Sheet side="right" open={!!selected} onOpenChange={(o) => !o && setSelected(null)}>
143
+ <div role="dialog" aria-label="Invoice details">
144
+ {selected && <InvoiceDetails id={selected} />}
145
+ </div>
146
+ </Sheet>;
147
+ ```
148
+
149
+ ## Row actions menu
150
+
151
+ Dropdown runs commands - it never holds a value; pair it with an icon Button trigger.
152
+
153
+ ```tsx
154
+ import { Button } from '@zyncat/ui/button';
155
+ import { Dropdown } from '@zyncat/ui/dropdown';
156
+
157
+ <Dropdown
158
+ ariaLabel="Row actions"
159
+ trigger={
160
+ <Button size="icon" variant="ghost" aria-label="Actions">
161
+
162
+ </Button>
163
+ }
164
+ onSelect={(id) => run(id)}
165
+ items={[
166
+ { id: 'rename', label: 'Rename' },
167
+ { id: 'move', label: 'Move to', items: [{ id: 'drafts', label: 'Drafts' }] },
168
+ { id: 'delete', label: 'Delete', danger: true },
169
+ ]}
170
+ />;
171
+ ```
@@ -0,0 +1,83 @@
1
+ # Theming @zyncat/ui - the four override levels
2
+
3
+ Load your own stylesheet after `@zyncat/ui/styles.css`, then reach for the LOWEST level that does
4
+ the job. Never fork the source. The `get_tokens` MCP tool prints the whole vocabulary with real
5
+ values.
6
+
7
+ ## Level 0 - your plain CSS already wins
8
+
9
+ Every shipped rule lives inside `@layer zyncat.tokens` or `@layer zyncat.components`, and unlayered
10
+ CSS beats every layer however specific the layered rule is. `.btn { border-radius: 0 }` in your
11
+ sheet lands: no `!important`, no specificity ladder, no parent selector. Even `:where(.btn)` at
12
+ specificity (0,0,0) wins. Class names are BEM off a short base - `.btn`, `.btn--primary`,
13
+ `.btn__label`; `.fld`, `.fld__input`; `.dialog__body`.
14
+
15
+ ## Level 1 - retheme the whole system
16
+
17
+ Reach for `@zyncat/ui/theme` first: it is this level with types on it. `defineTheme` takes one
18
+ grouped object - `color`, `type`, `space`, `radius`, `elevation`, `motion`, `glass`, `icon`,
19
+ `layer`, `avatar`, plus `components` for scoped knobs and `custom` for anything else. Keys are the
20
+ token in camelCase (`accent`, `radiusMd`, `durationBase`), values are any CSS including `var()`
21
+ references, and a typo is a compile error. `ZyncatTheme` renders the set once at the app root; it
22
+ is a plain component with no hooks, so it server-renders and needs no build configuration.
23
+
24
+ ```tsx
25
+ import { defineTheme, ZyncatTheme } from '@zyncat/ui/theme';
26
+
27
+ const base = defineTheme({
28
+ color: { accent: 'oklch(0.58 0.19 292)', accentHover: 'oklch(0.5 0.19 292)' },
29
+ radius: { radiusMd: '0.5rem' },
30
+ components: { odometer: { accent: 'var(--warning)' } },
31
+ });
32
+ const dark = defineTheme({ color: { bgApp: 'oklch(0.19 0.008 198)', textBody: 'oklch(0.92 0.004 198)' } });
33
+
34
+ <ZyncatTheme theme={{ base, dark }} />;
35
+ ```
36
+
37
+ `base` lands on `:root`; every other key is a `[data-theme='<key>']` block, so switching themes -
38
+ globally or for one subtree - is setting that attribute. Durations you repoint keep their
39
+ reduced-motion collapse automatically.
40
+
41
+ The same tokens are writable as plain CSS: repoint them on `:root` in your own stylesheet -
42
+ `--accent` and its ramp, `--bg-*`, `--text-*`, `--border-*`, `--radius-*`, `--shadow-*`,
43
+ `--space-*`, `--size-*`, `--type-*`, `--duration-*`, `--ease-*`, `--focus-ring`. Components read
44
+ them live and the WAAPI engine reads the same DOM values, so motion retimes with the CSS. Reduced
45
+ motion is handled here - every `--duration-*` collapses to 1ms under `prefers-reduced-motion`, so
46
+ derive your own delays from a duration token, and repoint durations on `:root` rather than a
47
+ nested scope or the collapse cannot reach them.
48
+
49
+ ## Level 2 - retune one component
50
+
51
+ Expressive and compound components publish scoped `--<component>-<name>` properties as their public
52
+ contract: `--odometer-size/-accent/-gap`, `--typing-lines-caret-ink/-blink`,
53
+ `--lens-surface/-fringe-warm`, `--morphing-text-size/-smear`, `--weight-field-peak-weight/-hover-padding`,
54
+ `--flow-field-ramp-0..11`, `--confetti-paper-1..5`, `--support-rail-*`. Set them
55
+ on any ancestor or inline via `style`. The canvas simulations sample theirs at their next measure -
56
+ FlowField on resize and on a theme attribute change, Confetti on the next `fire()`.
57
+
58
+ Both reaches are typed. In a theme they are the `components` group with the prefix dropped:
59
+ `components.odometer.accent` is `--odometer-accent`. On one instance they are the component's own
60
+ `style` prop, which accepts the design tokens plus that component's knobs and nothing from another
61
+ component - `<Odometer style={{ '--odometer-size': '3rem' }} />`.
62
+
63
+ A few are per-frame state the component writes to itself, not knobs -
64
+ `--odometer-velocity/-blur`, `--lens-lift/-blur/-shadow-alpha`, `--morphing-text-heat/-letter-blur`,
65
+ `--support-rail-drag`, `--youtube-progress`.
66
+ Setting those does nothing, and they are absent from the types, so trying is a compile error.
67
+
68
+ System primitives and composites publish none by design - retheme those at level 1.
69
+
70
+ ## Level 3 - restyle one instance
71
+
72
+ Primitives and fields take `className` and `style` directly; on a field they land on the wrapper,
73
+ and `htmlProps` reaches the native `<input>`. Overlays (Dialog, Modal, Sheet, Popover, Tooltip,
74
+ Dropdown) have no `className` prop - pass `htmlProps={{ className }}` and it lands on the panel
75
+ itself. Importing `@zyncat/ui/theme` anywhere in the app types every design token in `style`, so
76
+ `style={{ '--accent': 'red' }}` completes and checks like any other property.
77
+
78
+ ## Replicas answer to none of this, on purpose
79
+
80
+ FacebookFeed, InstagramFeed, TikTok and YouTube pin platform metrics as constants; only
81
+ `--font-sans`, `--focus-ring` and the duration tokens reach them, and there are no scoped
82
+ properties to set. Fidelity is the contract. If you want a card that follows your theme, build one
83
+ from primitives instead.
@@ -1,17 +1,21 @@
1
1
  'use client';
2
2
 
3
3
  import './alert.css';
4
+
4
5
  import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';
5
- import { Presence } from '../../../motion/presence';
6
+
7
+ import type { DataAttributes } from '../../../dom-props';
6
8
  import { Motion } from '../../../motion/element';
7
9
  import { resolveMotionTiming } from '../../../motion/motion-timing';
10
+ import { Presence } from '../../../motion/presence';
11
+ import { popOut } from '../../../motion/presets';
8
12
  import type { DisableableAnimation } from '../../../motion/timing';
13
+ import { UIMotion } from '../../../tokens/motion-tokens';
14
+ import { useControllable } from '../../internal/hooks/use-controllable';
9
15
  import { Icon, type IconName } from '../../internal/icon/Icon';
10
- import { Button } from '../../primitives/button/Button';
11
16
  import { IconSlot } from '../../internal/icon/IconSlot';
12
- import { useControllable } from '../../internal/hooks/use-controllable';
13
- import type { DataAttributes } from '../../../dom-props';
14
17
  import { cx } from '../../internal/utils/cx';
18
+ import { Button } from '../../primitives/button/Button';
15
19
 
16
20
  export type AlertTone = 'info' | 'success' | 'warning' | 'danger';
17
21
 
@@ -34,7 +38,8 @@ interface AlertOwnProps {
34
38
  dismissible?: boolean;
35
39
  /** Fires on dismiss. With `open` set, the parent owns hiding the alert. */
36
40
  onDismiss?: () => void;
37
- /** Controlled visibility; omit for uncontrolled. Exit eases shut (height collapse). */
41
+ /** Controlled visibility; omit for uncontrolled. Exit scales down and fades; the slot it
42
+ * occupied is released when it unmounts, so content below moves up then rather than during. */
38
43
  open?: boolean;
39
44
  /** App-level strip: square corners, hairline below only. Paint modifier. */
40
45
  banner?: boolean;
@@ -44,8 +49,8 @@ interface AlertOwnProps {
44
49
  className?: string;
45
50
  /** Inline styles merged onto the alert. */
46
51
  style?: CSSProperties;
47
- /** Enter/exit timing - motion tokens only, or `null` to disable (the height collapse snaps).
48
- * @default height 'slow'/'entrance'; opacity in 'base'/'entrance', out 'fast'/'exit' */
52
+ /** Enter/exit timing - motion tokens only, or `null` to disable (enter and exit snap).
53
+ * @default entrance height 'slow'/'entrance' + opacity 'base'/'entrance'; exit scale + opacity 'fast'/'exit' */
49
54
  animation?: DisableableAnimation;
50
55
  }
51
56
 
@@ -104,10 +109,7 @@ export function Alert({
104
109
  { height: [0, 'auto'], timing: h.open },
105
110
  { opacity: [0, 1], timing: o.open },
106
111
  ]}
107
- exit={[
108
- { height: ['auto', 0], timing: h.close },
109
- { opacity: [1, 0], timing: o.close },
110
- ]}
112
+ exit={[popOut(UIMotion.scale.floating, o.close)]}
111
113
  >
112
114
  <div className={cls} style={style} data-tone={tone} role={TONE_ROLE[tone] || 'status'} {...htmlProps}>
113
115
  {icon === null ? null : (
@@ -0,0 +1,15 @@
1
+ # Alert - @zyncat/ui/alert
2
+
3
+ Group: overlays
4
+ Docs: https://ui.zyncat.app/alert
5
+
6
+ Persistent, in-flow status.
7
+
8
+ tone, title, children (body), action { label, onClick }, dismissible, banner, open/onDismiss
9
+ (controlled).
10
+
11
+ ```tsx
12
+ <Alert tone="warning" title="Your trial ends in 5 days" action={{ label: 'Upgrade', onClick: fn }}>
13
+ Add a plan...
14
+ </Alert>
15
+ ```