this.gui 1.3.24 → 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.
- package/dist/this-gui.es.js +0 -1
- package/dist/this-gui.umd.js +65 -65
- package/index.ts +3 -2
- package/init/index.html +1 -2
- package/init/package-lock.json +2 -2
- package/init/package.json +1 -1
- package/init/src/App.tsx +24 -0
- package/init/src/index.css +16 -0
- package/init/src/main.tsx +14 -0
- package/init/src/router/DerivableRouter.tsx +36 -0
- package/package.json +1 -1
- package/src/GUI.tsx +15 -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/gui/Layouts/ResponsiveUI/Content/Content.resolver.tsx +0 -0
- package/src/gui/Layouts/ResponsiveUI/Content/Content.stories.tsx +88 -0
- package/src/gui/Layouts/ResponsiveUI/Content/Content.tsx +53 -0
- package/src/gui/Layouts/ResponsiveUI/Content/Content.types.tsx +40 -0
- package/src/gui/Layouts/ResponsiveUI/Footer/Footer.resolver.tsx +45 -0
- package/src/gui/Layouts/ResponsiveUI/Footer/Footer.stories.tsx +209 -0
- package/src/gui/Layouts/ResponsiveUI/Footer/Footer.tsx +337 -0
- package/src/gui/Layouts/ResponsiveUI/Footer/Footer.types.ts +40 -0
- package/src/gui/Layouts/ResponsiveUI/Layout/Layout.resolver.tsx +37 -0
- package/src/gui/Layouts/ResponsiveUI/Layout/Layout.stories.tsx +290 -0
- package/src/gui/Layouts/ResponsiveUI/Layout/Layout.tsx +112 -0
- package/src/gui/Layouts/ResponsiveUI/Layout/Layout.types.ts +56 -0
- package/src/gui/Layouts/ResponsiveUI/Layout/useLayoutBreakpoints.ts +9 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/LeftSidebar.resolver.tsx +87 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/LeftSidebar.stories.tsx +199 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/LeftSidebar.tsx +311 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/LeftSidebar.types.ts +41 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/SidebarToggleButton.tsx +53 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarAction/LeftSidebarAction.resolver.tsx +19 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarAction/LeftSidebarAction.tsx +107 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarLink/LeftSidebarLink.resolver.tsx +0 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarLink/LeftSidebarLink.tsx +122 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarLink/LeftSidebarLink.types.ts +13 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarMenu/LeftSidebarMenu.tsx +142 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/components/LeftSidebarToggleButton/LeftSidebarToggleButton.tsx +23 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/RightSidebar.resolver.tsx +35 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/RightSidebar.stories.tsx +240 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/RightSidebar.tsx +319 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/RightSidebar.types.ts +17 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/components/RightSidebarAction/RightSidebarAction.tsx +102 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/components/RightSidebarLink/RightSidebarLink.tsx +132 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/components/RightSidebarMenu/RightSidebarMenu.tsx +140 -0
- package/src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/components/RightSidebarToggleButton/RightSidebarToggleButton.tsx +22 -0
- package/src/gui/Layouts/ResponsiveUI/StickyOptions/StickyOptionsTop.stories.tsx +469 -0
- package/src/gui/Layouts/ResponsiveUI/StickyOptions/StickyOptionsTop.tsx +489 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/TopBar.resolver.tsx +86 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/TopBar.stories.tsx +350 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/TopBar.tsx +281 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/TopBar.types.ts +39 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarAction/TopBarAction.stories.tsx +83 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarAction/TopBarAction.tsx +18 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarAction/TopBarAction.types.ts +4 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarLink/TopBarLink.stories.tsx +189 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarLink/TopBarLink.tsx +30 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarLink/TopBarLink.types.ts +9 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarMenu/TopBarMenu.resolver.tsx +14 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarMenu/TopBarMenu.stories.tsx +56 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarMenu/TopBarMenu.tsx +123 -0
- package/src/gui/Layouts/ResponsiveUI/TopBar/components/TopBarMenu/TopBarMenu.types.ts +44 -0
- package/src/gui/Theme/GuiProvider.tsx +125 -0
- package/src/gui/Theme/Icon/Icon.resolver.tsx +29 -0
- package/src/gui/Theme/Icon/Icon.tsx +43 -0
- package/src/gui/Theme/catalog/CherryByte/CherryByte.png +0 -0
- package/src/gui/Theme/catalog/CherryByte/dark.tokens.ts +47 -0
- package/src/gui/Theme/catalog/CherryByte/light.tokens.ts +47 -0
- package/src/gui/Theme/catalog/CherryByte/manifest.ts +24 -0
- package/src/gui/Theme/catalog/GhostShell/dark.tokens.ts +43 -0
- package/src/gui/Theme/catalog/GhostShell/ghost.png +0 -0
- package/src/gui/Theme/catalog/GhostShell/light.tokens.ts +39 -0
- package/src/gui/Theme/catalog/GhostShell/manifest.ts +24 -0
- package/src/gui/Theme/catalog/LunaHex/LunaHex.png +0 -0
- package/src/gui/Theme/catalog/LunaHex/dark.tokens.ts +34 -0
- package/src/gui/Theme/catalog/LunaHex/light.tokens.ts +74 -0
- package/src/gui/Theme/catalog/LunaHex/manifest.ts +24 -0
- package/src/gui/Theme/catalog/MUI/MUI.png +0 -0
- package/src/gui/Theme/catalog/MUI/dark.tokens.ts +58 -0
- package/src/gui/Theme/catalog/MUI/light.tokens.ts +74 -0
- package/src/gui/Theme/catalog/MUI/manifest.ts +24 -0
- package/src/gui/Theme/catalog/PrinceOfDarkness/dark.tokens.ts +48 -0
- package/src/gui/Theme/catalog/PrinceOfDarkness/light.tokens.ts +47 -0
- package/src/gui/Theme/catalog/PrinceOfDarkness/manifest.ts +24 -0
- package/src/gui/Theme/catalog/PrinceOfDarkness/prince.png +0 -0
- package/src/gui/Theme/catalog/PrinceOfDarkness/princeOfDarkness.png +0 -0
- package/src/gui/Theme/catalog/Seafoam/dark.tokens.ts +49 -0
- package/src/gui/Theme/catalog/Seafoam/light.tokens.ts +47 -0
- package/src/gui/Theme/catalog/Seafoam/manifest.ts +24 -0
- package/src/gui/Theme/catalog/Seafoam/seaFoam.png +0 -0
- package/src/gui/Theme/catalog/neurons/dark.tokens.ts +58 -0
- package/src/gui/Theme/catalog/neurons/light.tokens.ts +74 -0
- package/src/gui/Theme/catalog/neurons/manifest.ts +24 -0
- package/src/gui/Theme/catalog/neurons/neurons.me.png +0 -0
- package/src/gui/Theme/fromTokens.ts +273 -0
- package/src/gui/Theme/gui.css +31 -0
- package/src/gui/Theme/index.ts +17 -0
- package/src/gui/Theme/styles/buildShadows.ts +83 -0
- package/src/gui/Theme/styles/theme.tokens.ts +108 -0
- package/src/gui/Theme/utils/catalog.ts +61 -0
- package/src/gui/Theme/utils/persistence.ts +66 -0
- package/src/gui/Theme/utils/themeUtils.ts +34 -0
- package/src/gui/apis/codegen.api.ts +38 -0
- package/src/gui/components/atoms/AppBar/AppBar.resolver.tsx +41 -0
- package/src/gui/components/atoms/AppBar/AppBar.stories.tsx +225 -0
- package/src/gui/components/atoms/AppBar/AppBar.tsx +8 -0
- package/src/gui/components/atoms/AppBar/AppBar.types.ts +28 -0
- package/src/gui/components/atoms/Avatar/Avatar.resolver.tsx +61 -0
- package/src/gui/components/atoms/Avatar/Avatar.stories.tsx +36 -0
- package/src/gui/components/atoms/Avatar/Avatar.tsx +14 -0
- package/src/gui/components/atoms/Box/Box.resolver.tsx +171 -0
- package/src/gui/components/atoms/Box/Box.stories.tsx +263 -0
- package/src/gui/components/atoms/Box/Box.tsx +15 -0
- package/src/gui/components/atoms/Button/Button.resolver.tsx +103 -0
- package/src/gui/components/atoms/Button/Button.stories.tsx +219 -0
- package/src/gui/components/atoms/Button/Button.tsx +40 -0
- package/src/gui/components/atoms/Card/Card.resolver.tsx +63 -0
- package/src/gui/components/atoms/Card/Card.stories.tsx +54 -0
- package/src/gui/components/atoms/Card/Card.tsx +13 -0
- package/src/gui/components/atoms/CardActions/CardActions.resolver.tsx +59 -0
- package/src/gui/components/atoms/CardActions/CardActions.stories.tsx +32 -0
- package/src/gui/components/atoms/CardActions/CardActions.tsx +14 -0
- package/src/gui/components/atoms/CardContent/CardContent.resolver.tsx +60 -0
- package/src/gui/components/atoms/CardContent/CardContent.stories.tsx +34 -0
- package/src/gui/components/atoms/CardContent/CardContent.tsx +13 -0
- package/src/gui/components/atoms/CardHeader/CardHeader.resolver.tsx +68 -0
- package/src/gui/components/atoms/CardHeader/CardHeader.stories.tsx +40 -0
- package/src/gui/components/atoms/CardHeader/CardHeader.tsx +12 -0
- package/src/gui/components/atoms/Collapse/Collapse.resolver.tsx +85 -0
- package/src/gui/components/atoms/Collapse/Collapse.stories.tsx +130 -0
- package/src/gui/components/atoms/Collapse/Collapse.tsx +17 -0
- package/src/gui/components/atoms/Divider/Divider.resolver.tsx +95 -0
- package/src/gui/components/atoms/Divider/Divider.stories.tsx +108 -0
- package/src/gui/components/atoms/Divider/Divider.tsx +14 -0
- package/src/gui/components/atoms/Drawer/Drawer.resolver.tsx +116 -0
- package/src/gui/components/atoms/Drawer/Drawer.stories.tsx +223 -0
- package/src/gui/components/atoms/Drawer/Drawer.tsx +25 -0
- package/src/gui/components/atoms/Grid/Grid.resolver.tsx +33 -0
- package/src/gui/components/atoms/Grid/Grid.stories.tsx +136 -0
- package/src/gui/components/atoms/Grid/Grid.tsx +15 -0
- package/src/gui/components/atoms/Grid/Grid.types.ts +9 -0
- package/src/gui/components/atoms/IconButton/IconButton.resolver.tsx +137 -0
- package/src/gui/components/atoms/IconButton/IconButton.stories.tsx +134 -0
- package/src/gui/components/atoms/IconButton/IconButton.tsx +22 -0
- package/src/gui/components/atoms/Link/Link.resolver.tsx +74 -0
- package/src/gui/components/atoms/Link/Link.stories.tsx +157 -0
- package/src/gui/components/atoms/Link/Link.tsx +36 -0
- package/src/gui/components/atoms/List/List.resolver.tsx +94 -0
- package/src/gui/components/atoms/List/List.stories.tsx +137 -0
- package/src/gui/components/atoms/List/List.tsx +20 -0
- package/src/gui/components/atoms/ListItem/ListItem.resolver.tsx +88 -0
- package/src/gui/components/atoms/ListItem/ListItem.stories.tsx +151 -0
- package/src/gui/components/atoms/ListItem/ListItem.tsx +19 -0
- package/src/gui/components/atoms/ListItemButton/ListItemButton.resolver.tsx +214 -0
- package/src/gui/components/atoms/ListItemButton/ListItemButton.stories.tsx +155 -0
- package/src/gui/components/atoms/ListItemButton/ListItemButton.tsx +15 -0
- package/src/gui/components/atoms/ListItemIcon/ListItemIcon.resolver.tsx +102 -0
- package/src/gui/components/atoms/ListItemIcon/ListItemIcon.stories.tsx +132 -0
- package/src/gui/components/atoms/ListItemIcon/ListItemIcon.tsx +11 -0
- package/src/gui/components/atoms/ListItemText/ListItemText.resolver.tsx +112 -0
- package/src/gui/components/atoms/ListItemText/ListItemText.stories.tsx +156 -0
- package/src/gui/components/atoms/ListItemText/ListItemText.tsx +15 -0
- package/src/gui/components/atoms/Menu/Menu.resolver.tsx +112 -0
- package/src/gui/components/atoms/Menu/Menu.stories.tsx +162 -0
- package/src/gui/components/atoms/Menu/Menu.tsx +17 -0
- package/src/gui/components/atoms/MenuItem/MenuItem.resolver.tsx +183 -0
- package/src/gui/components/atoms/MenuItem/MenuItem.stories.tsx +134 -0
- package/src/gui/components/atoms/MenuItem/MenuItem.tsx +14 -0
- package/src/gui/components/atoms/Paper/Paper.resolver.tsx +98 -0
- package/src/gui/components/atoms/Paper/Paper.stories.tsx +184 -0
- package/src/gui/components/atoms/Paper/Paper.tsx +15 -0
- package/src/gui/components/atoms/Section/Section.resolver.tsx +10 -0
- package/src/gui/components/atoms/Section/Section.stories.tsx +189 -0
- package/src/gui/components/atoms/Section/Section.tsx +76 -0
- package/src/gui/components/atoms/Section/Section.types.tsx +24 -0
- package/src/gui/components/atoms/Stack/Stack.resolver.tsx +94 -0
- package/src/gui/components/atoms/Stack/Stack.stories.tsx +160 -0
- package/src/gui/components/atoms/Stack/Stack.tsx +15 -0
- package/src/gui/components/atoms/Surface/Surface.resolver.tsx +37 -0
- package/src/gui/components/atoms/Surface/Surface.tsx +49 -0
- package/src/gui/components/atoms/Surface/Surface.types.ts +20 -0
- package/src/gui/components/atoms/Switch/Switch.resolver.tsx +53 -0
- package/src/gui/components/atoms/Switch/Switch.stories.tsx +236 -0
- package/src/gui/components/atoms/Switch/Switch.tsx +22 -0
- package/src/gui/components/atoms/TextField/TextField.stories.tsx +28 -0
- package/src/gui/components/atoms/TextField/TextField.tsx +15 -0
- package/src/gui/components/atoms/Toolbar/Toolbar.resolver.tsx +60 -0
- package/src/gui/components/atoms/Toolbar/Toolbar.stories.tsx +155 -0
- package/src/gui/components/atoms/Toolbar/Toolbar.tsx +16 -0
- package/src/gui/components/atoms/Tooltip/Tooltip.resolver.tsx +142 -0
- package/src/gui/components/atoms/Tooltip/Tooltip.stories.tsx +117 -0
- package/src/gui/components/atoms/Tooltip/Tooltip.tsx +70 -0
- package/src/gui/components/atoms/Typography/Typography.resolver.tsx +158 -0
- package/src/gui/components/atoms/Typography/Typography.stories.tsx +222 -0
- package/src/gui/components/atoms/Typography/Typography.tsx +27 -0
- package/src/gui/components/atoms.tsx +138 -0
- package/src/gui/components/molecules/Dialog/Dialog.stories.tsx +18 -0
- package/src/gui/components/molecules/Dialog/Dialog.tsx +5 -0
- package/src/gui/components/molecules/HeroSection/HeroSection.stories.tsx +141 -0
- package/src/gui/components/molecules/HeroSection/HeroSection.tsx +152 -0
- package/src/gui/components/molecules/HeroSection/HeroSection.types.tsx +18 -0
- package/src/gui/components/molecules/ModalBox/ModalBox.resolver.tsx +38 -0
- package/src/gui/components/molecules/ModalBox/ModalBox.stories.tsx +82 -0
- package/src/gui/components/molecules/ModalBox/ModalBox.tsx +106 -0
- package/src/gui/components/molecules/ModalBox/ModalBox.types.ts +29 -0
- package/src/gui/components/molecules/Page/Page.stories.tsx +135 -0
- package/src/gui/components/molecules/Page/Page.tsx +94 -0
- package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.resolver.tsx +58 -0
- package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.stories.tsx +133 -0
- package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.tsx +101 -0
- package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.types.ts +29 -0
- package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.resolver.tsx +15 -0
- package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.stories.tsx +88 -0
- package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.tsx +167 -0
- package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.types.ts +34 -0
- package/src/gui/components/organism/ChatGPTInterface/ChatGPTInterface.stories.tsx +17 -0
- package/src/gui/components/organism/ChatGPTInterface/ChatGPTInterface.tsx +71 -0
- package/src/gui/components/organism/RootDomain/RootDomain.stories.tsx +31 -0
- package/src/gui/components/organism/RootDomain/RootDomain.tsx +100 -0
- package/src/gui/components/organism/RootDomain/staticServices.ts +66 -0
- package/src/gui/components/window/Nodes/node.ts +0 -0
- package/src/gui/components/window/code/block/node.tsx +0 -0
- package/src/gui/components/window/code/hugging.face.api.ts +11 -0
- package/src/gui/components/window/connectors/index.ts +19 -0
- package/src/gui/components/window/window.stories.tsx +20 -0
- package/src/gui/components/window/window.tsx +633 -0
- package/src/gui/contexts/InsetsContext.tsx +38 -0
- package/src/gui/contexts/LeftSidebarContext.tsx +20 -0
- package/src/gui/contexts/RightSidebarContext.tsx +25 -0
- package/src/gui/contexts/ThemeContext.ts +34 -0
- package/src/gui/contexts/index.ts +4 -0
- package/src/gui/hooks/index.ts +11 -0
- package/src/gui/hooks/resolveColorToken.ts +39 -0
- package/src/gui/hooks/useCodeGen.ts +12 -0
- package/src/gui/hooks/useGuiMediaQuery.ts +18 -0
- package/src/gui/hooks/useGuiTheme.ts +18 -0
- package/src/gui/hooks/useInsets.ts +26 -0
- package/src/gui/hooks/useIsMobile.ts +13 -0
- package/src/gui/hooks/useIsTouchDevice.ts +25 -0
- package/src/gui/hooks/useLeftSidebar.ts +10 -0
- package/src/gui/hooks/useRightSidebar.ts +12 -0
- package/src/gui/hooks/useViewportKey.ts +19 -0
- package/src/gui/hooks/useViewportProp.ts +17 -0
- package/src/gui/me/Logic.tsx +31 -0
- package/src/gui/me/Me.stories.tsx +8 -0
- package/src/gui/me/Me.tsx +197 -0
- package/src/gui/me/fundamentals/verbs/verbs.tsx +94 -0
- package/src/gui/me/modificators/Adjectives.ts +0 -0
- package/src/gui/me/modificators/Adverbs.ts +0 -0
- package/src/gui/me/modificators/Complements.ts +27 -0
- package/src/gui/me/utils/Context.tsx +14 -0
- package/src/gui/me/utils/hooks/useMe.js +37 -0
- package/src/gui/utils/nodeID.ts +11 -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.mdx +149 -0
- package/src/stories/Theme/Palette.stories.tsx +86 -0
- package/src/stories/Theme/ThemeViewer.stories.tsx +91 -0
- package/src/stories/Theme/Typography.stories.jsx +211 -0
- package/src/types/gui.d.ts +67 -0
- package/src/types/theme.d.ts +191 -0
- package/src/types/viewport.ts +132 -0
package/index.ts
CHANGED
|
@@ -5,6 +5,7 @@ import TopBar from "./src/gui/Layouts/ResponsiveUI/TopBar/TopBar";
|
|
|
5
5
|
import Footer from "./src/gui/Layouts/ResponsiveUI/Footer/Footer";
|
|
6
6
|
import LeftSidebar from "./src/gui/Layouts/ResponsiveUI/Sidebars/LeftSidebar/LeftSidebar";
|
|
7
7
|
import RightSidebar from "./src/gui/Layouts/ResponsiveUI/Sidebars/RightSidebar/RightSidebar";
|
|
8
|
+
import Layout from "./src/gui/Layouts/ResponsiveUI/Layout/Layout";
|
|
8
9
|
import StickyOptionsTop from "./src/gui/Layouts/ResponsiveUI/StickyOptions/StickyOptionsTop";
|
|
9
10
|
import useCodeGen from "./src/gui/hooks/useCodeGen";
|
|
10
11
|
import RootDomain from "./src/gui/components/organism/RootDomain/RootDomain";
|
|
@@ -32,14 +33,14 @@ import Gridme from "./src/components/generics/Cards/Gridme";
|
|
|
32
33
|
import Dialog from "./src/gui/components/molecules/Dialog/Dialog";
|
|
33
34
|
import type { GUIType } from "./src/types/gui.d";
|
|
34
35
|
export {
|
|
35
|
-
GuiProvider, useThemeContext, TopBar, useCodeGen, Footer, StickyOptionsTop, LeftSidebar, RightSidebar, TextTitle,
|
|
36
|
+
GuiProvider, useThemeContext, TopBar, useCodeGen, Layout, Footer, StickyOptionsTop, LeftSidebar, RightSidebar, TextTitle,
|
|
36
37
|
TextParagraph,TextList, TextQuote, TextField, RootDomain, Surface, Img, Dialog, VideoEmbed,
|
|
37
38
|
TableOfContents, Tabs, PageContainer, Gridx, Section, SectionHeader, PageDivider, Hero2, CodeBlock, Callout,
|
|
38
39
|
ModuleCard, LilBox, Gridme
|
|
39
40
|
};
|
|
40
41
|
// Default namespace (`import GUI from "this.gui"`)
|
|
41
42
|
const GUI: GUIType = {
|
|
42
|
-
GuiProvider, useThemeContext, TopBar, useCodeGen, LeftSidebar,
|
|
43
|
+
GuiProvider, useThemeContext, TopBar, useCodeGen, Layout, LeftSidebar,
|
|
43
44
|
RightSidebar, StickyOptionsTop, RootDomain, TextTitle, TextParagraph,
|
|
44
45
|
TextList, TextQuote, Surface, TextField, Img, VideoEmbed,
|
|
45
46
|
TableOfContents, Tabs, PageContainer, Gridx, Section, SectionHeader, PageDivider, Hero2,
|
package/init/index.html
CHANGED
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
<link
|
|
7
7
|
rel="icon"
|
|
8
8
|
type="image/svg+xml"
|
|
9
|
-
href="
|
|
10
|
-
/>
|
|
9
|
+
href="https://res.cloudinary.com/dkwnxf6gm/image/upload/v1761276578/this.gui.npm.png"/>
|
|
11
10
|
<title>.GUI</title>
|
|
12
11
|
<!-- Base metadata (can be overridden by Helmet) -->
|
|
13
12
|
<meta name="description" content="A .GUI powered application template" />
|
package/init/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thisgui-demo",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "thisgui-demo",
|
|
9
|
-
"version": "0.0.
|
|
9
|
+
"version": "0.0.1",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"react": "^19.1.1",
|
|
12
12
|
"react-dom": "^19.1.1",
|
package/init/package.json
CHANGED
package/init/src/App.tsx
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//Include this.GUI components as a showviewcase
|
|
2
|
+
import { GuiProvider, Hero2, TextField, Dialog, RootDomain } from "this.gui";
|
|
3
|
+
import { DerivableRouterRoot } from "./router/DerivableRouter"; // new
|
|
4
|
+
import "./index.css";
|
|
5
|
+
export default function App() {
|
|
6
|
+
return (
|
|
7
|
+
<GuiProvider>
|
|
8
|
+
<DerivableRouterRoot>
|
|
9
|
+
<Dialog title="Example Dialog" isOpen={true}>
|
|
10
|
+
<p>This is an example dialog.</p>
|
|
11
|
+
</Dialog>
|
|
12
|
+
<RootDomain />
|
|
13
|
+
<Hero2 title=".GUI" subtitle="Your Gateway to Graphical Excellence" />
|
|
14
|
+
<TextField label="Search" placeholder="Type to search..." />
|
|
15
|
+
<main>
|
|
16
|
+
<h1>Hello, this.gui!</h1>
|
|
17
|
+
<p>Welcome to your new application.</p>
|
|
18
|
+
<p>Explore the features and customize your experience.</p>
|
|
19
|
+
<p>Get started by editing <code>src/App.tsx</code>.</p>
|
|
20
|
+
</main>
|
|
21
|
+
</DerivableRouterRoot>
|
|
22
|
+
</GuiProvider>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
font-family: 'Inter', system-ui, Avenir, Helvetica, Arial, sans-serif;
|
|
3
|
+
color: #1f2933;
|
|
4
|
+
background-color: #f5f7fb;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
body {
|
|
8
|
+
margin: 0;
|
|
9
|
+
min-height: 100vh;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.app-container {
|
|
13
|
+
max-width: 960px;
|
|
14
|
+
margin: 96px auto;
|
|
15
|
+
padding: 0 24px;
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// init/src/main.tsx
|
|
2
|
+
import React from "react";
|
|
3
|
+
import ReactDOM from "react-dom/client";
|
|
4
|
+
import { BrowserRouter } from "react-router-dom";
|
|
5
|
+
import App from "./App";
|
|
6
|
+
import "./index.css";
|
|
7
|
+
import { GuiProvider } from "this.gui";
|
|
8
|
+
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
|
|
9
|
+
<React.StrictMode>
|
|
10
|
+
<GuiProvider>
|
|
11
|
+
<App />
|
|
12
|
+
</GuiProvider>
|
|
13
|
+
</React.StrictMode>
|
|
14
|
+
);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React, { createContext, useContext, useState, useEffect } from 'react';
|
|
2
|
+
import { BrowserRouter, useLocation, useNavigate } from 'react-router-dom';
|
|
3
|
+
type DerivableRouterContextType = {
|
|
4
|
+
currentPath: string;
|
|
5
|
+
navigate: (path: string) => void;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
const DerivableRouterContext = createContext<DerivableRouterContextType | undefined>(undefined);
|
|
9
|
+
export const DerivableRouterProvider: React.FC<{ children?: React.ReactNode }> = ({ children }) => {
|
|
10
|
+
const location = useLocation();
|
|
11
|
+
const navigate = useNavigate();
|
|
12
|
+
const [currentPath, setCurrentPath] = useState<string>(location.pathname);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
setCurrentPath(location.pathname);
|
|
15
|
+
}, [location.pathname]);
|
|
16
|
+
return (
|
|
17
|
+
<DerivableRouterContext.Provider value={{ currentPath, navigate }}>
|
|
18
|
+
{children}
|
|
19
|
+
</DerivableRouterContext.Provider>
|
|
20
|
+
);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const useDerivableRouter = (): DerivableRouterContextType => {
|
|
24
|
+
const ctx = useContext(DerivableRouterContext);
|
|
25
|
+
if (!ctx) {
|
|
26
|
+
throw new Error('useDerivableRouter must be used within a DerivableRouterProvider');
|
|
27
|
+
}
|
|
28
|
+
return ctx;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// Wrapper to ensure routing context
|
|
32
|
+
export const DerivableRouterRoot: React.FC<{ children?: React.ReactNode }> = ({ children }) => (
|
|
33
|
+
<BrowserRouter>
|
|
34
|
+
<DerivableRouterProvider>{children}</DerivableRouterProvider>
|
|
35
|
+
</BrowserRouter>
|
|
36
|
+
);
|
package/package.json
CHANGED
package/src/GUI.tsx
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/GUI.tsx
|
|
2
|
+
import React from 'react'
|
|
3
|
+
import { GuiProvider, TopBar, Footer } from '../index'
|
|
4
|
+
export const GUI = ({ title = 'this.GUI', children }: { title?: string; children?: React.ReactNode }) => {
|
|
5
|
+
return (
|
|
6
|
+
<GuiProvider>
|
|
7
|
+
<TopBar />
|
|
8
|
+
<main style={{ padding: '2rem' }}>
|
|
9
|
+
<h1>{title}</h1>
|
|
10
|
+
{children}
|
|
11
|
+
</main>
|
|
12
|
+
<Footer />
|
|
13
|
+
</GuiProvider>
|
|
14
|
+
)
|
|
15
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Box } from '@mui/material';
|
|
2
|
+
|
|
3
|
+
// Gridme is a generic grid layout component based on MUI's Box.
|
|
4
|
+
// It allows you to quickly define a grid layout with customizable number of columns and spacing.
|
|
5
|
+
// You can also control the maximum width of each grid item via the `itemMaxWidth` prop.
|
|
6
|
+
// This wrapper is part of this.GUI's declarative approach to layout construction.
|
|
7
|
+
const Gridme = ({
|
|
8
|
+
children,
|
|
9
|
+
columns = 3,
|
|
10
|
+
columnGap = '0.5rem',
|
|
11
|
+
rowGap = '1rem',
|
|
12
|
+
marginTop = '0px',
|
|
13
|
+
marginBottom = '0px',
|
|
14
|
+
sx = {},
|
|
15
|
+
}) => {
|
|
16
|
+
return (
|
|
17
|
+
<Box
|
|
18
|
+
sx={{
|
|
19
|
+
display: 'grid',
|
|
20
|
+
gridTemplateColumns: `repeat(${columns}, 1fr)`,
|
|
21
|
+
columnGap: columnGap,
|
|
22
|
+
rowGap: rowGap,
|
|
23
|
+
width: '100%',
|
|
24
|
+
alignItems: 'stretch',
|
|
25
|
+
justifyItems: 'stretch',
|
|
26
|
+
mt: marginTop,
|
|
27
|
+
mb: marginBottom,
|
|
28
|
+
'& > *': {
|
|
29
|
+
width: '100%',
|
|
30
|
+
height: '100%',
|
|
31
|
+
},
|
|
32
|
+
...sx,
|
|
33
|
+
}}
|
|
34
|
+
>
|
|
35
|
+
{children}
|
|
36
|
+
</Box>
|
|
37
|
+
);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default Gridme;
|
|
41
|
+
|
|
42
|
+
// Example usage:
|
|
43
|
+
//
|
|
44
|
+
// import Gridme from './Gridme';
|
|
45
|
+
//
|
|
46
|
+
// const Example = () => (
|
|
47
|
+
// <Gridme columns={3} gap="1rem">
|
|
48
|
+
// <Box sx={{ backgroundColor: 'red', height: 100 }} />
|
|
49
|
+
// <Box sx={{ backgroundColor: 'blue', height: 100 }} />
|
|
50
|
+
// <Box sx={{ backgroundColor: 'green', height: 100 }} />
|
|
51
|
+
// </Gridme>
|
|
52
|
+
// );
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Box, Typography } from '@mui/material';
|
|
2
|
+
import * as Icons from 'react-feather';
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
import { Link } from 'react-router-dom';
|
|
5
|
+
|
|
6
|
+
const LilBox = ({
|
|
7
|
+
icon,
|
|
8
|
+
featherIcon,
|
|
9
|
+
label,
|
|
10
|
+
href,
|
|
11
|
+
aspectRatio = '5 / 4',
|
|
12
|
+
}) => {
|
|
13
|
+
const FeatherIcon = featherIcon && Icons[featherIcon] ? Icons[featherIcon] : null;
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<Box
|
|
17
|
+
component={href ? Link : 'div'}
|
|
18
|
+
to={href}
|
|
19
|
+
sx={{
|
|
20
|
+
width: '100%',
|
|
21
|
+
aspectRatio,
|
|
22
|
+
backgroundColor: (theme) =>
|
|
23
|
+
theme.palette.mode === 'dark'
|
|
24
|
+
? 'rgba(255, 255, 255, 0.05)'
|
|
25
|
+
: 'rgba(0, 0, 0, 0.03)',
|
|
26
|
+
border: '1px solid',
|
|
27
|
+
borderColor: (theme) =>
|
|
28
|
+
theme.palette.mode === 'dark'
|
|
29
|
+
? 'rgba(255, 255, 255, 0.1)'
|
|
30
|
+
: 'rgba(0, 0, 0, 0.1)',
|
|
31
|
+
borderRadius: '8px',
|
|
32
|
+
display: 'flex',
|
|
33
|
+
flexDirection: 'column',
|
|
34
|
+
alignItems: 'center',
|
|
35
|
+
justifyContent: 'center',
|
|
36
|
+
color: (theme) => theme.palette.text.primary,
|
|
37
|
+
fontSize: '1rem',
|
|
38
|
+
fontWeight: 300,
|
|
39
|
+
transition: 'transform 0.2s ease',
|
|
40
|
+
textDecoration: 'none',
|
|
41
|
+
cursor: 'pointer',
|
|
42
|
+
'&:hover': {
|
|
43
|
+
transform: 'scale(1.05)',
|
|
44
|
+
},
|
|
45
|
+
}}
|
|
46
|
+
>
|
|
47
|
+
<Box sx={{ fontSize: '1.5rem', mb: 0.5 }}>
|
|
48
|
+
{icon ? icon : FeatherIcon ? <FeatherIcon size={24} /> : null}
|
|
49
|
+
</Box>
|
|
50
|
+
<Typography variant="body2" align="center">
|
|
51
|
+
{label}
|
|
52
|
+
</Typography>
|
|
53
|
+
</Box>
|
|
54
|
+
);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
LilBox.propTypes = {
|
|
58
|
+
icon: PropTypes.node,
|
|
59
|
+
featherIcon: PropTypes.string,
|
|
60
|
+
label: PropTypes.string.isRequired,
|
|
61
|
+
href: PropTypes.string,
|
|
62
|
+
aspectRatio: PropTypes.string,
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export default LilBox;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Link as RouterLink } from "react-router-dom";
|
|
2
|
+
import { Box, Typography, Card, CardActionArea, CardContent } from "@mui/material";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* ModuleCard
|
|
6
|
+
* Clickable card for modules/features.
|
|
7
|
+
*
|
|
8
|
+
* Props:
|
|
9
|
+
* - title: string (required)
|
|
10
|
+
* - description: string
|
|
11
|
+
* - image: string (url to image)
|
|
12
|
+
* - href?: string -> preferred navigation prop (internal route or external URL)
|
|
13
|
+
* - link?: string -> alias of href for backward compatibility
|
|
14
|
+
* - target?: string -> optional target for external links (e.g., "_blank")
|
|
15
|
+
*
|
|
16
|
+
* Behavior:
|
|
17
|
+
* - If `href` (or `link`) starts with http/https, renders an <a>.
|
|
18
|
+
* - Otherwise, renders a React Router <Link> for client-side routing.
|
|
19
|
+
* - Avoids nested anchors: do NOT wrap ModuleCard with another <Link>.
|
|
20
|
+
*/
|
|
21
|
+
const ModuleCard = ({ title, description, image, href, link, target }) => {
|
|
22
|
+
const to = href ?? link ?? null;
|
|
23
|
+
const isExternal = typeof to === "string" && /^https?:\/\//i.test(to);
|
|
24
|
+
|
|
25
|
+
// Decide which props to pass to CardActionArea to avoid <a> inside <a>.
|
|
26
|
+
const navProps = to
|
|
27
|
+
? isExternal
|
|
28
|
+
? { component: "a", href: to, target: target ?? "_self", rel: "noopener noreferrer" }
|
|
29
|
+
: { component: RouterLink, to }
|
|
30
|
+
: {}; // No navigation if no href/link provided
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<Card
|
|
34
|
+
sx={{
|
|
35
|
+
height: "100%",
|
|
36
|
+
backgroundColor: "background.paper",
|
|
37
|
+
boxShadow: 2,
|
|
38
|
+
borderRadius: 2,
|
|
39
|
+
"&:hover": {
|
|
40
|
+
boxShadow: 4,
|
|
41
|
+
transform: "translateY(-2px)",
|
|
42
|
+
transition: "0.3s ease-in-out",
|
|
43
|
+
},
|
|
44
|
+
}}
|
|
45
|
+
>
|
|
46
|
+
<CardActionArea
|
|
47
|
+
{...navProps}
|
|
48
|
+
sx={{ height: "100%", display: "flex", flexDirection: "column" }}
|
|
49
|
+
>
|
|
50
|
+
<CardContent
|
|
51
|
+
sx={{
|
|
52
|
+
display: "flex",
|
|
53
|
+
flexDirection: "column",
|
|
54
|
+
alignItems: "center",
|
|
55
|
+
justifyContent: "center",
|
|
56
|
+
textAlign: "center",
|
|
57
|
+
padding: 2,
|
|
58
|
+
height: "100%",
|
|
59
|
+
}}
|
|
60
|
+
>
|
|
61
|
+
{/* Image */}
|
|
62
|
+
{image && (
|
|
63
|
+
<Box
|
|
64
|
+
component="img"
|
|
65
|
+
src={image}
|
|
66
|
+
alt={title}
|
|
67
|
+
sx={{
|
|
68
|
+
width: "80px",
|
|
69
|
+
height: "80px",
|
|
70
|
+
marginBottom: 1,
|
|
71
|
+
objectFit: "contain",
|
|
72
|
+
}}
|
|
73
|
+
/>
|
|
74
|
+
)}
|
|
75
|
+
|
|
76
|
+
{/* Title */}
|
|
77
|
+
<Typography
|
|
78
|
+
variant="body1"
|
|
79
|
+
sx={{
|
|
80
|
+
fontWeight: 600,
|
|
81
|
+
color: "text.primary",
|
|
82
|
+
marginBottom: 1,
|
|
83
|
+
}}
|
|
84
|
+
>
|
|
85
|
+
{title}
|
|
86
|
+
</Typography>
|
|
87
|
+
|
|
88
|
+
{/* Description */}
|
|
89
|
+
{description && (
|
|
90
|
+
<Typography
|
|
91
|
+
variant="body2"
|
|
92
|
+
sx={{
|
|
93
|
+
fontSize: "0.85rem",
|
|
94
|
+
color: "text.secondary",
|
|
95
|
+
}}
|
|
96
|
+
>
|
|
97
|
+
{description}
|
|
98
|
+
</Typography>
|
|
99
|
+
)}
|
|
100
|
+
</CardContent>
|
|
101
|
+
</CardActionArea>
|
|
102
|
+
</Card>
|
|
103
|
+
);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export default ModuleCard;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { Box, Typography, Paper, TextField, IconButton, Avatar, Divider } from '@mui/material';
|
|
3
|
+
import { useTheme, alpha } from '@mui/material/styles';
|
|
4
|
+
import SendIcon from '@mui/icons-material/Send';
|
|
5
|
+
import SmartToyIcon from '@mui/icons-material/SmartToy';
|
|
6
|
+
import PersonIcon from '@mui/icons-material/Person';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* FullChatBot (this.GUI)
|
|
10
|
+
* A full-page, theme-aware chat surface.
|
|
11
|
+
*
|
|
12
|
+
* Props (all optional):
|
|
13
|
+
* - title: string (header title)
|
|
14
|
+
* - initialMessages: Array<{ id?: string, role: 'user'|'bot', text: string }>
|
|
15
|
+
* - onSend: async (text, history) => Promise<string | { text: string } | Array<{ text: string }>> (required to produce replies).
|
|
16
|
+
* - onError: function (error) => void
|
|
17
|
+
* - placeholder: string
|
|
18
|
+
* - headerIcon: ReactNode (defaults to SmartToy)
|
|
19
|
+
* - heightOffset: number|string // extra space to subtract besides navbar height
|
|
20
|
+
* - maxWidth: number|string // container max width
|
|
21
|
+
* - bleedTop: number|string // optionally pull the chat upward (compensate parent padding)
|
|
22
|
+
*/
|
|
23
|
+
export default function FullChatBot({
|
|
24
|
+
title = 'SupportBot Example',
|
|
25
|
+
initialMessages = [ { id: 'b1', role: 'bot', text: "Hi! I'm your Support Bot. How can I help today?" } ],
|
|
26
|
+
onSend,
|
|
27
|
+
onError,
|
|
28
|
+
placeholder = 'Type your message…',
|
|
29
|
+
headerIcon,
|
|
30
|
+
heightOffset = 0,
|
|
31
|
+
maxWidth = 1400,
|
|
32
|
+
bleedTop = 0,
|
|
33
|
+
}) {
|
|
34
|
+
const theme = useTheme();
|
|
35
|
+
|
|
36
|
+
// Colors and surfaces from theme
|
|
37
|
+
const mode = theme?.palette?.mode || 'dark';
|
|
38
|
+
const linkMain = theme?.palette?.link?.main || 'rgb(0,170,150)';
|
|
39
|
+
const borderColor = theme?.custom?.border || (mode === 'dark' ? 'rgba(255,255,255,0.14)' : 'rgba(0,0,0,0.12)');
|
|
40
|
+
const surface = theme?.palette?.background?.paper || (mode === 'dark' ? 'rgb(24,26,28)' : '#ffffff');
|
|
41
|
+
const textPrimary = theme?.palette?.text?.primary || (mode === 'dark' ? '#fff' : '#111');
|
|
42
|
+
const bubbleUserBg = alpha(linkMain, 0.14);
|
|
43
|
+
const bubbleUserBorder = alpha(linkMain, 0.35);
|
|
44
|
+
const bubbleBotBg = mode === 'dark' ? alpha('#ffffff', 0.06) : alpha('#000000', 0.04);
|
|
45
|
+
const bubbleBotBorder = mode === 'dark' ? alpha('#ffffff', 0.12) : alpha('#000000', 0.08);
|
|
46
|
+
|
|
47
|
+
const [messages, setMessages] = useState(() => initialMessages);
|
|
48
|
+
const [input, setInput] = useState('');
|
|
49
|
+
const [isTyping, setIsTyping] = useState(false);
|
|
50
|
+
const listRef = useRef(null);
|
|
51
|
+
|
|
52
|
+
// Auto-scroll to bottom when messages update
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
const el = listRef.current;
|
|
55
|
+
if (el) el.scrollTop = el.scrollHeight;
|
|
56
|
+
}, [messages, isTyping]);
|
|
57
|
+
|
|
58
|
+
const handleSend = async () => {
|
|
59
|
+
const trimmed = input.trim();
|
|
60
|
+
if (!trimmed) return;
|
|
61
|
+
const userMsg = { id: `u-${Date.now()}`, role: 'user', text: trimmed };
|
|
62
|
+
setMessages((m) => [...m, userMsg]);
|
|
63
|
+
setInput('');
|
|
64
|
+
|
|
65
|
+
setIsTyping(true);
|
|
66
|
+
try {
|
|
67
|
+
if (typeof onSend !== 'function') {
|
|
68
|
+
console.warn('[FullChatBot] onSend prop is required to generate replies.');
|
|
69
|
+
setIsTyping(false);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
let next = await onSend(trimmed, [...messages, userMsg]);
|
|
73
|
+
const toArray = Array.isArray(next) ? next : [next];
|
|
74
|
+
const prepared = toArray
|
|
75
|
+
.filter(Boolean)
|
|
76
|
+
.map((n, idx) => ({ id: `b-${Date.now()}-${idx}`, role: 'bot', text: typeof n === 'string' ? n : (n?.text || '') }));
|
|
77
|
+
// small UX delay
|
|
78
|
+
setTimeout(() => {
|
|
79
|
+
setMessages((m) => [...m, ...prepared]);
|
|
80
|
+
setIsTyping(false);
|
|
81
|
+
}, 200);
|
|
82
|
+
} catch (e) {
|
|
83
|
+
if (typeof onError === 'function') try { onError(e); } catch (_) {}
|
|
84
|
+
setMessages((m) => [...m, { id: `b-${Date.now()}`, role: 'bot', text: 'Sorry, something went wrong. Please try again.' }]);
|
|
85
|
+
setIsTyping(false);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const onKeyDown = (e) => {
|
|
90
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
91
|
+
e.preventDefault();
|
|
92
|
+
handleSend();
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const bubbleStyles = (role) => {
|
|
97
|
+
const isUser = role === 'user';
|
|
98
|
+
return {
|
|
99
|
+
alignSelf: isUser ? 'flex-end' : 'flex-start',
|
|
100
|
+
maxWidth: '78%',
|
|
101
|
+
padding: '10px 12px',
|
|
102
|
+
borderRadius: 12,
|
|
103
|
+
background: isUser ? bubbleUserBg : bubbleBotBg,
|
|
104
|
+
border: `1px solid ${isUser ? bubbleUserBorder : bubbleBotBorder}`,
|
|
105
|
+
color: 'inherit',
|
|
106
|
+
wordBreak: 'break-word'
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const HeaderIcon = headerIcon || <SmartToyIcon sx={{ color: linkMain }} />;
|
|
111
|
+
|
|
112
|
+
// Full height relative to viewport minus navbar and optional offset
|
|
113
|
+
const topCalc = `calc(97vh - var(--nav-height, 56px) - ${typeof heightOffset === 'number' ? `${heightOffset}px` : String(heightOffset)})`;
|
|
114
|
+
const mtBleed = bleedTop ? (typeof bleedTop === 'number' ? `${-bleedTop}px` : `calc(0px - ${String(bleedTop)})`) : 0;
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<Box sx={{ width: '100%', maxWidth, mx: 'auto', height: topCalc, mt: mtBleed, display: 'flex', flexDirection: 'column', color: textPrimary, colorScheme: mode }}>
|
|
118
|
+
{/* Header */}
|
|
119
|
+
<Box
|
|
120
|
+
sx={{
|
|
121
|
+
display: 'flex',
|
|
122
|
+
alignItems: 'center',
|
|
123
|
+
gap: 1,
|
|
124
|
+
px: 2,
|
|
125
|
+
py: 1,
|
|
126
|
+
border: '1px solid',
|
|
127
|
+
borderColor: borderColor,
|
|
128
|
+
borderBottom: 'none',
|
|
129
|
+
borderTopLeftRadius: 8,
|
|
130
|
+
borderTopRightRadius: 8,
|
|
131
|
+
background: surface,
|
|
132
|
+
}}
|
|
133
|
+
>
|
|
134
|
+
{HeaderIcon}
|
|
135
|
+
<Typography variant="h6" sx={{ fontWeight: 700 }}>{title}</Typography>
|
|
136
|
+
</Box>
|
|
137
|
+
|
|
138
|
+
{/* Chat container fills remaining space */}
|
|
139
|
+
<Paper elevation={0} sx={{
|
|
140
|
+
flex: 1,
|
|
141
|
+
display: 'flex',
|
|
142
|
+
flexDirection: 'column',
|
|
143
|
+
border: '1px solid',
|
|
144
|
+
borderColor: borderColor,
|
|
145
|
+
borderRadius: 2,
|
|
146
|
+
background: surface,
|
|
147
|
+
minHeight: 360
|
|
148
|
+
}}>
|
|
149
|
+
{/* Conversation */}
|
|
150
|
+
<Box ref={listRef} sx={{
|
|
151
|
+
flex: 1,
|
|
152
|
+
overflowY: 'auto',
|
|
153
|
+
p: 2,
|
|
154
|
+
display: 'flex',
|
|
155
|
+
flexDirection: 'column',
|
|
156
|
+
gap: 1.2
|
|
157
|
+
}}>
|
|
158
|
+
{messages.map((m) => (
|
|
159
|
+
<Box key={m.id} sx={{ display: 'flex', gap: 1, alignItems: 'flex-start', flexDirection: m.role === 'user' ? 'row-reverse' : 'row' }}>
|
|
160
|
+
<Avatar sx={{ width: 28, height: 28, bgcolor: m.role === 'user' ? 'rgba(0,170,150,0.18)' : 'rgba(255,255,255,0.08)', border: '1px solid', borderColor: m.role === 'user' ? 'rgba(0,170,150,0.4)' : 'rgba(255,255,255,0.18)' }}>
|
|
161
|
+
{m.role === 'user' ? <PersonIcon fontSize="small" /> : <SmartToyIcon fontSize="small" />}
|
|
162
|
+
</Avatar>
|
|
163
|
+
<Box sx={bubbleStyles(m.role)}>
|
|
164
|
+
<Typography variant="body2">{m.text}</Typography>
|
|
165
|
+
</Box>
|
|
166
|
+
</Box>
|
|
167
|
+
))}
|
|
168
|
+
{isTyping && (
|
|
169
|
+
<Box sx={{ display: 'flex', gap: 1, alignItems: 'center' }}>
|
|
170
|
+
<Avatar sx={{ width: 28, height: 28, bgcolor: 'rgba(255,255,255,0.08)', border: '1px solid rgba(255,255,255,0.18)' }}>
|
|
171
|
+
<SmartToyIcon fontSize="small" />
|
|
172
|
+
</Avatar>
|
|
173
|
+
<Box sx={{ ...bubbleStyles('bot'), display: 'inline-flex', gap: 1 }}>
|
|
174
|
+
<Dot /> <Dot delay={120} /> <Dot delay={240} />
|
|
175
|
+
</Box>
|
|
176
|
+
</Box>
|
|
177
|
+
)}
|
|
178
|
+
</Box>
|
|
179
|
+
<Divider />
|
|
180
|
+
{/* Composer */}
|
|
181
|
+
<Box sx={{ display: 'flex', alignItems: 'center', p: 1 }}>
|
|
182
|
+
<TextField
|
|
183
|
+
value={input}
|
|
184
|
+
onChange={(e) => setInput(e.target.value)}
|
|
185
|
+
onKeyDown={onKeyDown}
|
|
186
|
+
placeholder={placeholder}
|
|
187
|
+
variant="standard"
|
|
188
|
+
fullWidth
|
|
189
|
+
InputProps={{ disableUnderline: true }}
|
|
190
|
+
sx={{
|
|
191
|
+
mx: 1,
|
|
192
|
+
px: 1.5,
|
|
193
|
+
py: 1,
|
|
194
|
+
borderRadius: 1,
|
|
195
|
+
border: '1px solid',
|
|
196
|
+
borderColor: borderColor,
|
|
197
|
+
background: mode === 'dark' ? alpha('#ffffff', 0.04) : alpha('#000000', 0.03)
|
|
198
|
+
}}
|
|
199
|
+
/>
|
|
200
|
+
<IconButton color="primary" onClick={handleSend} aria-label="send">
|
|
201
|
+
<SendIcon />
|
|
202
|
+
</IconButton>
|
|
203
|
+
</Box>
|
|
204
|
+
</Paper>
|
|
205
|
+
</Box>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function Dot({ delay = 0 }) {
|
|
210
|
+
const [on, setOn] = useState(false);
|
|
211
|
+
useEffect(() => {
|
|
212
|
+
const id = setInterval(() => setOn((v) => !v), 350);
|
|
213
|
+
return () => clearInterval(id);
|
|
214
|
+
}, []);
|
|
215
|
+
return (
|
|
216
|
+
<Box component="span" sx={{
|
|
217
|
+
width: 6, height: 6, borderRadius: 1,
|
|
218
|
+
display: 'inline-block',
|
|
219
|
+
background: on ? 'rgba(255,255,255,0.8)' : 'rgba(255,255,255,0.35)',
|
|
220
|
+
transition: 'opacity 200ms ease',
|
|
221
|
+
}} />
|
|
222
|
+
);
|
|
223
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// src/components/Pages/CodeBlock.jsx
|
|
2
|
+
import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
|
|
3
|
+
import { oneDark } from 'react-syntax-highlighter/dist/esm/styles/prism';
|
|
4
|
+
import { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism';
|
|
5
|
+
import { useTheme } from '@mui/material/styles';
|
|
6
|
+
|
|
7
|
+
export default function CodeBlock({ children, language = "javascript" }) {
|
|
8
|
+
const theme = useTheme();
|
|
9
|
+
const isDark = theme.palette.mode === "dark";
|
|
10
|
+
|
|
11
|
+
return (
|
|
12
|
+
<SyntaxHighlighter
|
|
13
|
+
language={language}
|
|
14
|
+
style={isDark ? oneDark : oneLight}
|
|
15
|
+
customStyle={{
|
|
16
|
+
borderRadius: "6px",
|
|
17
|
+
fontSize: "0.85rem",
|
|
18
|
+
padding: "1rem",
|
|
19
|
+
backgroundColor: isDark ? "#1e1e1e" : "#f5f5f5",
|
|
20
|
+
border: isDark ? "1px solid rgba(255,255,255,0.1)" : "1px solid #ddd",
|
|
21
|
+
color: isDark ? "#f8f8f2" : "#2d2d2d",
|
|
22
|
+
textShadow: "none",
|
|
23
|
+
}}
|
|
24
|
+
codeTagProps={{
|
|
25
|
+
style: {
|
|
26
|
+
textShadow: "none", // Fuerza remover cualquier sombra
|
|
27
|
+
}
|
|
28
|
+
}}
|
|
29
|
+
>
|
|
30
|
+
{children.trim()}
|
|
31
|
+
</SyntaxHighlighter>
|
|
32
|
+
);
|
|
33
|
+
}
|