this.gui 1.0.17 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.js +40 -0
- package/.storybook/manager-head.html +13 -0
- package/.storybook/manager.js +15 -0
- package/.storybook/preview.tsx +54 -0
- package/.storybook/vitest.setup.js +6 -0
- package/.storybook/withLayout.tsx +18 -0
- package/README.md +1 -220
- package/dist/GUI.png +0 -0
- package/dist/GUI2.png +0 -0
- package/dist/favicon.ico +0 -0
- package/dist/this-gui.es.js +108493 -4976
- package/dist/this-gui.umd.js +239 -44
- package/dist/this.GUI.png +0 -0
- package/nodes/overall approach.md +93 -0
- package/notes/Proyect.md +109 -0
- package/package.json +71 -53
- package/public/GUI.png +0 -0
- package/public/GUI2.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/this.GUI.png +0 -0
- package/src/components/generics/Cards/Gridme.jsx +52 -0
- package/src/components/generics/Cards/LilBox.jsx +65 -0
- package/src/components/generics/Cards/ModuleCard.jsx +106 -0
- package/src/components/generics/Chats/FullChatBot.jsx +223 -0
- package/src/components/generics/Code/CodeBlock.jsx +33 -0
- package/src/components/generics/Feedback/Callout.jsx +92 -0
- package/src/components/generics/Layout/GridX.jsx +29 -0
- package/src/components/generics/Layout/Hero2.jsx +132 -0
- package/src/components/generics/Layout/PageContainer.jsx +29 -0
- package/src/components/generics/Layout/PageDivider.jsx +20 -0
- package/src/components/generics/Layout/Section.jsx +43 -0
- package/src/components/generics/Layout/SectionHeader.jsx +21 -0
- package/src/components/generics/Media/Img.jsx +58 -0
- package/src/components/generics/Media/VideoEmbed.jsx +51 -0
- package/src/components/generics/Organization/TableOfContents.jsx +51 -0
- package/src/components/generics/Organization/Tabs.jsx +45 -0
- package/src/components/generics/Text/TextList.jsx +41 -0
- package/src/components/generics/Text/TextParagraph.jsx +28 -0
- package/src/components/generics/Text/TextQuote.jsx +23 -0
- package/src/components/generics/Text/TextTitle.jsx +44 -0
- package/src/components/this.me/MeActive.jsx +24 -0
- package/src/components/this.me/MeFloating.jsx +183 -0
- package/src/components/this.me/MeInactive.jsx +21 -0
- package/src/components/this.me/MeListUs.jsx +40 -0
- package/src/components/this.me/MeState.jsx +25 -0
- package/src/components/this.me/hooks/useMe.js +43 -0
- package/src/context/GuiProvider.tsx +243 -0
- package/src/gui/atoms/AppBar/AppBar.resolver.tsx +77 -0
- package/src/gui/atoms/AppBar/AppBar.stories.tsx +232 -0
- package/src/gui/atoms/AppBar/AppBar.tsx +10 -0
- package/src/gui/atoms/Box/Box.resolver.tsx +171 -0
- package/src/gui/atoms/Box/Box.stories.tsx +271 -0
- package/src/gui/atoms/Box/Box.tsx +15 -0
- package/src/gui/atoms/Button/Button.resolver.tsx +98 -0
- package/src/gui/atoms/Button/Button.stories.tsx +225 -0
- package/src/gui/atoms/Button/Button.tsx +40 -0
- package/src/gui/atoms/Collapse/Collapse.resolver.tsx +85 -0
- package/src/gui/atoms/Collapse/Collapse.stories.tsx +136 -0
- package/src/gui/atoms/Collapse/Collapse.tsx +17 -0
- package/src/gui/atoms/Divider/Divider.resolver.tsx +95 -0
- package/src/gui/atoms/Divider/Divider.stories.tsx +109 -0
- package/src/gui/atoms/Divider/Divider.tsx +14 -0
- package/src/gui/atoms/Drawer/Drawer.resolver.tsx +116 -0
- package/src/gui/atoms/Drawer/Drawer.stories.tsx +229 -0
- package/src/gui/atoms/Drawer/Drawer.tsx +8 -0
- package/src/gui/atoms/IconButton/IconButton.resolver.tsx +135 -0
- package/src/gui/atoms/IconButton/IconButton.stories.tsx +141 -0
- package/src/gui/atoms/IconButton/IconButton.tsx +22 -0
- package/src/gui/atoms/Link/Link.resolver.tsx +75 -0
- package/src/gui/atoms/Link/Link.stories.tsx +164 -0
- package/src/gui/atoms/Link/Link.tsx +14 -0
- package/src/gui/atoms/List/List.resolver.tsx +95 -0
- package/src/gui/atoms/List/List.stories.tsx +143 -0
- package/src/gui/atoms/List/List.tsx +20 -0
- package/src/gui/atoms/ListItem/ListItem.resolver.tsx +88 -0
- package/src/gui/atoms/ListItem/ListItem.stories.tsx +157 -0
- package/src/gui/atoms/ListItem/ListItem.tsx +19 -0
- package/src/gui/atoms/ListItemButton/ListItemButton.resolver.tsx +208 -0
- package/src/gui/atoms/ListItemButton/ListItemButton.stories.tsx +161 -0
- package/src/gui/atoms/ListItemButton/ListItemButton.tsx +15 -0
- package/src/gui/atoms/ListItemIcon/ListItemIcon.resolver.tsx +102 -0
- package/src/gui/atoms/ListItemIcon/ListItemIcon.stories.tsx +135 -0
- package/src/gui/atoms/ListItemIcon/ListItemIcon.tsx +11 -0
- package/src/gui/atoms/ListItemText/ListItemText.resolver.tsx +112 -0
- package/src/gui/atoms/ListItemText/ListItemText.stories.tsx +162 -0
- package/src/gui/atoms/ListItemText/ListItemText.tsx +15 -0
- package/src/gui/atoms/Menu/Menu.resolver.tsx +112 -0
- package/src/gui/atoms/Menu/Menu.stories.tsx +168 -0
- package/src/gui/atoms/Menu/Menu.tsx +17 -0
- package/src/gui/atoms/MenuItem/MenuItem.resolver.tsx +183 -0
- package/src/gui/atoms/MenuItem/MenuItem.stories.tsx +138 -0
- package/src/gui/atoms/MenuItem/MenuItem.tsx +14 -0
- package/src/gui/atoms/Paper/Paper.resolver.tsx +98 -0
- package/src/gui/atoms/Paper/Paper.stories.tsx +191 -0
- package/src/gui/atoms/Paper/Paper.tsx +17 -0
- package/src/gui/atoms/Stack/Stack.resolver.tsx +94 -0
- package/src/gui/atoms/Stack/Stack.stories.tsx +166 -0
- package/src/gui/atoms/Stack/Stack.tsx +15 -0
- package/src/gui/atoms/Switch/Switch.resolver.tsx +53 -0
- package/src/gui/atoms/Switch/Switch.stories.tsx +242 -0
- package/src/gui/atoms/Switch/Switch.tsx +22 -0
- package/src/gui/atoms/Toolbar/Toolbar.resolver.tsx +60 -0
- package/src/gui/atoms/Toolbar/Toolbar.stories.tsx +163 -0
- package/src/gui/atoms/Toolbar/Toolbar.tsx +16 -0
- package/src/gui/atoms/Tooltip/Tooltip.resolver.tsx +142 -0
- package/src/gui/atoms/Tooltip/Tooltip.stories.tsx +118 -0
- package/src/gui/atoms/Tooltip/Tooltip.tsx +78 -0
- package/src/gui/atoms/Typography/Typography.resolver.tsx +158 -0
- package/src/gui/atoms/Typography/Typography.stories.tsx +228 -0
- package/src/gui/atoms/Typography/Typography.tsx +27 -0
- package/src/gui/atoms.tsx +129 -0
- package/src/gui/index.ts +69 -0
- package/src/gui/molecules/AppBars/Footer/Footer.resolver.tsx +104 -0
- package/src/gui/molecules/AppBars/Footer/Footer.stories.tsx +499 -0
- package/src/gui/molecules/AppBars/Footer/Footer.tsx +307 -0
- package/src/gui/molecules/AppBars/LeftSidebar/LeftSidebar.resolver.tsx +75 -0
- package/src/gui/molecules/AppBars/LeftSidebar/LeftSidebar.stories.tsx +61 -0
- package/src/gui/molecules/AppBars/LeftSidebar/LeftSidebar.tsx +511 -0
- package/src/gui/molecules/AppBars/LeftSidebar/SidebarToggleButton.tsx +51 -0
- package/src/gui/molecules/AppBars/RightSidebar/RightSidebar.resolver.tsx +97 -0
- package/src/gui/molecules/AppBars/RightSidebar/RightSidebar.stories.tsx +294 -0
- package/src/gui/molecules/AppBars/RightSidebar/RightSidebar.tsx +295 -0
- package/src/gui/molecules/AppBars/StickyOptions/StickyOptionsTop.stories.tsx +480 -0
- package/src/gui/molecules/AppBars/StickyOptions/StickyOptionsTop.tsx +484 -0
- package/src/gui/molecules/AppBars/TopBar/TopBar.resolver.tsx +84 -0
- package/src/gui/molecules/AppBars/TopBar/TopBar.stories.tsx +297 -0
- package/src/gui/molecules/AppBars/TopBar/TopBar.tsx +299 -0
- package/src/gui/molecules/Utilities/ThemeModeToggle/ThemeModeToggle.resolver.tsx +72 -0
- package/src/gui/molecules/Utilities/ThemeModeToggle/ThemeModeToggle.stories.tsx +154 -0
- package/src/gui/molecules/Utilities/ThemeModeToggle/ThemeModeToggle.tsx +100 -0
- package/src/gui/molecules/Utilities/ThemeSelector.jsx +281 -0
- package/src/gui/utils/nodeID.ts +8 -0
- package/src/index.js +111 -0
- package/src/registry/GuiRegistry.ts +19 -0
- package/src/registry/factory.ts +12 -0
- package/src/registry/index.ts +3 -0
- package/src/registry/types.ts +6 -0
- package/src/stories/01.Home.mdx +22 -0
- package/src/stories/02.Understanding.This.GUI.md +149 -0
- package/src/stories/03.Themes.mdx +235 -0
- package/src/stories/04.GuiProvider.md +126 -0
- package/src/stories/04.GuiProvider.mdx +129 -0
- package/src/stories/Theme/BreakPointsAndGrids.stories.jsx +185 -0
- package/src/stories/Theme/Colors.stories.jsx +245 -0
- package/src/stories/Theme/Icons.stories.jsx +313 -0
- package/src/stories/Theme/Motion.stories.jsx +206 -0
- package/src/stories/Theme/ShadowAndElevation.stories.jsx +95 -0
- package/src/stories/Theme/SpacingAndRadius.stories.jsx +129 -0
- package/src/stories/Theme/Typography.stories.jsx +211 -0
- package/src/stories/assets/this.GUI.png +0 -0
- package/src/templates/BrowserExtension.jsx +56 -0
- package/src/templates/Layout.tsx +36 -0
- package/src/templates/Minimal.jsx +123 -0
- package/src/templates/Shell/Shell.jsx +107 -0
- package/src/themes/fromTokens.ts +352 -0
- package/src/themes/icons/Icon.tsx +137 -0
- package/src/themes/icons/packs/Lucide.ts +72 -0
- package/src/themes/icons/packs/Material.ts +87 -0
- package/src/themes/icons/registry.tsx +178 -0
- package/src/themes/index.js +116 -0
- package/src/themes/theme.d.ts +116 -0
- package/src/themes/tokens/global.tokens.json +107 -0
- package/src/themes/tokens/neurons/dark.tokens.json +45 -0
- package/src/themes/tokens/neurons/light.tokens.json +51 -0
- package/src/themes/tokens/neurons/manifest.json +23 -0
- package/src/types/theme.d.ts +32 -0
- package/src/types/viewport.ts +132 -0
- package/tsconfig.json +24 -0
- package/vite.config.js +74 -0
- package/dist/style.css +0 -1
- package/src/App.jsx +0 -63
- package/src/MdxProvider.jsx +0 -20
- package/src/Page.jsx +0 -28
- package/src/SiteBuilder.jsx +0 -39
- package/src/example.json +0 -43
- package/src/index.mdx +0 -164
- package/src/main.jsx +0 -15
- package/src/scripts/ComponentRegistry.js +0 -70
- package/src/scripts/logASCIIArt.js +0 -12
- package/src/scripts/postinstall.js +0 -100
- package/src/scripts/renderComponents.js +0 -11
- package/src/stories/Atoms/Alert/Alert.css +0 -211
- package/src/stories/Atoms/Alert/Alert.jsx +0 -56
- package/src/stories/Atoms/Alert/Alert.stories.jsx +0 -167
- package/src/stories/Atoms/Audio/Audio.css +0 -259
- package/src/stories/Atoms/Audio/Audio.jsx +0 -216
- package/src/stories/Atoms/Audio/Audio.stories.jsx +0 -191
- package/src/stories/Atoms/Badge/Badge.css +0 -249
- package/src/stories/Atoms/Badge/Badge.jsx +0 -54
- package/src/stories/Atoms/Badge/Badge.stories.jsx +0 -121
- package/src/stories/Atoms/Button/Button.css +0 -131
- package/src/stories/Atoms/Button/Button.jsx +0 -47
- package/src/stories/Atoms/Button/Button.stories.jsx +0 -184
- package/src/stories/Atoms/Caption/Caption.css +0 -169
- package/src/stories/Atoms/Caption/Caption.jsx +0 -72
- package/src/stories/Atoms/Caption/Caption.stories.jsx +0 -207
- package/src/stories/Atoms/Checkbox/Checkbox.css +0 -182
- package/src/stories/Atoms/Checkbox/Checkbox.jsx +0 -83
- package/src/stories/Atoms/Checkbox/Checkbox.stories.jsx +0 -112
- package/src/stories/Atoms/Container/Container.css +0 -89
- package/src/stories/Atoms/Container/Container.jsx +0 -54
- package/src/stories/Atoms/Container/Container.stories.jsx +0 -104
- package/src/stories/Atoms/Divider/Divider.css +0 -147
- package/src/stories/Atoms/Divider/Divider.jsx +0 -62
- package/src/stories/Atoms/Divider/Divider.stories.jsx +0 -105
- package/src/stories/Atoms/Grid/Grid.css +0 -160
- package/src/stories/Atoms/Grid/Grid.jsx +0 -43
- package/src/stories/Atoms/Grid/Grid.stories.jsx +0 -84
- package/src/stories/Atoms/Heading/Heading.css +0 -112
- package/src/stories/Atoms/Heading/Heading.jsx +0 -69
- package/src/stories/Atoms/Heading/Heading.stories.jsx +0 -130
- package/src/stories/Atoms/Icon/Icon.css +0 -240
- package/src/stories/Atoms/Icon/Icon.jsx +0 -80
- package/src/stories/Atoms/Icon/Icon.stories.jsx +0 -177
- package/src/stories/Atoms/Image/Image.css +0 -245
- package/src/stories/Atoms/Image/Image.jsx +0 -175
- package/src/stories/Atoms/Image/Image.stories.jsx +0 -332
- package/src/stories/Atoms/Label/Label.css +0 -171
- package/src/stories/Atoms/Label/Label.jsx +0 -71
- package/src/stories/Atoms/Label/Label.stories.jsx +0 -180
- package/src/stories/Atoms/Link/Link.css +0 -71
- package/src/stories/Atoms/Link/Link.jsx +0 -82
- package/src/stories/Atoms/Link/Link.stories.jsx +0 -153
- package/src/stories/Atoms/Loader/Loader.css +0 -106
- package/src/stories/Atoms/Loader/Loader.jsx +0 -58
- package/src/stories/Atoms/Loader/Loader.stories.jsx +0 -99
- package/src/stories/Atoms/Logo/Logo.css +0 -94
- package/src/stories/Atoms/Logo/Logo.jsx +0 -53
- package/src/stories/Atoms/Logo/Logo.stories.jsx +0 -120
- package/src/stories/Atoms/Paragraph/Paragraph.css +0 -180
- package/src/stories/Atoms/Paragraph/Paragraph.jsx +0 -77
- package/src/stories/Atoms/Paragraph/Paragraph.stories.jsx +0 -143
- package/src/stories/Atoms/ProgressBar/ProgressBar.css +0 -127
- package/src/stories/Atoms/ProgressBar/ProgressBar.jsx +0 -40
- package/src/stories/Atoms/ProgressBar/ProgressBar.stories.jsx +0 -86
- package/src/stories/Atoms/RadioButton/RadioButton.css +0 -130
- package/src/stories/Atoms/RadioButton/RadioButton.jsx +0 -87
- package/src/stories/Atoms/RadioButton/RadioButton.stories.jsx +0 -113
- package/src/stories/Atoms/Range/Range.css +0 -169
- package/src/stories/Atoms/Range/Range.jsx +0 -87
- package/src/stories/Atoms/Range/Range.stories.jsx +0 -110
- package/src/stories/Atoms/Section/Section.css +0 -268
- package/src/stories/Atoms/Section/Section.jsx +0 -63
- package/src/stories/Atoms/Section/Section.stories.jsx +0 -46
- package/src/stories/Atoms/Select/Select.css +0 -87
- package/src/stories/Atoms/Select/Select.jsx +0 -73
- package/src/stories/Atoms/Select/Select.stories.jsx +0 -109
- package/src/stories/Atoms/Slider/Slider.css +0 -90
- package/src/stories/Atoms/Slider/Slider.jsx +0 -129
- package/src/stories/Atoms/Slider/Slider.stories.jsx +0 -90
- package/src/stories/Atoms/Snackbar/Snackbar.css +0 -313
- package/src/stories/Atoms/Snackbar/Snackbar.jsx +0 -72
- package/src/stories/Atoms/Snackbar/Snackbar.stories.jsx +0 -78
- package/src/stories/Atoms/Spacer/Spacer.css +0 -114
- package/src/stories/Atoms/Spacer/Spacer.jsx +0 -35
- package/src/stories/Atoms/Spacer/Spacer.stories.jsx +0 -61
- package/src/stories/Atoms/Spinner/Spinner.css +0 -110
- package/src/stories/Atoms/Spinner/Spinner.jsx +0 -65
- package/src/stories/Atoms/Spinner/Spinner.stories.jsx +0 -58
- package/src/stories/Atoms/Tag/Tag.css +0 -112
- package/src/stories/Atoms/Tag/Tag.jsx +0 -75
- package/src/stories/Atoms/Tag/Tag.stories.jsx +0 -67
- package/src/stories/Atoms/TextArea/TextArea.css +0 -99
- package/src/stories/Atoms/TextArea/TextArea.jsx +0 -118
- package/src/stories/Atoms/TextArea/TextArea.stories.jsx +0 -36
- package/src/stories/Atoms/TextInput/TextInput.css +0 -102
- package/src/stories/Atoms/TextInput/TextInput.jsx +0 -133
- package/src/stories/Atoms/TextInput/TextInput.stories.jsx +0 -69
- package/src/stories/Atoms/Toggle/Toggle.css +0 -118
- package/src/stories/Atoms/Toggle/Toggle.jsx +0 -69
- package/src/stories/Atoms/Toggle/Toggle.stories.jsx +0 -35
- package/src/stories/Atoms/Tooltip/Tooltip.css +0 -383
- package/src/stories/Atoms/Tooltip/Tooltip.jsx +0 -46
- package/src/stories/Atoms/Tooltip/Tooltip.stories.jsx +0 -52
- package/src/stories/Atoms/Video/Video.css +0 -39
- package/src/stories/Atoms/Video/Video.jsx +0 -78
- package/src/stories/Atoms/Video/Video.stories.jsx +0 -41
- package/src/stories/Atoms/index.js +0 -72
- package/src/stories/Atoms/meta_Atoms.js +0 -51
- package/src/stories/Components.js +0 -198
- package/src/stories/Getting Started.mdx +0 -239
- package/src/stories/Layouts/Accordion/Accordion.css +0 -293
- package/src/stories/Layouts/Accordion/Accordion.jsx +0 -74
- package/src/stories/Layouts/Accordion/Accordion.stories.jsx +0 -39
- package/src/stories/Layouts/Flexbox/Flexbox.css +0 -16
- package/src/stories/Layouts/Flexbox/Flexbox.jsx +0 -11
- package/src/stories/Layouts/Flexbox/Flexbox.stories.jsx +0 -28
- package/src/stories/Layouts/Footer/Footer.css +0 -16
- package/src/stories/Layouts/Footer/Footer.jsx +0 -31
- package/src/stories/Layouts/Footer/Footer.stories.jsx +0 -28
- package/src/stories/Layouts/Header/Header.css +0 -16
- package/src/stories/Layouts/Header/Header.jsx +0 -31
- package/src/stories/Layouts/Header/Header.stories.jsx +0 -28
- package/src/stories/Layouts/HeroBanner/HeroBanner.css +0 -16
- package/src/stories/Layouts/HeroBanner/HeroBanner.jsx +0 -31
- package/src/stories/Layouts/HeroBanner/HeroBanner.stories.jsx +0 -28
- package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.css +0 -16
- package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.jsx +0 -31
- package/src/stories/Layouts/HeroImageVideo/HeroImageVideo.stories.jsx +0 -28
- package/src/stories/Layouts/Pagination/Pagination.css +0 -16
- package/src/stories/Layouts/Pagination/Pagination.jsx +0 -31
- package/src/stories/Layouts/Pagination/Pagination.stories.jsx +0 -28
- package/src/stories/Layouts/Sidebar/Sidebar.css +0 -16
- package/src/stories/Layouts/Sidebar/Sidebar.jsx +0 -71
- package/src/stories/Layouts/Sidebar/Sidebar.stories.jsx +0 -28
- package/src/stories/Layouts/Tabs/Tabs.css +0 -16
- package/src/stories/Layouts/Tabs/Tabs.jsx +0 -31
- package/src/stories/Layouts/Tabs/Tabs.stories.jsx +0 -28
- package/src/stories/Layouts/index.js +0 -25
- package/src/stories/Layouts/meta_Layouts.js +0 -28
- package/src/stories/MDX.mdx +0 -118
- package/src/stories/Miscellaneous/Miscellaneous.js +0 -24
- package/src/stories/Molecules/Accordion/Accordion.css +0 -4
- package/src/stories/Molecules/Accordion/Accordion.jsx +0 -25
- package/src/stories/Molecules/Accordion/Accordion.stories.jsx +0 -20
- package/src/stories/Molecules/AudioPlayer/AudioPlayer.css +0 -97
- package/src/stories/Molecules/AudioPlayer/AudioPlayer.jsx +0 -244
- package/src/stories/Molecules/AudioPlayer/AudioPlayer.stories.jsx +0 -55
- package/src/stories/Molecules/AvatarWithName/AvatarWithName.css +0 -130
- package/src/stories/Molecules/AvatarWithName/AvatarWithName.jsx +0 -80
- package/src/stories/Molecules/AvatarWithName/AvatarWithName.stories.jsx +0 -20
- package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.css +0 -147
- package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.jsx +0 -51
- package/src/stories/Molecules/Breadcrumbs/Breadcrumbs.stories.jsx +0 -36
- package/src/stories/Molecules/ButtonGroup/ButtonGroup.css +0 -465
- package/src/stories/Molecules/ButtonGroup/ButtonGroup.jsx +0 -47
- package/src/stories/Molecules/ButtonGroup/ButtonGroup.stories.jsx +0 -44
- package/src/stories/Molecules/Card/Card.css +0 -41
- package/src/stories/Molecules/Card/Card.jsx +0 -92
- package/src/stories/Molecules/Card/Card.stories.jsx +0 -34
- package/src/stories/Molecules/ComparisonTable/ComparisonTable.css +0 -35
- package/src/stories/Molecules/ComparisonTable/ComparisonTable.jsx +0 -104
- package/src/stories/Molecules/ComparisonTable/ComparisonTable.stories.jsx +0 -81
- package/src/stories/Molecules/DataTable/DataTable.css +0 -4
- package/src/stories/Molecules/DataTable/DataTable.jsx +0 -25
- package/src/stories/Molecules/DataTable/DataTable.stories.jsx +0 -20
- package/src/stories/Molecules/Dropdown/Dropdown.css +0 -192
- package/src/stories/Molecules/Dropdown/Dropdown.jsx +0 -96
- package/src/stories/Molecules/Dropdown/Dropdown.stories.jsx +0 -45
- package/src/stories/Molecules/FileUpload/FileUpload.css +0 -4
- package/src/stories/Molecules/FileUpload/FileUpload.jsx +0 -25
- package/src/stories/Molecules/FileUpload/FileUpload.stories.jsx +0 -20
- package/src/stories/Molecules/FormField/FormField.css +0 -4
- package/src/stories/Molecules/FormField/FormField.jsx +0 -25
- package/src/stories/Molecules/FormField/FormField.stories.jsx +0 -20
- package/src/stories/Molecules/Header/Header.css +0 -35
- package/src/stories/Molecules/Header/Header.jsx +0 -76
- package/src/stories/Molecules/Header/Header.stories.jsx +0 -28
- package/src/stories/Molecules/IconButton/IconButton.css +0 -4
- package/src/stories/Molecules/IconButton/IconButton.jsx +0 -25
- package/src/stories/Molecules/IconButton/IconButton.stories.jsx +0 -20
- package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.css +0 -4
- package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.jsx +0 -25
- package/src/stories/Molecules/ImageWithCaption/ImageWithCaption.stories.jsx +0 -20
- package/src/stories/Molecules/InputGroup/InputGroup.css +0 -4
- package/src/stories/Molecules/InputGroup/InputGroup.jsx +0 -25
- package/src/stories/Molecules/InputGroup/InputGroup.stories.jsx +0 -20
- package/src/stories/Molecules/InputWithLabel/InputWithLabel.css +0 -4
- package/src/stories/Molecules/InputWithLabel/InputWithLabel.jsx +0 -25
- package/src/stories/Molecules/InputWithLabel/InputWithLabel.stories.jsx +0 -20
- package/src/stories/Molecules/List/List.css +0 -4
- package/src/stories/Molecules/List/List.jsx +0 -25
- package/src/stories/Molecules/List/List.stories.jsx +0 -20
- package/src/stories/Molecules/MediaCard/MediaCard.css +0 -4
- package/src/stories/Molecules/MediaCard/MediaCard.jsx +0 -25
- package/src/stories/Molecules/MediaCard/MediaCard.stories.jsx +0 -20
- package/src/stories/Molecules/Modal/Modal.css +0 -4
- package/src/stories/Molecules/Modal/Modal.jsx +0 -25
- package/src/stories/Molecules/Modal/Modal.stories.jsx +0 -20
- package/src/stories/Molecules/Navbar/Navbar.css +0 -91
- package/src/stories/Molecules/Navbar/Navbar.jsx +0 -82
- package/src/stories/Molecules/Navbar/Navbar.stories.jsx +0 -70
- package/src/stories/Molecules/Notification/Notification.css +0 -4
- package/src/stories/Molecules/Notification/Notification.jsx +0 -25
- package/src/stories/Molecules/Notification/Notification.stories.jsx +0 -20
- package/src/stories/Molecules/PricingTable/PricingTable.css +0 -4
- package/src/stories/Molecules/PricingTable/PricingTable.jsx +0 -25
- package/src/stories/Molecules/PricingTable/PricingTable.stories.jsx +0 -20
- package/src/stories/Molecules/SearchBar/SearchBar.css +0 -69
- package/src/stories/Molecules/SearchBar/SearchBar.jsx +0 -73
- package/src/stories/Molecules/SearchBar/SearchBar.stories.jsx +0 -29
- package/src/stories/Molecules/SelectTheme/SelectTheme.css +0 -25
- package/src/stories/Molecules/SelectTheme/SelectTheme.jsx +0 -22
- package/src/stories/Molecules/SelectTheme/SelectTheme.stories.jsx +0 -24
- package/src/stories/Molecules/Sidebar/Sidebar.css +0 -67
- package/src/stories/Molecules/Sidebar/Sidebar.jsx +0 -80
- package/src/stories/Molecules/Sidebar/Sidebar.stories.jsx +0 -35
- package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.css +0 -4
- package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.jsx +0 -25
- package/src/stories/Molecules/VideoWithDescription/VideoWithDescription.stories.jsx +0 -20
- package/src/stories/Molecules/index.js +0 -58
- package/src/stories/Molecules/meta_Molecules.js +0 -47
- package/src/stories/Organisms/Profile/UserFriends/UserFriends.context.jsx +0 -15
- package/src/stories/Organisms/Profile/UserFriends/UserFriends.css +0 -4
- package/src/stories/Organisms/Profile/UserFriends/UserFriends.jsx +0 -13
- package/src/stories/Organisms/Profile/UserFriends/UserFriends.stories.jsx +0 -26
- package/src/stories/Organisms/Profile/UserPosts/UserPosts.context.jsx +0 -15
- package/src/stories/Organisms/Profile/UserPosts/UserPosts.css +0 -4
- package/src/stories/Organisms/Profile/UserPosts/UserPosts.jsx +0 -13
- package/src/stories/Organisms/Profile/UserPosts/UserPosts.stories.jsx +0 -26
- package/src/stories/Organisms/Profile/UserProfile/UserProfile.context.jsx +0 -15
- package/src/stories/Organisms/Profile/UserProfile/UserProfile.css +0 -4
- package/src/stories/Organisms/Profile/UserProfile/UserProfile.jsx +0 -13
- package/src/stories/Organisms/Profile/UserProfile/UserProfile.stories.jsx +0 -26
- package/src/stories/Organisms/meta_Organisms.js +0 -39
- package/src/stories/Pages/Page/Page.css +0 -69
- package/src/stories/Pages/Page/Page.jsx +0 -69
- package/src/stories/Pages/Page/Page.stories.js +0 -26
- package/src/stories/Pages/Page/Pages.js +0 -31
- package/src/stories/Templates/AdminDashboard/AdminDashboard.css +0 -7
- package/src/stories/Templates/AdminDashboard/AdminDashboard.jsx +0 -24
- package/src/stories/Templates/AdminDashboard/AdminDashboard.stories.jsx +0 -20
- package/src/stories/Templates/CallToAction/CallToAction.css +0 -7
- package/src/stories/Templates/CallToAction/CallToAction.jsx +0 -24
- package/src/stories/Templates/CallToAction/CallToAction.stories.jsx +0 -20
- package/src/stories/Templates/FeaturesList/FeaturesList.css +0 -7
- package/src/stories/Templates/FeaturesList/FeaturesList.jsx +0 -24
- package/src/stories/Templates/FeaturesList/FeaturesList.stories.jsx +0 -20
- package/src/stories/Templates/FormSection/FormSection.css +0 -7
- package/src/stories/Templates/FormSection/FormSection.jsx +0 -24
- package/src/stories/Templates/FormSection/FormSection.stories.jsx +0 -20
- package/src/stories/Templates/HeroSection/HeroSection.css +0 -7
- package/src/stories/Templates/HeroSection/HeroSection.jsx +0 -24
- package/src/stories/Templates/HeroSection/HeroSection.stories.jsx +0 -20
- package/src/stories/Templates/LocationInfo/LocationInfo.css +0 -7
- package/src/stories/Templates/LocationInfo/LocationInfo.jsx +0 -24
- package/src/stories/Templates/LocationInfo/LocationInfo.stories.jsx +0 -20
- package/src/stories/Templates/ProductPage/ProductPage.css +0 -7
- package/src/stories/Templates/ProductPage/ProductPage.jsx +0 -24
- package/src/stories/Templates/ProductPage/ProductPage.stories.jsx +0 -20
- package/src/stories/Templates/RegistrationPage/RegistrationPage.css +0 -7
- package/src/stories/Templates/RegistrationPage/RegistrationPage.jsx +0 -24
- package/src/stories/Templates/RegistrationPage/RegistrationPage.stories.jsx +0 -20
- package/src/stories/Templates/ShoppingCart/ShoppingCart.css +0 -7
- package/src/stories/Templates/ShoppingCart/ShoppingCart.jsx +0 -24
- package/src/stories/Templates/ShoppingCart/ShoppingCart.stories.jsx +0 -20
- package/src/stories/Templates/SidebarTopNav/SidebarTopNav.css +0 -7
- package/src/stories/Templates/SidebarTopNav/SidebarTopNav.jsx +0 -24
- package/src/stories/Templates/SidebarTopNav/SidebarTopNav.stories.jsx +0 -20
- package/src/stories/Templates/SignInPage/SignInPage.css +0 -7
- package/src/stories/Templates/SignInPage/SignInPage.jsx +0 -24
- package/src/stories/Templates/SignInPage/SignInPage.stories.jsx +0 -20
- package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.css +0 -7
- package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.jsx +0 -24
- package/src/stories/Templates/SocialMediaLinks/SocialMediaLinks.stories.jsx +0 -20
- package/src/stories/Templates/Testimonials/Testimonials.css +0 -7
- package/src/stories/Templates/Testimonials/Testimonials.jsx +0 -24
- package/src/stories/Templates/Testimonials/Testimonials.stories.jsx +0 -20
- package/src/stories/Templates/index.js +0 -33
- package/src/stories/Templates/meta_Templates.js +0 -29
- package/src/stories/assets/accessibility.png +0 -0
- package/src/stories/assets/accessibility.svg +0 -1
- package/src/stories/assets/addon-library.png +0 -0
- package/src/stories/assets/assets.png +0 -0
- package/src/stories/assets/avif-test-image.avif +0 -0
- package/src/stories/assets/context.png +0 -0
- package/src/stories/assets/discord.svg +0 -1
- package/src/stories/assets/docs.png +0 -0
- package/src/stories/assets/figma-plugin.png +0 -0
- package/src/stories/assets/github.svg +0 -1
- package/src/stories/assets/logo.png +0 -0
- package/src/stories/assets/logo.svg +0 -106
- package/src/stories/assets/share.png +0 -0
- package/src/stories/assets/styling.png +0 -0
- package/src/stories/assets/test.svg +0 -3
- package/src/stories/assets/testing.png +0 -0
- package/src/stories/assets/theming.png +0 -0
- package/src/stories/assets/tutorials.svg +0 -1
- package/src/stories/assets/youtube.svg +0 -1
- package/src/themes/README_Styles.md +0 -301
- package/src/themes/ThemeProvider.jsx +0 -61
- package/src/themes/styles/github/dark.css +0 -0
- package/src/themes/styles/github/light.css +0 -0
- package/src/themes/styles/neurons/dark.css +0 -247
- package/src/themes/styles/neurons/light.css +0 -280
- /package/{src/themes/styles/dracula/dark.css → .storybook/preview-head.html} +0 -0
- /package/src/{themes/styles/dracula/light.css → components/this.me/MeCard.jsx} +0 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
export type RegistryEntry = {
|
|
3
|
+
type: string;
|
|
4
|
+
resolve: (spec: any, ctx?: ResolveCtx) => React.ReactElement | null;};
|
|
5
|
+
export type GuiRegistry = Record<string, RegistryEntry>;
|
|
6
|
+
export type ResolveCtx = { theme?: any; [key: string]: any };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<div
|
|
2
|
+
style={{
|
|
3
|
+
display: 'flex',
|
|
4
|
+
flexDirection: 'column',
|
|
5
|
+
alignItems: 'center',
|
|
6
|
+
justifyContent: 'center',
|
|
7
|
+
minHeight: '70vh',
|
|
8
|
+
background: 'var(--gui-bg-default)',
|
|
9
|
+
color: 'var(--gui-text-primary)',
|
|
10
|
+
padding: '40px',
|
|
11
|
+
}}
|
|
12
|
+
>
|
|
13
|
+
<img
|
|
14
|
+
src="/this.GUI.png"
|
|
15
|
+
alt="This.GUI"
|
|
16
|
+
style={{ width: '300px', height: 'auto', imageRendering: 'auto', marginBottom: '10px', marginTop: '-34px' }}
|
|
17
|
+
/>
|
|
18
|
+
<h1 style={{ fontSize: '4rem', margin: '0 0 5px 0' }}>.GUI</h1>
|
|
19
|
+
<p style={{ maxWidth: '600px', textAlign: 'center', fontSize: '1.2rem', lineHeight: '1.3', marginTop: '-8px' }}>
|
|
20
|
+
A collection of components and building blocks for the neurons.me environment, enabling declarative GUI generation powered by AI.
|
|
21
|
+
</p>
|
|
22
|
+
</div>
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Declarative GUI with `this.GUI`
|
|
2
|
+
`this.GUI` is designed as a **declarative layout system**, where all building blocks (NavBar, Drawers, StickyOptions, Footer) expose **clear JSON-friendly props**.
|
|
3
|
+
This **allows UIs to be described** and even generated by tools like **LLMs**, using nothing more than structured data.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🔑 Core Idea
|
|
8
|
+
- Every component exposes a **schema-like props API**.
|
|
9
|
+
- Layout respects **insets** (nav height, drawer widths) reported into the theme via `CustomThemeProvider`.
|
|
10
|
+
- The provider also mirrors these values into CSS variables (`--gui-inset-left`, `--gui-inset-right`, `--gui-nav-height`).
|
|
11
|
+
- With this contract, GUIs can be built from **JSON specs** instead of imperative React code.
|
|
12
|
+
|
|
13
|
+
Example JSON spec:
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"route": "/dashboard",
|
|
18
|
+
"layout": {
|
|
19
|
+
"navbar": { "title": "Dashboard", "position": "fixed" },
|
|
20
|
+
"stickyOptions": {
|
|
21
|
+
"items": [
|
|
22
|
+
{ "icon": "mui:BarChart", "label": "Stats", "href": "/stats" },
|
|
23
|
+
{ "icon": "lucide:bolt", "label": "Power", "href": "/power" }
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"drawerLeft": { "title": "Menu", "items": [...] },
|
|
27
|
+
"drawerRight": { "title": "Context", "items": [...] },
|
|
28
|
+
"footer": { "text": "© 2025 neurons.me" }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
Your renderer simply hydrates this into React components.
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 📦 Components
|
|
38
|
+
|
|
39
|
+
### NavBar
|
|
40
|
+
|
|
41
|
+
**Props:**
|
|
42
|
+
- `title`: string
|
|
43
|
+
- `logo`: string (URL)
|
|
44
|
+
- `NavBarLinks`: array of `{ label, href, icon?, children? }`
|
|
45
|
+
- `position`: `"fixed"` | `"static"` | `"sticky"` (default: `"fixed"`)
|
|
46
|
+
- `showMenuButton`, `showThemeToggle`
|
|
47
|
+
|
|
48
|
+
NavBar measures its height and updates `theme.layout.insets.nav`.
|
|
49
|
+
|
|
50
|
+
```jsx
|
|
51
|
+
<NavBar title="Demo" position="fixed" />
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
### LeftDrawer & RightDrawer
|
|
57
|
+
|
|
58
|
+
**Props:**
|
|
59
|
+
- `drawerWidth`: number (default: 260)
|
|
60
|
+
- `variant`: `"permanent"` | `"temporary"` (auto-chooses based on screen size)
|
|
61
|
+
- `title`: optional with label + icon
|
|
62
|
+
|
|
63
|
+
Each drawer updates `theme.layout.insets.left` or `theme.layout.insets.right` when permanent.
|
|
64
|
+
|
|
65
|
+
```jsx
|
|
66
|
+
<LeftDrawer title="Menu" items={[{ icon: 'mui:Home', label: 'Home' }]} />
|
|
67
|
+
<RightDrawer title="Context" items={[{ icon: 'mui:Info', label: 'Details' }]} />
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### StickyOptionsTop
|
|
73
|
+
|
|
74
|
+
Compact quick-actions bar that lives under the NavBar.
|
|
75
|
+
|
|
76
|
+
**Props:**
|
|
77
|
+
- `items`: actions `{ icon, label?, href?, iconColor?, variant? }`
|
|
78
|
+
- `positioning`: `{ mode: 'sticky' | 'fixed', topOffset, reserveSpace }`
|
|
79
|
+
- `mobileVariant`: `"auto"` | `"fab"` | `"inline"`
|
|
80
|
+
- `dense`: boolean
|
|
81
|
+
|
|
82
|
+
```jsx
|
|
83
|
+
<StickyOptionsTop
|
|
84
|
+
items={[
|
|
85
|
+
{ icon: 'mui:Settings', label: 'Settings', href: '/settings' },
|
|
86
|
+
{ icon: 'lucide:bolt', label: 'Power', href: '/power', iconColor: 'primary' }
|
|
87
|
+
]}
|
|
88
|
+
positioning={{ mode: 'sticky' }}
|
|
89
|
+
/>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### Footer
|
|
95
|
+
|
|
96
|
+
**Props:**
|
|
97
|
+
- `text`: string or ReactNode
|
|
98
|
+
- Automatically respects left/right insets from permanent drawers.
|
|
99
|
+
|
|
100
|
+
```jsx
|
|
101
|
+
<Footer text="© 2025 neurons.me" />
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 🌐 Why Declarative?
|
|
107
|
+
|
|
108
|
+
Every prop is JSON-serializable, so LLMs or external systems can generate full UIs declaratively:
|
|
109
|
+
- “Add a right drawer with a title and an insights icon”
|
|
110
|
+
- “Place a sticky options bar under the navbar with capture + settings”
|
|
111
|
+
- “On /reports, show the drawer and a compact navbar”
|
|
112
|
+
|
|
113
|
+
These map directly into JSON specs that your app hydrates into React.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 🚀 Benefits
|
|
118
|
+
- **Schema-driven:** easy to serialize, validate, and diff.
|
|
119
|
+
- **LLM-ready:** prompt-to-UI becomes natural.
|
|
120
|
+
- **Layout-safe:** insets keep everything aligned automatically.
|
|
121
|
+
- **Composable:** any route can declare its layout in one object.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Example: Full Route Layout
|
|
126
|
+
|
|
127
|
+
```jsx
|
|
128
|
+
<NavBar title="Dashboard" />
|
|
129
|
+
<LeftDrawer title="Menu" />
|
|
130
|
+
<StickyOptionsTop items={items} />
|
|
131
|
+
<PageContent />
|
|
132
|
+
<Footer text="© 2025 neurons.me" />
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Or as JSON:
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
{
|
|
139
|
+
"navbar": { "title": "Dashboard" },
|
|
140
|
+
"drawerLeft": { "title": "Menu" },
|
|
141
|
+
"stickyOptions": { "items": [ ... ] },
|
|
142
|
+
"footer": { "text": "© 2025 neurons.me" }
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
That’s the philosophy: declarative contracts for every GUI building block, so your UI can be described, generated, and remixed by humans, scripts, or LLMs.
|
|
148
|
+
---
|
|
149
|
+
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# This.GUI — Theme Engine (v2)
|
|
2
|
+
**Token‑first. Manifest‑driven.**
|
|
3
|
+
Compiles **JSON tokens** into an MUI theme at runtime. Each **theme** now has **modes** (typically `light` and `dark`) defined by a **manifest**; we also export **CSS variables** and coordinate **insets** (bars/drawers) via `GuiProvider`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## TL;DR
|
|
8
|
+
- **Tokens**: describe design values (colors, spacing, motion, …).
|
|
9
|
+
- **Manifest**: describes the *theme* (id, name, icon, modes and where their tokens live).
|
|
10
|
+
- **fromTokens**: `makeMuiTheme(globalTokens, modeTokens, mode)` produces an MUI theme.
|
|
11
|
+
- **getTheme**: builds a theme from `tokens`, from a `manifest`, or from **built‑ins**.
|
|
12
|
+
- **GuiProvider**: stores the active `family+mode`, injects **CSS vars** and coordinates **insets**.
|
|
13
|
+
- **Selector/Toggle**: UI to switch between `light`/`dark` of the active theme.
|
|
14
|
+
- **AppBar note**: MUI only supports `default | primary | secondary | transparent`. Other colors → use `sx`.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Recommended structure
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
src/themes/
|
|
22
|
+
tokens/
|
|
23
|
+
global.tokens.json # shared base (radius, spacing, motion…)
|
|
24
|
+
neurons/
|
|
25
|
+
manifest.json # describes the "neurons.me" theme
|
|
26
|
+
light.tokens.json # light‑mode tokens (values only, no metadata)
|
|
27
|
+
dark.tokens.json # dark‑mode tokens (values only, no metadata)
|
|
28
|
+
fromTokens.ts # compiler tokens → MUI theme
|
|
29
|
+
index.js # built‑in registry + public factories
|
|
30
|
+
theme.d.ts # optional DX types
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Manifest (what it is and what it contains)
|
|
34
|
+
- **Identity**: `id`, `name`, `description`, `author`, `version`, etc.
|
|
35
|
+
- **Where tokens are**: `modes.light.path` and `modes.dark.path`.
|
|
36
|
+
- **Theme icon**: `icon` (optional).
|
|
37
|
+
- Supported:
|
|
38
|
+
```ts
|
|
39
|
+
type ThemeIcon =
|
|
40
|
+
| { type: 'mui' | 'lucide'; value: string } // icon-set name
|
|
41
|
+
| { type: 'url'; value: string } // path to .svg/.png
|
|
42
|
+
| { type: 'svg'; value: string } // inline SVG
|
|
43
|
+
| { type: 'data'; value: string }; // data URI
|
|
44
|
+
```
|
|
45
|
+
- **Important**: we **no longer** keep `preview` or metadata inside token files; the preview is **derived** from the theme (e.g. `palette.background.default`, `palette.primary.main`, `palette.link.main`, etc.).
|
|
46
|
+
|
|
47
|
+
**Example `manifest.json`:**
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"id": "neurons.me",
|
|
51
|
+
"name": "neurons.me",
|
|
52
|
+
"description": "A modern, flexible theme for Neuroverse.",
|
|
53
|
+
"author": "suiGn",
|
|
54
|
+
"version": "1.0.0",
|
|
55
|
+
"license": "MIT",
|
|
56
|
+
"icon": { "type": "mui", "value": "Palette" },
|
|
57
|
+
"modes": {
|
|
58
|
+
"light": { "path": "./light.tokens.json" },
|
|
59
|
+
"dark": { "path": "./dark.tokens.json" }
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Tokens (what goes inside)
|
|
67
|
+
Token files contain **values only**. If you use Tokens Studio, keep the `{"$value": ...}` shape; the compiler understands it.
|
|
68
|
+
|
|
69
|
+
**Example `light.tokens.json` (trimmed):**
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"color": {
|
|
73
|
+
"primary": { "$value": "#0a3a42" },
|
|
74
|
+
"secondary": { "$value": "#e5396f" },
|
|
75
|
+
"icon": { "$value": "#5e5e5e" },
|
|
76
|
+
"bgDefault": { "$value": "#f8f9fa" },
|
|
77
|
+
"bgPaper": { "$value": "#ffffff" },
|
|
78
|
+
"bgNav": { "$value": "#fdfdfd" },
|
|
79
|
+
"textPrimary": { "$value": "#111111" },
|
|
80
|
+
"textSecondary": { "$value": "#444444" },
|
|
81
|
+
"link": { "$value": "#008c7d" },
|
|
82
|
+
"linkVisited": { "$value": "#006e64" },
|
|
83
|
+
"border": { "$value": "rgba(0,0,0,0.08)" }
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Compiler (`fromTokens.ts`)
|
|
91
|
+
**Primary API**
|
|
92
|
+
```ts
|
|
93
|
+
makeMuiTheme(globalTokens: any, modeTokens: any, mode: 'light'|'dark'): Theme
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
- Maps colors into `theme.palette`:
|
|
97
|
+
- `color.primary` → `palette.primary.main`
|
|
98
|
+
- `color.secondary` → `palette.secondary.main`
|
|
99
|
+
- `color.bgDefault` → `palette.background.default`
|
|
100
|
+
- `color.bgPaper` → `palette.background.paper`
|
|
101
|
+
- `color.bgNav` → `palette.background.nav` *(custom key)*
|
|
102
|
+
- `color.textPrimary` / `color.textSecondary` → `palette.text.*`
|
|
103
|
+
- `color.link` / `color.linkVisited` → `palette.link.*` *(custom key)*
|
|
104
|
+
- Semantic (`extendedColors.*`): `success`, `warning`, `error`, `info`
|
|
105
|
+
- Exposes **all** tokens again under `theme.custom.*` for a stable access surface.
|
|
106
|
+
- Builds `breakpoints`, `zIndex`, `typography`, `shadows`, `transitions`, etc.
|
|
107
|
+
- Injects **CSS variables** via `MuiCssBaseline`:
|
|
108
|
+
- `--gui-primary`, `--gui-secondary`, `--gui-bg-default`, `--gui-bg-paper`,
|
|
109
|
+
`--gui-bg-nav`, `--gui-text-primary`, `--gui-text-secondary`,
|
|
110
|
+
`--gui-link`, `--gui-link-visited`, `--gui-border`, etc.
|
|
111
|
+
|
|
112
|
+
**Manifest mode (optional)**
|
|
113
|
+
When needed, `makeMuiThemeFromManifest(manifest, { mode })` reads tokens from `manifest.modes[mode].tokens` and calls `makeMuiTheme(...)` internally.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Registry & factories (`themes/index.js`)
|
|
118
|
+
- **Built‑ins**: we register `neurons` with its `manifest` and `light/dark` tokens.
|
|
119
|
+
- **createThemeFromTokens(tokens, mode)**: thin shortcut to `makeMuiTheme(...)`.
|
|
120
|
+
- **createThemeFromManifest(manifest, mode, tokensByMode?)**: uses manifest + (optional) map `{ light, dark }`.
|
|
121
|
+
- **getTheme**
|
|
122
|
+
```ts
|
|
123
|
+
// options: { key?: string; manifest?: any; tokens?: any; mode: 'light' | 'dark' }
|
|
124
|
+
```
|
|
125
|
+
- If you pass `tokens`: it prioritizes `createThemeFromTokens`.
|
|
126
|
+
- If you pass a `manifest`: it prioritizes `createThemeFromManifest`.
|
|
127
|
+
- If you pass a built‑in `key`: it resolves from the registry (`neurons` + `mode`).
|
|
128
|
+
- **AVAILABLE_THEMES**: flat list derived from built‑ins:
|
|
129
|
+
```ts
|
|
130
|
+
type AvailableTheme = {
|
|
131
|
+
id: string; // e.g. "neurons-light"
|
|
132
|
+
family: string; // e.g. "neurons"
|
|
133
|
+
name: string; // e.g. "neurons.me Light"
|
|
134
|
+
mode: 'light'|'dark';
|
|
135
|
+
manifest: any;
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## GuiProvider (coordination & context)
|
|
142
|
+
`GuiProvider`:
|
|
143
|
+
|
|
144
|
+
1) **Active theme state**
|
|
145
|
+
- Stores `themeKey` (e.g. `neurons-dark`) in `localStorage` (`this.gui:theme`).
|
|
146
|
+
- Derives `family` + `mode` from `AVAILABLE_THEMES`.
|
|
147
|
+
- Exposes helpers: `setMode('light'|'dark')`, `setFamilyAndMode(family, mode)`, `toggleMode()`.
|
|
148
|
+
|
|
149
|
+
2) **Compiles and extends the theme**
|
|
150
|
+
- Calls `getTheme({ key: active.id })`.
|
|
151
|
+
- Injects `theme.layout.insets` and `theme.updateInsets(cb)`.
|
|
152
|
+
- Syncs CSS vars: `--gui-inset-left/right` and `--gui-nav-height`.
|
|
153
|
+
|
|
154
|
+
3) **How components consume it**
|
|
155
|
+
- Use MUI’s `useTheme()` → you get **MUI + GuiProvider extensions**.
|
|
156
|
+
- Use `useMediaQuery(theme.breakpoints.*)` for consistent responsiveness.
|
|
157
|
+
- Read/update insets via `theme.layout.insets` and `theme.updateInsets`.
|
|
158
|
+
|
|
159
|
+
**Hook**
|
|
160
|
+
```ts
|
|
161
|
+
import { useThemeContext } from '@/context/GuiProvider';
|
|
162
|
+
|
|
163
|
+
const { family, mode, toggleMode, setMode, setFamilyAndMode, availableFamilies } = useThemeContext();
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Selector & Toggle
|
|
169
|
+
- **ThemeSelector**: shows the *theme name* (family), a derived **preview**, and a **toggle** (🌞/🌙) aligned to the right.
|
|
170
|
+
- **Previews**: derived from the active theme (e.g. `background.default`, `primary.main`, `secondary.main`, `link.main`, etc.). You can increase the grid and show tooltips with the token name.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Compatibility notes (MUI)
|
|
175
|
+
- **AppBar `color`** supports `default | primary | secondary | transparent`.
|
|
176
|
+
- If you want `success | info | warning | error` or any custom color, use `sx`:
|
|
177
|
+
```jsx
|
|
178
|
+
<AppBar
|
|
179
|
+
color="transparent"
|
|
180
|
+
sx={{
|
|
181
|
+
bgcolor: (t) => t.palette.success.main,
|
|
182
|
+
color: (t) => t.palette.getContrastText(t.palette.success.main)
|
|
183
|
+
}}
|
|
184
|
+
/>
|
|
185
|
+
```
|
|
186
|
+
- The rest of the components respect your `palette` and accept granular `sx`.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Examples
|
|
191
|
+
### 1) Use a built‑in (neurons dark)
|
|
192
|
+
```ts
|
|
193
|
+
import { getTheme } from '@/themes';
|
|
194
|
+
const theme = getTheme({ key: 'neurons', mode: 'dark' });
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 2) Use “ad‑hoc” tokens (no manifest)
|
|
198
|
+
```ts
|
|
199
|
+
import { getTheme } from '@/themes';
|
|
200
|
+
import myTokens from './my.light.tokens.json';
|
|
201
|
+
|
|
202
|
+
const theme = getTheme({ tokens: myTokens, mode: 'light' });
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### 3) Switch mode from UI
|
|
206
|
+
```tsx
|
|
207
|
+
import { useThemeContext } from '@/context/GuiProvider';
|
|
208
|
+
|
|
209
|
+
function ModeToggle() {
|
|
210
|
+
const { mode, toggleMode } = useThemeContext();
|
|
211
|
+
return <Switch checked={mode === 'dark'} onChange={toggleMode} />;
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Troubleshooting
|
|
218
|
+
**“I don’t see my themes in the selector.”**
|
|
219
|
+
- Make sure `themes/index.js` registers your theme in `BUILT_IN` and that `AVAILABLE_THEMES` includes it.
|
|
220
|
+
- For an external theme, use `getTheme({ manifest, tokensByMode })` or `getTheme({ tokens })`.
|
|
221
|
+
|
|
222
|
+
**“AppBar won’t change to ‘success’.”**
|
|
223
|
+
- That’s expected: use `sx` as shown above.
|
|
224
|
+
|
|
225
|
+
**“I want pre‑painted CSS to avoid FOUC.”**
|
|
226
|
+
- You can generate a `tokens.css` at *build time* with default variables; `GuiProvider` will re‑hydrate at runtime.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Final mental model
|
|
231
|
+
- **JSON tokens** define the design truth.
|
|
232
|
+
- **Manifest** describes the theme (icon, modes, and token locations).
|
|
233
|
+
- **fromTokens** compiles to **MUI theme** + `theme.custom.*` + **CSS vars**.
|
|
234
|
+
- **GuiProvider** selects `family+mode`, persists it, adds **insets**, and exposes helpers.
|
|
235
|
+
- **Components** consume the theme and style granularly with `sx` — mature, flexible, no lock‑in, ready for AI.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# GuiProvider
|
|
2
|
+
• Introduction & Features
|
|
3
|
+
• API table with props and context values
|
|
4
|
+
• Usage example with useThemeContext
|
|
5
|
+
• Notes on CSS vars, insets, and theme toggling
|
|
6
|
+
## Introduction
|
|
7
|
+
`GuiProvider` is a React context provider component that extends Material-UI's (`@mui/material`) `ThemeProvider` with custom logic to manage themes.
|
|
8
|
+
It provides a centralized way to handle theme persistence, dynamic insets for layout adjustments, and theme toggling with support for multiple theme variants.
|
|
9
|
+
This component is designed to simplify theming in complex applications by combining theme state management, localStorage persistence, and CSS variable synchronization.
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
- **Theme Persistence:** Automatically saves and loads the last selected theme using `localStorage`.
|
|
13
|
+
- **Insets Management:** Manages layout insets (left, right, navigation bar height) with synchronization to CSS variables for consistent styling.
|
|
14
|
+
- **Multi-Variant Theme Support:** Supports multiple themes beyond simple light/dark modes.
|
|
15
|
+
- **Theme Toggling:** Provides a toggle function to cycle through available themes or set a specific theme.
|
|
16
|
+
- **Integration with MUI Theme:** Injects custom layout insets and update callbacks into the MUI theme object for seamless access via `useTheme()`.
|
|
17
|
+
|
|
18
|
+
## API
|
|
19
|
+
### `GuiProvider`
|
|
20
|
+
|
|
21
|
+
#### Props
|
|
22
|
+
|
|
23
|
+
<table>
|
|
24
|
+
<thead>
|
|
25
|
+
<tr>
|
|
26
|
+
<th style="text-align:left;">Name</th>
|
|
27
|
+
<th style="text-align:left;">Type</th>
|
|
28
|
+
<th style="text-align:left;">Default</th>
|
|
29
|
+
<th style="text-align:left;">Description</th>
|
|
30
|
+
</tr>
|
|
31
|
+
</thead>
|
|
32
|
+
<tbody>
|
|
33
|
+
<tr>
|
|
34
|
+
<td><code>initialTheme</code></td>
|
|
35
|
+
<td><code>string</code></td>
|
|
36
|
+
<td><code>'neurons-dark'</code></td>
|
|
37
|
+
<td>The initial theme key to use on mount.</td>
|
|
38
|
+
</tr>
|
|
39
|
+
<tr>
|
|
40
|
+
<td><code>children</code></td>
|
|
41
|
+
<td><code>ReactNode</code></td>
|
|
42
|
+
<td>—</td>
|
|
43
|
+
<td>Child components to render within the provider.</td>
|
|
44
|
+
</tr>
|
|
45
|
+
</tbody>
|
|
46
|
+
</table>
|
|
47
|
+
|
|
48
|
+
#### Context Value
|
|
49
|
+
|
|
50
|
+
<p>The provider exposes the following context values via <code>useThemeContext()</code> hook:</p>
|
|
51
|
+
|
|
52
|
+
<table>
|
|
53
|
+
<thead>
|
|
54
|
+
<tr>
|
|
55
|
+
<th style="text-align:left;">Name</th>
|
|
56
|
+
<th style="text-align:left;">Type</th>
|
|
57
|
+
<th style="text-align:left;">Description</th>
|
|
58
|
+
</tr>
|
|
59
|
+
</thead>
|
|
60
|
+
<tbody>
|
|
61
|
+
<tr>
|
|
62
|
+
<td><code>themeName</code></td>
|
|
63
|
+
<td><code>string</code></td>
|
|
64
|
+
<td>The current active theme key.</td>
|
|
65
|
+
</tr>
|
|
66
|
+
<tr>
|
|
67
|
+
<td><code>setThemeName</code></td>
|
|
68
|
+
<td><code>function</code></td>
|
|
69
|
+
<td>Set the active theme by key.</td>
|
|
70
|
+
</tr>
|
|
71
|
+
<tr>
|
|
72
|
+
<td><code>availableThemes</code></td>
|
|
73
|
+
<td><code>Array</code></td>
|
|
74
|
+
<td>List of available theme metadata objects.</td>
|
|
75
|
+
</tr>
|
|
76
|
+
<tr>
|
|
77
|
+
<td><code>toggleTheme</code></td>
|
|
78
|
+
<td><code>function</code></td>
|
|
79
|
+
<td>Toggle between themes or set a specific theme.</td>
|
|
80
|
+
</tr>
|
|
81
|
+
<tr>
|
|
82
|
+
<td><code>getThemeMeta</code></td>
|
|
83
|
+
<td><code>function</code></td>
|
|
84
|
+
<td>Get metadata for a given theme key.</td>
|
|
85
|
+
</tr>
|
|
86
|
+
</tbody>
|
|
87
|
+
</table>
|
|
88
|
+
|
|
89
|
+
## Usage Example
|
|
90
|
+
|
|
91
|
+
```jsx
|
|
92
|
+
import React from 'react';
|
|
93
|
+
import { GuiProvider, useThemeContext } from './context/GuiProvider';
|
|
94
|
+
|
|
95
|
+
function ThemeSwitcher() {
|
|
96
|
+
const { themeName, toggleTheme, availableThemes } = useThemeContext();
|
|
97
|
+
|
|
98
|
+
<div>
|
|
99
|
+
<p>Current theme: {themeName}</p>
|
|
100
|
+
<button onClick={() => toggleTheme()}>Toggle Theme</button>
|
|
101
|
+
<ul>
|
|
102
|
+
{availableThemes.map(({ key, name }) => (
|
|
103
|
+
<li key={key}>
|
|
104
|
+
<button onClick={() => toggleTheme(key)}>{name}</button>
|
|
105
|
+
</li>
|
|
106
|
+
))}
|
|
107
|
+
</ul>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
export default function App() {
|
|
111
|
+
return (
|
|
112
|
+
<GuiProvider initialTheme="neurons-dark">
|
|
113
|
+
<ThemeSwitcher />
|
|
114
|
+
{/* Your app components here */}
|
|
115
|
+
</GuiProvider>
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Notes
|
|
121
|
+
|
|
122
|
+
- The `GuiProvider` component internally manages CSS variables (`--gui-inset-left`, `--gui-inset-right`, `--gui-nav-height`) to allow non-MUI components to adapt to the current layout insets.
|
|
123
|
+
- The theme toggle function cycles through all available themes, or can directly set a theme by its key.
|
|
124
|
+
- The available themes are derived from the `AVAILABLE_THEMES` array imported from the theme tokens, and include metadata such as name, mode, icon, and preview.
|
|
125
|
+
- Use the `useThemeContext()` hook to access theme-related state and functions within your components.
|
|
126
|
+
- This provider replaces the older `useThemeToggle` hook to avoid confusion and supports multi-variant theming beyond simple light/dark toggling.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# GuiProvider
|
|
2
|
+
|
|
3
|
+
- Introduction & Features
|
|
4
|
+
- API table with props and context values
|
|
5
|
+
- Usage example with useThemeContext
|
|
6
|
+
- Notes on CSS vars, insets, and theme toggling
|
|
7
|
+
## Introduction
|
|
8
|
+
`GuiProvider` provides a centralized way to handle theme persistence, dynamic insets for layout adjustments, and theme toggling with support for multiple theme variants.
|
|
9
|
+
This component is designed to simplify theming in complex applications by combining theme state management, localStorage persistence, and CSS variable synchronization.
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
- **Theme Persistence:** Automatically saves and loads the last selected theme using `localStorage`.
|
|
13
|
+
- **Insets Management:** Manages layout insets (left, right, navigation bar height) with synchronization to CSS variables for consistent styling.
|
|
14
|
+
- **Multi-Variant Theme Support:** Supports multiple themes beyond simple light/dark modes.
|
|
15
|
+
- **Theme Toggling:** Provides a toggle function to cycle through available themes or set a specific theme.
|
|
16
|
+
- **Integration with MUI Theme:** Injects custom layout insets and update callbacks into the MUI theme object for seamless access via `useTheme()`.
|
|
17
|
+
|
|
18
|
+
## API
|
|
19
|
+
### `GuiProvider`
|
|
20
|
+
There are only two props:
|
|
21
|
+
1. initialTheme: Defines which theme key should be active when the provider first mounts.
|
|
22
|
+
If a value is stored in localStorage, that takes precedence.
|
|
23
|
+
2. children: This is a standard React pattern.
|
|
24
|
+
• children means whatever JSX elements you wrap inside GuiProvider will be rendered there.
|
|
25
|
+
• For example:
|
|
26
|
+
```jsx
|
|
27
|
+
<GuiProvider initialTheme="neurons-dark">
|
|
28
|
+
<App />
|
|
29
|
+
</GuiProvider>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
#### Props
|
|
33
|
+
<table>
|
|
34
|
+
<thead>
|
|
35
|
+
<tr>
|
|
36
|
+
<th>Name</th>
|
|
37
|
+
<th>Type</th>
|
|
38
|
+
<th>Default</th>
|
|
39
|
+
<th>Description</th>
|
|
40
|
+
</tr>
|
|
41
|
+
</thead>
|
|
42
|
+
<tbody>
|
|
43
|
+
<tr>
|
|
44
|
+
<td><code>initialTheme</code></td>
|
|
45
|
+
<td><code>string</code></td>
|
|
46
|
+
<td><code>'neurons-dark'</code></td>
|
|
47
|
+
<td>The initial theme key to use on mount.</td>
|
|
48
|
+
</tr>
|
|
49
|
+
<tr>
|
|
50
|
+
<td><code>children</code></td>
|
|
51
|
+
<td><code>ReactNode</code></td>
|
|
52
|
+
<td>—</td>
|
|
53
|
+
<td>Child components to render within the provider.</td>
|
|
54
|
+
</tr>
|
|
55
|
+
</tbody>
|
|
56
|
+
</table>
|
|
57
|
+
---
|
|
58
|
+
#### Context Value
|
|
59
|
+
The context value refers to the collection of state and functions that the `GuiProvider` makes available to any component within its React tree.
|
|
60
|
+
This context is exposed through a custom hook called `useThemeContext()`, which allows components to easily access and interact with the current theme state, available themes, and theme-related actions such as toggling or setting a theme directly.
|
|
61
|
+
By using this hook, components can remain decoupled from the provider's internal implementation while still responding dynamically to theme changes and layout insets.
|
|
62
|
+
<p>The provider exposes the following context values via <code>useThemeContext()</code> hook:</p>
|
|
63
|
+
|
|
64
|
+
<table>
|
|
65
|
+
<thead>
|
|
66
|
+
<tr>
|
|
67
|
+
<th>Name</th>
|
|
68
|
+
<th>Type</th>
|
|
69
|
+
<th>Description</th>
|
|
70
|
+
</tr>
|
|
71
|
+
</thead>
|
|
72
|
+
<tbody>
|
|
73
|
+
<tr>
|
|
74
|
+
<td><code>themeName</code></td>
|
|
75
|
+
<td><code>string</code></td>
|
|
76
|
+
<td>The current active theme key.</td>
|
|
77
|
+
</tr>
|
|
78
|
+
<tr>
|
|
79
|
+
<td><code>setThemeName</code></td>
|
|
80
|
+
<td><code>function</code></td>
|
|
81
|
+
<td>Set the active theme by key.</td>
|
|
82
|
+
</tr>
|
|
83
|
+
<tr>
|
|
84
|
+
<td><code>availableThemes</code></td>
|
|
85
|
+
<td><code>Array</code></td>
|
|
86
|
+
<td>List of available theme metadata objects.</td>
|
|
87
|
+
</tr>
|
|
88
|
+
<tr>
|
|
89
|
+
<td><code>toggleTheme</code></td>
|
|
90
|
+
<td><code>function</code></td>
|
|
91
|
+
<td>Toggle between themes or set a specific theme.</td>
|
|
92
|
+
</tr>
|
|
93
|
+
<tr>
|
|
94
|
+
<td><code>getThemeMeta</code></td>
|
|
95
|
+
<td><code>function</code></td>
|
|
96
|
+
<td>Get metadata for a given theme key.</td>
|
|
97
|
+
</tr>
|
|
98
|
+
</tbody>
|
|
99
|
+
</table>
|
|
100
|
+
|
|
101
|
+
Here is a simple example demonstrating how to consume the context using the `useThemeContext()` hook:
|
|
102
|
+
|
|
103
|
+
```jsx
|
|
104
|
+
import React from 'react';
|
|
105
|
+
import { useThemeContext } from 'this.gui';
|
|
106
|
+
|
|
107
|
+
function ThemeInfo() {
|
|
108
|
+
const { themeName, setThemeName, availableThemes, toggleTheme, getThemeMeta } = useThemeContext();
|
|
109
|
+
return (
|
|
110
|
+
<div>
|
|
111
|
+
<p>Current Theme: {themeName}</p>
|
|
112
|
+
<button onClick={() => toggleTheme()}>Toggle Theme</button>
|
|
113
|
+
<ul>
|
|
114
|
+
{availableThemes.map(({ key, name }) => (
|
|
115
|
+
<li key={key}>
|
|
116
|
+
<button onClick={() => setThemeName(key)}>{name}</button>
|
|
117
|
+
</li>
|
|
118
|
+
))}
|
|
119
|
+
</ul>
|
|
120
|
+
</div>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
- `themeName`: The key of the currently active theme.
|
|
126
|
+
- `setThemeName`: Function to change the active theme by specifying its key.
|
|
127
|
+
- `availableThemes`: Array containing metadata about all themes available.
|
|
128
|
+
- `toggleTheme`: Function to cycle through available themes or set a specific theme.
|
|
129
|
+
- `getThemeMeta`: Function to retrieve metadata for a given theme key.
|