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,484 @@
1
+ import type * as React from 'react';
2
+ import { useEffect, useMemo, useRef, useState } from 'react';
3
+ import { useGuiTheme, type GuiTheme } from '@/gui';
4
+ import Icon from '../../../../themes/icons/Icon';
5
+ export type StickyItem = {
6
+ icon: React.ReactNode | string;
7
+ label?: string;
8
+ href?: string;
9
+ variant?: 'primary' | 'neutral';
10
+ trackId?: string;
11
+ ariaLabel?: string;
12
+ iconColor?: string; // palette key/path or CSS color
13
+ };
14
+
15
+ export type StickyPositioning = {
16
+ topOffset?: number | string;
17
+ maxWidth?: number | string;
18
+ mode?: 'sticky' | 'fixed';
19
+ reserveSpace?: boolean;
20
+ };
21
+
22
+ export type StickyBehavior = {
23
+ hideOnScrollDown?: boolean;
24
+ collapseToFabOnMobile?: boolean; // kept for backwards compatibility
25
+ iconOnlyOnMobile?: boolean;
26
+ mobileBreakpoint?: number;
27
+ hideThreshold?: number;
28
+ showThreshold?: number;
29
+ topGuard?: number;
30
+ };
31
+
32
+ export type StickyThemeOpts = {
33
+ elevation?: number;
34
+ blur?: number;
35
+ contrastMode?: 'auto' | 'light' | 'dark';
36
+ };
37
+
38
+ export type StickyVisibility = {
39
+ enabled?: boolean;
40
+ includeRoutes?: string[] | null;
41
+ excludeRoutes?: string[] | null;
42
+ };
43
+
44
+ export type StickyI18nOpts = {
45
+ useI18n?: boolean;
46
+ t?: (s: string) => string;
47
+ };
48
+
49
+ export type StickyOptionsTopProps = {
50
+ items?: StickyItem[];
51
+ mobileVersion?: 'pill' | 'icons';
52
+ positioning?: StickyPositioning;
53
+ behavior?: StickyBehavior;
54
+ theme?: StickyThemeOpts;
55
+ visibility?: StickyVisibility;
56
+ i18n?: StickyI18nOpts;
57
+ };
58
+ /**
59
+ * StickyOptions (this.GUI)
60
+ * A reusable sticky CTA menu that hangs below the navbar.
61
+ *
62
+ * Props shape (all optional unless noted):
63
+ * - items: Array<{ icon: ReactNode|string, label?: string, href?: string, variant?: 'primary'|'neutral', trackId?: string, ariaLabel?: string }>
64
+ * - positioning: { topOffset?: number|string, maxWidth?: number|string, mode?: 'sticky'|'fixed', reserveSpace?: boolean }
65
+ * - behavior: { hideOnScrollDown?: boolean, collapseToFabOnMobile?: boolean, iconOnlyOnMobile?: boolean, mobileBreakpoint?: number, hideThreshold?: number, showThreshold?: number, topGuard?: number }
66
+ * - theme: { elevation?: number, blur?: number, contrastMode?: 'auto'|'light'|'dark' }
67
+ * - visibility: { enabled?: boolean, includeRoutes?: string[]|null, excludeRoutes?: string[]|null }
68
+ * - i18n: { useI18n?: boolean }
69
+ * - mobileVersion: 'pill' | 'icons'
70
+ */
71
+
72
+ const StickyOptionsTop = ({
73
+ items = [],
74
+ mobileVersion = 'pill',
75
+ positioning = {},
76
+ behavior = {
77
+ hideOnScrollDown: false, // never hide on scroll
78
+ iconOnlyOnMobile: false, // keep text visible on mobile
79
+ mobileBreakpoint: 768
80
+ },
81
+ theme: themeOpts = {},
82
+ visibility = {},
83
+ i18n: i18nOpts = {}
84
+ }: StickyOptionsTopProps) => {
85
+ const muiTheme = (useGuiTheme() as GuiTheme) || ({} as GuiTheme);
86
+ // ---- Defaults
87
+ const {
88
+ topOffset = '0.55rem', // default separation from navbar (tighter default)
89
+ maxWidth = 800,
90
+ mode = 'sticky', // 'sticky' | 'fixed'
91
+ reserveSpace = false // when true, push content down by menu height + offset
92
+ } = positioning;
93
+
94
+ const {
95
+ hideOnScrollDown = false,
96
+ collapseToFabOnMobile = false, // backward-compat
97
+ iconOnlyOnMobile = false,
98
+ mobileBreakpoint = 768,
99
+ hideThreshold = 36, // px scrolled down before hiding
100
+ showThreshold = 12, // px scrolled up before showing again
101
+ topGuard = 20 // do not hide near top of page
102
+ } = behavior;
103
+
104
+ const iconsOnly = mobileVersion === 'icons' || (typeof iconOnlyOnMobile === 'boolean' ? iconOnlyOnMobile : collapseToFabOnMobile);
105
+
106
+ const {
107
+ elevation = 28,
108
+ blur = 9,
109
+ contrastMode = 'auto'
110
+ } = themeOpts;
111
+
112
+ const {
113
+ enabled = true,
114
+ includeRoutes = null,
115
+ excludeRoutes = null
116
+ } = visibility;
117
+
118
+ const { useI18n = false, t: tFn } = i18nOpts;
119
+
120
+ // ---- Translate helper
121
+ const translate: (s: string) => string =
122
+ useI18n && typeof tFn === 'function' ? tFn : (s: string) => s;
123
+
124
+ // Render icon helper: supports ReactNode or declarative string ("mui:Something" / "lucide:something")
125
+ const resolveIconColor = (iconColor?: string): { css?: string } => {
126
+ if (!iconColor) return {};
127
+ const token = iconColor.trim();
128
+
129
+ // Direct CSS color? (#hex, rgb(), hsl())
130
+ if (/^#|^rgb\(|^hsl\(/i.test(token)) {
131
+ return { css: token };
132
+ }
133
+
134
+ const pal: any = muiTheme?.palette;
135
+ if (!pal) return {};
136
+
137
+ // Support palette path notation like "text.secondary" or "action.active"
138
+ if (token.includes('.')) {
139
+ const val = token.split('.').reduce<any>((acc, k) => (acc ? acc[k] : undefined), pal);
140
+ if (typeof val === 'string') return { css: val };
141
+ if (val && typeof val === 'object' && typeof val.main === 'string') return { css: val.main };
142
+ if (val && typeof val === 'object' && typeof (val as any).default === 'string') return { css: (val as any).default };
143
+ return {};
144
+ }
145
+
146
+ // Top-level palette key (e.g., "primary", "info", "divider", "link")
147
+ const v = pal[token];
148
+ if (typeof v === 'string') return { css: v };
149
+ if (v && typeof v === 'object') {
150
+ if (typeof v.main === 'string') return { css: v.main };
151
+ if (typeof (v as any).default === 'string') return { css: (v as any).default };
152
+ }
153
+ return {};
154
+ };
155
+
156
+ const renderIconNode = (icon: React.ReactNode | string, iconColor?: string): React.ReactNode => {
157
+ if (!icon) return null;
158
+ // Direct React element: pass through (do not override color)
159
+ if (typeof icon !== 'string') return icon;
160
+
161
+ const colorInfo = resolveIconColor(iconColor);
162
+ const isMui = icon.toLowerCase().startsWith('mui:');
163
+ const isLucide = icon.toLowerCase().startsWith('lucide:');
164
+
165
+ // If a color was declared, map to the right prop for provider;
166
+ // otherwise, let Icon use theme-aware defaults.
167
+ const colorProps = colorInfo.css
168
+ ? (isMui ? { htmlColor: colorInfo.css } : { color: colorInfo.css })
169
+ : {};
170
+
171
+ return <Icon name={icon} size={16} {...colorProps} />;
172
+ };
173
+
174
+ // ---- Spacer measurement (optional content push)
175
+ const groupElRef = useRef<HTMLDivElement | null>(null);
176
+ const [groupHeight, setGroupHeight] = useState<number>(0);
177
+
178
+ useEffect(() => {
179
+ if (!reserveSpace) return;
180
+ const el = groupElRef.current;
181
+ if (!el) return;
182
+ const update = () => {
183
+ try { setGroupHeight(el.getBoundingClientRect().height || 0); } catch {}
184
+ };
185
+ update();
186
+ let ro: ResizeObserver | undefined;
187
+ if (typeof ResizeObserver !== 'undefined') {
188
+ ro = new ResizeObserver(() => update());
189
+ ro.observe(el);
190
+ }
191
+ window.addEventListener('resize', update);
192
+ return () => {
193
+ window.removeEventListener('resize', update);
194
+ if (ro) try { ro.disconnect(); } catch {}
195
+ };
196
+ }, [reserveSpace]);
197
+
198
+ const topOffsetCSS = typeof topOffset === 'number' ? `${topOffset}px` : String(topOffset);
199
+ // Read insets directly from GUI theme (source of truth set by GuiProvider / components)
200
+ const insetLeft = Math.max(0, Number(muiTheme?.layout?.insets?.left ?? 0));
201
+ const insetRight = Math.max(0, Number(muiTheme?.layout?.insets?.right ?? 0));
202
+ const navPx = Math.max(0, Number(muiTheme?.layout?.insets?.nav ?? 0));
203
+
204
+ // If there is a navbar (navPx > 0) we add the topOffset, else we stick to page top.
205
+ const effectiveTopOffset = navPx > 0 ? topOffsetCSS : '0px';
206
+ const topCSS = `calc(${navPx}px + ${effectiveTopOffset})`;
207
+ const spacerStyle: React.CSSProperties | undefined = reserveSpace ? { height: `calc(${topOffsetCSS} + ${groupHeight}px)` } : undefined;
208
+
209
+ // ---- Route-based visibility
210
+ const isRouteIncluded = useMemo<boolean>(() => {
211
+ if (!enabled) return false;
212
+ const path = typeof window !== 'undefined' ? window.location.pathname : '';
213
+ if (excludeRoutes && excludeRoutes.some((r) => path.startsWith(r))) return false;
214
+ if (includeRoutes && includeRoutes.length > 0) return includeRoutes.some((r) => path.startsWith(r));
215
+ return true;
216
+ }, [enabled, includeRoutes, excludeRoutes]);
217
+
218
+ // ---- Scroll hide behavior (with hysteresis)
219
+ const [hidden, setHidden] = useState<boolean>(false);
220
+ const lastY = useRef<number>(typeof window !== 'undefined' ? window.scrollY : 0);
221
+ const acc = useRef<number>(0);
222
+ const raf = useRef<number | null>(null);
223
+
224
+ useEffect(() => {
225
+ if (!hideOnScrollDown) return;
226
+
227
+ const onScroll = () => {
228
+ if (raf.current) return; // throttle to rAF
229
+ raf.current = requestAnimationFrame(() => {
230
+ const y = window.scrollY;
231
+ const dy = y - lastY.current;
232
+ lastY.current = y;
233
+
234
+ // Guard: don't hide near very top
235
+ if (y <= topGuard) {
236
+ acc.current = 0;
237
+ setHidden(false);
238
+ raf.current = null;
239
+ return;
240
+ }
241
+
242
+ // Accumulate deltas; reset when direction changes
243
+ if ((dy > 0 && acc.current < 0) || (dy < 0 && acc.current > 0)) acc.current = 0;
244
+ acc.current += dy;
245
+
246
+ if (acc.current > hideThreshold && !hidden) {
247
+ setHidden(true);
248
+ acc.current = 0; // reset after state change
249
+ } else if (acc.current < -showThreshold && hidden) {
250
+ setHidden(false);
251
+ acc.current = 0; // reset after state change
252
+ }
253
+ raf.current = null;
254
+ });
255
+ };
256
+
257
+ window.addEventListener('scroll', onScroll, { passive: true });
258
+ return () => {
259
+ window.removeEventListener('scroll', onScroll);
260
+ if (raf.current !== null) cancelAnimationFrame(raf.current as number);
261
+ };
262
+ }, [hideOnScrollDown, hideThreshold, showThreshold, topGuard, hidden]);
263
+
264
+ // ---- Colors from MUI theme with safe fallbacks
265
+ const colors = useMemo(() => {
266
+ const mode = muiTheme?.palette?.mode || 'dark';
267
+ const linkMain = muiTheme?.palette?.link?.main || 'rgb(0, 170, 150)';
268
+ const bgPaper = muiTheme?.palette?.background?.paper || (mode === 'dark' ? 'rgb(24,26,28)' : '#ffffff');
269
+ const bg = mode === 'dark' ? 'rgba(24,26,28,0.65)' : 'rgba(255,255,255,0.8)';
270
+ const border = muiTheme?.custom?.border || (mode === 'dark' ? 'rgba(255,255,255,0.14)' : 'rgba(0,0,0,0.1)');
271
+ const neutralBg = mode === 'dark' ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.04)';
272
+ const neutralBorder = mode === 'dark' ? 'rgba(255,255,255,0.18)' : 'rgba(0,0,0,0.08)';
273
+ const text = muiTheme?.palette?.text?.primary || (mode === 'dark' ? '#fff' : '#111');
274
+ return { linkMain, bgPaper, bg, border, neutralBg, neutralBorder, text, mode };
275
+ }, [muiTheme]);
276
+
277
+ // ---- Collapse to FAB on mobile
278
+ // Reusable size for mobile FAB layout
279
+ const FAB_SIZE = 40;
280
+ const [isMobile, setIsMobile] = useState<boolean>(() => (typeof window !== 'undefined' ? window.innerWidth < mobileBreakpoint : false));
281
+ useEffect(() => {
282
+ if (!iconsOnly) return;
283
+ const onResize = () => setIsMobile(window.innerWidth < mobileBreakpoint);
284
+ window.addEventListener('resize', onResize);
285
+ return () => window.removeEventListener('resize', onResize);
286
+ }, [iconsOnly, mobileBreakpoint]);
287
+
288
+ // New isSmall state that tracks window.innerWidth < mobileBreakpoint regardless of iconsOnly
289
+ const [isSmall, setIsSmall] = useState<boolean>(() => (typeof window !== 'undefined' ? window.innerWidth < mobileBreakpoint : false));
290
+ useEffect(() => {
291
+ const onResize = () => setIsSmall(window.innerWidth < mobileBreakpoint);
292
+ window.addEventListener('resize', onResize);
293
+ return () => window.removeEventListener('resize', onResize);
294
+ }, [mobileBreakpoint]);
295
+
296
+ // ---- Tracking helper
297
+ const trackClick = (trackId?: string, label?: string) => {
298
+ try {
299
+ window.dispatchEvent(new CustomEvent('stickyoptions:click', { detail: { trackId, label } }));
300
+ } catch {/* no-op */}
301
+ };
302
+
303
+ if (!isRouteIncluded) return null;
304
+
305
+ // ---- Render item (anchor or span)
306
+ const renderItem = (item: StickyItem, i: number): React.ReactNode => {
307
+ const { icon, label, href, variant = 'neutral', trackId, ariaLabel } = item || {};
308
+ const hasText = !!label;
309
+ const isPrimary = variant === 'primary';
310
+ const commonStyle: React.CSSProperties = {
311
+ display: 'inline-flex',
312
+ alignItems: 'center',
313
+ gap: hasText ? 8 : 0,
314
+ padding: `${isSmall ? 6 : 7}px ${hasText ? (isSmall ? 10 : 12) : (isSmall ? 6 : 8)}px`,
315
+ borderRadius: 999,
316
+ minWidth: hasText ? (isSmall ? 92 : 108) : 40,
317
+ whiteSpace: 'nowrap',
318
+ flexShrink: 0,
319
+ justifyContent: 'center',
320
+ fontWeight: 800,
321
+ textDecoration: 'none',
322
+ border: isPrimary ? '1px solid transparent' : `1px solid ${colors.neutralBorder}`,
323
+ background: isPrimary ? 'rgba(0, 170, 150, 0.12)' : colors.neutralBg,
324
+ color: isPrimary ? colors.linkMain : colors.text
325
+ } as React.CSSProperties;
326
+
327
+ const content = (
328
+ <>
329
+ {icon ? (
330
+ <span style={{ display: 'inline-flex', marginRight: hasText ? 6 : 0 }}>
331
+ {renderIconNode(icon, item?.iconColor)}
332
+ </span>
333
+ ) : null}
334
+ {hasText ? (useI18n ? translate(label!) : label) : null}
335
+ </>
336
+ );
337
+
338
+ if (href) {
339
+ const external = /^https?:\/\//i.test(href);
340
+ return (
341
+ <a
342
+ key={i}
343
+ href={href}
344
+ target={external ? '_blank' : undefined}
345
+ rel={external ? 'noopener noreferrer' : undefined}
346
+ aria-label={ariaLabel || label}
347
+ onClick={() => trackClick(trackId, label)}
348
+ style={commonStyle}
349
+ >
350
+ {content}
351
+ </a>
352
+ );
353
+ }
354
+ return (
355
+ <span key={i} aria-label={ariaLabel || label} style={commonStyle}>
356
+ {content}
357
+ </span>
358
+ );
359
+ };
360
+
361
+ // ---- Layout wrappers
362
+ const wrapperStyle: React.CSSProperties = {
363
+ // Use sticky by default; fixed when explicitly requested
364
+ position: mode === 'fixed' ? 'fixed' : 'sticky',
365
+ top: topCSS,
366
+ left: mode === 'fixed' ? `${insetLeft}px` : undefined,
367
+ right: mode === 'fixed' ? `${insetRight}px` : undefined,
368
+ zIndex: Math.max(0, (muiTheme?.zIndex?.appBar ?? 1100) - 1),
369
+ width: '100%',
370
+ // Apply hide animation only when the feature is enabled and the bar is actually hidden.
371
+ ...(hideOnScrollDown && hidden
372
+ ? {
373
+ transform: 'translateY(-8px)',
374
+ opacity: 0,
375
+ transition: 'transform 180ms ease, opacity 180ms ease',
376
+ }
377
+ : {
378
+ transition: 'transform 180ms ease, opacity 180ms ease',
379
+ }),
380
+ // Ensure the wrapper contributes height when children are absolutely positioned (e.g., mobile FAB)
381
+ minHeight: iconsOnly && isMobile ? FAB_SIZE + 8 : undefined,
382
+ } as React.CSSProperties;
383
+
384
+ const innerWrapStyle: React.CSSProperties = {
385
+ position: 'relative',
386
+ width: `calc(100% - ${insetLeft}px - ${insetRight}px)`,
387
+ margin: '0 auto',
388
+ maxWidth: '100%',
389
+ display: 'flex',
390
+ alignItems: 'flex-start',
391
+ justifyContent: 'center'
392
+ } as React.CSSProperties;
393
+
394
+ const groupBase: React.CSSProperties = {
395
+ display: 'inline-flex',
396
+ gap: 6,
397
+ padding: '4px 8px',
398
+ borderRadius: 999,
399
+ background: colors.bg,
400
+ backdropFilter: `blur(${blur}px)`,
401
+ WebkitBackdropFilter: `blur(${blur}px)`,
402
+ border: `1px solid ${colors.border}`,
403
+ boxShadow: `0 ${Math.round(elevation/3)}px ${elevation}px rgba(0,0,0,0.35)`,
404
+ whiteSpace: 'nowrap',
405
+ pointerEvents: 'auto'
406
+ } as React.CSSProperties;
407
+
408
+ // Position group: always center
409
+ const groupStyle: React.CSSProperties = {
410
+ ...groupBase,
411
+ maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth
412
+ } as React.CSSProperties;
413
+
414
+ // Collapse: icon-only FABs on mobile
415
+ if (iconsOnly && isMobile) {
416
+ const fabWrapStyle: React.CSSProperties = {
417
+ display: 'inline-flex',
418
+ gap: 10,
419
+ alignItems: 'center',
420
+ justifyContent: 'center',
421
+ whiteSpace: 'nowrap'
422
+ } as React.CSSProperties;
423
+
424
+ return (
425
+ <>
426
+ {reserveSpace && <div style={spacerStyle} />}
427
+ <div style={wrapperStyle}>
428
+ <div style={innerWrapStyle}>
429
+ <div style={fabWrapStyle} ref={groupElRef}>
430
+ {items.slice(0, 3).map((item, i) => {
431
+ const isPrimary = (item?.variant || 'neutral') === 'primary';
432
+ const style: React.CSSProperties = {
433
+ width: FAB_SIZE,
434
+ height: FAB_SIZE,
435
+ minWidth: FAB_SIZE,
436
+ minHeight: FAB_SIZE,
437
+ flex: `0 0 ${FAB_SIZE}px`,
438
+ aspectRatio: '1 / 1',
439
+ boxSizing: 'border-box',
440
+ padding: 0,
441
+ borderRadius: 999,
442
+ display: 'inline-flex',
443
+ alignItems: 'center',
444
+ justifyContent: 'center',
445
+ lineHeight: 0,
446
+ textDecoration: 'none',
447
+ border: isPrimary ? '1px solid transparent' : `1px solid ${colors.neutralBorder}`,
448
+ background: isPrimary ? 'rgba(0, 170, 150, 0.12)' : colors.neutralBg,
449
+ color: isPrimary ? colors.linkMain : colors.text
450
+ } as React.CSSProperties;
451
+ const aria = item?.ariaLabel || item?.label;
452
+ if (item?.href) {
453
+ const external = /^https?:\/\//i.test(item.href);
454
+ return (
455
+ <a key={i} href={item.href} target={external ? '_blank' : undefined} rel={external ? 'noopener noreferrer' : undefined} aria-label={aria} onClick={() => trackClick(item?.trackId, item?.label)} style={style}>
456
+ {renderIconNode(item?.icon, item?.iconColor)}
457
+ </a>
458
+ );
459
+ }
460
+ return <span key={i} aria-label={aria} style={style}>{renderIconNode(item?.icon, item?.iconColor)}</span>;
461
+ })}
462
+ </div>
463
+ </div>
464
+ </div>
465
+ </>
466
+ );
467
+ }
468
+
469
+ // Default full pill rendering
470
+ return (
471
+ <>
472
+ {reserveSpace && <div style={spacerStyle} />}
473
+ <div style={wrapperStyle}>
474
+ <div style={innerWrapStyle}>
475
+ <div style={groupStyle} ref={groupElRef}>
476
+ {items.map((item, i) => renderItem(item, i))}
477
+ </div>
478
+ </div>
479
+ </div>
480
+ </>
481
+ );
482
+ };
483
+
484
+ export default StickyOptionsTop;
@@ -0,0 +1,84 @@
1
+ // src/components/generics/AppBars/TopBar/TopBar.resolver.tsx
2
+ import * as React from 'react';
3
+ import TopBar from './TopBar';
4
+ import type { RegistryEntry, ResolveCtx } from '@/registry/types';
5
+
6
+ /** Declarative shape the renderer/LLM can emit for a TopBar */
7
+ type TopBarLinkChildSpec = {
8
+ label: string;
9
+ href?: string;
10
+ external?: boolean;
11
+ icon?: string;
12
+ iconColor?: string;
13
+ };
14
+
15
+ type TopBarLinkSpec = {
16
+ label: string;
17
+ href?: string;
18
+ external?: boolean;
19
+ icon?: string;
20
+ iconColor?: string;
21
+ children?: TopBarLinkChildSpec[];
22
+ };
23
+
24
+ type TopBarSpec = {
25
+ type: 'TopBar';
26
+ props?: {
27
+ title?: string;
28
+ logo?: string;
29
+ NavBarLinks?: TopBarLinkSpec[];
30
+ showMenuButton?: boolean;
31
+ showThemeToggle?: boolean;
32
+ homeTo?: string;
33
+ position?: 'fixed' | 'static' | 'sticky';
34
+
35
+ /** Optional event id to resolve from ctx.actions (e.g., 'openLeftDrawer') */
36
+ onMenuClickId?: string;
37
+
38
+ /** Pass-through styling slot (sx forwarded to AppBar/Toolbar usage inside) */
39
+ sx?: any;
40
+
41
+ /** Misc passthroughs */
42
+ id?: string;
43
+ className?: string;
44
+ 'data-testid'?: string;
45
+ };
46
+ };
47
+
48
+ /**
49
+ * TopBarResolver
50
+ * - Maps a JSON-friendly spec → real <TopBar />.
51
+ * - Handlers can be injected from ResolveCtx via `onMenuClickId`.
52
+ */
53
+ const TopBarResolver: RegistryEntry = {
54
+ type: 'TopBar',
55
+ resolve(spec: TopBarSpec, ctx?: ResolveCtx) {
56
+ const p = spec.props ?? {};
57
+
58
+ // Resolve optional handler from ctx if provided
59
+ const onMenuClick =
60
+ (p.onMenuClickId && ctx?.actions && typeof ctx.actions[p.onMenuClickId] === 'function')
61
+ ? ctx.actions[p.onMenuClickId]
62
+ : undefined;
63
+
64
+ return (
65
+ <TopBar
66
+ title={p.title ?? 'neurons.me'}
67
+ logo={p.logo ?? 'https://neurons.me/neurons.me.png'}
68
+ TopBarLinks={p.NavBarLinks ?? []}
69
+ showMenuButton={p.showMenuButton ?? false}
70
+ onMenuClick={onMenuClick}
71
+ showThemeToggle={p.showThemeToggle ?? true}
72
+ homeTo={p.homeTo ?? '/'}
73
+ position={p.position ?? 'fixed'}
74
+ // passthroughs
75
+ sx={p.sx}
76
+ id={p.id}
77
+ className={p.className}
78
+ data-testid={p['data-testid']}
79
+ />
80
+ );
81
+ },
82
+ };
83
+
84
+ export default TopBarResolver;