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.
- package/LICENSE +21 -0
- package/README.md +711 -0
- package/client/env.js +55 -0
- package/client/fetcher.js +50 -0
- package/client/graphql.js +35 -0
- package/client/head.js +140 -0
- package/client/hooks/use-api.js +80 -0
- package/client/hooks/use-debounce.js +12 -0
- package/client/hooks/use-form.js +86 -0
- package/client/hooks/use-graphql.js +30 -0
- package/client/hooks/use-interval.js +12 -0
- package/client/hooks/use-mutation.js +27 -0
- package/client/hooks/use-query.js +45 -0
- package/client/hooks/web/use-click-outside.js +22 -0
- package/client/hooks/web/use-local-storage.js +42 -0
- package/client/index.js +62 -0
- package/client/page-loader.js +155 -0
- package/client/provider.js +53 -0
- package/client/query.js +13 -0
- package/client/router.jsx +303 -0
- package/client/ui/accordion.jsx +65 -0
- package/client/ui/accordion.stories.jsx +48 -0
- package/client/ui/alert-dialog.jsx +122 -0
- package/client/ui/alert-dialog.stories.jsx +44 -0
- package/client/ui/alert.jsx +52 -0
- package/client/ui/alert.stories.jsx +31 -0
- package/client/ui/app-shell.jsx +39 -0
- package/client/ui/app-shell.stories.jsx +51 -0
- package/client/ui/aspect-ratio.jsx +6 -0
- package/client/ui/aspect-ratio.stories.jsx +69 -0
- package/client/ui/avatar.jsx +78 -0
- package/client/ui/avatar.stories.jsx +62 -0
- package/client/ui/badge.jsx +34 -0
- package/client/ui/badge.stories.js +32 -0
- package/client/ui/breadcrumb.jsx +86 -0
- package/client/ui/breadcrumb.stories.jsx +43 -0
- package/client/ui/button-group.jsx +58 -0
- package/client/ui/button-group.stories.jsx +67 -0
- package/client/ui/button.jsx +46 -0
- package/client/ui/button.stories.js +72 -0
- package/client/ui/calendar.jsx +172 -0
- package/client/ui/card.jsx +57 -0
- package/client/ui/card.stories.jsx +33 -0
- package/client/ui/carousel.jsx +167 -0
- package/client/ui/chart.jsx +244 -0
- package/client/ui/checkbox.jsx +24 -0
- package/client/ui/checkbox.stories.js +33 -0
- package/client/ui/collapsible.jsx +12 -0
- package/client/ui/collapsible.stories.jsx +42 -0
- package/client/ui/combobox.jsx +223 -0
- package/client/ui/command.jsx +128 -0
- package/client/ui/context-menu.jsx +170 -0
- package/client/ui/context-menu.stories.jsx +35 -0
- package/client/ui/dialog.jsx +109 -0
- package/client/ui/dialog.stories.jsx +37 -0
- package/client/ui/direction.jsx +9 -0
- package/client/ui/drawer.jsx +87 -0
- package/client/ui/dropdown-menu.jsx +172 -0
- package/client/ui/dropdown-menu.stories.jsx +34 -0
- package/client/ui/empty.jsx +76 -0
- package/client/ui/empty.stories.jsx +64 -0
- package/client/ui/field.jsx +174 -0
- package/client/ui/field.stories.jsx +118 -0
- package/client/ui/form.jsx +17 -0
- package/client/ui/hooks/use-mobile.js +16 -0
- package/client/ui/hover-card.jsx +26 -0
- package/client/ui/hover-card.stories.jsx +28 -0
- package/client/ui/index.js +649 -0
- package/client/ui/input-group.jsx +116 -0
- package/client/ui/input-group.stories.jsx +65 -0
- package/client/ui/input-otp.jsx +62 -0
- package/client/ui/input.jsx +16 -0
- package/client/ui/input.stories.js +27 -0
- package/client/ui/item.jsx +155 -0
- package/client/ui/item.stories.jsx +118 -0
- package/client/ui/kbd.jsx +24 -0
- package/client/ui/kbd.stories.jsx +32 -0
- package/client/ui/label.jsx +16 -0
- package/client/ui/label.stories.js +25 -0
- package/client/ui/lib/utils.js +6 -0
- package/client/ui/main-content.jsx +30 -0
- package/client/ui/menubar.jsx +189 -0
- package/client/ui/menubar.stories.jsx +43 -0
- package/client/ui/native-select.jsx +34 -0
- package/client/ui/native-select.stories.jsx +67 -0
- package/client/ui/navigation-menu.jsx +120 -0
- package/client/ui/navigation-menu.stories.jsx +45 -0
- package/client/ui/pagination.jsx +92 -0
- package/client/ui/pagination.stories.jsx +52 -0
- package/client/ui/panel.jsx +66 -0
- package/client/ui/popover.jsx +54 -0
- package/client/ui/popover.stories.jsx +27 -0
- package/client/ui/progress.jsx +19 -0
- package/client/ui/progress.stories.js +34 -0
- package/client/ui/radio-group.jsx +33 -0
- package/client/ui/radio-group.stories.jsx +49 -0
- package/client/ui/resizable.jsx +33 -0
- package/client/ui/scroll-area.jsx +41 -0
- package/client/ui/scroll-area.stories.jsx +43 -0
- package/client/ui/select.jsx +145 -0
- package/client/ui/select.stories.jsx +80 -0
- package/client/ui/separator.jsx +18 -0
- package/client/ui/separator.stories.jsx +37 -0
- package/client/ui/sheet.jsx +95 -0
- package/client/ui/sheet.stories.jsx +56 -0
- package/client/ui/sidebar.jsx +544 -0
- package/client/ui/skeleton.jsx +8 -0
- package/client/ui/skeleton.stories.js +23 -0
- package/client/ui/slider.jsx +41 -0
- package/client/ui/slider.stories.js +31 -0
- package/client/ui/sonner.jsx +37 -0
- package/client/ui/spinner.jsx +14 -0
- package/client/ui/spinner.stories.js +16 -0
- package/client/ui/style-mira.css +1316 -0
- package/client/ui/switch.jsx +22 -0
- package/client/ui/switch.stories.js +44 -0
- package/client/ui/table.jsx +33 -0
- package/client/ui/table.stories.jsx +42 -0
- package/client/ui/tabs.jsx +63 -0
- package/client/ui/tabs.stories.jsx +45 -0
- package/client/ui/textarea.jsx +15 -0
- package/client/ui/textarea.stories.js +33 -0
- package/client/ui/theme.css +459 -0
- package/client/ui/toggle-group.jsx +62 -0
- package/client/ui/toggle-group.stories.jsx +68 -0
- package/client/ui/toggle.jsx +34 -0
- package/client/ui/toggle.stories.js +46 -0
- package/client/ui/tooltip.jsx +37 -0
- package/client/ui/tooltip.stories.jsx +32 -0
- package/client/ui/use-transition.js +35 -0
- package/client/ws.js +132 -0
- package/package.json +134 -0
- package/server/bin/cli.js +42 -0
- package/server/bin/commands/build.js +23 -0
- package/server/bin/commands/dev.js +57 -0
- package/server/bin/commands/docs.js +30 -0
- package/server/bin/commands/graphql-schema.js +32 -0
- package/server/bin/commands/lint.js +35 -0
- package/server/bin/commands/mcp.js +26 -0
- package/server/bin/commands/migrate.js +82 -0
- package/server/bin/commands/schema.js +41 -0
- package/server/bin/commands/seed.js +36 -0
- package/server/bin/commands/start.js +31 -0
- package/server/bin/commands/test.js +20 -0
- package/server/bin/solo.js +4 -0
- package/server/boot/index.js +150 -0
- package/server/boot.js +2 -0
- package/server/build.js +23 -0
- package/server/cache/drivers/memory.js +23 -0
- package/server/cache/drivers/redis.js +28 -0
- package/server/cache/index.js +69 -0
- package/server/config/loader.js +89 -0
- package/server/config/modules/api.js +17 -0
- package/server/config/modules/build.js +9 -0
- package/server/config/modules/cache.js +10 -0
- package/server/config/modules/database.js +29 -0
- package/server/config/modules/events.js +15 -0
- package/server/config/modules/files.js +15 -0
- package/server/config/modules/jobs.js +20 -0
- package/server/config/modules/logger.js +9 -0
- package/server/config/modules/mail.js +11 -0
- package/server/config/modules/mcp.js +9 -0
- package/server/config/modules/pages.js +20 -0
- package/server/config/modules/queue.js +10 -0
- package/server/config/modules/redis.js +9 -0
- package/server/config/modules/server.js +30 -0
- package/server/config/modules/session.js +9 -0
- package/server/config/modules/websocket.js +11 -0
- package/server/constants.js +67 -0
- package/server/context.js +15 -0
- package/server/db/index.js +87 -0
- package/server/db/schema/drivers/mysql.js +28 -0
- package/server/db/schema/drivers/pg.js +34 -0
- package/server/db/schema/drivers/sqlite.js +22 -0
- package/server/db/schema/index.js +78 -0
- package/server/db/seeds.js +22 -0
- package/server/discovery.js +67 -0
- package/server/docs/openapi.js +153 -0
- package/server/env.js +17 -0
- package/server/events/drivers/memory.js +45 -0
- package/server/events/drivers/redis.js +64 -0
- package/server/events/handler.js +67 -0
- package/server/events/index.js +35 -0
- package/server/events/pattern.js +5 -0
- package/server/files/drivers/local.js +83 -0
- package/server/files/drivers/s3.js +113 -0
- package/server/files/index.js +57 -0
- package/server/filewatcher/index.js +156 -0
- package/server/glob.js +6 -0
- package/server/graphql/discovery.js +70 -0
- package/server/graphql/handler.js +41 -0
- package/server/graphql/index.js +13 -0
- package/server/graphql/loaders.js +19 -0
- package/server/graphql/merge.js +48 -0
- package/server/graphql/subscriptions.js +43 -0
- package/server/health.js +34 -0
- package/server/helpers.js +9 -0
- package/server/index.js +55 -0
- package/server/internals.js +139 -0
- package/server/jobs/cron.js +10 -0
- package/server/jobs/drivers/knex-queue.js +207 -0
- package/server/jobs/drivers/lease.js +148 -0
- package/server/jobs/drivers/memory-queue.js +134 -0
- package/server/jobs/queue.js +27 -0
- package/server/jobs/runner.js +197 -0
- package/server/jobs/throughput.js +63 -0
- package/server/lib/vault/encrypt.js +40 -0
- package/server/lib/vault/ids.js +9 -0
- package/server/lib/vault/index.js +14 -0
- package/server/lib/vault/jwt.js +55 -0
- package/server/lib/vault/password.js +10 -0
- package/server/lint/boundaries.js +77 -0
- package/server/logger/index.js +130 -0
- package/server/mail/drivers/console.js +31 -0
- package/server/mail/drivers/smtp.js +34 -0
- package/server/mail/imap.js +105 -0
- package/server/mail/inbound-store.js +58 -0
- package/server/mail/inbound.js +79 -0
- package/server/mail/index.js +112 -0
- package/server/mcp/debug-api.js +137 -0
- package/server/mcp/helpers.js +30 -0
- package/server/mcp/index.js +77 -0
- package/server/mcp/runtime.js +7 -0
- package/server/mcp/server.js +19 -0
- package/server/mcp/tools/debugging.js +133 -0
- package/server/mcp/tools/introspection.js +87 -0
- package/server/middlewares/cors.js +30 -0
- package/server/middlewares/index.js +3 -0
- package/server/middlewares/require-session.js +15 -0
- package/server/module-loader.js +9 -0
- package/server/pages/build-client.js +187 -0
- package/server/pages/build-css.js +47 -0
- package/server/pages/build-manifest.js +55 -0
- package/server/pages/build-plugins.js +75 -0
- package/server/pages/build-server.js +115 -0
- package/server/pages/build.js +116 -0
- package/server/pages/discovery.js +120 -0
- package/server/pages/fonts.js +128 -0
- package/server/pages/handler.js +276 -0
- package/server/pages/hmr.js +176 -0
- package/server/pages/pages-router.js +78 -0
- package/server/pages/ssr.js +276 -0
- package/server/pages/static.js +92 -0
- package/server/pages/watcher.js +90 -0
- package/server/queue/drivers/knex.js +67 -0
- package/server/queue/drivers/redis.js +91 -0
- package/server/queue/index.js +61 -0
- package/server/rate-limit/consume.js +21 -0
- package/server/rate-limit/drivers/memory.js +24 -0
- package/server/rate-limit/drivers/redis.js +32 -0
- package/server/rate-limit/index.js +33 -0
- package/server/redis/index.js +67 -0
- package/server/ring-buffer.js +44 -0
- package/server/route.js +4 -0
- package/server/router/api-router.js +317 -0
- package/server/router/cors.js +31 -0
- package/server/router/middleware.js +91 -0
- package/server/router/routes.js +132 -0
- package/server/server.js +35 -0
- package/server/session/helpers.js +21 -0
- package/server/session/index.js +89 -0
- package/server/static/index.js +36 -0
- package/server/system-jobs/index.js +50 -0
- package/server/system-routes/index.js +84 -0
- package/server/testing/index.js +263 -0
- package/server/validation.js +41 -0
- package/server/watcher.js +34 -0
- package/server/web-server.js +231 -0
- package/server/ws/discovery.js +54 -0
- package/server/ws/index.js +14 -0
- package/server/ws/realtime.js +318 -0
- package/server/ws/registry.js +17 -0
- package/server/ws/server.js +152 -0
- package/server/ws/ws-router.js +335 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AlertDialog as AlertDialogPrimitive } from 'radix-ui';
|
|
3
|
+
import { cn } from './lib/utils.js';
|
|
4
|
+
import { Button } from './button.jsx';
|
|
5
|
+
function AlertDialog({ ...props }) {
|
|
6
|
+
return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />;
|
|
7
|
+
}
|
|
8
|
+
function AlertDialogTrigger({ ...props }) {
|
|
9
|
+
return <AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} />;
|
|
10
|
+
}
|
|
11
|
+
function AlertDialogPortal({ ...props }) {
|
|
12
|
+
return <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} />;
|
|
13
|
+
}
|
|
14
|
+
function AlertDialogOverlay({ className, ...props }) {
|
|
15
|
+
return (
|
|
16
|
+
<AlertDialogPrimitive.Overlay
|
|
17
|
+
data-slot="alert-dialog-overlay"
|
|
18
|
+
className={cn('cn-alert-dialog-overlay fixed inset-0 z-50', className)}
|
|
19
|
+
{...props}
|
|
20
|
+
/>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
function AlertDialogContent({ className, size = 'default', ...props }) {
|
|
24
|
+
return (
|
|
25
|
+
<AlertDialogPortal>
|
|
26
|
+
<AlertDialogOverlay />
|
|
27
|
+
<AlertDialogPrimitive.Content
|
|
28
|
+
data-slot="alert-dialog-content"
|
|
29
|
+
data-size={size}
|
|
30
|
+
className={cn(
|
|
31
|
+
'cn-alert-dialog-content group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 outline-none',
|
|
32
|
+
className,
|
|
33
|
+
)}
|
|
34
|
+
{...props}
|
|
35
|
+
/>
|
|
36
|
+
</AlertDialogPortal>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
function AlertDialogHeader({ className, ...props }) {
|
|
40
|
+
return (
|
|
41
|
+
<div
|
|
42
|
+
data-slot="alert-dialog-header"
|
|
43
|
+
className={cn('cn-alert-dialog-header', className)}
|
|
44
|
+
{...props}
|
|
45
|
+
/>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
function AlertDialogFooter({ className, ...props }) {
|
|
49
|
+
return (
|
|
50
|
+
<div
|
|
51
|
+
data-slot="alert-dialog-footer"
|
|
52
|
+
className={cn(
|
|
53
|
+
'cn-alert-dialog-footer flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end',
|
|
54
|
+
className,
|
|
55
|
+
)}
|
|
56
|
+
{...props}
|
|
57
|
+
/>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
function AlertDialogMedia({ className, ...props }) {
|
|
61
|
+
return (
|
|
62
|
+
<div
|
|
63
|
+
data-slot="alert-dialog-media"
|
|
64
|
+
className={cn('cn-alert-dialog-media', className)}
|
|
65
|
+
{...props}
|
|
66
|
+
/>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
function AlertDialogTitle({ className, ...props }) {
|
|
70
|
+
return (
|
|
71
|
+
<AlertDialogPrimitive.Title
|
|
72
|
+
data-slot="alert-dialog-title"
|
|
73
|
+
className={cn('cn-alert-dialog-title', className)}
|
|
74
|
+
{...props}
|
|
75
|
+
/>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
function AlertDialogDescription({ className, ...props }) {
|
|
79
|
+
return (
|
|
80
|
+
<AlertDialogPrimitive.Description
|
|
81
|
+
data-slot="alert-dialog-description"
|
|
82
|
+
className={cn('cn-alert-dialog-description', className)}
|
|
83
|
+
{...props}
|
|
84
|
+
/>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
function AlertDialogAction({ className, variant = 'default', size = 'default', ...props }) {
|
|
88
|
+
return (
|
|
89
|
+
<Button variant={variant} size={size} asChild>
|
|
90
|
+
<AlertDialogPrimitive.Action
|
|
91
|
+
data-slot="alert-dialog-action"
|
|
92
|
+
className={cn('cn-alert-dialog-action', className)}
|
|
93
|
+
{...props}
|
|
94
|
+
/>
|
|
95
|
+
</Button>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
function AlertDialogCancel({ className, variant = 'outline', size = 'default', ...props }) {
|
|
99
|
+
return (
|
|
100
|
+
<Button variant={variant} size={size} asChild>
|
|
101
|
+
<AlertDialogPrimitive.Cancel
|
|
102
|
+
data-slot="alert-dialog-cancel"
|
|
103
|
+
className={cn('cn-alert-dialog-cancel', className)}
|
|
104
|
+
{...props}
|
|
105
|
+
/>
|
|
106
|
+
</Button>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
export {
|
|
110
|
+
AlertDialog,
|
|
111
|
+
AlertDialogAction,
|
|
112
|
+
AlertDialogCancel,
|
|
113
|
+
AlertDialogContent,
|
|
114
|
+
AlertDialogDescription,
|
|
115
|
+
AlertDialogFooter,
|
|
116
|
+
AlertDialogHeader,
|
|
117
|
+
AlertDialogMedia,
|
|
118
|
+
AlertDialogOverlay,
|
|
119
|
+
AlertDialogPortal,
|
|
120
|
+
AlertDialogTitle,
|
|
121
|
+
AlertDialogTrigger,
|
|
122
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { expect, within } from 'storybook/test';
|
|
3
|
+
import {
|
|
4
|
+
AlertDialog,
|
|
5
|
+
AlertDialogTrigger,
|
|
6
|
+
AlertDialogContent,
|
|
7
|
+
AlertDialogHeader,
|
|
8
|
+
AlertDialogTitle,
|
|
9
|
+
AlertDialogDescription,
|
|
10
|
+
AlertDialogFooter,
|
|
11
|
+
AlertDialogAction,
|
|
12
|
+
AlertDialogCancel,
|
|
13
|
+
} from './alert-dialog.jsx';
|
|
14
|
+
import { Button } from './button.jsx';
|
|
15
|
+
const meta = {
|
|
16
|
+
title: 'UI/AlertDialog',
|
|
17
|
+
component: AlertDialog,
|
|
18
|
+
};
|
|
19
|
+
var stdin_default = meta;
|
|
20
|
+
const Default = {
|
|
21
|
+
render: () => (
|
|
22
|
+
<AlertDialog>
|
|
23
|
+
<AlertDialogTrigger asChild>
|
|
24
|
+
<Button variant="destructive">Delete Item</Button>
|
|
25
|
+
</AlertDialogTrigger>
|
|
26
|
+
<AlertDialogContent>
|
|
27
|
+
<AlertDialogHeader>
|
|
28
|
+
<AlertDialogTitle>Are you sure?</AlertDialogTitle>
|
|
29
|
+
<AlertDialogDescription>This action cannot be undone.</AlertDialogDescription>
|
|
30
|
+
</AlertDialogHeader>
|
|
31
|
+
<AlertDialogFooter>
|
|
32
|
+
<AlertDialogCancel>Cancel</AlertDialogCancel>
|
|
33
|
+
<AlertDialogAction>Continue</AlertDialogAction>
|
|
34
|
+
</AlertDialogFooter>
|
|
35
|
+
</AlertDialogContent>
|
|
36
|
+
</AlertDialog>
|
|
37
|
+
),
|
|
38
|
+
play: async ({ canvasElement }) => {
|
|
39
|
+
const canvas = within(canvasElement);
|
|
40
|
+
const trigger = canvas.getByRole('button', { name: 'Delete Item' });
|
|
41
|
+
await expect(trigger).toBeInTheDocument();
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
export { Default, stdin_default as default };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import { cn } from './lib/utils.js';
|
|
4
|
+
const alertVariants = cva('cn-alert w-full relative group/alert', {
|
|
5
|
+
variants: {
|
|
6
|
+
variant: {
|
|
7
|
+
default: 'cn-alert-variant-default',
|
|
8
|
+
destructive: 'cn-alert-variant-destructive',
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
defaultVariants: {
|
|
12
|
+
variant: 'default',
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
function Alert({ className, variant, ...props }) {
|
|
16
|
+
return (
|
|
17
|
+
<div
|
|
18
|
+
data-slot="alert"
|
|
19
|
+
role="alert"
|
|
20
|
+
className={cn(alertVariants({ variant }), className)}
|
|
21
|
+
{...props}
|
|
22
|
+
/>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
function AlertTitle({ className, ...props }) {
|
|
26
|
+
return (
|
|
27
|
+
<div
|
|
28
|
+
data-slot="alert-title"
|
|
29
|
+
className={cn(
|
|
30
|
+
'cn-alert-title [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3',
|
|
31
|
+
className,
|
|
32
|
+
)}
|
|
33
|
+
{...props}
|
|
34
|
+
/>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
function AlertDescription({ className, ...props }) {
|
|
38
|
+
return (
|
|
39
|
+
<div
|
|
40
|
+
data-slot="alert-description"
|
|
41
|
+
className={cn(
|
|
42
|
+
'cn-alert-description [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3',
|
|
43
|
+
className,
|
|
44
|
+
)}
|
|
45
|
+
{...props}
|
|
46
|
+
/>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
function AlertAction({ className, ...props }) {
|
|
50
|
+
return <div data-slot="alert-action" className={cn('cn-alert-action', className)} {...props} />;
|
|
51
|
+
}
|
|
52
|
+
export { Alert, AlertAction, AlertDescription, AlertTitle };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { expect, within } from 'storybook/test';
|
|
3
|
+
import { Alert, AlertTitle, AlertDescription } from './alert.jsx';
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'UI/Alert',
|
|
6
|
+
component: Alert,
|
|
7
|
+
};
|
|
8
|
+
var stdin_default = meta;
|
|
9
|
+
const Default = {
|
|
10
|
+
render: () => (
|
|
11
|
+
<Alert>
|
|
12
|
+
<AlertTitle>Heads up!</AlertTitle>
|
|
13
|
+
<AlertDescription>You can add components to your app using the CLI.</AlertDescription>
|
|
14
|
+
</Alert>
|
|
15
|
+
),
|
|
16
|
+
play: async ({ canvasElement }) => {
|
|
17
|
+
const canvas = within(canvasElement);
|
|
18
|
+
await expect(canvas.getByText('Heads up!')).toBeInTheDocument();
|
|
19
|
+
const alert = canvasElement.querySelector('[data-slot="alert"]');
|
|
20
|
+
await expect(alert).toBeInTheDocument();
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
const Destructive = {
|
|
24
|
+
render: () => (
|
|
25
|
+
<Alert variant="destructive">
|
|
26
|
+
<AlertTitle>Error</AlertTitle>
|
|
27
|
+
<AlertDescription>Something went wrong. Please try again.</AlertDescription>
|
|
28
|
+
</Alert>
|
|
29
|
+
),
|
|
30
|
+
};
|
|
31
|
+
export { Default, Destructive, stdin_default as default };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { createContext, useContext, useState, useCallback } from 'react';
|
|
3
|
+
const AppShellContext = createContext(null);
|
|
4
|
+
function useAppShell() {
|
|
5
|
+
const ctx = useContext(AppShellContext);
|
|
6
|
+
if (!ctx) throw new Error('useAppShell must be used within an AppShell');
|
|
7
|
+
return ctx;
|
|
8
|
+
}
|
|
9
|
+
function AppShell({ children, defaultCollapsed = false, defaultPanelOpen = false }) {
|
|
10
|
+
const [sidebarCollapsed, setSidebarCollapsed] = useState(defaultCollapsed);
|
|
11
|
+
const [mobileOpen, setMobileOpen] = useState(false);
|
|
12
|
+
const [panelOpen, setPanelOpen] = useState(defaultPanelOpen);
|
|
13
|
+
const toggleSidebar = useCallback(() => setSidebarCollapsed((prev) => !prev), []);
|
|
14
|
+
const toggleMobile = useCallback(() => setMobileOpen((prev) => !prev), []);
|
|
15
|
+
const togglePanel = useCallback(() => setPanelOpen((prev) => !prev), []);
|
|
16
|
+
return (
|
|
17
|
+
<AppShellContext.Provider
|
|
18
|
+
value={{
|
|
19
|
+
sidebarCollapsed,
|
|
20
|
+
setSidebarCollapsed,
|
|
21
|
+
toggleSidebar,
|
|
22
|
+
mobileOpen,
|
|
23
|
+
setMobileOpen,
|
|
24
|
+
toggleMobile,
|
|
25
|
+
panelOpen,
|
|
26
|
+
setPanelOpen,
|
|
27
|
+
togglePanel,
|
|
28
|
+
}}
|
|
29
|
+
>
|
|
30
|
+
<div
|
|
31
|
+
data-shell
|
|
32
|
+
className="@container/shell relative flex h-screen w-full overflow-hidden bg-background text-foreground"
|
|
33
|
+
>
|
|
34
|
+
{children}
|
|
35
|
+
</div>
|
|
36
|
+
</AppShellContext.Provider>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
export { AppShell, AppShellContext, useAppShell };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { expect, within } from 'storybook/test';
|
|
3
|
+
import { AppShell, useAppShell } from './app-shell.jsx';
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'UI/AppShell',
|
|
6
|
+
component: AppShell,
|
|
7
|
+
};
|
|
8
|
+
var stdin_default = meta;
|
|
9
|
+
function SidebarToggle() {
|
|
10
|
+
const { sidebarCollapsed, toggleSidebar } = useAppShell();
|
|
11
|
+
return (
|
|
12
|
+
<button onClick={toggleSidebar}>
|
|
13
|
+
{sidebarCollapsed ? 'Expand Sidebar' : 'Collapse Sidebar'}
|
|
14
|
+
</button>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
function PanelToggle() {
|
|
18
|
+
const { panelOpen, togglePanel } = useAppShell();
|
|
19
|
+
return <button onClick={togglePanel}>{panelOpen ? 'Close Panel' : 'Open Panel'}</button>;
|
|
20
|
+
}
|
|
21
|
+
const Default = {
|
|
22
|
+
render: () => (
|
|
23
|
+
<AppShell>
|
|
24
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem', padding: '1rem' }}>
|
|
25
|
+
<SidebarToggle />
|
|
26
|
+
<PanelToggle />
|
|
27
|
+
<p>Main content area</p>
|
|
28
|
+
</div>
|
|
29
|
+
</AppShell>
|
|
30
|
+
),
|
|
31
|
+
play: async ({ canvasElement }) => {
|
|
32
|
+
const canvas = within(canvasElement);
|
|
33
|
+
await expect(canvas.getByText('Collapse Sidebar')).toBeInTheDocument();
|
|
34
|
+
await expect(canvas.getByText('Open Panel')).toBeInTheDocument();
|
|
35
|
+
await expect(canvas.getByText('Main content area')).toBeInTheDocument();
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const DefaultCollapsed = {
|
|
39
|
+
render: () => (
|
|
40
|
+
<AppShell defaultCollapsed>
|
|
41
|
+
<div style={{ padding: '1rem' }}>
|
|
42
|
+
<SidebarToggle />
|
|
43
|
+
</div>
|
|
44
|
+
</AppShell>
|
|
45
|
+
),
|
|
46
|
+
play: async ({ canvasElement }) => {
|
|
47
|
+
const canvas = within(canvasElement);
|
|
48
|
+
await expect(canvas.getByText('Expand Sidebar')).toBeInTheDocument();
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
export { Default, DefaultCollapsed, stdin_default as default };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { expect } from 'storybook/test';
|
|
3
|
+
import { AspectRatio } from './aspect-ratio.jsx';
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'UI/AspectRatio',
|
|
6
|
+
component: AspectRatio,
|
|
7
|
+
};
|
|
8
|
+
var stdin_default = meta;
|
|
9
|
+
const Default = {
|
|
10
|
+
args: {
|
|
11
|
+
ratio: 16 / 9,
|
|
12
|
+
children: (
|
|
13
|
+
<div
|
|
14
|
+
style={{
|
|
15
|
+
background: '#e2e8f0',
|
|
16
|
+
width: '100%',
|
|
17
|
+
height: '100%',
|
|
18
|
+
display: 'flex',
|
|
19
|
+
alignItems: 'center',
|
|
20
|
+
justifyContent: 'center',
|
|
21
|
+
}}
|
|
22
|
+
>
|
|
23
|
+
16:9
|
|
24
|
+
</div>
|
|
25
|
+
),
|
|
26
|
+
},
|
|
27
|
+
decorators: [
|
|
28
|
+
(Story) => (
|
|
29
|
+
<div style={{ width: 400 }}>
|
|
30
|
+
<Story />
|
|
31
|
+
</div>
|
|
32
|
+
),
|
|
33
|
+
],
|
|
34
|
+
play: async ({ canvasElement }) => {
|
|
35
|
+
const el = canvasElement.querySelector('[data-slot="aspect-ratio"]');
|
|
36
|
+
await expect(el).toBeInTheDocument();
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
const Square = {
|
|
40
|
+
args: {
|
|
41
|
+
ratio: 1,
|
|
42
|
+
children: (
|
|
43
|
+
<div
|
|
44
|
+
style={{
|
|
45
|
+
background: '#e2e8f0',
|
|
46
|
+
width: '100%',
|
|
47
|
+
height: '100%',
|
|
48
|
+
display: 'flex',
|
|
49
|
+
alignItems: 'center',
|
|
50
|
+
justifyContent: 'center',
|
|
51
|
+
}}
|
|
52
|
+
>
|
|
53
|
+
1:1
|
|
54
|
+
</div>
|
|
55
|
+
),
|
|
56
|
+
},
|
|
57
|
+
decorators: [
|
|
58
|
+
(Story) => (
|
|
59
|
+
<div style={{ width: 200 }}>
|
|
60
|
+
<Story />
|
|
61
|
+
</div>
|
|
62
|
+
),
|
|
63
|
+
],
|
|
64
|
+
play: async ({ canvasElement }) => {
|
|
65
|
+
const el = canvasElement.querySelector('[data-slot="aspect-ratio"]');
|
|
66
|
+
await expect(el).toBeInTheDocument();
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
export { Default, Square, stdin_default as default };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Avatar as AvatarPrimitive } from 'radix-ui';
|
|
3
|
+
import { cn } from './lib/utils.js';
|
|
4
|
+
function Avatar({ className, size = 'default', ...props }) {
|
|
5
|
+
return (
|
|
6
|
+
<AvatarPrimitive.Root
|
|
7
|
+
data-slot="avatar"
|
|
8
|
+
data-size={size}
|
|
9
|
+
className={cn(
|
|
10
|
+
'cn-avatar after:border-border group/avatar relative flex shrink-0 select-none after:absolute after:inset-0 after:border after:mix-blend-darken dark:after:mix-blend-lighten',
|
|
11
|
+
className,
|
|
12
|
+
)}
|
|
13
|
+
{...props}
|
|
14
|
+
/>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
function AvatarImage({ className, ...props }) {
|
|
18
|
+
return (
|
|
19
|
+
<AvatarPrimitive.Image
|
|
20
|
+
data-slot="avatar-image"
|
|
21
|
+
className={cn('cn-avatar-image aspect-square size-full object-cover', className)}
|
|
22
|
+
{...props}
|
|
23
|
+
/>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
function AvatarFallback({ className, ...props }) {
|
|
27
|
+
return (
|
|
28
|
+
<AvatarPrimitive.Fallback
|
|
29
|
+
data-slot="avatar-fallback"
|
|
30
|
+
className={cn(
|
|
31
|
+
'cn-avatar-fallback flex size-full items-center justify-center text-sm group-data-[size=sm]/avatar:text-xs',
|
|
32
|
+
className,
|
|
33
|
+
)}
|
|
34
|
+
{...props}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
function AvatarBadge({ className, ...props }) {
|
|
39
|
+
return (
|
|
40
|
+
<span
|
|
41
|
+
data-slot="avatar-badge"
|
|
42
|
+
className={cn(
|
|
43
|
+
'cn-avatar-badge absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-blend-color ring-2 select-none',
|
|
44
|
+
'group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden',
|
|
45
|
+
'group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2',
|
|
46
|
+
'group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2',
|
|
47
|
+
className,
|
|
48
|
+
)}
|
|
49
|
+
{...props}
|
|
50
|
+
/>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
function AvatarGroup({ className, ...props }) {
|
|
54
|
+
return (
|
|
55
|
+
<div
|
|
56
|
+
data-slot="avatar-group"
|
|
57
|
+
className={cn(
|
|
58
|
+
'cn-avatar-group *:data-[slot=avatar]:ring-background group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2',
|
|
59
|
+
className,
|
|
60
|
+
)}
|
|
61
|
+
{...props}
|
|
62
|
+
/>
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
function AvatarGroupCount({ className, ...props }) {
|
|
66
|
+
return (
|
|
67
|
+
<div
|
|
68
|
+
data-slot="avatar-group-count"
|
|
69
|
+
className={cn(
|
|
70
|
+
'cn-avatar-group-count ring-background relative flex shrink-0 items-center justify-center ring-2',
|
|
71
|
+
'',
|
|
72
|
+
className,
|
|
73
|
+
)}
|
|
74
|
+
{...props}
|
|
75
|
+
/>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
export { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { expect } from 'storybook/test';
|
|
3
|
+
import { Avatar, AvatarImage, AvatarFallback } from './avatar.jsx';
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'UI/Avatar',
|
|
6
|
+
component: Avatar,
|
|
7
|
+
argTypes: {
|
|
8
|
+
size: { control: 'select', options: ['default', 'sm', 'lg'] },
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
var stdin_default = meta;
|
|
12
|
+
const WithFallback = {
|
|
13
|
+
render: (args) => (
|
|
14
|
+
<Avatar {...args}>
|
|
15
|
+
<AvatarFallback>JD</AvatarFallback>
|
|
16
|
+
</Avatar>
|
|
17
|
+
),
|
|
18
|
+
play: async ({ canvasElement }) => {
|
|
19
|
+
const avatar = canvasElement.querySelector('[data-slot="avatar"]');
|
|
20
|
+
await expect(avatar).toBeInTheDocument();
|
|
21
|
+
const fallback = canvasElement.querySelector('[data-slot="avatar-fallback"]');
|
|
22
|
+
await expect(fallback).toBeInTheDocument();
|
|
23
|
+
await expect(fallback.textContent).toBe('JD');
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const WithImage = {
|
|
27
|
+
render: (args) => (
|
|
28
|
+
<Avatar {...args}>
|
|
29
|
+
<AvatarImage src="https://github.com/shadcn.png" alt="User" />
|
|
30
|
+
<AvatarFallback>CN</AvatarFallback>
|
|
31
|
+
</Avatar>
|
|
32
|
+
),
|
|
33
|
+
play: async ({ canvasElement }) => {
|
|
34
|
+
const avatar = canvasElement.querySelector('[data-slot="avatar"]');
|
|
35
|
+
await expect(avatar).toBeInTheDocument();
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const Small = {
|
|
39
|
+
args: { size: 'sm' },
|
|
40
|
+
render: (args) => (
|
|
41
|
+
<Avatar {...args}>
|
|
42
|
+
<AvatarFallback>S</AvatarFallback>
|
|
43
|
+
</Avatar>
|
|
44
|
+
),
|
|
45
|
+
play: async ({ canvasElement }) => {
|
|
46
|
+
const avatar = canvasElement.querySelector('[data-slot="avatar"]');
|
|
47
|
+
await expect(avatar.getAttribute('data-size')).toBe('sm');
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
const Large = {
|
|
51
|
+
args: { size: 'lg' },
|
|
52
|
+
render: (args) => (
|
|
53
|
+
<Avatar {...args}>
|
|
54
|
+
<AvatarFallback>LG</AvatarFallback>
|
|
55
|
+
</Avatar>
|
|
56
|
+
),
|
|
57
|
+
play: async ({ canvasElement }) => {
|
|
58
|
+
const avatar = canvasElement.querySelector('[data-slot="avatar"]');
|
|
59
|
+
await expect(avatar.getAttribute('data-size')).toBe('lg');
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
export { Large, Small, WithFallback, WithImage, stdin_default as default };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import { Slot } from 'radix-ui';
|
|
4
|
+
import { cn } from './lib/utils.js';
|
|
5
|
+
const badgeVariants = cva(
|
|
6
|
+
'cn-badge inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive overflow-hidden group/badge',
|
|
7
|
+
{
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
default: 'cn-badge-variant-default',
|
|
11
|
+
secondary: 'cn-badge-variant-secondary',
|
|
12
|
+
destructive: 'cn-badge-variant-destructive',
|
|
13
|
+
outline: 'cn-badge-variant-outline',
|
|
14
|
+
ghost: 'cn-badge-variant-ghost',
|
|
15
|
+
link: 'cn-badge-variant-link',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
defaultVariants: {
|
|
19
|
+
variant: 'default',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
);
|
|
23
|
+
function Badge({ className, variant = 'default', asChild = false, ...props }) {
|
|
24
|
+
const Comp = asChild ? Slot.Root : 'span';
|
|
25
|
+
return (
|
|
26
|
+
<Comp
|
|
27
|
+
data-slot="badge"
|
|
28
|
+
data-variant={variant}
|
|
29
|
+
className={cn(badgeVariants({ variant }), className)}
|
|
30
|
+
{...props}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
export { Badge, badgeVariants };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { expect, within } from 'storybook/test';
|
|
2
|
+
import { Badge } from './badge.jsx';
|
|
3
|
+
const meta = {
|
|
4
|
+
title: 'UI/Badge',
|
|
5
|
+
component: Badge,
|
|
6
|
+
argTypes: {
|
|
7
|
+
variant: {
|
|
8
|
+
control: 'select',
|
|
9
|
+
options: ['default', 'secondary', 'destructive', 'outline'],
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
var stdin_default = meta;
|
|
14
|
+
const Default = {
|
|
15
|
+
args: { children: 'Badge' },
|
|
16
|
+
play: async ({ canvasElement }) => {
|
|
17
|
+
const canvas = within(canvasElement);
|
|
18
|
+
const badge = canvas.getByText('Badge');
|
|
19
|
+
await expect(badge).toBeInTheDocument();
|
|
20
|
+
await expect(badge.dataset.slot).toBe('badge');
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
const Secondary = {
|
|
24
|
+
args: { children: 'Secondary', variant: 'secondary' },
|
|
25
|
+
};
|
|
26
|
+
const Destructive = {
|
|
27
|
+
args: { children: 'Destructive', variant: 'destructive' },
|
|
28
|
+
};
|
|
29
|
+
const Outline = {
|
|
30
|
+
args: { children: 'Outline', variant: 'outline' },
|
|
31
|
+
};
|
|
32
|
+
export { Default, Destructive, Outline, Secondary, stdin_default as default };
|