this.gui 1.0.18 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. package/.storybook/main.js +40 -0
  2. package/.storybook/manager-head.html +13 -0
  3. package/.storybook/manager.js +15 -0
  4. package/.storybook/preview.tsx +54 -0
  5. package/.storybook/vitest.setup.js +6 -0
  6. package/.storybook/withLayout.tsx +18 -0
  7. package/README.md +1 -220
  8. package/dist/GUI.png +0 -0
  9. package/dist/GUI2.png +0 -0
  10. package/dist/favicon.ico +0 -0
  11. package/dist/this-gui.es.js +108493 -5056
  12. package/dist/this-gui.umd.js +239 -44
  13. package/dist/this.GUI.png +0 -0
  14. package/nodes/overall approach.md +93 -0
  15. package/notes/Proyect.md +109 -0
  16. package/package.json +71 -54
  17. package/public/GUI.png +0 -0
  18. package/public/GUI2.png +0 -0
  19. package/public/favicon.ico +0 -0
  20. package/public/this.GUI.png +0 -0
  21. package/src/components/generics/Cards/Gridme.jsx +52 -0
  22. package/src/components/generics/Cards/LilBox.jsx +65 -0
  23. package/src/components/generics/Cards/ModuleCard.jsx +106 -0
  24. package/src/components/generics/Chats/FullChatBot.jsx +223 -0
  25. package/src/components/generics/Code/CodeBlock.jsx +33 -0
  26. package/src/components/generics/Feedback/Callout.jsx +92 -0
  27. package/src/components/generics/Layout/GridX.jsx +29 -0
  28. package/src/components/generics/Layout/Hero2.jsx +132 -0
  29. package/src/components/generics/Layout/PageContainer.jsx +29 -0
  30. package/src/components/generics/Layout/PageDivider.jsx +20 -0
  31. package/src/components/generics/Layout/Section.jsx +43 -0
  32. package/src/components/generics/Layout/SectionHeader.jsx +21 -0
  33. package/src/components/generics/Media/Img.jsx +58 -0
  34. package/src/components/generics/Media/VideoEmbed.jsx +51 -0
  35. package/src/components/generics/Organization/TableOfContents.jsx +51 -0
  36. package/src/components/generics/Organization/Tabs.jsx +45 -0
  37. package/src/components/generics/Text/TextList.jsx +41 -0
  38. package/src/components/generics/Text/TextParagraph.jsx +28 -0
  39. package/src/components/generics/Text/TextQuote.jsx +23 -0
  40. package/src/components/generics/Text/TextTitle.jsx +44 -0
  41. package/src/components/this.me/MeActive.jsx +24 -0
  42. package/src/components/this.me/MeFloating.jsx +183 -0
  43. package/src/components/this.me/MeInactive.jsx +21 -0
  44. package/src/components/this.me/MeListUs.jsx +40 -0
  45. package/src/components/this.me/MeState.jsx +25 -0
  46. package/src/components/this.me/hooks/useMe.js +43 -0
  47. package/src/context/GuiProvider.tsx +243 -0
  48. package/src/gui/atoms/AppBar/AppBar.resolver.tsx +77 -0
  49. package/src/gui/atoms/AppBar/AppBar.stories.tsx +232 -0
  50. package/src/gui/atoms/AppBar/AppBar.tsx +10 -0
  51. package/src/gui/atoms/Box/Box.resolver.tsx +171 -0
  52. package/src/gui/atoms/Box/Box.stories.tsx +271 -0
  53. package/src/gui/atoms/Box/Box.tsx +15 -0
  54. package/src/gui/atoms/Button/Button.resolver.tsx +98 -0
  55. package/src/gui/atoms/Button/Button.stories.tsx +225 -0
  56. package/src/gui/atoms/Button/Button.tsx +40 -0
  57. package/src/gui/atoms/Collapse/Collapse.resolver.tsx +85 -0
  58. package/src/gui/atoms/Collapse/Collapse.stories.tsx +136 -0
  59. package/src/gui/atoms/Collapse/Collapse.tsx +17 -0
  60. package/src/gui/atoms/Divider/Divider.resolver.tsx +95 -0
  61. package/src/gui/atoms/Divider/Divider.stories.tsx +109 -0
  62. package/src/gui/atoms/Divider/Divider.tsx +14 -0
  63. package/src/gui/atoms/Drawer/Drawer.resolver.tsx +116 -0
  64. package/src/gui/atoms/Drawer/Drawer.stories.tsx +229 -0
  65. package/src/gui/atoms/Drawer/Drawer.tsx +8 -0
  66. package/src/gui/atoms/IconButton/IconButton.resolver.tsx +135 -0
  67. package/src/gui/atoms/IconButton/IconButton.stories.tsx +141 -0
  68. package/src/gui/atoms/IconButton/IconButton.tsx +22 -0
  69. package/src/gui/atoms/Link/Link.resolver.tsx +75 -0
  70. package/src/gui/atoms/Link/Link.stories.tsx +164 -0
  71. package/src/gui/atoms/Link/Link.tsx +14 -0
  72. package/src/gui/atoms/List/List.resolver.tsx +95 -0
  73. package/src/gui/atoms/List/List.stories.tsx +143 -0
  74. package/src/gui/atoms/List/List.tsx +20 -0
  75. package/src/gui/atoms/ListItem/ListItem.resolver.tsx +88 -0
  76. package/src/gui/atoms/ListItem/ListItem.stories.tsx +157 -0
  77. package/src/gui/atoms/ListItem/ListItem.tsx +19 -0
  78. package/src/gui/atoms/ListItemButton/ListItemButton.resolver.tsx +208 -0
  79. package/src/gui/atoms/ListItemButton/ListItemButton.stories.tsx +161 -0
  80. package/src/gui/atoms/ListItemButton/ListItemButton.tsx +15 -0
  81. package/src/gui/atoms/ListItemIcon/ListItemIcon.resolver.tsx +102 -0
  82. package/src/gui/atoms/ListItemIcon/ListItemIcon.stories.tsx +135 -0
  83. package/src/gui/atoms/ListItemIcon/ListItemIcon.tsx +11 -0
  84. package/src/gui/atoms/ListItemText/ListItemText.resolver.tsx +112 -0
  85. package/src/gui/atoms/ListItemText/ListItemText.stories.tsx +162 -0
  86. package/src/gui/atoms/ListItemText/ListItemText.tsx +15 -0
  87. package/src/gui/atoms/Menu/Menu.resolver.tsx +112 -0
  88. package/src/gui/atoms/Menu/Menu.stories.tsx +168 -0
  89. package/src/gui/atoms/Menu/Menu.tsx +17 -0
  90. package/src/gui/atoms/MenuItem/MenuItem.resolver.tsx +183 -0
  91. package/src/gui/atoms/MenuItem/MenuItem.stories.tsx +138 -0
  92. package/src/gui/atoms/MenuItem/MenuItem.tsx +14 -0
  93. package/src/gui/atoms/Paper/Paper.resolver.tsx +98 -0
  94. package/src/gui/atoms/Paper/Paper.stories.tsx +191 -0
  95. package/src/gui/atoms/Paper/Paper.tsx +17 -0
  96. package/src/gui/atoms/Stack/Stack.resolver.tsx +94 -0
  97. package/src/gui/atoms/Stack/Stack.stories.tsx +166 -0
  98. package/src/gui/atoms/Stack/Stack.tsx +15 -0
  99. package/src/gui/atoms/Switch/Switch.resolver.tsx +53 -0
  100. package/src/gui/atoms/Switch/Switch.stories.tsx +242 -0
  101. package/src/gui/atoms/Switch/Switch.tsx +22 -0
  102. package/src/gui/atoms/Toolbar/Toolbar.resolver.tsx +60 -0
  103. package/src/gui/atoms/Toolbar/Toolbar.stories.tsx +163 -0
  104. package/src/gui/atoms/Toolbar/Toolbar.tsx +16 -0
  105. package/src/gui/atoms/Tooltip/Tooltip.resolver.tsx +142 -0
  106. package/src/gui/atoms/Tooltip/Tooltip.stories.tsx +118 -0
  107. package/src/gui/atoms/Tooltip/Tooltip.tsx +78 -0
  108. package/src/gui/atoms/Typography/Typography.resolver.tsx +158 -0
  109. package/src/gui/atoms/Typography/Typography.stories.tsx +228 -0
  110. package/src/gui/atoms/Typography/Typography.tsx +27 -0
  111. package/src/gui/atoms.tsx +129 -0
  112. package/src/gui/index.ts +69 -0
  113. package/src/gui/molecules/AppBars/Footer/Footer.resolver.tsx +104 -0
  114. package/src/gui/molecules/AppBars/Footer/Footer.stories.tsx +499 -0
  115. package/src/gui/molecules/AppBars/Footer/Footer.tsx +307 -0
  116. package/src/gui/molecules/AppBars/LeftSidebar/LeftSidebar.resolver.tsx +75 -0
  117. package/src/gui/molecules/AppBars/LeftSidebar/LeftSidebar.stories.tsx +61 -0
  118. package/src/gui/molecules/AppBars/LeftSidebar/LeftSidebar.tsx +511 -0
  119. package/src/gui/molecules/AppBars/LeftSidebar/SidebarToggleButton.tsx +51 -0
  120. package/src/gui/molecules/AppBars/RightSidebar/RightSidebar.resolver.tsx +97 -0
  121. package/src/gui/molecules/AppBars/RightSidebar/RightSidebar.stories.tsx +294 -0
  122. package/src/gui/molecules/AppBars/RightSidebar/RightSidebar.tsx +295 -0
  123. package/src/gui/molecules/AppBars/StickyOptions/StickyOptionsTop.stories.tsx +480 -0
  124. package/src/gui/molecules/AppBars/StickyOptions/StickyOptionsTop.tsx +484 -0
  125. package/src/gui/molecules/AppBars/TopBar/TopBar.resolver.tsx +84 -0
  126. package/src/gui/molecules/AppBars/TopBar/TopBar.stories.tsx +297 -0
  127. package/src/gui/molecules/AppBars/TopBar/TopBar.tsx +299 -0
  128. package/src/gui/molecules/Utilities/ThemeModeToggle/ThemeModeToggle.resolver.tsx +72 -0
  129. package/src/gui/molecules/Utilities/ThemeModeToggle/ThemeModeToggle.stories.tsx +154 -0
  130. package/src/gui/molecules/Utilities/ThemeModeToggle/ThemeModeToggle.tsx +100 -0
  131. package/src/gui/molecules/Utilities/ThemeSelector.jsx +281 -0
  132. package/src/gui/utils/nodeID.ts +8 -0
  133. package/src/index.js +111 -0
  134. package/src/registry/GuiRegistry.ts +19 -0
  135. package/src/registry/factory.ts +12 -0
  136. package/src/registry/index.ts +3 -0
  137. package/src/registry/types.ts +6 -0
  138. package/src/stories/01.Home.mdx +22 -0
  139. package/src/stories/02.Understanding.This.GUI.md +149 -0
  140. package/src/stories/03.Themes.mdx +235 -0
  141. package/src/stories/04.GuiProvider.md +126 -0
  142. package/src/stories/04.GuiProvider.mdx +129 -0
  143. package/src/stories/Theme/BreakPointsAndGrids.stories.jsx +185 -0
  144. package/src/stories/Theme/Colors.stories.jsx +245 -0
  145. package/src/stories/Theme/Icons.stories.jsx +313 -0
  146. package/src/stories/Theme/Motion.stories.jsx +206 -0
  147. package/src/stories/Theme/ShadowAndElevation.stories.jsx +95 -0
  148. package/src/stories/Theme/SpacingAndRadius.stories.jsx +129 -0
  149. package/src/stories/Theme/Typography.stories.jsx +211 -0
  150. package/src/stories/assets/this.GUI.png +0 -0
  151. package/src/templates/BrowserExtension.jsx +56 -0
  152. package/src/templates/Layout.tsx +36 -0
  153. package/src/templates/Minimal.jsx +123 -0
  154. package/src/templates/Shell/Shell.jsx +107 -0
  155. package/src/themes/fromTokens.ts +352 -0
  156. package/src/themes/icons/Icon.tsx +137 -0
  157. package/src/themes/icons/packs/Lucide.ts +72 -0
  158. package/src/themes/icons/packs/Material.ts +87 -0
  159. package/src/themes/icons/registry.tsx +178 -0
  160. package/src/themes/index.js +116 -0
  161. package/src/themes/theme.d.ts +116 -0
  162. package/src/themes/tokens/global.tokens.json +107 -0
  163. package/src/themes/tokens/neurons/dark.tokens.json +45 -0
  164. package/src/themes/tokens/neurons/light.tokens.json +51 -0
  165. package/src/themes/tokens/neurons/manifest.json +23 -0
  166. package/src/types/theme.d.ts +32 -0
  167. package/src/types/viewport.ts +132 -0
  168. package/tsconfig.json +24 -0
  169. package/vite.config.js +74 -0
  170. package/dist/style.css +0 -1
  171. package/src/App.jsx +0 -39
  172. package/src/CreatePage.jsx +0 -61
  173. package/src/MDXEditor.jsx +0 -51
  174. package/src/MdxProvider.jsx +0 -20
  175. package/src/Page.jsx +0 -28
  176. package/src/PageDashboard.jsx +0 -56
  177. package/src/SiteBuilder.jsx +0 -108
  178. package/src/example.json +0 -43
  179. package/src/index.mdx +0 -164
  180. package/src/main.jsx +0 -15
  181. package/src/scripts/ComponentRegistry.js +0 -70
  182. package/src/scripts/logASCIIArt.js +0 -12
  183. package/src/scripts/postinstall.js +0 -111
  184. package/src/scripts/renderComponents.js +0 -11
  185. package/src/stories/Atoms/Alert/Alert.css +0 -211
  186. package/src/stories/Atoms/Alert/Alert.jsx +0 -56
  187. package/src/stories/Atoms/Alert/Alert.stories.jsx +0 -167
  188. package/src/stories/Atoms/Audio/Audio.css +0 -259
  189. package/src/stories/Atoms/Audio/Audio.jsx +0 -216
  190. package/src/stories/Atoms/Audio/Audio.stories.jsx +0 -191
  191. package/src/stories/Atoms/Badge/Badge.css +0 -249
  192. package/src/stories/Atoms/Badge/Badge.jsx +0 -54
  193. package/src/stories/Atoms/Badge/Badge.stories.jsx +0 -121
  194. package/src/stories/Atoms/Button/Button.css +0 -332
  195. package/src/stories/Atoms/Button/Button.jsx +0 -44
  196. package/src/stories/Atoms/Button/Button.stories.jsx +0 -209
  197. package/src/stories/Atoms/Caption/Caption.css +0 -169
  198. package/src/stories/Atoms/Caption/Caption.jsx +0 -72
  199. package/src/stories/Atoms/Caption/Caption.stories.jsx +0 -207
  200. package/src/stories/Atoms/Checkbox/Checkbox.css +0 -182
  201. package/src/stories/Atoms/Checkbox/Checkbox.jsx +0 -83
  202. package/src/stories/Atoms/Checkbox/Checkbox.stories.jsx +0 -112
  203. package/src/stories/Atoms/Container/Container.css +0 -470
  204. package/src/stories/Atoms/Container/Container.jsx +0 -116
  205. package/src/stories/Atoms/Container/Container.stories.jsx +0 -145
  206. package/src/stories/Atoms/Divider/Divider.css +0 -147
  207. package/src/stories/Atoms/Divider/Divider.jsx +0 -62
  208. package/src/stories/Atoms/Divider/Divider.stories.jsx +0 -105
  209. package/src/stories/Atoms/Grid/Grid.css +0 -160
  210. package/src/stories/Atoms/Grid/Grid.jsx +0 -43
  211. package/src/stories/Atoms/Grid/Grid.stories.jsx +0 -84
  212. package/src/stories/Atoms/Heading/Heading.css +0 -112
  213. package/src/stories/Atoms/Heading/Heading.jsx +0 -69
  214. package/src/stories/Atoms/Heading/Heading.stories.jsx +0 -130
  215. package/src/stories/Atoms/Icon/Icon.css +0 -240
  216. package/src/stories/Atoms/Icon/Icon.jsx +0 -80
  217. package/src/stories/Atoms/Icon/Icon.stories.jsx +0 -177
  218. package/src/stories/Atoms/Image/Image.css +0 -245
  219. package/src/stories/Atoms/Image/Image.jsx +0 -175
  220. package/src/stories/Atoms/Image/Image.stories.jsx +0 -332
  221. package/src/stories/Atoms/Label/Label.css +0 -171
  222. package/src/stories/Atoms/Label/Label.jsx +0 -71
  223. package/src/stories/Atoms/Label/Label.stories.jsx +0 -180
  224. package/src/stories/Atoms/Link/Link.css +0 -51
  225. package/src/stories/Atoms/Link/Link.jsx +0 -72
  226. package/src/stories/Atoms/Link/Link.stories.jsx +0 -153
  227. package/src/stories/Atoms/Loader/Loader.css +0 -106
  228. package/src/stories/Atoms/Loader/Loader.jsx +0 -58
  229. package/src/stories/Atoms/Loader/Loader.stories.jsx +0 -99
  230. package/src/stories/Atoms/Logo/Logo.css +0 -94
  231. package/src/stories/Atoms/Logo/Logo.jsx +0 -53
  232. package/src/stories/Atoms/Logo/Logo.stories.jsx +0 -120
  233. package/src/stories/Atoms/Paragraph/Paragraph.css +0 -180
  234. package/src/stories/Atoms/Paragraph/Paragraph.jsx +0 -77
  235. package/src/stories/Atoms/Paragraph/Paragraph.stories.jsx +0 -143
  236. package/src/stories/Atoms/ProgressBar/ProgressBar.css +0 -127
  237. package/src/stories/Atoms/ProgressBar/ProgressBar.jsx +0 -40
  238. package/src/stories/Atoms/ProgressBar/ProgressBar.stories.jsx +0 -86
  239. package/src/stories/Atoms/RadioButton/RadioButton.css +0 -130
  240. package/src/stories/Atoms/RadioButton/RadioButton.jsx +0 -87
  241. package/src/stories/Atoms/RadioButton/RadioButton.stories.jsx +0 -113
  242. package/src/stories/Atoms/Range/Range.css +0 -169
  243. package/src/stories/Atoms/Range/Range.jsx +0 -87
  244. package/src/stories/Atoms/Range/Range.stories.jsx +0 -110
  245. package/src/stories/Atoms/Section/Section.css +0 -268
  246. package/src/stories/Atoms/Section/Section.jsx +0 -63
  247. package/src/stories/Atoms/Section/Section.stories.jsx +0 -46
  248. package/src/stories/Atoms/Select/Select.css +0 -87
  249. package/src/stories/Atoms/Select/Select.jsx +0 -73
  250. package/src/stories/Atoms/Select/Select.stories.jsx +0 -109
  251. package/src/stories/Atoms/Slider/Slider.css +0 -90
  252. package/src/stories/Atoms/Slider/Slider.jsx +0 -129
  253. package/src/stories/Atoms/Slider/Slider.stories.jsx +0 -90
  254. package/src/stories/Atoms/Snackbar/Snackbar.css +0 -313
  255. package/src/stories/Atoms/Snackbar/Snackbar.jsx +0 -72
  256. package/src/stories/Atoms/Snackbar/Snackbar.stories.jsx +0 -78
  257. package/src/stories/Atoms/Spacer/Spacer.css +0 -114
  258. package/src/stories/Atoms/Spacer/Spacer.jsx +0 -35
  259. package/src/stories/Atoms/Spacer/Spacer.stories.jsx +0 -61
  260. package/src/stories/Atoms/Spinner/Spinner.css +0 -110
  261. package/src/stories/Atoms/Spinner/Spinner.jsx +0 -65
  262. package/src/stories/Atoms/Spinner/Spinner.stories.jsx +0 -58
  263. package/src/stories/Atoms/Tag/Tag.css +0 -112
  264. package/src/stories/Atoms/Tag/Tag.jsx +0 -75
  265. package/src/stories/Atoms/Tag/Tag.stories.jsx +0 -67
  266. package/src/stories/Atoms/TextArea/TextArea.css +0 -99
  267. package/src/stories/Atoms/TextArea/TextArea.jsx +0 -118
  268. package/src/stories/Atoms/TextArea/TextArea.stories.jsx +0 -36
  269. package/src/stories/Atoms/TextInput/TextInput.css +0 -102
  270. package/src/stories/Atoms/TextInput/TextInput.jsx +0 -133
  271. package/src/stories/Atoms/TextInput/TextInput.stories.jsx +0 -69
  272. package/src/stories/Atoms/Toggle/Toggle.css +0 -118
  273. package/src/stories/Atoms/Toggle/Toggle.jsx +0 -69
  274. package/src/stories/Atoms/Toggle/Toggle.stories.jsx +0 -35
  275. package/src/stories/Atoms/Tooltip/Tooltip.css +0 -383
  276. package/src/stories/Atoms/Tooltip/Tooltip.jsx +0 -46
  277. package/src/stories/Atoms/Tooltip/Tooltip.stories.jsx +0 -52
  278. package/src/stories/Atoms/Video/Video.css +0 -39
  279. package/src/stories/Atoms/Video/Video.jsx +0 -78
  280. package/src/stories/Atoms/Video/Video.stories.jsx +0 -41
  281. package/src/stories/Atoms/index.js +0 -72
  282. package/src/stories/Atoms/meta_Atoms.js +0 -51
  283. package/src/stories/Components.js +0 -198
  284. package/src/stories/Getting Started.mdx +0 -239
  285. package/src/stories/Layouts/Accordion/Accordion.css +0 -293
  286. package/src/stories/Layouts/Accordion/Accordion.jsx +0 -74
  287. package/src/stories/Layouts/Accordion/Accordion.stories.jsx +0 -39
  288. package/src/stories/Layouts/Flexbox/Flexbox.css +0 -16
  289. package/src/stories/Layouts/Flexbox/Flexbox.jsx +0 -11
  290. package/src/stories/Layouts/Flexbox/Flexbox.stories.jsx +0 -28
  291. package/src/stories/Layouts/Footer/Footer.css +0 -16
  292. package/src/stories/Layouts/Footer/Footer.jsx +0 -31
  293. package/src/stories/Layouts/Footer/Footer.stories.jsx +0 -28
  294. package/src/stories/Layouts/Header/Header.css +0 -16
  295. package/src/stories/Layouts/Header/Header.jsx +0 -31
  296. package/src/stories/Layouts/Header/Header.stories.jsx +0 -28
  297. package/src/stories/Layouts/HeroBanner/HeroBanner.css +0 -16
  298. package/src/stories/Layouts/HeroBanner/HeroBanner.jsx +0 -31
  299. package/src/stories/Layouts/HeroBanner/HeroBanner.stories.jsx +0 -28
  300. package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.css +0 -16
  301. package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.jsx +0 -31
  302. package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.stories.jsx +0 -28
  303. package/src/stories/Layouts/Pagination/Pagination.css +0 -16
  304. package/src/stories/Layouts/Pagination/Pagination.jsx +0 -31
  305. package/src/stories/Layouts/Pagination/Pagination.stories.jsx +0 -28
  306. package/src/stories/Layouts/Sidebar/Sidebar.css +0 -16
  307. package/src/stories/Layouts/Sidebar/Sidebar.jsx +0 -71
  308. package/src/stories/Layouts/Sidebar/Sidebar.stories.jsx +0 -28
  309. package/src/stories/Layouts/Tabs/Tabs.css +0 -16
  310. package/src/stories/Layouts/Tabs/Tabs.jsx +0 -31
  311. package/src/stories/Layouts/Tabs/Tabs.stories.jsx +0 -28
  312. package/src/stories/Layouts/index.js +0 -25
  313. package/src/stories/Layouts/meta_Layouts.js +0 -28
  314. package/src/stories/MDX.mdx +0 -118
  315. package/src/stories/Miscellaneous/Miscellaneous.js +0 -24
  316. package/src/stories/Molecules/Accordion/Accordion.css +0 -4
  317. package/src/stories/Molecules/Accordion/Accordion.jsx +0 -25
  318. package/src/stories/Molecules/Accordion/Accordion.stories.jsx +0 -20
  319. package/src/stories/Molecules/AudioPlayer/AudioPlayer.css +0 -97
  320. package/src/stories/Molecules/AudioPlayer/AudioPlayer.jsx +0 -244
  321. package/src/stories/Molecules/AudioPlayer/AudioPlayer.stories.jsx +0 -55
  322. package/src/stories/Molecules/AvatarWithName/AvatarWithName.css +0 -130
  323. package/src/stories/Molecules/AvatarWithName/AvatarWithName.jsx +0 -80
  324. package/src/stories/Molecules/AvatarWithName/AvatarWithName.stories.jsx +0 -20
  325. package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.css +0 -147
  326. package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.jsx +0 -51
  327. package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.stories.jsx +0 -36
  328. package/src/stories/Molecules/ButtonGroup/ButtonGroup.css +0 -465
  329. package/src/stories/Molecules/ButtonGroup/ButtonGroup.jsx +0 -47
  330. package/src/stories/Molecules/ButtonGroup/ButtonGroup.stories.jsx +0 -44
  331. package/src/stories/Molecules/Card/Card.css +0 -41
  332. package/src/stories/Molecules/Card/Card.jsx +0 -92
  333. package/src/stories/Molecules/Card/Card.stories.jsx +0 -34
  334. package/src/stories/Molecules/ComparisonTable/ComparisonTable.css +0 -35
  335. package/src/stories/Molecules/ComparisonTable/ComparisonTable.jsx +0 -104
  336. package/src/stories/Molecules/ComparisonTable/ComparisonTable.stories.jsx +0 -81
  337. package/src/stories/Molecules/DataTable/DataTable.css +0 -4
  338. package/src/stories/Molecules/DataTable/DataTable.jsx +0 -25
  339. package/src/stories/Molecules/DataTable/DataTable.stories.jsx +0 -20
  340. package/src/stories/Molecules/Dropdown/Dropdown.css +0 -192
  341. package/src/stories/Molecules/Dropdown/Dropdown.jsx +0 -96
  342. package/src/stories/Molecules/Dropdown/Dropdown.stories.jsx +0 -45
  343. package/src/stories/Molecules/FileUpload/FileUpload.css +0 -4
  344. package/src/stories/Molecules/FileUpload/FileUpload.jsx +0 -25
  345. package/src/stories/Molecules/FileUpload/FileUpload.stories.jsx +0 -20
  346. package/src/stories/Molecules/FormField/FormField.css +0 -4
  347. package/src/stories/Molecules/FormField/FormField.jsx +0 -25
  348. package/src/stories/Molecules/FormField/FormField.stories.jsx +0 -20
  349. package/src/stories/Molecules/Header/Header.css +0 -35
  350. package/src/stories/Molecules/Header/Header.jsx +0 -76
  351. package/src/stories/Molecules/Header/Header.stories.jsx +0 -28
  352. package/src/stories/Molecules/IconButton/IconButton.css +0 -4
  353. package/src/stories/Molecules/IconButton/IconButton.jsx +0 -25
  354. package/src/stories/Molecules/IconButton/IconButton.stories.jsx +0 -20
  355. package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.css +0 -4
  356. package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.jsx +0 -25
  357. package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.stories.jsx +0 -20
  358. package/src/stories/Molecules/InputGroup/InputGroup.css +0 -4
  359. package/src/stories/Molecules/InputGroup/InputGroup.jsx +0 -25
  360. package/src/stories/Molecules/InputGroup/InputGroup.stories.jsx +0 -20
  361. package/src/stories/Molecules/InputWithLabel/InputWithLabel.css +0 -4
  362. package/src/stories/Molecules/InputWithLabel/InputWithLabel.jsx +0 -25
  363. package/src/stories/Molecules/InputWithLabel/InputWithLabel.stories.jsx +0 -20
  364. package/src/stories/Molecules/List/List.css +0 -4
  365. package/src/stories/Molecules/List/List.jsx +0 -25
  366. package/src/stories/Molecules/List/List.stories.jsx +0 -20
  367. package/src/stories/Molecules/MediaCard/MediaCard.css +0 -4
  368. package/src/stories/Molecules/MediaCard/MediaCard.jsx +0 -25
  369. package/src/stories/Molecules/MediaCard/MediaCard.stories.jsx +0 -20
  370. package/src/stories/Molecules/Modal/Modal.css +0 -4
  371. package/src/stories/Molecules/Modal/Modal.jsx +0 -25
  372. package/src/stories/Molecules/Modal/Modal.stories.jsx +0 -20
  373. package/src/stories/Molecules/Navbar/Navbar.css +0 -91
  374. package/src/stories/Molecules/Navbar/Navbar.jsx +0 -82
  375. package/src/stories/Molecules/Navbar/Navbar.stories.jsx +0 -70
  376. package/src/stories/Molecules/Notification/Notification.css +0 -4
  377. package/src/stories/Molecules/Notification/Notification.jsx +0 -25
  378. package/src/stories/Molecules/Notification/Notification.stories.jsx +0 -20
  379. package/src/stories/Molecules/PricingTable/PricingTable.css +0 -4
  380. package/src/stories/Molecules/PricingTable/PricingTable.jsx +0 -25
  381. package/src/stories/Molecules/PricingTable/PricingTable.stories.jsx +0 -20
  382. package/src/stories/Molecules/SearchBar/SearchBar.css +0 -69
  383. package/src/stories/Molecules/SearchBar/SearchBar.jsx +0 -73
  384. package/src/stories/Molecules/SearchBar/SearchBar.stories.jsx +0 -29
  385. package/src/stories/Molecules/SelectTheme/SelectTheme.css +0 -25
  386. package/src/stories/Molecules/SelectTheme/SelectTheme.jsx +0 -22
  387. package/src/stories/Molecules/SelectTheme/SelectTheme.stories.jsx +0 -24
  388. package/src/stories/Molecules/Sidebar/Sidebar.css +0 -67
  389. package/src/stories/Molecules/Sidebar/Sidebar.jsx +0 -80
  390. package/src/stories/Molecules/Sidebar/Sidebar.stories.jsx +0 -35
  391. package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.css +0 -4
  392. package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.jsx +0 -25
  393. package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.stories.jsx +0 -20
  394. package/src/stories/Molecules/index.js +0 -58
  395. package/src/stories/Molecules/meta_Molecules.js +0 -47
  396. package/src/stories/Organisms/Profile/UserFriends/UserFriends.context.jsx +0 -15
  397. package/src/stories/Organisms/Profile/UserFriends/UserFriends.css +0 -4
  398. package/src/stories/Organisms/Profile/UserFriends/UserFriends.jsx +0 -13
  399. package/src/stories/Organisms/Profile/UserFriends/UserFriends.stories.jsx +0 -26
  400. package/src/stories/Organisms/Profile/UserPosts/UserPosts.context.jsx +0 -15
  401. package/src/stories/Organisms/Profile/UserPosts/UserPosts.css +0 -4
  402. package/src/stories/Organisms/Profile/UserPosts/UserPosts.jsx +0 -13
  403. package/src/stories/Organisms/Profile/UserPosts/UserPosts.stories.jsx +0 -26
  404. package/src/stories/Organisms/Profile/UserProfile/UserProfile.context.jsx +0 -15
  405. package/src/stories/Organisms/Profile/UserProfile/UserProfile.css +0 -4
  406. package/src/stories/Organisms/Profile/UserProfile/UserProfile.jsx +0 -13
  407. package/src/stories/Organisms/Profile/UserProfile/UserProfile.stories.jsx +0 -26
  408. package/src/stories/Organisms/meta_Organisms.js +0 -39
  409. package/src/stories/Pages/Page/Page.css +0 -69
  410. package/src/stories/Pages/Page/Page.jsx +0 -69
  411. package/src/stories/Pages/Page/Page.stories.js +0 -26
  412. package/src/stories/Pages/Page/Pages.js +0 -31
  413. package/src/stories/Templates/AdminDashboard/AdminDashboard.css +0 -7
  414. package/src/stories/Templates/AdminDashboard/AdminDashboard.jsx +0 -24
  415. package/src/stories/Templates/AdminDashboard/AdminDashboard.stories.jsx +0 -20
  416. package/src/stories/Templates/CallToAction/CallToAction.css +0 -7
  417. package/src/stories/Templates/CallToAction/CallToAction.jsx +0 -24
  418. package/src/stories/Templates/CallToAction/CallToAction.stories.jsx +0 -20
  419. package/src/stories/Templates/FeaturesList/FeaturesList.css +0 -7
  420. package/src/stories/Templates/FeaturesList/FeaturesList.jsx +0 -24
  421. package/src/stories/Templates/FeaturesList/FeaturesList.stories.jsx +0 -20
  422. package/src/stories/Templates/FormSection/FormSection.css +0 -7
  423. package/src/stories/Templates/FormSection/FormSection.jsx +0 -24
  424. package/src/stories/Templates/FormSection/FormSection.stories.jsx +0 -20
  425. package/src/stories/Templates/HeroSection/HeroSection.css +0 -7
  426. package/src/stories/Templates/HeroSection/HeroSection.jsx +0 -24
  427. package/src/stories/Templates/HeroSection/HeroSection.stories.jsx +0 -20
  428. package/src/stories/Templates/LocationInfo/LocationInfo.css +0 -7
  429. package/src/stories/Templates/LocationInfo/LocationInfo.jsx +0 -24
  430. package/src/stories/Templates/LocationInfo/LocationInfo.stories.jsx +0 -20
  431. package/src/stories/Templates/ProductPage/ProductPage.css +0 -7
  432. package/src/stories/Templates/ProductPage/ProductPage.jsx +0 -24
  433. package/src/stories/Templates/ProductPage/ProductPage.stories.jsx +0 -20
  434. package/src/stories/Templates/RegistrationPage/RegistrationPage.css +0 -7
  435. package/src/stories/Templates/RegistrationPage/RegistrationPage.jsx +0 -24
  436. package/src/stories/Templates/RegistrationPage/RegistrationPage.stories.jsx +0 -20
  437. package/src/stories/Templates/ShoppingCart/ShoppingCart.css +0 -7
  438. package/src/stories/Templates/ShoppingCart/ShoppingCart.jsx +0 -24
  439. package/src/stories/Templates/ShoppingCart/ShoppingCart.stories.jsx +0 -20
  440. package/src/stories/Templates/SidebarTopNav/SidebarTopNav.css +0 -7
  441. package/src/stories/Templates/SidebarTopNav/SidebarTopNav.jsx +0 -24
  442. package/src/stories/Templates/SidebarTopNav/SidebarTopNav.stories.jsx +0 -20
  443. package/src/stories/Templates/SignInPage/SignInPage.css +0 -7
  444. package/src/stories/Templates/SignInPage/SignInPage.jsx +0 -24
  445. package/src/stories/Templates/SignInPage/SignInPage.stories.jsx +0 -20
  446. package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.css +0 -7
  447. package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.jsx +0 -24
  448. package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.stories.jsx +0 -20
  449. package/src/stories/Templates/Testimonials/Testimonials.css +0 -7
  450. package/src/stories/Templates/Testimonials/Testimonials.jsx +0 -24
  451. package/src/stories/Templates/Testimonials/Testimonials.stories.jsx +0 -20
  452. package/src/stories/Templates/index.js +0 -33
  453. package/src/stories/Templates/meta_Templates.js +0 -29
  454. package/src/stories/assets/accessibility.png +0 -0
  455. package/src/stories/assets/accessibility.svg +0 -1
  456. package/src/stories/assets/addon-library.png +0 -0
  457. package/src/stories/assets/assets.png +0 -0
  458. package/src/stories/assets/avif-test-image.avif +0 -0
  459. package/src/stories/assets/context.png +0 -0
  460. package/src/stories/assets/discord.svg +0 -1
  461. package/src/stories/assets/docs.png +0 -0
  462. package/src/stories/assets/figma-plugin.png +0 -0
  463. package/src/stories/assets/github.svg +0 -1
  464. package/src/stories/assets/logo.png +0 -0
  465. package/src/stories/assets/logo.svg +0 -106
  466. package/src/stories/assets/share.png +0 -0
  467. package/src/stories/assets/styling.png +0 -0
  468. package/src/stories/assets/test.svg +0 -3
  469. package/src/stories/assets/testing.png +0 -0
  470. package/src/stories/assets/theming.png +0 -0
  471. package/src/stories/assets/tutorials.svg +0 -1
  472. package/src/stories/assets/youtube.svg +0 -1
  473. package/src/themes/README_Styles.md +0 -301
  474. package/src/themes/ThemeProvider.jsx +0 -61
  475. package/src/themes/styles/github/dark.css +0 -0
  476. package/src/themes/styles/github/light.css +0 -0
  477. package/src/themes/styles/neurons/dark.css +0 -247
  478. package/src/themes/styles/neurons/light.css +0 -170
  479. /package/{src/themes/styles/dracula/dark.css → .storybook/preview-head.html} +0 -0
  480. /package/src/{themes/styles/dracula/light.css → components/this.me/MeCard.jsx} +0 -0
@@ -0,0 +1,88 @@
1
+ // src/gui/atoms/ListItem/ListItem.resolver.tsx
2
+ import * as React from 'react';
3
+ import ListItem from './ListItem';
4
+ import type { RegistryEntry, ResolveCtx } from '@/registry/types';
5
+ import type { SxProps, Theme } from '@mui/material/styles';
6
+ import { ensureNodeId } from '@/gui/utils/nodeID';
7
+
8
+ /**
9
+ * Declarative resolver for ListItem
10
+ *
11
+ * Fidelity
12
+ * - Forwards all MUI ListItem props faithfully (alignItems, dense, divider, selected, etc.).
13
+ * - Supports polymorphism via `component` prop (and alias `as`).
14
+ * - Provides **granular styling** via `sx`.
15
+ *
16
+ * Notes
17
+ * - In declarative (JSON/registry) mode, just pass props as object.
18
+ * - If children are provided, they render directly.
19
+ * - We emit a stable editor id under `data-gui-id` (not `id`) to avoid clashing with user-provided DOM ids.
20
+ */
21
+ export type ListItemSpec = {
22
+ type: 'ListItem';
23
+ props?: {
24
+ children?: React.ReactNode;
25
+
26
+ // Polymorphism
27
+ component?: any;
28
+ as?: any;
29
+
30
+ // MUI props (subset; others passthrough in `...rest`)
31
+ dense?: boolean;
32
+ divider?: boolean;
33
+ disableGutters?: boolean;
34
+ selected?: boolean;
35
+ alignItems?: 'flex-start' | 'center';
36
+ secondaryAction?: React.ReactNode;
37
+
38
+ // Styling
39
+ sx?: SxProps<Theme>;
40
+ className?: string;
41
+
42
+ // Identity & testing
43
+ id?: string;
44
+ 'data-testid'?: string;
45
+ 'data-gui-id'?: string;
46
+
47
+ // Arbitrary passthrough
48
+ [key: string]: any;
49
+ };
50
+ };
51
+
52
+ const ListItemResolver: RegistryEntry = {
53
+ type: 'ListItem',
54
+ resolve(spec: ListItemSpec, _ctx?: ResolveCtx) {
55
+ const p = spec.props ?? {};
56
+
57
+ // Polymorphic target (avoid passing undefined)
58
+ const component = p.component ?? p.as;
59
+ const rootPolymorphic = component ? { component } : {};
60
+
61
+ // Stable editor id that doesn't clash with user DOM ids
62
+ const guiId = ensureNodeId('list-item', p['data-gui-id']);
63
+
64
+ // Collect props, strip resolver-only keys
65
+ const {
66
+ children,
67
+ as: _as,
68
+ 'data-gui-id': _guiIdIn,
69
+ ...rest
70
+ } = p;
71
+
72
+ return (
73
+ <ListItem
74
+ {...rootPolymorphic}
75
+ sx={p.sx}
76
+ className={p.className}
77
+ id={p.id}
78
+ data-testid={p['data-testid']}
79
+ data-gui-id={guiId}
80
+ {...rest}
81
+ >
82
+ {children}
83
+ </ListItem>
84
+ );
85
+ },
86
+ };
87
+
88
+ export default ListItemResolver;
@@ -0,0 +1,157 @@
1
+ import * as React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import ListItem from './ListItem';
4
+ import List from '@mui/material/List';
5
+ import ListItemIcon from '../ListItemIcon/ListItemIcon';
6
+ import ListItemText from '../ListItemText/ListItemText';
7
+ import Icon from '@/themes/icons/Icon';
8
+ import { MemoryRouter } from 'react-router-dom';
9
+ import GuiProvider from '@/context/GuiProvider';
10
+ const meta: Meta<typeof ListItem> = {
11
+ title: 'Atoms/ListItem',
12
+ component: ListItem,
13
+ tags: ['autodocs'],
14
+ decorators: [
15
+ (Story) => (
16
+ <MemoryRouter>
17
+ <GuiProvider>
18
+ <div style={{ padding: 16, minHeight: 260, maxWidth: 560 }}>
19
+ <Story />
20
+ </div>
21
+ </GuiProvider>
22
+ </MemoryRouter>
23
+ ),
24
+ ],
25
+ parameters: {
26
+ docs: {
27
+ description: {
28
+ component: `
29
+ The **ListItem** atom is a thin wrapper around MUI's \`MuiListItem\`, staying faithful to its API and polymorphism.
30
+ In **declarative** mode (resolver), it simply forwards MUI props and allows granular styling via \`sx\`.
31
+
32
+ ---
33
+
34
+ ## React usage
35
+ ~~~jsx
36
+ <List dense>
37
+ <ListItem divider>
38
+ <ListItemIcon>
39
+ <Icon name="lucide:inbox" />
40
+ </ListItemIcon>
41
+ <ListItemText primary="Inbox" secondary="Messages" />
42
+ </ListItem>
43
+ </List>
44
+ ~~~
45
+
46
+ ## Declarative JSON / Resolver
47
+ ~~~json
48
+ {
49
+ "type": "ListItem",
50
+ "props": {
51
+ "dense": true,
52
+ "divider": true,
53
+ "selected": true,
54
+ "sx": { "py": 1 }
55
+ }
56
+ }
57
+ ~~~
58
+ `,
59
+ },
60
+ },
61
+ controls: {
62
+ exclude: ['component', 'children'],
63
+ },
64
+ },
65
+ argTypes: {
66
+ dense: { control: 'boolean' },
67
+ divider: { control: 'boolean' },
68
+ disableGutters: { control: 'boolean' },
69
+ alignItems: { control: { type: 'radio' }, options: ['center', 'flex-start'] },
70
+ sx: { control: 'object' },
71
+ },
72
+ args: {
73
+ dense: false,
74
+ divider: false,
75
+ disableGutters: false,
76
+ alignItems: 'center',
77
+ sx: {},
78
+ children: undefined,
79
+ },
80
+ };
81
+
82
+ export default meta;
83
+ type Story = StoryObj<typeof ListItem>;
84
+
85
+ const DemoList: React.FC<{ children?: React.ReactNode }> = ({ children }) => (
86
+ <List dense sx={{ bgcolor: 'background.paper', borderRadius: 1, overflow: 'hidden', border: '1px solid', borderColor: 'divider' }}>
87
+ {children}
88
+ </List>
89
+ );
90
+
91
+ // ======================= Stories =======================
92
+ export const Playground: Story = {
93
+ render: (args) => (
94
+ <DemoList>
95
+ <ListItem {...args}>
96
+ <ListItemIcon>
97
+ <Icon name="lucide:inbox" />
98
+ </ListItemIcon>
99
+ <ListItemText primary="Inbox" secondary="Messages" />
100
+ </ListItem>
101
+ </DemoList>
102
+ ),
103
+ };
104
+
105
+ export const Variants: Story = {
106
+ render: () => (
107
+ <DemoList>
108
+ <ListItem>
109
+ <ListItemIcon>
110
+ <Icon name="lucide:mail" />
111
+ </ListItemIcon>
112
+ <ListItemText primary="Default" secondary="No props" />
113
+ </ListItem>
114
+ <ListItem dense>
115
+ <ListItemIcon>
116
+ <Icon name="lucide:mail" />
117
+ </ListItemIcon>
118
+ <ListItemText primary="Dense" />
119
+ </ListItem>
120
+ <ListItem divider>
121
+ <ListItemIcon>
122
+ <Icon name="lucide:mail" />
123
+ </ListItemIcon>
124
+ <ListItemText primary="With divider" />
125
+ </ListItem>
126
+ <ListItem>
127
+ <ListItemIcon>
128
+ <Icon name="lucide:mail" />
129
+ </ListItemIcon>
130
+ <ListItemText primary="Default (no selected on ListItem)" />
131
+ </ListItem>
132
+ <ListItem alignItems="flex-start">
133
+ <ListItemIcon>
134
+ <Icon name="lucide:mail" />
135
+ </ListItemIcon>
136
+ <ListItemText primary="Align start" secondary="Secondary text that wraps onto multiple lines for demo." />
137
+ </ListItem>
138
+ </DemoList>
139
+ ),
140
+ };
141
+
142
+ export const WithSx: Story = {
143
+ render: () => (
144
+ <DemoList>
145
+ <ListItem sx={{ py: 1.25, '&:hover': { bgcolor: 'action.hover' } }}>
146
+ <ListItemIcon sx={{ minWidth: 40 }}>
147
+ <Icon name="lucide:user" />
148
+ </ListItemIcon>
149
+ <ListItemText
150
+ primary="Profile"
151
+ secondary="Account"
152
+ secondaryTypographyProps={{ color: 'text.secondary' }}
153
+ />
154
+ </ListItem>
155
+ </DemoList>
156
+ ),
157
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * This.GUI — ListItem
3
+ * Thin wrapper around MUI’s ListItem that preserves MUI’s props and typing.
4
+ *
5
+ * Fidelity
6
+ * - We directly re-export MUI’s component so all behavior and typing remain intact.
7
+ * - Granular styling is supported via the standard `sx` prop (MUI System).
8
+ *
9
+ * Why wrap it?
10
+ * - Consistency with This.GUI’s atom pattern (each atom in its own module).
11
+ * - Enables a clean spot for a resolver (declarative mode) without changing React usage.
12
+ */
13
+ import * as React from 'react';
14
+ import MuiListItem from '@mui/material/ListItem';
15
+ const ListItem = MuiListItem;
16
+ export type ListItemProps = React.ComponentProps<typeof ListItem>;
17
+ // Useful name in React DevTools
18
+ (ListItem as any).displayName = 'Gui.ListItem';
19
+ export default ListItem;
@@ -0,0 +1,208 @@
1
+ // src/gui/atoms/ListItemButton/ListItemButton.resolver.tsx
2
+ import * as React from 'react';
3
+ import ListItemButton from './ListItemButton';
4
+ import Link from '../Link/Link';
5
+ import Icon from '@/themes/icons/Icon';
6
+ // Use our own thin wrappers for consistency & display names
7
+ import ListItemIcon from '../ListItemIcon/ListItemIcon';
8
+ import ListItemText from '../ListItemText/ListItemText';
9
+ import type { RegistryEntry, ResolveCtx } from '@/registry/types';
10
+ import type { SxProps, Theme } from '@mui/material/styles';
11
+ import Box from '../Box/Box';
12
+ import { ensureNodeId } from '@/gui/utils/nodeID';
13
+
14
+ /**
15
+ * Declarative spec for ListItemButton
16
+ *
17
+ * Goals
18
+ * - Be faithful to MUI's API: forward native props like `selected`, `disabled`, `dense`, `alignItems`, etc.
19
+ * - Preserve polymorphism via MUI's `component` prop (and alias `as`).
20
+ * - Add **declarative sugar** (optional):
21
+ * - `startIcon` / `endIcon`: string token (e.g., "lucide:mail", "mui:settings") or ReactNode
22
+ * - `label` / `secondary`: mapped to `<ListItemText primary/secondary />`
23
+ * - Add **granular styling** for slots:
24
+ * - `sx` → root ListItemButton
25
+ * - `iconSx` → ListItemIcon (leading)
26
+ * - `textSx` → ListItemText
27
+ * - `endIconSx` → trailing icon container
28
+ *
29
+ * Notes
30
+ * - If `children` are provided, they take precedence and render as-is (no sugar applied).
31
+ * - Tokens are normalized (lowercased & trimmed) to avoid missing icons due to casing.
32
+ * - Routing:
33
+ * - If `to` is provided (and no explicit `component`), the resolver will default to This.GUI `Link`.
34
+ * - If `external` is true (and no explicit `component`), it will default to an anchor `'a'` and add safe `target`/`rel`.
35
+ */
36
+ export type ListItemButtonSpec = {
37
+ type: 'ListItemButton';
38
+ props?: {
39
+ children?: React.ReactNode;
40
+
41
+ // Polymorphism / routing
42
+ component?: any; // 'div' | 'a' | Link | custom
43
+ as?: any; // alias for component
44
+ to?: string; // router target (when component={Link})
45
+ href?: string; // anchor target (when component='a')
46
+ external?: boolean; // force external anchor
47
+ target?: React.HTMLAttributeAnchorTarget;
48
+ rel?: string;
49
+
50
+ // Sugar (optional)
51
+ startIcon?: React.ReactNode | string;
52
+ endIcon?: React.ReactNode | string;
53
+ iconColor?: string; // applies to startIcon/endIcon when tokens
54
+ endIconColor?: string; // override for trailing icon
55
+ size?: number; // icon size (default 20)
56
+ label?: React.ReactNode | string;
57
+ secondary?: React.ReactNode | string;
58
+
59
+ // MUI props (subset; others passthrough)
60
+ selected?: boolean;
61
+ disabled?: boolean;
62
+ dense?: boolean;
63
+ alignItems?: 'flex-start' | 'center';
64
+ divider?: boolean;
65
+
66
+ // Granular styling
67
+ sx?: SxProps<Theme>; // root
68
+ iconSx?: SxProps<Theme>; // leading ListItemIcon
69
+ textSx?: SxProps<Theme>; // ListItemText
70
+ endIconSx?: SxProps<Theme>; // trailing icon container
71
+
72
+ // Slot props passthrough (their own sx can be merged)
73
+ ListItemIconProps?: { sx?: SxProps<Theme>; [k: string]: any };
74
+ ListItemTextProps?: { sx?: SxProps<Theme>; [k: string]: any };
75
+
76
+ // Editor / telemetry
77
+ 'data-gui-id'?: string;
78
+
79
+ // Misc DOM
80
+ id?: string;
81
+ className?: string;
82
+ 'data-testid'?: string;
83
+
84
+ // Arbitrary passthrough
85
+ [key: string]: any;
86
+ };
87
+ };
88
+
89
+ const normalizeToken = (s: string) => s.trim().toLowerCase();
90
+
91
+ function renderIcon(node: React.ReactNode | string | undefined, color?: string, size = 20) {
92
+ if (!node) return null;
93
+ return typeof node === 'string'
94
+ ? <Icon name={normalizeToken(node)} iconColor={color} size={size} />
95
+ : node;
96
+ }
97
+
98
+ const ListItemButtonResolver: RegistryEntry = {
99
+ type: 'ListItemButton',
100
+ resolve(spec: ListItemButtonSpec, _ctx?: ResolveCtx) {
101
+ const p = spec.props ?? {};
102
+
103
+ // Generate/ensure a stable gui id (does not override an explicit one)
104
+ const dataGuiId = ensureNodeId('list-item-button', (p as any)['data-gui-id']);
105
+
106
+ // Decide polymorphic target (only pass when defined)
107
+ const decidedComponent = p.component ?? p.as ?? (p.to ? Link : p.external ? 'a' : undefined);
108
+ const componentProp = decidedComponent ? { component: decidedComponent } : undefined;
109
+
110
+ // Routing/anchor props
111
+ const routingProps =
112
+ decidedComponent === 'a' || p.external
113
+ ? {
114
+ href: p.href,
115
+ target: p.target ?? (p.external ? '_blank' : undefined),
116
+ rel: p.rel ?? (p.external ? 'noopener noreferrer' : undefined),
117
+ }
118
+ : decidedComponent === Link || (p.to && !p.component)
119
+ ? { to: p.to }
120
+ : {};
121
+
122
+ // Destructure and clean resolver-only fields
123
+ const {
124
+ children,
125
+ startIcon,
126
+ endIcon,
127
+ iconColor,
128
+ endIconColor,
129
+ size = 20,
130
+ ListItemIconProps,
131
+ ListItemTextProps,
132
+ iconSx,
133
+ textSx,
134
+ endIconSx,
135
+
136
+ // strip resolver-only aliasing keys so they don't leak to DOM
137
+ as: _as,
138
+ external: _external,
139
+ to: _to,
140
+ href: _href,
141
+ target: _target,
142
+ rel: _rel,
143
+
144
+ // keep rest: native MUI props (selected, dense, disabled, divider, alignItems, sx, etc.)
145
+ ...rest
146
+ } = p as any;
147
+
148
+ // If explicit children, render as-is (no sugar)
149
+ if (children != null) {
150
+ return (
151
+ <ListItemButton
152
+ {...componentProp}
153
+ sx={p.sx}
154
+ id={p.id}
155
+ className={p.className}
156
+ data-testid={p['data-testid']}
157
+ data-gui-id={dataGuiId}
158
+ {...routingProps}
159
+ {...rest}
160
+ >
161
+ {children}
162
+ </ListItemButton>
163
+ );
164
+ }
165
+
166
+ // Build sugar content
167
+ const leadingIcon = renderIcon(startIcon, iconColor, size);
168
+ const trailingIcon = renderIcon(endIcon, endIconColor ?? iconColor, size);
169
+ const hasText = p.label != null || p.secondary != null;
170
+
171
+ // Merge sx for slot props safely (array merge preserves both)
172
+ const mergedIconSx =
173
+ iconSx != null && ListItemIconProps?.sx != null ? [iconSx, ListItemIconProps.sx] : iconSx ?? ListItemIconProps?.sx;
174
+ const mergedTextSx =
175
+ textSx != null && ListItemTextProps?.sx != null ? [textSx, ListItemTextProps.sx] : textSx ?? ListItemTextProps?.sx;
176
+
177
+ const finalIconProps = leadingIcon
178
+ ? (ListItemIconProps ? { ...ListItemIconProps, sx: mergedIconSx } : (mergedIconSx != null ? { sx: mergedIconSx } : undefined))
179
+ : undefined;
180
+
181
+ const finalTextProps = hasText
182
+ ? (ListItemTextProps ? { ...ListItemTextProps, sx: mergedTextSx } : (mergedTextSx != null ? { sx: mergedTextSx } : undefined))
183
+ : undefined;
184
+
185
+ return (
186
+ <ListItemButton
187
+ {...componentProp}
188
+ sx={p.sx}
189
+ id={p.id}
190
+ className={p.className}
191
+ data-testid={p['data-testid']}
192
+ data-gui-id={dataGuiId}
193
+ {...routingProps}
194
+ {...rest}
195
+ >
196
+ {leadingIcon ? <ListItemIcon {...finalIconProps}>{leadingIcon}</ListItemIcon> : null}
197
+ {hasText ? <ListItemText primary={p.label} secondary={p.secondary} {...finalTextProps} /> : null}
198
+ {trailingIcon ? (
199
+ <Box sx={[{ marginLeft: 'auto', display: 'inline-flex', alignItems: 'center' }, endIconSx as any]}>
200
+ {trailingIcon}
201
+ </Box>
202
+ ) : null}
203
+ </ListItemButton>
204
+ );
205
+ },
206
+ };
207
+
208
+ export default ListItemButtonResolver;
@@ -0,0 +1,161 @@
1
+ import * as React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import ListItemButton from './ListItemButton';
4
+ import ListItemIcon from '../ListItemIcon/ListItemIcon';
5
+ import ListItemText from '../ListItemText/ListItemText';
6
+ import Icon from '@/themes/icons/Icon';
7
+ import List from '@mui/material/List';
8
+ import ListItem from '@mui/material/ListItem';
9
+ import { MemoryRouter } from 'react-router-dom';
10
+ import GuiProvider from '@/context/GuiProvider';
11
+
12
+ const meta: Meta<typeof ListItemButton> = {
13
+ title: 'Atoms/ListItemButton',
14
+ component: ListItemButton,
15
+ tags: ['autodocs'],
16
+ decorators: [
17
+ (Story) => (
18
+ <MemoryRouter>
19
+ <GuiProvider>
20
+ <div style={{ padding: 16, minHeight: 260, maxWidth: 560 }}>
21
+ <Story />
22
+ </div>
23
+ </GuiProvider>
24
+ </MemoryRouter>
25
+ ),
26
+ ],
27
+ parameters: {
28
+ docs: {
29
+ description: {
30
+ component: `
31
+ The **ListItemButton** atom is a thin wrapper around MUI's \`MuiListItemButton\`, staying faithful to its API and polymorphism.
32
+
33
+ In **declarative** mode, the resolver adds sugar:
34
+ - \`startIcon\` / \`endIcon\`: token (e.g., \`"lucide:mail"\`, \`"mui:settings"\`) or ReactNode — rendered via the icon registry
35
+ - \`label\` / \`secondary\` → mapped to \`<ListItemText primary/secondary />\`
36
+ - Granular styling:
37
+ - \`sx\` (root), \`iconSx\` (leading \`ListItemIcon\`), \`textSx\` (text), \`endIconSx\` (trailing icon container)
38
+
39
+ ---
40
+ ## React usage
41
+ ~~~jsx
42
+ <List>
43
+ <ListItem disablePadding>
44
+ <ListItemButton selected>
45
+ <ListItemIcon>
46
+ <Icon name="lucide:mail" />
47
+ </ListItemIcon>
48
+ <ListItemText primary="Inbox" secondary="Messages" />
49
+ </ListItemButton>
50
+ </ListItem>
51
+ </List>
52
+ ~~~
53
+
54
+ ## Declarative JSON / Resolver
55
+ ~~~json
56
+ {
57
+ "type": "ListItemButton",
58
+ "props": {
59
+ "startIcon": "lucide:mail",
60
+ "label": "Inbox",
61
+ "secondary": "Messages",
62
+ "sx": { "py": 1 },
63
+ "iconSx": { "minWidth": 36 },
64
+ "textSx": { "my": 0 }
65
+ }
66
+ }
67
+ ~~~
68
+ `,
69
+ },
70
+ },
71
+ controls: {
72
+ exclude: ['component', 'children'],
73
+ },
74
+ },
75
+ argTypes: {
76
+ selected: { control: 'boolean' },
77
+ disabled: { control: 'boolean' },
78
+ dense: { control: 'boolean' },
79
+ divider: { control: 'boolean' },
80
+ alignItems: { control: { type: 'radio' }, options: ['center', 'flex-start'] },
81
+ sx: { control: 'object' },
82
+ },
83
+ args: {
84
+ selected: false,
85
+ disabled: false,
86
+ dense: false,
87
+ divider: false,
88
+ alignItems: 'center',
89
+ sx: {},
90
+ children: undefined,
91
+ },
92
+ };
93
+
94
+ export default meta;
95
+ type Story = StoryObj<typeof ListItemButton>;
96
+
97
+ const DemoList: React.FC<{ children?: React.ReactNode }> = ({ children }) => (
98
+ <List dense sx={{ bgcolor: 'background.paper', borderRadius: 1, overflow: 'hidden', border: '1px solid', borderColor: 'divider' }}>
99
+ <ListItem disablePadding>{children}</ListItem>
100
+ </List>
101
+ );
102
+
103
+ // ======================= Stories =======================
104
+ export const Playground: Story = {
105
+ render: (args) => (
106
+ <DemoList>
107
+ <ListItemButton {...args}>
108
+ <ListItemIcon>
109
+ <Icon name="lucide:mail" />
110
+ </ListItemIcon>
111
+ <ListItemText primary="Inbox" secondary="Messages" />
112
+ </ListItemButton>
113
+ </DemoList>
114
+ ),
115
+ };
116
+
117
+ export const WithTrailingIcon: Story = {
118
+ render: () => (
119
+ <DemoList>
120
+ <ListItemButton>
121
+ <ListItemIcon>
122
+ <Icon name="mui:settings" />
123
+ </ListItemIcon>
124
+ <ListItemText primary="Settings" secondary="Preferences" />
125
+ <span style={{ marginLeft: 'auto', display: 'inline-flex' }}>
126
+ <Icon name="lucide:chevron-right" />
127
+ </span>
128
+ </ListItemButton>
129
+ </DemoList>
130
+ ),
131
+ };
132
+
133
+ export const AsAnchorLink: Story = {
134
+ render: () => (
135
+ <DemoList>
136
+ <ListItemButton component="a" href="https://neurons.me">
137
+ <ListItemIcon>
138
+ <Icon name="lucide:link" />
139
+ </ListItemIcon>
140
+ <ListItemText primary="neurons.me" secondary="External link" />
141
+ </ListItemButton>
142
+ </DemoList>
143
+ ),
144
+ };
145
+
146
+ export const WithSx: Story = {
147
+ render: () => (
148
+ <DemoList>
149
+ <ListItemButton sx={{ py: 1.25 }}>
150
+ <ListItemIcon sx={{ minWidth: 40 }}>
151
+ <Icon name="lucide:user" />
152
+ </ListItemIcon>
153
+ <ListItemText
154
+ primary="Profile"
155
+ secondary="Account"
156
+ secondaryTypographyProps={{ color: 'text.secondary' }}
157
+ />
158
+ </ListItemButton>
159
+ </DemoList>
160
+ ),
161
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * This component is a thin wrapper around MUI’s ListItemButton.
3
+ * It preserves MUI’s props and typing, staying faithful to MUI.
4
+ *
5
+ * Why wrap it?
6
+ * - Consistency with This.GUI’s atom pattern (each atom has its own file).
7
+ * - Supports declarative/resolver usage while keeping all MUI props intact.
8
+ * - Allows granular style control via `sx`.
9
+ */
10
+ import * as React from 'react';
11
+ import MuiListItemButton from '@mui/material/ListItemButton';
12
+ const ListItemButton = MuiListItemButton;
13
+ export type ListItemButtonProps = React.ComponentProps<typeof ListItemButton>;
14
+ (ListItemButton as any).displayName = 'Gui.ListItemButton';
15
+ export default ListItemButton;