this.gui 1.0.18 → 1.1.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 (480) hide show
  1. package/.storybook/main.js +40 -0
  2. package/.storybook/manager-head.html +13 -0
  3. package/.storybook/manager.js +15 -0
  4. package/.storybook/preview.tsx +54 -0
  5. package/.storybook/vitest.setup.js +6 -0
  6. package/.storybook/withLayout.tsx +18 -0
  7. package/README.md +1 -220
  8. package/dist/GUI.png +0 -0
  9. package/dist/GUI2.png +0 -0
  10. package/dist/favicon.ico +0 -0
  11. package/dist/this-gui.es.js +108493 -5056
  12. package/dist/this-gui.umd.js +239 -44
  13. package/dist/this.GUI.png +0 -0
  14. package/nodes/overall approach.md +93 -0
  15. package/notes/Proyect.md +109 -0
  16. package/package.json +71 -54
  17. package/public/GUI.png +0 -0
  18. package/public/GUI2.png +0 -0
  19. package/public/favicon.ico +0 -0
  20. package/public/this.GUI.png +0 -0
  21. package/src/components/generics/Cards/Gridme.jsx +52 -0
  22. package/src/components/generics/Cards/LilBox.jsx +65 -0
  23. package/src/components/generics/Cards/ModuleCard.jsx +106 -0
  24. package/src/components/generics/Chats/FullChatBot.jsx +223 -0
  25. package/src/components/generics/Code/CodeBlock.jsx +33 -0
  26. package/src/components/generics/Feedback/Callout.jsx +92 -0
  27. package/src/components/generics/Layout/GridX.jsx +29 -0
  28. package/src/components/generics/Layout/Hero2.jsx +132 -0
  29. package/src/components/generics/Layout/PageContainer.jsx +29 -0
  30. package/src/components/generics/Layout/PageDivider.jsx +20 -0
  31. package/src/components/generics/Layout/Section.jsx +43 -0
  32. package/src/components/generics/Layout/SectionHeader.jsx +21 -0
  33. package/src/components/generics/Media/Img.jsx +58 -0
  34. package/src/components/generics/Media/VideoEmbed.jsx +51 -0
  35. package/src/components/generics/Organization/TableOfContents.jsx +51 -0
  36. package/src/components/generics/Organization/Tabs.jsx +45 -0
  37. package/src/components/generics/Text/TextList.jsx +41 -0
  38. package/src/components/generics/Text/TextParagraph.jsx +28 -0
  39. package/src/components/generics/Text/TextQuote.jsx +23 -0
  40. package/src/components/generics/Text/TextTitle.jsx +44 -0
  41. package/src/components/this.me/MeActive.jsx +24 -0
  42. package/src/components/this.me/MeFloating.jsx +183 -0
  43. package/src/components/this.me/MeInactive.jsx +21 -0
  44. package/src/components/this.me/MeListUs.jsx +40 -0
  45. package/src/components/this.me/MeState.jsx +25 -0
  46. package/src/components/this.me/hooks/useMe.js +43 -0
  47. package/src/context/GuiProvider.tsx +243 -0
  48. package/src/gui/atoms/AppBar/AppBar.resolver.tsx +77 -0
  49. package/src/gui/atoms/AppBar/AppBar.stories.tsx +232 -0
  50. package/src/gui/atoms/AppBar/AppBar.tsx +10 -0
  51. package/src/gui/atoms/Box/Box.resolver.tsx +171 -0
  52. package/src/gui/atoms/Box/Box.stories.tsx +271 -0
  53. package/src/gui/atoms/Box/Box.tsx +15 -0
  54. package/src/gui/atoms/Button/Button.resolver.tsx +98 -0
  55. package/src/gui/atoms/Button/Button.stories.tsx +225 -0
  56. package/src/gui/atoms/Button/Button.tsx +40 -0
  57. package/src/gui/atoms/Collapse/Collapse.resolver.tsx +85 -0
  58. package/src/gui/atoms/Collapse/Collapse.stories.tsx +136 -0
  59. package/src/gui/atoms/Collapse/Collapse.tsx +17 -0
  60. package/src/gui/atoms/Divider/Divider.resolver.tsx +95 -0
  61. package/src/gui/atoms/Divider/Divider.stories.tsx +109 -0
  62. package/src/gui/atoms/Divider/Divider.tsx +14 -0
  63. package/src/gui/atoms/Drawer/Drawer.resolver.tsx +116 -0
  64. package/src/gui/atoms/Drawer/Drawer.stories.tsx +229 -0
  65. package/src/gui/atoms/Drawer/Drawer.tsx +8 -0
  66. package/src/gui/atoms/IconButton/IconButton.resolver.tsx +135 -0
  67. package/src/gui/atoms/IconButton/IconButton.stories.tsx +141 -0
  68. package/src/gui/atoms/IconButton/IconButton.tsx +22 -0
  69. package/src/gui/atoms/Link/Link.resolver.tsx +75 -0
  70. package/src/gui/atoms/Link/Link.stories.tsx +164 -0
  71. package/src/gui/atoms/Link/Link.tsx +14 -0
  72. package/src/gui/atoms/List/List.resolver.tsx +95 -0
  73. package/src/gui/atoms/List/List.stories.tsx +143 -0
  74. package/src/gui/atoms/List/List.tsx +20 -0
  75. package/src/gui/atoms/ListItem/ListItem.resolver.tsx +88 -0
  76. package/src/gui/atoms/ListItem/ListItem.stories.tsx +157 -0
  77. package/src/gui/atoms/ListItem/ListItem.tsx +19 -0
  78. package/src/gui/atoms/ListItemButton/ListItemButton.resolver.tsx +208 -0
  79. package/src/gui/atoms/ListItemButton/ListItemButton.stories.tsx +161 -0
  80. package/src/gui/atoms/ListItemButton/ListItemButton.tsx +15 -0
  81. package/src/gui/atoms/ListItemIcon/ListItemIcon.resolver.tsx +102 -0
  82. package/src/gui/atoms/ListItemIcon/ListItemIcon.stories.tsx +135 -0
  83. package/src/gui/atoms/ListItemIcon/ListItemIcon.tsx +11 -0
  84. package/src/gui/atoms/ListItemText/ListItemText.resolver.tsx +112 -0
  85. package/src/gui/atoms/ListItemText/ListItemText.stories.tsx +162 -0
  86. package/src/gui/atoms/ListItemText/ListItemText.tsx +15 -0
  87. package/src/gui/atoms/Menu/Menu.resolver.tsx +112 -0
  88. package/src/gui/atoms/Menu/Menu.stories.tsx +168 -0
  89. package/src/gui/atoms/Menu/Menu.tsx +17 -0
  90. package/src/gui/atoms/MenuItem/MenuItem.resolver.tsx +183 -0
  91. package/src/gui/atoms/MenuItem/MenuItem.stories.tsx +138 -0
  92. package/src/gui/atoms/MenuItem/MenuItem.tsx +14 -0
  93. package/src/gui/atoms/Paper/Paper.resolver.tsx +98 -0
  94. package/src/gui/atoms/Paper/Paper.stories.tsx +191 -0
  95. package/src/gui/atoms/Paper/Paper.tsx +17 -0
  96. package/src/gui/atoms/Stack/Stack.resolver.tsx +94 -0
  97. package/src/gui/atoms/Stack/Stack.stories.tsx +166 -0
  98. package/src/gui/atoms/Stack/Stack.tsx +15 -0
  99. package/src/gui/atoms/Switch/Switch.resolver.tsx +53 -0
  100. package/src/gui/atoms/Switch/Switch.stories.tsx +242 -0
  101. package/src/gui/atoms/Switch/Switch.tsx +22 -0
  102. package/src/gui/atoms/Toolbar/Toolbar.resolver.tsx +60 -0
  103. package/src/gui/atoms/Toolbar/Toolbar.stories.tsx +163 -0
  104. package/src/gui/atoms/Toolbar/Toolbar.tsx +16 -0
  105. package/src/gui/atoms/Tooltip/Tooltip.resolver.tsx +142 -0
  106. package/src/gui/atoms/Tooltip/Tooltip.stories.tsx +118 -0
  107. package/src/gui/atoms/Tooltip/Tooltip.tsx +78 -0
  108. package/src/gui/atoms/Typography/Typography.resolver.tsx +158 -0
  109. package/src/gui/atoms/Typography/Typography.stories.tsx +228 -0
  110. package/src/gui/atoms/Typography/Typography.tsx +27 -0
  111. package/src/gui/atoms.tsx +129 -0
  112. package/src/gui/index.ts +69 -0
  113. package/src/gui/molecules/AppBars/Footer/Footer.resolver.tsx +104 -0
  114. package/src/gui/molecules/AppBars/Footer/Footer.stories.tsx +499 -0
  115. package/src/gui/molecules/AppBars/Footer/Footer.tsx +307 -0
  116. package/src/gui/molecules/AppBars/LeftSidebar/LeftSidebar.resolver.tsx +75 -0
  117. package/src/gui/molecules/AppBars/LeftSidebar/LeftSidebar.stories.tsx +61 -0
  118. package/src/gui/molecules/AppBars/LeftSidebar/LeftSidebar.tsx +511 -0
  119. package/src/gui/molecules/AppBars/LeftSidebar/SidebarToggleButton.tsx +51 -0
  120. package/src/gui/molecules/AppBars/RightSidebar/RightSidebar.resolver.tsx +97 -0
  121. package/src/gui/molecules/AppBars/RightSidebar/RightSidebar.stories.tsx +294 -0
  122. package/src/gui/molecules/AppBars/RightSidebar/RightSidebar.tsx +295 -0
  123. package/src/gui/molecules/AppBars/StickyOptions/StickyOptionsTop.stories.tsx +480 -0
  124. package/src/gui/molecules/AppBars/StickyOptions/StickyOptionsTop.tsx +484 -0
  125. package/src/gui/molecules/AppBars/TopBar/TopBar.resolver.tsx +84 -0
  126. package/src/gui/molecules/AppBars/TopBar/TopBar.stories.tsx +297 -0
  127. package/src/gui/molecules/AppBars/TopBar/TopBar.tsx +299 -0
  128. package/src/gui/molecules/Utilities/ThemeModeToggle/ThemeModeToggle.resolver.tsx +72 -0
  129. package/src/gui/molecules/Utilities/ThemeModeToggle/ThemeModeToggle.stories.tsx +154 -0
  130. package/src/gui/molecules/Utilities/ThemeModeToggle/ThemeModeToggle.tsx +100 -0
  131. package/src/gui/molecules/Utilities/ThemeSelector.jsx +281 -0
  132. package/src/gui/utils/nodeID.ts +8 -0
  133. package/src/index.js +111 -0
  134. package/src/registry/GuiRegistry.ts +19 -0
  135. package/src/registry/factory.ts +12 -0
  136. package/src/registry/index.ts +3 -0
  137. package/src/registry/types.ts +6 -0
  138. package/src/stories/01.Home.mdx +22 -0
  139. package/src/stories/02.Understanding.This.GUI.md +149 -0
  140. package/src/stories/03.Themes.mdx +235 -0
  141. package/src/stories/04.GuiProvider.md +126 -0
  142. package/src/stories/04.GuiProvider.mdx +129 -0
  143. package/src/stories/Theme/BreakPointsAndGrids.stories.jsx +185 -0
  144. package/src/stories/Theme/Colors.stories.jsx +245 -0
  145. package/src/stories/Theme/Icons.stories.jsx +313 -0
  146. package/src/stories/Theme/Motion.stories.jsx +206 -0
  147. package/src/stories/Theme/ShadowAndElevation.stories.jsx +95 -0
  148. package/src/stories/Theme/SpacingAndRadius.stories.jsx +129 -0
  149. package/src/stories/Theme/Typography.stories.jsx +211 -0
  150. package/src/stories/assets/this.GUI.png +0 -0
  151. package/src/templates/BrowserExtension.jsx +56 -0
  152. package/src/templates/Layout.tsx +36 -0
  153. package/src/templates/Minimal.jsx +123 -0
  154. package/src/templates/Shell/Shell.jsx +107 -0
  155. package/src/themes/fromTokens.ts +352 -0
  156. package/src/themes/icons/Icon.tsx +137 -0
  157. package/src/themes/icons/packs/Lucide.ts +72 -0
  158. package/src/themes/icons/packs/Material.ts +87 -0
  159. package/src/themes/icons/registry.tsx +178 -0
  160. package/src/themes/index.js +116 -0
  161. package/src/themes/theme.d.ts +116 -0
  162. package/src/themes/tokens/global.tokens.json +107 -0
  163. package/src/themes/tokens/neurons/dark.tokens.json +45 -0
  164. package/src/themes/tokens/neurons/light.tokens.json +51 -0
  165. package/src/themes/tokens/neurons/manifest.json +23 -0
  166. package/src/types/theme.d.ts +32 -0
  167. package/src/types/viewport.ts +132 -0
  168. package/tsconfig.json +24 -0
  169. package/vite.config.js +74 -0
  170. package/dist/style.css +0 -1
  171. package/src/App.jsx +0 -39
  172. package/src/CreatePage.jsx +0 -61
  173. package/src/MDXEditor.jsx +0 -51
  174. package/src/MdxProvider.jsx +0 -20
  175. package/src/Page.jsx +0 -28
  176. package/src/PageDashboard.jsx +0 -56
  177. package/src/SiteBuilder.jsx +0 -108
  178. package/src/example.json +0 -43
  179. package/src/index.mdx +0 -164
  180. package/src/main.jsx +0 -15
  181. package/src/scripts/ComponentRegistry.js +0 -70
  182. package/src/scripts/logASCIIArt.js +0 -12
  183. package/src/scripts/postinstall.js +0 -111
  184. package/src/scripts/renderComponents.js +0 -11
  185. package/src/stories/Atoms/Alert/Alert.css +0 -211
  186. package/src/stories/Atoms/Alert/Alert.jsx +0 -56
  187. package/src/stories/Atoms/Alert/Alert.stories.jsx +0 -167
  188. package/src/stories/Atoms/Audio/Audio.css +0 -259
  189. package/src/stories/Atoms/Audio/Audio.jsx +0 -216
  190. package/src/stories/Atoms/Audio/Audio.stories.jsx +0 -191
  191. package/src/stories/Atoms/Badge/Badge.css +0 -249
  192. package/src/stories/Atoms/Badge/Badge.jsx +0 -54
  193. package/src/stories/Atoms/Badge/Badge.stories.jsx +0 -121
  194. package/src/stories/Atoms/Button/Button.css +0 -332
  195. package/src/stories/Atoms/Button/Button.jsx +0 -44
  196. package/src/stories/Atoms/Button/Button.stories.jsx +0 -209
  197. package/src/stories/Atoms/Caption/Caption.css +0 -169
  198. package/src/stories/Atoms/Caption/Caption.jsx +0 -72
  199. package/src/stories/Atoms/Caption/Caption.stories.jsx +0 -207
  200. package/src/stories/Atoms/Checkbox/Checkbox.css +0 -182
  201. package/src/stories/Atoms/Checkbox/Checkbox.jsx +0 -83
  202. package/src/stories/Atoms/Checkbox/Checkbox.stories.jsx +0 -112
  203. package/src/stories/Atoms/Container/Container.css +0 -470
  204. package/src/stories/Atoms/Container/Container.jsx +0 -116
  205. package/src/stories/Atoms/Container/Container.stories.jsx +0 -145
  206. package/src/stories/Atoms/Divider/Divider.css +0 -147
  207. package/src/stories/Atoms/Divider/Divider.jsx +0 -62
  208. package/src/stories/Atoms/Divider/Divider.stories.jsx +0 -105
  209. package/src/stories/Atoms/Grid/Grid.css +0 -160
  210. package/src/stories/Atoms/Grid/Grid.jsx +0 -43
  211. package/src/stories/Atoms/Grid/Grid.stories.jsx +0 -84
  212. package/src/stories/Atoms/Heading/Heading.css +0 -112
  213. package/src/stories/Atoms/Heading/Heading.jsx +0 -69
  214. package/src/stories/Atoms/Heading/Heading.stories.jsx +0 -130
  215. package/src/stories/Atoms/Icon/Icon.css +0 -240
  216. package/src/stories/Atoms/Icon/Icon.jsx +0 -80
  217. package/src/stories/Atoms/Icon/Icon.stories.jsx +0 -177
  218. package/src/stories/Atoms/Image/Image.css +0 -245
  219. package/src/stories/Atoms/Image/Image.jsx +0 -175
  220. package/src/stories/Atoms/Image/Image.stories.jsx +0 -332
  221. package/src/stories/Atoms/Label/Label.css +0 -171
  222. package/src/stories/Atoms/Label/Label.jsx +0 -71
  223. package/src/stories/Atoms/Label/Label.stories.jsx +0 -180
  224. package/src/stories/Atoms/Link/Link.css +0 -51
  225. package/src/stories/Atoms/Link/Link.jsx +0 -72
  226. package/src/stories/Atoms/Link/Link.stories.jsx +0 -153
  227. package/src/stories/Atoms/Loader/Loader.css +0 -106
  228. package/src/stories/Atoms/Loader/Loader.jsx +0 -58
  229. package/src/stories/Atoms/Loader/Loader.stories.jsx +0 -99
  230. package/src/stories/Atoms/Logo/Logo.css +0 -94
  231. package/src/stories/Atoms/Logo/Logo.jsx +0 -53
  232. package/src/stories/Atoms/Logo/Logo.stories.jsx +0 -120
  233. package/src/stories/Atoms/Paragraph/Paragraph.css +0 -180
  234. package/src/stories/Atoms/Paragraph/Paragraph.jsx +0 -77
  235. package/src/stories/Atoms/Paragraph/Paragraph.stories.jsx +0 -143
  236. package/src/stories/Atoms/ProgressBar/ProgressBar.css +0 -127
  237. package/src/stories/Atoms/ProgressBar/ProgressBar.jsx +0 -40
  238. package/src/stories/Atoms/ProgressBar/ProgressBar.stories.jsx +0 -86
  239. package/src/stories/Atoms/RadioButton/RadioButton.css +0 -130
  240. package/src/stories/Atoms/RadioButton/RadioButton.jsx +0 -87
  241. package/src/stories/Atoms/RadioButton/RadioButton.stories.jsx +0 -113
  242. package/src/stories/Atoms/Range/Range.css +0 -169
  243. package/src/stories/Atoms/Range/Range.jsx +0 -87
  244. package/src/stories/Atoms/Range/Range.stories.jsx +0 -110
  245. package/src/stories/Atoms/Section/Section.css +0 -268
  246. package/src/stories/Atoms/Section/Section.jsx +0 -63
  247. package/src/stories/Atoms/Section/Section.stories.jsx +0 -46
  248. package/src/stories/Atoms/Select/Select.css +0 -87
  249. package/src/stories/Atoms/Select/Select.jsx +0 -73
  250. package/src/stories/Atoms/Select/Select.stories.jsx +0 -109
  251. package/src/stories/Atoms/Slider/Slider.css +0 -90
  252. package/src/stories/Atoms/Slider/Slider.jsx +0 -129
  253. package/src/stories/Atoms/Slider/Slider.stories.jsx +0 -90
  254. package/src/stories/Atoms/Snackbar/Snackbar.css +0 -313
  255. package/src/stories/Atoms/Snackbar/Snackbar.jsx +0 -72
  256. package/src/stories/Atoms/Snackbar/Snackbar.stories.jsx +0 -78
  257. package/src/stories/Atoms/Spacer/Spacer.css +0 -114
  258. package/src/stories/Atoms/Spacer/Spacer.jsx +0 -35
  259. package/src/stories/Atoms/Spacer/Spacer.stories.jsx +0 -61
  260. package/src/stories/Atoms/Spinner/Spinner.css +0 -110
  261. package/src/stories/Atoms/Spinner/Spinner.jsx +0 -65
  262. package/src/stories/Atoms/Spinner/Spinner.stories.jsx +0 -58
  263. package/src/stories/Atoms/Tag/Tag.css +0 -112
  264. package/src/stories/Atoms/Tag/Tag.jsx +0 -75
  265. package/src/stories/Atoms/Tag/Tag.stories.jsx +0 -67
  266. package/src/stories/Atoms/TextArea/TextArea.css +0 -99
  267. package/src/stories/Atoms/TextArea/TextArea.jsx +0 -118
  268. package/src/stories/Atoms/TextArea/TextArea.stories.jsx +0 -36
  269. package/src/stories/Atoms/TextInput/TextInput.css +0 -102
  270. package/src/stories/Atoms/TextInput/TextInput.jsx +0 -133
  271. package/src/stories/Atoms/TextInput/TextInput.stories.jsx +0 -69
  272. package/src/stories/Atoms/Toggle/Toggle.css +0 -118
  273. package/src/stories/Atoms/Toggle/Toggle.jsx +0 -69
  274. package/src/stories/Atoms/Toggle/Toggle.stories.jsx +0 -35
  275. package/src/stories/Atoms/Tooltip/Tooltip.css +0 -383
  276. package/src/stories/Atoms/Tooltip/Tooltip.jsx +0 -46
  277. package/src/stories/Atoms/Tooltip/Tooltip.stories.jsx +0 -52
  278. package/src/stories/Atoms/Video/Video.css +0 -39
  279. package/src/stories/Atoms/Video/Video.jsx +0 -78
  280. package/src/stories/Atoms/Video/Video.stories.jsx +0 -41
  281. package/src/stories/Atoms/index.js +0 -72
  282. package/src/stories/Atoms/meta_Atoms.js +0 -51
  283. package/src/stories/Components.js +0 -198
  284. package/src/stories/Getting Started.mdx +0 -239
  285. package/src/stories/Layouts/Accordion/Accordion.css +0 -293
  286. package/src/stories/Layouts/Accordion/Accordion.jsx +0 -74
  287. package/src/stories/Layouts/Accordion/Accordion.stories.jsx +0 -39
  288. package/src/stories/Layouts/Flexbox/Flexbox.css +0 -16
  289. package/src/stories/Layouts/Flexbox/Flexbox.jsx +0 -11
  290. package/src/stories/Layouts/Flexbox/Flexbox.stories.jsx +0 -28
  291. package/src/stories/Layouts/Footer/Footer.css +0 -16
  292. package/src/stories/Layouts/Footer/Footer.jsx +0 -31
  293. package/src/stories/Layouts/Footer/Footer.stories.jsx +0 -28
  294. package/src/stories/Layouts/Header/Header.css +0 -16
  295. package/src/stories/Layouts/Header/Header.jsx +0 -31
  296. package/src/stories/Layouts/Header/Header.stories.jsx +0 -28
  297. package/src/stories/Layouts/HeroBanner/HeroBanner.css +0 -16
  298. package/src/stories/Layouts/HeroBanner/HeroBanner.jsx +0 -31
  299. package/src/stories/Layouts/HeroBanner/HeroBanner.stories.jsx +0 -28
  300. package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.css +0 -16
  301. package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.jsx +0 -31
  302. package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.stories.jsx +0 -28
  303. package/src/stories/Layouts/Pagination/Pagination.css +0 -16
  304. package/src/stories/Layouts/Pagination/Pagination.jsx +0 -31
  305. package/src/stories/Layouts/Pagination/Pagination.stories.jsx +0 -28
  306. package/src/stories/Layouts/Sidebar/Sidebar.css +0 -16
  307. package/src/stories/Layouts/Sidebar/Sidebar.jsx +0 -71
  308. package/src/stories/Layouts/Sidebar/Sidebar.stories.jsx +0 -28
  309. package/src/stories/Layouts/Tabs/Tabs.css +0 -16
  310. package/src/stories/Layouts/Tabs/Tabs.jsx +0 -31
  311. package/src/stories/Layouts/Tabs/Tabs.stories.jsx +0 -28
  312. package/src/stories/Layouts/index.js +0 -25
  313. package/src/stories/Layouts/meta_Layouts.js +0 -28
  314. package/src/stories/MDX.mdx +0 -118
  315. package/src/stories/Miscellaneous/Miscellaneous.js +0 -24
  316. package/src/stories/Molecules/Accordion/Accordion.css +0 -4
  317. package/src/stories/Molecules/Accordion/Accordion.jsx +0 -25
  318. package/src/stories/Molecules/Accordion/Accordion.stories.jsx +0 -20
  319. package/src/stories/Molecules/AudioPlayer/AudioPlayer.css +0 -97
  320. package/src/stories/Molecules/AudioPlayer/AudioPlayer.jsx +0 -244
  321. package/src/stories/Molecules/AudioPlayer/AudioPlayer.stories.jsx +0 -55
  322. package/src/stories/Molecules/AvatarWithName/AvatarWithName.css +0 -130
  323. package/src/stories/Molecules/AvatarWithName/AvatarWithName.jsx +0 -80
  324. package/src/stories/Molecules/AvatarWithName/AvatarWithName.stories.jsx +0 -20
  325. package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.css +0 -147
  326. package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.jsx +0 -51
  327. package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.stories.jsx +0 -36
  328. package/src/stories/Molecules/ButtonGroup/ButtonGroup.css +0 -465
  329. package/src/stories/Molecules/ButtonGroup/ButtonGroup.jsx +0 -47
  330. package/src/stories/Molecules/ButtonGroup/ButtonGroup.stories.jsx +0 -44
  331. package/src/stories/Molecules/Card/Card.css +0 -41
  332. package/src/stories/Molecules/Card/Card.jsx +0 -92
  333. package/src/stories/Molecules/Card/Card.stories.jsx +0 -34
  334. package/src/stories/Molecules/ComparisonTable/ComparisonTable.css +0 -35
  335. package/src/stories/Molecules/ComparisonTable/ComparisonTable.jsx +0 -104
  336. package/src/stories/Molecules/ComparisonTable/ComparisonTable.stories.jsx +0 -81
  337. package/src/stories/Molecules/DataTable/DataTable.css +0 -4
  338. package/src/stories/Molecules/DataTable/DataTable.jsx +0 -25
  339. package/src/stories/Molecules/DataTable/DataTable.stories.jsx +0 -20
  340. package/src/stories/Molecules/Dropdown/Dropdown.css +0 -192
  341. package/src/stories/Molecules/Dropdown/Dropdown.jsx +0 -96
  342. package/src/stories/Molecules/Dropdown/Dropdown.stories.jsx +0 -45
  343. package/src/stories/Molecules/FileUpload/FileUpload.css +0 -4
  344. package/src/stories/Molecules/FileUpload/FileUpload.jsx +0 -25
  345. package/src/stories/Molecules/FileUpload/FileUpload.stories.jsx +0 -20
  346. package/src/stories/Molecules/FormField/FormField.css +0 -4
  347. package/src/stories/Molecules/FormField/FormField.jsx +0 -25
  348. package/src/stories/Molecules/FormField/FormField.stories.jsx +0 -20
  349. package/src/stories/Molecules/Header/Header.css +0 -35
  350. package/src/stories/Molecules/Header/Header.jsx +0 -76
  351. package/src/stories/Molecules/Header/Header.stories.jsx +0 -28
  352. package/src/stories/Molecules/IconButton/IconButton.css +0 -4
  353. package/src/stories/Molecules/IconButton/IconButton.jsx +0 -25
  354. package/src/stories/Molecules/IconButton/IconButton.stories.jsx +0 -20
  355. package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.css +0 -4
  356. package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.jsx +0 -25
  357. package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.stories.jsx +0 -20
  358. package/src/stories/Molecules/InputGroup/InputGroup.css +0 -4
  359. package/src/stories/Molecules/InputGroup/InputGroup.jsx +0 -25
  360. package/src/stories/Molecules/InputGroup/InputGroup.stories.jsx +0 -20
  361. package/src/stories/Molecules/InputWithLabel/InputWithLabel.css +0 -4
  362. package/src/stories/Molecules/InputWithLabel/InputWithLabel.jsx +0 -25
  363. package/src/stories/Molecules/InputWithLabel/InputWithLabel.stories.jsx +0 -20
  364. package/src/stories/Molecules/List/List.css +0 -4
  365. package/src/stories/Molecules/List/List.jsx +0 -25
  366. package/src/stories/Molecules/List/List.stories.jsx +0 -20
  367. package/src/stories/Molecules/MediaCard/MediaCard.css +0 -4
  368. package/src/stories/Molecules/MediaCard/MediaCard.jsx +0 -25
  369. package/src/stories/Molecules/MediaCard/MediaCard.stories.jsx +0 -20
  370. package/src/stories/Molecules/Modal/Modal.css +0 -4
  371. package/src/stories/Molecules/Modal/Modal.jsx +0 -25
  372. package/src/stories/Molecules/Modal/Modal.stories.jsx +0 -20
  373. package/src/stories/Molecules/Navbar/Navbar.css +0 -91
  374. package/src/stories/Molecules/Navbar/Navbar.jsx +0 -82
  375. package/src/stories/Molecules/Navbar/Navbar.stories.jsx +0 -70
  376. package/src/stories/Molecules/Notification/Notification.css +0 -4
  377. package/src/stories/Molecules/Notification/Notification.jsx +0 -25
  378. package/src/stories/Molecules/Notification/Notification.stories.jsx +0 -20
  379. package/src/stories/Molecules/PricingTable/PricingTable.css +0 -4
  380. package/src/stories/Molecules/PricingTable/PricingTable.jsx +0 -25
  381. package/src/stories/Molecules/PricingTable/PricingTable.stories.jsx +0 -20
  382. package/src/stories/Molecules/SearchBar/SearchBar.css +0 -69
  383. package/src/stories/Molecules/SearchBar/SearchBar.jsx +0 -73
  384. package/src/stories/Molecules/SearchBar/SearchBar.stories.jsx +0 -29
  385. package/src/stories/Molecules/SelectTheme/SelectTheme.css +0 -25
  386. package/src/stories/Molecules/SelectTheme/SelectTheme.jsx +0 -22
  387. package/src/stories/Molecules/SelectTheme/SelectTheme.stories.jsx +0 -24
  388. package/src/stories/Molecules/Sidebar/Sidebar.css +0 -67
  389. package/src/stories/Molecules/Sidebar/Sidebar.jsx +0 -80
  390. package/src/stories/Molecules/Sidebar/Sidebar.stories.jsx +0 -35
  391. package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.css +0 -4
  392. package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.jsx +0 -25
  393. package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.stories.jsx +0 -20
  394. package/src/stories/Molecules/index.js +0 -58
  395. package/src/stories/Molecules/meta_Molecules.js +0 -47
  396. package/src/stories/Organisms/Profile/UserFriends/UserFriends.context.jsx +0 -15
  397. package/src/stories/Organisms/Profile/UserFriends/UserFriends.css +0 -4
  398. package/src/stories/Organisms/Profile/UserFriends/UserFriends.jsx +0 -13
  399. package/src/stories/Organisms/Profile/UserFriends/UserFriends.stories.jsx +0 -26
  400. package/src/stories/Organisms/Profile/UserPosts/UserPosts.context.jsx +0 -15
  401. package/src/stories/Organisms/Profile/UserPosts/UserPosts.css +0 -4
  402. package/src/stories/Organisms/Profile/UserPosts/UserPosts.jsx +0 -13
  403. package/src/stories/Organisms/Profile/UserPosts/UserPosts.stories.jsx +0 -26
  404. package/src/stories/Organisms/Profile/UserProfile/UserProfile.context.jsx +0 -15
  405. package/src/stories/Organisms/Profile/UserProfile/UserProfile.css +0 -4
  406. package/src/stories/Organisms/Profile/UserProfile/UserProfile.jsx +0 -13
  407. package/src/stories/Organisms/Profile/UserProfile/UserProfile.stories.jsx +0 -26
  408. package/src/stories/Organisms/meta_Organisms.js +0 -39
  409. package/src/stories/Pages/Page/Page.css +0 -69
  410. package/src/stories/Pages/Page/Page.jsx +0 -69
  411. package/src/stories/Pages/Page/Page.stories.js +0 -26
  412. package/src/stories/Pages/Page/Pages.js +0 -31
  413. package/src/stories/Templates/AdminDashboard/AdminDashboard.css +0 -7
  414. package/src/stories/Templates/AdminDashboard/AdminDashboard.jsx +0 -24
  415. package/src/stories/Templates/AdminDashboard/AdminDashboard.stories.jsx +0 -20
  416. package/src/stories/Templates/CallToAction/CallToAction.css +0 -7
  417. package/src/stories/Templates/CallToAction/CallToAction.jsx +0 -24
  418. package/src/stories/Templates/CallToAction/CallToAction.stories.jsx +0 -20
  419. package/src/stories/Templates/FeaturesList/FeaturesList.css +0 -7
  420. package/src/stories/Templates/FeaturesList/FeaturesList.jsx +0 -24
  421. package/src/stories/Templates/FeaturesList/FeaturesList.stories.jsx +0 -20
  422. package/src/stories/Templates/FormSection/FormSection.css +0 -7
  423. package/src/stories/Templates/FormSection/FormSection.jsx +0 -24
  424. package/src/stories/Templates/FormSection/FormSection.stories.jsx +0 -20
  425. package/src/stories/Templates/HeroSection/HeroSection.css +0 -7
  426. package/src/stories/Templates/HeroSection/HeroSection.jsx +0 -24
  427. package/src/stories/Templates/HeroSection/HeroSection.stories.jsx +0 -20
  428. package/src/stories/Templates/LocationInfo/LocationInfo.css +0 -7
  429. package/src/stories/Templates/LocationInfo/LocationInfo.jsx +0 -24
  430. package/src/stories/Templates/LocationInfo/LocationInfo.stories.jsx +0 -20
  431. package/src/stories/Templates/ProductPage/ProductPage.css +0 -7
  432. package/src/stories/Templates/ProductPage/ProductPage.jsx +0 -24
  433. package/src/stories/Templates/ProductPage/ProductPage.stories.jsx +0 -20
  434. package/src/stories/Templates/RegistrationPage/RegistrationPage.css +0 -7
  435. package/src/stories/Templates/RegistrationPage/RegistrationPage.jsx +0 -24
  436. package/src/stories/Templates/RegistrationPage/RegistrationPage.stories.jsx +0 -20
  437. package/src/stories/Templates/ShoppingCart/ShoppingCart.css +0 -7
  438. package/src/stories/Templates/ShoppingCart/ShoppingCart.jsx +0 -24
  439. package/src/stories/Templates/ShoppingCart/ShoppingCart.stories.jsx +0 -20
  440. package/src/stories/Templates/SidebarTopNav/SidebarTopNav.css +0 -7
  441. package/src/stories/Templates/SidebarTopNav/SidebarTopNav.jsx +0 -24
  442. package/src/stories/Templates/SidebarTopNav/SidebarTopNav.stories.jsx +0 -20
  443. package/src/stories/Templates/SignInPage/SignInPage.css +0 -7
  444. package/src/stories/Templates/SignInPage/SignInPage.jsx +0 -24
  445. package/src/stories/Templates/SignInPage/SignInPage.stories.jsx +0 -20
  446. package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.css +0 -7
  447. package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.jsx +0 -24
  448. package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.stories.jsx +0 -20
  449. package/src/stories/Templates/Testimonials/Testimonials.css +0 -7
  450. package/src/stories/Templates/Testimonials/Testimonials.jsx +0 -24
  451. package/src/stories/Templates/Testimonials/Testimonials.stories.jsx +0 -20
  452. package/src/stories/Templates/index.js +0 -33
  453. package/src/stories/Templates/meta_Templates.js +0 -29
  454. package/src/stories/assets/accessibility.png +0 -0
  455. package/src/stories/assets/accessibility.svg +0 -1
  456. package/src/stories/assets/addon-library.png +0 -0
  457. package/src/stories/assets/assets.png +0 -0
  458. package/src/stories/assets/avif-test-image.avif +0 -0
  459. package/src/stories/assets/context.png +0 -0
  460. package/src/stories/assets/discord.svg +0 -1
  461. package/src/stories/assets/docs.png +0 -0
  462. package/src/stories/assets/figma-plugin.png +0 -0
  463. package/src/stories/assets/github.svg +0 -1
  464. package/src/stories/assets/logo.png +0 -0
  465. package/src/stories/assets/logo.svg +0 -106
  466. package/src/stories/assets/share.png +0 -0
  467. package/src/stories/assets/styling.png +0 -0
  468. package/src/stories/assets/test.svg +0 -3
  469. package/src/stories/assets/testing.png +0 -0
  470. package/src/stories/assets/theming.png +0 -0
  471. package/src/stories/assets/tutorials.svg +0 -1
  472. package/src/stories/assets/youtube.svg +0 -1
  473. package/src/themes/README_Styles.md +0 -301
  474. package/src/themes/ThemeProvider.jsx +0 -61
  475. package/src/themes/styles/github/dark.css +0 -0
  476. package/src/themes/styles/github/light.css +0 -0
  477. package/src/themes/styles/neurons/dark.css +0 -247
  478. package/src/themes/styles/neurons/light.css +0 -170
  479. /package/{src/themes/styles/dracula/dark.css → .storybook/preview-head.html} +0 -0
  480. /package/src/{themes/styles/dracula/light.css → components/this.me/MeCard.jsx} +0 -0
@@ -0,0 +1,511 @@
1
+ import * as React from 'react';
2
+ import { Link as RouterLink, useLocation, useNavigate } from 'react-router-dom';
3
+ import type { SxProps, Theme } from '@mui/material/styles';
4
+ import { Box, Drawer, List, ListItemButton, ListItemIcon, ListItemText, IconButton, Tooltip, Collapse } from '@/gui/atoms';
5
+ import Icon from '../../../../themes/icons/Icon';
6
+ import { memo, useCallback, useState } from 'react';
7
+ import SidebarToggleButton from './SidebarToggleButton';
8
+
9
+ const MemoizedListItemButton = memo(ListItemButton);
10
+
11
+ /**
12
+ * LeftSidebar — single-file implementation (reset)
13
+ *
14
+ * Goals:
15
+ * - Fixed rail column width on desktop (collapsedWidth)
16
+ * - Optional expanded overlay panel to the right (does not move TopBar)
17
+ * - Full height; starts below TopBar if present via CSS var `--gui-nav-height`
18
+ * - Mobile: temporary drawer overlay
19
+ */
20
+
21
+ // -------------------- Types --------------------
22
+ export type RouteItem = {
23
+ label: string;
24
+ href?: string;
25
+ external?: boolean;
26
+ icon?: string | React.ReactNode | React.ComponentType<any>;
27
+ iconColor?: string;
28
+ children?: RouteItem[];
29
+ };
30
+
31
+ export type LeftSidebarProps = {
32
+ drawerLinks?: RouteItem[];
33
+ /** Desktop rail width (px). */
34
+ collapsedWidth?: number;
35
+ /** Overlay panel width when expanded (px). */
36
+ expandedWidth?: number;
37
+ /** Start in expanded (desktop only). */
38
+ expanded?: boolean;
39
+ /** Temporary drawer on mobile. If provided, controls open state. */
40
+ open?: boolean;
41
+ onClose?: () => void;
42
+ /** Optional id/class for .MuiDrawer-root */
43
+ id?: string;
44
+ className?: string;
45
+ /** Whether to show the sidebar toggle button (from layout context/prop) */
46
+ shouldShowToggle?: boolean;
47
+ /** If true, forces "rail" (collapsed) mode visually on desktop */
48
+ railMode?: boolean;
49
+ /** Where to show the sidebar toggle button */
50
+ toggleLocation?: 'topbar' | 'sidebar' | 'none';
51
+ };
52
+
53
+ // -------------------- Component --------------------
54
+ export default function LeftSidebar({
55
+ drawerLinks = [],
56
+ collapsedWidth = 72,
57
+ expandedWidth = 264,
58
+ expanded: expandedProp,
59
+ open: openProp,
60
+ onClose,
61
+ id,
62
+ className,
63
+ shouldShowToggle = false,
64
+ railMode = false,
65
+ toggleLocation = 'sidebar',
66
+ }: LeftSidebarProps) {
67
+ // Simple media query using window width to avoid external hooks
68
+ const isMobile = typeof window !== 'undefined' ? window.matchMedia('(max-width: 959.95px)').matches : false;
69
+ const location = useLocation();
70
+ const [internalOpen, setInternalOpen] = React.useState(false);
71
+ const open = typeof openProp === 'boolean' ? openProp : internalOpen;
72
+ const toggleMobile = () => {
73
+ if (typeof openProp === 'boolean') return onClose?.();
74
+ setInternalOpen((v) => !v);
75
+ };
76
+
77
+ const [expanded, setExpanded] = React.useState(!!expandedProp);
78
+ // Removed CSS variable logic for sidebar toggle location
79
+
80
+ // Top inset (reads CSS var set by TopBar) so the sidebar starts below it
81
+ const navHeightVar = 'var(--gui-nav-height, 0px)';
82
+
83
+ const navigate = useNavigate();
84
+
85
+ // State to track which groups are open in expanded mode
86
+ const [openGroups, setOpenGroups] = useState<Record<string, boolean>>({});
87
+
88
+ const toggleGroup = (label: string) => {
89
+ setOpenGroups((prev) => ({ ...prev, [label]: !prev[label] }));
90
+ };
91
+
92
+ const go = (href?: string, external?: boolean) => {
93
+ if (!href) return;
94
+ if (external) {
95
+ window.open(href, '_blank', 'noopener,noreferrer');
96
+ } else {
97
+ navigate(href);
98
+ if (isMobile) toggleMobile();
99
+ }
100
+ };
101
+
102
+ // -------------------- Render helpers --------------------
103
+ const renderIcon = (node?: RouteItem['icon'], color?: string, size = 20) => {
104
+ if (!node) return null;
105
+ if (typeof node === 'string') return <Icon name={node} iconColor={color} size={size} />;
106
+ if (typeof node === 'function') return React.createElement(node as React.ComponentType<any>);
107
+ return node as React.ReactElement;
108
+ };
109
+
110
+ // Render drawer links recursively for expanded sidebar, showing nested items inline
111
+ // Adjusted to handle behavior based on expanded state ('railview' or 'expanded')
112
+ const renderExpandedItems = (items: RouteItem[], level = 0) => {
113
+ return items.map((route) => {
114
+ const isSelected = !!(route.href && location.pathname === route.href);
115
+ const hasChildren = Array.isArray(route.children) && route.children.length > 0;
116
+ const isOpen = openGroups[route.label] || false;
117
+
118
+ if (hasChildren) {
119
+ if (!expanded) {
120
+ // railview behavior: clicking a parent shows nested items as a separate floating menu (keep current behavior)
121
+ return (
122
+ <React.Fragment key={route.label}>
123
+ <ListItemButton
124
+ onClick={() => toggleGroup(route.label)}
125
+ selected={isSelected}
126
+ aria-haspopup="true"
127
+ aria-expanded={isOpen}
128
+ sx={[
129
+ { pl: 2 + level * 2, minHeight: 44 },
130
+ level > 1 && ((theme: Theme) => ({
131
+ position: 'relative',
132
+ pl: level * 2 + 1,
133
+ ml: level > 2 ? 2 : 1,
134
+ '&::before': {
135
+ content: '""',
136
+ position: 'absolute',
137
+ left: `${level * 8}px`,
138
+ top: 0,
139
+ bottom: 0,
140
+ width: '1px',
141
+ backgroundImage: theme.palette.mode === 'light'
142
+ ? 'linear-gradient(rgba(0,0,0,0.2) 40%, transparent 40%)'
143
+ : 'linear-gradient(rgba(255,255,255,0.2) 40%, transparent 40%)',
144
+ backgroundSize: '1px 6px',
145
+ backgroundRepeat: 'repeat-y',
146
+ },
147
+ '&::after': {
148
+ content: '""',
149
+ position: 'absolute',
150
+ left: `${level * 8}px`,
151
+ top: '50%',
152
+ width: '12px',
153
+ height: '1px',
154
+ borderTop: `1px dashed ${
155
+ theme.palette.mode === 'light' ? 'rgba(0,0,0,0.2)' : 'rgba(255,255,255,0.2)'
156
+ }`,
157
+ },
158
+ '&:hover::after': {
159
+ borderTop: `1px dashed ${theme.palette.text.secondary}`,
160
+ },
161
+ })),
162
+ ]}
163
+ >
164
+ <ListItemIcon sx={{ minWidth: 24, mr: 1 }}>{renderIcon(route.icon, route.iconColor, 20)}</ListItemIcon>
165
+ <ListItemText primary={route.label} />
166
+ <Icon name={isOpen ? "mui:ExpandLess" : "mui:ExpandMore"} size={18} />
167
+ </ListItemButton>
168
+ <Collapse in={isOpen} timeout="auto" unmountOnExit>
169
+ <List disablePadding>
170
+ {renderExpandedItems(route.children!, level + 1)}
171
+ </List>
172
+ </Collapse>
173
+ </React.Fragment>
174
+ );
175
+ } else {
176
+ // expanded behavior: render inline with Collapse and styled nested items
177
+ return (
178
+ <React.Fragment key={route.label}>
179
+ <ListItemButton
180
+ onClick={() => toggleGroup(route.label)}
181
+ selected={isSelected}
182
+ aria-haspopup="true"
183
+ aria-expanded={isOpen}
184
+ sx={{
185
+ pl: 2 + level * 2,
186
+ minHeight: 44,
187
+ }}
188
+ >
189
+ <ListItemIcon sx={{ minWidth: 24, mr: 1 }}>{renderIcon(route.icon, route.iconColor, 20)}</ListItemIcon>
190
+ <ListItemText primary={route.label} />
191
+ <Icon name={isOpen ? "mui:ExpandLess" : "mui:ExpandMore"} size={18} />
192
+ </ListItemButton>
193
+ <Collapse in={isOpen} timeout="auto" unmountOnExit>
194
+ <List disablePadding>
195
+ {route.children!.map((child) => {
196
+ const childSelected = !!(child.href && location.pathname === child.href);
197
+ const toProps: any = child.external
198
+ ? { component: 'a', href: child.href, target: '_blank', rel: 'noopener noreferrer' }
199
+ : { component: RouterLink, to: child.href || '#' };
200
+ return (
201
+ <ListItemButton
202
+ key={child.label}
203
+ {...toProps}
204
+ selected={childSelected}
205
+ onClick={() => { if (!child.external) { if (!child.href) return; navigate(child.href); } if (isMobile) toggleMobile(); }}
206
+ sx={(theme: Theme) => ({
207
+ position: 'relative',
208
+ pl: level * 2 + 1,
209
+ ml: level > 2 ? 2 : 1,
210
+ fontSize: level === 3 ? '0.85rem' : '0.9rem',
211
+ '&::before': {
212
+ content: '""',
213
+ position: 'absolute',
214
+ left: `${level * 8}px`,
215
+ top: 0,
216
+ bottom: 0,
217
+ width: '1px',
218
+ backgroundImage: theme.palette.mode === 'light'
219
+ ? 'linear-gradient(rgba(0,0,0,0.2) 40%, transparent 40%)'
220
+ : 'linear-gradient(rgba(255,255,255,0.2) 40%, transparent 40%)',
221
+ backgroundSize: '1px 6px',
222
+ backgroundRepeat: 'repeat-y',
223
+ },
224
+ '&::after': {
225
+ content: '""',
226
+ position: 'absolute',
227
+ left: `${level * 8}px`,
228
+ top: '50%',
229
+ width: '12px',
230
+ height: '1px',
231
+ borderTop: `1px dashed ${
232
+ theme.palette.mode === 'light' ? 'rgba(0,0,0,0.2)' : 'rgba(255,255,255,0.2)'
233
+ }`,
234
+ },
235
+ '&:hover::after': {
236
+ borderTop: `1px dashed ${theme.palette.text.secondary}`,
237
+ },
238
+ })}
239
+ >
240
+ <ListItemIcon sx={{ minWidth: 24, mr: 1 }}>{renderIcon(child.icon, (child as any).iconColor, 20)}</ListItemIcon>
241
+ <ListItemText primary={child.label} />
242
+ </ListItemButton>
243
+ );
244
+ })}
245
+ </List>
246
+ </Collapse>
247
+ </React.Fragment>
248
+ );
249
+ }
250
+ }
251
+
252
+ const toProps: any = route.external
253
+ ? { component: 'a', href: route.href, target: '_blank', rel: 'noopener noreferrer' }
254
+ : { component: RouterLink, to: route.href || '#' };
255
+
256
+ return (
257
+ <ListItemButton
258
+ key={route.label}
259
+ {...toProps}
260
+ selected={isSelected}
261
+ onClick={() => { if (!route.external) { if (!route.href) return; navigate(route.href); } if (isMobile) toggleMobile(); }}
262
+ sx={[
263
+ { pl: 2 + level * 2, minHeight: 44 },
264
+ level > 1 && ((theme: Theme) => ({
265
+ position: 'relative',
266
+ pl: level * 2 + 1,
267
+ ml: level > 2 ? 2 : 1,
268
+ '&::before': {
269
+ content: '""',
270
+ position: 'absolute',
271
+ left: `${level * 8}px`,
272
+ top: 0,
273
+ bottom: 0,
274
+ width: '1px',
275
+ backgroundImage: theme.palette.mode === 'light'
276
+ ? 'linear-gradient(rgba(0,0,0,0.2) 40%, transparent 40%)'
277
+ : 'linear-gradient(rgba(255,255,255,0.2) 40%, transparent 40%)',
278
+ backgroundSize: '1px 6px',
279
+ backgroundRepeat: 'repeat-y',
280
+ },
281
+ '&::after': {
282
+ content: '""',
283
+ position: 'absolute',
284
+ left: `${level * 8}px`,
285
+ top: '50%',
286
+ width: '12px',
287
+ height: '1px',
288
+ borderTop: `1px dashed ${
289
+ theme.palette.mode === 'light' ? 'rgba(0,0,0,0.2)' : 'rgba(255,255,255,0.2)'
290
+ }`,
291
+ },
292
+ '&:hover::after': {
293
+ borderTop: `1px dashed ${theme.palette.text.secondary}`,
294
+ },
295
+ })),
296
+ ]}
297
+ >
298
+ <ListItemIcon sx={{ minWidth: 24, mr: 1 }}>{renderIcon(route.icon, route.iconColor, 20)}</ListItemIcon>
299
+ <ListItemText primary={route.label} />
300
+ </ListItemButton>
301
+ );
302
+ });
303
+ };
304
+
305
+ // Floating menu for railview: track anchor position for each open group
306
+ const [anchorEls, setAnchorEls] = useState<Record<string, HTMLElement | null>>({});
307
+
308
+ // Helper to handle outside click for floating menus
309
+ React.useEffect(() => {
310
+ const handleClick = (event: MouseEvent) => {
311
+ // If any open group, check if click is outside any open floating menu or its button
312
+ Object.entries(anchorEls).forEach(([label, anchorEl]) => {
313
+ if (openGroups[label] && anchorEl) {
314
+ const menu = document.getElementById(`rail-float-menu-${label}`);
315
+ if (
316
+ menu &&
317
+ !menu.contains(event.target as Node) &&
318
+ !anchorEl.contains(event.target as Node)
319
+ ) {
320
+ setOpenGroups((prev) => ({ ...prev, [label]: false }));
321
+ }
322
+ }
323
+ });
324
+ };
325
+ if (Object.values(openGroups).some(Boolean)) {
326
+ document.addEventListener('mousedown', handleClick);
327
+ return () => document.removeEventListener('mousedown', handleClick);
328
+ }
329
+ }, [openGroups, anchorEls]);
330
+
331
+ const RailList = (
332
+ <List disablePadding sx={{ py: 1, '& .MuiListItemButton-root': { justifyContent: 'center' }, position: 'relative' }}>
333
+ {drawerLinks.map((route) => {
334
+ const hasChildren = Array.isArray(route.children) && route.children.length > 0;
335
+ const isSelected = !!(route.href && location.pathname === route.href);
336
+
337
+ if (hasChildren) {
338
+ // Floating menu for railview
339
+ return (
340
+ <React.Fragment key={route.label}>
341
+ <MemoizedListItemButton
342
+ onClick={(e: React.MouseEvent<HTMLElement>) => {
343
+ // Set anchor for floating menu
344
+ setAnchorEls((prev) => ({ ...prev, [route.label]: e.currentTarget }));
345
+ toggleGroup(route.label);
346
+ }}
347
+ selected={isSelected}
348
+ aria-haspopup="true"
349
+ aria-expanded={openGroups[route.label] || false}
350
+ sx={{ px: 1, py: 1, minHeight: 44 }}
351
+ aria-label={route.label}
352
+ >
353
+ <ListItemIcon sx={{ minWidth: 0, m: 0 }}>
354
+ <Tooltip title={route.label} placement="right" arrow size="xl">
355
+ <span style={{ display: 'inline-flex', lineHeight: 0 }}>
356
+ {renderIcon(route.icon, route.iconColor)}
357
+ </span>
358
+ </Tooltip>
359
+ </ListItemIcon>
360
+ </MemoizedListItemButton>
361
+ {openGroups[route.label] && anchorEls[route.label] && (
362
+ <Box
363
+ id={`rail-float-menu-${route.label}`}
364
+ sx={{
365
+ position: 'fixed',
366
+ // Compute position: right of anchorEl, vertically aligned
367
+ left: (() => {
368
+ const rect = anchorEls[route.label]?.getBoundingClientRect();
369
+ return rect ? rect.right : collapsedWidth;
370
+ })(),
371
+ top: (() => {
372
+ const rect = anchorEls[route.label]?.getBoundingClientRect();
373
+ return rect ? rect.top : 0;
374
+ })(),
375
+ zIndex: 1300,
376
+ bgcolor: 'background.paper',
377
+ boxShadow: 3,
378
+ borderRadius: 1,
379
+ py: 1,
380
+ minWidth: 200,
381
+ // For accessibility: prevent accidental horizontal overflow
382
+ maxHeight: '80vh',
383
+ overflowY: 'auto',
384
+ }}
385
+ >
386
+ {route.children!.map((child) => {
387
+ const childSelected = !!(child.href && location.pathname === child.href);
388
+ const toProps: any = child.external
389
+ ? { component: 'a', href: child.href, target: '_blank', rel: 'noopener noreferrer' }
390
+ : { component: RouterLink, to: child.href || '#' };
391
+ return (
392
+ <ListItemButton
393
+ key={child.label}
394
+ {...toProps}
395
+ selected={childSelected}
396
+ onClick={() => {
397
+ if (!child.external) {
398
+ if (!child.href) return;
399
+ navigate(child.href);
400
+ }
401
+ if (isMobile) toggleMobile();
402
+ // Close the floating menu after click
403
+ setOpenGroups((prev) => ({ ...prev, [route.label]: false }));
404
+ }}
405
+ sx={{
406
+ minHeight: 44,
407
+ }}
408
+ >
409
+ <ListItemIcon sx={{ minWidth: 24 }}>{renderIcon(child.icon, (child as any).iconColor, 18)}</ListItemIcon>
410
+ <ListItemText primary={child.label} />
411
+ </ListItemButton>
412
+ );
413
+ })}
414
+ </Box>
415
+ )}
416
+ </React.Fragment>
417
+ );
418
+ }
419
+
420
+ // Leaf
421
+ const toProps: any = route.external
422
+ ? { component: 'a', href: route.href, target: '_blank', rel: 'noopener noreferrer' }
423
+ : { component: RouterLink, to: route.href || '#' };
424
+
425
+ return (
426
+ <MemoizedListItemButton
427
+ key={route.label}
428
+ {...toProps}
429
+ selected={isSelected}
430
+ onClick={() => { if (!route.external) { if (!route.href) return; navigate(route.href); } if (isMobile) toggleMobile(); }}
431
+ sx={{ px: 1, py: 1, minHeight: 44 }}
432
+ aria-label={route.label}
433
+ >
434
+ <ListItemIcon sx={{ minWidth: 0, m: 0 }}>
435
+ <Tooltip title={route.label} placement="right" arrow size="xl">
436
+ <span style={{ display: 'inline-flex', lineHeight: 0 }}>
437
+ {renderIcon(route.icon, route.iconColor)}
438
+ </span>
439
+ </Tooltip>
440
+ </ListItemIcon>
441
+ </MemoizedListItemButton>
442
+ );
443
+ })}
444
+ </List>
445
+ );
446
+
447
+ const ExpandedList = (
448
+ <List disablePadding sx={{ py: 1, '& .MuiListItemButton-root': { px: 2, minHeight: 44 } }}>
449
+ {renderExpandedItems(drawerLinks)}
450
+ </List>
451
+ );
452
+
453
+ // --------------- Layout ----------------
454
+ // Drawer paper is the rail column with fixed width on desktop.
455
+ const paperSx: SxProps<Theme> = {
456
+ '& .MuiDrawer-paper': {
457
+ position: 'fixed',
458
+ // Top starts just below TopBar border: add 1px
459
+ top: 'calc(var(--gui-nav-height, 48px) + 1px)',
460
+ left: 0,
461
+ // Height subtracts nav height and 1px for border
462
+ height: 'calc(100vh - var(--gui-nav-height, 48px) - 1px)',
463
+ width: isMobile
464
+ ? expandedWidth
465
+ : railMode
466
+ ? collapsedWidth
467
+ : expanded
468
+ ? expandedWidth
469
+ : collapsedWidth,
470
+ transition: 'width 0.3s',
471
+ overflowY: 'auto',
472
+ boxSizing: 'border-box',
473
+ backgroundColor: (theme: any) => theme.palette.background.nav || theme.palette.background.paper,
474
+ borderRight: '1px solid',
475
+ borderColor: 'divider',
476
+ '--has-left-sidebar': 1,
477
+ },
478
+ } as const;
479
+
480
+ return (
481
+ <>
482
+ {/* Rail Drawer */}
483
+ {isMobile ? (
484
+ <Drawer variant="temporary" open={open} onClose={toggleMobile} sx={paperSx} ModalProps={{ keepMounted: true }}>
485
+ {/* Mobile content: show full list inside drawer */}
486
+ <Box sx={{ width: expandedWidth }}>{ExpandedList}</Box>
487
+ </Drawer>
488
+ ) : (
489
+ <Drawer
490
+ variant="permanent"
491
+ open
492
+ sx={paperSx}
493
+ id={id}
494
+ className={className}
495
+ >
496
+ {/* Render the SidebarToggleButton only if shouldShowToggle and not in railMode */}
497
+ {shouldShowToggle && !railMode && (
498
+ <SidebarToggleButton
499
+ expanded={expanded}
500
+ onToggle={() => setExpanded((v) => !v)}
501
+ location={toggleLocation}
502
+ sx={{ mt: 0.5, mx: 1 }}
503
+ />
504
+ )}
505
+ {/* If railMode, always show RailList; else, show expanded or rail */}
506
+ {railMode ? RailList : expanded ? ExpandedList : RailList}
507
+ </Drawer>
508
+ )}
509
+ </>
510
+ );
511
+ }
@@ -0,0 +1,51 @@
1
+ import React from 'react';
2
+ import { Box, IconButton } from '@mui/material';
3
+ import { SxProps, Theme } from '@mui/material/styles';
4
+ import Icon from '../../../../themes/icons/Icon';
5
+
6
+ export interface SidebarToggleButtonProps {
7
+ expanded: boolean;
8
+ onToggle: () => void;
9
+ collapsedWidth?: number;
10
+ style?: React.CSSProperties;
11
+ location?: 'topbar' | 'sidebar' | 'none';
12
+ sx?: SxProps<Theme>;
13
+ forceRender?: boolean;
14
+ }
15
+
16
+ const SidebarToggleButton: React.FC<SidebarToggleButtonProps> = ({
17
+ expanded,
18
+ onToggle,
19
+ collapsedWidth = 72,
20
+ style,
21
+ location,
22
+ sx,
23
+ }) => {
24
+ const [locationState, setLocation] = React.useState<'topbar' | 'sidebar' | 'none'>(location ?? 'none');
25
+
26
+ React.useEffect(() => {
27
+ if (location) {
28
+ setLocation(location);
29
+ }
30
+ }, [location]);
31
+
32
+ if (locationState === 'none') return null;
33
+
34
+ return (
35
+ <Box
36
+ sx={{
37
+ ...(locationState === 'topbar'
38
+ ? { display: 'flex', alignItems: 'center', justifyContent: 'center', px: 1 }
39
+ : { width: collapsedWidth, display: 'flex', justifyContent: 'center', py: 1 }),
40
+ ...sx,
41
+ }}
42
+ style={style}
43
+ >
44
+ <IconButton size="small" onClick={onToggle} aria-label={expanded ? 'Collapse sidebar' : 'Expand sidebar'}>
45
+ <Icon name={expanded ? 'lucide:panel-left-close' : 'lucide:panel-left-open'} size={20} />
46
+ </IconButton>
47
+ </Box>
48
+ );
49
+ };
50
+
51
+ export default SidebarToggleButton;
@@ -0,0 +1,97 @@
1
+
2
+
3
+ import * as React from 'react';
4
+ import RightSidebar from './RightSidebar';
5
+ import type { RegistryEntry, ResolveCtx } from '@/registry/types';
6
+
7
+ /**
8
+ * RightSidebar (resolver)
9
+ * -----------------------
10
+ * Declarative spec → React props mapper for the contextual right sidebar.
11
+ *
12
+ * Goals:
13
+ * - Keep it faithful to the underlying component (no opinionated transforms).
14
+ * - Allow JSON/registry usage with a minimal, stable surface.
15
+ * - Leave room for granular styling slots as the component evolves.
16
+ *
17
+ * Notes:
18
+ * - `rightContext` is passed through as-is (owner defines shape).
19
+ * - `drawerWidth` controls the permanent width in desktop mode (if applicable).
20
+ * - Any `*Sx` props are forwarded and may be ignored if the component doesn't implement them yet.
21
+ */
22
+
23
+ export type RightSidebarSpec = {
24
+ type: 'RightSidebar';
25
+ props?: {
26
+ // Core behavior
27
+ rightContext?: any;
28
+ drawerWidth?: number;
29
+
30
+ // Optional control (future-friendly; forwarded if supported)
31
+ open?: boolean;
32
+ onClose?: (...args: any[]) => void;
33
+
34
+ // Granular styling (passthrough; component may use or ignore)
35
+ sx?: any;
36
+ paperSx?: any;
37
+ headerSx?: any;
38
+ contentSx?: any;
39
+ footerSx?: any;
40
+
41
+ // Misc passthrough
42
+ id?: string;
43
+ className?: string;
44
+ 'data-testid'?: string;
45
+
46
+ // Allow arbitrary passthrough for future props without changing the spec
47
+ [key: string]: any;
48
+ };
49
+ };
50
+
51
+ const RightSidebarResolver: RegistryEntry = {
52
+ type: 'RightSidebar',
53
+ resolve(spec: RightSidebarSpec, _ctx?: ResolveCtx) {
54
+ const p = spec.props ?? {};
55
+
56
+ // Extract known props and avoid leaking resolver-only keys if we add any
57
+ const {
58
+ rightContext,
59
+ drawerWidth,
60
+
61
+ open,
62
+ onClose,
63
+
64
+ sx,
65
+ paperSx,
66
+ headerSx,
67
+ contentSx,
68
+ footerSx,
69
+
70
+ id,
71
+ className,
72
+ 'data-testid': dataTestId,
73
+
74
+ ...rest
75
+ } = p;
76
+
77
+ return (
78
+ <RightSidebar
79
+ rightContext={rightContext}
80
+ drawerWidth={drawerWidth}
81
+ open={open}
82
+ onClose={onClose}
83
+ sx={sx}
84
+ paperSx={paperSx}
85
+ headerSx={headerSx}
86
+ contentSx={contentSx}
87
+ footerSx={footerSx}
88
+ id={id}
89
+ className={className}
90
+ data-testid={dataTestId}
91
+ {...rest}
92
+ />
93
+ );
94
+ },
95
+ };
96
+
97
+ export default RightSidebarResolver;