this.gui 1.3.22 → 1.3.26

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 (284) hide show
  1. package/dist/this-gui.es.js +0 -1
  2. package/dist/this-gui.umd.js +65 -65
  3. package/index.ts +3 -2
  4. package/init/index.html +4 -5
  5. package/init/package-lock.json +2 -2
  6. package/init/package.json +1 -1
  7. package/init/src/App.tsx +24 -0
  8. package/init/src/index.css +16 -0
  9. package/init/src/main.tsx +14 -0
  10. package/init/src/router/DerivableRouter.tsx +36 -0
  11. package/package.json +1 -1
  12. package/src/GUI.tsx +15 -0
  13. package/src/components/generics/Cards/Gridme.jsx +52 -0
  14. package/src/components/generics/Cards/LilBox.jsx +65 -0
  15. package/src/components/generics/Cards/ModuleCard.jsx +106 -0
  16. package/src/components/generics/Chats/FullChatBot.jsx +223 -0
  17. package/src/components/generics/Code/CodeBlock.jsx +33 -0
  18. package/src/components/generics/Feedback/Callout.jsx +92 -0
  19. package/src/components/generics/Layout/GridX.jsx +29 -0
  20. package/src/components/generics/Layout/Hero2.jsx +132 -0
  21. package/src/components/generics/Layout/PageContainer.jsx +29 -0
  22. package/src/components/generics/Layout/PageDivider.jsx +20 -0
  23. package/src/components/generics/Layout/Section.jsx +43 -0
  24. package/src/components/generics/Layout/SectionHeader.jsx +21 -0
  25. package/src/components/generics/Media/Img.jsx +58 -0
  26. package/src/components/generics/Media/VideoEmbed.jsx +51 -0
  27. package/src/components/generics/Organization/TableOfContents.jsx +51 -0
  28. package/src/components/generics/Organization/Tabs.jsx +45 -0
  29. package/src/components/generics/Text/TextList.jsx +41 -0
  30. package/src/components/generics/Text/TextParagraph.jsx +28 -0
  31. package/src/components/generics/Text/TextQuote.jsx +23 -0
  32. package/src/components/generics/Text/TextTitle.jsx +44 -0
  33. package/src/gui/Layouts/ResponsiveUI/Content/Content.resolver.tsx +0 -0
  34. package/src/gui/Layouts/ResponsiveUI/Content/Content.stories.tsx +88 -0
  35. package/src/gui/Layouts/ResponsiveUI/Content/Content.tsx +53 -0
  36. package/src/gui/Layouts/ResponsiveUI/Content/Content.types.tsx +40 -0
  37. package/src/gui/Layouts/ResponsiveUI/Footer/Footer.resolver.tsx +45 -0
  38. package/src/gui/Layouts/ResponsiveUI/Footer/Footer.stories.tsx +209 -0
  39. package/src/gui/Layouts/ResponsiveUI/Footer/Footer.tsx +337 -0
  40. package/src/gui/Layouts/ResponsiveUI/Footer/Footer.types.ts +40 -0
  41. package/src/gui/Layouts/ResponsiveUI/Layout/Layout.resolver.tsx +37 -0
  42. package/src/gui/Layouts/ResponsiveUI/Layout/Layout.stories.tsx +290 -0
  43. package/src/gui/Layouts/ResponsiveUI/Layout/Layout.tsx +112 -0
  44. package/src/gui/Layouts/ResponsiveUI/Layout/Layout.types.ts +56 -0
  45. package/src/gui/Layouts/ResponsiveUI/Layout/useLayoutBreakpoints.ts +9 -0
  46. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/LeftSidebar.resolver.tsx +87 -0
  47. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/LeftSidebar.stories.tsx +199 -0
  48. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/LeftSidebar.tsx +311 -0
  49. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/LeftSidebar.types.ts +41 -0
  50. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/SidebarToggleButton.tsx +53 -0
  51. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarAction/LeftSidebarAction.resolver.tsx +19 -0
  52. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarAction/LeftSidebarAction.tsx +107 -0
  53. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarLink/LeftSidebarLink.resolver.tsx +0 -0
  54. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarLink/LeftSidebarLink.tsx +122 -0
  55. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarLink/LeftSidebarLink.types.ts +13 -0
  56. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarMenu/LeftSidebarMenu.tsx +142 -0
  57. package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarToggleButton/LeftSidebarToggleButton.tsx +23 -0
  58. package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/RightSidebar.resolver.tsx +35 -0
  59. package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/RightSidebar.stories.tsx +240 -0
  60. package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/RightSidebar.tsx +319 -0
  61. package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/RightSidebar.types.ts +17 -0
  62. package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/components/RightSidebarAction/RightSidebarAction.tsx +102 -0
  63. package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/components/RightSidebarLink/RightSidebarLink.tsx +132 -0
  64. package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/components/RightSidebarMenu/RightSidebarMenu.tsx +140 -0
  65. package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/components/RightSidebarToggleButton/RightSidebarToggleButton.tsx +22 -0
  66. package/src/gui/Layouts/ResponsiveUI/StickyOptions/StickyOptionsTop.stories.tsx +469 -0
  67. package/src/gui/Layouts/ResponsiveUI/StickyOptions/StickyOptionsTop.tsx +489 -0
  68. package/src/gui/Layouts/ResponsiveUI/TopBar/TopBar.resolver.tsx +86 -0
  69. package/src/gui/Layouts/ResponsiveUI/TopBar/TopBar.stories.tsx +350 -0
  70. package/src/gui/Layouts/ResponsiveUI/TopBar/TopBar.tsx +281 -0
  71. package/src/gui/Layouts/ResponsiveUI/TopBar/TopBar.types.ts +39 -0
  72. package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarAction/TopBarAction.stories.tsx +83 -0
  73. package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarAction/TopBarAction.tsx +18 -0
  74. package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarAction/TopBarAction.types.ts +4 -0
  75. package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarLink/TopBarLink.stories.tsx +189 -0
  76. package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarLink/TopBarLink.tsx +30 -0
  77. package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarLink/TopBarLink.types.ts +9 -0
  78. package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarMenu/TopBarMenu.resolver.tsx +14 -0
  79. package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarMenu/TopBarMenu.stories.tsx +56 -0
  80. package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarMenu/TopBarMenu.tsx +123 -0
  81. package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarMenu/TopBarMenu.types.ts +44 -0
  82. package/src/gui/Theme/GuiProvider.tsx +125 -0
  83. package/src/gui/Theme/Icon/Icon.resolver.tsx +29 -0
  84. package/src/gui/Theme/Icon/Icon.tsx +43 -0
  85. package/src/gui/Theme/catalog/CherryByte/CherryByte.png +0 -0
  86. package/src/gui/Theme/catalog/CherryByte/dark.tokens.ts +47 -0
  87. package/src/gui/Theme/catalog/CherryByte/light.tokens.ts +47 -0
  88. package/src/gui/Theme/catalog/CherryByte/manifest.ts +24 -0
  89. package/src/gui/Theme/catalog/GhostShell/dark.tokens.ts +43 -0
  90. package/src/gui/Theme/catalog/GhostShell/ghost.png +0 -0
  91. package/src/gui/Theme/catalog/GhostShell/light.tokens.ts +39 -0
  92. package/src/gui/Theme/catalog/GhostShell/manifest.ts +24 -0
  93. package/src/gui/Theme/catalog/LunaHex/LunaHex.png +0 -0
  94. package/src/gui/Theme/catalog/LunaHex/dark.tokens.ts +34 -0
  95. package/src/gui/Theme/catalog/LunaHex/light.tokens.ts +74 -0
  96. package/src/gui/Theme/catalog/LunaHex/manifest.ts +24 -0
  97. package/src/gui/Theme/catalog/MUI/MUI.png +0 -0
  98. package/src/gui/Theme/catalog/MUI/dark.tokens.ts +58 -0
  99. package/src/gui/Theme/catalog/MUI/light.tokens.ts +74 -0
  100. package/src/gui/Theme/catalog/MUI/manifest.ts +24 -0
  101. package/src/gui/Theme/catalog/PrinceOfDarkness/dark.tokens.ts +48 -0
  102. package/src/gui/Theme/catalog/PrinceOfDarkness/light.tokens.ts +47 -0
  103. package/src/gui/Theme/catalog/PrinceOfDarkness/manifest.ts +24 -0
  104. package/src/gui/Theme/catalog/PrinceOfDarkness/prince.png +0 -0
  105. package/src/gui/Theme/catalog/PrinceOfDarkness/princeOfDarkness.png +0 -0
  106. package/src/gui/Theme/catalog/Seafoam/dark.tokens.ts +49 -0
  107. package/src/gui/Theme/catalog/Seafoam/light.tokens.ts +47 -0
  108. package/src/gui/Theme/catalog/Seafoam/manifest.ts +24 -0
  109. package/src/gui/Theme/catalog/Seafoam/seaFoam.png +0 -0
  110. package/src/gui/Theme/catalog/neurons/dark.tokens.ts +58 -0
  111. package/src/gui/Theme/catalog/neurons/light.tokens.ts +74 -0
  112. package/src/gui/Theme/catalog/neurons/manifest.ts +24 -0
  113. package/src/gui/Theme/catalog/neurons/neurons.me.png +0 -0
  114. package/src/gui/Theme/fromTokens.ts +273 -0
  115. package/src/gui/Theme/gui.css +31 -0
  116. package/src/gui/Theme/index.ts +17 -0
  117. package/src/gui/Theme/styles/buildShadows.ts +83 -0
  118. package/src/gui/Theme/styles/theme.tokens.ts +108 -0
  119. package/src/gui/Theme/utils/catalog.ts +61 -0
  120. package/src/gui/Theme/utils/persistence.ts +66 -0
  121. package/src/gui/Theme/utils/themeUtils.ts +34 -0
  122. package/src/gui/apis/codegen.api.ts +38 -0
  123. package/src/gui/components/atoms/AppBar/AppBar.resolver.tsx +41 -0
  124. package/src/gui/components/atoms/AppBar/AppBar.stories.tsx +225 -0
  125. package/src/gui/components/atoms/AppBar/AppBar.tsx +8 -0
  126. package/src/gui/components/atoms/AppBar/AppBar.types.ts +28 -0
  127. package/src/gui/components/atoms/Avatar/Avatar.resolver.tsx +61 -0
  128. package/src/gui/components/atoms/Avatar/Avatar.stories.tsx +36 -0
  129. package/src/gui/components/atoms/Avatar/Avatar.tsx +14 -0
  130. package/src/gui/components/atoms/Box/Box.resolver.tsx +171 -0
  131. package/src/gui/components/atoms/Box/Box.stories.tsx +263 -0
  132. package/src/gui/components/atoms/Box/Box.tsx +15 -0
  133. package/src/gui/components/atoms/Button/Button.resolver.tsx +103 -0
  134. package/src/gui/components/atoms/Button/Button.stories.tsx +219 -0
  135. package/src/gui/components/atoms/Button/Button.tsx +40 -0
  136. package/src/gui/components/atoms/Card/Card.resolver.tsx +63 -0
  137. package/src/gui/components/atoms/Card/Card.stories.tsx +54 -0
  138. package/src/gui/components/atoms/Card/Card.tsx +13 -0
  139. package/src/gui/components/atoms/CardActions/CardActions.resolver.tsx +59 -0
  140. package/src/gui/components/atoms/CardActions/CardActions.stories.tsx +32 -0
  141. package/src/gui/components/atoms/CardActions/CardActions.tsx +14 -0
  142. package/src/gui/components/atoms/CardContent/CardContent.resolver.tsx +60 -0
  143. package/src/gui/components/atoms/CardContent/CardContent.stories.tsx +34 -0
  144. package/src/gui/components/atoms/CardContent/CardContent.tsx +13 -0
  145. package/src/gui/components/atoms/CardHeader/CardHeader.resolver.tsx +68 -0
  146. package/src/gui/components/atoms/CardHeader/CardHeader.stories.tsx +40 -0
  147. package/src/gui/components/atoms/CardHeader/CardHeader.tsx +12 -0
  148. package/src/gui/components/atoms/Collapse/Collapse.resolver.tsx +85 -0
  149. package/src/gui/components/atoms/Collapse/Collapse.stories.tsx +130 -0
  150. package/src/gui/components/atoms/Collapse/Collapse.tsx +17 -0
  151. package/src/gui/components/atoms/Divider/Divider.resolver.tsx +95 -0
  152. package/src/gui/components/atoms/Divider/Divider.stories.tsx +108 -0
  153. package/src/gui/components/atoms/Divider/Divider.tsx +14 -0
  154. package/src/gui/components/atoms/Drawer/Drawer.resolver.tsx +116 -0
  155. package/src/gui/components/atoms/Drawer/Drawer.stories.tsx +223 -0
  156. package/src/gui/components/atoms/Drawer/Drawer.tsx +25 -0
  157. package/src/gui/components/atoms/Grid/Grid.resolver.tsx +33 -0
  158. package/src/gui/components/atoms/Grid/Grid.stories.tsx +136 -0
  159. package/src/gui/components/atoms/Grid/Grid.tsx +15 -0
  160. package/src/gui/components/atoms/Grid/Grid.types.ts +9 -0
  161. package/src/gui/components/atoms/IconButton/IconButton.resolver.tsx +137 -0
  162. package/src/gui/components/atoms/IconButton/IconButton.stories.tsx +134 -0
  163. package/src/gui/components/atoms/IconButton/IconButton.tsx +22 -0
  164. package/src/gui/components/atoms/Link/Link.resolver.tsx +74 -0
  165. package/src/gui/components/atoms/Link/Link.stories.tsx +157 -0
  166. package/src/gui/components/atoms/Link/Link.tsx +36 -0
  167. package/src/gui/components/atoms/List/List.resolver.tsx +94 -0
  168. package/src/gui/components/atoms/List/List.stories.tsx +137 -0
  169. package/src/gui/components/atoms/List/List.tsx +20 -0
  170. package/src/gui/components/atoms/ListItem/ListItem.resolver.tsx +88 -0
  171. package/src/gui/components/atoms/ListItem/ListItem.stories.tsx +151 -0
  172. package/src/gui/components/atoms/ListItem/ListItem.tsx +19 -0
  173. package/src/gui/components/atoms/ListItemButton/ListItemButton.resolver.tsx +214 -0
  174. package/src/gui/components/atoms/ListItemButton/ListItemButton.stories.tsx +155 -0
  175. package/src/gui/components/atoms/ListItemButton/ListItemButton.tsx +15 -0
  176. package/src/gui/components/atoms/ListItemIcon/ListItemIcon.resolver.tsx +102 -0
  177. package/src/gui/components/atoms/ListItemIcon/ListItemIcon.stories.tsx +132 -0
  178. package/src/gui/components/atoms/ListItemIcon/ListItemIcon.tsx +11 -0
  179. package/src/gui/components/atoms/ListItemText/ListItemText.resolver.tsx +112 -0
  180. package/src/gui/components/atoms/ListItemText/ListItemText.stories.tsx +156 -0
  181. package/src/gui/components/atoms/ListItemText/ListItemText.tsx +15 -0
  182. package/src/gui/components/atoms/Menu/Menu.resolver.tsx +112 -0
  183. package/src/gui/components/atoms/Menu/Menu.stories.tsx +162 -0
  184. package/src/gui/components/atoms/Menu/Menu.tsx +17 -0
  185. package/src/gui/components/atoms/MenuItem/MenuItem.resolver.tsx +183 -0
  186. package/src/gui/components/atoms/MenuItem/MenuItem.stories.tsx +134 -0
  187. package/src/gui/components/atoms/MenuItem/MenuItem.tsx +14 -0
  188. package/src/gui/components/atoms/Paper/Paper.resolver.tsx +98 -0
  189. package/src/gui/components/atoms/Paper/Paper.stories.tsx +184 -0
  190. package/src/gui/components/atoms/Paper/Paper.tsx +15 -0
  191. package/src/gui/components/atoms/Section/Section.resolver.tsx +10 -0
  192. package/src/gui/components/atoms/Section/Section.stories.tsx +189 -0
  193. package/src/gui/components/atoms/Section/Section.tsx +76 -0
  194. package/src/gui/components/atoms/Section/Section.types.tsx +24 -0
  195. package/src/gui/components/atoms/Stack/Stack.resolver.tsx +94 -0
  196. package/src/gui/components/atoms/Stack/Stack.stories.tsx +160 -0
  197. package/src/gui/components/atoms/Stack/Stack.tsx +15 -0
  198. package/src/gui/components/atoms/Surface/Surface.resolver.tsx +37 -0
  199. package/src/gui/components/atoms/Surface/Surface.tsx +49 -0
  200. package/src/gui/components/atoms/Surface/Surface.types.ts +20 -0
  201. package/src/gui/components/atoms/Switch/Switch.resolver.tsx +53 -0
  202. package/src/gui/components/atoms/Switch/Switch.stories.tsx +236 -0
  203. package/src/gui/components/atoms/Switch/Switch.tsx +22 -0
  204. package/src/gui/components/atoms/TextField/TextField.stories.tsx +28 -0
  205. package/src/gui/components/atoms/TextField/TextField.tsx +15 -0
  206. package/src/gui/components/atoms/Toolbar/Toolbar.resolver.tsx +60 -0
  207. package/src/gui/components/atoms/Toolbar/Toolbar.stories.tsx +155 -0
  208. package/src/gui/components/atoms/Toolbar/Toolbar.tsx +16 -0
  209. package/src/gui/components/atoms/Tooltip/Tooltip.resolver.tsx +142 -0
  210. package/src/gui/components/atoms/Tooltip/Tooltip.stories.tsx +117 -0
  211. package/src/gui/components/atoms/Tooltip/Tooltip.tsx +70 -0
  212. package/src/gui/components/atoms/Typography/Typography.resolver.tsx +158 -0
  213. package/src/gui/components/atoms/Typography/Typography.stories.tsx +222 -0
  214. package/src/gui/components/atoms/Typography/Typography.tsx +27 -0
  215. package/src/gui/components/atoms.tsx +138 -0
  216. package/src/gui/components/molecules/Dialog/Dialog.stories.tsx +18 -0
  217. package/src/gui/components/molecules/Dialog/Dialog.tsx +5 -0
  218. package/src/gui/components/molecules/HeroSection/HeroSection.stories.tsx +141 -0
  219. package/src/gui/components/molecules/HeroSection/HeroSection.tsx +152 -0
  220. package/src/gui/components/molecules/HeroSection/HeroSection.types.tsx +18 -0
  221. package/src/gui/components/molecules/ModalBox/ModalBox.resolver.tsx +38 -0
  222. package/src/gui/components/molecules/ModalBox/ModalBox.stories.tsx +82 -0
  223. package/src/gui/components/molecules/ModalBox/ModalBox.tsx +106 -0
  224. package/src/gui/components/molecules/ModalBox/ModalBox.types.ts +29 -0
  225. package/src/gui/components/molecules/Page/Page.stories.tsx +135 -0
  226. package/src/gui/components/molecules/Page/Page.tsx +94 -0
  227. package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.resolver.tsx +58 -0
  228. package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.stories.tsx +133 -0
  229. package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.tsx +101 -0
  230. package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.types.ts +29 -0
  231. package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.resolver.tsx +15 -0
  232. package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.stories.tsx +88 -0
  233. package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.tsx +167 -0
  234. package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.types.ts +34 -0
  235. package/src/gui/components/organism/ChatGPTInterface/ChatGPTInterface.stories.tsx +17 -0
  236. package/src/gui/components/organism/ChatGPTInterface/ChatGPTInterface.tsx +71 -0
  237. package/src/gui/components/organism/RootDomain/RootDomain.stories.tsx +31 -0
  238. package/src/gui/components/organism/RootDomain/RootDomain.tsx +100 -0
  239. package/src/gui/components/organism/RootDomain/staticServices.ts +66 -0
  240. package/src/gui/components/window/Nodes/node.ts +0 -0
  241. package/src/gui/components/window/code/block/node.tsx +0 -0
  242. package/src/gui/components/window/code/hugging.face.api.ts +11 -0
  243. package/src/gui/components/window/connectors/index.ts +19 -0
  244. package/src/gui/components/window/window.stories.tsx +20 -0
  245. package/src/gui/components/window/window.tsx +633 -0
  246. package/src/gui/contexts/InsetsContext.tsx +38 -0
  247. package/src/gui/contexts/LeftSidebarContext.tsx +20 -0
  248. package/src/gui/contexts/RightSidebarContext.tsx +25 -0
  249. package/src/gui/contexts/ThemeContext.ts +34 -0
  250. package/src/gui/contexts/index.ts +4 -0
  251. package/src/gui/hooks/index.ts +11 -0
  252. package/src/gui/hooks/resolveColorToken.ts +39 -0
  253. package/src/gui/hooks/useCodeGen.ts +12 -0
  254. package/src/gui/hooks/useGuiMediaQuery.ts +18 -0
  255. package/src/gui/hooks/useGuiTheme.ts +18 -0
  256. package/src/gui/hooks/useInsets.ts +26 -0
  257. package/src/gui/hooks/useIsMobile.ts +13 -0
  258. package/src/gui/hooks/useIsTouchDevice.ts +25 -0
  259. package/src/gui/hooks/useLeftSidebar.ts +10 -0
  260. package/src/gui/hooks/useRightSidebar.ts +12 -0
  261. package/src/gui/hooks/useViewportKey.ts +19 -0
  262. package/src/gui/hooks/useViewportProp.ts +17 -0
  263. package/src/gui/me/Logic.tsx +31 -0
  264. package/src/gui/me/Me.stories.tsx +8 -0
  265. package/src/gui/me/Me.tsx +197 -0
  266. package/src/gui/me/fundamentals/verbs/verbs.tsx +94 -0
  267. package/src/gui/me/modificators/Adjectives.ts +0 -0
  268. package/src/gui/me/modificators/Adverbs.ts +0 -0
  269. package/src/gui/me/modificators/Complements.ts +27 -0
  270. package/src/gui/me/utils/Context.tsx +14 -0
  271. package/src/gui/me/utils/hooks/useMe.js +37 -0
  272. package/src/gui/utils/nodeID.ts +11 -0
  273. package/src/registry/GuiRegistry.ts +19 -0
  274. package/src/registry/factory.ts +12 -0
  275. package/src/registry/index.ts +3 -0
  276. package/src/registry/types.ts +6 -0
  277. package/src/stories/01.Home.mdx +22 -0
  278. package/src/stories/02.Understanding.This.GUI.mdx +149 -0
  279. package/src/stories/Theme/Palette.stories.tsx +86 -0
  280. package/src/stories/Theme/ThemeViewer.stories.tsx +91 -0
  281. package/src/stories/Theme/Typography.stories.jsx +211 -0
  282. package/src/types/gui.d.ts +67 -0
  283. package/src/types/theme.d.ts +191 -0
  284. package/src/types/viewport.ts +132 -0
@@ -0,0 +1,273 @@
1
+ // src/themes/fromTokens.ts
2
+ import { createTheme, type Theme } from '@mui/material/styles';
3
+ import { buildShadows } from '@/gui/Theme/styles/buildShadows';
4
+ // Helpers ------------------------------------------------------------
5
+
6
+ declare module '@mui/material/styles' {
7
+ interface Palette {
8
+ section: {
9
+ default: string;
10
+ subtle: string;
11
+ strong: string;
12
+ };
13
+ blur: {
14
+ light: string;
15
+ medium: string;
16
+ heavy: string;
17
+ all: string;
18
+ };
19
+ }
20
+ interface PaletteOptions {
21
+ section?: {
22
+ default?: string;
23
+ subtle?: string;
24
+ strong?: string;
25
+ };
26
+ blur?: {
27
+ light?: string;
28
+ medium?: string;
29
+ heavy?: string;
30
+ all?: string;
31
+ };
32
+ }
33
+ }
34
+
35
+ export const pxToRem = (n: number): string => `${n / 16}rem`;
36
+ const pick = <T = any,>(obj: any, path: Array<string | number>, fallback?: T): T => {
37
+ // Safely read nested token value supporting multiple token shapes
38
+ // - Tokens Studio style: { $value: '...' }
39
+ // - simple style: { value: '...' }
40
+ // - raw primitive values
41
+ const raw = path.reduce<any>((acc, k) => (acc && acc[k] !== undefined ? acc[k] : undefined), obj) ?? undefined;
42
+ if (raw && typeof raw === 'object') {
43
+ if ('$value' in raw) return (raw as any).$value as T;
44
+ if ('value' in raw) return (raw as any).value as T;
45
+ }
46
+ return (raw ?? fallback) as T;
47
+ };
48
+
49
+ const readNumber = (v: unknown, fb: number): number => {
50
+ if (v === undefined || v === null) return fb;
51
+ const n = typeof v === 'string' ? parseFloat(v) : (v as number);
52
+ return Number.isFinite(n) ? (n as number) : fb;
53
+ };
54
+
55
+ // Main compiler ------------------------------------------------------
56
+ export function makeMuiTheme(themeTokens: any, modeTokens: any, mode: 'light' | 'dark' = 'light'): Theme {
57
+ const g = themeTokens || {};
58
+ const c = modeTokens?.color || {};
59
+ const blurTokens = pick(modeTokens, ['blur'], pick(c, ['blur'], undefined));
60
+ const blurRadiusTokens =
61
+ pick(g, ['blur', 'radius'], undefined) ??
62
+ pick(g, ['custom', 'blurRadius'], undefined) ??
63
+ pick(g, ['blurRadius'], undefined);
64
+ // Core primitives
65
+ const radius = readNumber(pick(g, ['radius', 'md'], 10), 10);
66
+ const spacing = readNumber(pick(g, ['spacing', 'base'], 8), 8);
67
+ const fontFamily = pick<string>(g, ['font', 'family'], 'Roboto, sans-serif');
68
+ const borderDefault =
69
+ pick<string | undefined>(g, ['border', 'default'], undefined) ??
70
+ (mode === 'dark' ? 'rgb(45,45,55)' : 'rgba(0,0,0,0.08)');
71
+ // Extended tokens
72
+ const semantic = modeTokens?.extendedColors || modeTokens?.semantic || {};
73
+ const gradients = semantic?.gradients || {};
74
+ const overlays = semantic?.overlays || {};
75
+ const zIndexTokens = g.zIndex || {};
76
+ const breakpointsTokens = g.breakpoints || {};
77
+ const motion = g.motion || {};
78
+ const opacity = g.opacity || {};
79
+ const iconSizes = g.iconSizes || {};
80
+ const lineHeights = g.lineHeights || {};
81
+ const shadowsTokens = g.shadows;
82
+ // Build MUI theme
83
+ const theme = createTheme({
84
+ // Palette accepts custom keys like `link` and `background.nav` in our design system,
85
+ // so we cast to any to avoid fighting MUI's strict palette types.
86
+ palette: {
87
+ mode,
88
+ primary: { main: pick(c, ['primary'], '#1976d2') },
89
+ secondary: { main: pick(c, ['secondary'], '#9c27b0') },
90
+ icon: { main: pick(c, ['icon'], '#5e5e5e') },
91
+ background: {
92
+ default: pick(c, ['background','default'], mode === 'dark' ? '#121214' : '#f8f9fa'),
93
+ paper: pick(c, ['background','paper'], mode === 'dark' ? '#181a1c' : '#fff'),
94
+ nav: pick(c, ['background','nav'], mode === 'dark' ? '#16181a' : '#fdfdfd'),
95
+ },
96
+ text: {
97
+ primary: pick(c, ['textPrimary'], mode === 'dark' ? '#fff' : '#111'),
98
+ secondary: pick(
99
+ c,
100
+ ['textSecondary'],
101
+ mode === 'dark' ? 'rgba(255,255,255,0.7)' : '#444'
102
+ ),
103
+ },
104
+ link: {
105
+ main: pick(c, ['link'], mode === 'dark' ? '#00aa96' : '#008c7d'),
106
+ visited: pick(c, ['linkVisited'], mode === 'dark' ? '#008278' : '#006e64'),
107
+ },
108
+ error: { main: pick(semantic, ['error'], mode === 'dark' ? '#ef5350' : '#d32f2f') },
109
+ warning: { main: pick(semantic, ['warning'], '#ed6c02') },
110
+ info: { main: pick(semantic, ['info'], '#0288d1') },
111
+ success: { main: pick(semantic, ['success'], '#2e7d32') },
112
+ divider: pick(c, ['border'], borderDefault),
113
+ action: {
114
+ hoverOpacity: readNumber(pick(opacity, ['hover'], 0.08), 0.08),
115
+ selectedOpacity: readNumber(pick(opacity, ['selected'], 0.12), 0.12),
116
+ disabledOpacity: readNumber(pick(opacity, ['disabled'], 0.38), 0.38),
117
+ focusOpacity: readNumber(pick(opacity, ['focus'], 0.12), 0.12),
118
+ activatedOpacity: readNumber(pick(opacity, ['activated'], 0.12), 0.12),
119
+ },
120
+ section: mode === 'dark' ? {
121
+ default: '#121212',
122
+ subtle: '#1a1a1a',
123
+ strong: '#202020',
124
+ } : {
125
+ default: '#f9f9fb',
126
+ subtle: '#ffffff',
127
+ strong: '#f0f2f5',
128
+ },
129
+ blur: blurTokens ?? (
130
+ mode === 'dark'
131
+ ? {
132
+ light: 'rgba(25, 37, 36, 1)',
133
+ medium: 'rgba(25, 37, 36, 1)',
134
+ heavy: 'rgba(25, 37, 36, 1)',
135
+ all: 'rgba(25, 37, 36, 1)',
136
+ }
137
+ : {
138
+ light: 'rgba(255, 245, 250, 1)',
139
+ medium: 'rgba(255, 240, 245, 1)',
140
+ heavy: 'rgba(255, 235, 240, 1)',
141
+ all: 'rgba(255, 220, 230, 1)',
142
+ }
143
+ ),
144
+ },
145
+ // All tokens exposed under theme.custom for easy access
146
+ custom: {
147
+ border: pick(c, ['border'], borderDefault),
148
+ gradients,
149
+ overlays,
150
+ iconSizes,
151
+ lineHeights,
152
+ blurRadius: {
153
+ light: pick(blurRadiusTokens, ['light'], '6px'),
154
+ medium: pick(blurRadiusTokens, ['medium'], '12px'),
155
+ heavy: pick(blurRadiusTokens, ['heavy'], '24px'),
156
+ all: pick(blurRadiusTokens, ['all'], '32px'),
157
+ },
158
+ },
159
+ shape: { borderRadius: Number.isFinite(radius) ? (radius as number) : 10 },
160
+ spacing: Number.isFinite(spacing) ? (spacing as number) : 8,
161
+ breakpoints: {
162
+ values: {
163
+ xs: readNumber(pick(breakpointsTokens, ['values', 'xs'], 0), 0),
164
+ sm: readNumber(pick(breakpointsTokens, ['values', 'sm'], 600), 600),
165
+ md: readNumber(pick(breakpointsTokens, ['values', 'md'], 900), 900),
166
+ lg: readNumber(pick(breakpointsTokens, ['values', 'lg'], 1200), 1200),
167
+ xl: readNumber(pick(breakpointsTokens, ['values', 'xl'], 1536), 1536),
168
+ },
169
+ },
170
+ zIndex: {
171
+ appBar: readNumber(pick(zIndexTokens, ['appBar'], 1100), 1100),
172
+ drawer: readNumber(pick(zIndexTokens, ['drawer'], 1200), 1200),
173
+ modal: readNumber(pick(zIndexTokens, ['modal'], 1300), 1300),
174
+ snackbar: readNumber(pick(zIndexTokens, ['snackbar'], 1400), 1400),
175
+ tooltip: readNumber(pick(zIndexTokens, ['tooltip'], 1500), 1500),
176
+ },
177
+ transitions: {
178
+ easing: {
179
+ easeInOut: pick(motion, ['easing', 'standard'], 'cubic-bezier(0.4, 0, 0.2, 1)'),
180
+ easeOut: pick(motion, ['easing', 'decelerate'], 'cubic-bezier(0.0, 0, 0.2, 1)'),
181
+ easeIn: pick(motion, ['easing', 'accelerate'], 'cubic-bezier(0.4, 0, 1, 1)'),
182
+ sharp: pick(motion, ['easing', 'sharp'], 'cubic-bezier(0.4, 0, 0.6, 1)'),
183
+ },
184
+ duration: {
185
+ shortest: readNumber(pick(motion, ['duration', 'shortest'], 150), 150),
186
+ shorter: readNumber(pick(motion, ['duration', 'shorter'], 200), 200),
187
+ short: readNumber(pick(motion, ['duration', 'short'], 250), 250),
188
+ standard: readNumber(pick(motion, ['duration', 'standard'], 300), 300),
189
+ complex: readNumber(pick(motion, ['duration', 'complex'], 375), 375),
190
+ enteringScreen: readNumber(pick(motion, ['duration', 'entering'], 225), 225),
191
+ leavingScreen: readNumber(pick(motion, ['duration', 'leaving'], 195), 195),
192
+ },
193
+ },
194
+ typography: {
195
+ fontFamily,
196
+ // existing variants
197
+ h1: { fontSize: pxToRem(40), fontWeight: 600, lineHeight: 1.2, letterSpacing: '-0.01em' },
198
+ h2: { fontSize: pxToRem(32), fontWeight: 600, lineHeight: 1.25 },
199
+ h3: { fontSize: pxToRem(26), fontWeight: 600, lineHeight: 1.3 },
200
+ h4: { fontSize: pxToRem(21), fontWeight: 600, lineHeight: 1.35 },
201
+ h5: { fontSize: pxToRem(18), fontWeight: 600, lineHeight: 1.35 },
202
+ subtitle1: { fontSize: pxToRem(16), fontWeight: 600, lineHeight: 1.4 },
203
+ body1: { fontSize: pxToRem(16), lineHeight: 1.6 },
204
+ body2: { fontSize: pxToRem(14), lineHeight: 1.6 },
205
+ button: { textTransform: 'none', fontWeight: 700, letterSpacing: '0.02em' },
206
+ },
207
+ shadows: buildShadows(shadowsTokens, mode),
208
+ layout: {
209
+ insets: {
210
+ left: readNumber(pick(g, ['layout', 'insets', 'left'], 0), 0),
211
+ right: readNumber(pick(g, ['layout', 'insets', 'right'], 0), 0),
212
+ top: readNumber(pick(g, ['layout', 'insets', 'top'], 0), 0),
213
+ bottom: readNumber(pick(g, ['layout', 'insets', 'bottom'], 0), 0),
214
+ },
215
+ },
216
+ components: {
217
+ MuiButton: {
218
+ defaultProps: { disableElevation: true },
219
+ styleOverrides: {
220
+ root: ({ theme }) => ({ borderRadius: theme.shape.borderRadius }),
221
+ sizeLarge: { padding: '12px 20px' },
222
+ sizeMedium: { padding: '10px 18px' },
223
+ sizeSmall: { padding: '8px 14px' },
224
+ },
225
+ },
226
+ MuiPaper: { styleOverrides: { rounded: { borderRadius: 14 } } },
227
+ MuiTextField: { defaultProps: { size: 'small' } },
228
+ MuiCssBaseline: {
229
+ styleOverrides: (theme) => ({
230
+ ':root': {
231
+ '--gui-primary': theme.palette.primary.main,
232
+ '--gui-secondary': theme.palette.secondary.main,
233
+ '--gui-bg-default': theme.palette.background.default,
234
+ '--gui-bg-paper': theme.palette.background.paper,
235
+ '--gui-bg-nav': theme.palette.background.nav || theme.palette.background.paper,
236
+ '--gui-text-primary': theme.palette.text.primary,
237
+ '--gui-text-secondary': theme.palette.text.secondary,
238
+ '--gui-link': theme.palette.link.main,
239
+ '--gui-link-visited': theme.palette.link.visited || theme.palette.link.main,
240
+ '--gui-border': theme.custom?.border || theme.palette.divider,
241
+ // Motion / opacity / icon sizes CSS vars for non-MUI DOM
242
+ '--gui-ease-standard': theme.transitions.easing.easeInOut,
243
+ '--gui-duration-standard': `${theme.transitions.duration.standard}ms`,
244
+ '--gui-opacity-hover': theme.palette.action.hoverOpacity,
245
+ '--gui-opacity-disabled': theme.palette.action.disabledOpacity,
246
+ '--gui-icon-size-sm': (iconSizes as any).sm ?? '16px',
247
+ '--gui-icon-size-md': (iconSizes as any).md ?? '20px',
248
+ '--gui-icon-size-lg': (iconSizes as any).lg ?? '24px',
249
+ '--gui-radius': `${theme.shape.borderRadius}px`,
250
+ '--gui-font-family': theme.typography.fontFamily,
251
+ '--gui-spacing': typeof theme.spacing === 'function' ? theme.spacing(1) : `${(theme as any).spacing}px`,
252
+ '--gui-inset-left': theme.layout.insets.left + 'px',
253
+ '--gui-inset-right': theme.layout.insets.right + 'px',
254
+ '--gui-inset-top': theme.layout.insets.top + 'px',
255
+ '--gui-inset-bottom': theme.layout.insets.bottom + 'px',
256
+ },
257
+ body: {
258
+ fontFamily: theme.typography.fontFamily,
259
+ backgroundColor: theme.palette.background.default,
260
+ color: theme.palette.text.primary,
261
+ },
262
+ a: {
263
+ color: theme.palette.link.main,
264
+ textDecoration: 'none',
265
+ '&:hover': { textDecoration: 'underline' },
266
+ '&:visited': { color: theme.palette.link.visited || theme.palette.link.main },
267
+ },
268
+ }),
269
+ },
270
+ },
271
+ });
272
+ return theme;
273
+ }
@@ -0,0 +1,31 @@
1
+ /* themes/GUI.css
2
+ GUI Theme CSS Variables and Layout */
3
+ :root {
4
+ /* Layout insets, injected and/or overridden by theme or runtime */
5
+ --gui-inset-left: 0px;
6
+ --gui-inset-right: 0px;
7
+ --gui-inset-top: 48px;
8
+ --gui-inset-bottom: 0px;
9
+ /* Example additional tokens */
10
+ --radius-sm: 4px;
11
+ --radius-md: 8px;
12
+ --radius-lg: 12px;
13
+ --z-index-navbar: 1100;
14
+ --z-index-drawer: 1200;
15
+ }
16
+
17
+ /* Default body layout respecting insets */
18
+ body {
19
+ padding-top: var(--gui-inset-top);
20
+ padding-left: var(--gui-inset-left);
21
+ padding-right: var(--gui-inset-right);
22
+ padding-bottom: var(--gui-inset-bottom);
23
+ margin: 0;
24
+ box-sizing: border-box;
25
+ }
26
+
27
+ /* Utility container class */
28
+ .gui-container {
29
+ padding: var(--gui-inset-top) var(--gui-inset-right) var(--gui-inset-bottom) var(--gui-inset-left);
30
+ box-sizing: border-box;
31
+ }
@@ -0,0 +1,17 @@
1
+ // src/themes/index.ts
2
+ // Global tokens shared by all themes (radius, spacing, zIndex, etc.)
3
+ export type { Theme } from '@mui/material/styles';
4
+ // Theme persistence utilities
5
+ export { getInitialThemeId, usePersistentThemeId } from './utils/persistence';
6
+ // Theme context and provider
7
+ export { ThemeContext, useThemeContext } from '@/gui/contexts/ThemeContext';
8
+ export { default as GuiProvider } from './GuiProvider';
9
+ // Theme catalog access
10
+ export {
11
+ GuiThemes,
12
+ FlatGuiThemes,
13
+ getGuiThemes,
14
+ getFlatGuiThemes,
15
+ getGuiTheme,
16
+ getFlatGuiTheme,
17
+ } from './utils/catalog';
@@ -0,0 +1,83 @@
1
+ // themes/styles/buildShadows.ts
2
+ import { Theme } from '@mui/material/styles';
3
+ export const buildShadows = (shadowTokens: any, mode: 'light' | 'dark'): Theme['shadows'] => {
4
+ const DEFAULT_SHADOWS: string[] =
5
+ mode === 'dark'
6
+ ? [
7
+ 'none',
8
+ '0px 1px 2px rgba(0,0,0,0.6)',
9
+ '0px 2px 4px rgba(0,0,0,0.55)',
10
+ '0px 3px 6px rgba(0,0,0,0.5)',
11
+ '0px 4px 8px rgba(0,0,0,0.45)',
12
+ '0px 5px 10px rgba(0,0,0,0.4)',
13
+ '0px 6px 12px rgba(0,0,0,0.38)',
14
+ '0px 7px 14px rgba(0,0,0,0.36)',
15
+ '0px 8px 16px rgba(0,0,0,0.34)',
16
+ '0px 9px 18px rgba(0,0,0,0.32)',
17
+ '0px 10px 20px rgba(0,0,0,0.3)',
18
+ '0px 11px 22px rgba(0,0,0,0.28)',
19
+ '0px 12px 24px rgba(0,0,0,0.26)',
20
+ '0px 13px 26px rgba(0,0,0,0.24)',
21
+ '0px 14px 28px rgba(0,0,0,0.22)',
22
+ '0px 15px 30px rgba(0,0,0,0.2)',
23
+ '0px 16px 32px rgba(0,0,0,0.19)',
24
+ '0px 17px 34px rgba(0,0,0,0.18)',
25
+ '0px 18px 36px rgba(0,0,0,0.17)',
26
+ '0px 19px 38px rgba(0,0,0,0.16)',
27
+ '0px 20px 40px rgba(0,0,0,0.15)',
28
+ '0px 22px 44px rgba(0,0,0,0.14)',
29
+ '0px 24px 48px rgba(0,0,0,0.13)',
30
+ '0px 26px 52px rgba(0,0,0,0.12)',
31
+ '0px 28px 56px rgba(0,0,0,0.11)',
32
+ ]
33
+ : [
34
+ 'none',
35
+ '0px 1px 2px rgba(0,0,0,0.08)',
36
+ '0px 2px 4px rgba(0,0,0,0.1)',
37
+ '0px 3px 6px rgba(0,0,0,0.12)',
38
+ '0px 4px 8px rgba(0,0,0,0.14)',
39
+ '0px 5px 10px rgba(0,0,0,0.15)',
40
+ '0px 6px 12px rgba(0,0,0,0.16)',
41
+ '0px 7px 14px rgba(0,0,0,0.17)',
42
+ '0px 8px 16px rgba(0,0,0,0.18)',
43
+ '0px 9px 18px rgba(0,0,0,0.19)',
44
+ '0px 10px 20px rgba(0,0,0,0.2)',
45
+ '0px 11px 22px rgba(0,0,0,0.21)',
46
+ '0px 12px 24px rgba(0,0,0,0.22)',
47
+ '0px 13px 26px rgba(0,0,0,0.23)',
48
+ '0px 14px 28px rgba(0,0,0,0.24)',
49
+ '0px 15px 30px rgba(0,0,0,0.25)',
50
+ '0px 16px 32px rgba(0,0,0,0.26)',
51
+ '0px 17px 34px rgba(0,0,0,0.27)',
52
+ '0px 18px 36px rgba(0,0,0,0.28)',
53
+ '0px 19px 38px rgba(0,0,0,0.29)',
54
+ '0px 20px 40px rgba(0,0,0,0.3)',
55
+ '0px 22px 44px rgba(0,0,0,0.31)',
56
+ '0px 24px 48px rgba(0,0,0,0.32)',
57
+ '0px 26px 52px rgba(0,0,0,0.33)',
58
+ '0px 28px 56px rgba(0,0,0,0.34)',
59
+ ];
60
+
61
+ const ensureArrayLen = <T,>(arr: T[] | unknown, len: number, filler: T): T[] => {
62
+ const a = Array.isArray(arr) ? ([...arr] as T[]) : [];
63
+ for (let i = a.length; i < len; i++) a.push(filler);
64
+ return a.slice(0, len);
65
+ };
66
+
67
+ if (Array.isArray(shadowTokens)) {
68
+ return ensureArrayLen<string>(shadowTokens, 25, DEFAULT_SHADOWS[0]) as Theme['shadows'];
69
+ }
70
+
71
+ if (shadowTokens && typeof shadowTokens === 'object') {
72
+ const arr: string[] = [];
73
+ for (let i = 0; i < 25; i++) {
74
+ const v =
75
+ shadowTokens?.[i] ??
76
+ shadowTokens?.[`s${i}`];
77
+ arr.push(v ?? DEFAULT_SHADOWS[i] ?? DEFAULT_SHADOWS[0]);
78
+ }
79
+ return arr as Theme['shadows'];
80
+ }
81
+
82
+ return DEFAULT_SHADOWS as Theme['shadows'];
83
+ };
@@ -0,0 +1,108 @@
1
+ //themes/styles/theme.tokens.ts
2
+ export const themeTokens = {
3
+ description: "Unified base design tokens for This.GUI — used as foundation for all themes and modes.",
4
+ radius: {
5
+ md: {
6
+ type: "radius",
7
+ value: "10px"
8
+ }
9
+ },
10
+ spacing: {
11
+ base: {
12
+ type: "spacing",
13
+ value: "8"
14
+ }
15
+ },
16
+ border: {
17
+ default: {
18
+ type: "color",
19
+ value: "rgba(0, 0, 0, 0.08)"
20
+ }
21
+ },
22
+ font: {
23
+ family: {
24
+ type: "fontFamily",
25
+ value: "Roboto, sans-serif"
26
+ },
27
+ weightBold: {
28
+ type: "fontWeight",
29
+ value: "700"
30
+ },
31
+ weightSemibold: {
32
+ type: "fontWeight",
33
+ value: "600"
34
+ },
35
+ sizeBase: {
36
+ type: "fontSize",
37
+ value: "16"
38
+ },
39
+ letterTight: {
40
+ type: "letterSpacing",
41
+ value: "-0.01em"
42
+ }
43
+ },
44
+ color: {
45
+ description: "Extended semantic colors, gradients, overlays",
46
+ success: { type: "color", value: "#4caf50" },
47
+ warning: { type: "color", value: "#ff9800" },
48
+ error: { type: "color", value: "#f44336" },
49
+ info: { type: "color", value: "#2196f3" },
50
+ gradientPrimary: { type: "gradient", value: "linear-gradient(135deg, #00aa96 0%, #008c7d 100%)" }
51
+ },
52
+ insets: {
53
+ description: "Offsets reserved for permanent drawers",
54
+ type: "object",
55
+ left: {
56
+ type: "size",
57
+ value: "0px"
58
+ },
59
+ right: {
60
+ type: "size",
61
+ value: "0px"
62
+ }
63
+ },
64
+ shadows: {
65
+ description: "Consistent elevation levels, AR/3D ready",
66
+ sm: { type: "shadow", value: "0px 1px 2px rgba(0, 0, 0, 0.05)" },
67
+ md: { type: "shadow", value: "0px 3px 6px rgba(0, 0, 0, 0.1)" },
68
+ lg: { type: "shadow", value: "0px 8px 16px rgba(0, 0, 0, 0.15)" }
69
+ },
70
+ zIndex: {
71
+ description: "Advanced layering control",
72
+ nav: { type: "number", value: 1100 },
73
+ modal: { type: "number", value: 1300 },
74
+ tooltip: { type: "number", value: 1500 }
75
+ },
76
+ breakpoints: {
77
+ description: "Declarative responsive interfaces",
78
+ xs: { type: "breakpoint", value: "0px" },
79
+ sm: { type: "breakpoint", value: "600px" },
80
+ md: { type: "breakpoint", value: "900px" },
81
+ lg: { type: "breakpoint", value: "1200px" },
82
+ xl: { type: "breakpoint", value: "1536px" }
83
+ },
84
+ motion: {
85
+ description: "Animation and transition tokens",
86
+ durationFast: { type: "duration", value: "150ms" },
87
+ durationBase: { type: "duration", value: "300ms" },
88
+ easingStandard: { type: "easing", value: "cubic-bezier(0.4, 0, 0.2, 1)" }
89
+ },
90
+ opacity: {
91
+ description: "Universal interaction effects",
92
+ disabled: { type: "opacity", value: "0.38" },
93
+ hover: { type: "opacity", value: "0.08" },
94
+ focus: { type: "opacity", value: "0.12" }
95
+ },
96
+ icon: {
97
+ description: "Scalable icon sizes for generated GUIs",
98
+ sm: { type: "size", value: "16px" },
99
+ md: { type: "size", value: "24px" },
100
+ lg: { type: "size", value: "32px" }
101
+ },
102
+ lineHeight: {
103
+ description: "Better typographic control",
104
+ tight: { type: "lineHeight", value: "1.1" },
105
+ base: { type: "lineHeight", value: "1.5" },
106
+ relaxed: { type: "lineHeight", value: "1.75" }
107
+ }
108
+ };
@@ -0,0 +1,61 @@
1
+ // src/themes/catalog/catalog.ts
2
+ // A collection of theme manifests
3
+ // and their associated modes (light/dark) with token paths.
4
+ // It also provides utility functions to access and manipulate the theme catalog.
5
+ import neuronsManifest from '../catalog/neurons/manifest';
6
+ import ghostShellManifest from '../catalog/GhostShell/manifest';
7
+ import PrinceOfDarknessManifest from '../catalog/PrinceOfDarkness/manifest';
8
+ import muiManifest from '../catalog/MUI/manifest';
9
+ import lunaManifest from '../catalog/LunaHex/manifest';
10
+ import cherryByteManifest from '../catalog/CherryByte/manifest';
11
+ import SeafoamManifest from '../catalog/Seafoam/manifest';
12
+ import { FlatGuiTheme } from '@/types/theme'; //definiciones de tipos
13
+ export const GuiThemes = [neuronsManifest, ghostShellManifest, PrinceOfDarknessManifest, muiManifest, lunaManifest, cherryByteManifest, SeafoamManifest];
14
+ /*
15
+ FlatGuiThemes (plano)
16
+ • Es un array plano de modos individuales.
17
+ • Cada GuiTheme en esta lista representa una única combinación de:
18
+ • themeId
19
+ • themeName
20
+ • mode (light o dark)
21
+ • tokens
22
+ • manifest
23
+ • Esto es útil para renderizar selects, listas visuales, previews, etc.
24
+ */
25
+ export const FlatGuiThemes = GuiThemes.flatMap((manifest) => {
26
+ return (['light', 'dark'] as const).flatMap((mode) => {
27
+ return [{
28
+ themeId: manifest.themeId ?? '',
29
+ themeName: manifest.themeName ?? '',
30
+ description: manifest.description,
31
+ author: manifest.author,
32
+ version: manifest.version,
33
+ license: manifest.license,
34
+ homepage: manifest.homepage,
35
+ tags: manifest.tags,
36
+ createdAt: manifest.createdAt,
37
+ updatedAt: manifest.updatedAt,
38
+ badgeUrl: manifest.badgeUrl,
39
+ mode,
40
+ // Si los tokens ya están cargados/resueltos en este punto:
41
+ tokens: manifest.mode?.[mode] ?? {},
42
+ }];
43
+ });
44
+ });
45
+ /*
46
+ • Representa la colección de temas, donde cada tema tiene dos modos (light y dark).
47
+ • Es decir, el theme completo, tal como viene en el manifest.*/
48
+
49
+
50
+ export function getGuiThemes() {
51
+ return GuiThemes;
52
+ }
53
+ export function getGuiTheme(themeId: string) {
54
+ return GuiThemes.find(theme => theme.themeId === themeId);
55
+ }
56
+ export function getFlatGuiThemes(): FlatGuiTheme[] {
57
+ return FlatGuiThemes;
58
+ }
59
+ export function getFlatGuiTheme(themeId: string, mode: 'light' | 'dark') {
60
+ return FlatGuiThemes.find(theme => theme.themeId === themeId && theme.mode === mode);
61
+ }
@@ -0,0 +1,66 @@
1
+ //src/themes/utils/persistence.ts
2
+ // Utility to persist user's themeId using localStorage.
3
+ import { useState, useEffect } from 'react';
4
+ /**
5
+ * Retrieves the initial themeId from localStorage.
6
+ * Falls back to the provided default if not found or on error.
7
+ *
8
+ * @param fallback - The fallback themeId to use if none is stored.
9
+ * @returns The stored themeId or the fallback value.
10
+ */
11
+ export function getInitialThemeId(fallback: string): string {
12
+ try {
13
+ return localStorage.getItem('this.gui:themeId') || fallback;
14
+ } catch {
15
+ return fallback;
16
+ }
17
+ }
18
+ /**
19
+ * React hook to persist and manage the themeId using localStorage.
20
+ * Returns a [themeId, setThemeId] tuple just like useState.
21
+ *
22
+ * @param fallback - The fallback themeId if no previous value is stored.
23
+ * @returns A tuple [themeId, setThemeId] that syncs with localStorage.
24
+ */
25
+ export function usePersistentThemeId(
26
+ fallback: string
27
+ ): [string, React.Dispatch<React.SetStateAction<string>>] {
28
+ const [themeId, setThemeId] = useState<string>(() => getInitialThemeId(fallback));
29
+ useEffect(() => {
30
+ try {
31
+ localStorage.setItem('this.gui:themeId', themeId);
32
+ } catch {
33
+ // fail silently
34
+ }
35
+ }, [themeId]);
36
+ return [themeId, setThemeId];
37
+ }
38
+
39
+ /**
40
+ * React hook to persist and manage the theme mode (light/dark) using localStorage.
41
+ * Returns a [mode, setMode] tuple just like useState.
42
+ *
43
+ * @param fallback - The fallback mode if no previous value is stored.
44
+ * @returns A tuple [mode, setMode] that syncs with localStorage.
45
+ */
46
+ export function usePersistentThemeMode(
47
+ fallback: 'light' | 'dark'
48
+ ): ['light' | 'dark', React.Dispatch<React.SetStateAction<'light' | 'dark'>>] {
49
+ const [mode, setMode] = useState<'light' | 'dark'>(() => {
50
+ try {
51
+ const stored = localStorage.getItem('this.gui:themeMode');
52
+ if (stored === 'dark' || stored === 'light') return stored;
53
+ return fallback;
54
+ } catch {
55
+ return fallback;
56
+ }
57
+ });
58
+ useEffect(() => {
59
+ try {
60
+ localStorage.setItem('this.gui:themeMode', mode);
61
+ } catch {
62
+ // fail silently
63
+ }
64
+ }, [mode]);
65
+ return [mode, setMode];
66
+ }
@@ -0,0 +1,34 @@
1
+ //src/themes/utils/themeUtils.ts
2
+ import { Theme } from '@mui/material/styles';
3
+ export type Insets = { left: number; right: number; top: number; bottom: number };
4
+ // Helper to get CSS variable from theme
5
+ export const getCssVar = (theme: Theme, name: string) => {
6
+ return getComputedStyle(document.documentElement).getPropertyValue(`--${name}`) || theme.palette?.[name as keyof typeof theme.palette];
7
+ };
8
+
9
+ // Generates a string of CSS custom properties based on theme.palette
10
+ export const generatePaletteCssVars = (theme: Theme, prefix = '--palette') => {
11
+ const cssVars: Record<string, string> = {};
12
+ Object.entries(theme.palette).forEach(([key, value]) => {
13
+ if (!value || typeof value === 'function') return;
14
+ if (typeof value === 'object') {
15
+ Object.entries(value).forEach(([subKey, subVal]) => {
16
+ const varName = `${prefix}-${key}-${subKey}`;
17
+ cssVars[varName] = String(subVal);
18
+ });
19
+ } else {
20
+ const varName = `${prefix}-${key}`;
21
+ cssVars[varName] = String(value);
22
+ }
23
+ });
24
+ return cssVars;
25
+ };
26
+
27
+ // Appends generated CSS variables to the document root
28
+ export const applyThemeCssVars = (theme: Theme) => {
29
+ const cssVars = generatePaletteCssVars(theme);
30
+ const root = document.documentElement;
31
+ Object.entries(cssVars).forEach(([key, val]) => {
32
+ root.style.setProperty(key, val);
33
+ });
34
+ };