sonance-brand-mcp 1.3.110 → 1.3.112
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/dist/assets/api/sonance-ai-edit/route.ts +30 -7
- package/dist/assets/api/sonance-save-image/route.ts +625 -0
- package/dist/assets/api/sonance-vision-apply/image-styling-detection.ts +1360 -0
- package/dist/assets/api/sonance-vision-apply/route.ts +1020 -64
- package/dist/assets/api/sonance-vision-apply/styling-detection.ts +730 -0
- package/dist/assets/api/sonance-vision-apply/theme-discovery.ts +1 -1
- package/dist/assets/api/sonance-vision-edit/route.ts +33 -8
- package/dist/assets/brand-system.ts +13 -12
- package/dist/assets/components/accordion.tsx +15 -7
- package/dist/assets/components/alert-dialog.tsx +35 -10
- package/dist/assets/components/alert.tsx +11 -10
- package/dist/assets/components/avatar.tsx +4 -4
- package/dist/assets/components/badge.tsx +16 -12
- package/dist/assets/components/button.stories.tsx +3 -3
- package/dist/assets/components/button.tsx +50 -31
- package/dist/assets/components/calendar.tsx +12 -8
- package/dist/assets/components/card.tsx +35 -29
- package/dist/assets/components/checkbox.tsx +9 -8
- package/dist/assets/components/code.tsx +19 -11
- package/dist/assets/components/command.tsx +32 -13
- package/dist/assets/components/context-menu.tsx +37 -16
- package/dist/assets/components/dialog.tsx +8 -5
- package/dist/assets/components/divider.tsx +15 -5
- package/dist/assets/components/drawer.tsx +4 -3
- package/dist/assets/components/dropdown-menu.tsx +15 -13
- package/dist/assets/components/hover-card.tsx +4 -1
- package/dist/assets/components/image.tsx +1 -1
- package/dist/assets/components/input.tsx +29 -14
- package/dist/assets/components/kbd.stories.tsx +3 -3
- package/dist/assets/components/kbd.tsx +29 -13
- package/dist/assets/components/listbox.tsx +8 -8
- package/dist/assets/components/menubar.tsx +50 -23
- package/dist/assets/components/navbar.stories.tsx +140 -13
- package/dist/assets/components/navbar.tsx +22 -5
- package/dist/assets/components/navigation-menu.tsx +28 -6
- package/dist/assets/components/pagination.tsx +10 -10
- package/dist/assets/components/popover.tsx +10 -8
- package/dist/assets/components/progress.tsx +6 -4
- package/dist/assets/components/radio-group.tsx +5 -5
- package/dist/assets/components/select.tsx +49 -29
- package/dist/assets/components/separator.tsx +3 -3
- package/dist/assets/components/sheet.tsx +4 -4
- package/dist/assets/components/sidebar.tsx +10 -10
- package/dist/assets/components/skeleton.tsx +13 -5
- package/dist/assets/components/slider.tsx +12 -10
- package/dist/assets/components/switch.tsx +4 -4
- package/dist/assets/components/table.tsx +5 -5
- package/dist/assets/components/tabs.tsx +8 -8
- package/dist/assets/components/textarea.tsx +11 -9
- package/dist/assets/components/toast.tsx +7 -7
- package/dist/assets/components/toggle.tsx +27 -7
- package/dist/assets/components/tooltip.tsx +10 -8
- package/dist/assets/components/user.tsx +8 -6
- package/dist/assets/dev-tools/SonanceDevTools.tsx +851 -708
- package/dist/assets/dev-tools/components/ApplyFirstPreview.tsx +10 -10
- package/dist/assets/dev-tools/components/ChatHistory.tsx +145 -0
- package/dist/assets/dev-tools/components/ChatInterface.tsx +444 -295
- package/dist/assets/dev-tools/components/ChatTabBar.tsx +82 -0
- package/dist/assets/dev-tools/components/DiffPreview.tsx +1 -1
- package/dist/assets/dev-tools/components/InlineDiffPreview.tsx +528 -0
- package/dist/assets/dev-tools/components/InspectorOverlay.tsx +21 -18
- package/dist/assets/dev-tools/components/PropertiesPanel.tsx +1345 -0
- package/dist/assets/dev-tools/components/ScreenshotAnnotator.tsx +1 -1
- package/dist/assets/dev-tools/components/SectionHighlight.tsx +1 -1
- package/dist/assets/dev-tools/components/VisionDiffPreview.tsx +7 -7
- package/dist/assets/dev-tools/components/VisionModeBorder.tsx +12 -63
- package/dist/assets/dev-tools/constants.ts +38 -6
- package/dist/assets/dev-tools/hooks/index.ts +69 -0
- package/dist/assets/dev-tools/hooks/useComponentDetection.ts +132 -0
- package/dist/assets/dev-tools/hooks/useComputedStyles.ts +471 -0
- package/dist/assets/dev-tools/hooks/useContentHash.ts +212 -0
- package/dist/assets/dev-tools/hooks/useElementScanner.ts +398 -0
- package/dist/assets/dev-tools/hooks/useImageDetection.ts +162 -0
- package/dist/assets/dev-tools/hooks/useTextDetection.ts +217 -0
- package/dist/assets/dev-tools/index.ts +3 -0
- package/dist/assets/dev-tools/panels/AnalysisPanel.tsx +32 -32
- package/dist/assets/dev-tools/panels/ComponentsPanel.tsx +384 -131
- package/dist/assets/dev-tools/panels/TextPanel.tsx +10 -10
- package/dist/assets/dev-tools/types.ts +93 -2
- package/dist/assets/globals.css +225 -9
- package/dist/assets/styles/brand-overrides.css +3 -2
- package/dist/assets/utils.ts +2 -1
- package/dist/index.js +22 -3
- package/package.json +2 -1
|
@@ -1,22 +1,31 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
import { cva, type VariantProps } from "class-variance-authority";
|
|
2
4
|
import { cn } from "@/lib/utils";
|
|
3
|
-
import { forwardRef } from "react";
|
|
5
|
+
import { forwardRef, createContext, useContext } from "react";
|
|
4
6
|
|
|
5
7
|
export type CardState = "default" | "hover" | "focus";
|
|
6
8
|
|
|
7
9
|
const cardVariants = cva(
|
|
8
|
-
"
|
|
10
|
+
"transition-all duration-200 backdrop-blur-lg",
|
|
9
11
|
{
|
|
10
12
|
variants: {
|
|
11
13
|
variant: {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
// Glass morphism - default style
|
|
15
|
+
default:
|
|
16
|
+
"bg-white/70 dark:bg-white/[0.03] border border-black/8 dark:border-white/8 shadow-[0_4px_16px_rgba(0,0,0,0.08)] dark:shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:bg-white/80 dark:hover:bg-white/[0.05] hover:border-black/10 dark:hover:border-white/10 hover:shadow-[0_0_20px_var(--glow-primary-subtle)]",
|
|
17
|
+
elevated:
|
|
18
|
+
"bg-white/80 dark:bg-white/[0.05] border border-black/10 dark:border-white/10 shadow-lg hover:shadow-xl hover:shadow-[0_0_30px_var(--glow-primary)] dark:hover:shadow-[0_0_30px_var(--glow-primary)]",
|
|
19
|
+
subtle:
|
|
20
|
+
"bg-white/50 dark:bg-white/[0.02] border border-black/5 dark:border-white/5 hover:bg-white/60 dark:hover:bg-white/[0.04] hover:border-black/8 dark:hover:border-white/8",
|
|
21
|
+
// Non-glass solid variant for fallback
|
|
22
|
+
solid:
|
|
23
|
+
"bg-card border-card-border hover:border-border-hover hover:bg-card-hover backdrop-blur-none",
|
|
15
24
|
},
|
|
16
25
|
size: {
|
|
17
|
-
compact: "rounded-
|
|
18
|
-
default: "rounded-
|
|
19
|
-
spacious: "rounded-
|
|
26
|
+
compact: "rounded-xl",
|
|
27
|
+
default: "rounded-2xl",
|
|
28
|
+
spacious: "rounded-3xl",
|
|
20
29
|
},
|
|
21
30
|
},
|
|
22
31
|
defaultVariants: {
|
|
@@ -42,32 +51,29 @@ interface CardProps extends React.HTMLAttributes<HTMLDivElement>,
|
|
|
42
51
|
const getStateStyles = (variant: string | null | undefined, state?: CardState) => {
|
|
43
52
|
if (!state || state === "default") return "";
|
|
44
53
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
hover: "shadow-
|
|
48
|
-
focus: "ring-2 ring-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
hover: "bg-
|
|
56
|
-
focus: "ring-2 ring-
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
hover: "border-border-hover bg-card-hover",
|
|
63
|
-
focus: "ring-2 ring-primary/20 ring-offset-2 ring-offset-background",
|
|
54
|
+
const stateMap: Record<string, Record<string, string>> = {
|
|
55
|
+
default: {
|
|
56
|
+
hover: "bg-white/80 dark:bg-white/[0.05] border-black/10 dark:border-white/10 shadow-[0_0_20px_var(--glow-primary-subtle)]",
|
|
57
|
+
focus: "ring-2 ring-[color:var(--sonance-blue)]/30 ring-offset-2 ring-offset-background",
|
|
58
|
+
},
|
|
59
|
+
elevated: {
|
|
60
|
+
hover: "shadow-xl shadow-[0_0_30px_var(--glow-primary)]",
|
|
61
|
+
focus: "ring-2 ring-[color:var(--sonance-blue)]/30 ring-offset-2 ring-offset-background",
|
|
62
|
+
},
|
|
63
|
+
subtle: {
|
|
64
|
+
hover: "bg-white/60 dark:bg-white/[0.04] border-black/8 dark:border-white/8",
|
|
65
|
+
focus: "ring-2 ring-[color:var(--sonance-blue)]/30 ring-offset-2 ring-offset-background",
|
|
66
|
+
},
|
|
67
|
+
solid: {
|
|
68
|
+
hover: "border-border-hover bg-card-hover",
|
|
69
|
+
focus: "ring-2 ring-[color:var(--sonance-blue)]/30 ring-offset-2 ring-offset-background",
|
|
70
|
+
},
|
|
64
71
|
};
|
|
65
72
|
|
|
66
|
-
return stateMap[state] || "";
|
|
73
|
+
return stateMap[variant || "default"]?.[state] || "";
|
|
67
74
|
};
|
|
68
75
|
|
|
69
76
|
// Create a context for passing size to children
|
|
70
|
-
import { createContext, useContext } from "react";
|
|
71
77
|
const CardSizeContext = createContext<"compact" | "default" | "spacious">("default");
|
|
72
78
|
|
|
73
79
|
export const Card = forwardRef<HTMLDivElement, CardProps>(
|
|
@@ -8,14 +8,14 @@ import { cn } from "@/lib/utils";
|
|
|
8
8
|
export type CheckboxState = "default" | "hover" | "focus" | "checked" | "disabled";
|
|
9
9
|
|
|
10
10
|
const checkboxVariants = cva(
|
|
11
|
-
"peer shrink-0 appearance-none border
|
|
11
|
+
"peer shrink-0 appearance-none border transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-[color:var(--sonance-blue)]/30 focus:ring-offset-2 focus:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 backdrop-blur-sm bg-white/60 dark:bg-white/5 border-black/8 dark:border-white/8 hover:border-black/15 dark:hover:border-white/15 checked:border-[color:var(--sonance-blue)] checked:bg-[color:var(--sonance-blue)]",
|
|
12
12
|
{
|
|
13
13
|
variants: {
|
|
14
14
|
size: {
|
|
15
|
-
xs: "h-3.5 w-3.5 rounded",
|
|
16
|
-
sm: "h-4 w-4 rounded-
|
|
17
|
-
md: "h-5 w-5 rounded-
|
|
18
|
-
lg: "h-6 w-6 rounded-
|
|
15
|
+
xs: "h-3.5 w-3.5 rounded-md",
|
|
16
|
+
sm: "h-4 w-4 rounded-lg",
|
|
17
|
+
md: "h-5 w-5 rounded-lg",
|
|
18
|
+
lg: "h-6 w-6 rounded-xl",
|
|
19
19
|
},
|
|
20
20
|
},
|
|
21
21
|
defaultVariants: {
|
|
@@ -46,9 +46,9 @@ const getStateStyles = (state?: CheckboxState) => {
|
|
|
46
46
|
if (!state || state === "default") return "";
|
|
47
47
|
|
|
48
48
|
const stateMap: Record<string, string> = {
|
|
49
|
-
hover: "border-border-
|
|
50
|
-
focus: "ring-2 ring-
|
|
51
|
-
checked: "border-
|
|
49
|
+
hover: "border-black/15 dark:border-white/15",
|
|
50
|
+
focus: "ring-2 ring-[color:var(--sonance-blue)]/30 ring-offset-2 ring-offset-background",
|
|
51
|
+
checked: "border-[color:var(--sonance-blue)] bg-[color:var(--sonance-blue)]",
|
|
52
52
|
disabled: "opacity-50 cursor-not-allowed",
|
|
53
53
|
};
|
|
54
54
|
|
|
@@ -105,6 +105,7 @@ export const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(
|
|
|
105
105
|
<div className="flex flex-col gap-0.5">
|
|
106
106
|
{label && (
|
|
107
107
|
<span
|
|
108
|
+
id="checkbox-span-label"
|
|
108
109
|
className="text-sm font-medium text-foreground select-none"
|
|
109
110
|
>
|
|
110
111
|
{label}
|
|
@@ -12,12 +12,19 @@ interface CodeProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
12
12
|
export const Code = forwardRef<HTMLElement, CodeProps>(
|
|
13
13
|
({ className, variant = "default", ...props }, ref) => {
|
|
14
14
|
const variantClasses = {
|
|
15
|
-
default: "bg-
|
|
16
|
-
primary: "bg-
|
|
15
|
+
default: "bg-white/60 dark:bg-white/[0.03] text-foreground border border-black/8 dark:border-white/8",
|
|
16
|
+
primary: "bg-[color:var(--sonance-blue)]/10 text-[color:var(--sonance-blue)] border border-[color:var(--sonance-blue)]/20",
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
return (
|
|
20
|
-
<code
|
|
20
|
+
<code
|
|
21
|
+
ref={ref}
|
|
22
|
+
data-sonance-name="code"
|
|
23
|
+
className={cn(
|
|
24
|
+
"inline-flex items-center px-1.5 py-0.5 rounded-lg font-mono text-sm backdrop-blur-sm",
|
|
25
|
+
variantClasses[variant],
|
|
26
|
+
className
|
|
27
|
+
)}
|
|
21
28
|
{...props}
|
|
22
29
|
/>
|
|
23
30
|
);
|
|
@@ -57,7 +64,7 @@ export function CodeBlock({
|
|
|
57
64
|
return (
|
|
58
65
|
<div data-sonance-name="code" className={cn("relative group w-full max-w-full overflow-hidden", className)}>
|
|
59
66
|
{filename && (
|
|
60
|
-
<div className="flex items-center justify-between px-3 sm:px-4 py-2 border-b border-border bg-
|
|
67
|
+
<div className="flex items-center justify-between px-3 sm:px-4 py-2 border-b border-black/8 dark:border-white/8 bg-white/50 dark:bg-white/[0.02]">
|
|
61
68
|
<span id="code-block-span-filename" className="text-xs font-medium text-foreground-muted truncate">{filename}</span>
|
|
62
69
|
{language && (
|
|
63
70
|
<span id="code-block-span-language" className="text-xs uppercase tracking-wider text-foreground-subtle flex-shrink-0 ml-2">
|
|
@@ -69,9 +76,10 @@ export function CodeBlock({
|
|
|
69
76
|
<div className="relative">
|
|
70
77
|
<pre
|
|
71
78
|
className={cn(
|
|
72
|
-
"overflow-x-auto bg-
|
|
79
|
+
"overflow-x-auto bg-white/60 dark:bg-white/[0.02] backdrop-blur-sm p-3 sm:p-4 w-full max-w-full rounded-xl",
|
|
73
80
|
"font-mono text-xs sm:text-sm text-foreground-secondary",
|
|
74
|
-
|
|
81
|
+
"border border-black/8 dark:border-white/8",
|
|
82
|
+
filename && "rounded-t-none border-t-0"
|
|
75
83
|
)}
|
|
76
84
|
>
|
|
77
85
|
<code className="block">
|
|
@@ -99,10 +107,10 @@ export function CodeBlock({
|
|
|
99
107
|
onClick={copyToClipboard}
|
|
100
108
|
className={cn(
|
|
101
109
|
"absolute right-1.5 sm:right-2 top-1.5 sm:top-2 p-1.5 sm:p-2",
|
|
102
|
-
"bg-
|
|
103
|
-
"text-foreground-muted hover:text-foreground",
|
|
104
|
-
"opacity-0 group-hover:opacity-100 transition-
|
|
105
|
-
"focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-
|
|
110
|
+
"bg-white/70 dark:bg-white/10 border border-black/8 dark:border-white/8 rounded-lg backdrop-blur-sm",
|
|
111
|
+
"text-foreground-muted hover:text-foreground hover:bg-white/80 dark:hover:bg-white/15",
|
|
112
|
+
"opacity-0 group-hover:opacity-100 transition-all",
|
|
113
|
+
"focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-[color:var(--sonance-blue)]/30"
|
|
106
114
|
)}
|
|
107
115
|
aria-label={copied ? "Copied!" : "Copy code"}
|
|
108
116
|
>
|
|
@@ -143,7 +151,7 @@ export function Snippet({
|
|
|
143
151
|
<div
|
|
144
152
|
className={cn(
|
|
145
153
|
"inline-flex items-center gap-1.5 sm:gap-2 px-2 sm:px-3 py-1.5 sm:py-2",
|
|
146
|
-
"bg-
|
|
154
|
+
"bg-white/60 dark:bg-white/[0.03] border border-black/8 dark:border-white/8 rounded-xl backdrop-blur-sm",
|
|
147
155
|
"font-mono text-xs sm:text-sm",
|
|
148
156
|
"max-w-full overflow-hidden",
|
|
149
157
|
className
|
|
@@ -16,10 +16,15 @@ const Command = React.forwardRef<
|
|
|
16
16
|
>(({ className, ...props }, ref) => (
|
|
17
17
|
<CommandPrimitive
|
|
18
18
|
ref={ref}
|
|
19
|
+
data-sonance-name="command"
|
|
19
20
|
className={cn(
|
|
20
|
-
"flex h-full w-full flex-col overflow-hidden rounded-
|
|
21
|
+
"flex h-full w-full flex-col overflow-hidden rounded-2xl",
|
|
22
|
+
"bg-white/90 dark:bg-black/80 backdrop-blur-xl",
|
|
23
|
+
"border border-black/10 dark:border-white/10",
|
|
24
|
+
"shadow-[0_8px_32px_rgba(0,0,0,0.12)] dark:shadow-[0_8px_32px_rgba(0,0,0,0.4)]",
|
|
25
|
+
"text-foreground",
|
|
21
26
|
className
|
|
22
|
-
)}
|
|
27
|
+
)}
|
|
23
28
|
{...props}
|
|
24
29
|
/>
|
|
25
30
|
));
|
|
@@ -38,7 +43,7 @@ const CommandDialog = ({ children, open, onOpenChange }: CommandDialogProps) =>
|
|
|
38
43
|
|
|
39
44
|
return (
|
|
40
45
|
<Dialog data-sonance-name="command" open={open ?? false} onClose={handleClose}>
|
|
41
|
-
<DialogContent className="overflow-hidden p-0
|
|
46
|
+
<DialogContent className="overflow-hidden p-0" showClose={false}>
|
|
42
47
|
<DialogTitle className="sr-only">Command Menu</DialogTitle>
|
|
43
48
|
<Command className="[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-foreground-muted [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5">
|
|
44
49
|
{children}
|
|
@@ -52,12 +57,17 @@ const CommandInput = React.forwardRef<
|
|
|
52
57
|
React.ElementRef<typeof CommandPrimitive.Input>,
|
|
53
58
|
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>
|
|
54
59
|
>(({ className, ...props }, ref) => (
|
|
55
|
-
<div
|
|
56
|
-
|
|
60
|
+
<div
|
|
61
|
+
className="flex items-center border-b border-black/8 dark:border-white/8 px-3 bg-white/50 dark:bg-white/[0.02]"
|
|
62
|
+
cmdk-input-wrapper=""
|
|
63
|
+
>
|
|
64
|
+
<Search className="mr-2 h-4 w-4 shrink-0 text-foreground-muted" />
|
|
57
65
|
<CommandPrimitive.Input
|
|
58
66
|
ref={ref}
|
|
59
67
|
className={cn(
|
|
60
|
-
"flex h-11 w-full
|
|
68
|
+
"flex h-11 w-full bg-transparent py-3 text-sm outline-none",
|
|
69
|
+
"placeholder:text-foreground-muted",
|
|
70
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
61
71
|
className
|
|
62
72
|
)}
|
|
63
73
|
{...props}
|
|
@@ -100,7 +110,11 @@ const CommandGroup = React.forwardRef<
|
|
|
100
110
|
<CommandPrimitive.Group
|
|
101
111
|
ref={ref}
|
|
102
112
|
className={cn(
|
|
103
|
-
"overflow-hidden p-1 text-foreground
|
|
113
|
+
"overflow-hidden p-1 text-foreground",
|
|
114
|
+
"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5",
|
|
115
|
+
"[&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium",
|
|
116
|
+
"[&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-widest",
|
|
117
|
+
"[&_[cmdk-group-heading]]:text-foreground-muted",
|
|
104
118
|
className
|
|
105
119
|
)}
|
|
106
120
|
{...props}
|
|
@@ -115,7 +129,7 @@ const CommandSeparator = React.forwardRef<
|
|
|
115
129
|
>(({ className, ...props }, ref) => (
|
|
116
130
|
<CommandPrimitive.Separator
|
|
117
131
|
ref={ref}
|
|
118
|
-
className={cn("-mx-1 h-px bg-
|
|
132
|
+
className={cn("-mx-1 h-px bg-black/8 dark:bg-white/8", className)}
|
|
119
133
|
{...props}
|
|
120
134
|
/>
|
|
121
135
|
));
|
|
@@ -128,8 +142,11 @@ const CommandItem = React.forwardRef<
|
|
|
128
142
|
<CommandPrimitive.Item
|
|
129
143
|
ref={ref}
|
|
130
144
|
className={cn(
|
|
131
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-
|
|
132
|
-
"
|
|
145
|
+
"relative flex cursor-default select-none items-center gap-2 rounded-xl px-2 py-1.5 text-sm outline-none",
|
|
146
|
+
"transition-all duration-150",
|
|
147
|
+
"data-[selected=true]:bg-white/60 dark:data-[selected=true]:bg-white/10",
|
|
148
|
+
"data-[selected=true]:text-foreground",
|
|
149
|
+
"data-[selected=true]:shadow-[0_0_12px_var(--glow-primary-subtle)]",
|
|
133
150
|
"data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50",
|
|
134
151
|
"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
135
152
|
className
|
|
@@ -146,11 +163,14 @@ const CommandShortcut = ({
|
|
|
146
163
|
}: React.HTMLAttributes<HTMLSpanElement>) => {
|
|
147
164
|
return (
|
|
148
165
|
<span
|
|
149
|
-
|
|
166
|
+
data-sonance-name="command"
|
|
150
167
|
className={cn(
|
|
151
168
|
"ml-auto text-xs tracking-widest text-foreground-muted",
|
|
169
|
+
"px-1.5 py-0.5 rounded-md",
|
|
170
|
+
"bg-white/40 dark:bg-white/5",
|
|
171
|
+
"border border-black/5 dark:border-white/10",
|
|
152
172
|
className
|
|
153
|
-
)}
|
|
173
|
+
)}
|
|
154
174
|
{...props}
|
|
155
175
|
/>
|
|
156
176
|
);
|
|
@@ -168,4 +188,3 @@ export {
|
|
|
168
188
|
CommandShortcut,
|
|
169
189
|
CommandSeparator,
|
|
170
190
|
};
|
|
171
|
-
|
|
@@ -21,9 +21,10 @@ const ContextMenuSubTrigger = React.forwardRef<
|
|
|
21
21
|
<ContextMenuPrimitive.SubTrigger
|
|
22
22
|
ref={ref}
|
|
23
23
|
className={cn(
|
|
24
|
-
"flex cursor-default select-none items-center rounded-
|
|
25
|
-
"
|
|
26
|
-
"
|
|
24
|
+
"flex cursor-default select-none items-center rounded-xl px-2 py-1.5 text-sm outline-none",
|
|
25
|
+
"transition-all duration-150",
|
|
26
|
+
"focus:bg-white/60 dark:focus:bg-white/10 focus:text-foreground",
|
|
27
|
+
"data-[state=open]:bg-white/60 dark:data-[state=open]:bg-white/10 data-[state=open]:text-foreground",
|
|
27
28
|
inset && "pl-8",
|
|
28
29
|
className
|
|
29
30
|
)}
|
|
@@ -42,7 +43,10 @@ const ContextMenuSubContent = React.forwardRef<
|
|
|
42
43
|
<ContextMenuPrimitive.SubContent
|
|
43
44
|
ref={ref}
|
|
44
45
|
className={cn(
|
|
45
|
-
"z-50 min-w-[8rem] overflow-hidden rounded-
|
|
46
|
+
"z-50 min-w-[8rem] overflow-hidden rounded-xl p-1 text-foreground",
|
|
47
|
+
"bg-white/90 dark:bg-black/80 backdrop-blur-xl",
|
|
48
|
+
"border border-black/10 dark:border-white/10",
|
|
49
|
+
"shadow-[0_8px_32px_rgba(0,0,0,0.12)] dark:shadow-[0_8px_32px_rgba(0,0,0,0.4)]",
|
|
46
50
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
47
51
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
48
52
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
@@ -64,8 +68,12 @@ const ContextMenuContent = React.forwardRef<
|
|
|
64
68
|
<ContextMenuPrimitive.Portal>
|
|
65
69
|
<ContextMenuPrimitive.Content
|
|
66
70
|
ref={ref}
|
|
71
|
+
data-sonance-name="context-menu"
|
|
67
72
|
className={cn(
|
|
68
|
-
"z-50 min-w-[8rem] overflow-hidden rounded-
|
|
73
|
+
"z-50 min-w-[8rem] overflow-hidden rounded-xl p-1 text-foreground",
|
|
74
|
+
"bg-white/90 dark:bg-black/80 backdrop-blur-xl",
|
|
75
|
+
"border border-black/10 dark:border-white/10",
|
|
76
|
+
"shadow-[0_8px_32px_rgba(0,0,0,0.12)] dark:shadow-[0_8px_32px_rgba(0,0,0,0.4)]",
|
|
69
77
|
"animate-in fade-in-80",
|
|
70
78
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
71
79
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
@@ -91,8 +99,10 @@ const ContextMenuItem = React.forwardRef<
|
|
|
91
99
|
<ContextMenuPrimitive.Item
|
|
92
100
|
ref={ref}
|
|
93
101
|
className={cn(
|
|
94
|
-
"relative flex cursor-default select-none items-center rounded-
|
|
95
|
-
"
|
|
102
|
+
"relative flex cursor-default select-none items-center rounded-xl px-2 py-1.5 text-sm outline-none",
|
|
103
|
+
"transition-all duration-150",
|
|
104
|
+
"focus:bg-white/60 dark:focus:bg-white/10 focus:text-foreground",
|
|
105
|
+
"focus:shadow-[0_0_12px_var(--glow-primary-subtle)]",
|
|
96
106
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
97
107
|
inset && "pl-8",
|
|
98
108
|
className
|
|
@@ -109,15 +119,17 @@ const ContextMenuCheckboxItem = React.forwardRef<
|
|
|
109
119
|
<ContextMenuPrimitive.CheckboxItem
|
|
110
120
|
ref={ref}
|
|
111
121
|
className={cn(
|
|
112
|
-
"relative flex cursor-default select-none items-center rounded-
|
|
113
|
-
"
|
|
122
|
+
"relative flex cursor-default select-none items-center rounded-xl py-1.5 pl-8 pr-2 text-sm outline-none",
|
|
123
|
+
"transition-all duration-150",
|
|
124
|
+
"focus:bg-white/60 dark:focus:bg-white/10 focus:text-foreground",
|
|
125
|
+
"focus:shadow-[0_0_12px_var(--glow-primary-subtle)]",
|
|
114
126
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
115
127
|
className
|
|
116
128
|
)}
|
|
117
129
|
checked={checked}
|
|
118
130
|
{...props}
|
|
119
131
|
>
|
|
120
|
-
<span
|
|
132
|
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
121
133
|
<ContextMenuPrimitive.ItemIndicator>
|
|
122
134
|
<Check className="h-4 w-4" />
|
|
123
135
|
</ContextMenuPrimitive.ItemIndicator>
|
|
@@ -135,14 +147,16 @@ const ContextMenuRadioItem = React.forwardRef<
|
|
|
135
147
|
<ContextMenuPrimitive.RadioItem
|
|
136
148
|
ref={ref}
|
|
137
149
|
className={cn(
|
|
138
|
-
"relative flex cursor-default select-none items-center rounded-
|
|
139
|
-
"
|
|
150
|
+
"relative flex cursor-default select-none items-center rounded-xl py-1.5 pl-8 pr-2 text-sm outline-none",
|
|
151
|
+
"transition-all duration-150",
|
|
152
|
+
"focus:bg-white/60 dark:focus:bg-white/10 focus:text-foreground",
|
|
153
|
+
"focus:shadow-[0_0_12px_var(--glow-primary-subtle)]",
|
|
140
154
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
141
155
|
className
|
|
142
156
|
)}
|
|
143
157
|
{...props}
|
|
144
158
|
>
|
|
145
|
-
<span
|
|
159
|
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
146
160
|
<ContextMenuPrimitive.ItemIndicator>
|
|
147
161
|
<Circle className="h-2 w-2 fill-current" />
|
|
148
162
|
</ContextMenuPrimitive.ItemIndicator>
|
|
@@ -176,7 +190,7 @@ const ContextMenuSeparator = React.forwardRef<
|
|
|
176
190
|
>(({ className, ...props }, ref) => (
|
|
177
191
|
<ContextMenuPrimitive.Separator
|
|
178
192
|
ref={ref}
|
|
179
|
-
className={cn("-mx-1 my-1 h-px bg-
|
|
193
|
+
className={cn("-mx-1 my-1 h-px bg-black/8 dark:bg-white/8", className)}
|
|
180
194
|
{...props}
|
|
181
195
|
/>
|
|
182
196
|
));
|
|
@@ -187,7 +201,15 @@ const ContextMenuShortcut = ({
|
|
|
187
201
|
...props
|
|
188
202
|
}: React.HTMLAttributes<HTMLSpanElement>) => {
|
|
189
203
|
return (
|
|
190
|
-
<span
|
|
204
|
+
<span
|
|
205
|
+
data-sonance-name="context-menu"
|
|
206
|
+
className={cn(
|
|
207
|
+
"ml-auto text-xs tracking-widest text-foreground-muted",
|
|
208
|
+
"px-1.5 py-0.5 rounded-md",
|
|
209
|
+
"bg-white/40 dark:bg-white/5",
|
|
210
|
+
"border border-black/5 dark:border-white/10",
|
|
211
|
+
className
|
|
212
|
+
)}
|
|
191
213
|
{...props}
|
|
192
214
|
/>
|
|
193
215
|
);
|
|
@@ -211,4 +233,3 @@ export {
|
|
|
211
233
|
ContextMenuSubTrigger,
|
|
212
234
|
ContextMenuRadioGroup,
|
|
213
235
|
};
|
|
214
|
-
|
|
@@ -48,10 +48,10 @@ export function Dialog({ open, onClose, children, size = "default" }: DialogProp
|
|
|
48
48
|
|
|
49
49
|
return (
|
|
50
50
|
<DialogContext.Provider value={{ open, onClose, size }}>
|
|
51
|
-
<div className="fixed inset-0 z-50 flex items-center justify-center">
|
|
52
|
-
{/* Backdrop with blur */}
|
|
51
|
+
<div className="fixed inset-0 z-50 flex items-center justify-center p-4">
|
|
52
|
+
{/* Backdrop with enhanced blur */}
|
|
53
53
|
<div
|
|
54
|
-
className="absolute inset-0 bg-
|
|
54
|
+
className="absolute inset-0 bg-black/40 dark:bg-black/60 backdrop-blur-md animate-in fade-in duration-200"
|
|
55
55
|
onClick={onClose}
|
|
56
56
|
/>
|
|
57
57
|
{/* Content */}
|
|
@@ -80,7 +80,10 @@ export const DialogContent = forwardRef<
|
|
|
80
80
|
data-sonance-name="dialog"
|
|
81
81
|
ref={ref}
|
|
82
82
|
className={cn(
|
|
83
|
-
"relative
|
|
83
|
+
"relative backdrop-blur-xl border rounded-3xl",
|
|
84
|
+
"bg-white/80 dark:bg-black/60",
|
|
85
|
+
"border-black/10 dark:border-white/10",
|
|
86
|
+
"shadow-[0_16px_48px_rgba(0,0,0,0.15)] dark:shadow-[0_16px_48px_rgba(0,0,0,0.5)]",
|
|
84
87
|
"min-w-[320px] max-w-lg",
|
|
85
88
|
className
|
|
86
89
|
)}
|
|
@@ -89,7 +92,7 @@ export const DialogContent = forwardRef<
|
|
|
89
92
|
{showClose && context && (
|
|
90
93
|
<button
|
|
91
94
|
onClick={context.onClose}
|
|
92
|
-
className="absolute right-3 top-3 p-1.5 rounded-
|
|
95
|
+
className="absolute right-3 top-3 p-1.5 rounded-xl text-foreground-muted hover:text-foreground hover:bg-white/50 dark:hover:bg-white/10 transition-all duration-150"
|
|
93
96
|
>
|
|
94
97
|
<X className="h-4 w-4" />
|
|
95
98
|
<span id="dialog-content-span-close" className="sr-only">Close</span>
|
|
@@ -10,7 +10,15 @@ export const Divider = forwardRef<HTMLDivElement, DividerProps>(
|
|
|
10
10
|
({ orientation = "horizontal", label, className, ...props }, ref) => {
|
|
11
11
|
if (orientation === "vertical") {
|
|
12
12
|
return (
|
|
13
|
-
<div
|
|
13
|
+
<div
|
|
14
|
+
ref={ref}
|
|
15
|
+
role="separator"
|
|
16
|
+
aria-orientation="vertical"
|
|
17
|
+
data-sonance-name="divider"
|
|
18
|
+
className={cn(
|
|
19
|
+
"w-px h-full bg-black/8 dark:bg-white/8",
|
|
20
|
+
className
|
|
21
|
+
)}
|
|
14
22
|
{...props}
|
|
15
23
|
/>
|
|
16
24
|
);
|
|
@@ -21,14 +29,15 @@ export const Divider = forwardRef<HTMLDivElement, DividerProps>(
|
|
|
21
29
|
<div
|
|
22
30
|
ref={ref}
|
|
23
31
|
role="separator"
|
|
24
|
-
className={cn("flex items-center gap-4", className)}
|
|
32
|
+
className={cn("flex items-center gap-4", className)}
|
|
33
|
+
data-sonance-name="divider"
|
|
25
34
|
{...props}
|
|
26
35
|
>
|
|
27
|
-
<div className="h-px flex-1 bg-
|
|
36
|
+
<div className="h-px flex-1 bg-black/8 dark:bg-white/8" />
|
|
28
37
|
<span id="divider-span-label" className="text-xs font-medium uppercase tracking-widest text-foreground-muted">
|
|
29
38
|
{label}
|
|
30
39
|
</span>
|
|
31
|
-
<div className="h-px flex-1 bg-
|
|
40
|
+
<div className="h-px flex-1 bg-black/8 dark:bg-white/8" />
|
|
32
41
|
</div>
|
|
33
42
|
);
|
|
34
43
|
}
|
|
@@ -38,7 +47,8 @@ export const Divider = forwardRef<HTMLDivElement, DividerProps>(
|
|
|
38
47
|
ref={ref}
|
|
39
48
|
role="separator"
|
|
40
49
|
aria-orientation="horizontal"
|
|
41
|
-
className={cn("h-px w-full bg-
|
|
50
|
+
className={cn("h-px w-full bg-black/8 dark:bg-white/8", className)}
|
|
51
|
+
data-sonance-name="divider"
|
|
42
52
|
{...props}
|
|
43
53
|
/>
|
|
44
54
|
);
|
|
@@ -63,7 +63,8 @@ export function Drawer({
|
|
|
63
63
|
{/* Drawer panel */}
|
|
64
64
|
<div data-sonance-name="drawer"
|
|
65
65
|
className={cn(
|
|
66
|
-
"absolute bg-
|
|
66
|
+
"absolute bg-white/90 dark:bg-black/80 backdrop-blur-xl",
|
|
67
|
+
"border-black/10 dark:border-white/10 shadow-xl",
|
|
67
68
|
position === "left" && "border-r",
|
|
68
69
|
position === "right" && "border-l",
|
|
69
70
|
position === "top" && "border-b",
|
|
@@ -85,7 +86,7 @@ export const DrawerHeader = forwardRef<
|
|
|
85
86
|
<div
|
|
86
87
|
ref={ref}
|
|
87
88
|
className={cn(
|
|
88
|
-
"flex items-center justify-between px-6 py-4 border-b border-border",
|
|
89
|
+
"flex items-center justify-between px-6 py-4 border-b border-black/8 dark:border-white/8",
|
|
89
90
|
className
|
|
90
91
|
)} data-sonance-name="drawer"
|
|
91
92
|
{...props}
|
|
@@ -139,7 +140,7 @@ export const DrawerFooter = forwardRef<
|
|
|
139
140
|
<div
|
|
140
141
|
ref={ref}
|
|
141
142
|
className={cn(
|
|
142
|
-
"flex items-center justify-end gap-3 px-6 py-4 border-t border-border",
|
|
143
|
+
"flex items-center justify-end gap-3 px-6 py-4 border-t border-black/8 dark:border-white/8",
|
|
143
144
|
className
|
|
144
145
|
)} data-sonance-name="drawer"
|
|
145
146
|
{...props}
|
|
@@ -7,23 +7,25 @@ import { cva, type VariantProps } from "class-variance-authority";
|
|
|
7
7
|
import { cn } from "@/lib/utils";
|
|
8
8
|
|
|
9
9
|
const dropdownMenuContentVariants = cva(
|
|
10
|
-
"z-50 min-w-[8rem] overflow-hidden border p-1 text-foreground shadow-xl data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
10
|
+
"z-50 min-w-[8rem] overflow-hidden border p-1.5 text-foreground shadow-xl data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
11
11
|
{
|
|
12
12
|
variants: {
|
|
13
13
|
size: {
|
|
14
|
-
xs: "rounded-
|
|
15
|
-
sm: "rounded-
|
|
16
|
-
md: "rounded-
|
|
17
|
-
lg: "rounded-
|
|
14
|
+
xs: "rounded-xl text-xs",
|
|
15
|
+
sm: "rounded-2xl text-xs",
|
|
16
|
+
md: "rounded-2xl text-sm",
|
|
17
|
+
lg: "rounded-3xl text-sm",
|
|
18
18
|
},
|
|
19
19
|
menuVariant: {
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
// Glass morphism - default style
|
|
21
|
+
default: "bg-white/90 dark:bg-black/80 border-black/10 dark:border-white/10 backdrop-blur-xl shadow-[0_8px_32px_rgba(0,0,0,0.12)] dark:shadow-[0_8px_32px_rgba(0,0,0,0.4)]",
|
|
22
|
+
// Non-glass solid variant
|
|
23
|
+
solid: "bg-card border-border backdrop-blur-none",
|
|
22
24
|
},
|
|
23
25
|
},
|
|
24
26
|
defaultVariants: {
|
|
25
27
|
size: "sm",
|
|
26
|
-
menuVariant: "
|
|
28
|
+
menuVariant: "default",
|
|
27
29
|
},
|
|
28
30
|
}
|
|
29
31
|
);
|
|
@@ -33,10 +35,10 @@ const dropdownMenuItemVariants = cva(
|
|
|
33
35
|
{
|
|
34
36
|
variants: {
|
|
35
37
|
size: {
|
|
36
|
-
xs: "rounded-
|
|
37
|
-
sm: "rounded-
|
|
38
|
-
md: "rounded-
|
|
39
|
-
lg: "rounded-
|
|
38
|
+
xs: "rounded-lg px-2 py-1 text-xs",
|
|
39
|
+
sm: "rounded-xl px-2.5 py-1.5 text-xs",
|
|
40
|
+
md: "rounded-xl px-3 py-2 text-sm",
|
|
41
|
+
lg: "rounded-2xl px-3.5 py-2.5 text-sm",
|
|
40
42
|
},
|
|
41
43
|
},
|
|
42
44
|
defaultVariants: {
|
|
@@ -129,7 +131,7 @@ const DropdownMenuItem = React.forwardRef<
|
|
|
129
131
|
ref={ref}
|
|
130
132
|
className={cn(
|
|
131
133
|
dropdownMenuItemVariants({ size: "sm" }),
|
|
132
|
-
"focus:bg-
|
|
134
|
+
"focus:bg-white/50 dark:focus:bg-white/10 focus:text-foreground",
|
|
133
135
|
inset && "pl-8",
|
|
134
136
|
className
|
|
135
137
|
)}
|
|
@@ -16,7 +16,10 @@ const HoverCardContent = React.forwardRef<
|
|
|
16
16
|
align={align}
|
|
17
17
|
sideOffset={sideOffset}
|
|
18
18
|
className={cn(
|
|
19
|
-
"z-50 w-64 rounded-
|
|
19
|
+
"z-50 w-64 rounded-2xl p-4 text-foreground outline-none",
|
|
20
|
+
"bg-white/90 dark:bg-black/70 backdrop-blur-xl",
|
|
21
|
+
"border border-black/10 dark:border-white/10",
|
|
22
|
+
"shadow-[0_8px_32px_rgba(0,0,0,0.12)] dark:shadow-[0_8px_32px_rgba(0,0,0,0.4)]",
|
|
20
23
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
21
24
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
22
25
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
@@ -66,7 +66,7 @@ export const Image = forwardRef<HTMLImageElement, ImageProps>(
|
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
const containerClasses = cn(
|
|
69
|
-
"relative overflow-hidden bg-
|
|
69
|
+
"relative overflow-hidden bg-white/50 dark:bg-white/[0.02] backdrop-blur-sm",
|
|
70
70
|
aspectRatioClasses[aspectRatio],
|
|
71
71
|
radiusClasses[radius],
|
|
72
72
|
className
|