@koide-labs/ui 0.0.0 → 0.0.2

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 (383) hide show
  1. package/README.md +53 -3
  2. package/{src/-types.ts → dist/-types.d.ts} +1 -6
  3. package/dist/-types.js +1 -0
  4. package/dist/-utils.d.ts +19 -0
  5. package/dist/-utils.js +33 -0
  6. package/dist/Button-DrPFFzo7.js +31 -0
  7. package/dist/CompositeRoot-CVk5a-pR.js +233 -0
  8. package/dist/DirectionContext-C2o_MF_i.js +9 -0
  9. package/dist/FieldItemContext-DAvk99to.js +11 -0
  10. package/dist/FloatingPortal-tWyuKRSN.js +435 -0
  11. package/dist/FloatingPortalLite-DVyq6YhV.js +28 -0
  12. package/dist/InternalBackdrop-jYAiOJ8v.js +574 -0
  13. package/dist/LabelableContext-BMvjVwor.js +169 -0
  14. package/dist/ToolbarRootContext-CvvL0Tk1.js +9 -0
  15. package/dist/clamp-D0KDAQIz.js +6 -0
  16. package/dist/clsx-OuTLNxxd.js +16 -0
  17. package/dist/components/accordion/index.d.ts +12 -0
  18. package/dist/components/accordion/index.js +699 -0
  19. package/dist/components/alert-dialog/index.d.ts +26 -0
  20. package/dist/components/alert-dialog/index.js +136 -0
  21. package/dist/components/anchor/index.d.ts +8 -0
  22. package/dist/components/anchor/index.js +38 -0
  23. package/dist/components/avatar/index.d.ts +21 -0
  24. package/dist/components/avatar/index.js +161 -0
  25. package/dist/components/badge/index.d.ts +16 -0
  26. package/dist/components/badge/index.js +40 -0
  27. package/dist/components/button/index.d.ts +24 -0
  28. package/dist/components/button/index.js +47 -0
  29. package/dist/components/checkbox/index.d.ts +9 -0
  30. package/dist/components/checkbox/index.js +269 -0
  31. package/dist/components/code/index.d.ts +9 -0
  32. package/dist/components/code/index.js +10 -0
  33. package/dist/components/collapse/index.d.ts +11 -0
  34. package/dist/components/collapse/index.js +41 -0
  35. package/dist/components/command/index.d.ts +14 -0
  36. package/dist/components/command/index.js +1695 -0
  37. package/dist/components/context-menu/index.d.ts +42 -0
  38. package/dist/components/context-menu/index.js +1444 -0
  39. package/dist/components/dialog/index.d.ts +48 -0
  40. package/dist/components/dialog/index.js +138 -0
  41. package/dist/components/heading/index.d.ts +44 -0
  42. package/dist/components/heading/index.js +56 -0
  43. package/dist/components/icon/icon-names.d.ts +1 -0
  44. package/dist/components/icon/icon-names.js +1 -0
  45. package/dist/components/icon/index.d.ts +24 -0
  46. package/dist/components/icon/index.js +43 -0
  47. package/dist/components/icon-button/index.d.ts +12 -0
  48. package/dist/components/icon-button/index.js +45 -0
  49. package/dist/components/inline-code/index.d.ts +6 -0
  50. package/dist/components/inline-code/index.js +22 -0
  51. package/dist/components/input/index.d.ts +3 -0
  52. package/dist/components/input/index.js +119 -0
  53. package/dist/components/meter/index.d.ts +18 -0
  54. package/dist/components/meter/index.js +165 -0
  55. package/dist/components/multiline-input/index.d.ts +6 -0
  56. package/dist/components/multiline-input/index.js +100 -0
  57. package/dist/components/number-input/index.d.ts +10 -0
  58. package/dist/components/number-input/index.js +1169 -0
  59. package/dist/components/password-input/index.d.ts +2 -0
  60. package/dist/components/password-input/index.js +29 -0
  61. package/dist/components/pill/index.d.ts +13 -0
  62. package/dist/components/pill/index.js +38 -0
  63. package/dist/components/popover/index.d.ts +21 -0
  64. package/dist/components/popover/index.js +636 -0
  65. package/dist/components/preview-card/index.d.ts +17 -0
  66. package/dist/components/preview-card/index.js +402 -0
  67. package/dist/components/radio/index.d.ts +13 -0
  68. package/dist/components/radio/index.js +404 -0
  69. package/dist/components/search-bar/index.d.ts +12 -0
  70. package/dist/components/search-bar/index.js +48 -0
  71. package/dist/components/select/index.d.ts +16 -0
  72. package/dist/components/select/index.js +1263 -0
  73. package/dist/components/separator/index.d.ts +7 -0
  74. package/dist/components/separator/index.js +6 -0
  75. package/dist/components/slider/index.d.ts +5 -0
  76. package/dist/components/slider/index.js +902 -0
  77. package/dist/components/spinner/index.d.ts +2 -0
  78. package/dist/components/spinner/index.js +13 -0
  79. package/dist/components/stacked-avatars/index.d.ts +14 -0
  80. package/dist/components/stacked-avatars/index.js +92 -0
  81. package/dist/components/status-banner/index.d.ts +17 -0
  82. package/dist/components/status-banner/index.js +69 -0
  83. package/dist/components/surface/index.d.ts +27 -0
  84. package/dist/components/surface/index.js +41 -0
  85. package/dist/components/switch/index.d.ts +5 -0
  86. package/dist/components/switch/index.js +196 -0
  87. package/dist/components/tabs/index.d.ts +18 -0
  88. package/dist/components/tabs/index.js +509 -0
  89. package/dist/components/text/index.d.ts +26 -0
  90. package/dist/components/text/index.js +51 -0
  91. package/dist/components/theme-provider/index.d.ts +2 -0
  92. package/dist/components/theme-provider/index.js +6 -0
  93. package/dist/components/theme-provider/theme-context.d.ts +9 -0
  94. package/dist/components/theme-provider/theme-context.js +13 -0
  95. package/dist/components/theme-provider/theme-provider.d.ts +17 -0
  96. package/dist/components/theme-provider/theme-provider.js +30 -0
  97. package/dist/components/timestamp/index.d.ts +23 -0
  98. package/dist/components/timestamp/index.js +1392 -0
  99. package/dist/components/toast/index.d.ts +2 -0
  100. package/dist/components/toast/index.js +7 -0
  101. package/dist/components/toast/toast.d.ts +2 -0
  102. package/dist/components/toast/toast.js +878 -0
  103. package/dist/components/toast/use-toast-manager.d.ts +27 -0
  104. package/dist/components/toast/use-toast-manager.js +4 -0
  105. package/dist/components/tooltip/index.d.ts +14 -0
  106. package/dist/components/tooltip/index.js +712 -0
  107. package/dist/components/tooltip/tooltip-arrow.d.ts +3 -0
  108. package/dist/components/tooltip/tooltip-arrow.js +6 -0
  109. package/dist/components/view/index.d.ts +30 -0
  110. package/dist/components/view/index.js +84 -0
  111. package/dist/components/visually-hidden/index.d.ts +1 -0
  112. package/dist/components/visually-hidden/index.js +4 -0
  113. package/dist/composite-Bx7Szd_T.js +208 -0
  114. package/dist/composite-C9L5QmZL.js +66 -0
  115. package/dist/createBaseUIEventDetails-D8M2Yl-a.js +59 -0
  116. package/dist/detectBrowser-I-s3yzIE.js +43 -0
  117. package/dist/dialog.css +1 -0
  118. package/dist/dialog.module-BeF-6XAo.js +415 -0
  119. package/dist/element-CZEOj04G.js +80 -0
  120. package/dist/event-CKoGyQEJ.js +30 -0
  121. package/dist/floating-ui.utils-C7pRWMZ_.js +128 -0
  122. package/dist/floating-ui.utils.dom-C7FS5id0.js +135 -0
  123. package/dist/formatErrorMessage-BqPuTBN-.js +7 -0
  124. package/dist/formatNumber-1UNwjeqf.js +25 -0
  125. package/dist/getDisabledMountTransitionStyles-YfHPge6T.js +1510 -0
  126. package/dist/index-BX1XbbRk.js +1206 -0
  127. package/dist/index-CeuccO-T.js +109 -0
  128. package/dist/index-DN9Bn1qm.js +29 -0
  129. package/dist/index-FMoPxlJ2.js +52 -0
  130. package/dist/index.css +1 -0
  131. package/dist/index.d.ts +42 -0
  132. package/dist/index.js +108 -0
  133. package/dist/index10.css +1 -0
  134. package/dist/index11.css +1 -0
  135. package/dist/index12.css +1 -0
  136. package/dist/index13.css +1 -0
  137. package/dist/index14.css +1 -0
  138. package/dist/index15.css +1 -0
  139. package/dist/index16.css +1 -0
  140. package/dist/index17.css +1 -0
  141. package/dist/index18.css +1 -0
  142. package/dist/index19.css +1 -0
  143. package/dist/index2.css +1 -0
  144. package/dist/index20.css +1 -0
  145. package/dist/index21.css +1 -0
  146. package/dist/index22.css +1 -0
  147. package/dist/index23.css +1 -0
  148. package/dist/index24.css +1 -0
  149. package/dist/index25.css +1 -0
  150. package/dist/index26.css +1 -0
  151. package/dist/index27.css +1 -0
  152. package/dist/index28.css +1 -0
  153. package/dist/index29.css +1 -0
  154. package/dist/index3.css +1 -0
  155. package/dist/index30.css +1 -0
  156. package/dist/index31.css +1 -0
  157. package/dist/index32.css +1 -0
  158. package/dist/index33.css +1 -0
  159. package/dist/index34.css +1 -0
  160. package/dist/index35.css +1 -0
  161. package/dist/index36.css +1 -0
  162. package/dist/index37.css +1 -0
  163. package/dist/index4.css +1 -0
  164. package/dist/index5.css +1 -0
  165. package/dist/index6.css +1 -0
  166. package/dist/index7.css +1 -0
  167. package/dist/index8.css +1 -0
  168. package/dist/index9.css +1 -0
  169. package/dist/inertValue-BCYGsdmf.js +7 -0
  170. package/dist/input.css +1 -0
  171. package/dist/input.module-DDQY_Ij6.js +7 -0
  172. package/dist/integrations/react-markdown/index.d.ts +5 -0
  173. package/dist/integrations/react-markdown/index.js +6895 -0
  174. package/dist/integrations/remix/index.d.ts +9 -0
  175. package/{src/integrations/remix.ts → dist/integrations/remix/index.js} +7 -4
  176. package/dist/integrations/tailwind.css +1 -0
  177. package/dist/integrations/twemoij/index.d.ts +3 -0
  178. package/dist/integrations/twemoij/index.js +18 -0
  179. package/dist/isElementDisabled-Cbd8W9kH.js +6 -0
  180. package/dist/owner-rKN292Q9.js +6 -0
  181. package/dist/safePolygon-DWy1dGKJ.js +308 -0
  182. package/dist/styles/core.css +1 -0
  183. package/dist/styles/tokens.d.ts +400 -0
  184. package/{src/styles/tokens.ts → dist/styles/tokens.js} +54 -96
  185. package/dist/toast.css +1 -0
  186. package/dist/tooltip-arrow-C1qXdi5T.js +24 -0
  187. package/dist/tooltip-arrow.css +1 -0
  188. package/dist/transitions.css +1 -0
  189. package/dist/transitions.module-CWX8e5cx.js +1343 -0
  190. package/dist/use-toast-manager-Dq-44AuW.js +37 -0
  191. package/dist/useAnimationFrame-451ugS_6.js +68 -0
  192. package/dist/useBaseUiId-B7WyxtIE.js +7 -0
  193. package/dist/useButton-DfIwsdb8.js +127 -0
  194. package/dist/useCompositeListItem-OkcAim_1.js +148 -0
  195. package/dist/useControlled-Du4sJyMj.js +31 -0
  196. package/dist/useHoverReferenceInteraction-SfOBPoXM.js +264 -0
  197. package/dist/useId-C5kyn6tA.js +22 -0
  198. package/dist/useIsoLayoutEffect-CIDbvm3Q.js +6 -0
  199. package/dist/useLabelableId-Ci_jDvmv.js +29 -0
  200. package/dist/useOnMount-VRW6CK2u.js +8 -0
  201. package/dist/useOpenChangeComplete-Dse9kY9E.js +61 -0
  202. package/dist/usePopupAutoResize-CNR6Ekmx.js +85 -0
  203. package/dist/useRender-CLx7dR_1.js +7 -0
  204. package/dist/useRenderElement-DwToLA61.js +244 -0
  205. package/dist/useRole-oDBdbuwQ.js +77 -0
  206. package/dist/useStableCallback-CkTrVkNX.js +29 -0
  207. package/dist/useSyncedFloatingRootContext-Dorsv-jf.js +167 -0
  208. package/dist/useTimeout-CflX-kz3.js +32 -0
  209. package/dist/useTransitionStatus-CUfcuGAV.js +42 -0
  210. package/dist/useTypeahead-D85V2IUx.js +333 -0
  211. package/dist/useValueAsRef-HURLzret.js +19 -0
  212. package/dist/useValueChanged-DL757-yD.js +14 -0
  213. package/dist/valueToPercent-DaP9qN4u.js +6 -0
  214. package/dist/view.css +1 -0
  215. package/dist/view.module-DfDLgJE0.js +6 -0
  216. package/dist/visuallyHidden-CpJ-mhai.js +16 -0
  217. package/dist/warn-CKtX8MLJ.js +11 -0
  218. package/package.json +18 -2
  219. package/.husky/pre-commit +0 -1
  220. package/.storybook/main.ts +0 -25
  221. package/.storybook/preview-head.html +0 -6
  222. package/.storybook/preview.tsx +0 -48
  223. package/.storybook/vitest.setup.ts +0 -8
  224. package/eslint.config.mjs +0 -29
  225. package/lint-staged.config.js +0 -15
  226. package/pnpm-workspace.yaml +0 -2
  227. package/postcss.config.mjs +0 -7
  228. package/prettier.config.mjs +0 -24
  229. package/scripts/build-icon-types.ts +0 -38
  230. package/src/-utils.tsx +0 -64
  231. package/src/components/accordion/accordion.module.css +0 -44
  232. package/src/components/accordion/accordion.stories.tsx +0 -36
  233. package/src/components/accordion/index.tsx +0 -67
  234. package/src/components/alert-dialog/alert-dialog.module.css +0 -5
  235. package/src/components/alert-dialog/alert-dialog.stories.tsx +0 -53
  236. package/src/components/alert-dialog/index.tsx +0 -138
  237. package/src/components/anchor/anchor.module.css +0 -18
  238. package/src/components/anchor/anchor.stories.tsx +0 -28
  239. package/src/components/anchor/index.tsx +0 -45
  240. package/src/components/avatar/avatar.module.css +0 -56
  241. package/src/components/avatar/avatar.stories.tsx +0 -61
  242. package/src/components/avatar/index.tsx +0 -82
  243. package/src/components/badge/badge.module.css +0 -35
  244. package/src/components/badge/badge.stories.tsx +0 -60
  245. package/src/components/badge/index.tsx +0 -71
  246. package/src/components/button/button.module.css +0 -42
  247. package/src/components/button/button.stories.tsx +0 -108
  248. package/src/components/button/index.tsx +0 -63
  249. package/src/components/checkbox/checkbox.module.css +0 -36
  250. package/src/components/checkbox/checkbox.stories.tsx +0 -21
  251. package/src/components/checkbox/index.tsx +0 -41
  252. package/src/components/code/code.module.css +0 -20
  253. package/src/components/code/code.stories.tsx +0 -42
  254. package/src/components/code/index.tsx +0 -73
  255. package/src/components/collapse/collapse.module.css +0 -27
  256. package/src/components/collapse/collapse.stories.tsx +0 -27
  257. package/src/components/collapse/index.tsx +0 -59
  258. package/src/components/command/command.module.css +0 -95
  259. package/src/components/command/command.stories.tsx +0 -38
  260. package/src/components/command/index.tsx +0 -108
  261. package/src/components/context-menu/context-menu.module.css +0 -36
  262. package/src/components/context-menu/context-menu.stories.tsx +0 -99
  263. package/src/components/context-menu/index.tsx +0 -242
  264. package/src/components/dialog/dialog.module.css +0 -71
  265. package/src/components/dialog/dialog.stories.tsx +0 -29
  266. package/src/components/dialog/index.tsx +0 -148
  267. package/src/components/heading/heading.module.css +0 -3
  268. package/src/components/heading/heading.stories.tsx +0 -52
  269. package/src/components/heading/index.tsx +0 -112
  270. package/src/components/icon/icon-names.ts +0 -3189
  271. package/src/components/icon/icon.module.css +0 -36
  272. package/src/components/icon/icon.stories.tsx +0 -40
  273. package/src/components/icon/index.tsx +0 -60
  274. package/src/components/icon-button/icon-button.module.css +0 -33
  275. package/src/components/icon-button/icon-button.stories.tsx +0 -59
  276. package/src/components/icon-button/index.tsx +0 -48
  277. package/src/components/inline-code/index.tsx +0 -29
  278. package/src/components/inline-code/inline-code.module.css +0 -13
  279. package/src/components/inline-code/inline-code.stories.tsx +0 -31
  280. package/src/components/input/index.tsx +0 -22
  281. package/src/components/input/input.module.css +0 -23
  282. package/src/components/input/input.stories.tsx +0 -52
  283. package/src/components/meter/index.tsx +0 -55
  284. package/src/components/meter/meter.module.css +0 -23
  285. package/src/components/meter/meter.stories.tsx +0 -31
  286. package/src/components/multiline-input/index.tsx +0 -58
  287. package/src/components/multiline-input/multiline-input.stories.tsx +0 -26
  288. package/src/components/number-input/index.tsx +0 -74
  289. package/src/components/number-input/number-input.module.css +0 -41
  290. package/src/components/number-input/number-input.stories.tsx +0 -24
  291. package/src/components/password-input/index.tsx +0 -24
  292. package/src/components/password-input/password-input.module.css +0 -10
  293. package/src/components/password-input/password-input.stories.tsx +0 -24
  294. package/src/components/pill/index.tsx +0 -45
  295. package/src/components/pill/pill.module.css +0 -22
  296. package/src/components/pill/pill.stories.tsx +0 -83
  297. package/src/components/popover/index.tsx +0 -94
  298. package/src/components/popover/popover.module.css +0 -8
  299. package/src/components/popover/popover.stories.tsx +0 -53
  300. package/src/components/preview-card/index.tsx +0 -68
  301. package/src/components/preview-card/preview-card.module.css +0 -5
  302. package/src/components/preview-card/preview-card.stories.tsx +0 -58
  303. package/src/components/radio/index.tsx +0 -67
  304. package/src/components/radio/radio-group.module.css +0 -5
  305. package/src/components/radio/radio.module.css +0 -36
  306. package/src/components/radio/radio.stories.tsx +0 -27
  307. package/src/components/search-bar/index.tsx +0 -60
  308. package/src/components/search-bar/search-bar.module.css +0 -29
  309. package/src/components/search-bar/search-bar.stories.tsx +0 -37
  310. package/src/components/select/index.tsx +0 -132
  311. package/src/components/select/select.module.css +0 -63
  312. package/src/components/select/select.stories.tsx +0 -49
  313. package/src/components/separator/index.tsx +0 -28
  314. package/src/components/separator/separator.module.css +0 -24
  315. package/src/components/separator/separator.stories.tsx +0 -40
  316. package/src/components/slider/index.tsx +0 -28
  317. package/src/components/slider/slider.module.css +0 -52
  318. package/src/components/slider/slider.stories.tsx +0 -53
  319. package/src/components/spinner/index.tsx +0 -14
  320. package/src/components/spinner/spinner.module.css +0 -13
  321. package/src/components/spinner/spinner.stories.tsx +0 -17
  322. package/src/components/stacked-avatars/index.tsx +0 -88
  323. package/src/components/stacked-avatars/stacked-avatars.module.css +0 -79
  324. package/src/components/stacked-avatars/stacked-avatars.stories.tsx +0 -48
  325. package/src/components/status-banner/index.tsx +0 -96
  326. package/src/components/status-banner/status-banner.module.css +0 -52
  327. package/src/components/status-banner/status-banner.stories.tsx +0 -44
  328. package/src/components/surface/index.tsx +0 -83
  329. package/src/components/surface/surface.module.css +0 -35
  330. package/src/components/surface/surface.stories.tsx +0 -84
  331. package/src/components/switch/index.tsx +0 -23
  332. package/src/components/switch/switch.module.css +0 -45
  333. package/src/components/switch/switch.stories.tsx +0 -48
  334. package/src/components/tabs/index.tsx +0 -126
  335. package/src/components/tabs/tabs.module.css +0 -134
  336. package/src/components/tabs/tabs.stories.tsx +0 -88
  337. package/src/components/text/index.tsx +0 -69
  338. package/src/components/text/text.module.css +0 -76
  339. package/src/components/text/text.stories.tsx +0 -107
  340. package/src/components/theme-provider/index.ts +0 -2
  341. package/src/components/theme-provider/theme-context.tsx +0 -18
  342. package/src/components/theme-provider/theme-provider.stories.tsx +0 -47
  343. package/src/components/theme-provider/theme-provider.tsx +0 -77
  344. package/src/components/timestamp/index.tsx +0 -131
  345. package/src/components/timestamp/timestamp.module.css +0 -8
  346. package/src/components/timestamp/timestamp.stories.tsx +0 -37
  347. package/src/components/toast/index.ts +0 -2
  348. package/src/components/toast/toast.module.css +0 -163
  349. package/src/components/toast/toast.stories.tsx +0 -53
  350. package/src/components/toast/toast.tsx +0 -104
  351. package/src/components/toast/use-toast-manager.ts +0 -63
  352. package/src/components/tooltip/index.tsx +0 -61
  353. package/src/components/tooltip/tooltip-arrow.tsx +0 -17
  354. package/src/components/tooltip/tooltip.module.css +0 -44
  355. package/src/components/tooltip/tooltip.stories.tsx +0 -76
  356. package/src/components/view/index.tsx +0 -137
  357. package/src/components/view/view.module.css +0 -11
  358. package/src/components/view/view.stories.tsx +0 -131
  359. package/src/components/view/view_colorway.module.css +0 -280
  360. package/src/components/view/view_interactive.module.css +0 -127
  361. package/src/components/view/view_loading.module.css +0 -58
  362. package/src/components/visually-hidden/index.ts +0 -1
  363. package/src/index.ts +0 -49
  364. package/src/integrations/react-markdown/index.tsx +0 -134
  365. package/src/integrations/react-markdown/react-markdown.module.css +0 -62
  366. package/src/integrations/react-markdown/react-markdown.stories.tsx +0 -31
  367. package/src/integrations/tailwind.css +0 -173
  368. package/src/integrations/twemoij/index.tsx +0 -13
  369. package/src/integrations/twemoij/twemoji.module.css +0 -7
  370. package/src/integrations/twemoij/twemoji.stories.tsx +0 -40
  371. package/src/stories/components/all-variants.tsx +0 -40
  372. package/src/stories/data.ts +0 -72
  373. package/src/stories/utils.ts +0 -20
  374. package/src/styles/core.css +0 -153
  375. package/src/styles/themes/dark.css +0 -86
  376. package/src/styles/themes/light.css +0 -86
  377. package/src/styles/transitions.module.css +0 -31
  378. package/stylelint.config.mjs +0 -29
  379. package/tsconfig.app.json +0 -35
  380. package/tsconfig.json +0 -7
  381. package/tsconfig.node.json +0 -26
  382. package/vite.config.ts +0 -103
  383. package/vitest.shims.d.ts +0 -1
@@ -1,104 +0,0 @@
1
- import { Toast as ToastPrimitive } from "@base-ui/react/toast";
2
- import clsx from "clsx";
3
-
4
- import { Button } from "../button";
5
- import { Heading } from "../heading";
6
- import { IconButton } from "../icon-button";
7
- import { Surface } from "../surface";
8
- import { Text } from "../text";
9
- import { View, type Color } from "../view";
10
- import { useToastManager } from "./use-toast-manager";
11
-
12
- import styles from "./toast.module.css";
13
-
14
- export const ToastProvider = ToastPrimitive.Provider;
15
-
16
- const toastTypeColor: Record<string, Color> = {
17
- info: "blue",
18
- error: "red",
19
- warning: "yellow",
20
- success: "green",
21
- };
22
-
23
- export function ToastViewport() {
24
- return (
25
- <ToastPrimitive.Portal>
26
- <ToastPrimitive.Viewport className={styles["toast__viewport"]}>
27
- <ToastList />
28
- </ToastPrimitive.Viewport>
29
- </ToastPrimitive.Portal>
30
- );
31
- }
32
-
33
- // TODO we're not using the toast primitives here...
34
- // TODO specify toast background in viewport?
35
-
36
- function ToastList() {
37
- const toastManager = useToastManager();
38
- return toastManager.toasts.map((toast) => {
39
- const color =
40
- toast.type && toast.type in toastTypeColor
41
- ? toastTypeColor[toast.type]
42
- : undefined;
43
-
44
- return (
45
- <ToastPrimitive.Root
46
- key={toast.id}
47
- toast={toast}
48
- className={clsx(
49
- styles["toast"],
50
- color
51
- ? styles[`toast_variant_colorway`]
52
- : styles["toast_variant_neutral"],
53
- )}
54
- render={<Surface background="default" color={color} />}
55
- >
56
- <View
57
- render={<ToastPrimitive.Content />}
58
- className={styles["toast__content"]}
59
- >
60
- <View className={styles["toast__row"]}>
61
- <View className={styles["toast__header"]}>
62
- {toast.title ? (
63
- <Heading
64
- level={2}
65
- size="lg"
66
- color="inherit"
67
- className={styles["toast__title"]}
68
- >
69
- {toast.title}
70
- </Heading>
71
- ) : null}
72
-
73
- <ToastPrimitive.Description
74
- render={<Text multiline color={color ? "inherit" : "dimmer"} />}
75
- className={styles["toast__description"]}
76
- />
77
- </View>
78
-
79
- {/* close icon will appear over content UNLESS we disable aboslute positioning */}
80
- <ToastPrimitive.Close
81
- render={
82
- <IconButton
83
- className={toast.title ? styles["toast__close"] : undefined}
84
- interactive={color ? `${color}_no-fill` : "no-fill"}
85
- icon="close-line"
86
- size="sm"
87
- alt="Close"
88
- />
89
- }
90
- />
91
- </View>
92
- {toast.action ? (
93
- <Button
94
- {...toast.action}
95
- interactive={color ? `${color}_fill` : true}
96
- >
97
- {toast.action.children}
98
- </Button>
99
- ) : null}
100
- </View>
101
- </ToastPrimitive.Root>
102
- );
103
- });
104
- }
@@ -1,63 +0,0 @@
1
- import {
2
- Toast,
3
- type ToastManagerAddOptions,
4
- type UseToastManagerReturnValue,
5
- } from "@base-ui/react/toast";
6
-
7
- import type { Override } from "~/-types";
8
-
9
- import type { ButtonProps } from "../button";
10
-
11
- /**
12
- * A whole lot of useless effort
13
- * Basically I want "actionProps" to be "action"
14
- * And I want "action" to use ButtonProps with text
15
- */
16
-
17
- type ActionProps = {
18
- type?: "info" | "error" | "warning" | "success" | (string & {});
19
- action?: ButtonProps;
20
- };
21
-
22
- type FrameworkAddOptions<Data extends object> = Omit<
23
- ToastManagerAddOptions<Data>,
24
- "actionProps"
25
- > &
26
- ActionProps;
27
-
28
- type FrameworkUpdateOptions<Data extends object> = Partial<
29
- FrameworkAddOptions<Data>
30
- >;
31
-
32
- type FrameworkPromiseOptions<Value, Data extends object> = {
33
- loading: string | FrameworkUpdateOptions<Data>;
34
- success:
35
- | string
36
- | FrameworkUpdateOptions<Data>
37
- | ((result: Value) => string | FrameworkUpdateOptions<Data>);
38
- error:
39
- | string
40
- | FrameworkUpdateOptions<Data>
41
- | ((error: unknown) => string | FrameworkUpdateOptions<Data>);
42
- };
43
-
44
- type FrameworkToastManager = Override<
45
- UseToastManagerReturnValue,
46
- {
47
- toasts: Array<UseToastManagerReturnValue["toasts"][number] & ActionProps>;
48
- add<Data extends object>(options: FrameworkAddOptions<Data>): string;
49
- update<Data extends object>(
50
- id: string,
51
- updates: FrameworkUpdateOptions<Data>,
52
- ): void;
53
- promise<Value, Data extends object>(
54
- promise: Promise<Value>,
55
- options: FrameworkPromiseOptions<Value, Data>,
56
- ): Promise<Value>;
57
- }
58
- >;
59
-
60
- export function useToastManager() {
61
- const toastManager = Toast.useToastManager();
62
- return toastManager as unknown as FrameworkToastManager;
63
- }
@@ -1,61 +0,0 @@
1
- import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
2
- import clsx from "clsx";
3
- import type { ReactElement, ReactNode } from "react";
4
-
5
- import { textify } from "~/-utils";
6
-
7
- import { Surface } from "../surface";
8
- import { TooltipArrow } from "./tooltip-arrow";
9
-
10
- import transitionStyles from "../../styles/transitions.module.css";
11
- import styles from "./tooltip.module.css";
12
-
13
- export const TooltipProvider = TooltipPrimitive.Provider;
14
-
15
- type TooltipRootProps = Omit<TooltipPrimitive.Root.Props, "children">;
16
- type TooltipPositionerProps = Pick<
17
- TooltipPrimitive.Positioner.Props,
18
- "align" | "side"
19
- >;
20
- export type TooltipProps = TooltipRootProps &
21
- TooltipPositionerProps & {
22
- children?: ReactNode;
23
-
24
- /** Specify trigger to open tooltip. */
25
- trigger?: ReactElement;
26
-
27
- /** Apply className to tooltip content */
28
- className?: string;
29
- };
30
-
31
- export function Tooltip({
32
- children,
33
- trigger,
34
- align,
35
- side,
36
- className,
37
- ...props
38
- }: TooltipProps) {
39
- return (
40
- <TooltipPrimitive.Root {...props}>
41
- {trigger ? <TooltipPrimitive.Trigger render={trigger} /> : null}
42
- <TooltipPrimitive.Portal>
43
- <TooltipPrimitive.Positioner align={align} side={side} sideOffset={8}>
44
- <TooltipPrimitive.Popup
45
- render={<Surface background="highest" />}
46
- className={clsx(
47
- styles["tooltip"],
48
- transitionStyles["transition_scale"],
49
- className,
50
- )}
51
- >
52
- <TooltipPrimitive.Arrow className={styles["tooltip__arrow"]}>
53
- <TooltipArrow />
54
- </TooltipPrimitive.Arrow>
55
- {textify(children)}
56
- </TooltipPrimitive.Popup>
57
- </TooltipPrimitive.Positioner>
58
- </TooltipPrimitive.Portal>
59
- </TooltipPrimitive.Root>
60
- );
61
- }
@@ -1,17 +0,0 @@
1
- import clsx from "clsx";
2
-
3
- import styles from "./tooltip.module.css";
4
-
5
- export function TooltipArrow(props: { className?: string }) {
6
- return (
7
- <svg
8
- width="10"
9
- height="5"
10
- viewBox="0 0 30 10"
11
- preserveAspectRatio="none"
12
- className={clsx(styles["tooltip__arrow-icon"], props.className)}
13
- >
14
- <polygon points="0,0 30,0 15,10"></polygon>
15
- </svg>
16
- );
17
- }
@@ -1,44 +0,0 @@
1
- .tooltip {
2
- z-index: 50;
3
- box-shadow: var(--shadow-1);
4
- border: 1px solid var(--outline-dimmer);
5
- border-radius: var(--border-radius-default);
6
- background-color: var(--surface-background);
7
- padding: var(--space-4) var(--space-8);
8
- }
9
-
10
- .tooltip__arrow {
11
- &[data-instant] {
12
- transition: none;
13
- }
14
-
15
- &[data-side="top"] {
16
- bottom: -4px;
17
- }
18
-
19
- &[data-side="bottom"] {
20
- top: -4px;
21
- rotate: 180deg;
22
- }
23
-
24
- &[data-side="left"] {
25
- right: -7px;
26
- rotate: -90deg;
27
- }
28
-
29
- &[data-side="right"] {
30
- left: -7px;
31
- rotate: 90deg;
32
- }
33
- }
34
-
35
- .tooltip__arrow-icon {
36
- display: block;
37
- position: relative;
38
- fill: var(--surface-background) !important;
39
- stroke: var(--outline-dimmer);
40
- stroke-dasharray: 0 30 22 0 22;
41
- stroke-linejoin: round;
42
- stroke-width: 2;
43
- border-top: 1px solid var(--surface-background);
44
- }
@@ -1,76 +0,0 @@
1
- import type { Meta, StoryObj } from "@storybook/react-vite";
2
-
3
- import { disable } from "~/stories/utils";
4
- import { tokens } from "~/styles/tokens";
5
-
6
- import { Tooltip, TooltipProvider } from ".";
7
- import { IconButton } from "../icon-button";
8
- import { View } from "../view";
9
-
10
- const meta = {
11
- title: "Tooltip",
12
- component: Tooltip,
13
- parameters: { layout: "centered" },
14
- argTypes: {
15
- children: {
16
- control: "text",
17
- },
18
- align: {
19
- control: "inline-radio",
20
- options: ["start", "center", "end"],
21
- },
22
- open: {
23
- control: "boolean",
24
- },
25
- ...disable(["className"]),
26
- },
27
- } satisfies Meta<typeof Tooltip>;
28
-
29
- export default meta;
30
-
31
- type Story = StoryObj<typeof meta>;
32
-
33
- export const Default: Story = {
34
- argTypes: {
35
- trigger: {
36
- table: {
37
- disable: true,
38
- },
39
- },
40
- },
41
- args: {
42
- children: "Bold",
43
- align: "center",
44
- open: true,
45
- },
46
- render: (args) => (
47
- <Tooltip
48
- trigger={<IconButton icon="bold" alt="Bold" interactive />}
49
- {...args}
50
- />
51
- ),
52
- };
53
-
54
- export const Provider: Story = {
55
- argTypes: {
56
- ...disable(["message", "trigger", "open", "children"]),
57
- },
58
- render: () => (
59
- <TooltipProvider>
60
- <View style={{ flexDirection: "row", gap: tokens.space4 }}>
61
- <Tooltip
62
- children="Bold"
63
- trigger={<IconButton icon="bold" alt="Bold" interactive />}
64
- />
65
- <Tooltip
66
- children="Italic"
67
- trigger={<IconButton icon="italic" alt="Italic" interactive />}
68
- />
69
- <Tooltip
70
- children="Underline"
71
- trigger={<IconButton icon="underline" alt="Underline" interactive />}
72
- />
73
- </View>
74
- </TooltipProvider>
75
- ),
76
- };
@@ -1,137 +0,0 @@
1
- import { mergeProps, useRender } from "@base-ui/react";
2
- import clsx from "clsx";
3
- import type { ElementType } from "react";
4
-
5
- import colorwayStyles from "./view_colorway.module.css";
6
- import interactiveStyles from "./view_interactive.module.css";
7
- import loadingStyles from "./view_loading.module.css";
8
- import styles from "./view.module.css";
9
-
10
- export type InteractiveStyle =
11
- | "fill"
12
- | "no-fill"
13
- | "outline"
14
- | "fill-outline"
15
- | "list-item";
16
-
17
- export type Color =
18
- | "primary"
19
- | "positive"
20
- | "negative"
21
- | "warning"
22
- | "red"
23
- | "orange"
24
- | "yellow"
25
- | "green"
26
- | "teal"
27
- | "blue"
28
- | "blurple"
29
- | "purple"
30
- | "magenta"
31
- | "pink"
32
- | "grey";
33
-
34
- export type ColorStyle =
35
- | "outline"
36
- | "outline-static"
37
- | "mute-static"
38
- | "fill"
39
- | "no-fill"
40
- | "fill-static"
41
- | "fill-outline";
42
-
43
- export type ColorVariant = `${Color}_${ColorStyle}`;
44
-
45
- export type LoadingVariant = "background" | "foreground";
46
-
47
- export type ViewProps<T extends ElementType = "div"> = Omit<
48
- useRender.ComponentProps<T>,
49
- "color"
50
- > & {
51
- /**
52
- * Centralized property to define either an interactive variant or colorway.
53
- * We know which is which because colorways have an underscore (Color_ColorVariant, like primary_fill).
54
- *
55
- * Static variants will not apply transitions or cursor effects! Do not use them for interactive elements.
56
- *
57
- * Setting `interactive` to true will use "fill".
58
- */
59
- interactive?: boolean | InteractiveStyle | ColorVariant;
60
-
61
- /**
62
- * Add CSS color variables but do nothing else.
63
- * Useful for using View as a sort of "Color Provider" so children can use colors and create custom variants.
64
- */
65
- color?: Color;
66
-
67
- /**
68
- * Make this element look like it's loading.
69
- * Setting `loading` to true will use "foreground".
70
- * It'll use sensible defaults based on the colorway or interactive prop.
71
- */
72
- loading?: boolean | LoadingVariant;
73
- };
74
-
75
- export const View = <T extends ElementType = "div">({
76
- interactive,
77
- loading,
78
- color,
79
- render,
80
- ...props
81
- }: ViewProps<T>) => {
82
- const normalized = normalize({ interactive, loading });
83
- const element = useRender({
84
- defaultTagName: "div",
85
- render,
86
- props: mergeProps(
87
- {
88
- className: clsx(
89
- styles["view"],
90
- color && colorwayStyles[`view_colorway_color-${color}`],
91
- normalized.interactive && [
92
- interactiveStyles["view_interactive"],
93
- interactiveStyles[`view_interactive_${normalized.interactive}`],
94
- ],
95
- normalized.colorway && [
96
- normalized.colorway[1].endsWith("static")
97
- ? colorwayStyles["view_colorway_static"]
98
- : colorwayStyles["view_colorway"],
99
- colorwayStyles[`view_colorway_${normalized.colorway[1]}`],
100
- colorwayStyles[`view_colorway_color-${normalized.colorway[0]}`],
101
- ],
102
- normalized.loading && [
103
- loadingStyles["view_loading"],
104
- loadingStyles[`view_loading_${normalized.loading}`],
105
- ],
106
- ),
107
- },
108
- props,
109
- ),
110
- });
111
- return element;
112
- };
113
-
114
- const normalize = (props: Pick<ViewProps, "interactive" | "loading">) => {
115
- let interactive: InteractiveStyle | null = null;
116
- let colorway: [Color, ColorStyle] | null = null;
117
-
118
- if (props.interactive && typeof props.interactive === "boolean") {
119
- interactive = "fill";
120
- } else if (typeof props.interactive === "string") {
121
- if (
122
- typeof props.interactive === "string" &&
123
- props.interactive.includes("_")
124
- ) {
125
- colorway = props.interactive.split("_") as [Color, ColorStyle];
126
- } else {
127
- interactive = props.interactive as InteractiveStyle;
128
- }
129
- }
130
-
131
- let loading: LoadingVariant | null = null;
132
- if (props.loading) {
133
- loading = typeof props.loading === "boolean" ? "foreground" : props.loading;
134
- }
135
-
136
- return { interactive, colorway, loading };
137
- };
@@ -1,11 +0,0 @@
1
- .view {
2
- display: flex;
3
- position: relative;
4
- flex-shrink: 0;
5
- flex-basis: auto;
6
- flex-direction: column;
7
- align-items: stretch;
8
- box-sizing: border-box;
9
- outline: none;
10
- border-style: solid;
11
- }
@@ -1,131 +0,0 @@
1
- import type { Meta, StoryObj } from "@storybook/react-vite";
2
-
3
- import {
4
- colorway,
5
- interactiveStyles,
6
- surfaceBackgrounds,
7
- } from "~/stories/data";
8
-
9
- import { View, type ViewProps } from ".";
10
- import { tokens } from "../../styles/tokens";
11
- import { Surface } from "../surface";
12
- import { Text } from "../text";
13
-
14
- const meta = {
15
- title: "View",
16
- component: View,
17
- parameters: { layout: "centered" },
18
- argTypes: {
19
- interactive: {
20
- control: "select",
21
- options: [...interactiveStyles, ...colorway],
22
- },
23
- loading: {
24
- control: "boolean",
25
- },
26
- "aria-disabled": {
27
- control: "boolean",
28
- },
29
- },
30
- } satisfies Meta<ViewProps & { "aria-disabled"?: boolean }>;
31
-
32
- export default meta;
33
-
34
- type Story = StoryObj<typeof meta>;
35
-
36
- export const Interactive: Story = {
37
- args: {
38
- interactive: "fill",
39
- loading: false,
40
- },
41
- render: (args) => (
42
- <View
43
- {...args}
44
- style={{
45
- paddingInline: tokens.space16,
46
- height: tokens.space32,
47
- justifyContent: "center",
48
- }}
49
- >
50
- Hello world
51
- </View>
52
- ),
53
- };
54
-
55
- export const Colorway: Story = {
56
- args: {
57
- interactive: "primary_fill",
58
- loading: false,
59
- },
60
- argTypes: {
61
- interactive: {
62
- table: {
63
- disable: true,
64
- },
65
- },
66
- },
67
- render: (args) => (
68
- <View
69
- {...args}
70
- style={{
71
- paddingInline: tokens.space16,
72
- height: tokens.space32,
73
- justifyContent: "center",
74
- }}
75
- >
76
- Hello world
77
- </View>
78
- ),
79
- };
80
-
81
- export const AllInteractiveStyles: Story = {
82
- argTypes: {
83
- interactive: {
84
- table: {
85
- disable: true,
86
- },
87
- },
88
- },
89
- args: {
90
- loading: false,
91
- },
92
- render: (args) => (
93
- <View
94
- style={{
95
- flexDirection: "row",
96
- flexWrap: "wrap",
97
- gap: tokens.space8,
98
- }}
99
- >
100
- {surfaceBackgrounds.map((background) => (
101
- <Surface
102
- style={{
103
- border: `1px solid ${tokens.outlineDimmest}`,
104
- padding: tokens.space16,
105
- width: tokens.space256,
106
- gap: tokens.space6,
107
- }}
108
- key={background}
109
- background={background}
110
- >
111
- <p style={{ fontWeight: 500 }}>{background}</p>
112
-
113
- {interactiveStyles.map((variant) => (
114
- <View
115
- key={variant}
116
- interactive={variant}
117
- style={{
118
- paddingInline: tokens.space16,
119
- height: tokens.space32,
120
- justifyContent: "center",
121
- }}
122
- {...args}
123
- >
124
- <Text>{variant}</Text>
125
- </View>
126
- ))}
127
- </Surface>
128
- ))}
129
- </View>
130
- ),
131
- };