@dxos/react-ui 0.8.4-main.5ea62a8 → 0.8.4-main.66e292d

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 (245) hide show
  1. package/dist/lib/browser/{chunk-P333G32W.mjs → chunk-N5GDJTT2.mjs} +632 -299
  2. package/dist/lib/browser/chunk-N5GDJTT2.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +12 -1
  4. package/dist/lib/browser/index.mjs.map +2 -2
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +57 -29
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/{chunk-JRCE5UVS.mjs → chunk-SP7VQH72.mjs} +632 -299
  9. package/dist/lib/node-esm/chunk-SP7VQH72.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +12 -1
  11. package/dist/lib/node-esm/index.mjs.map +2 -2
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +57 -29
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.stories.d.ts +0 -6
  16. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +0 -6
  18. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +0 -6
  20. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/{Buttons → Button}/Button.d.ts +1 -1
  22. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  23. package/dist/types/src/components/{Buttons → Button}/Button.stories.d.ts +1 -7
  24. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  25. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +1 -2
  26. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  27. package/dist/types/src/components/{Buttons → Button}/IconButton.stories.d.ts +0 -6
  28. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  29. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  30. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  31. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  32. package/dist/types/src/components/{Buttons → Button}/ToggleGroup.d.ts +6 -7
  33. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  34. package/dist/types/src/components/{Buttons → Button}/ToggleGroup.stories.d.ts +2 -12
  35. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  36. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  37. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
  38. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  39. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  40. package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.stories.d.ts +0 -6
  41. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  42. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  43. package/dist/types/src/components/{Dialogs → Dialog}/Dialog.stories.d.ts +0 -1
  44. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  45. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  46. package/dist/types/src/components/Icon/Icon.d.ts +1 -1
  47. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  48. package/dist/types/src/components/Icon/Icon.stories.d.ts +17 -0
  49. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  50. package/dist/types/src/components/Input/Input.d.ts +0 -2
  51. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  52. package/dist/types/src/components/Input/Input.stories.d.ts +0 -6
  53. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  54. package/dist/types/src/components/Link/Link.stories.d.ts +0 -6
  55. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  56. package/dist/types/src/components/List/List.d.ts.map +1 -0
  57. package/dist/types/src/components/{Lists → List}/List.stories.d.ts +0 -6
  58. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  59. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  60. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  61. package/dist/types/src/components/{Lists → List}/Tree.stories.d.ts +0 -6
  62. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  63. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  64. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts.map +1 -1
  65. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  66. package/dist/types/src/components/List/index.d.ts.map +1 -0
  67. package/dist/types/src/components/Main/Main.d.ts +9 -18
  68. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  69. package/dist/types/src/components/Main/Main.stories.d.ts +1 -2
  70. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  71. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +1 -1
  72. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +0 -6
  73. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +1 -1
  74. package/dist/types/src/components/Menus/DropdownMenu.d.ts +7 -7
  75. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +1 -1
  76. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +0 -6
  77. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +1 -1
  78. package/dist/types/src/components/Message/Message.stories.d.ts +0 -1
  79. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  80. package/dist/types/src/components/Popover/Popover.d.ts +1 -1
  81. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  82. package/dist/types/src/components/Popover/Popover.stories.d.ts +0 -6
  83. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  84. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +0 -6
  85. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +37 -0
  87. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
  88. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +18 -0
  89. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
  90. package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
  91. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
  92. package/dist/types/src/components/Select/Select.d.ts +1 -1
  93. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  94. package/dist/types/src/components/Select/Select.stories.d.ts +0 -6
  95. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  96. package/dist/types/src/components/Status/Status.stories.d.ts +0 -6
  97. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  98. package/dist/types/src/components/Tag/Tag.stories.d.ts +8 -8
  99. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/Toast/Toast.stories.d.ts +0 -6
  101. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  102. package/dist/types/src/components/Toolbar/Toolbar.d.ts +12 -12
  103. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  104. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +0 -6
  105. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  106. package/dist/types/src/components/Tooltip/Tooltip.d.ts +1 -3
  107. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  108. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +0 -6
  109. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  110. package/dist/types/src/components/index.d.ts +4 -3
  111. package/dist/types/src/components/index.d.ts.map +1 -1
  112. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  113. package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
  114. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  115. package/dist/types/src/index.d.ts +1 -1
  116. package/dist/types/src/index.d.ts.map +1 -1
  117. package/dist/types/src/playground/Controls.stories.d.ts +0 -6
  118. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  119. package/dist/types/src/playground/Custom.stories.d.ts +1 -2
  120. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  121. package/dist/types/src/playground/Typography.stories.d.ts +0 -6
  122. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  123. package/dist/types/src/testing/decorators/index.d.ts +2 -1
  124. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  125. package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
  126. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
  127. package/dist/types/src/testing/decorators/{withSurfaceVariantsLayout.d.ts → withLayoutVariants.d.ts} +2 -2
  128. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  129. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -0
  130. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  131. package/dist/types/src/util/domino.d.ts +18 -0
  132. package/dist/types/src/util/domino.d.ts.map +1 -0
  133. package/dist/types/src/util/index.d.ts +2 -0
  134. package/dist/types/src/util/index.d.ts.map +1 -1
  135. package/dist/types/src/util/usePx.d.ts +8 -0
  136. package/dist/types/src/util/usePx.d.ts.map +1 -0
  137. package/dist/types/tsconfig.tsbuildinfo +1 -1
  138. package/package.json +24 -23
  139. package/src/components/Avatars/Avatar.stories.tsx +0 -2
  140. package/src/components/Avatars/AvatarGroup.stories.tsx +0 -3
  141. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -4
  142. package/src/components/{Buttons → Button}/Button.stories.tsx +3 -5
  143. package/src/components/{Buttons → Button}/IconButton.stories.tsx +0 -3
  144. package/src/components/{Buttons → Button}/IconButton.tsx +14 -13
  145. package/src/components/{Buttons → Button}/Toggle.stories.tsx +5 -7
  146. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +0 -3
  147. package/src/components/{Buttons → Button}/ToggleGroup.tsx +14 -1
  148. package/src/components/Clipboard/CopyButton.tsx +1 -1
  149. package/src/components/{Dialogs → Dialog}/AlertDialog.stories.tsx +1 -4
  150. package/src/components/{Dialogs → Dialog}/Dialog.stories.tsx +6 -4
  151. package/src/components/Icon/Icon.stories.tsx +113 -0
  152. package/src/components/Icon/Icon.tsx +1 -1
  153. package/src/components/Input/Input.stories.tsx +0 -3
  154. package/src/components/Input/Input.tsx +3 -3
  155. package/src/components/Link/Link.stories.tsx +0 -3
  156. package/src/components/{Lists → List}/List.stories.tsx +2 -6
  157. package/src/components/{Lists → List}/ListDropIndicator.tsx +1 -1
  158. package/src/components/{Lists → List}/Tree.stories.tsx +0 -3
  159. package/src/components/{Lists → List}/Treegrid.tsx +57 -16
  160. package/src/components/Main/Main.stories.tsx +4 -4
  161. package/src/components/Main/Main.tsx +28 -19
  162. package/src/components/Menus/ContextMenu.stories.tsx +0 -3
  163. package/src/components/Menus/ContextMenu.tsx +1 -0
  164. package/src/components/Menus/DropdownMenu.stories.tsx +1 -4
  165. package/src/components/Menus/DropdownMenu.tsx +37 -8
  166. package/src/components/Message/Message.stories.tsx +0 -2
  167. package/src/components/Popover/Popover.stories.tsx +1 -4
  168. package/src/components/Popover/Popover.tsx +22 -5
  169. package/src/components/ScrollArea/ScrollArea.stories.tsx +1 -4
  170. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +69 -0
  171. package/src/components/ScrollContainer/ScrollContainer.tsx +231 -0
  172. package/src/components/ScrollContainer/index.ts +5 -0
  173. package/src/components/Select/Select.stories.tsx +3 -5
  174. package/src/components/Select/Select.tsx +5 -4
  175. package/src/components/Status/Status.stories.tsx +0 -3
  176. package/src/components/Tag/Tag.stories.tsx +8 -7
  177. package/src/components/Toast/Toast.stories.tsx +1 -4
  178. package/src/components/Toolbar/Toolbar.stories.tsx +2 -7
  179. package/src/components/Toolbar/Toolbar.tsx +18 -6
  180. package/src/components/Tooltip/Tooltip.stories.tsx +1 -4
  181. package/src/components/Tooltip/Tooltip.tsx +2 -1
  182. package/src/components/index.ts +4 -3
  183. package/src/hooks/useSafeArea.ts +3 -2
  184. package/src/hooks/useVisualViewport.ts +4 -4
  185. package/src/index.ts +1 -1
  186. package/src/playground/Controls.stories.tsx +3 -5
  187. package/src/playground/Custom.stories.tsx +9 -20
  188. package/src/playground/Typography.stories.tsx +0 -3
  189. package/src/testing/decorators/index.ts +2 -1
  190. package/src/testing/decorators/withLayout.tsx +56 -0
  191. package/src/testing/decorators/{withSurfaceVariantsLayout.tsx → withLayoutVariants.tsx} +2 -2
  192. package/src/testing/decorators/withTheme.tsx +31 -0
  193. package/src/util/domino.ts +53 -0
  194. package/src/util/index.ts +2 -0
  195. package/src/util/usePx.ts +61 -0
  196. package/dist/lib/browser/chunk-P333G32W.mjs.map +0 -7
  197. package/dist/lib/node-esm/chunk-JRCE5UVS.mjs.map +0 -7
  198. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  199. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  200. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  201. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  202. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  203. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -19
  204. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  205. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  206. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  207. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  208. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  209. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  210. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  211. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  212. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  213. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  214. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  215. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  216. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  217. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  218. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  219. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  220. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  221. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  222. package/src/testing/decorators/withTheme.ts +0 -25
  223. /package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +0 -0
  224. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  225. /package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.d.ts +0 -0
  226. /package/dist/types/src/components/{Dialogs → Dialog}/Dialog.d.ts +0 -0
  227. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  228. /package/dist/types/src/components/{Lists → List}/List.d.ts +0 -0
  229. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  230. /package/dist/types/src/components/{Lists → List}/Tree.d.ts +0 -0
  231. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  232. /package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +0 -0
  233. /package/dist/types/src/components/{Lists → List}/Treegrid.stories.d.ts +0 -0
  234. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  235. /package/src/components/{Buttons → Button}/Button.tsx +0 -0
  236. /package/src/components/{Buttons → Button}/Toggle.tsx +0 -0
  237. /package/src/components/{Buttons → Button}/index.ts +0 -0
  238. /package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +0 -0
  239. /package/src/components/{Dialogs → Dialog}/Dialog.tsx +0 -0
  240. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  241. /package/src/components/{Lists → List}/List.tsx +0 -0
  242. /package/src/components/{Lists → List}/Tree.tsx +0 -0
  243. /package/src/components/{Lists → List}/TreeDropIndicator.tsx +0 -0
  244. /package/src/components/{Lists → List}/Treegrid.stories.tsx +0 -0
  245. /package/src/components/{Lists → List}/index.ts +0 -0
@@ -2,23 +2,12 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
10
8
  import { Button, type ButtonProps, IconButton, Tooltip } from '../components';
11
9
  import { withTheme } from '../testing';
12
10
 
13
- // TODO(burdon): Change density to 3 or 4 sizes: (large, medium, small; or 22, 28, 32, 40)
14
- // TODO(burdon): IconButton should be square if no text.
15
- // TODO(burdon): IconButton icon should be auto-sized based on density.
16
-
17
- // TODO(burdon): Remove custom padding from all Buttons.
18
-
19
- // TODO(burdon): Forms w/ labels.
20
- // TODO(burdon): Card preview with sections.
21
-
22
11
  const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
23
12
  return (
24
13
  <Tooltip.Provider>
@@ -41,7 +30,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
41
30
  iconOnly
42
31
  size={7}
43
32
  density='coarse'
44
- classNames='px-1.5'
33
+ classNames='pli-1.5'
45
34
  />
46
35
  </div>
47
36
  </div>
@@ -54,7 +43,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
54
43
  </Button>
55
44
  </div>
56
45
  <div className='flex justify-center'>
57
- <IconButton {...args} label='Test' icon='ph--atom--regular' size={5} density='fine' classNames='px-2' />
46
+ <IconButton {...args} label='Test' icon='ph--atom--regular' density='fine' classNames='pli-2' />
58
47
  </div>
59
48
  <div className='flex justify-center'>
60
49
  <IconButton
@@ -62,9 +51,8 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
62
51
  label='Test'
63
52
  icon='ph--atom--regular'
64
53
  iconOnly
65
- size={5}
66
54
  density='fine'
67
- classNames='py-1 px-1.5'
55
+ classNames='plb-1 pli-1.5'
68
56
  />
69
57
  </div>
70
58
  </div>
@@ -72,7 +60,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
72
60
  {/* Small */}
73
61
  <div className='grid grid-cols-3 gap-4'>
74
62
  <div className='flex justify-center'>
75
- <Button {...args} density='fine' classNames={'!h-[24px] !text-[14px] p-0 px-1.5 min-bs-0'}>
63
+ <Button {...args} density='fine' classNames={'!h-[24px] !text-[14px] p-0 pli-1.5 min-bs-0'}>
76
64
  {children}
77
65
  </Button>
78
66
  </div>
@@ -101,18 +89,17 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
101
89
 
102
90
  {/* TODO(burdon): Full variant with max width. */}
103
91
  <div className='flex justify-center'>
104
- <Button classNames='w-full max-w-[15rem] rounded' variant='default'>
92
+ <Button classNames='is-full max-is-[15rem] rounded' variant='default'>
105
93
  Test
106
94
  </Button>
107
95
  </div>
108
96
  <div className='flex justify-center'>
109
97
  {/* TODO(burdon): Option to have button on RHS. Default size for icon should be 5 for this (medium) density. */}
110
98
  <IconButton
111
- classNames='w-full max-w-[15rem] rounded'
99
+ classNames='is-full max-is-[15rem] rounded'
112
100
  variant='primary'
113
101
  icon='ph--arrows-clockwise--regular'
114
102
  label='Test'
115
- size={5}
116
103
  />
117
104
  </div>
118
105
  </div>
@@ -125,7 +112,9 @@ const meta = {
125
112
  component: Button,
126
113
  render: DefaultStory,
127
114
  decorators: [withTheme],
128
- parameters: { layout: 'centered' },
115
+ parameters: {
116
+ layout: 'centered',
117
+ },
129
118
  } satisfies Meta<typeof Button>;
130
119
 
131
120
  export default meta;
@@ -2,8 +2,6 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
@@ -48,7 +46,6 @@ const meta = {
48
46
  title: 'ui/react-ui-core/Playground/Typography',
49
47
  render: DefaultStory,
50
48
  decorators: [withTheme],
51
- parameters: { chromatic: { disableSnapshot: false } },
52
49
  } satisfies Meta<typeof DefaultStory>;
53
50
 
54
51
  export default meta;
@@ -2,5 +2,6 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ export * from './withLayout';
6
+ export * from './withLayoutVariants';
5
7
  export * from './withTheme';
6
- export * from './withSurfaceVariantsLayout';
@@ -0,0 +1,56 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Decorator } from '@storybook/react';
6
+ import React, { type FC, type PropsWithChildren } from 'react';
7
+
8
+ import { type ClassNameValue, type ThemedClassName } from '@dxos/react-ui';
9
+ import { mx } from '@dxos/react-ui-theme';
10
+
11
+ export type ContainerProps = ThemedClassName<PropsWithChildren>;
12
+
13
+ export type ContainerType = 'default' | 'column';
14
+
15
+ export type WithLayoutProps =
16
+ | FC<ContainerProps>
17
+ | { classNames?: ClassNameValue; container?: ContainerType; scroll?: boolean };
18
+
19
+ /**
20
+ * Adds layout container.
21
+ */
22
+ export const withLayout =
23
+ (props: WithLayoutProps): Decorator =>
24
+ (Story) => {
25
+ if (typeof props === 'function') {
26
+ const Container = props;
27
+ return (
28
+ <Container>
29
+ <Story />
30
+ </Container>
31
+ );
32
+ }
33
+
34
+ const Container = layouts[(props as any).container as ContainerType] ?? layouts.default;
35
+ return (
36
+ <Container classNames={mx(props.classNames, props.scroll ? 'overflow-y-auto' : 'overflow-hidden')}>
37
+ <Story />
38
+ </Container>
39
+ );
40
+ };
41
+
42
+ const layouts: Record<ContainerType, FC<ContainerProps>> = {
43
+ default: ({ children, classNames }: ContainerProps) => (
44
+ <div role='none' className={mx(classNames)}>
45
+ {children}
46
+ </div>
47
+ ),
48
+
49
+ column: ({ children, classNames }: ContainerProps) => (
50
+ <div role='none' className='fixed inset-0 flex justify-center overflow-hidden bg-deckSurface'>
51
+ <div role='none' className={mx('flex flex-col is-[40rem] bg-baseSurface', classNames)}>
52
+ {children}
53
+ </div>
54
+ </div>
55
+ ),
56
+ };
@@ -23,7 +23,7 @@ const Panel = ({
23
23
  densities,
24
24
  className,
25
25
  }: { Story: ComponentType } & Config & { className?: string }) => (
26
- <div className={mx('flex flex-col h-full p-4 gap-4', className)}>
26
+ <div className={mx('flex flex-col bs-full p-4 gap-4', className)}>
27
27
  {elevations?.map(({ elevation, surface }) =>
28
28
  densities?.map((density) => (
29
29
  <Container key={`${elevation}--${density}`} surface={surface} elevation={elevation}>
@@ -34,7 +34,7 @@ const Panel = ({
34
34
  </div>
35
35
  );
36
36
 
37
- export const withSurfaceVariantsLayout = ({
37
+ export const withLayoutVariants = ({
38
38
  elevations = [
39
39
  { elevation: 'base', surface: 'bg-baseSurface' },
40
40
  { elevation: 'positioned', surface: 'bg-cardSurface' },
@@ -0,0 +1,31 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Decorator } from '@storybook/react';
6
+ import React, { memo } from 'react';
7
+
8
+ import { defaultTx } from '@dxos/react-ui-theme';
9
+
10
+ import { type ThemeMode, ThemeProvider, Tooltip } from '../../components';
11
+
12
+ /**
13
+ * Adds theme decorator (add to preview.ts)
14
+ */
15
+ export const withTheme: Decorator = (Story, context) => {
16
+ const {
17
+ globals: { theme },
18
+ parameters: { translations },
19
+ } = context;
20
+
21
+ // Prevent re-rendering of the story.
22
+ const MemoizedStory = memo(Story);
23
+
24
+ return (
25
+ <ThemeProvider tx={defaultTx} themeMode={theme as ThemeMode} resourceExtensions={translations} noCache>
26
+ <Tooltip.Provider>
27
+ <MemoizedStory />
28
+ </Tooltip.Provider>
29
+ </ThemeProvider>
30
+ );
31
+ };
@@ -0,0 +1,53 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { mx } from '@dxos/react-ui-theme';
6
+ import { type ClassNameValue } from '@dxos/react-ui-types';
7
+
8
+ /**
9
+ * Super lightweight chainable DOM builder.
10
+ */
11
+ export class Domino<T extends HTMLElement> {
12
+ static of<K extends keyof HTMLElementTagNameMap>(tag: K): Domino<HTMLElementTagNameMap[K]> {
13
+ return new Domino<HTMLElementTagNameMap[K]>(tag);
14
+ }
15
+
16
+ private readonly _el: T;
17
+ constructor(tag: keyof HTMLElementTagNameMap) {
18
+ this._el = document.createElement(tag) as T;
19
+ }
20
+ classNames(...classNames: ClassNameValue[]): this {
21
+ this._el.className = mx(classNames);
22
+ return this;
23
+ }
24
+ text(value: string): this {
25
+ this._el.textContent = value;
26
+ return this;
27
+ }
28
+ data(key: string, value: string): this {
29
+ this._el.dataset[key] = value;
30
+ return this;
31
+ }
32
+ attributes(attr: Record<string, string | undefined>): this {
33
+ Object.entries(attr)
34
+ .filter(([_, value]) => value !== undefined)
35
+ .map(([key, value]) => this._el.setAttribute(key, value!));
36
+ return this;
37
+ }
38
+ style(styles: Partial<CSSStyleDeclaration>): this {
39
+ Object.assign(this._el.style, styles);
40
+ return this;
41
+ }
42
+ children<C extends HTMLElement>(...children: Domino<C>[]): this {
43
+ children.forEach((child) => this._el.appendChild(child.build()));
44
+ return this;
45
+ }
46
+ on(event: string, handler: (e: Event) => void): this {
47
+ this._el.addEventListener(event, handler);
48
+ return this;
49
+ }
50
+ build(): T {
51
+ return this._el;
52
+ }
53
+ }
package/src/util/index.ts CHANGED
@@ -2,5 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ export * from './domino';
5
6
  export * from './hasIosKeyboard';
6
7
  export type * from './ThemedClassName';
8
+ export * from './usePx';
@@ -0,0 +1,61 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useCallback, useEffect, useMemo, useState } from 'react';
6
+
7
+ const getDocumentElementFontSize = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
8
+
9
+ /**
10
+ * React hook that converts rem values to pixels and updates when the root font size changes.
11
+ *
12
+ * @param rem The rem value to convert to pixels
13
+ * @returns The current pixel value equivalent of the rem input
14
+ */
15
+ export const usePx = (rem: number): number => {
16
+ const [fontSize, setFontSize] = useState(() => {
17
+ if (typeof document !== 'undefined') {
18
+ return getDocumentElementFontSize();
19
+ }
20
+ return 16; // Default fallback for SSR
21
+ });
22
+
23
+ const updateFontSize = useCallback(() => {
24
+ setFontSize(getDocumentElementFontSize());
25
+ }, []);
26
+
27
+ useEffect(() => {
28
+ if (typeof document === 'undefined') {
29
+ return;
30
+ }
31
+
32
+ // Create a ResizeObserver to watch for font size changes on the document element
33
+ const resizeObserver = new ResizeObserver(updateFontSize);
34
+ resizeObserver.observe(document.documentElement);
35
+
36
+ // Also listen for viewport changes that might affect font size
37
+ const mediaQueryList = window.matchMedia('all');
38
+ const handleMediaChange = () => {
39
+ updateFontSize();
40
+ };
41
+
42
+ if (mediaQueryList.addEventListener) {
43
+ mediaQueryList.addEventListener('change', handleMediaChange);
44
+ } else {
45
+ // Fallback for older browsers
46
+ mediaQueryList.addListener(handleMediaChange);
47
+ }
48
+
49
+ return () => {
50
+ resizeObserver.disconnect();
51
+ if (mediaQueryList.removeEventListener) {
52
+ mediaQueryList.removeEventListener('change', handleMediaChange);
53
+ } else {
54
+ // Fallback for older browsers
55
+ mediaQueryList.removeListener(handleMediaChange);
56
+ }
57
+ };
58
+ }, []);
59
+
60
+ return useMemo(() => rem * fontSize, [fontSize]);
61
+ };