this.gui 1.0.17 → 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 (477) 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 -4976
  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 -53
  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 -63
  172. package/src/MdxProvider.jsx +0 -20
  173. package/src/Page.jsx +0 -28
  174. package/src/SiteBuilder.jsx +0 -39
  175. package/src/example.json +0 -43
  176. package/src/index.mdx +0 -164
  177. package/src/main.jsx +0 -15
  178. package/src/scripts/ComponentRegistry.js +0 -70
  179. package/src/scripts/logASCIIArt.js +0 -12
  180. package/src/scripts/postinstall.js +0 -100
  181. package/src/scripts/renderComponents.js +0 -11
  182. package/src/stories/Atoms/Alert/Alert.css +0 -211
  183. package/src/stories/Atoms/Alert/Alert.jsx +0 -56
  184. package/src/stories/Atoms/Alert/Alert.stories.jsx +0 -167
  185. package/src/stories/Atoms/Audio/Audio.css +0 -259
  186. package/src/stories/Atoms/Audio/Audio.jsx +0 -216
  187. package/src/stories/Atoms/Audio/Audio.stories.jsx +0 -191
  188. package/src/stories/Atoms/Badge/Badge.css +0 -249
  189. package/src/stories/Atoms/Badge/Badge.jsx +0 -54
  190. package/src/stories/Atoms/Badge/Badge.stories.jsx +0 -121
  191. package/src/stories/Atoms/Button/Button.css +0 -131
  192. package/src/stories/Atoms/Button/Button.jsx +0 -47
  193. package/src/stories/Atoms/Button/Button.stories.jsx +0 -184
  194. package/src/stories/Atoms/Caption/Caption.css +0 -169
  195. package/src/stories/Atoms/Caption/Caption.jsx +0 -72
  196. package/src/stories/Atoms/Caption/Caption.stories.jsx +0 -207
  197. package/src/stories/Atoms/Checkbox/Checkbox.css +0 -182
  198. package/src/stories/Atoms/Checkbox/Checkbox.jsx +0 -83
  199. package/src/stories/Atoms/Checkbox/Checkbox.stories.jsx +0 -112
  200. package/src/stories/Atoms/Container/Container.css +0 -89
  201. package/src/stories/Atoms/Container/Container.jsx +0 -54
  202. package/src/stories/Atoms/Container/Container.stories.jsx +0 -104
  203. package/src/stories/Atoms/Divider/Divider.css +0 -147
  204. package/src/stories/Atoms/Divider/Divider.jsx +0 -62
  205. package/src/stories/Atoms/Divider/Divider.stories.jsx +0 -105
  206. package/src/stories/Atoms/Grid/Grid.css +0 -160
  207. package/src/stories/Atoms/Grid/Grid.jsx +0 -43
  208. package/src/stories/Atoms/Grid/Grid.stories.jsx +0 -84
  209. package/src/stories/Atoms/Heading/Heading.css +0 -112
  210. package/src/stories/Atoms/Heading/Heading.jsx +0 -69
  211. package/src/stories/Atoms/Heading/Heading.stories.jsx +0 -130
  212. package/src/stories/Atoms/Icon/Icon.css +0 -240
  213. package/src/stories/Atoms/Icon/Icon.jsx +0 -80
  214. package/src/stories/Atoms/Icon/Icon.stories.jsx +0 -177
  215. package/src/stories/Atoms/Image/Image.css +0 -245
  216. package/src/stories/Atoms/Image/Image.jsx +0 -175
  217. package/src/stories/Atoms/Image/Image.stories.jsx +0 -332
  218. package/src/stories/Atoms/Label/Label.css +0 -171
  219. package/src/stories/Atoms/Label/Label.jsx +0 -71
  220. package/src/stories/Atoms/Label/Label.stories.jsx +0 -180
  221. package/src/stories/Atoms/Link/Link.css +0 -71
  222. package/src/stories/Atoms/Link/Link.jsx +0 -82
  223. package/src/stories/Atoms/Link/Link.stories.jsx +0 -153
  224. package/src/stories/Atoms/Loader/Loader.css +0 -106
  225. package/src/stories/Atoms/Loader/Loader.jsx +0 -58
  226. package/src/stories/Atoms/Loader/Loader.stories.jsx +0 -99
  227. package/src/stories/Atoms/Logo/Logo.css +0 -94
  228. package/src/stories/Atoms/Logo/Logo.jsx +0 -53
  229. package/src/stories/Atoms/Logo/Logo.stories.jsx +0 -120
  230. package/src/stories/Atoms/Paragraph/Paragraph.css +0 -180
  231. package/src/stories/Atoms/Paragraph/Paragraph.jsx +0 -77
  232. package/src/stories/Atoms/Paragraph/Paragraph.stories.jsx +0 -143
  233. package/src/stories/Atoms/ProgressBar/ProgressBar.css +0 -127
  234. package/src/stories/Atoms/ProgressBar/ProgressBar.jsx +0 -40
  235. package/src/stories/Atoms/ProgressBar/ProgressBar.stories.jsx +0 -86
  236. package/src/stories/Atoms/RadioButton/RadioButton.css +0 -130
  237. package/src/stories/Atoms/RadioButton/RadioButton.jsx +0 -87
  238. package/src/stories/Atoms/RadioButton/RadioButton.stories.jsx +0 -113
  239. package/src/stories/Atoms/Range/Range.css +0 -169
  240. package/src/stories/Atoms/Range/Range.jsx +0 -87
  241. package/src/stories/Atoms/Range/Range.stories.jsx +0 -110
  242. package/src/stories/Atoms/Section/Section.css +0 -268
  243. package/src/stories/Atoms/Section/Section.jsx +0 -63
  244. package/src/stories/Atoms/Section/Section.stories.jsx +0 -46
  245. package/src/stories/Atoms/Select/Select.css +0 -87
  246. package/src/stories/Atoms/Select/Select.jsx +0 -73
  247. package/src/stories/Atoms/Select/Select.stories.jsx +0 -109
  248. package/src/stories/Atoms/Slider/Slider.css +0 -90
  249. package/src/stories/Atoms/Slider/Slider.jsx +0 -129
  250. package/src/stories/Atoms/Slider/Slider.stories.jsx +0 -90
  251. package/src/stories/Atoms/Snackbar/Snackbar.css +0 -313
  252. package/src/stories/Atoms/Snackbar/Snackbar.jsx +0 -72
  253. package/src/stories/Atoms/Snackbar/Snackbar.stories.jsx +0 -78
  254. package/src/stories/Atoms/Spacer/Spacer.css +0 -114
  255. package/src/stories/Atoms/Spacer/Spacer.jsx +0 -35
  256. package/src/stories/Atoms/Spacer/Spacer.stories.jsx +0 -61
  257. package/src/stories/Atoms/Spinner/Spinner.css +0 -110
  258. package/src/stories/Atoms/Spinner/Spinner.jsx +0 -65
  259. package/src/stories/Atoms/Spinner/Spinner.stories.jsx +0 -58
  260. package/src/stories/Atoms/Tag/Tag.css +0 -112
  261. package/src/stories/Atoms/Tag/Tag.jsx +0 -75
  262. package/src/stories/Atoms/Tag/Tag.stories.jsx +0 -67
  263. package/src/stories/Atoms/TextArea/TextArea.css +0 -99
  264. package/src/stories/Atoms/TextArea/TextArea.jsx +0 -118
  265. package/src/stories/Atoms/TextArea/TextArea.stories.jsx +0 -36
  266. package/src/stories/Atoms/TextInput/TextInput.css +0 -102
  267. package/src/stories/Atoms/TextInput/TextInput.jsx +0 -133
  268. package/src/stories/Atoms/TextInput/TextInput.stories.jsx +0 -69
  269. package/src/stories/Atoms/Toggle/Toggle.css +0 -118
  270. package/src/stories/Atoms/Toggle/Toggle.jsx +0 -69
  271. package/src/stories/Atoms/Toggle/Toggle.stories.jsx +0 -35
  272. package/src/stories/Atoms/Tooltip/Tooltip.css +0 -383
  273. package/src/stories/Atoms/Tooltip/Tooltip.jsx +0 -46
  274. package/src/stories/Atoms/Tooltip/Tooltip.stories.jsx +0 -52
  275. package/src/stories/Atoms/Video/Video.css +0 -39
  276. package/src/stories/Atoms/Video/Video.jsx +0 -78
  277. package/src/stories/Atoms/Video/Video.stories.jsx +0 -41
  278. package/src/stories/Atoms/index.js +0 -72
  279. package/src/stories/Atoms/meta_Atoms.js +0 -51
  280. package/src/stories/Components.js +0 -198
  281. package/src/stories/Getting Started.mdx +0 -239
  282. package/src/stories/Layouts/Accordion/Accordion.css +0 -293
  283. package/src/stories/Layouts/Accordion/Accordion.jsx +0 -74
  284. package/src/stories/Layouts/Accordion/Accordion.stories.jsx +0 -39
  285. package/src/stories/Layouts/Flexbox/Flexbox.css +0 -16
  286. package/src/stories/Layouts/Flexbox/Flexbox.jsx +0 -11
  287. package/src/stories/Layouts/Flexbox/Flexbox.stories.jsx +0 -28
  288. package/src/stories/Layouts/Footer/Footer.css +0 -16
  289. package/src/stories/Layouts/Footer/Footer.jsx +0 -31
  290. package/src/stories/Layouts/Footer/Footer.stories.jsx +0 -28
  291. package/src/stories/Layouts/Header/Header.css +0 -16
  292. package/src/stories/Layouts/Header/Header.jsx +0 -31
  293. package/src/stories/Layouts/Header/Header.stories.jsx +0 -28
  294. package/src/stories/Layouts/HeroBanner/HeroBanner.css +0 -16
  295. package/src/stories/Layouts/HeroBanner/HeroBanner.jsx +0 -31
  296. package/src/stories/Layouts/HeroBanner/HeroBanner.stories.jsx +0 -28
  297. package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.css +0 -16
  298. package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.jsx +0 -31
  299. package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.stories.jsx +0 -28
  300. package/src/stories/Layouts/Pagination/Pagination.css +0 -16
  301. package/src/stories/Layouts/Pagination/Pagination.jsx +0 -31
  302. package/src/stories/Layouts/Pagination/Pagination.stories.jsx +0 -28
  303. package/src/stories/Layouts/Sidebar/Sidebar.css +0 -16
  304. package/src/stories/Layouts/Sidebar/Sidebar.jsx +0 -71
  305. package/src/stories/Layouts/Sidebar/Sidebar.stories.jsx +0 -28
  306. package/src/stories/Layouts/Tabs/Tabs.css +0 -16
  307. package/src/stories/Layouts/Tabs/Tabs.jsx +0 -31
  308. package/src/stories/Layouts/Tabs/Tabs.stories.jsx +0 -28
  309. package/src/stories/Layouts/index.js +0 -25
  310. package/src/stories/Layouts/meta_Layouts.js +0 -28
  311. package/src/stories/MDX.mdx +0 -118
  312. package/src/stories/Miscellaneous/Miscellaneous.js +0 -24
  313. package/src/stories/Molecules/Accordion/Accordion.css +0 -4
  314. package/src/stories/Molecules/Accordion/Accordion.jsx +0 -25
  315. package/src/stories/Molecules/Accordion/Accordion.stories.jsx +0 -20
  316. package/src/stories/Molecules/AudioPlayer/AudioPlayer.css +0 -97
  317. package/src/stories/Molecules/AudioPlayer/AudioPlayer.jsx +0 -244
  318. package/src/stories/Molecules/AudioPlayer/AudioPlayer.stories.jsx +0 -55
  319. package/src/stories/Molecules/AvatarWithName/AvatarWithName.css +0 -130
  320. package/src/stories/Molecules/AvatarWithName/AvatarWithName.jsx +0 -80
  321. package/src/stories/Molecules/AvatarWithName/AvatarWithName.stories.jsx +0 -20
  322. package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.css +0 -147
  323. package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.jsx +0 -51
  324. package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.stories.jsx +0 -36
  325. package/src/stories/Molecules/ButtonGroup/ButtonGroup.css +0 -465
  326. package/src/stories/Molecules/ButtonGroup/ButtonGroup.jsx +0 -47
  327. package/src/stories/Molecules/ButtonGroup/ButtonGroup.stories.jsx +0 -44
  328. package/src/stories/Molecules/Card/Card.css +0 -41
  329. package/src/stories/Molecules/Card/Card.jsx +0 -92
  330. package/src/stories/Molecules/Card/Card.stories.jsx +0 -34
  331. package/src/stories/Molecules/ComparisonTable/ComparisonTable.css +0 -35
  332. package/src/stories/Molecules/ComparisonTable/ComparisonTable.jsx +0 -104
  333. package/src/stories/Molecules/ComparisonTable/ComparisonTable.stories.jsx +0 -81
  334. package/src/stories/Molecules/DataTable/DataTable.css +0 -4
  335. package/src/stories/Molecules/DataTable/DataTable.jsx +0 -25
  336. package/src/stories/Molecules/DataTable/DataTable.stories.jsx +0 -20
  337. package/src/stories/Molecules/Dropdown/Dropdown.css +0 -192
  338. package/src/stories/Molecules/Dropdown/Dropdown.jsx +0 -96
  339. package/src/stories/Molecules/Dropdown/Dropdown.stories.jsx +0 -45
  340. package/src/stories/Molecules/FileUpload/FileUpload.css +0 -4
  341. package/src/stories/Molecules/FileUpload/FileUpload.jsx +0 -25
  342. package/src/stories/Molecules/FileUpload/FileUpload.stories.jsx +0 -20
  343. package/src/stories/Molecules/FormField/FormField.css +0 -4
  344. package/src/stories/Molecules/FormField/FormField.jsx +0 -25
  345. package/src/stories/Molecules/FormField/FormField.stories.jsx +0 -20
  346. package/src/stories/Molecules/Header/Header.css +0 -35
  347. package/src/stories/Molecules/Header/Header.jsx +0 -76
  348. package/src/stories/Molecules/Header/Header.stories.jsx +0 -28
  349. package/src/stories/Molecules/IconButton/IconButton.css +0 -4
  350. package/src/stories/Molecules/IconButton/IconButton.jsx +0 -25
  351. package/src/stories/Molecules/IconButton/IconButton.stories.jsx +0 -20
  352. package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.css +0 -4
  353. package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.jsx +0 -25
  354. package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.stories.jsx +0 -20
  355. package/src/stories/Molecules/InputGroup/InputGroup.css +0 -4
  356. package/src/stories/Molecules/InputGroup/InputGroup.jsx +0 -25
  357. package/src/stories/Molecules/InputGroup/InputGroup.stories.jsx +0 -20
  358. package/src/stories/Molecules/InputWithLabel/InputWithLabel.css +0 -4
  359. package/src/stories/Molecules/InputWithLabel/InputWithLabel.jsx +0 -25
  360. package/src/stories/Molecules/InputWithLabel/InputWithLabel.stories.jsx +0 -20
  361. package/src/stories/Molecules/List/List.css +0 -4
  362. package/src/stories/Molecules/List/List.jsx +0 -25
  363. package/src/stories/Molecules/List/List.stories.jsx +0 -20
  364. package/src/stories/Molecules/MediaCard/MediaCard.css +0 -4
  365. package/src/stories/Molecules/MediaCard/MediaCard.jsx +0 -25
  366. package/src/stories/Molecules/MediaCard/MediaCard.stories.jsx +0 -20
  367. package/src/stories/Molecules/Modal/Modal.css +0 -4
  368. package/src/stories/Molecules/Modal/Modal.jsx +0 -25
  369. package/src/stories/Molecules/Modal/Modal.stories.jsx +0 -20
  370. package/src/stories/Molecules/Navbar/Navbar.css +0 -91
  371. package/src/stories/Molecules/Navbar/Navbar.jsx +0 -82
  372. package/src/stories/Molecules/Navbar/Navbar.stories.jsx +0 -70
  373. package/src/stories/Molecules/Notification/Notification.css +0 -4
  374. package/src/stories/Molecules/Notification/Notification.jsx +0 -25
  375. package/src/stories/Molecules/Notification/Notification.stories.jsx +0 -20
  376. package/src/stories/Molecules/PricingTable/PricingTable.css +0 -4
  377. package/src/stories/Molecules/PricingTable/PricingTable.jsx +0 -25
  378. package/src/stories/Molecules/PricingTable/PricingTable.stories.jsx +0 -20
  379. package/src/stories/Molecules/SearchBar/SearchBar.css +0 -69
  380. package/src/stories/Molecules/SearchBar/SearchBar.jsx +0 -73
  381. package/src/stories/Molecules/SearchBar/SearchBar.stories.jsx +0 -29
  382. package/src/stories/Molecules/SelectTheme/SelectTheme.css +0 -25
  383. package/src/stories/Molecules/SelectTheme/SelectTheme.jsx +0 -22
  384. package/src/stories/Molecules/SelectTheme/SelectTheme.stories.jsx +0 -24
  385. package/src/stories/Molecules/Sidebar/Sidebar.css +0 -67
  386. package/src/stories/Molecules/Sidebar/Sidebar.jsx +0 -80
  387. package/src/stories/Molecules/Sidebar/Sidebar.stories.jsx +0 -35
  388. package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.css +0 -4
  389. package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.jsx +0 -25
  390. package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.stories.jsx +0 -20
  391. package/src/stories/Molecules/index.js +0 -58
  392. package/src/stories/Molecules/meta_Molecules.js +0 -47
  393. package/src/stories/Organisms/Profile/UserFriends/UserFriends.context.jsx +0 -15
  394. package/src/stories/Organisms/Profile/UserFriends/UserFriends.css +0 -4
  395. package/src/stories/Organisms/Profile/UserFriends/UserFriends.jsx +0 -13
  396. package/src/stories/Organisms/Profile/UserFriends/UserFriends.stories.jsx +0 -26
  397. package/src/stories/Organisms/Profile/UserPosts/UserPosts.context.jsx +0 -15
  398. package/src/stories/Organisms/Profile/UserPosts/UserPosts.css +0 -4
  399. package/src/stories/Organisms/Profile/UserPosts/UserPosts.jsx +0 -13
  400. package/src/stories/Organisms/Profile/UserPosts/UserPosts.stories.jsx +0 -26
  401. package/src/stories/Organisms/Profile/UserProfile/UserProfile.context.jsx +0 -15
  402. package/src/stories/Organisms/Profile/UserProfile/UserProfile.css +0 -4
  403. package/src/stories/Organisms/Profile/UserProfile/UserProfile.jsx +0 -13
  404. package/src/stories/Organisms/Profile/UserProfile/UserProfile.stories.jsx +0 -26
  405. package/src/stories/Organisms/meta_Organisms.js +0 -39
  406. package/src/stories/Pages/Page/Page.css +0 -69
  407. package/src/stories/Pages/Page/Page.jsx +0 -69
  408. package/src/stories/Pages/Page/Page.stories.js +0 -26
  409. package/src/stories/Pages/Page/Pages.js +0 -31
  410. package/src/stories/Templates/AdminDashboard/AdminDashboard.css +0 -7
  411. package/src/stories/Templates/AdminDashboard/AdminDashboard.jsx +0 -24
  412. package/src/stories/Templates/AdminDashboard/AdminDashboard.stories.jsx +0 -20
  413. package/src/stories/Templates/CallToAction/CallToAction.css +0 -7
  414. package/src/stories/Templates/CallToAction/CallToAction.jsx +0 -24
  415. package/src/stories/Templates/CallToAction/CallToAction.stories.jsx +0 -20
  416. package/src/stories/Templates/FeaturesList/FeaturesList.css +0 -7
  417. package/src/stories/Templates/FeaturesList/FeaturesList.jsx +0 -24
  418. package/src/stories/Templates/FeaturesList/FeaturesList.stories.jsx +0 -20
  419. package/src/stories/Templates/FormSection/FormSection.css +0 -7
  420. package/src/stories/Templates/FormSection/FormSection.jsx +0 -24
  421. package/src/stories/Templates/FormSection/FormSection.stories.jsx +0 -20
  422. package/src/stories/Templates/HeroSection/HeroSection.css +0 -7
  423. package/src/stories/Templates/HeroSection/HeroSection.jsx +0 -24
  424. package/src/stories/Templates/HeroSection/HeroSection.stories.jsx +0 -20
  425. package/src/stories/Templates/LocationInfo/LocationInfo.css +0 -7
  426. package/src/stories/Templates/LocationInfo/LocationInfo.jsx +0 -24
  427. package/src/stories/Templates/LocationInfo/LocationInfo.stories.jsx +0 -20
  428. package/src/stories/Templates/ProductPage/ProductPage.css +0 -7
  429. package/src/stories/Templates/ProductPage/ProductPage.jsx +0 -24
  430. package/src/stories/Templates/ProductPage/ProductPage.stories.jsx +0 -20
  431. package/src/stories/Templates/RegistrationPage/RegistrationPage.css +0 -7
  432. package/src/stories/Templates/RegistrationPage/RegistrationPage.jsx +0 -24
  433. package/src/stories/Templates/RegistrationPage/RegistrationPage.stories.jsx +0 -20
  434. package/src/stories/Templates/ShoppingCart/ShoppingCart.css +0 -7
  435. package/src/stories/Templates/ShoppingCart/ShoppingCart.jsx +0 -24
  436. package/src/stories/Templates/ShoppingCart/ShoppingCart.stories.jsx +0 -20
  437. package/src/stories/Templates/SidebarTopNav/SidebarTopNav.css +0 -7
  438. package/src/stories/Templates/SidebarTopNav/SidebarTopNav.jsx +0 -24
  439. package/src/stories/Templates/SidebarTopNav/SidebarTopNav.stories.jsx +0 -20
  440. package/src/stories/Templates/SignInPage/SignInPage.css +0 -7
  441. package/src/stories/Templates/SignInPage/SignInPage.jsx +0 -24
  442. package/src/stories/Templates/SignInPage/SignInPage.stories.jsx +0 -20
  443. package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.css +0 -7
  444. package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.jsx +0 -24
  445. package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.stories.jsx +0 -20
  446. package/src/stories/Templates/Testimonials/Testimonials.css +0 -7
  447. package/src/stories/Templates/Testimonials/Testimonials.jsx +0 -24
  448. package/src/stories/Templates/Testimonials/Testimonials.stories.jsx +0 -20
  449. package/src/stories/Templates/index.js +0 -33
  450. package/src/stories/Templates/meta_Templates.js +0 -29
  451. package/src/stories/assets/accessibility.png +0 -0
  452. package/src/stories/assets/accessibility.svg +0 -1
  453. package/src/stories/assets/addon-library.png +0 -0
  454. package/src/stories/assets/assets.png +0 -0
  455. package/src/stories/assets/avif-test-image.avif +0 -0
  456. package/src/stories/assets/context.png +0 -0
  457. package/src/stories/assets/discord.svg +0 -1
  458. package/src/stories/assets/docs.png +0 -0
  459. package/src/stories/assets/figma-plugin.png +0 -0
  460. package/src/stories/assets/github.svg +0 -1
  461. package/src/stories/assets/logo.png +0 -0
  462. package/src/stories/assets/logo.svg +0 -106
  463. package/src/stories/assets/share.png +0 -0
  464. package/src/stories/assets/styling.png +0 -0
  465. package/src/stories/assets/test.svg +0 -3
  466. package/src/stories/assets/testing.png +0 -0
  467. package/src/stories/assets/theming.png +0 -0
  468. package/src/stories/assets/tutorials.svg +0 -1
  469. package/src/stories/assets/youtube.svg +0 -1
  470. package/src/themes/README_Styles.md +0 -301
  471. package/src/themes/ThemeProvider.jsx +0 -61
  472. package/src/themes/styles/github/dark.css +0 -0
  473. package/src/themes/styles/github/light.css +0 -0
  474. package/src/themes/styles/neurons/dark.css +0 -247
  475. package/src/themes/styles/neurons/light.css +0 -280
  476. /package/{src/themes/styles/dracula/dark.css → .storybook/preview-head.html} +0 -0
  477. /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;