dsh-plugin-image-workbench 1.1.5 → 1.1.7
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 -21
- package/README.en.md +5 -3
- package/README.md +7 -3
- package/client.js +241 -241
- package/cordis.patch.yml +14 -14
- package/host.js +51 -0
- package/install.mjs +333 -387
- package/package.json +3 -2
- package/scripts/fetch-style-images.mjs +104 -0
- package/scripts/vendor-snapshot.py +154 -154
- package/server/access.py +26 -26
- package/server/app.py +1371 -1329
- package/server/catalog.py +147 -147
- package/server/composer.py +391 -391
- package/server/drafts.py +158 -158
- package/server/history.py +575 -575
- package/server/imaging.py +172 -172
- package/server/pool.py +1335 -1335
- package/server/pool_admin.py +921 -921
- package/server/pool_service.py +1073 -1073
- package/server/requirements.txt +6 -6
- package/server/smoke_check.py +402 -402
- package/server/static/access.html +202 -202
- package/server/static/index.html +15 -0
- package/vendor/chatgpt2api/source/.env.example +82 -82
- package/vendor/chatgpt2api/source/.python-version +1 -1
- package/vendor/chatgpt2api/source/LICENSE +21 -21
- package/vendor/chatgpt2api/source/README.md +391 -391
- package/vendor/chatgpt2api/source/VERSION +1 -1
- package/vendor/chatgpt2api/source/api/__init__.py +2 -2
- package/vendor/chatgpt2api/source/api/accounts.py +537 -537
- package/vendor/chatgpt2api/source/api/ai.py +217 -217
- package/vendor/chatgpt2api/source/api/app.py +62 -62
- package/vendor/chatgpt2api/source/api/errors.py +46 -46
- package/vendor/chatgpt2api/source/api/image_inputs.py +309 -309
- package/vendor/chatgpt2api/source/api/image_tasks.py +120 -120
- package/vendor/chatgpt2api/source/api/support.py +134 -134
- package/vendor/chatgpt2api/source/api/system.py +365 -365
- package/vendor/chatgpt2api/source/assets/kunrouai.svg +50 -50
- package/vendor/chatgpt2api/source/config.default.json +108 -108
- package/vendor/chatgpt2api/source/main.py +9 -9
- package/vendor/chatgpt2api/source/pyproject.toml +27 -27
- package/vendor/chatgpt2api/source/scripts/init_proxy_config.py +186 -186
- package/vendor/chatgpt2api/source/scripts/migrate_storage.py +163 -163
- package/vendor/chatgpt2api/source/scripts/privoxy-warp.conf +13 -13
- package/vendor/chatgpt2api/source/scripts/test_outlook_token_mailbox.py +385 -385
- package/vendor/chatgpt2api/source/scripts/test_storage.py +129 -129
- package/vendor/chatgpt2api/source/scripts/verify_oauth_refresh.py +92 -92
- package/vendor/chatgpt2api/source/services/account_service.py +1757 -1757
- package/vendor/chatgpt2api/source/services/auth_service.py +253 -253
- package/vendor/chatgpt2api/source/services/backup_service.py +671 -671
- package/vendor/chatgpt2api/source/services/config.py +667 -667
- package/vendor/chatgpt2api/source/services/content_filter.py +242 -242
- package/vendor/chatgpt2api/source/services/cpa_service.py +315 -315
- package/vendor/chatgpt2api/source/services/editable_file_task_service.py +260 -260
- package/vendor/chatgpt2api/source/services/image_service.py +376 -376
- package/vendor/chatgpt2api/source/services/image_storage_service.py +405 -405
- package/vendor/chatgpt2api/source/services/image_tags_service.py +76 -76
- package/vendor/chatgpt2api/source/services/image_task_service.py +550 -550
- package/vendor/chatgpt2api/source/services/log_service.py +337 -337
- package/vendor/chatgpt2api/source/services/model_service.py +182 -182
- package/vendor/chatgpt2api/source/services/oauth_login_service.py +267 -267
- package/vendor/chatgpt2api/source/services/openai_backend_api.py +2763 -2763
- package/vendor/chatgpt2api/source/services/openai_oauth.py +32 -32
- package/vendor/chatgpt2api/source/services/protocol/__init__.py +2 -2
- package/vendor/chatgpt2api/source/services/protocol/anthropic_v1_messages.py +307 -307
- package/vendor/chatgpt2api/source/services/protocol/chat_completion_cache.py +238 -238
- package/vendor/chatgpt2api/source/services/protocol/conversation.py +1644 -1644
- package/vendor/chatgpt2api/source/services/protocol/error_response.py +124 -124
- package/vendor/chatgpt2api/source/services/protocol/openai_search.py +19 -19
- package/vendor/chatgpt2api/source/services/protocol/openai_v1_chat_complete.py +316 -316
- package/vendor/chatgpt2api/source/services/protocol/openai_v1_image_edit.py +86 -86
- package/vendor/chatgpt2api/source/services/protocol/openai_v1_image_generations.py +42 -42
- package/vendor/chatgpt2api/source/services/protocol/openai_v1_models.py +53 -53
- package/vendor/chatgpt2api/source/services/protocol/openai_v1_response.py +453 -453
- package/vendor/chatgpt2api/source/services/protocol/web_search_tool.py +160 -160
- package/vendor/chatgpt2api/source/services/proxy_service.py +648 -648
- package/vendor/chatgpt2api/source/services/storage/__init__.py +5 -5
- package/vendor/chatgpt2api/source/services/storage/base.py +38 -38
- package/vendor/chatgpt2api/source/services/storage/database_storage.py +194 -194
- package/vendor/chatgpt2api/source/services/storage/factory.py +104 -104
- package/vendor/chatgpt2api/source/services/storage/git_storage.py +183 -183
- package/vendor/chatgpt2api/source/services/storage/json_storage.py +95 -95
- package/vendor/chatgpt2api/source/services/sub2api_service.py +531 -531
- package/vendor/chatgpt2api/source/utils/helper.py +469 -469
- package/vendor/chatgpt2api/source/utils/image_tokens.py +346 -346
- package/vendor/chatgpt2api/source/utils/log.py +110 -110
- package/vendor/chatgpt2api/source/utils/pkce.py +19 -19
- package/vendor/chatgpt2api/source/utils/pow.py +207 -207
- package/vendor/chatgpt2api/source/utils/sentinel.py +159 -159
- package/vendor/chatgpt2api/source/utils/turnstile.py +184 -184
- package/vendor/chatgpt2api/source/uv.lock +904 -904
- package/vendor/chatgpt2api/source/web/bun.lock +1501 -1501
- package/vendor/chatgpt2api/source/web/components.json +24 -24
- package/vendor/chatgpt2api/source/web/eslint.config.mjs +17 -17
- package/vendor/chatgpt2api/source/web/next.config.ts +40 -40
- package/vendor/chatgpt2api/source/web/package.json +58 -58
- package/vendor/chatgpt2api/source/web/postcss.config.mjs +5 -5
- package/vendor/chatgpt2api/source/web/src/app/accounts/components/account-import-dialog.tsx +925 -925
- package/vendor/chatgpt2api/source/web/src/app/accounts/page.tsx +1307 -1307
- package/vendor/chatgpt2api/source/web/src/app/debug/components/chat-panel.tsx +224 -224
- package/vendor/chatgpt2api/source/web/src/app/debug/components/editable-file-panel.tsx +444 -444
- package/vendor/chatgpt2api/source/web/src/app/debug/components/ppt-panel.tsx +9 -9
- package/vendor/chatgpt2api/source/web/src/app/debug/components/psd-panel.tsx +9 -9
- package/vendor/chatgpt2api/source/web/src/app/debug/components/search-panel.tsx +172 -172
- package/vendor/chatgpt2api/source/web/src/app/debug/components/skill-panel.tsx +169 -169
- package/vendor/chatgpt2api/source/web/src/app/debug/components/types.ts +39 -39
- package/vendor/chatgpt2api/source/web/src/app/debug/page.tsx +59 -59
- package/vendor/chatgpt2api/source/web/src/app/globals.css +230 -230
- package/vendor/chatgpt2api/source/web/src/app/image/components/image-composer.tsx +542 -542
- package/vendor/chatgpt2api/source/web/src/app/image/components/image-results.tsx +554 -554
- package/vendor/chatgpt2api/source/web/src/app/image/components/image-sidebar.tsx +176 -176
- package/vendor/chatgpt2api/source/web/src/app/image/page.tsx +1799 -1799
- package/vendor/chatgpt2api/source/web/src/app/image-manager/page.tsx +732 -732
- package/vendor/chatgpt2api/source/web/src/app/layout.tsx +50 -50
- package/vendor/chatgpt2api/source/web/src/app/login/page.tsx +101 -101
- package/vendor/chatgpt2api/source/web/src/app/logs/page.tsx +356 -356
- package/vendor/chatgpt2api/source/web/src/app/page.tsx +30 -30
- package/vendor/chatgpt2api/source/web/src/app/settings/components/api-docs-card.tsx +341 -341
- package/vendor/chatgpt2api/source/web/src/app/settings/components/backup-settings-card.tsx +447 -447
- package/vendor/chatgpt2api/source/web/src/app/settings/components/base-url-card.tsx +71 -71
- package/vendor/chatgpt2api/source/web/src/app/settings/components/config-card.tsx +491 -491
- package/vendor/chatgpt2api/source/web/src/app/settings/components/cpa-pool-dialog.tsx +108 -108
- package/vendor/chatgpt2api/source/web/src/app/settings/components/cpa-pools-card.tsx +169 -169
- package/vendor/chatgpt2api/source/web/src/app/settings/components/import-browser-dialog.tsx +185 -185
- package/vendor/chatgpt2api/source/web/src/app/settings/components/proxy-runtime-card.tsx +379 -379
- package/vendor/chatgpt2api/source/web/src/app/settings/components/proxy-settings-card.tsx +127 -127
- package/vendor/chatgpt2api/source/web/src/app/settings/components/proxy-settings.tsx +200 -200
- package/vendor/chatgpt2api/source/web/src/app/settings/components/settings-header.tsx +12 -12
- package/vendor/chatgpt2api/source/web/src/app/settings/components/sub2api-connections.tsx +886 -886
- package/vendor/chatgpt2api/source/web/src/app/settings/components/third-party-apps-card.tsx +81 -81
- package/vendor/chatgpt2api/source/web/src/app/settings/components/user-keys-card.tsx +422 -422
- package/vendor/chatgpt2api/source/web/src/app/settings/page.tsx +135 -135
- package/vendor/chatgpt2api/source/web/src/app/settings/store.ts +1069 -1069
- package/vendor/chatgpt2api/source/web/src/components/date-range-filter.tsx +49 -49
- package/vendor/chatgpt2api/source/web/src/components/header-actions.tsx +24 -24
- package/vendor/chatgpt2api/source/web/src/components/image-lightbox.tsx +434 -434
- package/vendor/chatgpt2api/source/web/src/components/image-thumbnail.tsx +46 -46
- package/vendor/chatgpt2api/source/web/src/components/theme-script.tsx +18 -18
- package/vendor/chatgpt2api/source/web/src/components/theme-toggle.tsx +14 -14
- package/vendor/chatgpt2api/source/web/src/components/top-nav.tsx +263 -263
- package/vendor/chatgpt2api/source/web/src/components/ui/animated-theme-toggler.tsx +256 -256
- package/vendor/chatgpt2api/source/web/src/components/ui/badge.tsx +41 -41
- package/vendor/chatgpt2api/source/web/src/components/ui/button.tsx +59 -59
- package/vendor/chatgpt2api/source/web/src/components/ui/calendar.tsx +46 -46
- package/vendor/chatgpt2api/source/web/src/components/ui/card.tsx +61 -61
- package/vendor/chatgpt2api/source/web/src/components/ui/checkbox.tsx +27 -27
- package/vendor/chatgpt2api/source/web/src/components/ui/dia-text-reveal.tsx +267 -267
- package/vendor/chatgpt2api/source/web/src/components/ui/dialog.tsx +132 -132
- package/vendor/chatgpt2api/source/web/src/components/ui/field.tsx +13 -13
- package/vendor/chatgpt2api/source/web/src/components/ui/input.tsx +19 -19
- package/vendor/chatgpt2api/source/web/src/components/ui/label.tsx +24 -24
- package/vendor/chatgpt2api/source/web/src/components/ui/morphing-text.tsx +149 -149
- package/vendor/chatgpt2api/source/web/src/components/ui/popover.tsx +38 -38
- package/vendor/chatgpt2api/source/web/src/components/ui/select.tsx +175 -175
- package/vendor/chatgpt2api/source/web/src/components/ui/sheet.tsx +143 -143
- package/vendor/chatgpt2api/source/web/src/components/ui/table.tsx +29 -29
- package/vendor/chatgpt2api/source/web/src/components/ui/tabs.tsx +91 -91
- package/vendor/chatgpt2api/source/web/src/components/ui/text-3d-flip.tsx +269 -269
- package/vendor/chatgpt2api/source/web/src/components/ui/textarea.tsx +18 -18
- package/vendor/chatgpt2api/source/web/src/components/version-release-dialog.tsx +127 -127
- package/vendor/chatgpt2api/source/web/src/constants/common-env.ts +6 -6
- package/vendor/chatgpt2api/source/web/src/hooks/use-version-check.ts +85 -85
- package/vendor/chatgpt2api/source/web/src/lib/api.ts +926 -926
- package/vendor/chatgpt2api/source/web/src/lib/auth-session.ts +26 -26
- package/vendor/chatgpt2api/source/web/src/lib/release.ts +25 -25
- package/vendor/chatgpt2api/source/web/src/lib/request.ts +93 -93
- package/vendor/chatgpt2api/source/web/src/lib/use-auth-guard.ts +89 -89
- package/vendor/chatgpt2api/source/web/src/lib/utils.ts +6 -6
- package/vendor/chatgpt2api/source/web/src/store/auth.ts +112 -112
- package/vendor/chatgpt2api/source/web/src/store/editable-file-history.ts +33 -33
- package/vendor/chatgpt2api/source/web/src/store/image-conversations.ts +318 -318
- package/vendor/chatgpt2api/source/web/tsconfig.json +42 -42
|
@@ -1,132 +1,132 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
3
|
-
import { X } from "lucide-react";
|
|
4
|
-
|
|
5
|
-
import { cn } from "@/lib/utils";
|
|
6
|
-
|
|
7
|
-
function Dialog(props: React.ComponentProps<typeof DialogPrimitive.Root>) {
|
|
8
|
-
return <DialogPrimitive.Root data-slot="dialog" {...props} />;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function DialogTrigger(
|
|
12
|
-
props: React.ComponentProps<typeof DialogPrimitive.Trigger>,
|
|
13
|
-
) {
|
|
14
|
-
return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function DialogPortal(
|
|
18
|
-
props: React.ComponentProps<typeof DialogPrimitive.Portal>,
|
|
19
|
-
) {
|
|
20
|
-
return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function DialogClose(props: React.ComponentProps<typeof DialogPrimitive.Close>) {
|
|
24
|
-
return <DialogPrimitive.Close data-slot="dialog-close" {...props} />;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function DialogOverlay({
|
|
28
|
-
className,
|
|
29
|
-
...props
|
|
30
|
-
}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {
|
|
31
|
-
return (
|
|
32
|
-
<DialogPrimitive.Overlay
|
|
33
|
-
data-slot="dialog-overlay"
|
|
34
|
-
className={cn(
|
|
35
|
-
"data-[state=open]:animate-in data-[state=closed]:animate-out fixed inset-0 z-50 bg-black/30 backdrop-blur-[2px]",
|
|
36
|
-
className,
|
|
37
|
-
)}
|
|
38
|
-
{...props}
|
|
39
|
-
/>
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function DialogContent({
|
|
44
|
-
className,
|
|
45
|
-
children,
|
|
46
|
-
showCloseButton = true,
|
|
47
|
-
...props
|
|
48
|
-
}: React.ComponentProps<typeof DialogPrimitive.Content> & {
|
|
49
|
-
showCloseButton?: boolean;
|
|
50
|
-
}) {
|
|
51
|
-
return (
|
|
52
|
-
<DialogPortal>
|
|
53
|
-
<DialogOverlay />
|
|
54
|
-
<DialogPrimitive.Content
|
|
55
|
-
data-slot="dialog-content"
|
|
56
|
-
className={cn(
|
|
57
|
-
"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed top-[50%] left-[50%] z-50 grid w-[min(92vw,560px)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-[28px] border border-white/80 p-6 shadow-[0_36px_120px_-45px_rgba(16,24,40,0.4)] duration-200",
|
|
58
|
-
className,
|
|
59
|
-
)}
|
|
60
|
-
{...props}
|
|
61
|
-
>
|
|
62
|
-
{children}
|
|
63
|
-
{showCloseButton ? (
|
|
64
|
-
<DialogPrimitive.Close className="ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-full p-1 opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:outline-none disabled:pointer-events-none">
|
|
65
|
-
<X className="size-4" />
|
|
66
|
-
<span className="sr-only">Close</span>
|
|
67
|
-
</DialogPrimitive.Close>
|
|
68
|
-
) : null}
|
|
69
|
-
</DialogPrimitive.Content>
|
|
70
|
-
</DialogPortal>
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
|
|
75
|
-
return (
|
|
76
|
-
<div
|
|
77
|
-
data-slot="dialog-header"
|
|
78
|
-
className={cn("flex flex-col gap-2 text-left", className)}
|
|
79
|
-
{...props}
|
|
80
|
-
/>
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function DialogFooter({ className, ...props }: React.ComponentProps<"div">) {
|
|
85
|
-
return (
|
|
86
|
-
<div
|
|
87
|
-
data-slot="dialog-footer"
|
|
88
|
-
className={cn(
|
|
89
|
-
"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
|
|
90
|
-
className,
|
|
91
|
-
)}
|
|
92
|
-
{...props}
|
|
93
|
-
/>
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function DialogTitle({
|
|
98
|
-
className,
|
|
99
|
-
...props
|
|
100
|
-
}: React.ComponentProps<typeof DialogPrimitive.Title>) {
|
|
101
|
-
return (
|
|
102
|
-
<DialogPrimitive.Title
|
|
103
|
-
data-slot="dialog-title"
|
|
104
|
-
className={cn("text-xl leading-none font-semibold", className)}
|
|
105
|
-
{...props}
|
|
106
|
-
/>
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function DialogDescription({
|
|
111
|
-
className,
|
|
112
|
-
...props
|
|
113
|
-
}: React.ComponentProps<typeof DialogPrimitive.Description>) {
|
|
114
|
-
return (
|
|
115
|
-
<DialogPrimitive.Description
|
|
116
|
-
data-slot="dialog-description"
|
|
117
|
-
className={cn("text-muted-foreground text-sm", className)}
|
|
118
|
-
{...props}
|
|
119
|
-
/>
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export {
|
|
124
|
-
Dialog,
|
|
125
|
-
DialogClose,
|
|
126
|
-
DialogContent,
|
|
127
|
-
DialogDescription,
|
|
128
|
-
DialogFooter,
|
|
129
|
-
DialogHeader,
|
|
130
|
-
DialogTitle,
|
|
131
|
-
DialogTrigger,
|
|
132
|
-
};
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
3
|
+
import { X } from "lucide-react";
|
|
4
|
+
|
|
5
|
+
import { cn } from "@/lib/utils";
|
|
6
|
+
|
|
7
|
+
function Dialog(props: React.ComponentProps<typeof DialogPrimitive.Root>) {
|
|
8
|
+
return <DialogPrimitive.Root data-slot="dialog" {...props} />;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function DialogTrigger(
|
|
12
|
+
props: React.ComponentProps<typeof DialogPrimitive.Trigger>,
|
|
13
|
+
) {
|
|
14
|
+
return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function DialogPortal(
|
|
18
|
+
props: React.ComponentProps<typeof DialogPrimitive.Portal>,
|
|
19
|
+
) {
|
|
20
|
+
return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function DialogClose(props: React.ComponentProps<typeof DialogPrimitive.Close>) {
|
|
24
|
+
return <DialogPrimitive.Close data-slot="dialog-close" {...props} />;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function DialogOverlay({
|
|
28
|
+
className,
|
|
29
|
+
...props
|
|
30
|
+
}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {
|
|
31
|
+
return (
|
|
32
|
+
<DialogPrimitive.Overlay
|
|
33
|
+
data-slot="dialog-overlay"
|
|
34
|
+
className={cn(
|
|
35
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out fixed inset-0 z-50 bg-black/30 backdrop-blur-[2px]",
|
|
36
|
+
className,
|
|
37
|
+
)}
|
|
38
|
+
{...props}
|
|
39
|
+
/>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function DialogContent({
|
|
44
|
+
className,
|
|
45
|
+
children,
|
|
46
|
+
showCloseButton = true,
|
|
47
|
+
...props
|
|
48
|
+
}: React.ComponentProps<typeof DialogPrimitive.Content> & {
|
|
49
|
+
showCloseButton?: boolean;
|
|
50
|
+
}) {
|
|
51
|
+
return (
|
|
52
|
+
<DialogPortal>
|
|
53
|
+
<DialogOverlay />
|
|
54
|
+
<DialogPrimitive.Content
|
|
55
|
+
data-slot="dialog-content"
|
|
56
|
+
className={cn(
|
|
57
|
+
"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed top-[50%] left-[50%] z-50 grid w-[min(92vw,560px)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-[28px] border border-white/80 p-6 shadow-[0_36px_120px_-45px_rgba(16,24,40,0.4)] duration-200",
|
|
58
|
+
className,
|
|
59
|
+
)}
|
|
60
|
+
{...props}
|
|
61
|
+
>
|
|
62
|
+
{children}
|
|
63
|
+
{showCloseButton ? (
|
|
64
|
+
<DialogPrimitive.Close className="ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-full p-1 opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:outline-none disabled:pointer-events-none">
|
|
65
|
+
<X className="size-4" />
|
|
66
|
+
<span className="sr-only">Close</span>
|
|
67
|
+
</DialogPrimitive.Close>
|
|
68
|
+
) : null}
|
|
69
|
+
</DialogPrimitive.Content>
|
|
70
|
+
</DialogPortal>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
|
|
75
|
+
return (
|
|
76
|
+
<div
|
|
77
|
+
data-slot="dialog-header"
|
|
78
|
+
className={cn("flex flex-col gap-2 text-left", className)}
|
|
79
|
+
{...props}
|
|
80
|
+
/>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function DialogFooter({ className, ...props }: React.ComponentProps<"div">) {
|
|
85
|
+
return (
|
|
86
|
+
<div
|
|
87
|
+
data-slot="dialog-footer"
|
|
88
|
+
className={cn(
|
|
89
|
+
"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
|
|
90
|
+
className,
|
|
91
|
+
)}
|
|
92
|
+
{...props}
|
|
93
|
+
/>
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function DialogTitle({
|
|
98
|
+
className,
|
|
99
|
+
...props
|
|
100
|
+
}: React.ComponentProps<typeof DialogPrimitive.Title>) {
|
|
101
|
+
return (
|
|
102
|
+
<DialogPrimitive.Title
|
|
103
|
+
data-slot="dialog-title"
|
|
104
|
+
className={cn("text-xl leading-none font-semibold", className)}
|
|
105
|
+
{...props}
|
|
106
|
+
/>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function DialogDescription({
|
|
111
|
+
className,
|
|
112
|
+
...props
|
|
113
|
+
}: React.ComponentProps<typeof DialogPrimitive.Description>) {
|
|
114
|
+
return (
|
|
115
|
+
<DialogPrimitive.Description
|
|
116
|
+
data-slot="dialog-description"
|
|
117
|
+
className={cn("text-muted-foreground text-sm", className)}
|
|
118
|
+
{...props}
|
|
119
|
+
/>
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export {
|
|
124
|
+
Dialog,
|
|
125
|
+
DialogClose,
|
|
126
|
+
DialogContent,
|
|
127
|
+
DialogDescription,
|
|
128
|
+
DialogFooter,
|
|
129
|
+
DialogHeader,
|
|
130
|
+
DialogTitle,
|
|
131
|
+
DialogTrigger,
|
|
132
|
+
};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
|
|
3
|
-
import { cn } from "@/lib/utils";
|
|
4
|
-
|
|
5
|
-
function Field({ className, ...props }: React.ComponentProps<"div">) {
|
|
6
|
-
return <div className={cn("grid gap-2", className)} {...props} />;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
function FieldLabel({ className, ...props }: React.ComponentProps<"label">) {
|
|
10
|
-
return <label className={cn("text-sm font-medium text-stone-700", className)} {...props} />;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export { Field, FieldLabel };
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
import { cn } from "@/lib/utils";
|
|
4
|
+
|
|
5
|
+
function Field({ className, ...props }: React.ComponentProps<"div">) {
|
|
6
|
+
return <div className={cn("grid gap-2", className)} {...props} />;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function FieldLabel({ className, ...props }: React.ComponentProps<"label">) {
|
|
10
|
+
return <label className={cn("text-sm font-medium text-stone-700", className)} {...props} />;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { Field, FieldLabel };
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
|
|
3
|
-
import { cn } from "@/lib/utils";
|
|
4
|
-
|
|
5
|
-
function Input({ className, type, ...props }: React.ComponentProps<"input">) {
|
|
6
|
-
return (
|
|
7
|
-
<input
|
|
8
|
-
type={type}
|
|
9
|
-
data-slot="input"
|
|
10
|
-
className={cn(
|
|
11
|
-
"border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex h-11 w-full min-w-0 rounded-2xl border bg-white/90 px-4 py-2 text-sm shadow-sm transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 focus-visible:border-stone-300 focus-visible:ring-[3px] focus-visible:ring-stone-200/80",
|
|
12
|
-
className,
|
|
13
|
-
)}
|
|
14
|
-
{...props}
|
|
15
|
-
/>
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export { Input };
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
import { cn } from "@/lib/utils";
|
|
4
|
+
|
|
5
|
+
function Input({ className, type, ...props }: React.ComponentProps<"input">) {
|
|
6
|
+
return (
|
|
7
|
+
<input
|
|
8
|
+
type={type}
|
|
9
|
+
data-slot="input"
|
|
10
|
+
className={cn(
|
|
11
|
+
"border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex h-11 w-full min-w-0 rounded-2xl border bg-white/90 px-4 py-2 text-sm shadow-sm transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 focus-visible:border-stone-300 focus-visible:ring-[3px] focus-visible:ring-stone-200/80",
|
|
12
|
+
className,
|
|
13
|
+
)}
|
|
14
|
+
{...props}
|
|
15
|
+
/>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { Input };
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
|
-
import * as React from "react"
|
|
4
|
-
import { Label as LabelPrimitive } from "radix-ui"
|
|
5
|
-
|
|
6
|
-
import { cn } from "@/lib/utils"
|
|
7
|
-
|
|
8
|
-
function Label({
|
|
9
|
-
className,
|
|
10
|
-
...props
|
|
11
|
-
}: React.ComponentProps<typeof LabelPrimitive.Root>) {
|
|
12
|
-
return (
|
|
13
|
-
<LabelPrimitive.Root
|
|
14
|
-
data-slot="label"
|
|
15
|
-
className={cn(
|
|
16
|
-
"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
|
|
17
|
-
className
|
|
18
|
-
)}
|
|
19
|
-
{...props}
|
|
20
|
-
/>
|
|
21
|
-
)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export { Label }
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { Label as LabelPrimitive } from "radix-ui"
|
|
5
|
+
|
|
6
|
+
import { cn } from "@/lib/utils"
|
|
7
|
+
|
|
8
|
+
function Label({
|
|
9
|
+
className,
|
|
10
|
+
...props
|
|
11
|
+
}: React.ComponentProps<typeof LabelPrimitive.Root>) {
|
|
12
|
+
return (
|
|
13
|
+
<LabelPrimitive.Root
|
|
14
|
+
data-slot="label"
|
|
15
|
+
className={cn(
|
|
16
|
+
"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
|
|
17
|
+
className
|
|
18
|
+
)}
|
|
19
|
+
{...props}
|
|
20
|
+
/>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { Label }
|
|
@@ -1,149 +1,149 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
|
-
import { useCallback, useEffect, useRef } from "react"
|
|
4
|
-
|
|
5
|
-
import { cn } from "@/lib/utils"
|
|
6
|
-
|
|
7
|
-
const morphTime = 1.5
|
|
8
|
-
const cooldownTime = 0.5
|
|
9
|
-
|
|
10
|
-
const useMorphingText = (texts: string[]) => {
|
|
11
|
-
const textIndexRef = useRef(0)
|
|
12
|
-
const morphRef = useRef(0)
|
|
13
|
-
const cooldownRef = useRef(0)
|
|
14
|
-
const timeRef = useRef(new Date())
|
|
15
|
-
|
|
16
|
-
const text1Ref = useRef<HTMLSpanElement>(null)
|
|
17
|
-
const text2Ref = useRef<HTMLSpanElement>(null)
|
|
18
|
-
|
|
19
|
-
const setStyles = useCallback(
|
|
20
|
-
(fraction: number) => {
|
|
21
|
-
const [current1, current2] = [text1Ref.current, text2Ref.current]
|
|
22
|
-
if (!current1 || !current2) return
|
|
23
|
-
|
|
24
|
-
current2.style.filter = `blur(${Math.min(8 / fraction - 8, 100)}px)`
|
|
25
|
-
current2.style.opacity = `${Math.pow(fraction, 0.4) * 100}%`
|
|
26
|
-
|
|
27
|
-
const invertedFraction = 1 - fraction
|
|
28
|
-
current1.style.filter = `blur(${Math.min(
|
|
29
|
-
8 / invertedFraction - 8,
|
|
30
|
-
100
|
|
31
|
-
)}px)`
|
|
32
|
-
current1.style.opacity = `${Math.pow(invertedFraction, 0.4) * 100}%`
|
|
33
|
-
|
|
34
|
-
current1.textContent = texts[textIndexRef.current % texts.length]
|
|
35
|
-
current2.textContent = texts[(textIndexRef.current + 1) % texts.length]
|
|
36
|
-
},
|
|
37
|
-
[texts]
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
const doMorph = useCallback(() => {
|
|
41
|
-
morphRef.current -= cooldownRef.current
|
|
42
|
-
cooldownRef.current = 0
|
|
43
|
-
|
|
44
|
-
let fraction = morphRef.current / morphTime
|
|
45
|
-
|
|
46
|
-
if (fraction > 1) {
|
|
47
|
-
cooldownRef.current = cooldownTime
|
|
48
|
-
fraction = 1
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
setStyles(fraction)
|
|
52
|
-
|
|
53
|
-
if (fraction === 1) {
|
|
54
|
-
textIndexRef.current++
|
|
55
|
-
}
|
|
56
|
-
}, [setStyles])
|
|
57
|
-
|
|
58
|
-
const doCooldown = useCallback(() => {
|
|
59
|
-
morphRef.current = 0
|
|
60
|
-
const [current1, current2] = [text1Ref.current, text2Ref.current]
|
|
61
|
-
if (current1 && current2) {
|
|
62
|
-
current2.style.filter = "none"
|
|
63
|
-
current2.style.opacity = "100%"
|
|
64
|
-
current1.style.filter = "none"
|
|
65
|
-
current1.style.opacity = "0%"
|
|
66
|
-
}
|
|
67
|
-
}, [])
|
|
68
|
-
|
|
69
|
-
useEffect(() => {
|
|
70
|
-
let animationFrameId: number
|
|
71
|
-
|
|
72
|
-
const animate = () => {
|
|
73
|
-
animationFrameId = requestAnimationFrame(animate)
|
|
74
|
-
|
|
75
|
-
const newTime = new Date()
|
|
76
|
-
const dt = (newTime.getTime() - timeRef.current.getTime()) / 1000
|
|
77
|
-
timeRef.current = newTime
|
|
78
|
-
|
|
79
|
-
cooldownRef.current -= dt
|
|
80
|
-
|
|
81
|
-
if (cooldownRef.current <= 0) doMorph()
|
|
82
|
-
else doCooldown()
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
animate()
|
|
86
|
-
return () => {
|
|
87
|
-
cancelAnimationFrame(animationFrameId)
|
|
88
|
-
}
|
|
89
|
-
}, [doMorph, doCooldown])
|
|
90
|
-
|
|
91
|
-
return { text1Ref, text2Ref }
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
interface MorphingTextProps {
|
|
95
|
-
className?: string
|
|
96
|
-
texts: string[]
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const Texts: React.FC<Pick<MorphingTextProps, "texts">> = ({ texts }) => {
|
|
100
|
-
const { text1Ref, text2Ref } = useMorphingText(texts)
|
|
101
|
-
return (
|
|
102
|
-
<>
|
|
103
|
-
<span
|
|
104
|
-
className="absolute inset-x-0 top-0 m-auto inline-block w-full"
|
|
105
|
-
ref={text1Ref}
|
|
106
|
-
/>
|
|
107
|
-
<span
|
|
108
|
-
className="absolute inset-x-0 top-0 m-auto inline-block w-full"
|
|
109
|
-
ref={text2Ref}
|
|
110
|
-
/>
|
|
111
|
-
</>
|
|
112
|
-
)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const SvgFilters: React.FC = () => (
|
|
116
|
-
<svg
|
|
117
|
-
id="filters"
|
|
118
|
-
className="fixed h-0 w-0"
|
|
119
|
-
preserveAspectRatio="xMidYMid slice"
|
|
120
|
-
>
|
|
121
|
-
<defs>
|
|
122
|
-
<filter id="threshold">
|
|
123
|
-
<feColorMatrix
|
|
124
|
-
in="SourceGraphic"
|
|
125
|
-
type="matrix"
|
|
126
|
-
values="1 0 0 0 0
|
|
127
|
-
0 1 0 0 0
|
|
128
|
-
0 0 1 0 0
|
|
129
|
-
0 0 0 255 -140"
|
|
130
|
-
/>
|
|
131
|
-
</filter>
|
|
132
|
-
</defs>
|
|
133
|
-
</svg>
|
|
134
|
-
)
|
|
135
|
-
|
|
136
|
-
export const MorphingText: React.FC<MorphingTextProps> = ({
|
|
137
|
-
texts,
|
|
138
|
-
className,
|
|
139
|
-
}) => (
|
|
140
|
-
<div
|
|
141
|
-
className={cn(
|
|
142
|
-
"relative mx-auto h-16 w-full max-w-3xl text-center font-sans text-[40pt] leading-none font-bold filter-[url(#threshold)_blur(0.6px)] md:h-24 lg:text-[6rem]",
|
|
143
|
-
className
|
|
144
|
-
)}
|
|
145
|
-
>
|
|
146
|
-
<Texts texts={texts} />
|
|
147
|
-
<SvgFilters />
|
|
148
|
-
</div>
|
|
149
|
-
)
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { useCallback, useEffect, useRef } from "react"
|
|
4
|
+
|
|
5
|
+
import { cn } from "@/lib/utils"
|
|
6
|
+
|
|
7
|
+
const morphTime = 1.5
|
|
8
|
+
const cooldownTime = 0.5
|
|
9
|
+
|
|
10
|
+
const useMorphingText = (texts: string[]) => {
|
|
11
|
+
const textIndexRef = useRef(0)
|
|
12
|
+
const morphRef = useRef(0)
|
|
13
|
+
const cooldownRef = useRef(0)
|
|
14
|
+
const timeRef = useRef(new Date())
|
|
15
|
+
|
|
16
|
+
const text1Ref = useRef<HTMLSpanElement>(null)
|
|
17
|
+
const text2Ref = useRef<HTMLSpanElement>(null)
|
|
18
|
+
|
|
19
|
+
const setStyles = useCallback(
|
|
20
|
+
(fraction: number) => {
|
|
21
|
+
const [current1, current2] = [text1Ref.current, text2Ref.current]
|
|
22
|
+
if (!current1 || !current2) return
|
|
23
|
+
|
|
24
|
+
current2.style.filter = `blur(${Math.min(8 / fraction - 8, 100)}px)`
|
|
25
|
+
current2.style.opacity = `${Math.pow(fraction, 0.4) * 100}%`
|
|
26
|
+
|
|
27
|
+
const invertedFraction = 1 - fraction
|
|
28
|
+
current1.style.filter = `blur(${Math.min(
|
|
29
|
+
8 / invertedFraction - 8,
|
|
30
|
+
100
|
|
31
|
+
)}px)`
|
|
32
|
+
current1.style.opacity = `${Math.pow(invertedFraction, 0.4) * 100}%`
|
|
33
|
+
|
|
34
|
+
current1.textContent = texts[textIndexRef.current % texts.length]
|
|
35
|
+
current2.textContent = texts[(textIndexRef.current + 1) % texts.length]
|
|
36
|
+
},
|
|
37
|
+
[texts]
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
const doMorph = useCallback(() => {
|
|
41
|
+
morphRef.current -= cooldownRef.current
|
|
42
|
+
cooldownRef.current = 0
|
|
43
|
+
|
|
44
|
+
let fraction = morphRef.current / morphTime
|
|
45
|
+
|
|
46
|
+
if (fraction > 1) {
|
|
47
|
+
cooldownRef.current = cooldownTime
|
|
48
|
+
fraction = 1
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
setStyles(fraction)
|
|
52
|
+
|
|
53
|
+
if (fraction === 1) {
|
|
54
|
+
textIndexRef.current++
|
|
55
|
+
}
|
|
56
|
+
}, [setStyles])
|
|
57
|
+
|
|
58
|
+
const doCooldown = useCallback(() => {
|
|
59
|
+
morphRef.current = 0
|
|
60
|
+
const [current1, current2] = [text1Ref.current, text2Ref.current]
|
|
61
|
+
if (current1 && current2) {
|
|
62
|
+
current2.style.filter = "none"
|
|
63
|
+
current2.style.opacity = "100%"
|
|
64
|
+
current1.style.filter = "none"
|
|
65
|
+
current1.style.opacity = "0%"
|
|
66
|
+
}
|
|
67
|
+
}, [])
|
|
68
|
+
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
let animationFrameId: number
|
|
71
|
+
|
|
72
|
+
const animate = () => {
|
|
73
|
+
animationFrameId = requestAnimationFrame(animate)
|
|
74
|
+
|
|
75
|
+
const newTime = new Date()
|
|
76
|
+
const dt = (newTime.getTime() - timeRef.current.getTime()) / 1000
|
|
77
|
+
timeRef.current = newTime
|
|
78
|
+
|
|
79
|
+
cooldownRef.current -= dt
|
|
80
|
+
|
|
81
|
+
if (cooldownRef.current <= 0) doMorph()
|
|
82
|
+
else doCooldown()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
animate()
|
|
86
|
+
return () => {
|
|
87
|
+
cancelAnimationFrame(animationFrameId)
|
|
88
|
+
}
|
|
89
|
+
}, [doMorph, doCooldown])
|
|
90
|
+
|
|
91
|
+
return { text1Ref, text2Ref }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
interface MorphingTextProps {
|
|
95
|
+
className?: string
|
|
96
|
+
texts: string[]
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const Texts: React.FC<Pick<MorphingTextProps, "texts">> = ({ texts }) => {
|
|
100
|
+
const { text1Ref, text2Ref } = useMorphingText(texts)
|
|
101
|
+
return (
|
|
102
|
+
<>
|
|
103
|
+
<span
|
|
104
|
+
className="absolute inset-x-0 top-0 m-auto inline-block w-full"
|
|
105
|
+
ref={text1Ref}
|
|
106
|
+
/>
|
|
107
|
+
<span
|
|
108
|
+
className="absolute inset-x-0 top-0 m-auto inline-block w-full"
|
|
109
|
+
ref={text2Ref}
|
|
110
|
+
/>
|
|
111
|
+
</>
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const SvgFilters: React.FC = () => (
|
|
116
|
+
<svg
|
|
117
|
+
id="filters"
|
|
118
|
+
className="fixed h-0 w-0"
|
|
119
|
+
preserveAspectRatio="xMidYMid slice"
|
|
120
|
+
>
|
|
121
|
+
<defs>
|
|
122
|
+
<filter id="threshold">
|
|
123
|
+
<feColorMatrix
|
|
124
|
+
in="SourceGraphic"
|
|
125
|
+
type="matrix"
|
|
126
|
+
values="1 0 0 0 0
|
|
127
|
+
0 1 0 0 0
|
|
128
|
+
0 0 1 0 0
|
|
129
|
+
0 0 0 255 -140"
|
|
130
|
+
/>
|
|
131
|
+
</filter>
|
|
132
|
+
</defs>
|
|
133
|
+
</svg>
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
export const MorphingText: React.FC<MorphingTextProps> = ({
|
|
137
|
+
texts,
|
|
138
|
+
className,
|
|
139
|
+
}) => (
|
|
140
|
+
<div
|
|
141
|
+
className={cn(
|
|
142
|
+
"relative mx-auto h-16 w-full max-w-3xl text-center font-sans text-[40pt] leading-none font-bold filter-[url(#threshold)_blur(0.6px)] md:h-24 lg:text-[6rem]",
|
|
143
|
+
className
|
|
144
|
+
)}
|
|
145
|
+
>
|
|
146
|
+
<Texts texts={texts} />
|
|
147
|
+
<SvgFilters />
|
|
148
|
+
</div>
|
|
149
|
+
)
|