this.gui 1.3.22 → 1.3.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +4 -5
- 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
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React, { forwardRef, Suspense } from 'react';
|
|
2
|
+
import { Link as MuiLink, LinkProps as MuiLinkProps } from '@mui/material';
|
|
3
|
+
import { useInRouterContext } from 'react-router-dom';
|
|
4
|
+
import type { LinkProps as RouterLinkProps } from 'react-router-dom';
|
|
5
|
+
|
|
6
|
+
type GuiLinkProps = MuiLinkProps & { to?: RouterLinkProps['to'] };
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Safe Link wrapper for MUI + React Router
|
|
10
|
+
*/
|
|
11
|
+
const Link = forwardRef<HTMLAnchorElement, GuiLinkProps>(function Link(props, ref) {
|
|
12
|
+
const { to, ...rest } = props;
|
|
13
|
+
const inRouterContext = useInRouterContext();
|
|
14
|
+
|
|
15
|
+
if (!to) return <MuiLink ref={ref} {...rest} />;
|
|
16
|
+
|
|
17
|
+
if (!inRouterContext) {
|
|
18
|
+
const href = typeof to === 'string' ? to : undefined;
|
|
19
|
+
return <MuiLink href={href} ref={ref} {...rest} />;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// ✅ Lazy load RouterLink only inside router context
|
|
23
|
+
const RouterLink = React.lazy(async () => {
|
|
24
|
+
const mod = await import('react-router-dom');
|
|
25
|
+
return { default: mod.Link };
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<Suspense fallback={<MuiLink ref={ref} {...rest} />}>
|
|
30
|
+
<MuiLink component={RouterLink} to={to} ref={ref} {...rest} />
|
|
31
|
+
</Suspense>
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
export default Link;
|
|
36
|
+
export type { GuiLinkProps as LinkProps };
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// src/gui/atoms/List/List.resolver.tsx
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import List from './List';
|
|
4
|
+
import ListSubheader from '@mui/material/ListSubheader';
|
|
5
|
+
import type { RegistryEntry, ResolveCtx } from '@/registry/types';
|
|
6
|
+
import type { SxProps, Theme } from '@mui/material/styles';
|
|
7
|
+
import { ensureNodeId } from '@/gui/utils/nodeID';
|
|
8
|
+
/**
|
|
9
|
+
* Declarative resolver for List
|
|
10
|
+
*
|
|
11
|
+
* Fidelity
|
|
12
|
+
* - Forwards MUI props faithfully (dense, disablePadding, subheader, etc.).
|
|
13
|
+
* - Supports polymorphism via `component` (and alias `as`).
|
|
14
|
+
* - Provides **granular styling** via `sx` (root) and optional `subheaderSx`.
|
|
15
|
+
* - Generates a stable id via `ensureNodeId`.
|
|
16
|
+
*
|
|
17
|
+
* Sugar
|
|
18
|
+
* - `subheaderText`: if provided (and `subheader` not provided), we render
|
|
19
|
+
* a `<ListSubheader />` with that text. You can style it via `subheaderSx`.
|
|
20
|
+
*
|
|
21
|
+
* Note: Routing props (`href`, `to`, `external`) are not handled at the List level.
|
|
22
|
+
*/
|
|
23
|
+
export type ListSpec = {
|
|
24
|
+
type: 'List';
|
|
25
|
+
props?: {
|
|
26
|
+
children?: React.ReactNode;
|
|
27
|
+
// Polymorphism
|
|
28
|
+
component?: any;
|
|
29
|
+
as?: any; // alias of component
|
|
30
|
+
// MUI props (subset; others passthrough)
|
|
31
|
+
dense?: boolean;
|
|
32
|
+
disablePadding?: boolean;
|
|
33
|
+
subheader?: React.ReactNode;
|
|
34
|
+
// Sugar
|
|
35
|
+
subheaderText?: React.ReactNode;
|
|
36
|
+
subheaderSx?: SxProps<Theme>;
|
|
37
|
+
// Styling
|
|
38
|
+
sx?: SxProps<Theme>; // root styles
|
|
39
|
+
className?: string;
|
|
40
|
+
id?: string;
|
|
41
|
+
'data-testid'?: string;
|
|
42
|
+
// Arbitrary passthrough
|
|
43
|
+
[key: string]: any;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const ListResolver: RegistryEntry = {
|
|
48
|
+
type: 'List',
|
|
49
|
+
resolve(spec: ListSpec, _ctx?: ResolveCtx) {
|
|
50
|
+
const p = spec.props ?? {};
|
|
51
|
+
const id = ensureNodeId('list', p.id);
|
|
52
|
+
const component = p.component ?? p.as;
|
|
53
|
+
const {
|
|
54
|
+
children,
|
|
55
|
+
subheader,
|
|
56
|
+
subheaderText,
|
|
57
|
+
subheaderSx,
|
|
58
|
+
// strip resolver-only alias
|
|
59
|
+
as: _as,
|
|
60
|
+
// passthrough rest (dense, disablePadding, sx, etc.)
|
|
61
|
+
...rest
|
|
62
|
+
} = p;
|
|
63
|
+
const effectiveSubheader =
|
|
64
|
+
subheader != null
|
|
65
|
+
? subheader
|
|
66
|
+
: subheaderText != null
|
|
67
|
+
? (
|
|
68
|
+
<ListSubheader component="div" sx={subheaderSx}>
|
|
69
|
+
{subheaderText}
|
|
70
|
+
</ListSubheader>
|
|
71
|
+
)
|
|
72
|
+
: undefined;
|
|
73
|
+
|
|
74
|
+
const rootProps: any = {
|
|
75
|
+
...rest,
|
|
76
|
+
sx: p.sx,
|
|
77
|
+
className: p.className,
|
|
78
|
+
id,
|
|
79
|
+
'data-testid': p['data-testid'],
|
|
80
|
+
subheader: effectiveSubheader,
|
|
81
|
+
};
|
|
82
|
+
if (component !== undefined) {
|
|
83
|
+
rootProps.component = component;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<List {...rootProps}>
|
|
88
|
+
{children}
|
|
89
|
+
</List>
|
|
90
|
+
);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export default ListResolver;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import List from './List';
|
|
4
|
+
import ListItem from '../ListItem/ListItem';
|
|
5
|
+
import ListItemIcon from '@/gui/components/atoms/ListItemIcon/ListItemIcon';
|
|
6
|
+
import ListItemText from '@/gui/components/atoms/ListItemText/ListItemText';
|
|
7
|
+
import Icon from '@/gui/Theme/Icon/Icon';
|
|
8
|
+
import ListSubheader from '@mui/material/ListSubheader';
|
|
9
|
+
|
|
10
|
+
const meta: Meta<typeof List> = {
|
|
11
|
+
title: 'Atoms/Organization/List',
|
|
12
|
+
component: List,
|
|
13
|
+
tags: ['autodocs'],
|
|
14
|
+
decorators: [
|
|
15
|
+
(Story) => (
|
|
16
|
+
<div style={{ padding: 16, minHeight: 260, maxWidth: 560 }}>
|
|
17
|
+
<Story />
|
|
18
|
+
</div>
|
|
19
|
+
),
|
|
20
|
+
],
|
|
21
|
+
parameters: {
|
|
22
|
+
docs: {
|
|
23
|
+
description: {
|
|
24
|
+
component: `
|
|
25
|
+
The **List** atom is a thin wrapper around MUI's \`MuiList\`, staying faithful to its API and polymorphism.
|
|
26
|
+
|
|
27
|
+
In **declarative** mode (resolver), it forwards MUI props and supports granular styling via \`sx\`.
|
|
28
|
+
It also provides sugar: \`subheaderText\` (and \`subheaderSx\`) to easily render a \`<ListSubheader/>\` when you don't pass \`subheader\` explicitly.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
## React usage
|
|
32
|
+
~~~jsx
|
|
33
|
+
<List dense subheader={<li />}> // arbitrary subheader (from MUI API)
|
|
34
|
+
<ListItem>
|
|
35
|
+
<ListItemIcon>
|
|
36
|
+
<Icon name="lucide:inbox" />
|
|
37
|
+
</ListItemIcon>
|
|
38
|
+
<ListItemText primary="Inbox" />
|
|
39
|
+
</ListItem>
|
|
40
|
+
</List>
|
|
41
|
+
~~~
|
|
42
|
+
|
|
43
|
+
## Declarative JSON / Resolver
|
|
44
|
+
~~~json
|
|
45
|
+
{
|
|
46
|
+
"type": "List",
|
|
47
|
+
"props": {
|
|
48
|
+
"dense": true,
|
|
49
|
+
"disablePadding": false,
|
|
50
|
+
"subheaderText": "Shortcuts",
|
|
51
|
+
"subheaderSx": { "fontWeight": 600 },
|
|
52
|
+
"sx": { "bgcolor": "background.paper", "borderRadius": 8 }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
~~~
|
|
56
|
+
*Note:* \`subheaderText\`/\`subheaderSx\` are **resolver-only** sugar; they are not MUI props.
|
|
57
|
+
`,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
controls: {
|
|
61
|
+
exclude: ['component', 'children', 'subheader'],
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
argTypes: {
|
|
65
|
+
dense: { control: 'boolean' },
|
|
66
|
+
disablePadding: { control: 'boolean' },
|
|
67
|
+
sx: { control: 'object', table: { category: 'Style' } },
|
|
68
|
+
},
|
|
69
|
+
args: {
|
|
70
|
+
dense: false,
|
|
71
|
+
disablePadding: false,
|
|
72
|
+
sx: { bgcolor: 'background.paper', borderRadius: 1, border: '1px solid', borderColor: 'divider' },
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export default meta;
|
|
77
|
+
|
|
78
|
+
type Story = StoryObj<typeof List>;
|
|
79
|
+
|
|
80
|
+
const SampleRows: React.FC = () => (
|
|
81
|
+
<>
|
|
82
|
+
<ListItem>
|
|
83
|
+
<ListItemIcon>
|
|
84
|
+
<Icon name="lucide:inbox" />
|
|
85
|
+
</ListItemIcon>
|
|
86
|
+
<ListItemText primary="Inbox" />
|
|
87
|
+
</ListItem>
|
|
88
|
+
<ListItem>
|
|
89
|
+
<ListItemIcon>
|
|
90
|
+
<Icon name="lucide:send" />
|
|
91
|
+
</ListItemIcon>
|
|
92
|
+
<ListItemText primary="Sent" />
|
|
93
|
+
</ListItem>
|
|
94
|
+
<ListItem>
|
|
95
|
+
<ListItemIcon>
|
|
96
|
+
<Icon name="lucide:star" />
|
|
97
|
+
</ListItemIcon>
|
|
98
|
+
<ListItemText primary="Starred" />
|
|
99
|
+
</ListItem>
|
|
100
|
+
</>
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
// ======================= Stories =======================
|
|
104
|
+
export const Playground: Story = {
|
|
105
|
+
render: (args) => (
|
|
106
|
+
<List {...args}>
|
|
107
|
+
<SampleRows />
|
|
108
|
+
</List>
|
|
109
|
+
),
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
export const WithSubheader: Story = {
|
|
113
|
+
name: 'With subheader (MUI prop)',
|
|
114
|
+
render: () => (
|
|
115
|
+
<List subheader={<ListSubheader component="div" sx={{ fontWeight: 600 }}>Shortcuts</ListSubheader>}>
|
|
116
|
+
<SampleRows />
|
|
117
|
+
</List>
|
|
118
|
+
),
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export const DenseAndNoPadding: Story = {
|
|
122
|
+
args: { dense: true, disablePadding: true },
|
|
123
|
+
render: (args) => (
|
|
124
|
+
<List {...args}>
|
|
125
|
+
<SampleRows />
|
|
126
|
+
</List>
|
|
127
|
+
),
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export const StyledWithSx: Story = {
|
|
131
|
+
args: { sx: { bgcolor: 'background.paper', borderRadius: 2, boxShadow: 1 } },
|
|
132
|
+
render: (args) => (
|
|
133
|
+
<List {...args}>
|
|
134
|
+
<SampleRows />
|
|
135
|
+
</List>
|
|
136
|
+
),
|
|
137
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This.GUI — List
|
|
3
|
+
* Thin wrapper around MUI’s List that preserves MUI props & typing.
|
|
4
|
+
*
|
|
5
|
+
* Fidelity
|
|
6
|
+
* - We directly re-export MUI’s component so all behavior/typing remain intact.
|
|
7
|
+
* - Granular styling is supported via the standard `sx` prop (MUI System).
|
|
8
|
+
*
|
|
9
|
+
* Why wrap it?
|
|
10
|
+
* - Consistency with This.GUI’s atom pattern (each atom in its own module).
|
|
11
|
+
* - Provides a clean surface for a resolver (declarative mode) without
|
|
12
|
+
* altering React usage.
|
|
13
|
+
*/
|
|
14
|
+
import * as React from 'react';
|
|
15
|
+
import MuiList from '@mui/material/List';
|
|
16
|
+
const List = MuiList;
|
|
17
|
+
export type ListProps = React.ComponentProps<typeof List>;
|
|
18
|
+
// Helpful display name in React DevTools
|
|
19
|
+
(List as any).displayName = 'Gui.List';
|
|
20
|
+
export default List;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// src/gui/atoms/ListItem/ListItem.resolver.tsx
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import ListItem from './ListItem';
|
|
4
|
+
import type { RegistryEntry, ResolveCtx } from '@/registry/types';
|
|
5
|
+
import type { SxProps, Theme } from '@mui/material/styles';
|
|
6
|
+
import { ensureNodeId } from '@/gui/utils/nodeID';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Declarative resolver for ListItem
|
|
10
|
+
*
|
|
11
|
+
* Fidelity
|
|
12
|
+
* - Forwards all MUI ListItem props faithfully (alignItems, dense, divider, selected, etc.).
|
|
13
|
+
* - Supports polymorphism via `component` prop (and alias `as`).
|
|
14
|
+
* - Provides **granular styling** via `sx`.
|
|
15
|
+
*
|
|
16
|
+
* Notes
|
|
17
|
+
* - In declarative (JSON/registry) mode, just pass props as object.
|
|
18
|
+
* - If children are provided, they render directly.
|
|
19
|
+
* - We emit a stable editor id under `data-gui-id` (not `id`) to avoid clashing with user-provided DOM ids.
|
|
20
|
+
*/
|
|
21
|
+
export type ListItemSpec = {
|
|
22
|
+
type: 'ListItem';
|
|
23
|
+
props?: {
|
|
24
|
+
children?: React.ReactNode;
|
|
25
|
+
|
|
26
|
+
// Polymorphism
|
|
27
|
+
component?: any;
|
|
28
|
+
as?: any;
|
|
29
|
+
|
|
30
|
+
// MUI props (subset; others passthrough in `...rest`)
|
|
31
|
+
dense?: boolean;
|
|
32
|
+
divider?: boolean;
|
|
33
|
+
disableGutters?: boolean;
|
|
34
|
+
selected?: boolean;
|
|
35
|
+
alignItems?: 'flex-start' | 'center';
|
|
36
|
+
secondaryAction?: React.ReactNode;
|
|
37
|
+
|
|
38
|
+
// Styling
|
|
39
|
+
sx?: SxProps<Theme>;
|
|
40
|
+
className?: string;
|
|
41
|
+
|
|
42
|
+
// Identity & testing
|
|
43
|
+
id?: string;
|
|
44
|
+
'data-testid'?: string;
|
|
45
|
+
'data-gui-id'?: string;
|
|
46
|
+
|
|
47
|
+
// Arbitrary passthrough
|
|
48
|
+
[key: string]: any;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const ListItemResolver: RegistryEntry = {
|
|
53
|
+
type: 'ListItem',
|
|
54
|
+
resolve(spec: ListItemSpec, _ctx?: ResolveCtx) {
|
|
55
|
+
const p = spec.props ?? {};
|
|
56
|
+
|
|
57
|
+
// Polymorphic target (avoid passing undefined)
|
|
58
|
+
const component = p.component ?? p.as;
|
|
59
|
+
const rootPolymorphic = component ? { component } : {};
|
|
60
|
+
|
|
61
|
+
// Stable editor id that doesn't clash with user DOM ids
|
|
62
|
+
const guiId = ensureNodeId('list-item', p['data-gui-id']);
|
|
63
|
+
|
|
64
|
+
// Collect props, strip resolver-only keys
|
|
65
|
+
const {
|
|
66
|
+
children,
|
|
67
|
+
as: _as,
|
|
68
|
+
'data-gui-id': _guiIdIn,
|
|
69
|
+
...rest
|
|
70
|
+
} = p;
|
|
71
|
+
|
|
72
|
+
return (
|
|
73
|
+
<ListItem
|
|
74
|
+
{...rootPolymorphic}
|
|
75
|
+
sx={p.sx}
|
|
76
|
+
className={p.className}
|
|
77
|
+
id={p.id}
|
|
78
|
+
data-testid={p['data-testid']}
|
|
79
|
+
data-gui-id={guiId}
|
|
80
|
+
{...rest}
|
|
81
|
+
>
|
|
82
|
+
{children}
|
|
83
|
+
</ListItem>
|
|
84
|
+
);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export default ListItemResolver;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import ListItem from './ListItem';
|
|
4
|
+
import List from '@mui/material/List';
|
|
5
|
+
import ListItemIcon from '@/gui/components/atoms/ListItemIcon/ListItemIcon';
|
|
6
|
+
import ListItemText from '@/gui/components/atoms/ListItemText/ListItemText';
|
|
7
|
+
import Icon from '@/gui/Theme/Icon/Icon';
|
|
8
|
+
const meta: Meta<typeof ListItem> = {
|
|
9
|
+
title: 'Atoms/Organization/ListItem',
|
|
10
|
+
component: ListItem,
|
|
11
|
+
tags: ['autodocs'],
|
|
12
|
+
decorators: [
|
|
13
|
+
(Story) => (
|
|
14
|
+
<div style={{ padding: 16, minHeight: 260, maxWidth: 560 }}>
|
|
15
|
+
<Story />
|
|
16
|
+
</div>
|
|
17
|
+
),
|
|
18
|
+
],
|
|
19
|
+
parameters: {
|
|
20
|
+
docs: {
|
|
21
|
+
description: {
|
|
22
|
+
component: `
|
|
23
|
+
The **ListItem** atom is a thin wrapper around MUI's \`MuiListItem\`, staying faithful to its API and polymorphism.
|
|
24
|
+
In **declarative** mode (resolver), it simply forwards MUI props and allows granular styling via \`sx\`.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## React usage
|
|
29
|
+
~~~jsx
|
|
30
|
+
<List dense>
|
|
31
|
+
<ListItem divider>
|
|
32
|
+
<ListItemIcon>
|
|
33
|
+
<Icon name="lucide:inbox" />
|
|
34
|
+
</ListItemIcon>
|
|
35
|
+
<ListItemText primary="Inbox" secondary="Messages" />
|
|
36
|
+
</ListItem>
|
|
37
|
+
</List>
|
|
38
|
+
~~~
|
|
39
|
+
|
|
40
|
+
## Declarative JSON / Resolver
|
|
41
|
+
~~~json
|
|
42
|
+
{
|
|
43
|
+
"type": "ListItem",
|
|
44
|
+
"props": {
|
|
45
|
+
"dense": true,
|
|
46
|
+
"divider": true,
|
|
47
|
+
"selected": true,
|
|
48
|
+
"sx": { "py": 1 }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
~~~
|
|
52
|
+
`,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
controls: {
|
|
56
|
+
exclude: ['component', 'children'],
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
argTypes: {
|
|
60
|
+
dense: { control: 'boolean' },
|
|
61
|
+
divider: { control: 'boolean' },
|
|
62
|
+
disableGutters: { control: 'boolean' },
|
|
63
|
+
alignItems: { control: { type: 'radio' }, options: ['center', 'flex-start'] },
|
|
64
|
+
sx: { control: 'object' },
|
|
65
|
+
},
|
|
66
|
+
args: {
|
|
67
|
+
dense: false,
|
|
68
|
+
divider: false,
|
|
69
|
+
disableGutters: false,
|
|
70
|
+
alignItems: 'center',
|
|
71
|
+
sx: {},
|
|
72
|
+
children: undefined,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export default meta;
|
|
77
|
+
type Story = StoryObj<typeof ListItem>;
|
|
78
|
+
|
|
79
|
+
const DemoList: React.FC<{ children?: React.ReactNode }> = ({ children }) => (
|
|
80
|
+
<List dense sx={{ bgcolor: 'background.paper', borderRadius: 1, overflow: 'hidden', border: '1px solid', borderColor: 'divider' }}>
|
|
81
|
+
{children}
|
|
82
|
+
</List>
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
// ======================= Stories =======================
|
|
86
|
+
export const Playground: Story = {
|
|
87
|
+
render: (args) => (
|
|
88
|
+
<DemoList>
|
|
89
|
+
<ListItem {...args}>
|
|
90
|
+
<ListItemIcon>
|
|
91
|
+
<Icon name="lucide:inbox" />
|
|
92
|
+
</ListItemIcon>
|
|
93
|
+
<ListItemText primary="Inbox" secondary="Messages" />
|
|
94
|
+
</ListItem>
|
|
95
|
+
</DemoList>
|
|
96
|
+
),
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const Variants: Story = {
|
|
100
|
+
render: () => (
|
|
101
|
+
<DemoList>
|
|
102
|
+
<ListItem>
|
|
103
|
+
<ListItemIcon>
|
|
104
|
+
<Icon name="lucide:mail" />
|
|
105
|
+
</ListItemIcon>
|
|
106
|
+
<ListItemText primary="Default" secondary="No props" />
|
|
107
|
+
</ListItem>
|
|
108
|
+
<ListItem dense>
|
|
109
|
+
<ListItemIcon>
|
|
110
|
+
<Icon name="lucide:mail" />
|
|
111
|
+
</ListItemIcon>
|
|
112
|
+
<ListItemText primary="Dense" />
|
|
113
|
+
</ListItem>
|
|
114
|
+
<ListItem divider>
|
|
115
|
+
<ListItemIcon>
|
|
116
|
+
<Icon name="lucide:mail" />
|
|
117
|
+
</ListItemIcon>
|
|
118
|
+
<ListItemText primary="With divider" />
|
|
119
|
+
</ListItem>
|
|
120
|
+
<ListItem>
|
|
121
|
+
<ListItemIcon>
|
|
122
|
+
<Icon name="lucide:mail" />
|
|
123
|
+
</ListItemIcon>
|
|
124
|
+
<ListItemText primary="Default (no selected on ListItem)" />
|
|
125
|
+
</ListItem>
|
|
126
|
+
<ListItem alignItems="flex-start">
|
|
127
|
+
<ListItemIcon>
|
|
128
|
+
<Icon name="lucide:mail" />
|
|
129
|
+
</ListItemIcon>
|
|
130
|
+
<ListItemText primary="Align start" secondary="Secondary text that wraps onto multiple lines for demo." />
|
|
131
|
+
</ListItem>
|
|
132
|
+
</DemoList>
|
|
133
|
+
),
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
export const WithSx: Story = {
|
|
137
|
+
render: () => (
|
|
138
|
+
<DemoList>
|
|
139
|
+
<ListItem sx={{ py: 1.25, '&:hover': { bgcolor: 'action.hover' } }}>
|
|
140
|
+
<ListItemIcon sx={{ minWidth: 40 }}>
|
|
141
|
+
<Icon name="lucide:user" />
|
|
142
|
+
</ListItemIcon>
|
|
143
|
+
<ListItemText
|
|
144
|
+
primary="Profile"
|
|
145
|
+
secondary="Account"
|
|
146
|
+
secondaryTypographyProps={{ color: 'text.secondary' }}
|
|
147
|
+
/>
|
|
148
|
+
</ListItem>
|
|
149
|
+
</DemoList>
|
|
150
|
+
),
|
|
151
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This.GUI — ListItem
|
|
3
|
+
* Thin wrapper around MUI’s ListItem that preserves MUI’s props and typing.
|
|
4
|
+
*
|
|
5
|
+
* Fidelity
|
|
6
|
+
* - We directly re-export MUI’s component so all behavior and typing remain intact.
|
|
7
|
+
* - Granular styling is supported via the standard `sx` prop (MUI System).
|
|
8
|
+
*
|
|
9
|
+
* Why wrap it?
|
|
10
|
+
* - Consistency with This.GUI’s atom pattern (each atom in its own module).
|
|
11
|
+
* - Enables a clean spot for a resolver (declarative mode) without changing React usage.
|
|
12
|
+
*/
|
|
13
|
+
import * as React from 'react';
|
|
14
|
+
import MuiListItem from '@mui/material/ListItem';
|
|
15
|
+
const ListItem = MuiListItem;
|
|
16
|
+
export type ListItemProps = React.ComponentProps<typeof ListItem>;
|
|
17
|
+
// Useful name in React DevTools
|
|
18
|
+
(ListItem as any).displayName = 'Gui.ListItem';
|
|
19
|
+
export default ListItem;
|