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.
Files changed (247) hide show
  1. package/.gitignore +30 -0
  2. package/.prettierrc.json +10 -0
  3. package/.storybook/main.ts +8 -0
  4. package/.storybook/preview.ts +50 -0
  5. package/.versionrc.json +6 -0
  6. package/README.md +73 -0
  7. package/dist/components/Accordion/Accordion.d.ts +2 -0
  8. package/dist/components/Accordion/Accordion.stories.d.ts +14 -0
  9. package/dist/components/Accordion/Accordion.types.d.ts +18 -0
  10. package/dist/components/Avatar/Avatar.d.ts +2 -0
  11. package/dist/components/Avatar/Avatar.stories.d.ts +14 -0
  12. package/dist/components/Avatar/Avatar.types.d.ts +10 -0
  13. package/dist/components/Badge/Badge.d.ts +2 -0
  14. package/dist/components/Badge/Badge.stories.d.ts +33 -0
  15. package/dist/components/Badge/Badge.types.d.ts +9 -0
  16. package/dist/components/Box/Box.d.ts +2 -0
  17. package/dist/components/Box/Box.stories.d.ts +38 -0
  18. package/dist/components/Box/Box.types.d.ts +49 -0
  19. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +3 -0
  20. package/dist/components/Breadcrumbs/Breadcrumbs.stories.d.ts +13 -0
  21. package/dist/components/Breadcrumbs/Breadcrumbs.types.d.ts +11 -0
  22. package/dist/components/Button/Button.d.ts +2 -0
  23. package/dist/components/Button/Button.stories.d.ts +22 -0
  24. package/dist/components/Button/Button.types.d.ts +12 -0
  25. package/dist/components/Card/Card.d.ts +5 -0
  26. package/dist/components/Card/Card.stories.d.ts +27 -0
  27. package/dist/components/Card/Card.types.d.ts +15 -0
  28. package/dist/components/Checkbox/Checkbox.d.ts +2 -0
  29. package/dist/components/Checkbox/Checkbox.stories.d.ts +17 -0
  30. package/dist/components/Checkbox/Checkbox.types.d.ts +6 -0
  31. package/dist/components/Dropdown/Dropdown.d.ts +2 -0
  32. package/dist/components/Dropdown/Dropdown.stories.d.ts +12 -0
  33. package/dist/components/Dropdown/Dropdown.types.d.ts +24 -0
  34. package/dist/components/Header/Header.d.ts +2 -0
  35. package/dist/components/Header/Header.stories.d.ts +18 -0
  36. package/dist/components/Header/Header.types.d.ts +14 -0
  37. package/dist/components/Input/Input.d.ts +2 -0
  38. package/dist/components/Input/Input.stories.d.ts +29 -0
  39. package/dist/components/Input/Input.types.d.ts +8 -0
  40. package/dist/components/Loader/Loader.d.ts +2 -0
  41. package/dist/components/Loader/Loader.stories.d.ts +25 -0
  42. package/dist/components/Loader/Loader.types.d.ts +8 -0
  43. package/dist/components/Modal/Modal.d.ts +2 -0
  44. package/dist/components/Modal/Modal.stories.d.ts +22 -0
  45. package/dist/components/Modal/Modal.types.d.ts +12 -0
  46. package/dist/components/NavBar/NavBar.d.ts +6 -0
  47. package/dist/components/NavBar/NavBar.stories.d.ts +8 -0
  48. package/dist/components/NavBar/NavBar.types.d.ts +34 -0
  49. package/dist/components/Notification/Notification.d.ts +2 -0
  50. package/dist/components/Notification/Notification.stories.d.ts +26 -0
  51. package/dist/components/Notification/Notification.types.d.ts +8 -0
  52. package/dist/components/Pagination/Pagination.d.ts +2 -0
  53. package/dist/components/Pagination/Pagination.stories.d.ts +21 -0
  54. package/dist/components/Pagination/Pagination.types.d.ts +34 -0
  55. package/dist/components/ProgressBar/ProgressBar.d.ts +2 -0
  56. package/dist/components/ProgressBar/ProgressBar.stories.d.ts +32 -0
  57. package/dist/components/ProgressBar/ProgressBar.types.d.ts +12 -0
  58. package/dist/components/RadioButton/RadioButton.d.ts +2 -0
  59. package/dist/components/RadioButton/RadioButton.stories.d.ts +30 -0
  60. package/dist/components/RadioButton/RadioButton.types.d.ts +8 -0
  61. package/dist/components/Select/Select.d.ts +2 -0
  62. package/dist/components/Select/Select.stories.d.ts +29 -0
  63. package/dist/components/Select/Select.types.d.ts +15 -0
  64. package/dist/components/Skeleton/Skeleton.d.ts +2 -0
  65. package/dist/components/Skeleton/Skeleton.stories.d.ts +15 -0
  66. package/dist/components/Skeleton/Skeleton.types.d.ts +8 -0
  67. package/dist/components/Stepper/Step.d.ts +2 -0
  68. package/dist/components/Stepper/Step.types.d.ts +17 -0
  69. package/dist/components/Stepper/Stepper.d.ts +2 -0
  70. package/dist/components/Stepper/Stepper.stories.d.ts +15 -0
  71. package/dist/components/Stepper/Stepper.types.d.ts +13 -0
  72. package/dist/components/Stepper/stepper.utils.d.ts +3 -0
  73. package/dist/components/Switch/Switch.d.ts +2 -0
  74. package/dist/components/Switch/Switch.stories.d.ts +16 -0
  75. package/dist/components/Switch/Switch.types.d.ts +5 -0
  76. package/dist/components/Table/Table.d.ts +8 -0
  77. package/dist/components/Table/Table.stories.d.ts +27 -0
  78. package/dist/components/Table/Table.types.d.ts +17 -0
  79. package/dist/components/Tabs/Tabs.d.ts +2 -0
  80. package/dist/components/Tabs/Tabs.stories.d.ts +14 -0
  81. package/dist/components/Tabs/Tabs.types.d.ts +16 -0
  82. package/dist/components/Text/Text.d.ts +2 -0
  83. package/dist/components/Text/Text.stories.d.ts +35 -0
  84. package/dist/components/Text/Text.types.d.ts +21 -0
  85. package/dist/components/Textarea/Textarea.d.ts +2 -0
  86. package/dist/components/Textarea/Textarea.stories.d.ts +29 -0
  87. package/dist/components/Textarea/Textarea.types.d.ts +9 -0
  88. package/dist/components/Tooltip/Tooltip.d.ts +2 -0
  89. package/dist/components/Tooltip/Tooltip.stories.d.ts +10 -0
  90. package/dist/components/Tooltip/Tooltip.types.d.ts +12 -0
  91. package/dist/ds.css +1 -0
  92. package/dist/ds.js +1930 -0
  93. package/dist/ds.umd.cjs +1 -0
  94. package/dist/index.d.ts +63 -0
  95. package/dist/layouts/AppLayout/AppLayout.d.ts +8 -0
  96. package/dist/layouts/AppLayout/AppLayout.stories.d.ts +19 -0
  97. package/dist/layouts/AppLayout/AppLayout.types.d.ts +50 -0
  98. package/dist/layouts/AuthLayout/AuthLayout.d.ts +2 -0
  99. package/dist/layouts/AuthLayout/AuthLayout.stories.d.ts +12 -0
  100. package/dist/layouts/AuthLayout/AuthLayout.types.d.ts +7 -0
  101. package/dist/layouts/DashboardLayout/DashboardLayout.d.ts +2 -0
  102. package/dist/layouts/DashboardLayout/DashboardLayout.stories.d.ts +17 -0
  103. package/dist/layouts/DashboardLayout/DashboardLayout.types.d.ts +15 -0
  104. package/dist/layouts/SettingsLayout/SettingsLayout.d.ts +2 -0
  105. package/dist/layouts/SettingsLayout/SettingsLayout.stories.d.ts +17 -0
  106. package/dist/layouts/SettingsLayout/SettingsLayout.types.d.ts +14 -0
  107. package/eslint.config.js +45 -0
  108. package/package.json +100 -0
  109. package/src/components/Accordion/Accordion.module.css +158 -0
  110. package/src/components/Accordion/Accordion.stories.tsx +133 -0
  111. package/src/components/Accordion/Accordion.tsx +68 -0
  112. package/src/components/Accordion/Accordion.types.ts +21 -0
  113. package/src/components/Avatar/Avatar.module.css +58 -0
  114. package/src/components/Avatar/Avatar.stories.tsx +41 -0
  115. package/src/components/Avatar/Avatar.tsx +64 -0
  116. package/src/components/Avatar/Avatar.types.ts +12 -0
  117. package/src/components/Badge/Badge.module.css +98 -0
  118. package/src/components/Badge/Badge.stories.tsx +108 -0
  119. package/src/components/Badge/Badge.tsx +22 -0
  120. package/src/components/Badge/Badge.types.ts +11 -0
  121. package/src/components/Box/Box.module.css +638 -0
  122. package/src/components/Box/Box.stories.tsx +109 -0
  123. package/src/components/Box/Box.tsx +95 -0
  124. package/src/components/Box/Box.types.ts +65 -0
  125. package/src/components/Breadcrumbs/Breadcrumbs.module.css +41 -0
  126. package/src/components/Breadcrumbs/Breadcrumbs.stories.tsx +40 -0
  127. package/src/components/Breadcrumbs/Breadcrumbs.tsx +54 -0
  128. package/src/components/Breadcrumbs/Breadcrumbs.types.ts +13 -0
  129. package/src/components/Button/Button.module.css +247 -0
  130. package/src/components/Button/Button.stories.tsx +93 -0
  131. package/src/components/Button/Button.tsx +31 -0
  132. package/src/components/Button/Button.types.ts +14 -0
  133. package/src/components/Card/Card.module.css +112 -0
  134. package/src/components/Card/Card.stories.tsx +86 -0
  135. package/src/components/Card/Card.tsx +70 -0
  136. package/src/components/Card/Card.types.ts +20 -0
  137. package/src/components/Checkbox/Checkbox.module.css +88 -0
  138. package/src/components/Checkbox/Checkbox.stories.tsx +65 -0
  139. package/src/components/Checkbox/Checkbox.tsx +57 -0
  140. package/src/components/Checkbox/Checkbox.types.ts +7 -0
  141. package/src/components/Dropdown/Dropdown.module.css +140 -0
  142. package/src/components/Dropdown/Dropdown.stories.tsx +86 -0
  143. package/src/components/Dropdown/Dropdown.tsx +251 -0
  144. package/src/components/Dropdown/Dropdown.types.ts +27 -0
  145. package/src/components/Header/Header.module.css +38 -0
  146. package/src/components/Header/Header.stories.tsx +53 -0
  147. package/src/components/Header/Header.tsx +49 -0
  148. package/src/components/Header/Header.types.ts +15 -0
  149. package/src/components/Input/Input.module.css +87 -0
  150. package/src/components/Input/Input.stories.tsx +101 -0
  151. package/src/components/Input/Input.tsx +41 -0
  152. package/src/components/Input/Input.types.ts +10 -0
  153. package/src/components/Loader/Loader.module.css +49 -0
  154. package/src/components/Loader/Loader.stories.tsx +75 -0
  155. package/src/components/Loader/Loader.tsx +15 -0
  156. package/src/components/Loader/Loader.types.ts +9 -0
  157. package/src/components/Modal/Modal.module.css +88 -0
  158. package/src/components/Modal/Modal.stories.tsx +94 -0
  159. package/src/components/Modal/Modal.tsx +115 -0
  160. package/src/components/Modal/Modal.types.ts +13 -0
  161. package/src/components/NavBar/NavBar.module.css +77 -0
  162. package/src/components/NavBar/NavBar.stories.tsx +55 -0
  163. package/src/components/NavBar/NavBar.tsx +50 -0
  164. package/src/components/NavBar/NavBar.types.ts +36 -0
  165. package/src/components/Notification/Notification.module.css +72 -0
  166. package/src/components/Notification/Notification.stories.tsx +81 -0
  167. package/src/components/Notification/Notification.tsx +34 -0
  168. package/src/components/Notification/Notification.types.ts +10 -0
  169. package/src/components/Pagination/Pagination.module.css +31 -0
  170. package/src/components/Pagination/Pagination.stories.tsx +128 -0
  171. package/src/components/Pagination/Pagination.tsx +245 -0
  172. package/src/components/Pagination/Pagination.types.ts +37 -0
  173. package/src/components/ProgressBar/ProgressBar.module.css +67 -0
  174. package/src/components/ProgressBar/ProgressBar.stories.tsx +91 -0
  175. package/src/components/ProgressBar/ProgressBar.tsx +49 -0
  176. package/src/components/ProgressBar/ProgressBar.types.ts +13 -0
  177. package/src/components/RadioButton/RadioButton.module.css +162 -0
  178. package/src/components/RadioButton/RadioButton.stories.tsx +114 -0
  179. package/src/components/RadioButton/RadioButton.tsx +43 -0
  180. package/src/components/RadioButton/RadioButton.types.ts +10 -0
  181. package/src/components/Select/Select.module.css +88 -0
  182. package/src/components/Select/Select.stories.tsx +99 -0
  183. package/src/components/Select/Select.tsx +51 -0
  184. package/src/components/Select/Select.types.ts +18 -0
  185. package/src/components/Skeleton/Skeleton.module.css +71 -0
  186. package/src/components/Skeleton/Skeleton.stories.tsx +54 -0
  187. package/src/components/Skeleton/Skeleton.tsx +32 -0
  188. package/src/components/Skeleton/Skeleton.types.ts +10 -0
  189. package/src/components/Stepper/Step.module.css +162 -0
  190. package/src/components/Stepper/Step.tsx +62 -0
  191. package/src/components/Stepper/Step.types.ts +19 -0
  192. package/src/components/Stepper/Stepper.module.css +39 -0
  193. package/src/components/Stepper/Stepper.stories.tsx +88 -0
  194. package/src/components/Stepper/Stepper.tsx +47 -0
  195. package/src/components/Stepper/Stepper.types.ts +16 -0
  196. package/src/components/Stepper/stepper.utils.ts +41 -0
  197. package/src/components/Switch/Switch.module.css +74 -0
  198. package/src/components/Switch/Switch.stories.tsx +56 -0
  199. package/src/components/Switch/Switch.tsx +36 -0
  200. package/src/components/Switch/Switch.types.ts +6 -0
  201. package/src/components/Table/Table.module.css +78 -0
  202. package/src/components/Table/Table.stories.tsx +124 -0
  203. package/src/components/Table/Table.tsx +75 -0
  204. package/src/components/Table/Table.types.ts +29 -0
  205. package/src/components/Tabs/Tabs.module.css +74 -0
  206. package/src/components/Tabs/Tabs.stories.tsx +48 -0
  207. package/src/components/Tabs/Tabs.tsx +113 -0
  208. package/src/components/Tabs/Tabs.types.ts +18 -0
  209. package/src/components/Text/Text.module.css +126 -0
  210. package/src/components/Text/Text.stories.tsx +128 -0
  211. package/src/components/Text/Text.tsx +50 -0
  212. package/src/components/Text/Text.types.ts +43 -0
  213. package/src/components/Textarea/Textarea.module.css +82 -0
  214. package/src/components/Textarea/Textarea.stories.tsx +99 -0
  215. package/src/components/Textarea/Textarea.tsx +43 -0
  216. package/src/components/Textarea/Textarea.types.ts +11 -0
  217. package/src/components/Tooltip/Tooltip.module.css +125 -0
  218. package/src/components/Tooltip/Tooltip.stories.tsx +68 -0
  219. package/src/components/Tooltip/Tooltip.tsx +87 -0
  220. package/src/components/Tooltip/Tooltip.types.ts +14 -0
  221. package/src/index.ts +132 -0
  222. package/src/layouts/AppLayout/AppLayout.module.css +17 -0
  223. package/src/layouts/AppLayout/AppLayout.stories.tsx +124 -0
  224. package/src/layouts/AppLayout/AppLayout.tsx +46 -0
  225. package/src/layouts/AppLayout/AppLayout.types.ts +50 -0
  226. package/src/layouts/AuthLayout/AuthLayout.module.css +49 -0
  227. package/src/layouts/AuthLayout/AuthLayout.stories.tsx +109 -0
  228. package/src/layouts/AuthLayout/AuthLayout.tsx +27 -0
  229. package/src/layouts/AuthLayout/AuthLayout.types.tsx +8 -0
  230. package/src/layouts/DashboardLayout/DashboardLayout.module.css +37 -0
  231. package/src/layouts/DashboardLayout/DashboardLayout.stories.tsx +144 -0
  232. package/src/layouts/DashboardLayout/DashboardLayout.tsx +41 -0
  233. package/src/layouts/DashboardLayout/DashboardLayout.types.tsx +14 -0
  234. package/src/layouts/SettingsLayout/SettingsLayout.module.css +39 -0
  235. package/src/layouts/SettingsLayout/SettingsLayout.stories.tsx +103 -0
  236. package/src/layouts/SettingsLayout/SettingsLayout.tsx +37 -0
  237. package/src/layouts/SettingsLayout/SettingsLayout.types.tsx +13 -0
  238. package/src/styles/ds.css +12 -0
  239. package/src/styles/semantic.css +56 -0
  240. package/src/styles/themes/dark.css +58 -0
  241. package/src/styles/themes/light.css +58 -0
  242. package/src/styles/themes/retro.css +58 -0
  243. package/src/styles/tokens.css +138 -0
  244. package/tsconfig.app.json +28 -0
  245. package/tsconfig.json +7 -0
  246. package/tsconfig.node.json +26 -0
  247. 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,8 @@
1
+ import type { ReactNode } from 'react';
2
+
3
+ export interface AuthLayoutProps {
4
+ logo?: ReactNode;
5
+ title?: string;
6
+ description?: string;
7
+ children: ReactNode;
8
+ }
@@ -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
+ }