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,297 @@
1
+ import { MemoryRouter } from 'react-router-dom';
2
+ import GuiProvider from '../../../../context/GuiProvider';
3
+ import TopBar from './TopBar';
4
+ import type { Meta, StoryObj } from '@storybook/react';
5
+
6
+ const meta = {
7
+ title: 'Molecules/AppBars/TopBar',
8
+ component: TopBar,
9
+ tags: ['autodocs'],
10
+ decorators: [
11
+ (Story) => (
12
+ <MemoryRouter>
13
+ <GuiProvider>
14
+ <Story />
15
+ </GuiProvider>
16
+ </MemoryRouter>
17
+ ),
18
+ ],
19
+ parameters: {
20
+ docs: {
21
+ description: {
22
+ component:
23
+ `The **TopBar** component provides a responsive, application top bar for navigation, branding and other actions.
24
+ ---
25
+ ## Features
26
+ - **Branding:** Display a logo and title.
27
+ - **Navigation Links:** With optional icons and dropdown menus (nested children).
28
+ - **Custom actions:** Theme toggle, hamburger menu, etc.
29
+ - **Responsive:** Adapts to mobile layouts.
30
+ - **Inset-aware:** Reads global left/right/nav insets from the theme to align with permanent drawers.
31
+ - **Icon support:** Via the This.GUI icon registry (declarative strings) or direct React elements.
32
+
33
+ ---
34
+
35
+ ### Props
36
+ Each link can specify:
37
+ - \`label\` (string): Displayed text.
38
+ - \`href\` (string): Navigation URL (internal or external).
39
+ - \`icon\` (string): Icon name, prefixed with \`mui:\` or \`lucide:\`.
40
+ - \`iconColor\` (string): Icon color (theme key like \`primary\`, \`secondary\`, or any CSS color).
41
+ - \`children\` (array): Nested links for dropdown menus.
42
+ ---
43
+
44
+ **Example:**
45
+ ~~~jsx
46
+ <TopBar
47
+ title="neurons.me"
48
+ logo="https://neurons.me/neurons.me.png"
49
+ TopBarLinks={[
50
+ { label: 'Home', href: '/', icon: 'mui:BarChart', iconColor: 'primary' },
51
+ { label: 'Docs', href: '/docs', icon: 'mui:Insights', iconColor: 'secondary' },
52
+ {
53
+ label: 'More',
54
+ icon: 'lucide:Info',
55
+ iconColor: '#00aa96',
56
+ children: [
57
+ { label: 'About', href: '/about', icon: 'mui:Message', iconColor: 'info' },
58
+ { label: 'Contact', href: '/contact', icon: 'lucide:Mail', iconColor: '#4caf50' },
59
+ ],
60
+ },
61
+ ]}
62
+ showThemeToggle
63
+ position="fixed"
64
+ />
65
+ ~~~
66
+
67
+ ---
68
+
69
+ #### Dropdown Menus
70
+ - To create a dropdown, provide a \`children\` array to any link.
71
+
72
+ ~~~jsx
73
+ <TopBar
74
+ TopBarLinks={[
75
+ {
76
+ label: 'More',
77
+ icon: 'lucide:Info',
78
+ children: [
79
+ { label: 'About', href: '/about' },
80
+ { label: 'Contact', href: '/contact' },
81
+ ],
82
+ },
83
+ ]}
84
+ />
85
+ ~~~
86
+
87
+ ---
88
+
89
+ #### Icon Usage
90
+ - **Material UI:** Use \`mui:IconName\` (e.g. \`mui:Insights\`). See [MUI Icons Catalog](https://mui.com/material-ui/material-icons/).
91
+ - **Lucide:** Use \`lucide:IconName\` (e.g. \`lucide:Mail\`). See [Lucide Icons Catalog](https://lucide.dev/icons/).
92
+ - **Color:** Use \`iconColor\` prop for theme colors (\`primary\`, \`secondary\`, \`info\`) or any CSS color (e.g. \`#4caf50\`).
93
+
94
+ ---
95
+
96
+ ### React Component Mode (Advanced)
97
+ You may also use TopBar as a React component and manually import icons, passing them into \`TopBarLinks\`:
98
+
99
+ ~~~jsx
100
+ import TopBar from './TopBar';
101
+ import { BarChart, Insights } from '@mui/icons-material';
102
+ import { Mail, Info } from 'lucide-react';
103
+
104
+ <TopBar
105
+ TopBarLinks={[
106
+ { label: 'Home', href: '/', icon: <BarChart color="primary" /> },
107
+ { label: 'Docs', href: '/docs', icon: <Insights htmlColor="#f50057" /> },
108
+ {
109
+ label: 'More',
110
+ icon: <Info color="success" />,
111
+ children: [
112
+ { label: 'About', href: '/about', icon: <Mail htmlColor="#4caf50" /> },
113
+ ],
114
+ },
115
+ ]}
116
+ position="static"
117
+ />
118
+ ~~~
119
+ - **Note:** When using this mode, you can pass any valid React element as the \`icon\` property. For Material UI icons, use the \`color\` or \`htmlColor\` prop to customize color. For Lucide icons, use the \`color\` prop.
120
+
121
+ ---
122
+
123
+ ## Notes
124
+ - TopBar uses \`react-router-dom\` internally. Stories wrap it in a \`MemoryRouter\` for demo purposes.
125
+ - Dropdown menus are created by providing a \`children\` array for any link.
126
+ - Icon colors can be set with theme color keys (\`primary\`, \`secondary\`, \`info\`, etc.) or any valid CSS color string.
127
+ - TopBarLinks accepts objects with label, href, external, icon (string for your registry), and iconColor, and also supports submenus via children.
128
+ - Toggles like showMenuButton, showThemeToggle, and homeTo/position.
129
+ Inset handling:
130
+ - Measure Toolbar with toolbarRef, call theme.updateInsets({ nav: h }), and clean up in return → this updates theme.layout.insets.nav in GuiProvider and also the CSS vars (--gui-nav-height).
131
+ Theme integration:
132
+ - Use useTheme()/useMediaQuery(). In GuiProvider, inject updateInsets and layout.insets into the memoized MUI theme, so TopBar sees them correctly.
133
+
134
+ `,
135
+ },
136
+ },
137
+ },
138
+ argTypes: {
139
+ title: {
140
+ description: 'Title text displayed next to the logo.',
141
+ control: 'text',
142
+ },
143
+ logo: {
144
+ description: 'Logo image URL shown in the top-left.',
145
+ control: 'text',
146
+ },
147
+ TopBarLinks: {
148
+ description: 'Array of navigation links, supporting nested dropdown menus.',
149
+ control: 'object',
150
+ },
151
+ showMenuButton: {
152
+ description: 'Displays a hamburger menu button on the left.',
153
+ control: 'boolean',
154
+ },
155
+ onMenuClick: {
156
+ description: 'Callback executed when the hamburger menu is clicked.',
157
+ action: 'menuClicked',
158
+ },
159
+ showThemeToggle: {
160
+ description: 'Shows a dark/light mode toggle button.',
161
+ control: 'boolean',
162
+ },
163
+ homeTo: {
164
+ description: 'Router path for clicking on logo/title.',
165
+ control: 'text',
166
+ },
167
+ },
168
+ } satisfies Meta<typeof TopBar>;
169
+ export default meta;
170
+
171
+ export type Story = StoryObj<typeof TopBar>;
172
+
173
+ export const Default: Story = {
174
+ args: {
175
+ title: 'neurons.me',
176
+ logo: 'https://neurons.me/neurons.me.png',
177
+ TopBarLinks: [
178
+ { label: 'Home', href: '/' },
179
+ { label: 'Docs', href: '/docs' },
180
+ {
181
+ label: 'More',
182
+ children: [
183
+ { label: 'About', href: '/about' },
184
+ { label: 'Contact', href: '/contact' },
185
+ ],
186
+ },
187
+ ],
188
+ showMenuButton: false,
189
+ showThemeToggle: true,
190
+ homeTo: '/',
191
+ },
192
+ };
193
+
194
+ export const WithIcons: Story = {
195
+ args: {
196
+ title: 'neurons.me',
197
+ logo: 'https://neurons.me/neurons.me.png',
198
+ TopBarLinks: [
199
+ {
200
+ label: 'Home',
201
+ href: '/',
202
+ icon: 'mui:BarChart',
203
+ iconColor: 'primary'
204
+ },
205
+ {
206
+ label: 'Docs',
207
+ href: '/docs',
208
+ icon: 'mui:Insights',
209
+ iconColor: 'secondary'
210
+ },
211
+ {
212
+ label: 'More',
213
+ icon: 'lucide:Info',
214
+ iconColor: '#00aa96',
215
+ children: [
216
+ { label: 'About', href: '/about', icon: 'mui:Message', iconColor: 'info' },
217
+ { label: 'Contact', href: '/contact', icon: 'lucide:Mail', iconColor: '#4caf50' },
218
+ ],
219
+ }
220
+ ],
221
+ showMenuButton: false,
222
+ showThemeToggle: true,
223
+ homeTo: '/',
224
+ },
225
+ };
226
+
227
+ export const FixedTopBar = () => (
228
+ <>
229
+ <TopBar
230
+ title="neurons.me"
231
+ logo="https://neurons.me/neurons.me.png"
232
+ TopBarLinks={[
233
+ { label: 'Home', href: '/' },
234
+ { label: 'Docs', href: '/docs' },
235
+ {
236
+ label: 'More',
237
+ children: [
238
+ { label: 'About', href: '/about' },
239
+ { label: 'Contact', href: '/contact' },
240
+ ],
241
+ },
242
+ ]}
243
+ showMenuButton={false}
244
+ showThemeToggle={true}
245
+ homeTo="/"
246
+ position="fixed"
247
+ />
248
+ <div style={{ marginTop: 80, padding: 20, height: '200vh'}}>
249
+ {Array(100).fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ').join('')}
250
+ </div>
251
+ </>
252
+ );
253
+
254
+ FixedTopBar.storyName = 'Fixed TopBar';
255
+ FixedTopBar.parameters = {
256
+ docs: {
257
+ description: {
258
+ story: 'Demonstrates the TopBar with `position="fixed"`. Scroll down to see the TopBar stay fixed at the top.',
259
+ },
260
+ },
261
+ };
262
+
263
+ export const StaticTopBar = () => (
264
+ <>
265
+ <TopBar
266
+ title="neurons.me"
267
+ logo="https://neurons.me/neurons.me.png"
268
+ TopBarLinks={[
269
+ { label: 'Home', href: '/' },
270
+ { label: 'Docs', href: '/docs' },
271
+ {
272
+ label: 'More',
273
+ children: [
274
+ { label: 'About', href: '/about' },
275
+ { label: 'Contact', href: '/contact' },
276
+ ],
277
+ },
278
+ ]}
279
+ showMenuButton={false}
280
+ showThemeToggle={true}
281
+ homeTo="/"
282
+ position="static"
283
+ />
284
+ <div style={{ padding: 20, height: '200vh'}}>
285
+ {Array(100).fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ').join('')}
286
+ </div>
287
+ </>
288
+ );
289
+
290
+ StaticTopBar.storyName = 'Static TopBar';
291
+ StaticTopBar.parameters = {
292
+ docs: {
293
+ description: {
294
+ story: 'Demonstrates the TopBar with `position="static"`. Scroll down to see the TopBar scroll with the page.',
295
+ },
296
+ },
297
+ };
@@ -0,0 +1,299 @@
1
+ import { useState, useEffect, useRef, MouseEvent } from 'react';
2
+ import { Link, useNavigate, useLocation } from 'react-router-dom';
3
+ import type { SxProps, Theme } from '@mui/material/styles';
4
+ import {
5
+ AppBar,
6
+ Toolbar,
7
+ IconButton,
8
+ Typography,
9
+ Box,
10
+ Button,
11
+ Menu,
12
+ MenuItem,
13
+ } from '@/gui/atoms';
14
+ import { useGuiTheme, useGuiMediaQuery } from '@/gui';
15
+ import ThemeSelector from '../../Utilities/ThemeSelector';
16
+ import Icon from '../../../../themes/icons/Icon';
17
+ import SidebarToggleButton from '../LeftSidebar/SidebarToggleButton';
18
+
19
+ const sxN = (...parts: Array<SxProps<Theme> | undefined>): SxProps<Theme> => (parts.filter(Boolean) as unknown) as SxProps<Theme>;
20
+
21
+ interface TopBarLinkChild {
22
+ label: string;
23
+ href?: string;
24
+ external?: boolean;
25
+ icon?: string;
26
+ iconColor?: string;
27
+ }
28
+
29
+ interface TopBarLink {
30
+ label: string;
31
+ href?: string;
32
+ external?: boolean;
33
+ icon?: string;
34
+ iconColor?: string;
35
+ children?: TopBarLinkChild[];
36
+ }
37
+
38
+ interface TopBarProps {
39
+ title?: string;
40
+ logo?: string;
41
+ TopBarLinks?: TopBarLink[];
42
+ showMenuButton?: boolean;
43
+ onMenuClick?: () => void;
44
+ showThemeToggle?: boolean;
45
+ homeTo?: string;
46
+ position?: "fixed" | "static" | "sticky";
47
+ sx?: SxProps<Theme>;
48
+ appBarSx?: SxProps<Theme>;
49
+ toolbarSx?: SxProps<Theme>;
50
+ brandSx?: SxProps<Theme>;
51
+ logoSx?: SxProps<Theme>;
52
+ titleSx?: SxProps<Theme>;
53
+ linksSx?: SxProps<Theme>;
54
+ linkSx?: SxProps<Theme>;
55
+ menuSx?: SxProps<Theme>;
56
+ menuItemSx?: SxProps<Theme>;
57
+ actionsSx?: SxProps<Theme>;
58
+ id?: string;
59
+ className?: string;
60
+ 'data-testid'?: string;
61
+ toggleLocation?: 'topbar' | 'sidebar' | 'none';
62
+ }
63
+
64
+ /**
65
+ * TopBar (presentational)
66
+ *
67
+ * Props:
68
+ * - title?: string = 'neurons.me'
69
+ * - logo?: string (URL)
70
+ * - TopBarLinks?: Array<{ label: string, href?: string, external?: boolean, icon?: string, iconColor?: string, children?: Array<{label: string, href?: string, external?: boolean, icon?: string, iconColor?: string}> }>
71
+ * // icon: string from This.GUI icon registry (e.g., 'mui:Settings', 'lucide:home')
72
+ * // iconColor: CSS color or theme key (e.g., '#00aa96', 'primary', 'text.secondary')
73
+ * - showMenuButton?: boolean (controls left hamburger visibility)
74
+ * - onMenuClick?: () => void (called when hamburger is clicked)
75
+ * - showThemeToggle?: boolean (renders theme toggle icon)
76
+ * - homeTo?: string (router link for brand/title)
77
+ * - position?: "fixed" | "static" | "sticky" (AppBar position, default is "fixed")
78
+ * - toggleLocation?: 'topbar' | 'sidebar' | 'none' (location prop for SidebarToggleButton)
79
+ */
80
+ export default function TopBar({
81
+ title = 'neurons.me',
82
+ logo = 'https://neurons.me/neurons.me.png',
83
+ TopBarLinks = [],
84
+ showMenuButton = false,
85
+ onMenuClick,
86
+ showThemeToggle = true,
87
+ homeTo = '/',
88
+ position = 'fixed',
89
+ sx,
90
+ appBarSx,
91
+ toolbarSx,
92
+ brandSx,
93
+ logoSx,
94
+ titleSx,
95
+ linksSx,
96
+ linkSx,
97
+ menuSx,
98
+ menuItemSx,
99
+ actionsSx,
100
+ id,
101
+ className,
102
+ 'data-testid': dataTestId,
103
+ toggleLocation = 'topbar',
104
+ }: TopBarProps) {
105
+ const theme = useGuiTheme();
106
+ const isMobile = useGuiMediaQuery(theme.breakpoints.down('md'));
107
+
108
+ let navigate: ReturnType<typeof useNavigate> | null = null;
109
+ try {
110
+ navigate = useNavigate();
111
+ } catch (err) {
112
+ navigate = null;
113
+ }
114
+
115
+
116
+ const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
117
+ const [openMenu, setOpenMenu] = useState<null | string>(null);
118
+
119
+ const toolbarRef = useRef<HTMLDivElement | null>(null);
120
+
121
+ // Sync nav inset with real rendered height (idempotent via provider)
122
+ useEffect(() => {
123
+ const setInsets = theme?.updateInsets;
124
+ if (typeof setInsets !== 'function') return;
125
+
126
+ const measure = () => {
127
+ const h = (toolbarRef.current?.offsetHeight ?? 48);
128
+ setInsets({ nav: h });
129
+ };
130
+
131
+ // initial measure
132
+ measure();
133
+
134
+ // observe toolbar size changes (density, breakpoints, etc.)
135
+ let ro: ResizeObserver | undefined;
136
+ if (typeof ResizeObserver !== 'undefined' && toolbarRef.current) {
137
+ ro = new ResizeObserver(() => measure());
138
+ ro.observe(toolbarRef.current);
139
+ }
140
+
141
+ return () => {
142
+ if (ro) ro.disconnect();
143
+ setInsets({ nav: 0 });
144
+ };
145
+ }, [isMobile, theme.updateInsets]);
146
+
147
+ const handleMenuOpen = (event: MouseEvent<HTMLElement>, label: string) => {
148
+ setAnchorEl(event.currentTarget);
149
+ setOpenMenu(label);
150
+ };
151
+
152
+ const handleMenuClose = () => {
153
+ setAnchorEl(null);
154
+ setOpenMenu(null);
155
+ };
156
+
157
+ // Indentation handled by Toolbar padding-left via --gui-inset-left CSS variable
158
+ const baseAppBarSx = {
159
+ minHeight: 48,
160
+ backgroundColor: theme.palette.background.nav,
161
+ borderBottom: '1px solid',
162
+ borderColor: theme.palette.divider,
163
+ // Keep AppBar *below* the Drawer so the Drawer edge sits flush over it.
164
+ zIndex: (theme as any)?.zIndex?.appBar ?? 1100,
165
+ position: 'fixed',
166
+ top: 0,
167
+ left: 0,
168
+ right: 0,
169
+ width: '100%',
170
+ boxSizing: 'border-box',
171
+ } as const;
172
+
173
+ return (
174
+ <AppBar
175
+ id={id}
176
+ className={className}
177
+ data-testid={dataTestId}
178
+ position={position}
179
+ elevation={0}
180
+ sx={sxN(baseAppBarSx as SxProps<Theme>, { '--has-topbar': 1 } as any, sx, appBarSx)}
181
+ >
182
+ <Toolbar
183
+ ref={toolbarRef}
184
+ variant="dense"
185
+ disableGutters
186
+ sx={sxN(
187
+ {
188
+ minHeight: 48,
189
+ pl: 'var(--gui-rail-width, 0px)',
190
+ pr: 'var(--gui-inset-right, 0px)',
191
+ },
192
+ toolbarSx
193
+ )}
194
+ >
195
+ <SidebarToggleButton
196
+ expanded={showMenuButton}
197
+ onToggle={onMenuClick || (() => {})}
198
+ location={toggleLocation}
199
+ sx={{ mr: 1 }}
200
+ />
201
+ {showMenuButton && (
202
+ <IconButton
203
+ color="inherit"
204
+ edge="start"
205
+ onClick={onMenuClick}
206
+ sx={{ mr: 2 }}
207
+ aria-label="open navigation"
208
+ >
209
+ <Icon name="mui:Menu" color={theme.palette.icon?.main || theme.palette.text.primary} size={24} />
210
+ </IconButton>
211
+ )}
212
+
213
+ <Box
214
+ sx={sxN({ display: 'flex', alignItems: 'center', flexGrow: 1, textDecoration: 'none', ml: showMenuButton ? 2 : 0 }, brandSx)}
215
+ component={Link}
216
+ to={homeTo}
217
+ >
218
+ {logo && (
219
+ <Box component="img" src={logo} alt={`${title} logo`} sx={sxN({ height: 28, mr: 0.75 }, logoSx)} />
220
+ )}
221
+ <Typography variant="h6" noWrap component="div" sx={sxN({ color: theme.palette.text.primary }, titleSx)}>
222
+ {title}
223
+ </Typography>
224
+ </Box>
225
+
226
+ {/* TopBarLinks */}
227
+ <Box sx={sxN({ display: 'flex', alignItems: 'center', gap: 1.25 }, linksSx)}>
228
+ {TopBarLinks.map((link) => {
229
+ const hasChildren = Array.isArray(link.children) && link.children.length > 0;
230
+ if (hasChildren) {
231
+ return (
232
+ <Box key={link.label}>
233
+ <Button
234
+ onClick={(e: MouseEvent<HTMLElement>) => handleMenuOpen(e, link.label)}
235
+ sx={sxN({
236
+ color: theme.palette.text.primary,
237
+ '&:hover': { backgroundColor: 'transparent', color: theme.palette.text.secondary },
238
+ display: 'flex',
239
+ alignItems: 'center',
240
+ gap: 0.5,
241
+ minWidth: 0,
242
+ px: 1,
243
+ }, linkSx)}
244
+ >
245
+ {link.icon && <Icon name={link.icon} color={link.iconColor} size={18} />}
246
+ {link.label}
247
+ </Button>
248
+ <Menu anchorEl={anchorEl} open={openMenu === link.label} onClose={handleMenuClose} sx={menuSx}>
249
+ {link.children!.map((child) => (
250
+ <MenuItem
251
+ key={child.label}
252
+ component={child.external ? 'a' : Link}
253
+ {...(child.external
254
+ ? { href: child.href, target: '_blank', rel: 'noopener noreferrer' }
255
+ : { to: child.href })}
256
+ onClick={handleMenuClose}
257
+ sx={sxN({ display: 'flex', alignItems: 'center', gap: 0.5 }, menuItemSx)}
258
+ >
259
+ {child.icon && <Icon name={child.icon} color={child.iconColor} size={18} />}
260
+ {child.label}
261
+ </MenuItem>
262
+ ))}
263
+ </Menu>
264
+ </Box>
265
+ );
266
+ }
267
+ return (
268
+ <Button
269
+ key={link.label}
270
+ component={link.external ? 'a' : Link}
271
+ {...(link.external
272
+ ? { href: link.href, target: '_blank', rel: 'noopener noreferrer' }
273
+ : { to: link.href })}
274
+ sx={sxN({
275
+ color: theme.palette.text.primary,
276
+ '&:hover': { backgroundColor: 'transparent', color: theme.palette.text.secondary },
277
+ display: 'flex',
278
+ alignItems: 'center',
279
+ gap: 0.5,
280
+ minWidth: 0,
281
+ px: 1,
282
+ }, linkSx)}
283
+ >
284
+ {link.icon && <Icon name={link.icon} color={link.iconColor} size={18} />}
285
+ {link.label}
286
+ </Button>
287
+ );
288
+ })}
289
+ </Box>
290
+
291
+ {showThemeToggle && (
292
+ <Box sx={sxN({ ml: 1 }, actionsSx)}>
293
+ <ThemeSelector tooltip="Select theme" />
294
+ </Box>
295
+ )}
296
+ </Toolbar>
297
+ </AppBar>
298
+ );
299
+ }
@@ -0,0 +1,72 @@
1
+ import * as React from 'react';
2
+ import ThemeModeToggle from './ThemeModeToggle';
3
+
4
+ /**
5
+ * Resolver for ThemeModeToggle
6
+ * ----------------------------
7
+ * Allows you to render the ThemeModeToggle from a plain JSON/config object.
8
+ *
9
+ * Minimal accepted shape:
10
+ * {
11
+ * "type": "ThemeModeToggle",
12
+ * "props": {
13
+ * "variant": "minimal" | "switch",
14
+ * "show": "icons" | "label" | "both",
15
+ * "id": "optional-id",
16
+ * "className": "optional-class",
17
+ * "data-testid": "test-id",
18
+ * // Optional granular styling
19
+ * "sx": { root styles },
20
+ * "iconSx": { icons styles },
21
+ * "switchSx": { switch styles (variant='switch') },
22
+ * "labelSx": { label Typography styles }
23
+ * }
24
+ * }
25
+ */
26
+
27
+ export type ThemeModeToggleSpec = {
28
+ type?: 'ThemeModeToggle';
29
+ /** Render style: compact IconButton ("minimal") or labeled Switch ("switch") */
30
+ variant?: 'minimal' | 'switch';
31
+ /** What to display: icons only, label only, or both */
32
+ show?: 'icons' | 'label' | 'both';
33
+ /** DOM passthroughs */
34
+ id?: string;
35
+ className?: string;
36
+ ['data-testid']?: string;
37
+ /** Granular styling (forwarded to the component) */
38
+ sx?: any;
39
+ iconSx?: any;
40
+ switchSx?: any;
41
+ labelSx?: any;
42
+ };
43
+
44
+ export function resolveThemeModeToggle(p: ThemeModeToggleSpec = {}) {
45
+ const {
46
+ variant = 'minimal',
47
+ show = 'icons',
48
+ id,
49
+ className,
50
+ ['data-testid']: dataTestId,
51
+ sx,
52
+ iconSx,
53
+ switchSx,
54
+ labelSx,
55
+ } = p;
56
+
57
+ return (
58
+ <ThemeModeToggle
59
+ variant={variant}
60
+ show={show}
61
+ id={id}
62
+ className={className}
63
+ data-testid={dataTestId}
64
+ sx={sx}
65
+ iconSx={iconSx}
66
+ switchSx={switchSx}
67
+ labelSx={labelSx}
68
+ />
69
+ );
70
+ }
71
+
72
+ export default resolveThemeModeToggle;