@tcn/ui 0.1.1 → 0.3.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 (317) hide show
  1. package/README.md +38 -3
  2. package/dist/divider.module-FptFV0PX.js +5 -0
  3. package/dist/divider.module-FptFV0PX.js.map +1 -0
  4. package/dist/draggable.css +1 -0
  5. package/dist/feedback/progress/progress_bar.js +1 -1
  6. package/dist/form/field/common/field_description.js +1 -1
  7. package/dist/form/field/common/field_error.js +1 -1
  8. package/dist/form/field/common/field_label.js +1 -1
  9. package/dist/form/field/field.js +1 -1
  10. package/dist/frame.css +1 -0
  11. package/dist/inputs/color_input/color_input.js +1 -1
  12. package/dist/inputs/color_input/color_input.js.map +1 -1
  13. package/dist/inputs/color_input/color_picker.js +1 -1
  14. package/dist/inputs/combo_box/combo_box.js +1 -1
  15. package/dist/inputs/date_picker/date_picker.js +1 -1
  16. package/dist/inputs/date_picker/date_picker_date.js +1 -1
  17. package/dist/inputs/date_picker/date_picker_day.js +1 -1
  18. package/dist/inputs/date_picker/date_picker_input.js +2 -2
  19. package/dist/inputs/date_picker/date_picker_input.js.map +1 -1
  20. package/dist/inputs/date_picker/date_picker_time_selector.js +1 -1
  21. package/dist/inputs/date_picker/date_picker_year_input.js +1 -1
  22. package/dist/inputs/date_picker/date_picker_year_input.js.map +1 -1
  23. package/dist/inputs/date_picker/date_picker_year_selector.js +2 -2
  24. package/dist/inputs/mask_input/key_capture_input.js +1 -1
  25. package/dist/inputs/mask_input/mask_input.js +1 -1
  26. package/dist/inputs/multiselect/multiselect.js +1 -1
  27. package/dist/inputs/phone_number_input/phone_number_input.d.ts +2 -0
  28. package/dist/inputs/phone_number_input/phone_number_input.d.ts.map +1 -1
  29. package/dist/inputs/phone_number_input/phone_number_input.js +160 -154
  30. package/dist/inputs/phone_number_input/phone_number_input.js.map +1 -1
  31. package/dist/inputs/select/select.js +1 -1
  32. package/dist/inputs/slider/slider.js +1 -1
  33. package/dist/inputs/suggestions/suggestion_list.js +3 -3
  34. package/dist/inputs/suggestions/suggestion_list.js.map +1 -1
  35. package/dist/inputs/switch/switch.js +1 -1
  36. package/dist/inputs/textarea/textarea.d.ts +2 -2
  37. package/dist/inputs/textarea/textarea.d.ts.map +1 -1
  38. package/dist/inputs/textarea/textarea.js.map +1 -1
  39. package/dist/inputs/unit_input/unit_input.js +1 -1
  40. package/dist/layouts/divider/divider.js +24 -23
  41. package/dist/layouts/divider/divider.js.map +1 -1
  42. package/dist/layouts/header/header.d.ts.map +1 -1
  43. package/dist/layouts/header/header.js.map +1 -1
  44. package/dist/layouts/index.d.ts +6 -5
  45. package/dist/layouts/index.d.ts.map +1 -1
  46. package/dist/layouts/index.js +28 -26
  47. package/dist/layouts/index.js.map +1 -1
  48. package/dist/layouts/scaffold/scaffold.d.ts +9 -0
  49. package/dist/layouts/scaffold/scaffold.d.ts.map +1 -0
  50. package/dist/layouts/scaffold/scaffold.js +55 -0
  51. package/dist/layouts/scaffold/scaffold.js.map +1 -0
  52. package/dist/modal.css +1 -1
  53. package/dist/overlay/frame/frame.d.ts +11 -0
  54. package/dist/overlay/frame/frame.d.ts.map +1 -0
  55. package/dist/overlay/frame/frame.js +35 -0
  56. package/dist/overlay/frame/frame.js.map +1 -0
  57. package/dist/overlay/index.d.ts +10 -2
  58. package/dist/overlay/index.d.ts.map +1 -1
  59. package/dist/overlay/index.js +22 -8
  60. package/dist/overlay/index.js.map +1 -1
  61. package/dist/overlay/menu/menu.d.ts +1 -1
  62. package/dist/overlay/menu/menu.d.ts.map +1 -1
  63. package/dist/overlay/menu/menu.js +2 -2
  64. package/dist/overlay/menu/menu.js.map +1 -1
  65. package/dist/overlay/popper/base/base_popper.d.ts +11 -0
  66. package/dist/overlay/popper/base/base_popper.d.ts.map +1 -0
  67. package/dist/overlay/popper/base/base_popper.js +27 -0
  68. package/dist/overlay/popper/base/base_popper.js.map +1 -0
  69. package/dist/overlay/popper/base/dismissal_decorator.d.ts +16 -0
  70. package/dist/overlay/popper/base/dismissal_decorator.d.ts.map +1 -0
  71. package/dist/overlay/popper/base/dismissal_decorator.js +69 -0
  72. package/dist/overlay/popper/base/dismissal_decorator.js.map +1 -0
  73. package/dist/overlay/popper/context_popper.d.ts +11 -0
  74. package/dist/overlay/popper/context_popper.d.ts.map +1 -0
  75. package/dist/overlay/popper/context_popper.js +33 -0
  76. package/dist/overlay/popper/context_popper.js.map +1 -0
  77. package/dist/overlay/popper/element_popper.d.ts +7 -0
  78. package/dist/overlay/popper/element_popper.d.ts.map +1 -0
  79. package/dist/overlay/popper/element_popper.js +33 -0
  80. package/dist/overlay/popper/element_popper.js.map +1 -0
  81. package/dist/overlay/popper/hooks/use_context_trigger.d.ts +7 -0
  82. package/dist/overlay/popper/hooks/use_context_trigger.d.ts.map +1 -0
  83. package/dist/overlay/popper/hooks/use_context_trigger.js +31 -0
  84. package/dist/overlay/popper/hooks/use_context_trigger.js.map +1 -0
  85. package/dist/overlay/popper/hooks/use_hover_trigger.d.ts +6 -0
  86. package/dist/overlay/popper/hooks/use_hover_trigger.d.ts.map +1 -0
  87. package/dist/overlay/popper/hooks/use_hover_trigger.js +17 -0
  88. package/dist/overlay/popper/hooks/use_hover_trigger.js.map +1 -0
  89. package/dist/overlay/popper/hooks/use_restore_focus.d.ts +2 -0
  90. package/dist/overlay/popper/hooks/use_restore_focus.d.ts.map +1 -0
  91. package/dist/overlay/popper/hooks/use_restore_focus.js +18 -0
  92. package/dist/overlay/popper/hooks/use_restore_focus.js.map +1 -0
  93. package/dist/overlay/popper/legacy/popper.d.ts.map +1 -0
  94. package/dist/overlay/popper/{popper.js → legacy/popper.js} +6 -6
  95. package/dist/overlay/popper/legacy/popper.js.map +1 -0
  96. package/dist/overlay/popper/preview_popper.d.ts +7 -0
  97. package/dist/overlay/popper/preview_popper.d.ts.map +1 -0
  98. package/dist/overlay/popper/preview_popper.js +46 -0
  99. package/dist/overlay/popper/preview_popper.js.map +1 -0
  100. package/dist/overlay/tethered/element_tethered.d.ts +8 -0
  101. package/dist/overlay/tethered/element_tethered.d.ts.map +1 -0
  102. package/dist/overlay/tethered/element_tethered.js +33 -0
  103. package/dist/overlay/tethered/element_tethered.js.map +1 -0
  104. package/dist/overlay/tethered/hooks/calculate_position.d.ts +19 -0
  105. package/dist/overlay/tethered/hooks/calculate_position.d.ts.map +1 -0
  106. package/dist/overlay/tethered/hooks/calculate_position.js +43 -0
  107. package/dist/overlay/tethered/hooks/calculate_position.js.map +1 -0
  108. package/dist/overlay/tethered/hooks/useTether.d.ts +19 -0
  109. package/dist/overlay/tethered/hooks/useTether.d.ts.map +1 -0
  110. package/dist/overlay/tethered/hooks/useTether.js +61 -0
  111. package/dist/overlay/tethered/hooks/useTether.js.map +1 -0
  112. package/dist/overlay/tethered/tethered.d.ts +20 -0
  113. package/dist/overlay/tethered/tethered.d.ts.map +1 -0
  114. package/dist/overlay/tethered/tethered.js +59 -0
  115. package/dist/overlay/tethered/tethered.js.map +1 -0
  116. package/dist/overlay/tethered/types.d.ts +3 -0
  117. package/dist/overlay/tethered/types.d.ts.map +1 -0
  118. package/dist/overlay/tethered/types.js +2 -0
  119. package/dist/overlay/tethered/types.js.map +1 -0
  120. package/dist/popper.css +1 -1
  121. package/dist/scaffold.css +1 -0
  122. package/dist/stacks/box/box.d.ts +1 -1
  123. package/dist/stacks/box/box.d.ts.map +1 -1
  124. package/dist/stacks/box/box.js +1 -1
  125. package/dist/stacks/box/box.js.map +1 -1
  126. package/dist/stacks/h_collapsible_box.js +1 -1
  127. package/dist/stacks/v_collapsible_box.js +1 -1
  128. package/dist/surfaces/card/card.d.ts +2 -2
  129. package/dist/surfaces/card/card.d.ts.map +1 -1
  130. package/dist/surfaces/card/card.js +7 -7
  131. package/dist/surfaces/card/card.js.map +1 -1
  132. package/dist/surfaces/index.d.ts +4 -2
  133. package/dist/surfaces/index.d.ts.map +1 -1
  134. package/dist/surfaces/index.js +26 -22
  135. package/dist/surfaces/index.js.map +1 -1
  136. package/dist/surfaces/modal/modal.d.ts +4 -3
  137. package/dist/surfaces/modal/modal.d.ts.map +1 -1
  138. package/dist/surfaces/modal/modal.js +12 -11
  139. package/dist/surfaces/modal/modal.js.map +1 -1
  140. package/dist/surfaces/panel/h_panel.js +23 -24
  141. package/dist/surfaces/panel/h_panel.js.map +1 -1
  142. package/dist/surfaces/panel/v_panel.d.ts +3 -7
  143. package/dist/surfaces/panel/v_panel.d.ts.map +1 -1
  144. package/dist/surfaces/panel/v_panel.js +12 -54
  145. package/dist/surfaces/panel/v_panel.js.map +1 -1
  146. package/dist/surfaces/pop_confirm/pop_confirm.d.ts +5 -0
  147. package/dist/surfaces/pop_confirm/pop_confirm.d.ts.map +1 -0
  148. package/dist/surfaces/pop_confirm/pop_confirm.js +37 -0
  149. package/dist/surfaces/pop_confirm/pop_confirm.js.map +1 -0
  150. package/dist/surfaces/popconfirm/pop_confirm.d.ts +5 -0
  151. package/dist/surfaces/popconfirm/pop_confirm.d.ts.map +1 -0
  152. package/dist/surfaces/popconfirm/pop_confirm.js +13 -0
  153. package/dist/surfaces/popconfirm/pop_confirm.js.map +1 -0
  154. package/dist/surfaces/popover/popover.d.ts +1 -1
  155. package/dist/surfaces/popover/popover.d.ts.map +1 -1
  156. package/dist/surfaces/popover/popover.js +1 -1
  157. package/dist/surfaces/popover/popover.js.map +1 -1
  158. package/dist/surfaces/tooltip/tooltip.d.ts +10 -0
  159. package/dist/surfaces/tooltip/tooltip.d.ts.map +1 -0
  160. package/dist/surfaces/tooltip/tooltip.js +38 -0
  161. package/dist/surfaces/tooltip/tooltip.js.map +1 -0
  162. package/dist/surfaces/window/window.d.ts +4 -3
  163. package/dist/surfaces/window/window.d.ts.map +1 -1
  164. package/dist/surfaces/window/window.js +18 -6
  165. package/dist/surfaces/window/window.js.map +1 -1
  166. package/dist/tethered.css +1 -0
  167. package/dist/themes/themes/ergo/ergo_theme.js +166 -158
  168. package/dist/themes/themes/ergo/ergo_theme.js.map +1 -1
  169. package/dist/tooltip.css +1 -1
  170. package/dist/typography/title/title.d.ts +2 -1
  171. package/dist/typography/title/title.d.ts.map +1 -1
  172. package/dist/typography/title/title.js +23 -22
  173. package/dist/typography/title/title.js.map +1 -1
  174. package/dist/utility_bar.css +1 -1
  175. package/dist/utils/click_away_listener.d.ts +1 -0
  176. package/dist/utils/click_away_listener.d.ts.map +1 -1
  177. package/dist/utils/click_away_listener.js +2 -1
  178. package/dist/utils/click_away_listener.js.map +1 -1
  179. package/dist/utils/dnd/context.d.ts +4 -0
  180. package/dist/utils/dnd/context.d.ts.map +1 -0
  181. package/dist/utils/dnd/context.js +20 -0
  182. package/dist/utils/dnd/context.js.map +1 -0
  183. package/dist/utils/dnd/draggable/draggable.d.ts +7 -0
  184. package/dist/utils/dnd/draggable/draggable.d.ts.map +1 -0
  185. package/dist/utils/dnd/draggable/draggable.js +27 -0
  186. package/dist/utils/dnd/draggable/draggable.js.map +1 -0
  187. package/dist/utils/dnd/handle.d.ts +6 -0
  188. package/dist/utils/dnd/handle.d.ts.map +1 -0
  189. package/dist/utils/dnd/handle.js +22 -0
  190. package/dist/utils/dnd/handle.js.map +1 -0
  191. package/dist/utils/dnd/hooks/use_drag_container.d.ts +7 -0
  192. package/dist/utils/dnd/hooks/use_drag_container.d.ts.map +1 -0
  193. package/dist/utils/dnd/hooks/use_drag_container.js +30 -0
  194. package/dist/utils/dnd/hooks/use_drag_container.js.map +1 -0
  195. package/dist/utils/{hooks → dnd/hooks}/use_draggable.d.ts +3 -3
  196. package/dist/utils/dnd/hooks/use_draggable.d.ts.map +1 -0
  197. package/dist/utils/dnd/hooks/use_draggable.js +41 -0
  198. package/dist/utils/dnd/hooks/use_draggable.js.map +1 -0
  199. package/dist/utils/dnd/types.d.ts +10 -0
  200. package/dist/utils/dnd/types.d.ts.map +1 -0
  201. package/dist/utils/dnd/types.js +2 -0
  202. package/dist/utils/dnd/types.js.map +1 -0
  203. package/dist/utils/index.d.ts +6 -5
  204. package/dist/utils/index.d.ts.map +1 -1
  205. package/dist/utils/index.js +26 -23
  206. package/dist/utils/index.js.map +1 -1
  207. package/dist/utils/mouse_leave_region.d.ts +8 -0
  208. package/dist/utils/mouse_leave_region.d.ts.map +1 -0
  209. package/dist/utils/mouse_leave_region.js +26 -0
  210. package/dist/utils/mouse_leave_region.js.map +1 -0
  211. package/dist/utils/types/dimensions.d.ts +11 -1
  212. package/dist/utils/types/dimensions.d.ts.map +1 -1
  213. package/package.json +9 -3
  214. package/src/inputs/color_input/color_input.tsx +1 -1
  215. package/src/inputs/date_picker/date_picker_input.tsx +1 -1
  216. package/src/inputs/date_picker/date_picker_year_input.tsx +1 -1
  217. package/src/inputs/phone_number_input/phone_number_input.tsx +8 -0
  218. package/src/inputs/suggestions/suggestion_list.tsx +1 -1
  219. package/src/inputs/textarea/textarea.tsx +2 -2
  220. package/src/layouts/header/header.tsx +0 -1
  221. package/src/layouts/index.ts +7 -5
  222. package/src/layouts/scaffold/scaffold.module.css +5 -0
  223. package/src/layouts/scaffold/scaffold.tsx +60 -0
  224. package/src/layouts/utility_bar/utility_bar.module.css +0 -3
  225. package/src/overlay/frame/frame.module.css +5 -0
  226. package/src/overlay/frame/frame.stories.tsx +40 -0
  227. package/src/overlay/frame/frame.tsx +50 -0
  228. package/src/overlay/frame/frame_stories.module.css +14 -0
  229. package/src/overlay/index.ts +30 -2
  230. package/src/overlay/menu/menu.tsx +1 -1
  231. package/src/overlay/popper/__stories__/base_args.ts +75 -0
  232. package/src/overlay/popper/__stories__/context_popper.stories.tsx +77 -0
  233. package/src/overlay/popper/__stories__/element_popper.stories.tsx +80 -0
  234. package/src/overlay/popper/__stories__/preview_popper.stories.tsx +73 -0
  235. package/src/overlay/popper/base/base_popper.tsx +55 -0
  236. package/src/overlay/popper/base/dismissal_decorator.tsx +80 -0
  237. package/src/overlay/popper/context_popper.tsx +43 -0
  238. package/src/overlay/popper/element_popper.tsx +42 -0
  239. package/src/overlay/popper/hooks/use_context_trigger.ts +50 -0
  240. package/src/overlay/popper/hooks/use_hover_trigger.ts +24 -0
  241. package/src/overlay/popper/hooks/use_restore_focus.ts +16 -0
  242. package/src/overlay/popper/{popper.stories.tsx → legacy/popper.stories.tsx} +11 -5
  243. package/src/overlay/popper/{popper.tsx → legacy/popper.tsx} +3 -2
  244. package/src/overlay/popper/preview_popper.tsx +54 -0
  245. package/src/overlay/tethered/__stories__/element/element_tethered.stories.tsx +57 -0
  246. package/src/overlay/tethered/__stories__/element/element_tethered_stories.module.css +14 -0
  247. package/src/overlay/tethered/__stories__/shared/base_story_config.ts +52 -0
  248. package/src/overlay/tethered/__stories__/shared/components/sb_point.module.css +20 -0
  249. package/src/overlay/tethered/__stories__/shared/components/sb_point.tsx +34 -0
  250. package/src/overlay/tethered/__stories__/shared/components/sb_reference_points.tsx +54 -0
  251. package/src/overlay/tethered/__stories__/tethered/tethered.stories.tsx +90 -0
  252. package/src/overlay/tethered/__stories__/tethered/tethered_stories.module.css +25 -0
  253. package/src/overlay/tethered/element_tethered.tsx +62 -0
  254. package/src/overlay/tethered/hooks/calculate_position.ts +110 -0
  255. package/src/overlay/tethered/hooks/useTether.ts +85 -0
  256. package/src/overlay/tethered/tethered.module.css +8 -0
  257. package/src/overlay/tethered/tethered.tsx +72 -0
  258. package/src/overlay/tethered/types.ts +2 -0
  259. package/src/stacks/box/box.tsx +8 -2
  260. package/src/stacks/h_stack.stories.tsx +2 -2
  261. package/src/stacks/v_stack.stories.tsx +2 -2
  262. package/src/surfaces/card/card.stories.tsx +64 -0
  263. package/src/surfaces/card/card.tsx +4 -4
  264. package/src/surfaces/card/card_stories.module.css +13 -0
  265. package/src/surfaces/index.ts +4 -2
  266. package/src/surfaces/modal/__stories__/modal.stories.tsx +31 -28
  267. package/src/surfaces/modal/modal.module.css +2 -2
  268. package/src/surfaces/modal/modal.tsx +16 -11
  269. package/src/surfaces/panel/__stories__/panel.stories.tsx +1 -1
  270. package/src/surfaces/panel/v_panel.tsx +8 -53
  271. package/src/surfaces/pop_confirm/pop_confirm.stories.tsx +70 -0
  272. package/src/surfaces/pop_confirm/pop_confirm.tsx +30 -0
  273. package/src/surfaces/popconfirm/pop_confirm.tsx +18 -0
  274. package/src/surfaces/popover/popover.tsx +1 -1
  275. package/src/surfaces/tooltip/tooltip.stories.tsx +54 -0
  276. package/src/surfaces/tooltip/tooltip.tsx +59 -0
  277. package/src/surfaces/window/window.stories.tsx +51 -4
  278. package/src/surfaces/window/window.tsx +19 -7
  279. package/src/themes/themes/ergo/__stories__/components/tone_picker/sb_tone_picker.tsx +7 -9
  280. package/src/themes/themes/ergo/__stories__/material.stories.tsx +2 -6
  281. package/src/themes/themes/ergo/__stories__/sb_materials.module.css +29 -21
  282. package/src/themes/themes/ergo/ergo_theme.css +166 -158
  283. package/src/typography/title/title.tsx +22 -18
  284. package/src/utils/click_away_listener.tsx +1 -1
  285. package/src/utils/dnd/__stories__/draggable.stories.tsx +48 -0
  286. package/src/utils/dnd/__stories__/draggable_stories.module.css +21 -0
  287. package/src/utils/{__stories__ → dnd/__stories__}/use_draggable.stories.tsx +15 -10
  288. package/src/utils/dnd/context.ts +24 -0
  289. package/src/utils/dnd/draggable/draggable.module.css +8 -0
  290. package/src/utils/dnd/draggable/draggable.tsx +42 -0
  291. package/src/utils/dnd/handle.tsx +32 -0
  292. package/src/utils/dnd/hooks/use_drag_container.ts +42 -0
  293. package/src/utils/{hooks → dnd/hooks}/use_draggable.ts +23 -17
  294. package/src/utils/dnd/types.ts +6 -0
  295. package/src/utils/index.ts +7 -5
  296. package/src/utils/mouse_leave_region.tsx +38 -0
  297. package/src/utils/types/dimensions.ts +13 -1
  298. package/tsconfig.json +3 -0
  299. package/dist/overlay/popper/popper.d.ts.map +0 -1
  300. package/dist/overlay/popper/popper.js.map +0 -1
  301. package/dist/overlay/tooltip/tooltip.d.ts +0 -7
  302. package/dist/overlay/tooltip/tooltip.d.ts.map +0 -1
  303. package/dist/overlay/tooltip/tooltip.js +0 -20
  304. package/dist/overlay/tooltip/tooltip.js.map +0 -1
  305. package/dist/panel.module-DwGKncon.js +0 -5
  306. package/dist/panel.module-DwGKncon.js.map +0 -1
  307. package/dist/title.module-B16de2jd.js +0 -5
  308. package/dist/title.module-B16de2jd.js.map +0 -1
  309. package/dist/utils/hooks/use_draggable.d.ts.map +0 -1
  310. package/dist/utils/hooks/use_draggable.js +0 -30
  311. package/dist/utils/hooks/use_draggable.js.map +0 -1
  312. package/src/overlay/tooltip/tooltip.stories.tsx +0 -22
  313. package/src/overlay/tooltip/tooltip.tsx +0 -24
  314. /package/dist/{panel.css → h_panel.css} +0 -0
  315. /package/dist/overlay/popper/{popper.d.ts → legacy/popper.d.ts} +0 -0
  316. /package/src/overlay/popper/{popper.module.css → legacy/popper.module.css} +0 -0
  317. /package/src/{overlay → surfaces}/tooltip/tooltip.module.css +0 -0
@@ -1,13 +1,15 @@
1
- export * from './body/h_body.js';
2
- export * from './body/v_body.js';
3
1
  export * from './column/column.js';
4
2
  export * from './divider/divider.js';
5
- export * from './footer/footer.js';
6
3
  export * from './grid/grid.js';
7
- export * from './header/header.js';
8
4
  export * from './list/item.js';
9
5
  export * from './list/list.js';
10
6
  export * from './list/section_header.js';
11
7
  export * from './sidebar_end/sidebar_end.js';
12
8
  export * from './sidebar_start/sidebar_start.js';
13
- export * from './utility_bar/utility_bar.js';
9
+ // Scaffold
10
+ export { Scaffold, type ScaffoldProps } from './scaffold/scaffold.js';
11
+ export { HBody, type HBodyProps } from './body/h_body.js';
12
+ export { VBody, type VBodyProps } from './body/v_body.js';
13
+ export { Footer, type FooterProps } from './footer/footer.js';
14
+ export { Header, type HeaderProps } from './header/header.js';
15
+ export { UtilityBar, type UtilityBarProps } from './utility_bar/utility_bar.js';
@@ -0,0 +1,5 @@
1
+ .scaffold-stack {
2
+ width: 100%;
3
+ height: 100%;
4
+ overflow: auto;
5
+ }
@@ -0,0 +1,60 @@
1
+ import React from 'react';
2
+ import { clsx } from 'clsx';
3
+ import { Box, type BoxProps } from '../../stacks/box/box.js';
4
+ import type { Alignment } from '../../stacks/types/alignment.js';
5
+ import { VStack } from '../../stacks/v_stack.js';
6
+ // Styles
7
+ import styles from './scaffold.module.css';
8
+
9
+ export interface ScaffoldProps extends Omit<BoxProps, 'as'> {
10
+ vAlign?: Alignment;
11
+ hAlign?: Alignment;
12
+ }
13
+
14
+ export const Scaffold = React.forwardRef<HTMLElement, ScaffoldProps>(function Scaffold(
15
+ {
16
+ children,
17
+ width,
18
+ height = '100%',
19
+ minWidth,
20
+ maxWidth,
21
+ minHeight,
22
+ maxHeight,
23
+ hAlign,
24
+ vAlign = 'start',
25
+ className,
26
+ ...props
27
+ }: ScaffoldProps,
28
+ ref
29
+ ) {
30
+ return (
31
+ <Box
32
+ ref={ref}
33
+ width={width}
34
+ height={height}
35
+ minWidth={minWidth}
36
+ maxWidth={maxWidth}
37
+ minHeight={minHeight}
38
+ maxHeight={maxHeight}
39
+ data-h-alignment={hAlign}
40
+ data-v-alignment={vAlign}
41
+ className={clsx(className, 'tcn-scaffold')}
42
+ {...props}
43
+ >
44
+ <VStack
45
+ as="section"
46
+ minWidth={minWidth}
47
+ maxWidth={maxWidth}
48
+ minHeight={minHeight}
49
+ maxHeight={maxHeight}
50
+ hAlign={hAlign}
51
+ vAlign={vAlign}
52
+ ref={ref}
53
+ className={clsx(styles['scaffold-stack'], 'tcn-scaffold-stack')}
54
+ zIndex={0}
55
+ >
56
+ {children}
57
+ </VStack>
58
+ </Box>
59
+ );
60
+ });
@@ -1,7 +1,4 @@
1
1
  .utility-bar {
2
2
  width: 100%;
3
3
  min-height: 0;
4
- border-bottom: 1px solid rgb(221, 221, 221);
5
- padding: var(--padding-medium);
6
- gap: var(--gap-medium);
7
4
  }
@@ -0,0 +1,5 @@
1
+ .frame {
2
+ padding: 0;
3
+ border: none;
4
+ background: none;
5
+ }
@@ -0,0 +1,40 @@
1
+ import { ZStack } from '../../stacks/z_stack.js';
2
+ import { Frame, type FrameOwnProps } from './frame.js';
3
+ import { DragHandle } from '../../utils/dnd/handle.js';
4
+ import { Title } from '../../typography/title/title.js';
5
+ import { BodyText } from '../../typography/index.js';
6
+ import { Header } from '../../layouts/index.js';
7
+ import styles from './frame_stories.module.css';
8
+ export default {
9
+ title: 'Overlays/Floating/Frame',
10
+ component: Frame,
11
+ tags: ['autodocs'],
12
+
13
+ args: {
14
+ isOpen: true,
15
+ draggable: true,
16
+ veil: false,
17
+ },
18
+ };
19
+
20
+ export const FrameStory = (args: Omit<FrameOwnProps, 'children'>) => {
21
+ return (
22
+ <ZStack height="100%" width="100%" minHeight="600px">
23
+ <Frame
24
+ width="300px"
25
+ height="300px"
26
+ className={styles['sb-frame-container']}
27
+ {...args}
28
+ >
29
+ <Header className={styles['sb-frame-header']}>
30
+ <Title> This is a frame</Title>
31
+ </Header>
32
+ <DragHandle>
33
+ <Header className={styles['sb-frame-header']}>
34
+ <BodyText> You can drag here.</BodyText>
35
+ </Header>
36
+ </DragHandle>
37
+ </Frame>
38
+ </ZStack>
39
+ );
40
+ };
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import { ZStack, type ZStackProps } from '../../stacks/index.js';
3
+ import { Portal } from '../portal/portal.js';
4
+ import { Draggable } from '../../utils/dnd/draggable/draggable.js';
5
+
6
+ // Styles
7
+ import styles from './frame.module.css';
8
+ import { clsx } from 'clsx';
9
+
10
+ export interface FrameOwnProps {
11
+ isOpen?: boolean;
12
+ children?: React.ReactNode;
13
+ draggable?: boolean;
14
+ veil?: boolean;
15
+ }
16
+
17
+ export type FrameProps = ZStackProps & FrameOwnProps;
18
+
19
+ export const Frame = React.forwardRef<HTMLDialogElement, FrameProps>(function Frame(
20
+ {
21
+ children,
22
+ isOpen = false,
23
+ draggable = true,
24
+ veil = false,
25
+ className,
26
+ ...rest
27
+ }: FrameProps,
28
+ ref
29
+ ) {
30
+ if (!isOpen) {
31
+ return null;
32
+ }
33
+
34
+ return (
35
+ <Portal>
36
+ <ZStack width="100%" height="100%" data-is-veil={veil} className="tcn-frame-veil">
37
+ <Draggable draggable={draggable}>
38
+ <ZStack
39
+ as="dialog"
40
+ ref={ref}
41
+ className={clsx(styles['frame'], 'tcn-frame', className)}
42
+ {...rest}
43
+ >
44
+ {children}
45
+ </ZStack>
46
+ </Draggable>
47
+ </ZStack>
48
+ </Portal>
49
+ );
50
+ });
@@ -0,0 +1,14 @@
1
+ .sb-frame-header {
2
+ background: var(--accent-color);
3
+ color: white;
4
+ font-weight: bold;
5
+ border: 2px solid black;
6
+ padding: var(--padding-medium);
7
+ border-radius: var(--shape-radius-medium);
8
+ }
9
+
10
+ .sb-frame-container {
11
+ background: #f7e9fe;
12
+ padding: var(--padding-medium);
13
+ border-radius: var(--shape-radius-large);
14
+ }
@@ -1,5 +1,33 @@
1
1
  export * from './portal/portal.js';
2
2
  export * from './context_menu/context_menu.js';
3
3
  export * from './menu/menu.js';
4
- export * from './tooltip/tooltip.js';
5
- export * from './popper/popper.js';
4
+
5
+ export { Frame, type FrameOwnProps, type FrameProps } from './frame/frame.js';
6
+ export {
7
+ ElementTethered,
8
+ type ElementTetheredProps,
9
+ } from './tethered/element_tethered.js';
10
+ export { Tethered, type TetheredProps } from './tethered/tethered.js';
11
+ export { type HorizontalTether, type VerticalTether } from './tethered/types.js';
12
+ export * from './popper/legacy/popper.js';
13
+ export {
14
+ PopperDismissal,
15
+ type PopperDismissalDecoratorProps,
16
+ } from './popper/base/dismissal_decorator.js';
17
+ export {
18
+ PreviewPopper,
19
+ type PreviewPopperProps,
20
+ } from './popper/preview_popper.js';
21
+ export {
22
+ ContextPopper,
23
+ type ContextPopperProps,
24
+ } from './popper/context_popper.js';
25
+ export {
26
+ ElementPopper,
27
+ type ElementPopperProps,
28
+ } from './popper/element_popper.js';
29
+ export {
30
+ type BasePopperOwnProps,
31
+ type BasePopperProps,
32
+ BasePopper,
33
+ } from './popper/base/base_popper.js';
@@ -4,7 +4,7 @@ import { HStack } from '../../stacks/h_stack.js';
4
4
  import { VStack } from '../../stacks/v_stack.js';
5
5
  import type { HStackProps } from '../../stacks/h_stack.js';
6
6
  import type { VStackProps } from '../../stacks/v_stack.js';
7
- import { Popper, type PopperProps } from '../../overlay/popper/popper.js';
7
+ import { Popper, type PopperProps } from '../popper/legacy/popper.js';
8
8
  import React, { useLayoutEffect, useRef, useState } from 'react';
9
9
  import styles from './menu.module.css';
10
10
  import { clsx } from 'clsx';
@@ -0,0 +1,75 @@
1
+ import { type ArgTypes } from '@storybook/react-vite';
2
+ import { PopperDismissal } from '../base/dismissal_decorator.js';
3
+ import type { BasePopperProps } from '../base/base_popper.js';
4
+ import type { BaseTetheredOwnProps } from '../../tethered/tethered.js';
5
+
6
+ export type SB_PopoverStoryProps = Pick<
7
+ BasePopperProps,
8
+ 'restoreFocus' | 'dismissals' | 'veil'
9
+ > &
10
+ BaseTetheredOwnProps;
11
+
12
+ export const SBPopperInitialArgs: SB_PopoverStoryProps = {
13
+ verticalAnchor: 'top',
14
+ horizontalAnchor: 'center',
15
+ verticalOrigin: 'bottom',
16
+ horizontalOrigin: 'center',
17
+ verticalOffset: 0,
18
+ horizontalOffset: 0,
19
+ restoreFocus: false,
20
+ veil: false,
21
+ };
22
+
23
+ export const SBPopperBaseArgs: ArgTypes<SB_PopoverStoryProps> = {
24
+ verticalAnchor: {
25
+ options: ['top', 'center', 'bottom'],
26
+ control: { type: 'radio' },
27
+ description: 'The anchor to position the popper vertically.',
28
+ },
29
+ horizontalAnchor: {
30
+ options: ['start', 'center', 'end'],
31
+ control: { type: 'radio' },
32
+ description: 'The anchor to position the popper horizontally.',
33
+ },
34
+ verticalOrigin: {
35
+ options: ['top', 'center', 'bottom'],
36
+ control: { type: 'radio' },
37
+ description: 'The origin to position the popper vertically.',
38
+ },
39
+ horizontalOrigin: {
40
+ options: ['start', 'center', 'end'],
41
+ control: { type: 'radio' },
42
+ description: 'The origin to position the popper horizontally.',
43
+ },
44
+ verticalOffset: {
45
+ control: { type: 'number' },
46
+ defaultValue: 0,
47
+ description: 'The offset to position the popper vertically.',
48
+ },
49
+ horizontalOffset: {
50
+ control: { type: 'number' },
51
+ defaultValue: 0,
52
+ description: 'The offset to position the popper horizontally.',
53
+ },
54
+ restoreFocus: {
55
+ control: { type: 'boolean' },
56
+ defaultValue: false,
57
+ description: 'Whether to restore focus when the popper is closed.',
58
+ },
59
+ dismissals: {
60
+ options: [
61
+ PopperDismissal.SCROLL_AWAY,
62
+ PopperDismissal.CLICK_AWAY,
63
+ PopperDismissal.MOUSE_LEAVE,
64
+ PopperDismissal.VEIL_CLICK,
65
+ ],
66
+ control: { type: 'multi-select' },
67
+ defaultValue: [PopperDismissal.SCROLL_AWAY, PopperDismissal.CLICK_AWAY],
68
+ description: 'The dismissals to apply to the popper.',
69
+ },
70
+ veil: {
71
+ control: { type: 'boolean' },
72
+ defaultValue: false,
73
+ description: 'Whether to display a veil when the popper is open.',
74
+ },
75
+ };
@@ -0,0 +1,77 @@
1
+ import { Meta } from '@storybook/react-vite';
2
+ import React, { useRef } from 'react';
3
+ import {
4
+ ContextPopper as ContextPopperComponent,
5
+ ContextPopperProps,
6
+ } from '../context_popper.js';
7
+ import { StyleBox } from '../../../stacks/story_components/style_box.js';
8
+ import { VStack } from '../../../stacks/v_stack.js';
9
+ import { BodyText } from '../../../typography/index.js';
10
+ import { HStack } from '../../../stacks/h_stack.js';
11
+ import { SBPopperBaseArgs, SBPopperInitialArgs } from './base_args.js';
12
+ import { PopperDismissal } from '../base/dismissal_decorator.js';
13
+
14
+ type ElementPopoverStoryProps = Omit<ContextPopperProps, 'anchorElement'> & {
15
+ clickAwayRefs?: React.RefObject<HTMLElement | null>[];
16
+ };
17
+
18
+ const meta: Meta<typeof ContextPopperComponent> = {
19
+ title: 'Overlays/Popper/Context Popper',
20
+ component: ContextPopperComponent,
21
+ tags: ['autodocs'],
22
+ parameters: {
23
+ docs: {
24
+ description: {
25
+ component: 'A popper component that displays a content in a portal.',
26
+ },
27
+ },
28
+ },
29
+ argTypes: SBPopperBaseArgs,
30
+ args: {
31
+ ...SBPopperInitialArgs,
32
+ dismissals: [PopperDismissal.CLICK_AWAY, PopperDismissal.SCROLL_AWAY],
33
+ },
34
+ };
35
+
36
+ export default meta;
37
+
38
+ export function ContextPopper(props: ElementPopoverStoryProps) {
39
+ const anchorElement = useRef<HTMLButtonElement>(null);
40
+
41
+ return (
42
+ <VStack height="100%" width="100%" minHeight="600px" hAlign="center" vAlign="center">
43
+ <HStack
44
+ ref={anchorElement}
45
+ minWidth="200px"
46
+ minHeight="100px"
47
+ vAlign="center"
48
+ hAlign="center"
49
+ style={{ cursor: 'context-menu', background: 'blue', color: 'white' }}
50
+ >
51
+ Right-click me!
52
+ </HStack>
53
+ <ContextPopperComponent
54
+ anchorElement={anchorElement}
55
+ verticalAnchor={props.verticalAnchor}
56
+ verticalOrigin={props.verticalOrigin}
57
+ verticalOffset={props.verticalOffset}
58
+ horizontalAnchor={props.horizontalAnchor}
59
+ horizontalOrigin={props.horizontalOrigin}
60
+ horizontalOffset={props.horizontalOffset}
61
+ restoreFocus={props.restoreFocus}
62
+ dismissals={props.dismissals}
63
+ veil={props.veil}
64
+ >
65
+ <StyleBox
66
+ className="surface-primary"
67
+ boxShadow="0 0 10px 1px rgba(0,0,0,0.45)"
68
+ backgroundColor="white"
69
+ padding="8px"
70
+ borderRadius={'8px'}
71
+ >
72
+ <BodyText selectable>Hello World</BodyText>
73
+ </StyleBox>
74
+ </ContextPopperComponent>
75
+ </VStack>
76
+ );
77
+ }
@@ -0,0 +1,80 @@
1
+ import { Meta } from '@storybook/react-vite';
2
+ import React, { useRef, useState } from 'react';
3
+ import {
4
+ ElementPopper as ElementPopperComponent,
5
+ ElementPopperProps,
6
+ } from '../element_popper.js';
7
+ import { StyleBox } from '../../../stacks/story_components/style_box.js';
8
+ import { VStack } from '../../../stacks/v_stack.js';
9
+ import { BodyText } from '../../../typography/index.js';
10
+ import { Button } from '../../../actions/index.js';
11
+ import { SBPopperBaseArgs, SBPopperInitialArgs } from './base_args.js';
12
+
13
+ type ElementPopoverStoryProps = Omit<
14
+ ElementPopperProps,
15
+ 'anchorElement' | 'open' | 'onClose' | 'isScrollAwayException'
16
+ > & {
17
+ clickAwayRefs?: React.RefObject<HTMLElement | null>[];
18
+ isScrollAwayException?: boolean;
19
+ };
20
+
21
+ const meta: Meta<typeof ElementPopperComponent> = {
22
+ title: 'Overlays/Popper/Element Popper',
23
+ component: ElementPopperComponent,
24
+ tags: ['autodocs'],
25
+ parameters: {
26
+ docs: {
27
+ description: {
28
+ component: 'A popper component that displays a content in a portal.',
29
+ },
30
+ },
31
+ },
32
+ argTypes: SBPopperBaseArgs,
33
+ args: SBPopperInitialArgs,
34
+ };
35
+
36
+ export default meta;
37
+
38
+ export function ElementPopper(props: ElementPopoverStoryProps) {
39
+ const [isOpen, setIsOpen] = useState(false);
40
+ const anchorElement = useRef<HTMLButtonElement>(null);
41
+
42
+ function open() {
43
+ setIsOpen(true);
44
+ }
45
+
46
+ function close() {
47
+ setIsOpen(false);
48
+ }
49
+
50
+ return (
51
+ <VStack height="100%" width="100%" minHeight="600px" hAlign="center" vAlign="center">
52
+ <Button onClick={open} ref={anchorElement}>
53
+ Open
54
+ </Button>
55
+ <ElementPopperComponent
56
+ anchorElement={anchorElement}
57
+ open={isOpen}
58
+ onDismissal={close}
59
+ verticalAnchor={props.verticalAnchor}
60
+ verticalOrigin={props.verticalOrigin}
61
+ verticalOffset={props.verticalOffset}
62
+ horizontalAnchor={props.horizontalAnchor}
63
+ horizontalOrigin={props.horizontalOrigin}
64
+ horizontalOffset={props.horizontalOffset}
65
+ restoreFocus={props.restoreFocus}
66
+ dismissals={props.dismissals}
67
+ >
68
+ <StyleBox
69
+ className="surface-primary"
70
+ boxShadow="0 0 10px 1px rgba(0,0,0,0.45)"
71
+ backgroundColor="white"
72
+ padding="8px"
73
+ borderRadius={'8px'}
74
+ >
75
+ <BodyText selectable>Hello World</BodyText>
76
+ </StyleBox>
77
+ </ElementPopperComponent>
78
+ </VStack>
79
+ );
80
+ }
@@ -0,0 +1,73 @@
1
+ import { Meta } from '@storybook/react-vite';
2
+ import React, { useRef } from 'react';
3
+ import {
4
+ PreviewPopper as PreviewPopperComponent,
5
+ PreviewPopperProps,
6
+ } from '../preview_popper.js';
7
+ import { StyleBox } from '../../../stacks/story_components/style_box.js';
8
+ import { VStack } from '../../../stacks/v_stack.js';
9
+ import { BodyText } from '../../../typography/index.js';
10
+ import { SBPopperBaseArgs, SBPopperInitialArgs } from './base_args.js';
11
+
12
+ type ElementPopoverStoryProps = Omit<PreviewPopperProps, 'anchorElement'> & {
13
+ clickAwayRefs?: React.RefObject<HTMLElement | null>[];
14
+ };
15
+
16
+ const meta: Meta<typeof PreviewPopperComponent> = {
17
+ title: 'Overlays/Popper/Preview Popper',
18
+ component: PreviewPopperComponent,
19
+ tags: ['autodocs'],
20
+ parameters: {
21
+ docs: {
22
+ description: {
23
+ component: 'A popper component that displays a content in a portal.',
24
+ },
25
+ },
26
+ },
27
+ argTypes: SBPopperBaseArgs,
28
+ args: SBPopperInitialArgs,
29
+ };
30
+
31
+ export default meta;
32
+
33
+ export function SBPreviewPopper(props: ElementPopoverStoryProps) {
34
+ const anchorElement = useRef<HTMLDivElement>(null);
35
+
36
+ return (
37
+ <VStack height="100%" width="100%" minHeight="600px" hAlign="center" vAlign="center">
38
+ <StyleBox
39
+ ref={anchorElement}
40
+ backgroundColor="red"
41
+ padding="8px"
42
+ borderRadius={'8px'}
43
+ width="200px"
44
+ height="100px"
45
+ display="flex"
46
+ justifyContent="center"
47
+ alignItems="center"
48
+ >
49
+ Hover to open
50
+ </StyleBox>
51
+ <PreviewPopperComponent
52
+ anchorElement={anchorElement}
53
+ verticalAnchor={props.verticalAnchor}
54
+ verticalOrigin={props.verticalOrigin}
55
+ verticalOffset={props.verticalOffset}
56
+ horizontalAnchor={props.horizontalAnchor}
57
+ horizontalOrigin={props.horizontalOrigin}
58
+ horizontalOffset={props.horizontalOffset}
59
+ restoreFocus={props.restoreFocus}
60
+ >
61
+ <StyleBox
62
+ className="surface-primary"
63
+ boxShadow="0 0 10px 1px rgba(0,0,0,0.45)"
64
+ backgroundColor="white"
65
+ padding="8px"
66
+ borderRadius={'8px'}
67
+ >
68
+ <BodyText selectable>Hello World</BodyText>
69
+ </StyleBox>
70
+ </PreviewPopperComponent>
71
+ </VStack>
72
+ );
73
+ }
@@ -0,0 +1,55 @@
1
+ import { type PropsWithChildren } from 'react';
2
+ import { useRestoreFocus } from '../hooks/use_restore_focus.js';
3
+ import {
4
+ PopperDismissalDecorator,
5
+ type PopperDismissalDecoratorProps,
6
+ } from './dismissal_decorator.js';
7
+
8
+ export interface BasePopperOwnProps {
9
+ open: boolean;
10
+ restoreFocus?: boolean;
11
+ veil?: boolean;
12
+ }
13
+
14
+ export interface BasePopperProps
15
+ extends BasePopperOwnProps,
16
+ PopperDismissalDecoratorProps {}
17
+
18
+ export const BasePopper: React.FC<PropsWithChildren<BasePopperProps>> = ({
19
+ restoreFocus = false,
20
+ open,
21
+ onDismissal,
22
+ isException,
23
+ dismissals = [],
24
+ acceptedRefs,
25
+ // TODO: add veil
26
+ // veil = false,
27
+ children,
28
+ }) => {
29
+ useRestoreFocus(open, restoreFocus);
30
+
31
+ if (!open) return null;
32
+
33
+ // if (veil) {
34
+ // content = (
35
+ // <div
36
+ // // TODO: add ref and onClick
37
+ // // ref={veilRef}
38
+ // // onClick={e => veilRef.current === e.target && onVeilClick && onVeilClick(e)}
39
+ // >
40
+ // {content}
41
+ // </div>
42
+ // );
43
+ // }
44
+
45
+ return (
46
+ <PopperDismissalDecorator
47
+ dismissals={dismissals}
48
+ onDismissal={onDismissal}
49
+ isException={isException}
50
+ acceptedRefs={acceptedRefs}
51
+ >
52
+ {children}
53
+ </PopperDismissalDecorator>
54
+ );
55
+ };