@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,12 @@
1
1
  import { useState } from 'react';
2
2
  import { Button, SlimButton } from '../../../actions/index.js';
3
- import { Footer, Header, VBody } from '../../../layouts/index.js';
4
- import { Portal } from '../../../overlay/index.js';
3
+ import { Footer, Header, UtilityBar, VBody } from '../../../layouts/index.js';
5
4
  import { ZStack } from '../../../stacks/z_stack.js';
6
5
  import { BodyText, Title } from '../../../typography/index.js';
7
6
  import { Modal } from '../modal.js';
8
- import { ClickAwayListener } from '../../../utils/index.js';
9
7
  import { Spacer } from '../../../stacks/index.js';
10
8
  import { CrossIcon } from '@tcn/icons/cross_icon.js';
9
+ import { BugIcon } from '@tcn/icons/bug_icon.js';
11
10
 
12
11
  export default {
13
12
  title: 'Surfaces/Modal',
@@ -21,34 +20,38 @@ export const ModalStory = () => {
21
20
  function toggle() {
22
21
  setIsOpen(!isOpen);
23
22
  }
23
+
24
24
  return (
25
25
  <ZStack height="100%" width="100%" minHeight="600px">
26
26
  <button onClick={toggle}>{isOpen ? 'Close' : 'Open'}</button>
27
- {isOpen && (
28
- <Portal>
29
- <ZStack width="100%" height="100%" className="tcn-veil">
30
- <ClickAwayListener onClickAway={toggle}>
31
- <Modal width="400px" height="500px">
32
- <Header>
33
- <Title>Modal Title</Title>
34
- <Spacer />
35
- <SlimButton hierarchy="tertiary" size="md" onClick={toggle}>
36
- <CrossIcon />
37
- </SlimButton>
38
- </Header>
39
- <VBody>
40
- <BodyText>This is a modal</BodyText>
41
- </VBody>
42
- <Footer>
43
- <Spacer />
44
- <Button hierarchy="secondary">Cancel</Button>
45
- <Button hierarchy="primary">Save</Button>
46
- </Footer>
47
- </Modal>
48
- </ClickAwayListener>
49
- </ZStack>
50
- </Portal>
51
- )}
27
+
28
+ <Modal isOpen={isOpen} width="400px" height="500px">
29
+ <Header>
30
+ <Title>Modal Title</Title>
31
+ <Spacer />
32
+ <SlimButton hierarchy="tertiary" size="md" onClick={toggle}>
33
+ <CrossIcon />
34
+ </SlimButton>
35
+ </Header>
36
+ <UtilityBar>
37
+ <Title>Utility Bar</Title>
38
+ <Spacer />
39
+ <SlimButton hierarchy="tertiary">
40
+ <BugIcon />
41
+ </SlimButton>
42
+ <SlimButton hierarchy="tertiary">
43
+ <BugIcon />
44
+ </SlimButton>
45
+ </UtilityBar>
46
+ <VBody>
47
+ <BodyText>This is a modal</BodyText>
48
+ </VBody>
49
+ <Footer>
50
+ <Spacer />
51
+ <Button hierarchy="secondary">Cancel</Button>
52
+ <Button hierarchy="primary">Save</Button>
53
+ </Footer>
54
+ </Modal>
52
55
  </ZStack>
53
56
  );
54
57
  };
@@ -1,4 +1,4 @@
1
1
  .modal {
2
- width: 100%;
3
- height: 100%;
2
+ width: auto;
3
+ height: auto;
4
4
  }
@@ -1,22 +1,27 @@
1
- import { VStack, type VStackProps } from '../../stacks/v_stack.js';
2
1
  import { clsx } from 'clsx';
3
2
  import React from 'react';
3
+ import { Frame, type FrameOwnProps } from '../../overlay/frame/frame.js';
4
+ import { Scaffold, type ScaffoldProps } from '../../layouts/scaffold/scaffold.js';
5
+
6
+ // Styles
4
7
  import styles from './modal.module.css';
5
8
 
6
- export type ModalProps = Omit<VStackProps<HTMLDialogElement>, 'as'>;
9
+ export type ModalProps = FrameOwnProps & ScaffoldProps;
7
10
 
8
- export const Modal = React.forwardRef<HTMLDialogElement, ModalProps>(function Modal(
9
- { children, className, ...props }: ModalProps,
11
+ export const Modal = React.forwardRef<HTMLElement, ModalProps>(function Modal(
12
+ { children, className, isOpen, draggable = false, veil = true, ...props }: ModalProps,
10
13
  ref
11
14
  ) {
12
15
  return (
13
- <VStack
14
- ref={ref}
15
- className={clsx(styles['modal'], 'tcn-modal', className)}
16
- as="dialog"
17
- {...props}
16
+ <Frame
17
+ isOpen={isOpen}
18
+ draggable={draggable}
19
+ veil={veil}
20
+ className={clsx(styles['modal'], 'tcn-surface', 'tcn-modal', className)}
18
21
  >
19
- {children}
20
- </VStack>
22
+ <Scaffold ref={ref} {...props}>
23
+ {children}
24
+ </Scaffold>
25
+ </Frame>
21
26
  );
22
27
  });
@@ -24,7 +24,7 @@ export const Default = () => {
24
24
  <div className={styles['stories-container']}>
25
25
  <VPanel maxHeight="600px">
26
26
  <Header>
27
- <Title>Panel Primary Header</Title>
27
+ <Title emphasis="strong">Panel Primary Header</Title>
28
28
  <Spacer />
29
29
  <SlimButton hierarchy="tertiary">
30
30
  <GridOneIcon />
@@ -1,65 +1,20 @@
1
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 './panel.module.css';
2
+ import { Scaffold, type ScaffoldProps } from '../../layouts/scaffold/scaffold.js';
3
+ import clsx from 'clsx';
8
4
 
9
- export interface VPanelProps extends Omit<BoxProps, 'as'> {
10
- vAlign?: Alignment;
11
- hAlign?: Alignment;
12
- }
5
+ export type VPanelProps = ScaffoldProps;
13
6
 
14
7
  export const VPanel = React.forwardRef<HTMLElement, VPanelProps>(function VPanel(
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
- }: VPanelProps,
8
+ { children, className, ...props }: VPanelProps,
28
9
  ref
29
10
  ) {
30
11
  return (
31
- <Box
12
+ <Scaffold
32
13
  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, 'panel', 'tcn-panel', 'tcn-v-panel')}
14
+ className={clsx('tcn-surface', 'tcn-panel', 'tcn-v-panel', className)}
42
15
  {...props}
43
16
  >
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(
54
- styles['panel-stack'],
55
- className,
56
- 'panel-stack',
57
- 'tcn-panel-stack'
58
- )}
59
- zIndex={0}
60
- >
61
- {children}
62
- </VStack>
63
- </Box>
17
+ {children}
18
+ </Scaffold>
64
19
  );
65
20
  });
@@ -0,0 +1,70 @@
1
+ import { useRef, useState } from 'react';
2
+ import { Button } from '../../actions/index.js';
3
+ import { Footer, Header, VBody } from '../../layouts/index.js';
4
+ import { HStack } from '../../stacks/h_stack.js';
5
+ import { PopConfirm as PopConfirmComponent } from './pop_confirm.js';
6
+ import { BodyText, Title } from '../../typography/index.js';
7
+ import { VStack } from '../../stacks/v_stack.js';
8
+ import { Spacer } from '../../stacks/spacer.js';
9
+
10
+ export default {
11
+ title: 'Surfaces/Pop Confirm',
12
+ component: PopConfirmComponent,
13
+ tags: ['autodocs'],
14
+ parameters: {
15
+ docs: {
16
+ description: {
17
+ component: 'A tooltip component that displays a tooltip when hovered.',
18
+ },
19
+ },
20
+ },
21
+ };
22
+
23
+ export const DefaultPopConfirm = () => {
24
+ const anchorRef = useRef<HTMLButtonElement>(null);
25
+ const [open, setOpen] = useState(false);
26
+
27
+ const cancel = () => {
28
+ setOpen(false);
29
+ };
30
+
31
+ const confirm = () => {
32
+ setOpen(false);
33
+ };
34
+
35
+ const prompt = () => {
36
+ setOpen(true);
37
+ };
38
+
39
+ return (
40
+ <VStack hAlign="center" vAlign="center" height="100%" width="100%">
41
+ <HStack hAlign="center" vAlign="center">
42
+ <Button ref={anchorRef} onClick={prompt}>
43
+ Click to Confirm
44
+ </Button>
45
+ <PopConfirmComponent
46
+ height={'200px'}
47
+ open={open}
48
+ onDismissal={cancel}
49
+ anchorElement={anchorRef}
50
+ >
51
+ <Header>
52
+ <Title>Confirmation Title</Title>
53
+ </Header>
54
+ <VBody>
55
+ <BodyText>Are you sure you want to confirm this action?</BodyText>
56
+ </VBody>
57
+ <Footer>
58
+ <Spacer />
59
+ <Button hierarchy="secondary" onClick={cancel}>
60
+ Cancel
61
+ </Button>
62
+ <Button hierarchy="primary" onClick={confirm}>
63
+ Confirm
64
+ </Button>
65
+ </Footer>
66
+ </PopConfirmComponent>
67
+ </HStack>
68
+ </VStack>
69
+ );
70
+ };
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import { clsx } from 'clsx';
3
+ import {
4
+ ElementPopper,
5
+ type ElementPopperProps,
6
+ } from '../../overlay/popper/element_popper.js';
7
+ import { Scaffold } from '../../layouts/index.js';
8
+ import { PopperDismissal } from '../../overlay/popper/base/dismissal_decorator.js';
9
+
10
+ export type PopConfirmProps = ElementPopperProps;
11
+
12
+ export const PopConfirm = React.forwardRef<HTMLDivElement, PopConfirmProps>(
13
+ function PopConfirm(
14
+ { children, className, dismissals = [PopperDismissal.CLICK_AWAY], ...props },
15
+ ref
16
+ ) {
17
+ return (
18
+ <ElementPopper
19
+ ref={ref}
20
+ className={clsx(className, 'tcn-pop-confirm')}
21
+ dismissals={dismissals}
22
+ {...props}
23
+ >
24
+ <Scaffold width={'100%'} height={'100%'}>
25
+ {children}
26
+ </Scaffold>
27
+ </ElementPopper>
28
+ );
29
+ }
30
+ );
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { clsx } from 'clsx';
3
+ import {
4
+ ElementPopper,
5
+ type ElementPopperProps,
6
+ } from '../../overlay/popper/element_popper.js';
7
+
8
+ export type PopConfirmProps = ElementPopperProps;
9
+
10
+ export const PopConfirm = React.forwardRef<HTMLDivElement, PopConfirmProps>(
11
+ function PopConfirm({ children, className, ...props }, ref) {
12
+ return (
13
+ <ElementPopper ref={ref} className={clsx(className, 'tcn-popconfirm')} {...props}>
14
+ {children}
15
+ </ElementPopper>
16
+ );
17
+ }
18
+ );
@@ -1,6 +1,6 @@
1
1
  import { clsx } from 'clsx';
2
2
  import { VStack } from '../../stacks/v_stack.js';
3
- import { Popper, type PopperProps } from '../../overlay/popper/popper.js';
3
+ import { Popper, type PopperProps } from '../../overlay/popper/legacy/popper.js';
4
4
  import { VStackProps } from '../../stacks/v_stack.js';
5
5
 
6
6
  export interface PopoverProps extends Omit<PopperProps, 'children'>, VStackProps {}
@@ -0,0 +1,54 @@
1
+ import { StyleBox } from '../../stacks/story_components/style_box.js';
2
+ import { BodyText } from '../../typography/index.js';
3
+ import { Tooltip as TooltipComponent } from './tooltip.js';
4
+
5
+ export default {
6
+ title: 'Surfaces/Tooltip',
7
+ component: TooltipComponent,
8
+ tags: ['autodocs'],
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component: 'A tooltip component that displays a tooltip when hovered.',
13
+ },
14
+ },
15
+ },
16
+ };
17
+
18
+ export const DefaultTooltip = () => {
19
+ return (
20
+ <TooltipComponent label={'Tooltip content'}>
21
+ <StyleBox
22
+ backgroundColor="red"
23
+ padding="8px"
24
+ borderRadius={'8px'}
25
+ width="200px"
26
+ height="100px"
27
+ display="flex"
28
+ justifyContent="center"
29
+ alignItems="center"
30
+ >
31
+ Hover to open
32
+ </StyleBox>
33
+ </TooltipComponent>
34
+ );
35
+ };
36
+
37
+ export const CustomTooltip = () => {
38
+ return (
39
+ <TooltipComponent label={<BodyText>Tooltip content</BodyText>}>
40
+ <StyleBox
41
+ backgroundColor="red"
42
+ padding="8px"
43
+ borderRadius={'8px'}
44
+ width="200px"
45
+ height="100px"
46
+ display="flex"
47
+ justifyContent="center"
48
+ alignItems="center"
49
+ >
50
+ Hover to open
51
+ </StyleBox>
52
+ </TooltipComponent>
53
+ );
54
+ };
@@ -0,0 +1,59 @@
1
+ import { clsx } from 'clsx';
2
+ import React, { isValidElement, cloneElement, useRef } from 'react';
3
+ import styles from './tooltip.module.css';
4
+ import {
5
+ PreviewPopper,
6
+ type PreviewPopperProps,
7
+ } from '../../overlay/popper/preview_popper.js';
8
+ import { HStack } from '../../stacks/h_stack.js';
9
+
10
+ export interface TooltipProps extends Omit<PreviewPopperProps, 'anchorElement'> {
11
+ /** The element that triggers the tooltip on hover */
12
+ children: React.ReactNode;
13
+ /** Content to display in the tooltip */
14
+ label: React.ReactNode;
15
+ }
16
+
17
+ export const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(function Tooltip(
18
+ {
19
+ children,
20
+ className,
21
+ verticalAnchor = 'top',
22
+ verticalOrigin = 'bottom',
23
+ horizontalAnchor = 'center',
24
+ horizontalOrigin = 'center',
25
+ label,
26
+ ...props
27
+ },
28
+ ref
29
+ ) {
30
+ const anchorRef = useRef<HTMLElement>(null);
31
+
32
+ // If children is a valid element, clone it and attach the ref
33
+ // Otherwise, wrap it in a span
34
+ const anchor = isValidElement(children) ? (
35
+ cloneElement(children, { ref: anchorRef } as React.Attributes)
36
+ ) : (
37
+ <HStack as="span" ref={anchorRef}>
38
+ {children}
39
+ </HStack>
40
+ );
41
+
42
+ return (
43
+ <>
44
+ {anchor}
45
+ <PreviewPopper
46
+ ref={ref}
47
+ anchorElement={anchorRef}
48
+ verticalAnchor={verticalAnchor}
49
+ verticalOrigin={verticalOrigin}
50
+ horizontalAnchor={horizontalAnchor}
51
+ horizontalOrigin={horizontalOrigin}
52
+ className={clsx(className, styles.tooltip, 'tcn-surface', 'tcn-tooltip')}
53
+ {...props}
54
+ >
55
+ {label}
56
+ </PreviewPopper>
57
+ </>
58
+ );
59
+ });
@@ -1,4 +1,13 @@
1
+ import { useState } from 'react';
1
2
  import { Window } from './window.js';
3
+ import { Footer, Header, UtilityBar, VBody } from '../../layouts/index.js';
4
+ import { BodyText, Title } from '../../typography/index.js';
5
+ import { Spacer } from '../../stacks/spacer.js';
6
+ import { Button, SlimButton } from '../../actions/index.js';
7
+ import { CrossIcon } from '@tcn/icons/cross_icon.js';
8
+ import { ZStack } from '../../stacks/z_stack.js';
9
+ import { DragHandle } from '../../utils/dnd/handle.js';
10
+ import { BugIcon } from '@tcn/icons/bug_icon.js';
2
11
 
3
12
  export default {
4
13
  title: 'Surfaces/Window',
@@ -6,10 +15,48 @@ export default {
6
15
  tags: ['autodocs'],
7
16
  };
8
17
 
9
- export const ModalStory = () => {
18
+ export const WindowStory = () => {
19
+ const [isOpen, setIsOpen] = useState(false);
20
+
21
+ function toggle() {
22
+ setIsOpen(!isOpen);
23
+ }
24
+
10
25
  return (
11
- <Window>
12
- <>window</>
13
- </Window>
26
+ <ZStack height="100%" width="100%" minHeight="600px">
27
+ <button onClick={toggle}>{isOpen ? 'Close' : 'Open'}</button>
28
+ <Window isOpen={isOpen} width="400px" height="500px">
29
+ <DragHandle>
30
+ <Header>
31
+ <Title>Window Title</Title>
32
+ <Spacer />
33
+ <SlimButton hierarchy="tertiary" size="md" onClick={toggle}>
34
+ <CrossIcon />
35
+ </SlimButton>
36
+ </Header>
37
+ </DragHandle>
38
+ <UtilityBar>
39
+ <Title>Utility Bar</Title>
40
+ <Spacer />
41
+ <SlimButton hierarchy="tertiary">
42
+ <BugIcon />
43
+ </SlimButton>
44
+ <SlimButton hierarchy="tertiary">
45
+ <BugIcon />
46
+ </SlimButton>
47
+ <SlimButton size="md" hierarchy="tertiary">
48
+ <BugIcon />
49
+ </SlimButton>
50
+ </UtilityBar>
51
+ <VBody>
52
+ <BodyText>This is a window</BodyText>
53
+ </VBody>
54
+ <Footer>
55
+ <Spacer />
56
+ <Button hierarchy="secondary">Cancel</Button>
57
+ <Button hierarchy="primary">Save</Button>
58
+ </Footer>
59
+ </Window>
60
+ </ZStack>
14
61
  );
15
62
  };
@@ -1,17 +1,29 @@
1
- import { VStack, type VStackProps } from '../../stacks/v_stack.js';
2
1
  import { clsx } from 'clsx';
3
2
  import React from 'react';
3
+ import { Frame, type FrameOwnProps } from '../../overlay/frame/frame.js';
4
+ import { Scaffold, type ScaffoldProps } from '../../layouts/scaffold/scaffold.js';
5
+
6
+ // Styles
4
7
  import styles from './window.module.css';
5
8
 
6
- export type WindowProps = Omit<VStackProps, 'as'>;
9
+ export type WindowProps = FrameOwnProps & ScaffoldProps;
7
10
 
8
- export const Window = React.forwardRef<HTMLDivElement, WindowProps>(function Window(
9
- { children, className, ...props }: WindowProps,
11
+ export const Window = React.forwardRef<HTMLElement, WindowProps>(function Window(
12
+ { children, className, isOpen, draggable = true, veil = false, ...props }: WindowProps,
10
13
  ref
11
14
  ) {
12
15
  return (
13
- <VStack ref={ref} className={clsx(styles.window, className, 'window')} {...props}>
14
- {children}
15
- </VStack>
16
+ <Frame
17
+ isOpen={isOpen}
18
+ draggable={draggable}
19
+ veil={veil}
20
+ className={clsx(styles['window'], 'tcn-surface', 'tcn-window', className)}
21
+ width="auto"
22
+ height="auto"
23
+ >
24
+ <Scaffold ref={ref} {...props}>
25
+ {children}
26
+ </Scaffold>
27
+ </Frame>
16
28
  );
17
29
  });
@@ -48,22 +48,20 @@ export const SB_TonePicker = () => {
48
48
  growWeight={1}
49
49
  paddingTop={theme.padding.md}
50
50
  paddingBottom={theme.padding.md}
51
+ vAlign="start"
52
+ hAlign="start"
51
53
  >
52
54
  <VStack
53
55
  height="100%"
54
56
  width="auto"
55
57
  gap={theme.gap.md}
56
58
  hAlign="start"
57
- minWidth="300px"
59
+ vAlign="start"
60
+ maxWidth="300px"
61
+ minWidth="200px"
58
62
  >
59
63
  <SectionHeader>Tone Picker (WIP)</SectionHeader>
60
- <List
61
- padding={theme.padding.md}
62
- maxWidth="200px"
63
- growWeight={1}
64
- height="100%"
65
- overflowY="auto"
66
- >
64
+ <List padding={theme.padding.md} growWeight={1} height="100%" overflowY="auto">
67
65
  {items.map(item => (
68
66
  <Item
69
67
  key={item.id}
@@ -75,7 +73,7 @@ export const SB_TonePicker = () => {
75
73
  ))}
76
74
  </List>
77
75
  </VStack>
78
- <VStack height="100%">
76
+ <VStack height="100%" minWidth="200px" growWeight={1}>
79
77
  <SB_ToneCard item={selectedItem || null} />
80
78
  </VStack>
81
79
  </HStack>
@@ -87,10 +87,6 @@ export const DynamicSurface = (args: {
87
87
  </Header>
88
88
  <SB_MaterialPicker handleSurfaceClick={handleSurfaceClick} />
89
89
  <VPanel
90
- // TODO: Find a better way to have typography inherit the on material color
91
- style={{
92
- color: 'inherit',
93
- }}
94
90
  minHeight="200px"
95
91
  maxHeight="700px"
96
92
  height="100%"
@@ -105,7 +101,7 @@ export const DynamicSurface = (args: {
105
101
  <SlimButton hierarchy="secondary">
106
102
  <PlusIcon />
107
103
  </SlimButton>
108
- <Divider vertical />
104
+ <Divider vertical length="md" />
109
105
  <SlimButton hierarchy="primary">
110
106
  <PlusIcon />
111
107
  </SlimButton>
@@ -119,7 +115,7 @@ export const DynamicSurface = (args: {
119
115
  <SlimButton hierarchy="secondary" disabled>
120
116
  <PlusIcon />
121
117
  </SlimButton>
122
- <Divider vertical />
118
+ <Divider vertical length="md" />
123
119
  <SlimButton hierarchy="primary" disabled>
124
120
  <PlusIcon />
125
121
  </SlimButton>