tharaday 0.1.1
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/.gitignore +30 -0
- package/.prettierrc.json +10 -0
- package/.storybook/main.ts +8 -0
- package/.storybook/preview.ts +50 -0
- package/.versionrc.json +6 -0
- package/README.md +73 -0
- package/dist/components/Accordion/Accordion.d.ts +2 -0
- package/dist/components/Accordion/Accordion.stories.d.ts +14 -0
- package/dist/components/Accordion/Accordion.types.d.ts +18 -0
- package/dist/components/Avatar/Avatar.d.ts +2 -0
- package/dist/components/Avatar/Avatar.stories.d.ts +14 -0
- package/dist/components/Avatar/Avatar.types.d.ts +10 -0
- package/dist/components/Badge/Badge.d.ts +2 -0
- package/dist/components/Badge/Badge.stories.d.ts +33 -0
- package/dist/components/Badge/Badge.types.d.ts +9 -0
- package/dist/components/Box/Box.d.ts +2 -0
- package/dist/components/Box/Box.stories.d.ts +38 -0
- package/dist/components/Box/Box.types.d.ts +49 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +3 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.stories.d.ts +13 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.types.d.ts +11 -0
- package/dist/components/Button/Button.d.ts +2 -0
- package/dist/components/Button/Button.stories.d.ts +22 -0
- package/dist/components/Button/Button.types.d.ts +12 -0
- package/dist/components/Card/Card.d.ts +5 -0
- package/dist/components/Card/Card.stories.d.ts +27 -0
- package/dist/components/Card/Card.types.d.ts +15 -0
- package/dist/components/Checkbox/Checkbox.d.ts +2 -0
- package/dist/components/Checkbox/Checkbox.stories.d.ts +17 -0
- package/dist/components/Checkbox/Checkbox.types.d.ts +6 -0
- package/dist/components/Dropdown/Dropdown.d.ts +2 -0
- package/dist/components/Dropdown/Dropdown.stories.d.ts +12 -0
- package/dist/components/Dropdown/Dropdown.types.d.ts +24 -0
- package/dist/components/Header/Header.d.ts +2 -0
- package/dist/components/Header/Header.stories.d.ts +18 -0
- package/dist/components/Header/Header.types.d.ts +14 -0
- package/dist/components/Input/Input.d.ts +2 -0
- package/dist/components/Input/Input.stories.d.ts +29 -0
- package/dist/components/Input/Input.types.d.ts +8 -0
- package/dist/components/Loader/Loader.d.ts +2 -0
- package/dist/components/Loader/Loader.stories.d.ts +25 -0
- package/dist/components/Loader/Loader.types.d.ts +8 -0
- package/dist/components/Modal/Modal.d.ts +2 -0
- package/dist/components/Modal/Modal.stories.d.ts +22 -0
- package/dist/components/Modal/Modal.types.d.ts +12 -0
- package/dist/components/NavBar/NavBar.d.ts +6 -0
- package/dist/components/NavBar/NavBar.stories.d.ts +8 -0
- package/dist/components/NavBar/NavBar.types.d.ts +34 -0
- package/dist/components/Notification/Notification.d.ts +2 -0
- package/dist/components/Notification/Notification.stories.d.ts +26 -0
- package/dist/components/Notification/Notification.types.d.ts +8 -0
- package/dist/components/Pagination/Pagination.d.ts +2 -0
- package/dist/components/Pagination/Pagination.stories.d.ts +21 -0
- package/dist/components/Pagination/Pagination.types.d.ts +34 -0
- package/dist/components/ProgressBar/ProgressBar.d.ts +2 -0
- package/dist/components/ProgressBar/ProgressBar.stories.d.ts +32 -0
- package/dist/components/ProgressBar/ProgressBar.types.d.ts +12 -0
- package/dist/components/RadioButton/RadioButton.d.ts +2 -0
- package/dist/components/RadioButton/RadioButton.stories.d.ts +30 -0
- package/dist/components/RadioButton/RadioButton.types.d.ts +8 -0
- package/dist/components/Select/Select.d.ts +2 -0
- package/dist/components/Select/Select.stories.d.ts +29 -0
- package/dist/components/Select/Select.types.d.ts +15 -0
- package/dist/components/Skeleton/Skeleton.d.ts +2 -0
- package/dist/components/Skeleton/Skeleton.stories.d.ts +15 -0
- package/dist/components/Skeleton/Skeleton.types.d.ts +8 -0
- package/dist/components/Stepper/Step.d.ts +2 -0
- package/dist/components/Stepper/Step.types.d.ts +17 -0
- package/dist/components/Stepper/Stepper.d.ts +2 -0
- package/dist/components/Stepper/Stepper.stories.d.ts +15 -0
- package/dist/components/Stepper/Stepper.types.d.ts +13 -0
- package/dist/components/Stepper/stepper.utils.d.ts +3 -0
- package/dist/components/Switch/Switch.d.ts +2 -0
- package/dist/components/Switch/Switch.stories.d.ts +16 -0
- package/dist/components/Switch/Switch.types.d.ts +5 -0
- package/dist/components/Table/Table.d.ts +8 -0
- package/dist/components/Table/Table.stories.d.ts +27 -0
- package/dist/components/Table/Table.types.d.ts +17 -0
- package/dist/components/Tabs/Tabs.d.ts +2 -0
- package/dist/components/Tabs/Tabs.stories.d.ts +14 -0
- package/dist/components/Tabs/Tabs.types.d.ts +16 -0
- package/dist/components/Text/Text.d.ts +2 -0
- package/dist/components/Text/Text.stories.d.ts +35 -0
- package/dist/components/Text/Text.types.d.ts +21 -0
- package/dist/components/Textarea/Textarea.d.ts +2 -0
- package/dist/components/Textarea/Textarea.stories.d.ts +29 -0
- package/dist/components/Textarea/Textarea.types.d.ts +9 -0
- package/dist/components/Tooltip/Tooltip.d.ts +2 -0
- package/dist/components/Tooltip/Tooltip.stories.d.ts +10 -0
- package/dist/components/Tooltip/Tooltip.types.d.ts +12 -0
- package/dist/ds.css +1 -0
- package/dist/ds.js +1930 -0
- package/dist/ds.umd.cjs +1 -0
- package/dist/index.d.ts +63 -0
- package/dist/layouts/AppLayout/AppLayout.d.ts +8 -0
- package/dist/layouts/AppLayout/AppLayout.stories.d.ts +19 -0
- package/dist/layouts/AppLayout/AppLayout.types.d.ts +50 -0
- package/dist/layouts/AuthLayout/AuthLayout.d.ts +2 -0
- package/dist/layouts/AuthLayout/AuthLayout.stories.d.ts +12 -0
- package/dist/layouts/AuthLayout/AuthLayout.types.d.ts +7 -0
- package/dist/layouts/DashboardLayout/DashboardLayout.d.ts +2 -0
- package/dist/layouts/DashboardLayout/DashboardLayout.stories.d.ts +17 -0
- package/dist/layouts/DashboardLayout/DashboardLayout.types.d.ts +15 -0
- package/dist/layouts/SettingsLayout/SettingsLayout.d.ts +2 -0
- package/dist/layouts/SettingsLayout/SettingsLayout.stories.d.ts +17 -0
- package/dist/layouts/SettingsLayout/SettingsLayout.types.d.ts +14 -0
- package/eslint.config.js +45 -0
- package/package.json +100 -0
- package/src/components/Accordion/Accordion.module.css +158 -0
- package/src/components/Accordion/Accordion.stories.tsx +133 -0
- package/src/components/Accordion/Accordion.tsx +68 -0
- package/src/components/Accordion/Accordion.types.ts +21 -0
- package/src/components/Avatar/Avatar.module.css +58 -0
- package/src/components/Avatar/Avatar.stories.tsx +41 -0
- package/src/components/Avatar/Avatar.tsx +64 -0
- package/src/components/Avatar/Avatar.types.ts +12 -0
- package/src/components/Badge/Badge.module.css +98 -0
- package/src/components/Badge/Badge.stories.tsx +108 -0
- package/src/components/Badge/Badge.tsx +22 -0
- package/src/components/Badge/Badge.types.ts +11 -0
- package/src/components/Box/Box.module.css +638 -0
- package/src/components/Box/Box.stories.tsx +109 -0
- package/src/components/Box/Box.tsx +95 -0
- package/src/components/Box/Box.types.ts +65 -0
- package/src/components/Breadcrumbs/Breadcrumbs.module.css +41 -0
- package/src/components/Breadcrumbs/Breadcrumbs.stories.tsx +40 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +54 -0
- package/src/components/Breadcrumbs/Breadcrumbs.types.ts +13 -0
- package/src/components/Button/Button.module.css +247 -0
- package/src/components/Button/Button.stories.tsx +93 -0
- package/src/components/Button/Button.tsx +31 -0
- package/src/components/Button/Button.types.ts +14 -0
- package/src/components/Card/Card.module.css +112 -0
- package/src/components/Card/Card.stories.tsx +86 -0
- package/src/components/Card/Card.tsx +70 -0
- package/src/components/Card/Card.types.ts +20 -0
- package/src/components/Checkbox/Checkbox.module.css +88 -0
- package/src/components/Checkbox/Checkbox.stories.tsx +65 -0
- package/src/components/Checkbox/Checkbox.tsx +57 -0
- package/src/components/Checkbox/Checkbox.types.ts +7 -0
- package/src/components/Dropdown/Dropdown.module.css +140 -0
- package/src/components/Dropdown/Dropdown.stories.tsx +86 -0
- package/src/components/Dropdown/Dropdown.tsx +251 -0
- package/src/components/Dropdown/Dropdown.types.ts +27 -0
- package/src/components/Header/Header.module.css +38 -0
- package/src/components/Header/Header.stories.tsx +53 -0
- package/src/components/Header/Header.tsx +49 -0
- package/src/components/Header/Header.types.ts +15 -0
- package/src/components/Input/Input.module.css +87 -0
- package/src/components/Input/Input.stories.tsx +101 -0
- package/src/components/Input/Input.tsx +41 -0
- package/src/components/Input/Input.types.ts +10 -0
- package/src/components/Loader/Loader.module.css +49 -0
- package/src/components/Loader/Loader.stories.tsx +75 -0
- package/src/components/Loader/Loader.tsx +15 -0
- package/src/components/Loader/Loader.types.ts +9 -0
- package/src/components/Modal/Modal.module.css +88 -0
- package/src/components/Modal/Modal.stories.tsx +94 -0
- package/src/components/Modal/Modal.tsx +115 -0
- package/src/components/Modal/Modal.types.ts +13 -0
- package/src/components/NavBar/NavBar.module.css +77 -0
- package/src/components/NavBar/NavBar.stories.tsx +55 -0
- package/src/components/NavBar/NavBar.tsx +50 -0
- package/src/components/NavBar/NavBar.types.ts +36 -0
- package/src/components/Notification/Notification.module.css +72 -0
- package/src/components/Notification/Notification.stories.tsx +81 -0
- package/src/components/Notification/Notification.tsx +34 -0
- package/src/components/Notification/Notification.types.ts +10 -0
- package/src/components/Pagination/Pagination.module.css +31 -0
- package/src/components/Pagination/Pagination.stories.tsx +128 -0
- package/src/components/Pagination/Pagination.tsx +245 -0
- package/src/components/Pagination/Pagination.types.ts +37 -0
- package/src/components/ProgressBar/ProgressBar.module.css +67 -0
- package/src/components/ProgressBar/ProgressBar.stories.tsx +91 -0
- package/src/components/ProgressBar/ProgressBar.tsx +49 -0
- package/src/components/ProgressBar/ProgressBar.types.ts +13 -0
- package/src/components/RadioButton/RadioButton.module.css +162 -0
- package/src/components/RadioButton/RadioButton.stories.tsx +114 -0
- package/src/components/RadioButton/RadioButton.tsx +43 -0
- package/src/components/RadioButton/RadioButton.types.ts +10 -0
- package/src/components/Select/Select.module.css +88 -0
- package/src/components/Select/Select.stories.tsx +99 -0
- package/src/components/Select/Select.tsx +51 -0
- package/src/components/Select/Select.types.ts +18 -0
- package/src/components/Skeleton/Skeleton.module.css +71 -0
- package/src/components/Skeleton/Skeleton.stories.tsx +54 -0
- package/src/components/Skeleton/Skeleton.tsx +32 -0
- package/src/components/Skeleton/Skeleton.types.ts +10 -0
- package/src/components/Stepper/Step.module.css +162 -0
- package/src/components/Stepper/Step.tsx +62 -0
- package/src/components/Stepper/Step.types.ts +19 -0
- package/src/components/Stepper/Stepper.module.css +39 -0
- package/src/components/Stepper/Stepper.stories.tsx +88 -0
- package/src/components/Stepper/Stepper.tsx +47 -0
- package/src/components/Stepper/Stepper.types.ts +16 -0
- package/src/components/Stepper/stepper.utils.ts +41 -0
- package/src/components/Switch/Switch.module.css +74 -0
- package/src/components/Switch/Switch.stories.tsx +56 -0
- package/src/components/Switch/Switch.tsx +36 -0
- package/src/components/Switch/Switch.types.ts +6 -0
- package/src/components/Table/Table.module.css +78 -0
- package/src/components/Table/Table.stories.tsx +124 -0
- package/src/components/Table/Table.tsx +75 -0
- package/src/components/Table/Table.types.ts +29 -0
- package/src/components/Tabs/Tabs.module.css +74 -0
- package/src/components/Tabs/Tabs.stories.tsx +48 -0
- package/src/components/Tabs/Tabs.tsx +113 -0
- package/src/components/Tabs/Tabs.types.ts +18 -0
- package/src/components/Text/Text.module.css +126 -0
- package/src/components/Text/Text.stories.tsx +128 -0
- package/src/components/Text/Text.tsx +50 -0
- package/src/components/Text/Text.types.ts +43 -0
- package/src/components/Textarea/Textarea.module.css +82 -0
- package/src/components/Textarea/Textarea.stories.tsx +99 -0
- package/src/components/Textarea/Textarea.tsx +43 -0
- package/src/components/Textarea/Textarea.types.ts +11 -0
- package/src/components/Tooltip/Tooltip.module.css +125 -0
- package/src/components/Tooltip/Tooltip.stories.tsx +68 -0
- package/src/components/Tooltip/Tooltip.tsx +87 -0
- package/src/components/Tooltip/Tooltip.types.ts +14 -0
- package/src/index.ts +132 -0
- package/src/layouts/AppLayout/AppLayout.module.css +17 -0
- package/src/layouts/AppLayout/AppLayout.stories.tsx +124 -0
- package/src/layouts/AppLayout/AppLayout.tsx +46 -0
- package/src/layouts/AppLayout/AppLayout.types.ts +50 -0
- package/src/layouts/AuthLayout/AuthLayout.module.css +49 -0
- package/src/layouts/AuthLayout/AuthLayout.stories.tsx +109 -0
- package/src/layouts/AuthLayout/AuthLayout.tsx +27 -0
- package/src/layouts/AuthLayout/AuthLayout.types.tsx +8 -0
- package/src/layouts/DashboardLayout/DashboardLayout.module.css +37 -0
- package/src/layouts/DashboardLayout/DashboardLayout.stories.tsx +144 -0
- package/src/layouts/DashboardLayout/DashboardLayout.tsx +41 -0
- package/src/layouts/DashboardLayout/DashboardLayout.types.tsx +14 -0
- package/src/layouts/SettingsLayout/SettingsLayout.module.css +39 -0
- package/src/layouts/SettingsLayout/SettingsLayout.stories.tsx +103 -0
- package/src/layouts/SettingsLayout/SettingsLayout.tsx +37 -0
- package/src/layouts/SettingsLayout/SettingsLayout.types.tsx +13 -0
- package/src/styles/ds.css +12 -0
- package/src/styles/semantic.css +56 -0
- package/src/styles/themes/dark.css +58 -0
- package/src/styles/themes/light.css +58 -0
- package/src/styles/themes/retro.css +58 -0
- package/src/styles/tokens.css +138 -0
- package/tsconfig.app.json +28 -0
- package/tsconfig.json +7 -0
- package/tsconfig.node.json +26 -0
- package/vite.config.ts +33 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
import type { NavBarItem } from '../../components/NavBar/NavBar.types.ts';
|
|
4
|
+
|
|
5
|
+
export interface AppLayoutProps {
|
|
6
|
+
/**
|
|
7
|
+
* Header logo element
|
|
8
|
+
*/
|
|
9
|
+
headerLogo?: ReactNode;
|
|
10
|
+
/**
|
|
11
|
+
* Header title
|
|
12
|
+
*/
|
|
13
|
+
headerTitle?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Current user object for the Header
|
|
16
|
+
*/
|
|
17
|
+
user?: { name: string };
|
|
18
|
+
/**
|
|
19
|
+
* NavBar navigation items
|
|
20
|
+
*/
|
|
21
|
+
navItems: NavBarItem[];
|
|
22
|
+
/**
|
|
23
|
+
* Active NavBar item ID
|
|
24
|
+
*/
|
|
25
|
+
activeNavId?: string;
|
|
26
|
+
/**
|
|
27
|
+
* NavBar actions (right side)
|
|
28
|
+
*/
|
|
29
|
+
navActions?: ReactNode;
|
|
30
|
+
/**
|
|
31
|
+
* Content to display in the main area
|
|
32
|
+
*/
|
|
33
|
+
children: ReactNode;
|
|
34
|
+
/**
|
|
35
|
+
* Callback for header login
|
|
36
|
+
*/
|
|
37
|
+
onLogin?: () => void;
|
|
38
|
+
/**
|
|
39
|
+
* Callback for header logout
|
|
40
|
+
*/
|
|
41
|
+
onLogout?: () => void;
|
|
42
|
+
/**
|
|
43
|
+
* Callback for header create account
|
|
44
|
+
*/
|
|
45
|
+
onCreateAccount?: () => void;
|
|
46
|
+
/**
|
|
47
|
+
* Callback for nav item click
|
|
48
|
+
*/
|
|
49
|
+
onNavItemClick?: (id: string) => void;
|
|
50
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
.root {
|
|
2
|
+
min-height: 100vh;
|
|
3
|
+
display: flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
background-color: var(--ds-surface-1);
|
|
7
|
+
font-family: var(--ds-font-family-base);
|
|
8
|
+
padding: var(--ds-space-4);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.card {
|
|
12
|
+
width: 100%;
|
|
13
|
+
max-width: 25rem;
|
|
14
|
+
background-color: var(--ds-surface-0);
|
|
15
|
+
border-radius: var(--ds-radius-lg);
|
|
16
|
+
box-shadow: var(--ds-shadow-md);
|
|
17
|
+
padding: var(--ds-space-8);
|
|
18
|
+
border: 1px solid var(--ds-border-1);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.header {
|
|
22
|
+
text-align: center;
|
|
23
|
+
margin-bottom: var(--ds-space-8);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.logo {
|
|
27
|
+
display: flex;
|
|
28
|
+
justify-content: center;
|
|
29
|
+
margin-bottom: var(--ds-space-4);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.title {
|
|
33
|
+
font-size: var(--ds-font-size-2xl);
|
|
34
|
+
font-weight: var(--ds-font-weight-bold);
|
|
35
|
+
color: var(--ds-text-1);
|
|
36
|
+
margin: 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.description {
|
|
40
|
+
font-size: var(--ds-font-size-sm);
|
|
41
|
+
color: var(--ds-text-2);
|
|
42
|
+
margin-top: var(--ds-space-2);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.content {
|
|
46
|
+
display: flex;
|
|
47
|
+
flex-direction: column;
|
|
48
|
+
gap: var(--ds-space-4);
|
|
49
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
|
|
3
|
+
import { AuthLayout } from './AuthLayout.tsx';
|
|
4
|
+
import { Box } from '../../components/Box/Box.tsx';
|
|
5
|
+
import { Button } from '../../components/Button/Button.tsx';
|
|
6
|
+
import { Input } from '../../components/Input/Input.tsx';
|
|
7
|
+
import { Text } from '../../components/Text/Text.tsx';
|
|
8
|
+
|
|
9
|
+
const meta = {
|
|
10
|
+
title: 'Layouts/Auth',
|
|
11
|
+
component: AuthLayout,
|
|
12
|
+
parameters: {
|
|
13
|
+
layout: 'fullscreen',
|
|
14
|
+
},
|
|
15
|
+
} satisfies Meta<typeof AuthLayout>;
|
|
16
|
+
|
|
17
|
+
export default meta;
|
|
18
|
+
type Story = StoryObj<typeof meta>;
|
|
19
|
+
|
|
20
|
+
const logo = (
|
|
21
|
+
<svg width="48" height="48" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
|
|
22
|
+
<g fill="none" fillRule="evenodd">
|
|
23
|
+
<path
|
|
24
|
+
d="M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z"
|
|
25
|
+
fill="#3b82f6"
|
|
26
|
+
/>
|
|
27
|
+
<path d="M16 8l8 12H8l8-12z" fill="#FFF" />
|
|
28
|
+
</g>
|
|
29
|
+
</svg>
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
export const Login: Story = {
|
|
33
|
+
args: {
|
|
34
|
+
logo,
|
|
35
|
+
title: 'Welcome Back',
|
|
36
|
+
description: 'Please enter your details to sign in to your account.',
|
|
37
|
+
children: (
|
|
38
|
+
<Box
|
|
39
|
+
as="form"
|
|
40
|
+
display="flex"
|
|
41
|
+
flexDirection="column"
|
|
42
|
+
gap={6}
|
|
43
|
+
onSubmit={(e) => e.preventDefault()}
|
|
44
|
+
>
|
|
45
|
+
<Input label="Email Address" type="email" placeholder="name@company.com" required />
|
|
46
|
+
<Box display="flex" flexDirection="column" gap={2}>
|
|
47
|
+
<Input label="Password" type="password" placeholder="••••••••" required />
|
|
48
|
+
<Box display="flex" justifyContent="flex-end">
|
|
49
|
+
<Button variant="subtle" size="sm" className="p-0">
|
|
50
|
+
Forgot password?
|
|
51
|
+
</Button>
|
|
52
|
+
</Box>
|
|
53
|
+
</Box>
|
|
54
|
+
<Button variant="solid" intent="info" type="submit" className="w-full">
|
|
55
|
+
Sign In
|
|
56
|
+
</Button>
|
|
57
|
+
<Box textAlign="center">
|
|
58
|
+
<Text variant="body-sm" color="subtle">
|
|
59
|
+
Don't have an account?{' '}
|
|
60
|
+
<Button variant="subtle" size="sm" className="p-0">
|
|
61
|
+
Sign up
|
|
62
|
+
</Button>
|
|
63
|
+
</Text>
|
|
64
|
+
</Box>
|
|
65
|
+
</Box>
|
|
66
|
+
),
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const SignUp: Story = {
|
|
71
|
+
args: {
|
|
72
|
+
logo,
|
|
73
|
+
title: 'Create an Account',
|
|
74
|
+
description: 'Join thousands of designers building better products.',
|
|
75
|
+
children: (
|
|
76
|
+
<Box
|
|
77
|
+
as="form"
|
|
78
|
+
display="flex"
|
|
79
|
+
flexDirection="column"
|
|
80
|
+
gap={6}
|
|
81
|
+
onSubmit={(e) => e.preventDefault()}
|
|
82
|
+
>
|
|
83
|
+
<Box display="grid" gridTemplateColumns="1fr 1fr" gap={4}>
|
|
84
|
+
<Input label="First Name" placeholder="Jane" required />
|
|
85
|
+
<Input label="Last Name" placeholder="Doe" required />
|
|
86
|
+
</Box>
|
|
87
|
+
<Input label="Email Address" type="email" placeholder="name@company.com" required />
|
|
88
|
+
<Input
|
|
89
|
+
label="Password"
|
|
90
|
+
type="password"
|
|
91
|
+
placeholder="Create a password"
|
|
92
|
+
required
|
|
93
|
+
helperText="Must be at least 8 characters."
|
|
94
|
+
/>
|
|
95
|
+
<Button variant="solid" intent="info" type="submit" className="w-full">
|
|
96
|
+
Get Started
|
|
97
|
+
</Button>
|
|
98
|
+
<Box textAlign="center">
|
|
99
|
+
<Text variant="body-sm" color="subtle">
|
|
100
|
+
Already have an account?{' '}
|
|
101
|
+
<Button variant="subtle" size="sm" className="p-0">
|
|
102
|
+
Log in
|
|
103
|
+
</Button>
|
|
104
|
+
</Text>
|
|
105
|
+
</Box>
|
|
106
|
+
</Box>
|
|
107
|
+
),
|
|
108
|
+
},
|
|
109
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import styles from './AuthLayout.module.css';
|
|
2
|
+
import type { AuthLayoutProps } from './AuthLayout.types.tsx';
|
|
3
|
+
import { Box } from '../../components/Box/Box.tsx';
|
|
4
|
+
import { Text } from '../../components/Text/Text.tsx';
|
|
5
|
+
|
|
6
|
+
export const AuthLayout = ({ logo, title, description, children }: AuthLayoutProps) => {
|
|
7
|
+
return (
|
|
8
|
+
<Box className={styles.root}>
|
|
9
|
+
<Box className={styles.card}>
|
|
10
|
+
<Box className={styles.header}>
|
|
11
|
+
{logo && <Box className={styles.logo}>{logo}</Box>}
|
|
12
|
+
{title && (
|
|
13
|
+
<Text variant="h3" as="h1" className={styles.title}>
|
|
14
|
+
{title}
|
|
15
|
+
</Text>
|
|
16
|
+
)}
|
|
17
|
+
{description && (
|
|
18
|
+
<Text variant="body-sm" color="subtle" className={styles.description}>
|
|
19
|
+
{description}
|
|
20
|
+
</Text>
|
|
21
|
+
)}
|
|
22
|
+
</Box>
|
|
23
|
+
<Box className={styles.content}>{children}</Box>
|
|
24
|
+
</Box>
|
|
25
|
+
</Box>
|
|
26
|
+
);
|
|
27
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
.root {
|
|
2
|
+
min-height: 100vh;
|
|
3
|
+
background-color: var(--ds-surface-1);
|
|
4
|
+
font-family: var(--ds-font-family-base);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.main {
|
|
8
|
+
padding: var(--ds-space-6) 0;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.container {
|
|
12
|
+
max-width: 75rem;
|
|
13
|
+
margin: 0 auto;
|
|
14
|
+
padding: 0 var(--ds-space-4);
|
|
15
|
+
display: flex;
|
|
16
|
+
flex-direction: column;
|
|
17
|
+
gap: var(--ds-space-6);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.topBar {
|
|
21
|
+
display: flex;
|
|
22
|
+
justify-content: space-between;
|
|
23
|
+
align-items: center;
|
|
24
|
+
gap: var(--ds-space-4);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.stats {
|
|
28
|
+
display: grid;
|
|
29
|
+
grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
|
|
30
|
+
gap: var(--ds-space-4);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.content {
|
|
34
|
+
display: flex;
|
|
35
|
+
flex-direction: column;
|
|
36
|
+
gap: var(--ds-space-4);
|
|
37
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { fn } from 'storybook/test';
|
|
3
|
+
|
|
4
|
+
import { DashboardLayout } from './DashboardLayout.tsx';
|
|
5
|
+
import { Badge } from '../../components/Badge/Badge.tsx';
|
|
6
|
+
import type { BadgeIntent } from '../../components/Badge/Badge.types.ts';
|
|
7
|
+
import { Box } from '../../components/Box/Box.tsx';
|
|
8
|
+
import { Breadcrumbs, BreadcrumbItem } from '../../components/Breadcrumbs/Breadcrumbs.tsx';
|
|
9
|
+
import { Button } from '../../components/Button/Button.tsx';
|
|
10
|
+
import { Card, CardHeader, CardContent } from '../../components/Card/Card.tsx';
|
|
11
|
+
import { Text } from '../../components/Text/Text.tsx';
|
|
12
|
+
|
|
13
|
+
const meta = {
|
|
14
|
+
title: 'Layouts/Dashboard',
|
|
15
|
+
component: DashboardLayout,
|
|
16
|
+
parameters: {
|
|
17
|
+
layout: 'fullscreen',
|
|
18
|
+
},
|
|
19
|
+
args: {
|
|
20
|
+
headerTitle: 'DS Creator',
|
|
21
|
+
onLogin: fn(),
|
|
22
|
+
onLogout: fn(),
|
|
23
|
+
onCreateAccount: fn(),
|
|
24
|
+
},
|
|
25
|
+
} satisfies Meta<typeof DashboardLayout>;
|
|
26
|
+
|
|
27
|
+
export default meta;
|
|
28
|
+
type Story = StoryObj<typeof meta>;
|
|
29
|
+
|
|
30
|
+
const logo = (
|
|
31
|
+
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
|
|
32
|
+
<g fill="none" fillRule="evenodd">
|
|
33
|
+
<path
|
|
34
|
+
d="M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z"
|
|
35
|
+
fill="#3b82f6"
|
|
36
|
+
/>
|
|
37
|
+
<path d="M16 8l8 12H8l8-12z" fill="#FFF" />
|
|
38
|
+
</g>
|
|
39
|
+
</svg>
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
export const Overview: Story = {
|
|
43
|
+
args: {
|
|
44
|
+
headerLogo: logo,
|
|
45
|
+
user: { name: 'Design Creator' },
|
|
46
|
+
breadcrumbs: (
|
|
47
|
+
<Breadcrumbs>
|
|
48
|
+
<BreadcrumbItem href="#">Home</BreadcrumbItem>
|
|
49
|
+
<BreadcrumbItem isCurrent>Dashboard</BreadcrumbItem>
|
|
50
|
+
</Breadcrumbs>
|
|
51
|
+
),
|
|
52
|
+
actions: (
|
|
53
|
+
<Box display="flex" gap={2}>
|
|
54
|
+
<Button size="sm" variant="outline">
|
|
55
|
+
Export
|
|
56
|
+
</Button>
|
|
57
|
+
<Button size="sm" variant="solid" intent="info">
|
|
58
|
+
New Component
|
|
59
|
+
</Button>
|
|
60
|
+
</Box>
|
|
61
|
+
),
|
|
62
|
+
stats: (
|
|
63
|
+
<Box display="grid" gridTemplateColumns="repeat(4, 1fr)" gap={4}>
|
|
64
|
+
<Card padding="md">
|
|
65
|
+
<CardHeader title="Total Components" />
|
|
66
|
+
<CardContent>
|
|
67
|
+
<Text variant="h3">12</Text>
|
|
68
|
+
<Badge intent="success" size="sm">
|
|
69
|
+
+2 this week
|
|
70
|
+
</Badge>
|
|
71
|
+
</CardContent>
|
|
72
|
+
</Card>
|
|
73
|
+
<Card padding="md">
|
|
74
|
+
<CardHeader title="Active Tokens" />
|
|
75
|
+
<CardContent>
|
|
76
|
+
<Text variant="h3">156</Text>
|
|
77
|
+
<Badge intent="neutral" size="sm">
|
|
78
|
+
Stable
|
|
79
|
+
</Badge>
|
|
80
|
+
</CardContent>
|
|
81
|
+
</Card>
|
|
82
|
+
<Card padding="md">
|
|
83
|
+
<CardHeader title="System Health" />
|
|
84
|
+
<CardContent>
|
|
85
|
+
<Text variant="h3">98%</Text>
|
|
86
|
+
<Badge intent="info" size="sm">
|
|
87
|
+
Optimal
|
|
88
|
+
</Badge>
|
|
89
|
+
</CardContent>
|
|
90
|
+
</Card>
|
|
91
|
+
<Card padding="md">
|
|
92
|
+
<CardHeader title="Open Issues" />
|
|
93
|
+
<CardContent>
|
|
94
|
+
<Text variant="h3">3</Text>
|
|
95
|
+
<Badge intent="danger" size="sm">
|
|
96
|
+
Requires action
|
|
97
|
+
</Badge>
|
|
98
|
+
</CardContent>
|
|
99
|
+
</Card>
|
|
100
|
+
</Box>
|
|
101
|
+
),
|
|
102
|
+
children: (
|
|
103
|
+
<Card bordered>
|
|
104
|
+
<CardHeader
|
|
105
|
+
title="Recent Activity"
|
|
106
|
+
subtitle="Updates from your team in the last 24 hours"
|
|
107
|
+
/>
|
|
108
|
+
<CardContent>
|
|
109
|
+
<Box display="flex" flexDirection="column" gap={3}>
|
|
110
|
+
{[
|
|
111
|
+
{ user: 'Alex', action: 'updated Button.tsx', time: '2h ago', status: 'success' },
|
|
112
|
+
{ user: 'Sam', action: 'added Modal component', time: '5h ago', status: 'info' },
|
|
113
|
+
{ user: 'Jo', action: 'deprecated legacy colors', time: '1d ago', status: 'warning' },
|
|
114
|
+
].map((item, i) => (
|
|
115
|
+
<Box
|
|
116
|
+
key={i}
|
|
117
|
+
display="flex"
|
|
118
|
+
justifyContent="space-between"
|
|
119
|
+
alignItems="center"
|
|
120
|
+
paddingY={2}
|
|
121
|
+
borderBottom={i < 2}
|
|
122
|
+
>
|
|
123
|
+
<Text variant="body-md">
|
|
124
|
+
<Text as="span" weight="bold">
|
|
125
|
+
{item.user}
|
|
126
|
+
</Text>{' '}
|
|
127
|
+
{item.action}
|
|
128
|
+
</Text>
|
|
129
|
+
<Box display="flex" alignItems="center" gap={2}>
|
|
130
|
+
<Text variant="body-sm" color="subtle">
|
|
131
|
+
{item.time}
|
|
132
|
+
</Text>
|
|
133
|
+
<Badge intent={item.status as BadgeIntent} size="sm">
|
|
134
|
+
{item.status}
|
|
135
|
+
</Badge>
|
|
136
|
+
</Box>
|
|
137
|
+
</Box>
|
|
138
|
+
))}
|
|
139
|
+
</Box>
|
|
140
|
+
</CardContent>
|
|
141
|
+
</Card>
|
|
142
|
+
),
|
|
143
|
+
},
|
|
144
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import styles from './DashboardLayout.module.css';
|
|
2
|
+
import type { DashboardLayoutProps } from './DashboardLayout.types.tsx';
|
|
3
|
+
import { Header } from '../../components/Header/Header.tsx';
|
|
4
|
+
|
|
5
|
+
export const DashboardLayout = ({
|
|
6
|
+
headerLogo,
|
|
7
|
+
headerTitle = 'Tharaday',
|
|
8
|
+
breadcrumbs,
|
|
9
|
+
actions,
|
|
10
|
+
stats,
|
|
11
|
+
children,
|
|
12
|
+
user,
|
|
13
|
+
onLogin,
|
|
14
|
+
onLogout,
|
|
15
|
+
onCreateAccount,
|
|
16
|
+
}: DashboardLayoutProps) => {
|
|
17
|
+
return (
|
|
18
|
+
<div className={styles.root}>
|
|
19
|
+
<Header
|
|
20
|
+
logo={headerLogo}
|
|
21
|
+
title={headerTitle}
|
|
22
|
+
user={user}
|
|
23
|
+
onLogin={onLogin}
|
|
24
|
+
onLogout={onLogout}
|
|
25
|
+
onCreateAccount={onCreateAccount}
|
|
26
|
+
/>
|
|
27
|
+
<main className={styles.main}>
|
|
28
|
+
<div className={styles.container}>
|
|
29
|
+
{(breadcrumbs || actions) && (
|
|
30
|
+
<div className={styles.topBar}>
|
|
31
|
+
<div className={styles.breadcrumbs}>{breadcrumbs}</div>
|
|
32
|
+
<div className={styles.actions}>{actions}</div>
|
|
33
|
+
</div>
|
|
34
|
+
)}
|
|
35
|
+
{stats && <div className={styles.stats}>{stats}</div>}
|
|
36
|
+
<div className={styles.content}>{children}</div>
|
|
37
|
+
</div>
|
|
38
|
+
</main>
|
|
39
|
+
</div>
|
|
40
|
+
);
|
|
41
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface DashboardLayoutProps {
|
|
4
|
+
headerLogo?: ReactNode;
|
|
5
|
+
headerTitle?: string;
|
|
6
|
+
breadcrumbs?: ReactNode;
|
|
7
|
+
actions?: ReactNode;
|
|
8
|
+
stats?: ReactNode;
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
user?: { name: string };
|
|
11
|
+
onLogin?: () => void;
|
|
12
|
+
onLogout?: () => void;
|
|
13
|
+
onCreateAccount?: () => void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
.root {
|
|
2
|
+
min-height: 100vh;
|
|
3
|
+
background-color: var(--ds-surface-1);
|
|
4
|
+
font-family: var(--ds-font-family-base);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.main {
|
|
8
|
+
padding: var(--ds-space-6) 0;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.container {
|
|
12
|
+
max-width: 75rem;
|
|
13
|
+
margin: 0 auto;
|
|
14
|
+
padding: 0 var(--ds-space-4);
|
|
15
|
+
display: flex;
|
|
16
|
+
flex-direction: column;
|
|
17
|
+
gap: var(--ds-space-4);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.layoutBody {
|
|
21
|
+
display: flex;
|
|
22
|
+
gap: var(--ds-space-8);
|
|
23
|
+
align-items: flex-start;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.sidebar {
|
|
27
|
+
width: 15rem;
|
|
28
|
+
flex-shrink: 0;
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
gap: var(--ds-space-1);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.content {
|
|
35
|
+
flex-grow: 1;
|
|
36
|
+
display: flex;
|
|
37
|
+
flex-direction: column;
|
|
38
|
+
gap: var(--ds-space-6);
|
|
39
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { fn } from 'storybook/test';
|
|
3
|
+
|
|
4
|
+
import { SettingsLayout } from './SettingsLayout.tsx';
|
|
5
|
+
import { Box } from '../../components/Box/Box.tsx';
|
|
6
|
+
import { Breadcrumbs, BreadcrumbItem } from '../../components/Breadcrumbs/Breadcrumbs.tsx';
|
|
7
|
+
import { Button } from '../../components/Button/Button.tsx';
|
|
8
|
+
import { Card, CardHeader, CardContent, CardFooter } from '../../components/Card/Card.tsx';
|
|
9
|
+
import { Input } from '../../components/Input/Input.tsx';
|
|
10
|
+
import { Notification } from '../../components/Notification/Notification.tsx';
|
|
11
|
+
import { Text } from '../../components/Text/Text.tsx';
|
|
12
|
+
import { Textarea } from '../../components/Textarea/Textarea.tsx';
|
|
13
|
+
|
|
14
|
+
const meta = {
|
|
15
|
+
title: 'Layouts/Settings',
|
|
16
|
+
component: SettingsLayout,
|
|
17
|
+
parameters: {
|
|
18
|
+
layout: 'fullscreen',
|
|
19
|
+
},
|
|
20
|
+
args: {
|
|
21
|
+
headerTitle: 'DS Creator',
|
|
22
|
+
onLogin: fn(),
|
|
23
|
+
onLogout: fn(),
|
|
24
|
+
onCreateAccount: fn(),
|
|
25
|
+
},
|
|
26
|
+
} satisfies Meta<typeof SettingsLayout>;
|
|
27
|
+
|
|
28
|
+
export default meta;
|
|
29
|
+
type Story = StoryObj<typeof meta>;
|
|
30
|
+
|
|
31
|
+
export const ProfileSettings: Story = {
|
|
32
|
+
args: {
|
|
33
|
+
user: { name: 'Design Creator' },
|
|
34
|
+
breadcrumbs: (
|
|
35
|
+
<Breadcrumbs>
|
|
36
|
+
<BreadcrumbItem href="#">Home</BreadcrumbItem>
|
|
37
|
+
<BreadcrumbItem href="#">Settings</BreadcrumbItem>
|
|
38
|
+
<BreadcrumbItem isCurrent>Profile</BreadcrumbItem>
|
|
39
|
+
</Breadcrumbs>
|
|
40
|
+
),
|
|
41
|
+
sidebar: (
|
|
42
|
+
<Box display="flex" flexDirection="column" gap={1} width="200px">
|
|
43
|
+
<Button variant="solid" intent="info" className="justify-start">
|
|
44
|
+
Profile
|
|
45
|
+
</Button>
|
|
46
|
+
<Button variant="subtle" className="justify-start">
|
|
47
|
+
Account
|
|
48
|
+
</Button>
|
|
49
|
+
<Button variant="subtle" className="justify-start">
|
|
50
|
+
Security
|
|
51
|
+
</Button>
|
|
52
|
+
<Button variant="subtle" className="justify-start">
|
|
53
|
+
Notifications
|
|
54
|
+
</Button>
|
|
55
|
+
<Button variant="subtle" className="justify-start">
|
|
56
|
+
Integrations
|
|
57
|
+
</Button>
|
|
58
|
+
</Box>
|
|
59
|
+
),
|
|
60
|
+
children: (
|
|
61
|
+
<Box display="flex" flexDirection="column" gap={6}>
|
|
62
|
+
<Notification intent="info" title="Public Profile">
|
|
63
|
+
Your profile information will be visible to other members of your organization.
|
|
64
|
+
</Notification>
|
|
65
|
+
|
|
66
|
+
<Card bordered>
|
|
67
|
+
<CardHeader
|
|
68
|
+
title="General Information"
|
|
69
|
+
subtitle="Update your personal details and how others see you."
|
|
70
|
+
/>
|
|
71
|
+
<CardContent>
|
|
72
|
+
<Box display="flex" flexDirection="column" gap={4}>
|
|
73
|
+
<Box display="grid" gridTemplateColumns="1fr 1fr" gap={4}>
|
|
74
|
+
<Input label="First Name" defaultValue="Design" />
|
|
75
|
+
<Input label="Last Name" defaultValue="Creator" />
|
|
76
|
+
</Box>
|
|
77
|
+
<Input label="Email Address" defaultValue="creator@designsystem.com" disabled />
|
|
78
|
+
<Textarea label="Bio" placeholder="Tell us a bit about yourself..." rows={4} />
|
|
79
|
+
</Box>
|
|
80
|
+
</CardContent>
|
|
81
|
+
<CardFooter className="justify-end gap-2">
|
|
82
|
+
<Button variant="outline">Cancel</Button>
|
|
83
|
+
<Button variant="solid" intent="info">
|
|
84
|
+
Save Changes
|
|
85
|
+
</Button>
|
|
86
|
+
</CardFooter>
|
|
87
|
+
</Card>
|
|
88
|
+
|
|
89
|
+
<Card bordered borderColor="danger">
|
|
90
|
+
<CardHeader title="Danger Zone" subtitle="Irreversible actions for your account." />
|
|
91
|
+
<CardContent>
|
|
92
|
+
<Text color="subtle" className="mb-4">
|
|
93
|
+
Once you delete your account, there is no going back. Please be certain.
|
|
94
|
+
</Text>
|
|
95
|
+
<Button variant="outline" intent="danger">
|
|
96
|
+
Delete Account
|
|
97
|
+
</Button>
|
|
98
|
+
</CardContent>
|
|
99
|
+
</Card>
|
|
100
|
+
</Box>
|
|
101
|
+
),
|
|
102
|
+
},
|
|
103
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import styles from './SettingsLayout.module.css';
|
|
2
|
+
import type { SettingsLayoutProps } from './SettingsLayout.types.tsx';
|
|
3
|
+
import { Header } from '../../components/Header/Header.tsx';
|
|
4
|
+
|
|
5
|
+
export const SettingsLayout = ({
|
|
6
|
+
headerLogo,
|
|
7
|
+
headerTitle = 'Tharaday',
|
|
8
|
+
breadcrumbs,
|
|
9
|
+
sidebar,
|
|
10
|
+
children,
|
|
11
|
+
user,
|
|
12
|
+
onLogin,
|
|
13
|
+
onLogout,
|
|
14
|
+
onCreateAccount,
|
|
15
|
+
}: SettingsLayoutProps) => {
|
|
16
|
+
return (
|
|
17
|
+
<div className={styles.root}>
|
|
18
|
+
<Header
|
|
19
|
+
logo={headerLogo}
|
|
20
|
+
title={headerTitle}
|
|
21
|
+
user={user}
|
|
22
|
+
onLogin={onLogin}
|
|
23
|
+
onLogout={onLogout}
|
|
24
|
+
onCreateAccount={onCreateAccount}
|
|
25
|
+
/>
|
|
26
|
+
<main className={styles.main}>
|
|
27
|
+
<div className={styles.container}>
|
|
28
|
+
{breadcrumbs && <div className={styles.breadcrumbs}>{breadcrumbs}</div>}
|
|
29
|
+
<div className={styles.layoutBody}>
|
|
30
|
+
{sidebar && <aside className={styles.sidebar}>{sidebar}</aside>}
|
|
31
|
+
<section className={styles.content}>{children}</section>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</main>
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface SettingsLayoutProps {
|
|
4
|
+
headerLogo?: ReactNode;
|
|
5
|
+
headerTitle?: string;
|
|
6
|
+
breadcrumbs?: ReactNode;
|
|
7
|
+
sidebar?: ReactNode;
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
user?: { name: string };
|
|
10
|
+
onLogin?: () => void;
|
|
11
|
+
onLogout?: () => void;
|
|
12
|
+
onCreateAccount?: () => void;
|
|
13
|
+
}
|