arcway 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +711 -0
  3. package/client/env.js +55 -0
  4. package/client/fetcher.js +50 -0
  5. package/client/graphql.js +35 -0
  6. package/client/head.js +140 -0
  7. package/client/hooks/use-api.js +80 -0
  8. package/client/hooks/use-debounce.js +12 -0
  9. package/client/hooks/use-form.js +86 -0
  10. package/client/hooks/use-graphql.js +30 -0
  11. package/client/hooks/use-interval.js +12 -0
  12. package/client/hooks/use-mutation.js +27 -0
  13. package/client/hooks/use-query.js +45 -0
  14. package/client/hooks/web/use-click-outside.js +22 -0
  15. package/client/hooks/web/use-local-storage.js +42 -0
  16. package/client/index.js +62 -0
  17. package/client/page-loader.js +155 -0
  18. package/client/provider.js +53 -0
  19. package/client/query.js +13 -0
  20. package/client/router.jsx +303 -0
  21. package/client/ui/accordion.jsx +65 -0
  22. package/client/ui/accordion.stories.jsx +48 -0
  23. package/client/ui/alert-dialog.jsx +122 -0
  24. package/client/ui/alert-dialog.stories.jsx +44 -0
  25. package/client/ui/alert.jsx +52 -0
  26. package/client/ui/alert.stories.jsx +31 -0
  27. package/client/ui/app-shell.jsx +39 -0
  28. package/client/ui/app-shell.stories.jsx +51 -0
  29. package/client/ui/aspect-ratio.jsx +6 -0
  30. package/client/ui/aspect-ratio.stories.jsx +69 -0
  31. package/client/ui/avatar.jsx +78 -0
  32. package/client/ui/avatar.stories.jsx +62 -0
  33. package/client/ui/badge.jsx +34 -0
  34. package/client/ui/badge.stories.js +32 -0
  35. package/client/ui/breadcrumb.jsx +86 -0
  36. package/client/ui/breadcrumb.stories.jsx +43 -0
  37. package/client/ui/button-group.jsx +58 -0
  38. package/client/ui/button-group.stories.jsx +67 -0
  39. package/client/ui/button.jsx +46 -0
  40. package/client/ui/button.stories.js +72 -0
  41. package/client/ui/calendar.jsx +172 -0
  42. package/client/ui/card.jsx +57 -0
  43. package/client/ui/card.stories.jsx +33 -0
  44. package/client/ui/carousel.jsx +167 -0
  45. package/client/ui/chart.jsx +244 -0
  46. package/client/ui/checkbox.jsx +24 -0
  47. package/client/ui/checkbox.stories.js +33 -0
  48. package/client/ui/collapsible.jsx +12 -0
  49. package/client/ui/collapsible.stories.jsx +42 -0
  50. package/client/ui/combobox.jsx +223 -0
  51. package/client/ui/command.jsx +128 -0
  52. package/client/ui/context-menu.jsx +170 -0
  53. package/client/ui/context-menu.stories.jsx +35 -0
  54. package/client/ui/dialog.jsx +109 -0
  55. package/client/ui/dialog.stories.jsx +37 -0
  56. package/client/ui/direction.jsx +9 -0
  57. package/client/ui/drawer.jsx +87 -0
  58. package/client/ui/dropdown-menu.jsx +172 -0
  59. package/client/ui/dropdown-menu.stories.jsx +34 -0
  60. package/client/ui/empty.jsx +76 -0
  61. package/client/ui/empty.stories.jsx +64 -0
  62. package/client/ui/field.jsx +174 -0
  63. package/client/ui/field.stories.jsx +118 -0
  64. package/client/ui/form.jsx +17 -0
  65. package/client/ui/hooks/use-mobile.js +16 -0
  66. package/client/ui/hover-card.jsx +26 -0
  67. package/client/ui/hover-card.stories.jsx +28 -0
  68. package/client/ui/index.js +649 -0
  69. package/client/ui/input-group.jsx +116 -0
  70. package/client/ui/input-group.stories.jsx +65 -0
  71. package/client/ui/input-otp.jsx +62 -0
  72. package/client/ui/input.jsx +16 -0
  73. package/client/ui/input.stories.js +27 -0
  74. package/client/ui/item.jsx +155 -0
  75. package/client/ui/item.stories.jsx +118 -0
  76. package/client/ui/kbd.jsx +24 -0
  77. package/client/ui/kbd.stories.jsx +32 -0
  78. package/client/ui/label.jsx +16 -0
  79. package/client/ui/label.stories.js +25 -0
  80. package/client/ui/lib/utils.js +6 -0
  81. package/client/ui/main-content.jsx +30 -0
  82. package/client/ui/menubar.jsx +189 -0
  83. package/client/ui/menubar.stories.jsx +43 -0
  84. package/client/ui/native-select.jsx +34 -0
  85. package/client/ui/native-select.stories.jsx +67 -0
  86. package/client/ui/navigation-menu.jsx +120 -0
  87. package/client/ui/navigation-menu.stories.jsx +45 -0
  88. package/client/ui/pagination.jsx +92 -0
  89. package/client/ui/pagination.stories.jsx +52 -0
  90. package/client/ui/panel.jsx +66 -0
  91. package/client/ui/popover.jsx +54 -0
  92. package/client/ui/popover.stories.jsx +27 -0
  93. package/client/ui/progress.jsx +19 -0
  94. package/client/ui/progress.stories.js +34 -0
  95. package/client/ui/radio-group.jsx +33 -0
  96. package/client/ui/radio-group.stories.jsx +49 -0
  97. package/client/ui/resizable.jsx +33 -0
  98. package/client/ui/scroll-area.jsx +41 -0
  99. package/client/ui/scroll-area.stories.jsx +43 -0
  100. package/client/ui/select.jsx +145 -0
  101. package/client/ui/select.stories.jsx +80 -0
  102. package/client/ui/separator.jsx +18 -0
  103. package/client/ui/separator.stories.jsx +37 -0
  104. package/client/ui/sheet.jsx +95 -0
  105. package/client/ui/sheet.stories.jsx +56 -0
  106. package/client/ui/sidebar.jsx +544 -0
  107. package/client/ui/skeleton.jsx +8 -0
  108. package/client/ui/skeleton.stories.js +23 -0
  109. package/client/ui/slider.jsx +41 -0
  110. package/client/ui/slider.stories.js +31 -0
  111. package/client/ui/sonner.jsx +37 -0
  112. package/client/ui/spinner.jsx +14 -0
  113. package/client/ui/spinner.stories.js +16 -0
  114. package/client/ui/style-mira.css +1316 -0
  115. package/client/ui/switch.jsx +22 -0
  116. package/client/ui/switch.stories.js +44 -0
  117. package/client/ui/table.jsx +33 -0
  118. package/client/ui/table.stories.jsx +42 -0
  119. package/client/ui/tabs.jsx +63 -0
  120. package/client/ui/tabs.stories.jsx +45 -0
  121. package/client/ui/textarea.jsx +15 -0
  122. package/client/ui/textarea.stories.js +33 -0
  123. package/client/ui/theme.css +459 -0
  124. package/client/ui/toggle-group.jsx +62 -0
  125. package/client/ui/toggle-group.stories.jsx +68 -0
  126. package/client/ui/toggle.jsx +34 -0
  127. package/client/ui/toggle.stories.js +46 -0
  128. package/client/ui/tooltip.jsx +37 -0
  129. package/client/ui/tooltip.stories.jsx +32 -0
  130. package/client/ui/use-transition.js +35 -0
  131. package/client/ws.js +132 -0
  132. package/package.json +134 -0
  133. package/server/bin/cli.js +42 -0
  134. package/server/bin/commands/build.js +23 -0
  135. package/server/bin/commands/dev.js +57 -0
  136. package/server/bin/commands/docs.js +30 -0
  137. package/server/bin/commands/graphql-schema.js +32 -0
  138. package/server/bin/commands/lint.js +35 -0
  139. package/server/bin/commands/mcp.js +26 -0
  140. package/server/bin/commands/migrate.js +82 -0
  141. package/server/bin/commands/schema.js +41 -0
  142. package/server/bin/commands/seed.js +36 -0
  143. package/server/bin/commands/start.js +31 -0
  144. package/server/bin/commands/test.js +20 -0
  145. package/server/bin/solo.js +4 -0
  146. package/server/boot/index.js +150 -0
  147. package/server/boot.js +2 -0
  148. package/server/build.js +23 -0
  149. package/server/cache/drivers/memory.js +23 -0
  150. package/server/cache/drivers/redis.js +28 -0
  151. package/server/cache/index.js +69 -0
  152. package/server/config/loader.js +89 -0
  153. package/server/config/modules/api.js +17 -0
  154. package/server/config/modules/build.js +9 -0
  155. package/server/config/modules/cache.js +10 -0
  156. package/server/config/modules/database.js +29 -0
  157. package/server/config/modules/events.js +15 -0
  158. package/server/config/modules/files.js +15 -0
  159. package/server/config/modules/jobs.js +20 -0
  160. package/server/config/modules/logger.js +9 -0
  161. package/server/config/modules/mail.js +11 -0
  162. package/server/config/modules/mcp.js +9 -0
  163. package/server/config/modules/pages.js +20 -0
  164. package/server/config/modules/queue.js +10 -0
  165. package/server/config/modules/redis.js +9 -0
  166. package/server/config/modules/server.js +30 -0
  167. package/server/config/modules/session.js +9 -0
  168. package/server/config/modules/websocket.js +11 -0
  169. package/server/constants.js +67 -0
  170. package/server/context.js +15 -0
  171. package/server/db/index.js +87 -0
  172. package/server/db/schema/drivers/mysql.js +28 -0
  173. package/server/db/schema/drivers/pg.js +34 -0
  174. package/server/db/schema/drivers/sqlite.js +22 -0
  175. package/server/db/schema/index.js +78 -0
  176. package/server/db/seeds.js +22 -0
  177. package/server/discovery.js +67 -0
  178. package/server/docs/openapi.js +153 -0
  179. package/server/env.js +17 -0
  180. package/server/events/drivers/memory.js +45 -0
  181. package/server/events/drivers/redis.js +64 -0
  182. package/server/events/handler.js +67 -0
  183. package/server/events/index.js +35 -0
  184. package/server/events/pattern.js +5 -0
  185. package/server/files/drivers/local.js +83 -0
  186. package/server/files/drivers/s3.js +113 -0
  187. package/server/files/index.js +57 -0
  188. package/server/filewatcher/index.js +156 -0
  189. package/server/glob.js +6 -0
  190. package/server/graphql/discovery.js +70 -0
  191. package/server/graphql/handler.js +41 -0
  192. package/server/graphql/index.js +13 -0
  193. package/server/graphql/loaders.js +19 -0
  194. package/server/graphql/merge.js +48 -0
  195. package/server/graphql/subscriptions.js +43 -0
  196. package/server/health.js +34 -0
  197. package/server/helpers.js +9 -0
  198. package/server/index.js +55 -0
  199. package/server/internals.js +139 -0
  200. package/server/jobs/cron.js +10 -0
  201. package/server/jobs/drivers/knex-queue.js +207 -0
  202. package/server/jobs/drivers/lease.js +148 -0
  203. package/server/jobs/drivers/memory-queue.js +134 -0
  204. package/server/jobs/queue.js +27 -0
  205. package/server/jobs/runner.js +197 -0
  206. package/server/jobs/throughput.js +63 -0
  207. package/server/lib/vault/encrypt.js +40 -0
  208. package/server/lib/vault/ids.js +9 -0
  209. package/server/lib/vault/index.js +14 -0
  210. package/server/lib/vault/jwt.js +55 -0
  211. package/server/lib/vault/password.js +10 -0
  212. package/server/lint/boundaries.js +77 -0
  213. package/server/logger/index.js +130 -0
  214. package/server/mail/drivers/console.js +31 -0
  215. package/server/mail/drivers/smtp.js +34 -0
  216. package/server/mail/imap.js +105 -0
  217. package/server/mail/inbound-store.js +58 -0
  218. package/server/mail/inbound.js +79 -0
  219. package/server/mail/index.js +112 -0
  220. package/server/mcp/debug-api.js +137 -0
  221. package/server/mcp/helpers.js +30 -0
  222. package/server/mcp/index.js +77 -0
  223. package/server/mcp/runtime.js +7 -0
  224. package/server/mcp/server.js +19 -0
  225. package/server/mcp/tools/debugging.js +133 -0
  226. package/server/mcp/tools/introspection.js +87 -0
  227. package/server/middlewares/cors.js +30 -0
  228. package/server/middlewares/index.js +3 -0
  229. package/server/middlewares/require-session.js +15 -0
  230. package/server/module-loader.js +9 -0
  231. package/server/pages/build-client.js +187 -0
  232. package/server/pages/build-css.js +47 -0
  233. package/server/pages/build-manifest.js +55 -0
  234. package/server/pages/build-plugins.js +75 -0
  235. package/server/pages/build-server.js +115 -0
  236. package/server/pages/build.js +116 -0
  237. package/server/pages/discovery.js +120 -0
  238. package/server/pages/fonts.js +128 -0
  239. package/server/pages/handler.js +276 -0
  240. package/server/pages/hmr.js +176 -0
  241. package/server/pages/pages-router.js +78 -0
  242. package/server/pages/ssr.js +276 -0
  243. package/server/pages/static.js +92 -0
  244. package/server/pages/watcher.js +90 -0
  245. package/server/queue/drivers/knex.js +67 -0
  246. package/server/queue/drivers/redis.js +91 -0
  247. package/server/queue/index.js +61 -0
  248. package/server/rate-limit/consume.js +21 -0
  249. package/server/rate-limit/drivers/memory.js +24 -0
  250. package/server/rate-limit/drivers/redis.js +32 -0
  251. package/server/rate-limit/index.js +33 -0
  252. package/server/redis/index.js +67 -0
  253. package/server/ring-buffer.js +44 -0
  254. package/server/route.js +4 -0
  255. package/server/router/api-router.js +317 -0
  256. package/server/router/cors.js +31 -0
  257. package/server/router/middleware.js +91 -0
  258. package/server/router/routes.js +132 -0
  259. package/server/server.js +35 -0
  260. package/server/session/helpers.js +21 -0
  261. package/server/session/index.js +89 -0
  262. package/server/static/index.js +36 -0
  263. package/server/system-jobs/index.js +50 -0
  264. package/server/system-routes/index.js +84 -0
  265. package/server/testing/index.js +263 -0
  266. package/server/validation.js +41 -0
  267. package/server/watcher.js +34 -0
  268. package/server/web-server.js +231 -0
  269. package/server/ws/discovery.js +54 -0
  270. package/server/ws/index.js +14 -0
  271. package/server/ws/realtime.js +318 -0
  272. package/server/ws/registry.js +17 -0
  273. package/server/ws/server.js +152 -0
  274. package/server/ws/ws-router.js +335 -0
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import { Switch as SwitchPrimitive } from 'radix-ui';
3
+ import { cn } from './lib/utils.js';
4
+ function Switch({ className, size = 'default', ...props }) {
5
+ return (
6
+ <SwitchPrimitive.Root
7
+ data-slot="switch"
8
+ data-size={size}
9
+ className={cn(
10
+ 'cn-switch peer group/switch relative inline-flex items-center transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 data-disabled:cursor-not-allowed data-disabled:opacity-50',
11
+ className,
12
+ )}
13
+ {...props}
14
+ >
15
+ <SwitchPrimitive.Thumb
16
+ data-slot="switch-thumb"
17
+ className="cn-switch-thumb pointer-events-none block ring-0 transition-transform"
18
+ />
19
+ </SwitchPrimitive.Root>
20
+ );
21
+ }
22
+ export { Switch };
@@ -0,0 +1,44 @@
1
+ import { expect, within } from 'storybook/test';
2
+ import { Switch } from './switch.jsx';
3
+ const meta = {
4
+ title: 'UI/Switch',
5
+ component: Switch,
6
+ argTypes: {
7
+ size: { control: 'select', options: ['default', 'sm'] },
8
+ },
9
+ };
10
+ var stdin_default = meta;
11
+ const Default = {
12
+ play: async ({ canvasElement }) => {
13
+ const canvas = within(canvasElement);
14
+ const sw = canvas.getByRole('switch');
15
+ await expect(sw).toBeInTheDocument();
16
+ await expect(sw.dataset.slot).toBe('switch');
17
+ await expect(sw.dataset.state).toBe('unchecked');
18
+ },
19
+ };
20
+ const Checked = {
21
+ args: { defaultChecked: true },
22
+ play: async ({ canvasElement }) => {
23
+ const canvas = within(canvasElement);
24
+ const sw = canvas.getByRole('switch');
25
+ await expect(sw.dataset.state).toBe('checked');
26
+ },
27
+ };
28
+ const Disabled = {
29
+ args: { disabled: true },
30
+ play: async ({ canvasElement }) => {
31
+ const canvas = within(canvasElement);
32
+ const sw = canvas.getByRole('switch');
33
+ await expect(sw).toBeDisabled();
34
+ },
35
+ };
36
+ const Small = {
37
+ args: { size: 'sm' },
38
+ play: async ({ canvasElement }) => {
39
+ const canvas = within(canvasElement);
40
+ const sw = canvas.getByRole('switch');
41
+ await expect(sw.dataset.size).toBe('sm');
42
+ },
43
+ };
44
+ export { Checked, Default, Disabled, Small, stdin_default as default };
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import { cn } from './lib/utils.js';
3
+ function Table({ className, ...props }) {
4
+ return (
5
+ <div data-slot="table-container" className="cn-table-container">
6
+ <table data-slot="table" className={cn('cn-table', className)} {...props} />
7
+ </div>
8
+ );
9
+ }
10
+ function TableHeader({ className, ...props }) {
11
+ return <thead data-slot="table-header" className={cn('cn-table-header', className)} {...props} />;
12
+ }
13
+ function TableBody({ className, ...props }) {
14
+ return <tbody data-slot="table-body" className={cn('cn-table-body', className)} {...props} />;
15
+ }
16
+ function TableFooter({ className, ...props }) {
17
+ return <tfoot data-slot="table-footer" className={cn('cn-table-footer', className)} {...props} />;
18
+ }
19
+ function TableRow({ className, ...props }) {
20
+ return <tr data-slot="table-row" className={cn('cn-table-row', className)} {...props} />;
21
+ }
22
+ function TableHead({ className, ...props }) {
23
+ return <th data-slot="table-head" className={cn('cn-table-head', className)} {...props} />;
24
+ }
25
+ function TableCell({ className, ...props }) {
26
+ return <td data-slot="table-cell" className={cn('cn-table-cell', className)} {...props} />;
27
+ }
28
+ function TableCaption({ className, ...props }) {
29
+ return (
30
+ <caption data-slot="table-caption" className={cn('cn-table-caption', className)} {...props} />
31
+ );
32
+ }
33
+ export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow };
@@ -0,0 +1,42 @@
1
+ import React from 'react';
2
+ import { expect, within } from 'storybook/test';
3
+ import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from './table.jsx';
4
+ const meta = {
5
+ title: 'UI/Table',
6
+ component: Table,
7
+ };
8
+ var stdin_default = meta;
9
+ const Default = {
10
+ render: () => (
11
+ <Table>
12
+ <TableHeader>
13
+ <TableRow>
14
+ <TableHead>Name</TableHead>
15
+ <TableHead>Email</TableHead>
16
+ <TableHead>Role</TableHead>
17
+ </TableRow>
18
+ </TableHeader>
19
+ <TableBody>
20
+ <TableRow>
21
+ <TableCell>Alice</TableCell>
22
+ <TableCell>alice@example.com</TableCell>
23
+ <TableCell>Admin</TableCell>
24
+ </TableRow>
25
+ <TableRow>
26
+ <TableCell>Bob</TableCell>
27
+ <TableCell>bob@example.com</TableCell>
28
+ <TableCell>User</TableCell>
29
+ </TableRow>
30
+ </TableBody>
31
+ </Table>
32
+ ),
33
+ play: async ({ canvasElement }) => {
34
+ const canvas = within(canvasElement);
35
+ await expect(canvas.getByText('Name')).toBeInTheDocument();
36
+ await expect(canvas.getByText('Alice')).toBeInTheDocument();
37
+ await expect(canvas.getByText('Bob')).toBeInTheDocument();
38
+ const rows = canvas.getAllByRole('row');
39
+ await expect(rows.length).toBe(3);
40
+ },
41
+ };
42
+ export { Default, stdin_default as default };
@@ -0,0 +1,63 @@
1
+ import React from 'react';
2
+ import { cva } from 'class-variance-authority';
3
+ import { Tabs as TabsPrimitive } from 'radix-ui';
4
+ import { cn } from './lib/utils.js';
5
+ function Tabs({ className, orientation = 'horizontal', ...props }) {
6
+ return (
7
+ <TabsPrimitive.Root
8
+ data-slot="tabs"
9
+ data-orientation={orientation}
10
+ className={cn('cn-tabs group/tabs flex data-horizontal:flex-col', className)}
11
+ {...props}
12
+ />
13
+ );
14
+ }
15
+ const tabsListVariants = cva(
16
+ 'cn-tabs-list group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col',
17
+ {
18
+ variants: {
19
+ variant: {
20
+ default: 'cn-tabs-list-variant-default bg-muted',
21
+ line: 'cn-tabs-list-variant-line gap-1 bg-transparent',
22
+ },
23
+ },
24
+ defaultVariants: {
25
+ variant: 'default',
26
+ },
27
+ },
28
+ );
29
+ function TabsList({ className, variant = 'default', ...props }) {
30
+ return (
31
+ <TabsPrimitive.List
32
+ data-slot="tabs-list"
33
+ data-variant={variant}
34
+ className={cn(tabsListVariants({ variant }), className)}
35
+ {...props}
36
+ />
37
+ );
38
+ }
39
+ function TabsTrigger({ className, ...props }) {
40
+ return (
41
+ <TabsPrimitive.Trigger
42
+ data-slot="tabs-trigger"
43
+ className={cn(
44
+ 'cn-tabs-trigger focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center whitespace-nowrap transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0',
45
+ 'group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent',
46
+ 'data-active:bg-background dark:data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 data-active:text-foreground',
47
+ 'after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100',
48
+ className,
49
+ )}
50
+ {...props}
51
+ />
52
+ );
53
+ }
54
+ function TabsContent({ className, ...props }) {
55
+ return (
56
+ <TabsPrimitive.Content
57
+ data-slot="tabs-content"
58
+ className={cn('cn-tabs-content flex-1 outline-none', className)}
59
+ {...props}
60
+ />
61
+ );
62
+ }
63
+ export { Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants };
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import { expect, within } from 'storybook/test';
3
+ import { Tabs, TabsList, TabsTrigger, TabsContent } from './tabs.jsx';
4
+ const meta = {
5
+ title: 'UI/Tabs',
6
+ component: Tabs,
7
+ };
8
+ var stdin_default = meta;
9
+ const Default = {
10
+ render: () => (
11
+ <Tabs defaultValue="tab1">
12
+ <TabsList>
13
+ <TabsTrigger value="tab1">Tab 1</TabsTrigger>
14
+ <TabsTrigger value="tab2">Tab 2</TabsTrigger>
15
+ </TabsList>
16
+ <TabsContent value="tab1">Content for tab 1</TabsContent>
17
+ <TabsContent value="tab2">Content for tab 2</TabsContent>
18
+ </Tabs>
19
+ ),
20
+ play: async ({ canvasElement }) => {
21
+ const canvas = within(canvasElement);
22
+ const tab1 = canvas.getByRole('tab', { name: 'Tab 1' });
23
+ await expect(tab1).toBeInTheDocument();
24
+ await expect(tab1).toHaveAttribute('data-state', 'active');
25
+ await expect(canvas.getByText('Content for tab 1')).toBeInTheDocument();
26
+ },
27
+ };
28
+ const LineVariant = {
29
+ render: () => (
30
+ <Tabs defaultValue="a">
31
+ <TabsList variant="line">
32
+ <TabsTrigger value="a">Alpha</TabsTrigger>
33
+ <TabsTrigger value="b">Beta</TabsTrigger>
34
+ </TabsList>
35
+ <TabsContent value="a">Alpha content</TabsContent>
36
+ <TabsContent value="b">Beta content</TabsContent>
37
+ </Tabs>
38
+ ),
39
+ play: async ({ canvasElement }) => {
40
+ const canvas = within(canvasElement);
41
+ const tabs = canvas.getAllByRole('tab');
42
+ await expect(tabs.length).toBe(2);
43
+ },
44
+ };
45
+ export { Default, LineVariant, stdin_default as default };
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { cn } from './lib/utils.js';
3
+ function Textarea({ className, ...props }) {
4
+ return (
5
+ <textarea
6
+ data-slot="textarea"
7
+ className={cn(
8
+ 'cn-textarea placeholder:text-muted-foreground flex field-sizing-content min-h-16 w-full outline-none disabled:cursor-not-allowed disabled:opacity-50',
9
+ className,
10
+ )}
11
+ {...props}
12
+ />
13
+ );
14
+ }
15
+ export { Textarea };
@@ -0,0 +1,33 @@
1
+ import { expect, within } from 'storybook/test';
2
+ import { Textarea } from './textarea.jsx';
3
+ const meta = {
4
+ title: 'UI/Textarea',
5
+ component: Textarea,
6
+ };
7
+ var stdin_default = meta;
8
+ const Default = {
9
+ args: { placeholder: 'Type your message...' },
10
+ play: async ({ canvasElement }) => {
11
+ const canvas = within(canvasElement);
12
+ const textarea = canvas.getByPlaceholderText('Type your message...');
13
+ await expect(textarea).toBeInTheDocument();
14
+ await expect(textarea.dataset.slot).toBe('textarea');
15
+ },
16
+ };
17
+ const Disabled = {
18
+ args: { placeholder: 'Disabled', disabled: true },
19
+ play: async ({ canvasElement }) => {
20
+ const canvas = within(canvasElement);
21
+ const textarea = canvas.getByPlaceholderText('Disabled');
22
+ await expect(textarea).toBeDisabled();
23
+ },
24
+ };
25
+ const WithValue = {
26
+ args: { defaultValue: 'Hello world' },
27
+ play: async ({ canvasElement }) => {
28
+ const canvas = within(canvasElement);
29
+ const textarea = canvas.getByRole('textbox');
30
+ await expect(textarea).toHaveValue('Hello world');
31
+ },
32
+ };
33
+ export { Default, Disabled, WithValue, stdin_default as default };