entangle-ui 0.7.0 → 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 (363) hide show
  1. package/CHANGELOG.md +180 -0
  2. package/dist/esm/assets/src/components/controls/ColorPicker/{ColorPicker.css.ts.vanilla-Do5nbdgO.css → ColorPicker.css.ts.vanilla-D7ccNVQx.css} +14 -0
  3. package/dist/esm/assets/src/components/controls/Select/{Select.css.ts.vanilla-D4C059Ua.css → Select.css.ts.vanilla-oZnFUorL.css} +11 -0
  4. package/dist/esm/assets/src/components/controls/Slider/{Slider.css.ts.vanilla-C5SJ_7A1.css → Slider.css.ts.vanilla-Cqm3fQ0S.css} +14 -0
  5. package/dist/esm/assets/src/components/controls/TreeView/{TreeNode.css.ts.vanilla-D3ylUhuW.css → TreeNode.css.ts.vanilla-B_f8pUb8.css} +5 -0
  6. package/dist/esm/assets/src/components/controls/VectorInput/{VectorInput.css.ts.vanilla-BJma3iQ4.css → VectorInput.css.ts.vanilla-BpoiuhDA.css} +9 -0
  7. package/dist/esm/assets/src/components/editor/ChatPanel/{ChatPanel.css.ts.vanilla-BI5569ZO.css → ChatPanel.css.ts.vanilla-CLn8idfz.css} +117 -133
  8. package/dist/esm/assets/src/components/editor/PropertyInspector/{PropertySection.css.ts.vanilla-DJBtY_xk.css → PropertySection.css.ts.vanilla-DK12opZc.css} +5 -0
  9. package/dist/esm/assets/src/components/editor/TransformControl/TransformControl.css.ts.vanilla-H-iW-T0s.css +82 -0
  10. package/dist/esm/assets/src/components/feedback/Alert/Alert.css.ts.vanilla-CRAI-xHx.css +84 -0
  11. package/dist/esm/assets/src/components/feedback/Dialog/{Dialog.css.ts.vanilla-BrXTOHwS.css → Dialog.css.ts.vanilla-BxBFePLG.css} +8 -0
  12. package/dist/esm/assets/src/components/feedback/ProgressBar/ProgressBar.css.ts.vanilla-4WLVf1hx.css +152 -0
  13. package/dist/esm/assets/src/components/feedback/Skeleton/Skeleton.css.ts.vanilla-Dk2_SSsC.css +39 -0
  14. package/dist/esm/assets/src/components/feedback/Toast/{ToastItem.css.ts.vanilla-D6UuPKAj.css → ToastItem.css.ts.vanilla-DUeXqiaH.css} +9 -0
  15. package/dist/esm/assets/src/components/form/{InputWrapper.css.ts.vanilla-Bl7u62PI.css → InputWrapper.css.ts.vanilla-CLpKbEjq.css} +5 -0
  16. package/dist/esm/assets/src/components/layout/Accordion/{Accordion.css.ts.vanilla-Ck5Yew0e.css → Accordion.css.ts.vanilla-CJQum8px.css} +8 -0
  17. package/dist/esm/assets/src/components/navigation/Breadcrumbs/Breadcrumbs.css.ts.vanilla-DZ4jm_bw.css +128 -0
  18. package/dist/esm/assets/src/components/navigation/SegmentedControl/SegmentedControl.css.ts.vanilla-BHOnDD2B.css +197 -0
  19. package/dist/esm/assets/src/components/navigation/Tabs/{Tabs.css.ts.vanilla-D7RGpDPC.css → Tabs.css.ts.vanilla-CQucokdg.css} +14 -0
  20. package/dist/esm/assets/src/components/primitives/Avatar/Avatar.css.ts.vanilla-jG5hUudL.css +149 -0
  21. package/dist/esm/assets/src/components/primitives/Button/{Button.css.ts.vanilla-CT592JL7.css → Button.css.ts.vanilla-DXJcIb94.css} +9 -0
  22. package/dist/esm/assets/src/components/primitives/Checkbox/{Checkbox.css.ts.vanilla-dvrGPiPs.css → Checkbox.css.ts.vanilla-DNa-Gqto.css} +5 -0
  23. package/dist/esm/assets/src/components/primitives/Collapsible/{Collapsible.css.ts.vanilla-C1rYV-JT.css → Collapsible.css.ts.vanilla-Dz4Vy-ob.css} +8 -0
  24. package/dist/esm/assets/src/components/primitives/IconButton/{IconButton.css.ts.vanilla-C-xAQoR3.css → IconButton.css.ts.vanilla-CPkPZJRU.css} +9 -0
  25. package/dist/esm/assets/src/components/primitives/Kbd/Kbd.css.ts.vanilla-Co2-Rxgv.css +60 -0
  26. package/dist/esm/assets/src/components/primitives/Link/Link.css.ts.vanilla-q-bqHUOF.css +82 -0
  27. package/dist/esm/assets/src/components/primitives/Popover/{Popover.css.ts.vanilla-DW6aAr57.css → Popover.css.ts.vanilla-KCfDIs4G.css} +5 -0
  28. package/dist/esm/assets/src/components/primitives/Radio/Radio.css.ts.vanilla-CPjdD-ZM.css +127 -0
  29. package/dist/esm/assets/src/components/primitives/Switch/{Switch.css.ts.vanilla-CxqwUToB.css → Switch.css.ts.vanilla-CDSt-M5W.css} +5 -0
  30. package/dist/esm/assets/src/components/primitives/TextArea/{TextArea.css.ts.vanilla-DTOMjGkp.css → TextArea.css.ts.vanilla-M9l1t4HR.css} +5 -0
  31. package/dist/esm/assets/src/components/primitives/VisuallyHidden/VisuallyHidden.css.ts.vanilla-DBulVh4Q.css +36 -0
  32. package/dist/esm/assets/src/theme/lightTheme.css.ts.vanilla-OaRI_wIc.css +99 -0
  33. package/dist/esm/assets/src/utils/{animations.css.ts.vanilla-DOVlpljP.css → animations.css.ts.vanilla-CRLFsBSV.css} +22 -8
  34. package/dist/esm/components/Icons/AddIcon.js +30 -0
  35. package/dist/esm/components/Icons/AddIcon.js.map +1 -0
  36. package/dist/esm/components/Icons/AiChatIcon.js +31 -0
  37. package/dist/esm/components/Icons/AiChatIcon.js.map +1 -0
  38. package/dist/esm/components/Icons/AiSparklesIcon.js +31 -0
  39. package/dist/esm/components/Icons/AiSparklesIcon.js.map +1 -0
  40. package/dist/esm/components/Icons/ArrowDownIcon.js +30 -0
  41. package/dist/esm/components/Icons/ArrowDownIcon.js.map +1 -0
  42. package/dist/esm/components/Icons/ArrowLeftIcon.js +30 -0
  43. package/dist/esm/components/Icons/ArrowLeftIcon.js.map +1 -0
  44. package/dist/esm/components/Icons/ArrowRightIcon.js +30 -0
  45. package/dist/esm/components/Icons/ArrowRightIcon.js.map +1 -0
  46. package/dist/esm/components/Icons/ArrowUpIcon.js +30 -0
  47. package/dist/esm/components/Icons/ArrowUpIcon.js.map +1 -0
  48. package/dist/esm/components/Icons/BookmarkIcon.js +30 -0
  49. package/dist/esm/components/Icons/BookmarkIcon.js.map +1 -0
  50. package/dist/esm/components/Icons/CalendarIcon.js +30 -0
  51. package/dist/esm/components/Icons/CalendarIcon.js.map +1 -0
  52. package/dist/esm/components/Icons/ClockIcon.js +30 -0
  53. package/dist/esm/components/Icons/ClockIcon.js.map +1 -0
  54. package/dist/esm/components/Icons/CodeIcon.js +30 -0
  55. package/dist/esm/components/Icons/CodeIcon.js.map +1 -0
  56. package/dist/esm/components/Icons/CopyIcon.js +30 -0
  57. package/dist/esm/components/Icons/CopyIcon.js.map +1 -0
  58. package/dist/esm/components/Icons/CutIcon.js +30 -0
  59. package/dist/esm/components/Icons/CutIcon.js.map +1 -0
  60. package/dist/esm/components/Icons/DownloadIcon.js +30 -0
  61. package/dist/esm/components/Icons/DownloadIcon.js.map +1 -0
  62. package/dist/esm/components/Icons/EditIcon.js +30 -0
  63. package/dist/esm/components/Icons/EditIcon.js.map +1 -0
  64. package/dist/esm/components/Icons/ErrorIcon.js +30 -0
  65. package/dist/esm/components/Icons/ErrorIcon.js.map +1 -0
  66. package/dist/esm/components/Icons/EyeIcon.js +30 -0
  67. package/dist/esm/components/Icons/EyeIcon.js.map +1 -0
  68. package/dist/esm/components/Icons/FilterIcon.js +30 -0
  69. package/dist/esm/components/Icons/FilterIcon.js.map +1 -0
  70. package/dist/esm/components/Icons/FolderIcon.js +30 -0
  71. package/dist/esm/components/Icons/FolderIcon.js.map +1 -0
  72. package/dist/esm/components/Icons/FullscreenIcon.js +30 -0
  73. package/dist/esm/components/Icons/FullscreenIcon.js.map +1 -0
  74. package/dist/esm/components/Icons/GridIcon.js +30 -0
  75. package/dist/esm/components/Icons/GridIcon.js.map +1 -0
  76. package/dist/esm/components/Icons/HeartIcon.js +30 -0
  77. package/dist/esm/components/Icons/HeartIcon.js.map +1 -0
  78. package/dist/esm/components/Icons/HelpIcon.js +30 -0
  79. package/dist/esm/components/Icons/HelpIcon.js.map +1 -0
  80. package/dist/esm/components/Icons/HomeIcon.js +30 -0
  81. package/dist/esm/components/Icons/HomeIcon.js.map +1 -0
  82. package/dist/esm/components/Icons/InfoIcon.js +30 -0
  83. package/dist/esm/components/Icons/InfoIcon.js.map +1 -0
  84. package/dist/esm/components/Icons/LinkIcon.js +30 -0
  85. package/dist/esm/components/Icons/LinkIcon.js.map +1 -0
  86. package/dist/esm/components/Icons/ListIcon.js +30 -0
  87. package/dist/esm/components/Icons/ListIcon.js.map +1 -0
  88. package/dist/esm/components/Icons/LockIcon.js +30 -0
  89. package/dist/esm/components/Icons/LockIcon.js.map +1 -0
  90. package/dist/esm/components/Icons/MaximizeIcon.js +30 -0
  91. package/dist/esm/components/Icons/MaximizeIcon.js.map +1 -0
  92. package/dist/esm/components/Icons/MenuIcon.js +30 -0
  93. package/dist/esm/components/Icons/MenuIcon.js.map +1 -0
  94. package/dist/esm/components/Icons/MinimizeIcon.js +30 -0
  95. package/dist/esm/components/Icons/MinimizeIcon.js.map +1 -0
  96. package/dist/esm/components/Icons/PasteIcon.js +30 -0
  97. package/dist/esm/components/Icons/PasteIcon.js.map +1 -0
  98. package/dist/esm/components/Icons/PlayIcon.js +30 -0
  99. package/dist/esm/components/Icons/PlayIcon.js.map +1 -0
  100. package/dist/esm/components/Icons/RedoIcon.js +30 -0
  101. package/dist/esm/components/Icons/RedoIcon.js.map +1 -0
  102. package/dist/esm/components/Icons/RefreshIcon.js +30 -0
  103. package/dist/esm/components/Icons/RefreshIcon.js.map +1 -0
  104. package/dist/esm/components/Icons/RobotIcon.js +30 -0
  105. package/dist/esm/components/Icons/RobotIcon.js.map +1 -0
  106. package/dist/esm/components/Icons/SaveIcon.js +30 -0
  107. package/dist/esm/components/Icons/SaveIcon.js.map +1 -0
  108. package/dist/esm/components/Icons/SearchIcon.js +30 -0
  109. package/dist/esm/components/Icons/SearchIcon.js.map +1 -0
  110. package/dist/esm/components/Icons/SettingsIcon.js +30 -0
  111. package/dist/esm/components/Icons/SettingsIcon.js.map +1 -0
  112. package/dist/esm/components/Icons/SortIcon.js +30 -0
  113. package/dist/esm/components/Icons/SortIcon.js.map +1 -0
  114. package/dist/esm/components/Icons/StarIcon.js +30 -0
  115. package/dist/esm/components/Icons/StarIcon.js.map +1 -0
  116. package/dist/esm/components/Icons/SuccessIcon.js +30 -0
  117. package/dist/esm/components/Icons/SuccessIcon.js.map +1 -0
  118. package/dist/esm/components/Icons/TagIcon.js +30 -0
  119. package/dist/esm/components/Icons/TagIcon.js.map +1 -0
  120. package/dist/esm/components/Icons/TrashIcon.js +30 -0
  121. package/dist/esm/components/Icons/TrashIcon.js.map +1 -0
  122. package/dist/esm/components/Icons/UndoIcon.js +30 -0
  123. package/dist/esm/components/Icons/UndoIcon.js.map +1 -0
  124. package/dist/esm/components/Icons/UnlockIcon.js +30 -0
  125. package/dist/esm/components/Icons/UnlockIcon.js.map +1 -0
  126. package/dist/esm/components/Icons/UploadIcon.js +30 -0
  127. package/dist/esm/components/Icons/UploadIcon.js.map +1 -0
  128. package/dist/esm/components/Icons/UserIcon.js +30 -0
  129. package/dist/esm/components/Icons/UserIcon.js.map +1 -0
  130. package/dist/esm/components/Icons/WarningIcon.js +30 -0
  131. package/dist/esm/components/Icons/WarningIcon.js.map +1 -0
  132. package/dist/esm/components/Icons/ZoomInIcon.js +30 -0
  133. package/dist/esm/components/Icons/ZoomInIcon.js.map +1 -0
  134. package/dist/esm/components/Icons/ZoomOutIcon.js +30 -0
  135. package/dist/esm/components/Icons/ZoomOutIcon.js.map +1 -0
  136. package/dist/esm/components/controls/ColorPicker/ColorPicker.css.js +1 -1
  137. package/dist/esm/components/controls/NumberInput/useNumberInput.js +2 -1
  138. package/dist/esm/components/controls/NumberInput/useNumberInput.js.map +1 -1
  139. package/dist/esm/components/controls/Select/Select.css.js +1 -1
  140. package/dist/esm/components/controls/Slider/Slider.css.js +1 -1
  141. package/dist/esm/components/controls/TreeView/TreeNode.css.js +1 -1
  142. package/dist/esm/components/controls/VectorInput/VectorInput.css.js +1 -1
  143. package/dist/esm/components/controls/VectorInput/VectorInput.js +1 -0
  144. package/dist/esm/components/controls/VectorInput/VectorInput.js.map +1 -1
  145. package/dist/esm/components/editor/ChatPanel/ChatMessage.js +4 -12
  146. package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
  147. package/dist/esm/components/editor/ChatPanel/ChatMessageList.js +4 -10
  148. package/dist/esm/components/editor/ChatPanel/ChatMessageList.js.map +1 -1
  149. package/dist/esm/components/editor/ChatPanel/ChatPanel.css.js +72 -74
  150. package/dist/esm/components/editor/ChatPanel/ChatPanel.css.js.map +1 -1
  151. package/dist/esm/components/editor/ChatPanel/useChatScroll.js +22 -28
  152. package/dist/esm/components/editor/ChatPanel/useChatScroll.js.map +1 -1
  153. package/dist/esm/components/editor/PropertyInspector/PropertySection.css.js +1 -1
  154. package/dist/esm/components/editor/TransformControl/TransformControl.css.js +11 -0
  155. package/dist/esm/components/editor/TransformControl/TransformControl.css.js.map +1 -0
  156. package/dist/esm/components/editor/TransformControl/TransformControl.js +158 -0
  157. package/dist/esm/components/editor/TransformControl/TransformControl.js.map +1 -0
  158. package/dist/esm/components/feedback/Alert/Alert.css.js +16 -0
  159. package/dist/esm/components/feedback/Alert/Alert.css.js.map +1 -0
  160. package/dist/esm/components/feedback/Alert/Alert.js +90 -0
  161. package/dist/esm/components/feedback/Alert/Alert.js.map +1 -0
  162. package/dist/esm/components/feedback/Alert/AlertActions.js +30 -0
  163. package/dist/esm/components/feedback/Alert/AlertActions.js.map +1 -0
  164. package/dist/esm/components/feedback/Alert/AlertDescription.js +28 -0
  165. package/dist/esm/components/feedback/Alert/AlertDescription.js.map +1 -0
  166. package/dist/esm/components/feedback/Alert/AlertTitle.js +28 -0
  167. package/dist/esm/components/feedback/Alert/AlertTitle.js.map +1 -0
  168. package/dist/esm/components/feedback/Dialog/Dialog.css.js +1 -1
  169. package/dist/esm/components/feedback/Dialog/Dialog.js +4 -12
  170. package/dist/esm/components/feedback/Dialog/Dialog.js.map +1 -1
  171. package/dist/esm/components/feedback/Dialog/useDialogAnimation.js +10 -3
  172. package/dist/esm/components/feedback/Dialog/useDialogAnimation.js.map +1 -1
  173. package/dist/esm/components/feedback/ProgressBar/CircularProgress.js +113 -0
  174. package/dist/esm/components/feedback/ProgressBar/CircularProgress.js.map +1 -0
  175. package/dist/esm/components/feedback/ProgressBar/ProgressBar.css.js +22 -0
  176. package/dist/esm/components/feedback/ProgressBar/ProgressBar.css.js.map +1 -0
  177. package/dist/esm/components/feedback/ProgressBar/ProgressBar.js +80 -0
  178. package/dist/esm/components/feedback/ProgressBar/ProgressBar.js.map +1 -0
  179. package/dist/esm/components/feedback/Skeleton/Skeleton.css.js +13 -0
  180. package/dist/esm/components/feedback/Skeleton/Skeleton.css.js.map +1 -0
  181. package/dist/esm/components/feedback/Skeleton/Skeleton.js +78 -0
  182. package/dist/esm/components/feedback/Skeleton/Skeleton.js.map +1 -0
  183. package/dist/esm/components/feedback/Skeleton/SkeletonGroup.js +58 -0
  184. package/dist/esm/components/feedback/Skeleton/SkeletonGroup.js.map +1 -0
  185. package/dist/esm/components/feedback/Spinner/Spinner.css.js +1 -1
  186. package/dist/esm/components/feedback/Toast/ToastItem.css.js +1 -1
  187. package/dist/esm/components/form/InputWrapper.css.js +1 -1
  188. package/dist/esm/components/layout/Accordion/Accordion.css.js +1 -1
  189. package/dist/esm/components/layout/ScrollArea/ScrollArea.js +17 -20
  190. package/dist/esm/components/layout/ScrollArea/ScrollArea.js.map +1 -1
  191. package/dist/esm/components/layout/SplitPane/SplitPane.js +2 -10
  192. package/dist/esm/components/layout/SplitPane/SplitPane.js.map +1 -1
  193. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js +49 -0
  194. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js.map +1 -0
  195. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js +89 -0
  196. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js.map +1 -0
  197. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbSeparator.js +22 -0
  198. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbSeparator.js.map +1 -0
  199. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.css.js +16 -0
  200. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.css.js.map +1 -0
  201. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js +152 -0
  202. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js.map +1 -0
  203. package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.css.js +15 -0
  204. package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.css.js.map +1 -0
  205. package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.js +240 -0
  206. package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.js.map +1 -0
  207. package/dist/esm/components/navigation/SegmentedControl/SegmentedControlItem.js +83 -0
  208. package/dist/esm/components/navigation/SegmentedControl/SegmentedControlItem.js.map +1 -0
  209. package/dist/esm/components/navigation/Tabs/Tab.js +0 -1
  210. package/dist/esm/components/navigation/Tabs/Tab.js.map +1 -1
  211. package/dist/esm/components/navigation/Tabs/Tabs.css.js +1 -1
  212. package/dist/esm/components/primitives/Avatar/Avatar.css.js +16 -0
  213. package/dist/esm/components/primitives/Avatar/Avatar.css.js.map +1 -0
  214. package/dist/esm/components/primitives/Avatar/Avatar.js +138 -0
  215. package/dist/esm/components/primitives/Avatar/Avatar.js.map +1 -0
  216. package/dist/esm/components/primitives/Avatar/AvatarGroup.js +81 -0
  217. package/dist/esm/components/primitives/Avatar/AvatarGroup.js.map +1 -0
  218. package/dist/esm/components/primitives/Button/Button.css.js +1 -1
  219. package/dist/esm/components/primitives/Checkbox/Checkbox.css.js +1 -1
  220. package/dist/esm/components/primitives/Checkbox/Checkbox.js +9 -1
  221. package/dist/esm/components/primitives/Checkbox/Checkbox.js.map +1 -1
  222. package/dist/esm/components/primitives/Collapsible/Collapsible.css.js +1 -1
  223. package/dist/esm/components/primitives/IconButton/IconButton.css.js +1 -1
  224. package/dist/esm/components/primitives/Kbd/Kbd.css.js +9 -0
  225. package/dist/esm/components/primitives/Kbd/Kbd.css.js.map +1 -0
  226. package/dist/esm/components/primitives/Kbd/Kbd.js +46 -0
  227. package/dist/esm/components/primitives/Kbd/Kbd.js.map +1 -0
  228. package/dist/esm/components/primitives/Link/Link.css.js +11 -0
  229. package/dist/esm/components/primitives/Link/Link.css.js.map +1 -0
  230. package/dist/esm/components/primitives/Link/Link.js +160 -0
  231. package/dist/esm/components/primitives/Link/Link.js.map +1 -0
  232. package/dist/esm/components/primitives/Popover/Popover.css.js +1 -1
  233. package/dist/esm/components/primitives/Radio/Radio.css.js +18 -0
  234. package/dist/esm/components/primitives/Radio/Radio.css.js.map +1 -0
  235. package/dist/esm/components/primitives/Radio/Radio.js +109 -0
  236. package/dist/esm/components/primitives/Radio/Radio.js.map +1 -0
  237. package/dist/esm/components/primitives/Radio/RadioGroup.js +82 -0
  238. package/dist/esm/components/primitives/Radio/RadioGroup.js.map +1 -0
  239. package/dist/esm/components/primitives/Switch/Switch.css.js +1 -1
  240. package/dist/esm/components/primitives/TextArea/TextArea.css.js +1 -1
  241. package/dist/esm/components/primitives/Tooltip/Tooltip.js +7 -2
  242. package/dist/esm/components/primitives/Tooltip/Tooltip.js.map +1 -1
  243. package/dist/esm/components/primitives/VisuallyHidden/VisuallyHidden.css.js +7 -0
  244. package/dist/esm/components/primitives/VisuallyHidden/VisuallyHidden.css.js.map +1 -0
  245. package/dist/esm/components/primitives/VisuallyHidden/VisuallyHidden.js +38 -0
  246. package/dist/esm/components/primitives/VisuallyHidden/VisuallyHidden.js.map +1 -0
  247. package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js +2 -10
  248. package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js.map +1 -1
  249. package/dist/esm/context/KeyboardContext.js +1 -0
  250. package/dist/esm/context/KeyboardContext.js.map +1 -1
  251. package/dist/esm/hooks/useClickOutside/useClickOutside.js +60 -0
  252. package/dist/esm/hooks/useClickOutside/useClickOutside.js.map +1 -0
  253. package/dist/esm/hooks/useClipboard/useClipboard.js +147 -0
  254. package/dist/esm/hooks/useClipboard/useClipboard.js.map +1 -0
  255. package/dist/esm/hooks/useControlledState/useControlledState.js +75 -0
  256. package/dist/esm/hooks/useControlledState/useControlledState.js.map +1 -0
  257. package/dist/esm/hooks/useDisclosure/useDisclosure.js +49 -0
  258. package/dist/esm/hooks/useDisclosure/useDisclosure.js.map +1 -0
  259. package/dist/esm/{components/feedback/Dialog → hooks/useFocusTrap}/useFocusTrap.js +7 -7
  260. package/dist/esm/hooks/useFocusTrap/useFocusTrap.js.map +1 -0
  261. package/dist/esm/hooks/useHotkey/useHotkey.js +203 -0
  262. package/dist/esm/hooks/useHotkey/useHotkey.js.map +1 -0
  263. package/dist/esm/hooks/useKeyboard/useKeyboard.js +56 -0
  264. package/dist/esm/hooks/useKeyboard/useKeyboard.js.map +1 -0
  265. package/dist/esm/hooks/useKeyboard/utils.js +56 -0
  266. package/dist/esm/hooks/useKeyboard/utils.js.map +1 -0
  267. package/dist/esm/hooks/useMergedRef/useMergedRef.js +39 -0
  268. package/dist/esm/hooks/useMergedRef/useMergedRef.js.map +1 -0
  269. package/dist/esm/hooks/useResizeObserver/useResizeObserver.js +75 -0
  270. package/dist/esm/hooks/useResizeObserver/useResizeObserver.js.map +1 -0
  271. package/dist/esm/hooks/useTheme/useTheme.js +198 -0
  272. package/dist/esm/hooks/useTheme/useTheme.js.map +1 -0
  273. package/dist/esm/index.js +40 -2
  274. package/dist/esm/index.js.map +1 -1
  275. package/dist/esm/theme/createLightTheme.js +29 -0
  276. package/dist/esm/theme/createLightTheme.js.map +1 -0
  277. package/dist/esm/theme/darkThemeValues.js +155 -0
  278. package/dist/esm/theme/darkThemeValues.js.map +1 -0
  279. package/dist/esm/theme/index.js +10 -0
  280. package/dist/esm/theme/index.js.map +1 -0
  281. package/dist/esm/theme/lightTheme.css.js +6 -0
  282. package/dist/esm/theme/lightTheme.css.js.map +1 -0
  283. package/dist/esm/theme/lightThemeValues.js +164 -0
  284. package/dist/esm/theme/lightThemeValues.js.map +1 -0
  285. package/dist/esm/theme/themeContractData.js +161 -0
  286. package/dist/esm/theme/themeContractData.js.map +1 -0
  287. package/dist/esm/theme-values.js +4 -0
  288. package/dist/esm/theme-values.js.map +1 -0
  289. package/dist/esm/utils/animations.css.js +8 -6
  290. package/dist/esm/utils/animations.css.js.map +1 -1
  291. package/dist/esm/utils/devWarn.js +36 -0
  292. package/dist/esm/utils/devWarn.js.map +1 -0
  293. package/dist/esm/utils/platform.js +91 -0
  294. package/dist/esm/utils/platform.js.map +1 -0
  295. package/dist/tokens/tokens.dark.css +98 -0
  296. package/dist/tokens/tokens.json +851 -0
  297. package/dist/tokens/tokens.light.css +98 -0
  298. package/dist/types/components/editor/TransformControl/TransformControl.d.ts +34 -0
  299. package/dist/types/components/editor/TransformControl/TransformControl.types.d.ts +153 -0
  300. package/dist/types/components/feedback/Alert/Alert.d.ts +340 -0
  301. package/dist/types/components/feedback/Alert/Alert.types.d.ts +82 -0
  302. package/dist/types/components/feedback/Alert/AlertActions.d.ts +306 -0
  303. package/dist/types/components/feedback/Alert/AlertDescription.d.ts +303 -0
  304. package/dist/types/components/feedback/Alert/AlertTitle.d.ts +303 -0
  305. package/dist/types/components/feedback/ProgressBar/CircularProgress.d.ts +313 -0
  306. package/dist/types/components/feedback/ProgressBar/ProgressBar.d.ts +315 -0
  307. package/dist/types/components/feedback/ProgressBar/ProgressBar.types.d.ts +132 -0
  308. package/dist/types/components/feedback/Skeleton/Skeleton.d.ts +312 -0
  309. package/dist/types/components/feedback/Skeleton/Skeleton.types.d.ts +82 -0
  310. package/dist/types/components/feedback/Skeleton/SkeletonGroup.d.ts +313 -0
  311. package/dist/types/components/navigation/Breadcrumbs/BreadcrumbEllipsis.d.ts +297 -0
  312. package/dist/types/components/navigation/Breadcrumbs/BreadcrumbItem.d.ts +304 -0
  313. package/dist/types/components/navigation/Breadcrumbs/BreadcrumbSeparator.d.ts +296 -0
  314. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.d.ts +311 -0
  315. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts +89 -0
  316. package/dist/types/components/navigation/SegmentedControl/SegmentedControl.d.ts +24 -0
  317. package/dist/types/components/navigation/SegmentedControl/SegmentedControl.types.d.ts +85 -0
  318. package/dist/types/components/navigation/SegmentedControl/SegmentedControlItem.d.ts +12 -0
  319. package/dist/types/components/primitives/Avatar/Avatar.d.ts +317 -0
  320. package/dist/types/components/primitives/Avatar/Avatar.types.d.ts +139 -0
  321. package/dist/types/components/primitives/Avatar/AvatarGroup.d.ts +316 -0
  322. package/dist/types/components/primitives/Button/Button.d.ts +1 -1
  323. package/dist/types/components/primitives/IconButton/IconButton.d.ts +1 -1
  324. package/dist/types/components/primitives/Kbd/Kbd.d.ts +307 -0
  325. package/dist/types/components/primitives/Kbd/Kbd.types.d.ts +49 -0
  326. package/dist/types/components/primitives/Link/Link.d.ts +20 -0
  327. package/dist/types/components/primitives/Link/Link.types.d.ts +123 -0
  328. package/dist/types/components/primitives/Radio/Radio.d.ts +319 -0
  329. package/dist/types/components/primitives/Radio/Radio.types.d.ts +155 -0
  330. package/dist/types/components/primitives/Radio/RadioGroup.d.ts +320 -0
  331. package/dist/types/components/primitives/VisuallyHidden/VisuallyHidden.d.ts +316 -0
  332. package/dist/types/components/primitives/VisuallyHidden/VisuallyHidden.types.d.ts +29 -0
  333. package/dist/types/hooks/useClickOutside/useClickOutside.d.ts +37 -0
  334. package/dist/types/hooks/useClipboard/useClipboard.d.ts +24 -0
  335. package/dist/types/hooks/useClipboard/useClipboard.types.d.ts +22 -0
  336. package/dist/types/hooks/useControlledState/useControlledState.d.ts +38 -0
  337. package/dist/types/hooks/useDisclosure/useDisclosure.d.ts +25 -0
  338. package/dist/types/hooks/useDisclosure/useDisclosure.types.d.ts +22 -0
  339. package/dist/types/hooks/useFocusTrap/useFocusTrap.d.ts +30 -0
  340. package/dist/types/hooks/useHotkey/useHotkey.d.ts +23 -0
  341. package/dist/types/hooks/useHotkey/useHotkey.types.d.ts +36 -0
  342. package/dist/types/hooks/useKeyboard/types.d.ts +14 -0
  343. package/dist/types/hooks/useKeyboard/useKeyboard.d.ts +36 -0
  344. package/dist/types/hooks/useKeyboard/utils.d.ts +6 -0
  345. package/dist/types/hooks/useMergedRef/useMergedRef.d.ts +22 -0
  346. package/dist/types/hooks/useResizeObserver/useResizeObserver.d.ts +35 -0
  347. package/dist/types/hooks/useTheme/useTheme.d.ts +48 -0
  348. package/dist/types/hooks/useTheme/useTheme.types.d.ts +60 -0
  349. package/dist/types/index.d.ts +56 -3
  350. package/dist/types/theme/contract.css.d.ts +125 -121
  351. package/dist/types/theme/createCustomTheme.d.ts +1 -1
  352. package/dist/types/theme/createLightTheme.d.ts +24 -0
  353. package/dist/types/theme/{darkTheme.css.d.ts → darkThemeValues.d.ts} +6 -2
  354. package/dist/types/theme/globalScrollbars.css.d.ts +15 -0
  355. package/dist/types/theme/index.d.ts +9 -0
  356. package/dist/types/theme/lightTheme.css.d.ts +17 -0
  357. package/dist/types/theme/lightThemeValues.d.ts +168 -0
  358. package/dist/types/theme/themeContractData.d.ts +160 -0
  359. package/dist/types/theme-values.d.ts +10 -0
  360. package/dist/types/utils/animations.css.d.ts +3 -1
  361. package/dist/types/utils/platform.d.ts +16 -0
  362. package/package.json +13 -4
  363. package/dist/esm/components/feedback/Dialog/useFocusTrap.js.map +0 -1
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import { BaseComponent } from '../../../types/common.js';
3
+ import { Prettify } from '../../../types/utilities.js';
4
+
5
+ /**
6
+ * HTML element types that VisuallyHidden can render as.
7
+ *
8
+ * Most cases use `span` (default). Use `div` when wrapping block content,
9
+ * `label` for form labels, `p` for prose.
10
+ */
11
+ type VisuallyHiddenElement = 'span' | 'div' | 'label' | 'p';
12
+ interface VisuallyHiddenBaseProps extends BaseComponent<HTMLSpanElement> {
13
+ /**
14
+ * HTML element to render as.
15
+ * @default "span"
16
+ */
17
+ as?: VisuallyHiddenElement;
18
+ /**
19
+ * When true, the element becomes visible when it (or any descendant)
20
+ * receives focus. Used for skip-to-content links.
21
+ * @default false
22
+ */
23
+ focusable?: boolean;
24
+ /** Content rendered inside the hidden region. */
25
+ children: React.ReactNode;
26
+ }
27
+ type VisuallyHiddenProps = Prettify<VisuallyHiddenBaseProps>;
28
+
29
+ export type { VisuallyHiddenBaseProps, VisuallyHiddenElement, VisuallyHiddenProps };
@@ -0,0 +1,37 @@
1
+ import { RefObject } from 'react';
2
+
3
+ interface UseClickOutsideOptions {
4
+ /**
5
+ * When false, the listener is not attached. Useful for toggling without
6
+ * unmount.
7
+ * @default true
8
+ */
9
+ enabled?: boolean;
10
+ /**
11
+ * Mouse / pointer event to listen for.
12
+ * @default 'mousedown'
13
+ */
14
+ event?: 'mousedown' | 'click' | 'pointerdown';
15
+ }
16
+ /**
17
+ * Fire a callback when a click occurs outside the referenced element(s).
18
+ *
19
+ * Accepts either a single ref or an array of refs. The handler fires only
20
+ * when the click lands outside ALL provided refs — useful for popover +
21
+ * trigger pairs where clicking either should be considered "inside".
22
+ *
23
+ * Defaults to `mousedown` so the handler runs before `click`. SSR-safe;
24
+ * cleans up on unmount and when `enabled` flips to `false`.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * const ref = useRef<HTMLDivElement>(null);
29
+ * useClickOutside(ref, () => setOpen(false), { enabled: isOpen });
30
+ *
31
+ * return <div ref={ref}>...</div>;
32
+ * ```
33
+ */
34
+ declare function useClickOutside<T extends HTMLElement = HTMLElement>(ref: RefObject<T | null> | Array<RefObject<HTMLElement | null>>, handler: (event: MouseEvent) => void, options?: UseClickOutsideOptions): void;
35
+
36
+ export { useClickOutside };
37
+ export type { UseClickOutsideOptions };
@@ -0,0 +1,24 @@
1
+ import { UseClipboardOptions, UseClipboardReturn } from './useClipboard.types.js';
2
+
3
+ /**
4
+ * Copy text to the clipboard with a built-in timeout-driven feedback state.
5
+ *
6
+ * Uses `navigator.clipboard.writeText` when available; falls back to
7
+ * `document.execCommand('copy')` only when the modern API is missing.
8
+ * In SSR or restricted contexts where neither path is available, `copy`
9
+ * resolves to `false` and `status` flips to `'error'` without throwing.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * const { copy, copied } = useClipboard({ timeout: 1500 });
14
+ *
15
+ * return (
16
+ * <Button onClick={() => copy('Hello!')}>
17
+ * {copied ? 'Copied!' : 'Copy'}
18
+ * </Button>
19
+ * );
20
+ * ```
21
+ */
22
+ declare function useClipboard(options?: UseClipboardOptions): UseClipboardReturn;
23
+
24
+ export { useClipboard };
@@ -0,0 +1,22 @@
1
+ type ClipboardStatus = 'idle' | 'copied' | 'error';
2
+ interface UseClipboardOptions {
3
+ /**
4
+ * How long the `copied` state stays before resetting to `idle`, in ms.
5
+ * @default 2000
6
+ */
7
+ timeout?: number;
8
+ }
9
+ interface UseClipboardReturn {
10
+ /** Current state — flips to 'copied' for `timeout` ms after a successful copy. */
11
+ status: ClipboardStatus;
12
+ /** Convenience boolean — `status === 'copied'`. */
13
+ copied: boolean;
14
+ /** Last error from a failed copy attempt, if any. */
15
+ error: Error | null;
16
+ /** Copy text to clipboard. Returns the resolved success boolean. */
17
+ copy: (text: string) => Promise<boolean>;
18
+ /** Manually reset status to 'idle'. */
19
+ reset: () => void;
20
+ }
21
+
22
+ export type { ClipboardStatus, UseClipboardOptions, UseClipboardReturn };
@@ -0,0 +1,38 @@
1
+ interface UseControlledStateOptions<T> {
2
+ /** Controlled value — when defined, drives the returned value. */
3
+ value?: T;
4
+ /** Default value used when the hook is uncontrolled. */
5
+ defaultValue?: T;
6
+ /** Called when the consumer requests a change in either mode. */
7
+ onChange?: (value: T) => void;
8
+ /** Fallback used when both `value` and `defaultValue` are undefined. */
9
+ fallback: T;
10
+ }
11
+ /**
12
+ * Manage a value that may be either controlled (via prop) or uncontrolled
13
+ * (managed internally with a default).
14
+ *
15
+ * Returns a `[value, setValue]` tuple just like `useState`. When
16
+ * `options.value` is defined the state is read from there and `setValue`
17
+ * becomes a pure side-effect callback that calls `onChange` only — internal
18
+ * state is never mutated. When `options.value` is undefined the hook owns the
19
+ * state and `setValue` updates it as well as calls `onChange`.
20
+ *
21
+ * Switching between controlled and uncontrolled within a component's lifetime
22
+ * is a known pitfall (matches React's own warning for `<input value/defaultValue>`).
23
+ * The hook emits a development-only warning when this happens.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * const [value, setValue] = useControlledState({
28
+ * value: props.value,
29
+ * defaultValue: props.defaultValue,
30
+ * onChange: props.onChange,
31
+ * fallback: '',
32
+ * });
33
+ * ```
34
+ */
35
+ declare function useControlledState<T>(options: UseControlledStateOptions<T>): [T, (next: T | ((prev: T) => T)) => void];
36
+
37
+ export { useControlledState };
38
+ export type { UseControlledStateOptions };
@@ -0,0 +1,25 @@
1
+ import { UseDisclosureOptions, UseDisclosureReturn } from './useDisclosure.types.js';
2
+
3
+ /**
4
+ * Manage an open/closed state with stable `open`, `close`, `toggle` callbacks.
5
+ *
6
+ * Supports both controlled (driven by an `open` prop) and uncontrolled
7
+ * (managed internally with `defaultOpen`) modes. Built on top of
8
+ * `useControlledState` so the same controlled / uncontrolled rules apply —
9
+ * including the development warning when switching modes mid-life.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * const { isOpen, open, close, toggle } = useDisclosure();
14
+ *
15
+ * return (
16
+ * <>
17
+ * <Button onClick={open}>Open</Button>
18
+ * <Dialog open={isOpen} onClose={close}>...</Dialog>
19
+ * </>
20
+ * );
21
+ * ```
22
+ */
23
+ declare function useDisclosure(options?: UseDisclosureOptions): UseDisclosureReturn;
24
+
25
+ export { useDisclosure };
@@ -0,0 +1,22 @@
1
+ interface UseDisclosureOptions {
2
+ /** Initial state for uncontrolled mode. @default false */
3
+ defaultOpen?: boolean;
4
+ /** Controlled value — when defined, drives the returned state. */
5
+ open?: boolean;
6
+ /** Called when state changes (from either controlled or uncontrolled paths). */
7
+ onOpenChange?: (open: boolean) => void;
8
+ }
9
+ interface UseDisclosureReturn {
10
+ /** Current open state. */
11
+ isOpen: boolean;
12
+ /** Set open to `true`. */
13
+ open: () => void;
14
+ /** Set open to `false`. */
15
+ close: () => void;
16
+ /** Flip current open state. */
17
+ toggle: () => void;
18
+ /** Set open to an explicit value. */
19
+ setOpen: (next: boolean) => void;
20
+ }
21
+
22
+ export type { UseDisclosureOptions, UseDisclosureReturn };
@@ -0,0 +1,30 @@
1
+ import { RefObject, KeyboardEvent } from 'react';
2
+
3
+ interface UseFocusTrapOptions {
4
+ /** Ref to the container element whose focusable descendants are trapped. */
5
+ containerRef: RefObject<HTMLElement | null>;
6
+ /**
7
+ * When false, the trap is bypassed (Tab works normally). Useful for toggling
8
+ * trap state without unmounting.
9
+ * @default true
10
+ */
11
+ enabled?: boolean;
12
+ }
13
+ /**
14
+ * Trap focus within a container element. Tab and Shift+Tab cycle through the
15
+ * focusable descendants without escaping the container.
16
+ *
17
+ * Returns a keyboard event handler to attach to the container's `onKeyDown`.
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * const ref = useRef<HTMLDivElement>(null);
22
+ * const handleKeyDown = useFocusTrap({ containerRef: ref, enabled: isOpen });
23
+ *
24
+ * return <div ref={ref} onKeyDown={handleKeyDown}>...</div>;
25
+ * ```
26
+ */
27
+ declare function useFocusTrap({ containerRef, enabled, }: UseFocusTrapOptions): (event: KeyboardEvent) => void;
28
+
29
+ export { useFocusTrap };
30
+ export type { UseFocusTrapOptions };
@@ -0,0 +1,23 @@
1
+ import { UseHotkeyOptions } from './useHotkey.types.js';
2
+
3
+ /**
4
+ * Bind a single keyboard combo to a callback.
5
+ *
6
+ * Combos use the same `+`-separated string format as `MenuBar`'s `shortcut`
7
+ * prop: `"Ctrl+S"`, `"Cmd+Shift+P"`, `"Escape"`. Modifiers: `Ctrl`, `Cmd`
8
+ * (= Meta), `Alt` / `Option`, `Shift`. `Cmd` automatically maps to `Ctrl` on
9
+ * non-Mac platforms via `getPlatform()`.
10
+ *
11
+ * The handler reference is stable — passing a fresh inline function on every
12
+ * render is safe and does not re-subscribe the underlying listener.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * useHotkey('Ctrl+S', e => save(), { preventDefault: true });
17
+ * useHotkey('Escape', () => setOpen(false));
18
+ * useHotkey('Cmd+K', () => openCommandPalette()); // Cmd on Mac, Ctrl elsewhere
19
+ * ```
20
+ */
21
+ declare function useHotkey(combo: string, handler: (event: KeyboardEvent) => void, options?: UseHotkeyOptions): void;
22
+
23
+ export { useHotkey };
@@ -0,0 +1,36 @@
1
+ import { RefObject } from 'react';
2
+
3
+ type HotkeyTarget = EventTarget | RefObject<EventTarget | null> | null;
4
+ interface UseHotkeyOptions {
5
+ /**
6
+ * When false, the binding is not active.
7
+ * @default true
8
+ */
9
+ enabled?: boolean;
10
+ /**
11
+ * Whether to fire when focus is inside an editable element
12
+ * (`<input>`, `<textarea>`, `[contenteditable]`).
13
+ * @default false
14
+ */
15
+ enableInInputs?: boolean;
16
+ /**
17
+ * Call `event.preventDefault()` before invoking the handler.
18
+ * @default true
19
+ */
20
+ preventDefault?: boolean;
21
+ /**
22
+ * Call `event.stopPropagation()` after the handler runs.
23
+ * @default false
24
+ */
25
+ stopPropagation?: boolean;
26
+ /**
27
+ * Override the target element. Accepts either an `EventTarget` directly
28
+ * (e.g. `document`, an `HTMLElement`) or a `RefObject` whose `.current`
29
+ * resolves to one. The latter form re-attaches the listener once the ref
30
+ * mounts, so passing `ref` directly works without waiting a render. Defaults
31
+ * to `window`.
32
+ */
33
+ target?: HotkeyTarget;
34
+ }
35
+
36
+ export type { HotkeyTarget, UseHotkeyOptions };
@@ -0,0 +1,14 @@
1
+ import { LiteralUnion } from '../../types/utilities.js';
2
+
3
+ type ModifierKeys = 'control' | 'shift' | 'alt' | 'meta';
4
+ type KeyCode = string;
5
+ type KeyboardModifierKeysState = {
6
+ [key in ModifierKeys]: boolean;
7
+ };
8
+ type KeyboardState = {
9
+ pressedKeys: KeyCode[];
10
+ modifiers: KeyboardModifierKeysState;
11
+ };
12
+ type AllKeys = LiteralUnion<ModifierKeys, string>;
13
+
14
+ export type { AllKeys, KeyCode, KeyboardModifierKeysState, KeyboardState, ModifierKeys };
@@ -0,0 +1,36 @@
1
+ import { KeyboardState } from './types.js';
2
+ export { AllKeys, ModifierKeys } from './types.js';
3
+
4
+ /**
5
+ * Hook for tracking keyboard state including modifier keys and pressed keys.
6
+ *
7
+ * Useful for components that need to respond to keyboard modifiers like
8
+ * Ctrl+drag for snapping, Shift+drag for precision, etc.
9
+ * @returns Current keyboard state
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * // Track all keys and modifiers
14
+ * const keyboard = useKeyboard();
15
+ *
16
+ * const handleMouseMove = (e: MouseEvent) => {
17
+ * if (keyboard.ctrl) {
18
+ * // Snap to grid
19
+ * } else if (keyboard.shift) {
20
+ * // Precision mode
21
+ * }
22
+ * };
23
+ *
24
+ * // Track only specific keys
25
+ * const keyboard = useKeyboard({
26
+ * trackAllKeys: false,
27
+ * trackedKeys: ['Space', 'Enter', 'Escape']
28
+ * });
29
+ *
30
+ * // Check if specific key is pressed
31
+ * const isSpacePressed = keyboard.pressedKeys.includes('Space');
32
+ * ```
33
+ */
34
+ declare const useKeyboard: () => KeyboardState;
35
+
36
+ export { KeyboardState, useKeyboard };
@@ -0,0 +1,6 @@
1
+ import { KeyboardState, AllKeys, ModifierKeys } from './types.js';
2
+
3
+ declare const isModifierKey: (key: string) => key is ModifierKeys;
4
+ declare const isKeyPressed: (keyboardState: KeyboardState, key: AllKeys) => boolean;
5
+
6
+ export { isKeyPressed, isModifierKey };
@@ -0,0 +1,22 @@
1
+ import { Ref, RefCallback } from 'react';
2
+
3
+ /**
4
+ * Merge multiple refs into a single callback ref. Each provided ref (object
5
+ * ref, callback ref, or `null`/`undefined`) receives the node when the merged
6
+ * ref fires.
7
+ *
8
+ * Useful when a component needs to keep an internal ref to a DOM node while
9
+ * also forwarding the same node through an externally supplied `ref` prop
10
+ * (ref-as-prop in React 19).
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * const internalRef = useRef<HTMLDivElement>(null);
15
+ * const mergedRef = useMergedRef(internalRef, props.ref);
16
+ *
17
+ * return <div ref={mergedRef} />;
18
+ * ```
19
+ */
20
+ declare function useMergedRef<T>(...refs: Array<Ref<T> | undefined | null>): RefCallback<T>;
21
+
22
+ export { useMergedRef };
@@ -0,0 +1,35 @@
1
+ import { RefObject } from 'react';
2
+
3
+ interface UseResizeObserverOptions {
4
+ /**
5
+ * When false, the observer is not attached. Toggling this from `false` to
6
+ * `true` (re-)attaches the observer; toggling back disconnects it.
7
+ * @default true
8
+ */
9
+ enabled?: boolean;
10
+ }
11
+ /**
12
+ * Observe size changes on an element. SSR-safe; cleans up on unmount.
13
+ *
14
+ * The callback is wrapped in a ref so consumers do not have to memoize it —
15
+ * the underlying observer never re-subscribes when the callback identity
16
+ * changes.
17
+ *
18
+ * The hook re-checks `ref.current` on every render so it picks up nodes that
19
+ * mount later (e.g. through conditional rendering). When the observed node
20
+ * has not changed the only cost is a single identity comparison.
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * const ref = useRef<HTMLDivElement>(null);
25
+ * useResizeObserver(ref, entry => {
26
+ * console.log(entry.contentRect.width);
27
+ * });
28
+ *
29
+ * return <div ref={ref} />;
30
+ * ```
31
+ */
32
+ declare function useResizeObserver<T extends HTMLElement>(ref: RefObject<T | null>, callback: (entry: ResizeObserverEntry) => void, options?: UseResizeObserverOptions): void;
33
+
34
+ export { useResizeObserver };
35
+ export type { UseResizeObserverOptions };
@@ -0,0 +1,48 @@
1
+ import { UseThemeReturn } from './useTheme.types.js';
2
+
3
+ /**
4
+ * Read the current theme at runtime.
5
+ *
6
+ * Returns the resolved CSS variable snapshot from `:root`, the detected
7
+ * theme variant, and helpers for reading individual tokens by path.
8
+ * Components should prefer compile-time tokens via Vanilla Extract
9
+ * (`vars.*` from `@/theme`) — reach for `useTheme` only when a runtime
10
+ * read is genuinely required (canvas drawing, third-party libraries that
11
+ * take colors as plain strings).
12
+ *
13
+ * **Scope:** the hook always reads from `:root` — both the variant and
14
+ * the resolved values come from `document.documentElement`. A light- or
15
+ * custom-themed subtree wrapped in `VanillaThemeProvider` will **not** be
16
+ * reflected here; for that, components inside the subtree should style
17
+ * via Vanilla Extract `vars.*` (which the browser resolves correctly per
18
+ * scope) rather than runtime reads.
19
+ *
20
+ * **SSR:** returns the dark-theme defaults as a fallback. The hook
21
+ * re-evaluates against the live DOM on mount via `useLayoutEffect`, so
22
+ * the second render contains the real values before the browser paints.
23
+ *
24
+ * **Reactivity:** v0.8 reads once on mount. Toggling the root theme at
25
+ * runtime is not reflected — remount the consuming subtree to pick up
26
+ * the new theme. A `MutationObserver`-based subscription may be added
27
+ * in a later release if consumer demand emerges.
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * const { values, variant, getVar, getToken } = useTheme();
32
+ *
33
+ * // Canvas drawing with theme-aware colors
34
+ * ctx.strokeStyle = values.colors.accent.primary;
35
+ *
36
+ * // Conditional logic
37
+ * if (variant === 'dark') loadDarkAssets();
38
+ *
39
+ * // Inline styles that follow theme changes automatically
40
+ * <div style={{ color: getVar('colors.text.primary') }} />
41
+ *
42
+ * // One-off token resolution
43
+ * const accent = getToken('colors.accent.primary');
44
+ * ```
45
+ */
46
+ declare function useTheme(): UseThemeReturn;
47
+
48
+ export { useTheme };
@@ -0,0 +1,60 @@
1
+ import { ThemeValues } from '../../theme/createCustomTheme.js';
2
+
3
+ /**
4
+ * Same shape as `ThemeValues` but with each leaf widened to `string`.
5
+ *
6
+ * `darkThemeValues` is declared `as const`, which makes its leaf types
7
+ * literal (e.g. `'#007acc'`). At runtime the hook reads arbitrary CSS
8
+ * custom-property strings from the DOM — those values are not constrained
9
+ * to the dark-theme literals, so the return type widens to plain strings
10
+ * to stay sound for light, custom, or computed values.
11
+ */
12
+ type ResolvedThemeValues = WidenLeaves<ThemeValues>;
13
+ type WidenLeaves<T> = T extends string ? string : T extends number ? number : {
14
+ -readonly [K in keyof T]: WidenLeaves<T[K]>;
15
+ };
16
+ /**
17
+ * Detected theme variant.
18
+ *
19
+ * Detection is **root-only**: the hook reports `'light'` only when the
20
+ * `lightThemeClass` produced by `createLightTheme()` is applied to
21
+ * `document.documentElement` — the same element the hook reads CSS
22
+ * variable values from. A light-themed subtree wrapped in
23
+ * `VanillaThemeProvider` does **not** flip this variant, because the
24
+ * resolved values would still come from the root.
25
+ *
26
+ * - `'dark'` — the default; no `lightThemeClass` on `:root`.
27
+ * - `'light'` — `lightThemeClass` is on `:root`.
28
+ * - `'custom'` — reserved. v0.8 does not auto-detect themes produced by
29
+ * `createCustomTheme(selector, overrides)`; the union member exists so
30
+ * future releases can add detection without a breaking type change.
31
+ */
32
+ type ThemeVariant = 'dark' | 'light' | 'custom';
33
+ interface UseThemeReturn {
34
+ /** Current root-theme variant. See `ThemeVariant` for detection rules. */
35
+ variant: ThemeVariant;
36
+ /** Resolved theme values — CSS variable values read from `:root`. */
37
+ values: ResolvedThemeValues;
38
+ /**
39
+ * Resolve a single token to its current CSS-var value, e.g. `'#007acc'`.
40
+ *
41
+ * Falls back to the dark-theme default when the underlying CSS variable
42
+ * is unset or when no DOM is available (SSR). Returns an empty string
43
+ * only for paths that don't resolve to a leaf in the theme contract.
44
+ * Repeated calls for the same path are cached for the life of the hook
45
+ * instance.
46
+ */
47
+ getToken: (path: string) => string;
48
+ /**
49
+ * Get the `var(--etui-...)` reference for a token, e.g.
50
+ * `'var(--etui-color-accent-primary)'`. Useful for inline styles that
51
+ * must follow theme changes automatically.
52
+ *
53
+ * SSR-safe — the returned string is constructed from the contract and
54
+ * works identically in browser and server rendering. Returns an empty
55
+ * string only for paths that don't resolve to a leaf in the contract.
56
+ */
57
+ getVar: (path: string) => string;
58
+ }
59
+
60
+ export type { ResolvedThemeValues, ThemeVariant, UseThemeReturn };