@stack-spot/portal-layout 0.0.65 → 1.0.0-stg.1768483038644

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/CHANGELOG.md +779 -0
  2. package/dist/Layout.d.ts +60 -8
  3. package/dist/Layout.d.ts.map +1 -1
  4. package/dist/Layout.js +59 -24
  5. package/dist/Layout.js.map +1 -1
  6. package/dist/LayoutOverlayManager.d.ts +274 -19
  7. package/dist/LayoutOverlayManager.d.ts.map +1 -1
  8. package/dist/LayoutOverlayManager.js +373 -82
  9. package/dist/LayoutOverlayManager.js.map +1 -1
  10. package/dist/WelcomeTour.d.ts +2 -0
  11. package/dist/WelcomeTour.d.ts.map +1 -0
  12. package/dist/WelcomeTour.js +8 -0
  13. package/dist/WelcomeTour.js.map +1 -0
  14. package/dist/components/Backdrop.d.ts +75 -0
  15. package/dist/components/Backdrop.d.ts.map +1 -0
  16. package/dist/components/Backdrop.js +69 -0
  17. package/dist/components/Backdrop.js.map +1 -0
  18. package/dist/components/Contact/show-contact-modal.d.ts +5 -0
  19. package/dist/components/Contact/show-contact-modal.d.ts.map +1 -0
  20. package/dist/components/Contact/show-contact-modal.js +37 -0
  21. package/dist/components/Contact/show-contact-modal.js.map +1 -0
  22. package/dist/components/ContactModal.d.ts +1 -0
  23. package/dist/components/ContactModal.d.ts.map +1 -0
  24. package/dist/components/ContactModal.js +2 -0
  25. package/dist/components/ContactModal.js.map +1 -0
  26. package/dist/components/Dialog.d.ts +54 -7
  27. package/dist/components/Dialog.d.ts.map +1 -1
  28. package/dist/components/Dialog.js +8 -2
  29. package/dist/components/Dialog.js.map +1 -1
  30. package/dist/components/Header.d.ts +38 -2
  31. package/dist/components/Header.d.ts.map +1 -1
  32. package/dist/components/Header.js +9 -4
  33. package/dist/components/Header.js.map +1 -1
  34. package/dist/components/NotificationCenter/NotificationPanel.d.ts +3 -0
  35. package/dist/components/NotificationCenter/NotificationPanel.d.ts.map +1 -0
  36. package/dist/components/NotificationCenter/NotificationPanel.js +19 -0
  37. package/dist/components/NotificationCenter/NotificationPanel.js.map +1 -0
  38. package/dist/components/NotificationCenter/NotificationPanelHeader.d.ts +3 -0
  39. package/dist/components/NotificationCenter/NotificationPanelHeader.d.ts.map +1 -0
  40. package/dist/components/NotificationCenter/NotificationPanelHeader.js +16 -0
  41. package/dist/components/NotificationCenter/NotificationPanelHeader.js.map +1 -0
  42. package/dist/components/NotificationCenter/NotificationsPanelFooter.d.ts +4 -0
  43. package/dist/components/NotificationCenter/NotificationsPanelFooter.d.ts.map +1 -0
  44. package/dist/components/NotificationCenter/NotificationsPanelFooter.js +12 -0
  45. package/dist/components/NotificationCenter/NotificationsPanelFooter.js.map +1 -0
  46. package/dist/components/NotificationCenter/dictionary.d.ts +2 -0
  47. package/dist/components/NotificationCenter/dictionary.d.ts.map +1 -0
  48. package/dist/components/NotificationCenter/dictionary.js +43 -0
  49. package/dist/components/NotificationCenter/dictionary.js.map +1 -0
  50. package/dist/components/NotificationCenter/index.d.ts +2 -0
  51. package/dist/components/NotificationCenter/index.d.ts.map +1 -0
  52. package/dist/components/NotificationCenter/index.js +34 -0
  53. package/dist/components/NotificationCenter/index.js.map +1 -0
  54. package/dist/components/NotificationCenter/styled.d.ts +3 -0
  55. package/dist/components/NotificationCenter/styled.d.ts.map +1 -0
  56. package/dist/components/NotificationCenter/styled.js +74 -0
  57. package/dist/components/NotificationCenter/styled.js.map +1 -0
  58. package/dist/components/NotificationCenter/types.d.ts +21 -0
  59. package/dist/components/NotificationCenter/types.d.ts.map +1 -0
  60. package/dist/components/NotificationCenter/types.js.map +1 -0
  61. package/dist/components/NotificationCenter/utils.d.ts +5 -0
  62. package/dist/components/NotificationCenter/utils.d.ts.map +1 -0
  63. package/dist/components/NotificationCenter/utils.js +18 -0
  64. package/dist/components/NotificationCenter/utils.js.map +1 -0
  65. package/dist/components/OverlayContent.d.ts +27 -1
  66. package/dist/components/OverlayContent.d.ts.map +1 -1
  67. package/dist/components/OverlayContent.js +8 -4
  68. package/dist/components/OverlayContent.js.map +1 -1
  69. package/dist/components/PortalSwitcher.d.ts +19 -1
  70. package/dist/components/PortalSwitcher.d.ts.map +1 -1
  71. package/dist/components/PortalSwitcher.js +16 -31
  72. package/dist/components/PortalSwitcher.js.map +1 -1
  73. package/dist/components/PrivacyPolicyMessage/hooks.d.ts +10 -0
  74. package/dist/components/PrivacyPolicyMessage/hooks.d.ts.map +1 -0
  75. package/dist/components/PrivacyPolicyMessage/hooks.js +33 -0
  76. package/dist/components/PrivacyPolicyMessage/hooks.js.map +1 -0
  77. package/dist/components/PrivacyPolicyMessage/index.d.ts +7 -0
  78. package/dist/components/PrivacyPolicyMessage/index.d.ts.map +1 -0
  79. package/dist/components/PrivacyPolicyMessage/index.js +5 -0
  80. package/dist/components/PrivacyPolicyMessage/index.js.map +1 -0
  81. package/dist/components/Rate/FeedbackModal.d.ts +8 -0
  82. package/dist/components/Rate/FeedbackModal.d.ts.map +1 -0
  83. package/dist/components/Rate/FeedbackModal.js +52 -0
  84. package/dist/components/Rate/FeedbackModal.js.map +1 -0
  85. package/dist/components/Rate/hook.d.ts +3 -0
  86. package/dist/components/Rate/hook.d.ts.map +1 -0
  87. package/dist/components/Rate/hook.js +48 -0
  88. package/dist/components/Rate/hook.js.map +1 -0
  89. package/dist/components/Rate/index.d.ts +10 -0
  90. package/dist/components/Rate/index.d.ts.map +1 -0
  91. package/dist/components/Rate/index.js +16 -0
  92. package/dist/components/Rate/index.js.map +1 -0
  93. package/dist/components/Rate/on-nps-submit.d.ts +7 -0
  94. package/dist/components/Rate/on-nps-submit.d.ts.map +1 -0
  95. package/dist/components/Rate/on-nps-submit.js +8 -0
  96. package/dist/components/Rate/on-nps-submit.js.map +1 -0
  97. package/dist/components/Rate/show-rate-us-modals.d.ts +17 -0
  98. package/dist/components/Rate/show-rate-us-modals.d.ts.map +1 -0
  99. package/dist/components/Rate/show-rate-us-modals.js +14 -0
  100. package/dist/components/Rate/show-rate-us-modals.js.map +1 -0
  101. package/dist/components/Rate/utils.d.ts +2 -0
  102. package/dist/components/Rate/utils.d.ts.map +1 -0
  103. package/dist/components/Rate/utils.js +10 -0
  104. package/dist/components/Rate/utils.js.map +1 -0
  105. package/dist/components/Toaster.d.ts +35 -0
  106. package/dist/components/Toaster.d.ts.map +1 -1
  107. package/dist/components/Toaster.js +32 -4
  108. package/dist/components/Toaster.js.map +1 -1
  109. package/dist/components/TypeForm/hook.d.ts +2 -0
  110. package/dist/components/TypeForm/hook.d.ts.map +1 -0
  111. package/dist/components/TypeForm/hook.js +11 -0
  112. package/dist/components/TypeForm/hook.js.map +1 -0
  113. package/dist/components/TypeForm/index.d.ts +6 -0
  114. package/dist/components/TypeForm/index.d.ts.map +1 -0
  115. package/dist/components/TypeForm/index.js +23 -0
  116. package/dist/components/TypeForm/index.js.map +1 -0
  117. package/dist/components/TypeForm/show-typeform-modal.d.ts +5 -0
  118. package/dist/components/TypeForm/show-typeform-modal.d.ts.map +1 -0
  119. package/dist/components/TypeForm/show-typeform-modal.js +11 -0
  120. package/dist/components/TypeForm/show-typeform-modal.js.map +1 -0
  121. package/dist/components/TypeForm/utils.d.ts +2 -0
  122. package/dist/components/TypeForm/utils.d.ts.map +1 -0
  123. package/dist/components/TypeForm/utils.js +9 -0
  124. package/dist/components/TypeForm/utils.js.map +1 -0
  125. package/dist/components/UserMenu.d.ts +19 -2
  126. package/dist/components/UserMenu.d.ts.map +1 -1
  127. package/dist/components/UserMenu.js +12 -6
  128. package/dist/components/UserMenu.js.map +1 -1
  129. package/dist/components/error/ErrorBoundary.d.ts +25 -4
  130. package/dist/components/error/ErrorBoundary.d.ts.map +1 -1
  131. package/dist/components/error/ErrorBoundary.js +10 -1
  132. package/dist/components/error/ErrorBoundary.js.map +1 -1
  133. package/dist/components/error/ErrorManager.d.ts +22 -6
  134. package/dist/components/error/ErrorManager.d.ts.map +1 -1
  135. package/dist/components/error/ErrorManager.js +21 -1
  136. package/dist/components/error/ErrorManager.js.map +1 -1
  137. package/dist/components/error/SilentErrorBoundary.d.ts +26 -5
  138. package/dist/components/error/SilentErrorBoundary.d.ts.map +1 -1
  139. package/dist/components/error/SilentErrorBoundary.js +10 -0
  140. package/dist/components/error/SilentErrorBoundary.js.map +1 -1
  141. package/dist/components/menu/MenuContent.d.ts +20 -4
  142. package/dist/components/menu/MenuContent.d.ts.map +1 -1
  143. package/dist/components/menu/MenuContent.js +89 -88
  144. package/dist/components/menu/MenuContent.js.map +1 -1
  145. package/dist/components/menu/MenuSectionGroup.d.ts +2 -0
  146. package/dist/components/menu/MenuSectionGroup.d.ts.map +1 -0
  147. package/dist/components/menu/MenuSectionGroup.js +121 -0
  148. package/dist/components/menu/MenuSectionGroup.js.map +1 -0
  149. package/dist/components/menu/MenuSections.d.ts +17 -0
  150. package/dist/components/menu/MenuSections.d.ts.map +1 -1
  151. package/dist/components/menu/MenuSections.js +159 -39
  152. package/dist/components/menu/MenuSections.js.map +1 -1
  153. package/dist/components/menu/PageSelector.d.ts +5 -0
  154. package/dist/components/menu/PageSelector.d.ts.map +1 -1
  155. package/dist/components/menu/PageSelector.js +9 -4
  156. package/dist/components/menu/PageSelector.js.map +1 -1
  157. package/dist/components/menu/types.d.ts +219 -8
  158. package/dist/components/menu/types.d.ts.map +1 -1
  159. package/dist/components/tour/StepContainer.d.ts +37 -0
  160. package/dist/components/tour/StepContainer.d.ts.map +1 -0
  161. package/dist/components/tour/StepContainer.js +51 -0
  162. package/dist/components/tour/StepContainer.js.map +1 -0
  163. package/dist/components/tour/StepNavigation.d.ts +29 -0
  164. package/dist/components/tour/StepNavigation.d.ts.map +1 -0
  165. package/dist/components/tour/StepNavigation.js +37 -0
  166. package/dist/components/tour/StepNavigation.js.map +1 -0
  167. package/dist/components/tour/StepTitle.d.ts +17 -0
  168. package/dist/components/tour/StepTitle.d.ts.map +1 -0
  169. package/dist/components/tour/StepTitle.js +10 -0
  170. package/dist/components/tour/StepTitle.js.map +1 -0
  171. package/dist/components/tour/hook.d.ts +3 -0
  172. package/dist/components/tour/hook.d.ts.map +1 -0
  173. package/dist/components/tour/hook.js +10 -0
  174. package/dist/components/tour/hook.js.map +1 -0
  175. package/dist/components/tour/index.d.ts +5 -0
  176. package/dist/components/tour/index.d.ts.map +1 -0
  177. package/dist/components/tour/index.js +5 -0
  178. package/dist/components/tour/index.js.map +1 -0
  179. package/dist/components/tour/manager.d.ts +34 -0
  180. package/dist/components/tour/manager.d.ts.map +1 -0
  181. package/dist/components/tour/manager.js +104 -0
  182. package/dist/components/tour/manager.js.map +1 -0
  183. package/dist/components/tour/utils.d.ts +67 -0
  184. package/dist/components/tour/utils.d.ts.map +1 -0
  185. package/dist/components/tour/utils.js +60 -0
  186. package/dist/components/tour/utils.js.map +1 -0
  187. package/dist/components/user-menu-manager.d.ts +13 -0
  188. package/dist/components/user-menu-manager.d.ts.map +1 -0
  189. package/dist/components/user-menu-manager.js +36 -0
  190. package/dist/components/user-menu-manager.js.map +1 -0
  191. package/dist/dictionary.d.ts +6 -1
  192. package/dist/dictionary.d.ts.map +1 -1
  193. package/dist/dictionary.js +7 -2
  194. package/dist/dictionary.js.map +1 -1
  195. package/dist/elements.d.ts +7 -0
  196. package/dist/elements.d.ts.map +1 -1
  197. package/dist/elements.js +7 -0
  198. package/dist/elements.js.map +1 -1
  199. package/dist/index.d.ts +15 -8
  200. package/dist/index.d.ts.map +1 -1
  201. package/dist/index.js +15 -8
  202. package/dist/index.js.map +1 -1
  203. package/dist/layout.css +190 -35
  204. package/dist/svg/StarFillWithGradient.d.ts +6 -0
  205. package/dist/svg/StarFillWithGradient.d.ts.map +1 -0
  206. package/dist/svg/StarFillWithGradient.js +4 -0
  207. package/dist/svg/StarFillWithGradient.js.map +1 -0
  208. package/dist/toaster.d.ts +55 -9
  209. package/dist/toaster.d.ts.map +1 -1
  210. package/dist/toaster.js +34 -6
  211. package/dist/toaster.js.map +1 -1
  212. package/dist/types.d.ts +5 -0
  213. package/dist/types.d.ts.map +1 -0
  214. package/dist/types.js +2 -0
  215. package/dist/types.js.map +1 -0
  216. package/dist/utils.d.ts +6 -69
  217. package/dist/utils.d.ts.map +1 -1
  218. package/dist/utils.js +9 -130
  219. package/dist/utils.js.map +1 -1
  220. package/package.dev.json +3 -0
  221. package/package.json +24 -13
  222. package/package.stg.json +3 -0
  223. package/readme.md +147 -0
  224. package/src/Layout.tsx +166 -58
  225. package/src/LayoutOverlayManager.tsx +499 -85
  226. package/src/WelcomeTour.tsx +8 -0
  227. package/src/components/Backdrop.tsx +116 -0
  228. package/src/components/Contact/show-contact-modal.tsx +71 -0
  229. package/src/components/Dialog.tsx +58 -9
  230. package/src/components/Header.tsx +53 -5
  231. package/src/components/NotificationCenter/NotificationPanel.tsx +40 -0
  232. package/src/components/NotificationCenter/NotificationPanelHeader.tsx +53 -0
  233. package/src/components/NotificationCenter/NotificationsPanelFooter.tsx +25 -0
  234. package/src/components/NotificationCenter/dictionary.ts +44 -0
  235. package/src/components/NotificationCenter/index.tsx +58 -0
  236. package/src/components/NotificationCenter/styled.ts +75 -0
  237. package/src/components/NotificationCenter/types.ts +24 -0
  238. package/src/components/NotificationCenter/utils.ts +20 -0
  239. package/src/components/OverlayContent.tsx +40 -5
  240. package/src/components/PortalSwitcher.tsx +33 -39
  241. package/src/components/PrivacyPolicyMessage/hooks.tsx +49 -0
  242. package/src/components/PrivacyPolicyMessage/index.tsx +21 -0
  243. package/src/components/Rate/FeedbackModal.tsx +86 -0
  244. package/src/components/Rate/hook.tsx +61 -0
  245. package/src/components/Rate/index.tsx +36 -0
  246. package/src/components/Rate/on-nps-submit.ts +18 -0
  247. package/src/components/Rate/show-rate-us-modals.tsx +29 -0
  248. package/src/components/Rate/utils.ts +11 -0
  249. package/src/components/Toaster.tsx +82 -3
  250. package/src/components/TypeForm/hook.tsx +13 -0
  251. package/src/components/TypeForm/index.tsx +50 -0
  252. package/src/components/TypeForm/show-typeform-modal.tsx +10 -0
  253. package/src/components/TypeForm/utils.ts +8 -0
  254. package/src/components/UserMenu.tsx +32 -8
  255. package/src/components/error/ErrorBoundary.tsx +11 -2
  256. package/src/components/error/ErrorManager.ts +22 -6
  257. package/src/components/error/SilentErrorBoundary.tsx +12 -2
  258. package/src/components/menu/MenuContent.tsx +102 -110
  259. package/src/components/menu/MenuSectionGroup.tsx +121 -0
  260. package/src/components/menu/MenuSections.tsx +342 -93
  261. package/src/components/menu/PageSelector.tsx +16 -4
  262. package/src/components/menu/types.ts +221 -9
  263. package/src/components/tour/StepContainer.tsx +92 -0
  264. package/src/components/tour/StepNavigation.tsx +72 -0
  265. package/src/components/tour/StepTitle.tsx +28 -0
  266. package/src/components/tour/hook.ts +12 -0
  267. package/src/components/tour/index.ts +6 -0
  268. package/src/components/tour/manager.tsx +119 -0
  269. package/src/components/tour/utils.tsx +119 -0
  270. package/src/components/user-menu-manager.ts +31 -0
  271. package/src/dictionary.ts +7 -2
  272. package/src/elements.ts +7 -0
  273. package/src/index.ts +15 -8
  274. package/src/layout.css +190 -35
  275. package/src/svg/StarFillWithGradient.tsx +14 -0
  276. package/src/toaster.tsx +90 -13
  277. package/src/types.ts +4 -0
  278. package/src/utils.ts +9 -142
  279. package/dist/components/BottomNotification.d.ts +0 -1
  280. package/dist/components/BottomNotification.d.ts.map +0 -1
  281. package/dist/components/BottomNotification.js +0 -2
  282. package/dist/components/BottomNotification.js.map +0 -1
  283. package/dist/components/BottomPanel.d.ts +0 -1
  284. package/dist/components/BottomPanel.d.ts.map +0 -1
  285. package/dist/components/BottomPanel.js +0 -2
  286. package/dist/components/BottomPanel.js.map +0 -1
  287. package/dist/components/SelectionList.d.ts +0 -36
  288. package/dist/components/SelectionList.d.ts.map +0 -1
  289. package/dist/components/SelectionList.js +0 -140
  290. package/dist/components/SelectionList.js.map +0 -1
  291. package/dist/components/error/ErrorFeedback.d.ts +0 -3
  292. package/dist/components/error/ErrorFeedback.d.ts.map +0 -1
  293. package/dist/components/error/ErrorFeedback.js +0 -66
  294. package/dist/components/error/ErrorFeedback.js.map +0 -1
  295. package/dist/components/menu/use-check-text-overflow.d.ts +0 -6
  296. package/dist/components/menu/use-check-text-overflow.d.ts.map +0 -1
  297. package/dist/components/menu/use-check-text-overflow.js +0 -20
  298. package/dist/components/menu/use-check-text-overflow.js.map +0 -1
  299. package/dist/components/menu/use-keyboard-controls.d.ts +0 -23
  300. package/dist/components/menu/use-keyboard-controls.d.ts.map +0 -1
  301. package/dist/components/menu/use-keyboard-controls.js +0 -49
  302. package/dist/components/menu/use-keyboard-controls.js.map +0 -1
  303. package/dist/components/tour/PortalSwitcherStep.d.ts +0 -3
  304. package/dist/components/tour/PortalSwitcherStep.d.ts.map +0 -1
  305. package/dist/components/tour/PortalSwitcherStep.js +0 -29
  306. package/dist/components/tour/PortalSwitcherStep.js.map +0 -1
  307. package/dist/components/types.d.ts +0 -15
  308. package/dist/components/types.d.ts.map +0 -1
  309. package/dist/components/types.js.map +0 -1
  310. package/dist/layout-context.d.ts +0 -10
  311. package/dist/layout-context.d.ts.map +0 -1
  312. package/dist/layout-context.js +0 -11
  313. package/dist/layout-context.js.map +0 -1
  314. package/dist/svg/AI.d.ts +0 -6
  315. package/dist/svg/AI.d.ts.map +0 -1
  316. package/dist/svg/AI.js +0 -9
  317. package/dist/svg/AI.js.map +0 -1
  318. package/dist/svg/EDP.d.ts +0 -6
  319. package/dist/svg/EDP.d.ts.map +0 -1
  320. package/dist/svg/EDP.js +0 -5
  321. package/dist/svg/EDP.js.map +0 -1
  322. package/dist/svg/Forbidden.d.ts +0 -6
  323. package/dist/svg/Forbidden.d.ts.map +0 -1
  324. package/dist/svg/Forbidden.js +0 -4
  325. package/dist/svg/Forbidden.js.map +0 -1
  326. package/dist/svg/HUB.d.ts +0 -6
  327. package/dist/svg/HUB.d.ts.map +0 -1
  328. package/dist/svg/HUB.js +0 -5
  329. package/dist/svg/HUB.js.map +0 -1
  330. package/dist/svg/Logo.d.ts +0 -2
  331. package/dist/svg/Logo.d.ts.map +0 -1
  332. package/dist/svg/Logo.js +0 -4
  333. package/dist/svg/Logo.js.map +0 -1
  334. package/dist/svg/NotFound.d.ts +0 -6
  335. package/dist/svg/NotFound.d.ts.map +0 -1
  336. package/dist/svg/NotFound.js +0 -4
  337. package/dist/svg/NotFound.js.map +0 -1
  338. package/dist/svg/ServerError.d.ts +0 -6
  339. package/dist/svg/ServerError.d.ts.map +0 -1
  340. package/dist/svg/ServerError.js +0 -4
  341. package/dist/svg/ServerError.js.map +0 -1
  342. package/dist/svg/Unauthenticated.d.ts +0 -6
  343. package/dist/svg/Unauthenticated.d.ts.map +0 -1
  344. package/dist/svg/Unauthenticated.js +0 -4
  345. package/dist/svg/Unauthenticated.js.map +0 -1
  346. package/src/components/BottomPanel.tsx +0 -0
  347. package/src/components/SelectionList.tsx +0 -272
  348. package/src/components/error/ErrorFeedback.tsx +0 -114
  349. package/src/components/menu/use-check-text-overflow.tsx +0 -26
  350. package/src/components/menu/use-keyboard-controls.tsx +0 -70
  351. package/src/components/tour/PortalSwitcherStep.tsx +0 -36
  352. package/src/components/types.ts +0 -15
  353. package/src/layout-context.tsx +0 -22
  354. package/src/svg/AI.tsx +0 -37
  355. package/src/svg/EDP.tsx +0 -35
  356. package/src/svg/Forbidden.tsx +0 -22
  357. package/src/svg/HUB.tsx +0 -35
  358. package/src/svg/Logo.tsx +0 -35
  359. package/src/svg/NotFound.tsx +0 -16
  360. package/src/svg/ServerError.tsx +0 -33
  361. package/src/svg/Unauthenticated.tsx +0 -16
  362. /package/dist/components/{types.js → NotificationCenter/types.js} +0 -0
  363. /package/src/components/{BottomNotification.tsx → ContactModal.tsx} +0 -0
@@ -1,28 +1,21 @@
1
- /* eslint-disable react-refresh/only-export-components */
2
- /* eslint-disable @typescript-eslint/no-unused-vars */
3
- import { Flex, IconBox, Text } from '@citric/core'
1
+ import { Box, Flex, IconBox, Text } from '@citric/core'
4
2
  import { ArrowLeft, ChevronDown } from '@citric/icons'
5
3
  import { LoadingCircular } from '@citric/ui'
4
+ import { useCheckTextOverflow } from '@stack-spot/portal-components'
5
+ import { useAnchorTag } from '@stack-spot/portal-components/anchor'
6
6
  import { listToClass, theme } from '@stack-spot/portal-theme'
7
7
  import { useMemo, useState } from 'react'
8
8
  import { styled } from 'styled-components'
9
- import { useAnchorTag } from '../../layout-context'
10
9
  import { hideOverlayImmediately } from './MenuSections'
11
10
  import { PageSelector } from './PageSelector'
12
11
  import { MENU_CONTENT_ITEM_PADDING as ITEM_PADDING, MENU_CONTENT_PADDING as PADDING } from './constants'
13
12
  import { ItemGroup, MenuAction, MenuItem, MenuSectionContent } from './types'
14
- import { useCheckTextOverflow } from './use-check-text-overflow'
15
13
 
16
- const BackLink = styled.a`
17
- display: flex;
18
- flex-direction: row;
19
- align-items: center;
20
- margin: ${PADDING}px;
21
- margin-bottom: 16px;
22
- gap: 6px;
23
- `
24
-
25
- export const MenuGroup = styled.ul`
14
+ /**
15
+ * The list (`<ul>`) used for grouping items in a menu.
16
+ */
17
+ // fixme: remove explicit type when TS is upgraded to 5.5 or greater
18
+ export const MenuGroup: React.FC<React.HTMLAttributes<HTMLUListElement>> = styled.ul`
26
19
  padding: 0 0 0 16px;
27
20
  display: flex;
28
21
  flex-direction: column;
@@ -33,30 +26,18 @@ export const MenuGroup = styled.ul`
33
26
  padding: 0;
34
27
  }
35
28
 
36
- .item-row-group > a {
37
- padding: 0 16px;
38
- margin: 0;
39
- border-radius: 0;
40
- }
41
-
42
- .item-row-group > a::before {
43
- content: '';
44
- position: absolute;
45
- top: 0;
46
- left: 0;
47
- right: 0;
48
- bottom: 0;
49
- background-color: var(--light-300);
50
- opacity: 0.24;
51
- border-radius: inherit;
52
- }
53
-
54
29
  .item-row {
55
30
  display: flex;
56
31
  flex-direction: row;
57
32
  gap: 8px;
58
33
  align-items: center;
59
34
 
35
+ &.root {
36
+ padding: 0 16px;
37
+ margin-top: 16px;
38
+ border-radius: 0;
39
+ }
40
+
60
41
  .label {
61
42
  flex: 1;
62
43
  &.hidden, &.ellipsis {
@@ -68,73 +49,77 @@ export const MenuGroup = styled.ul`
68
49
  }
69
50
  }
70
51
  }
71
-
72
- .item-row-group {
73
- margin-top: 16px;
74
- }
75
52
 
76
- li a {
77
- position: relative;
78
- height: 0;
79
- overflow: hidden;
80
- transition: height 0.3s, background-color 0.2s;
81
- margin-left: ${PADDING - ITEM_PADDING}px;
82
- padding-left: ${ITEM_PADDING}px;
53
+ li {
54
+ .item-row-title {
55
+ opacity: 0.7;
56
+ }
83
57
 
84
- &:hover {
85
- background-color: ${theme.color.light['500']};
58
+ .item-as-title {
59
+ position: relative;
60
+ overflow: hidden;
61
+ margin-left: ${PADDING - ITEM_PADDING}px;
86
62
  }
87
63
 
88
- &.action {
89
- &:before {
90
- content: '';
91
- position: absolute;
92
- left: 2px;
93
- width: 2px;
94
- height: 0;
95
- background: inherit;
96
- transition: height 0.2s;
64
+ a {
65
+ position: relative;
66
+ height: 0;
67
+ overflow: hidden;
68
+ transition: height 0.3s, background-color 0.2s;
69
+ margin-left: ${PADDING - ITEM_PADDING}px;
70
+ padding-left: ${ITEM_PADDING}px;
71
+
72
+ &:hover {
73
+ background-color: ${theme.color.light['500']};
97
74
  }
75
+
76
+ &.action {
77
+ &:before {
78
+ content: '';
79
+ position: absolute;
80
+ left: 2px;
81
+ width: 2px;
82
+ height: 0;
83
+ background: inherit;
84
+ transition: height 0.2s;
85
+ }
98
86
 
99
- &.active {
100
-
101
- &:hover {
102
- background-color: transparent;
87
+ &.active {
88
+
89
+ &:hover {
90
+ background-color: transparent;
91
+ }
92
+
93
+ &:before {
94
+ background: ${theme.color.primary['500']};
95
+ height: 24px;
96
+ }
103
97
  }
104
-
105
- &:before {
106
- background: ${theme.color.primary['500']};
98
+
99
+ &:not(.active):hover:before {
100
+ background: ${theme.color.light.contrastText};
107
101
  height: 24px;
108
102
  }
109
103
  }
110
104
 
111
- &:not(.active):hover:before {
112
- background: ${theme.color.light.contrastText};
113
- height: 24px;
114
- }
115
- }
116
-
117
- .chevron {
118
- transition: transform 0.3s;
119
- &:not(.open) {
120
- transform: rotate(-90deg);
105
+ .chevron {
106
+ transition: transform 0.3s;
107
+ &:not(.open) {
108
+ transform: rotate(-90deg);
109
+ }
121
110
  }
122
111
  }
123
-
124
- .item-row-title {
125
- opacity: 0.7;
126
- }
127
112
  }
128
113
 
129
114
  &.open {
130
115
  visibility: visible;
131
116
  transition: unset;
132
- & > li > a, & > li > .item-row-group > a {
117
+ & > li > a, & > li > .item-as-title {
133
118
  height: 40px;
134
119
  }
135
120
  }
136
121
 
137
- &:not(.open) &.open > li > a {
122
+ &:not(.open) &.open > li > a, &:not(.open) &.open > li > .item-as-title {
138
123
  height: 0;
139
124
  }
140
125
 
@@ -158,13 +143,21 @@ export const MenuGroup = styled.ul`
158
143
  }
159
144
  `
160
145
 
161
- export const Title = styled.header`
146
+ /**
147
+ * The header (<header>) for a group of items in a menu. Contains the title of the group.
148
+ */
149
+ // fixme: remove explicit type when TS is upgraded to 5.5 or greater
150
+ export const Title: React.FC<React.HTMLAttributes<HTMLElement>> = styled.header`
162
151
  display: flex;
163
152
  flex-direction: column;
164
153
  margin: ${PADDING}px 0 24px ${PADDING}px;
165
154
  `
166
155
 
167
- export const ActionItem = ({ label, onClick, href, active, icon, badge, overflow = 'wrap' }: MenuAction) => {
156
+ /**
157
+ * A menu item that performs an action.
158
+ * @param props the props for the component {@link MenuAction}.
159
+ */
160
+ export const ActionItem = ({ label, onClick, href, active, icon, badge, target, overflow = 'wrap' }: MenuAction) => {
168
161
  const Link = useAnchorTag()
169
162
  const { ref, overflow: textOverflow } = useCheckTextOverflow()
170
163
  const isTextLabel = typeof label === 'string'
@@ -176,6 +169,7 @@ export const ActionItem = ({ label, onClick, href, active, icon, badge, overflow
176
169
  if (onClick) onClick()
177
170
  hideOverlayImmediately()
178
171
  }}
172
+ target={target}
179
173
  className={listToClass(['action', 'item-row', active ? 'active' : undefined])}
180
174
  {...(active ? { 'aria-current': 'page' } : undefined)}
181
175
  {...(!href ? { 'tabIndex': 0 } : undefined)}
@@ -189,7 +183,12 @@ export const ActionItem = ({ label, onClick, href, active, icon, badge, overflow
189
183
  )
190
184
  }
191
185
 
192
- const CollapsibleGroupItem = ({ label, open: initiallyOpened, children, icon, badge, root, overflow = 'wrap' }:
186
+ /**
187
+ * A menu item that is actually a subgroup and can be collapsed/expanded.
188
+ * @param props the props for the component {@link ItemGroup} & { root: boolean }. Pass root=true to style this group as a root group.
189
+ * Root groups have slightly different visuals.
190
+ */
191
+ const CollapsibleGroupItem = ({ label, showAsTitle, open: initiallyOpened, children, icon, badge, root, overflow = 'wrap' }:
193
192
  ItemGroup & { root?: boolean }) => {
194
193
  const [open, setOpen] = useState(initiallyOpened ?? children?.some(c => 'active' in c && c.active) ?? false)
195
194
  const items = useMemo(() => children?.filter(i => !i.hidden).map(renderOption), [children])
@@ -197,10 +196,17 @@ const CollapsibleGroupItem = ({ label, open: initiallyOpened, children, icon, ba
197
196
 
198
197
  return (
199
198
  <>
200
- <a
199
+ {showAsTitle ? <Box className={listToClass(['item-row', root && 'root', 'item-as-title'])}>
200
+ {icon}
201
+ <Text appearance={root ? 'overheader2' : 'body2'}
202
+ colorScheme="light.contrastText"
203
+ className={`label ${overflow} ${root ? 'item-row-title' : ''}`}>
204
+ {label}
205
+ </Text>
206
+ </Box> : <a
201
207
  onClick={() => setOpen(!open)}
202
208
  onKeyDown={e => e.key === 'Enter' && setOpen(!open)}
203
- className="item-row"
209
+ className={listToClass(['item-row', root && 'root'])}
204
210
  tabIndex={0}
205
211
  aria-controls={id}
206
212
  aria-expanded={open}
@@ -215,7 +221,7 @@ const CollapsibleGroupItem = ({ label, open: initiallyOpened, children, icon, ba
215
221
  <IconBox sx={{ mr: root ? undefined : '5' }}>
216
222
  <ChevronDown className={listToClass(['chevron', open ? 'open' : ''])} />
217
223
  </IconBox>
218
- </a>
224
+ </a>}
219
225
  <MenuGroup id={id}
220
226
  className={`${open ? 'open' : ''} ${root ? 'no-indentation' : ''}`}
221
227
  aria-hidden={!open}>{items}</MenuGroup>
@@ -223,41 +229,27 @@ const CollapsibleGroupItem = ({ label, open: initiallyOpened, children, icon, ba
223
229
  )
224
230
  }
225
231
 
226
- const RootGroupItem = (props: ItemGroup) => {
227
- const items = useMemo(() => props.children?.filter(i => !i.hidden).map(renderOption), [props.children])
228
-
229
- return <>
230
- {items.length ? <div className="item-row-group">
231
- <CollapsibleGroupItem {...props} open={true} root={true} />
232
- </div> :
233
- <>
234
- <div className="item-row">
235
- {props.icon}
236
- <Text appearance="overheader2" colorScheme="light.700" className={`group-title label ${props.overflow}`}>{props.label}</Text>
237
- {props.badge}
238
- </div>
239
- <MenuGroup className="open no-indentation">{items}</MenuGroup>
240
- </>
241
- }
242
- </>
243
- }
244
-
245
- const GroupItem = ({ root, ...item }: ItemGroup & { root?: boolean }) => (
246
- root ? <RootGroupItem {...item} /> : <CollapsibleGroupItem {...item} />
247
- )
248
-
249
232
  function renderOption({ root, ...option }: MenuItem & { root?: boolean }) {
250
233
  const labelText = typeof option.label === 'string' ? option.label : option.label.id
251
234
  return (
252
235
  <li key={labelText} role="menuitem" aria-selected={'children' in option ? undefined : option.active}>
253
- {'children' in option ? <GroupItem root={root} {...option} /> : <ActionItem {...option} />}
236
+ {'children' in option ? <CollapsibleGroupItem {...option} root={root} open={option.open ?? root} /> : <ActionItem {...option} />}
254
237
  </li >
255
238
  )
256
239
  }
257
240
 
241
+ /**
242
+ * Renders a menu-content interface.
243
+ *
244
+ * Considering the Stackspot UI, this is the "menu content", not the "menu sections", i.e. it's the second menu from left to right, the
245
+ * one that changes according to section selected.
246
+ * @param props the props for the component {@link MenuSectionContent}.
247
+ */
258
248
  export const MenuContent = ({ pageSelector, goBack, title, subtitle, afterTitle, options = [], loading, error }: MenuSectionContent) => {
259
249
  const items = useMemo(() => options.filter(o => !o.hidden).map(o => renderOption({ ...o, root: true })), [options])
260
250
 
251
+ const Link = useAnchorTag()
252
+
261
253
  function renderContent() {
262
254
  if (loading) {
263
255
  return (
@@ -273,14 +265,14 @@ export const MenuContent = ({ pageSelector, goBack, title, subtitle, afterTitle,
273
265
  return (
274
266
  <>
275
267
  {goBack && (
276
- <BackLink href={goBack.href} onClick={goBack.onClick}>
268
+ <Link href={goBack.href} onClick={goBack.onClick} className="goBackLink">
277
269
  <IconBox colorIcon="inverse.500" size="sm">
278
270
  <ArrowLeft />
279
271
  </IconBox>
280
272
  {typeof goBack?.label === 'string' ?
281
273
  <Text appearance="body2" nowrapEllipsis>{goBack.label}</Text> :
282
274
  goBack.label.element}
283
- </BackLink>
275
+ </Link>
284
276
  )}
285
277
  {title && (
286
278
  <Title>
@@ -0,0 +1,121 @@
1
+ import { theme } from '@stack-spot/portal-theme'
2
+ import styled from 'styled-components'
3
+ import { MENU_CONTENT_PADDING as PADDING } from './constants'
4
+
5
+ export const MenuSectionGroup: React.FC<React.HTMLAttributes<HTMLUListElement>> = styled.ul`
6
+ padding: 0 0 0 16px;
7
+ display: flex;
8
+ flex-direction: column;
9
+ visibility: hidden;
10
+ transition: visibility 0s 0.3s;
11
+
12
+ &.no-indentation {
13
+ padding: 0;
14
+ }
15
+
16
+ .item-row {
17
+ display: flex;
18
+ flex-direction: row;
19
+ gap: 8px;
20
+ align-items: center;
21
+
22
+ &.root {
23
+ padding: 0 16px;
24
+ margin-top: 16px;
25
+ border-radius: 0;
26
+ }
27
+
28
+ .label {
29
+ flex: 1;
30
+ &.hidden, &.ellipsis {
31
+ white-space: nowrap;
32
+ overflow: hidden;
33
+ }
34
+ &.ellipsis {
35
+ text-overflow: ellipsis;
36
+ }
37
+ }
38
+ }
39
+
40
+ li a {
41
+ position: relative;
42
+ height: 0;
43
+ overflow: hidden;
44
+ transition: height 0.3s, background-color 0.2s;
45
+
46
+ &:hover {
47
+ background-color: ${theme.color.light['500']};
48
+ }
49
+
50
+ &.action {
51
+ &:before {
52
+ content: '';
53
+ position: absolute;
54
+ left: 2px;
55
+ width: 2px;
56
+ height: 0;
57
+ background: inherit;
58
+ transition: height 0.2s;
59
+ }
60
+
61
+ &.active {
62
+
63
+ &:hover {
64
+ background-color: transparent;
65
+ }
66
+
67
+ &:before {
68
+ background: ${theme.color.primary['500']};
69
+ height: 24px;
70
+ }
71
+ }
72
+
73
+ &:not(.active):hover:before {
74
+ background: ${theme.color.light.contrastText};
75
+ height: 24px;
76
+ }
77
+ }
78
+
79
+ .chevron {
80
+ transition: transform 0.5s;
81
+ &:not(.open) {
82
+ transform: rotate(180deg);
83
+ }
84
+ }
85
+
86
+ .item-row-title {
87
+ opacity: 0.7;
88
+ }
89
+ }
90
+
91
+ &.open {
92
+ visibility: visible;
93
+ transition: unset;
94
+ & > li > a {
95
+ height: 56px;
96
+ }
97
+ }
98
+
99
+ &:not(.open) &.open > li > a {
100
+ height: 0;
101
+ }
102
+
103
+ &.root {
104
+ /* margin-bottom: ${PADDING}px; */
105
+
106
+ & > li {
107
+ .group-title {
108
+ margin-left: ${PADDING}px;
109
+ margin-bottom: 5px;
110
+ margin-top: 40px;
111
+ display: block;
112
+ }
113
+
114
+ &:first-child {
115
+ .group-title {
116
+ margin-top: 0;
117
+ }
118
+ }
119
+ }
120
+ }
121
+ `