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.
Files changed (84) hide show
  1. package/dist/assets/api/sonance-ai-edit/route.ts +30 -7
  2. package/dist/assets/api/sonance-save-image/route.ts +625 -0
  3. package/dist/assets/api/sonance-vision-apply/image-styling-detection.ts +1360 -0
  4. package/dist/assets/api/sonance-vision-apply/route.ts +1020 -64
  5. package/dist/assets/api/sonance-vision-apply/styling-detection.ts +730 -0
  6. package/dist/assets/api/sonance-vision-apply/theme-discovery.ts +1 -1
  7. package/dist/assets/api/sonance-vision-edit/route.ts +33 -8
  8. package/dist/assets/brand-system.ts +13 -12
  9. package/dist/assets/components/accordion.tsx +15 -7
  10. package/dist/assets/components/alert-dialog.tsx +35 -10
  11. package/dist/assets/components/alert.tsx +11 -10
  12. package/dist/assets/components/avatar.tsx +4 -4
  13. package/dist/assets/components/badge.tsx +16 -12
  14. package/dist/assets/components/button.stories.tsx +3 -3
  15. package/dist/assets/components/button.tsx +50 -31
  16. package/dist/assets/components/calendar.tsx +12 -8
  17. package/dist/assets/components/card.tsx +35 -29
  18. package/dist/assets/components/checkbox.tsx +9 -8
  19. package/dist/assets/components/code.tsx +19 -11
  20. package/dist/assets/components/command.tsx +32 -13
  21. package/dist/assets/components/context-menu.tsx +37 -16
  22. package/dist/assets/components/dialog.tsx +8 -5
  23. package/dist/assets/components/divider.tsx +15 -5
  24. package/dist/assets/components/drawer.tsx +4 -3
  25. package/dist/assets/components/dropdown-menu.tsx +15 -13
  26. package/dist/assets/components/hover-card.tsx +4 -1
  27. package/dist/assets/components/image.tsx +1 -1
  28. package/dist/assets/components/input.tsx +29 -14
  29. package/dist/assets/components/kbd.stories.tsx +3 -3
  30. package/dist/assets/components/kbd.tsx +29 -13
  31. package/dist/assets/components/listbox.tsx +8 -8
  32. package/dist/assets/components/menubar.tsx +50 -23
  33. package/dist/assets/components/navbar.stories.tsx +140 -13
  34. package/dist/assets/components/navbar.tsx +22 -5
  35. package/dist/assets/components/navigation-menu.tsx +28 -6
  36. package/dist/assets/components/pagination.tsx +10 -10
  37. package/dist/assets/components/popover.tsx +10 -8
  38. package/dist/assets/components/progress.tsx +6 -4
  39. package/dist/assets/components/radio-group.tsx +5 -5
  40. package/dist/assets/components/select.tsx +49 -29
  41. package/dist/assets/components/separator.tsx +3 -3
  42. package/dist/assets/components/sheet.tsx +4 -4
  43. package/dist/assets/components/sidebar.tsx +10 -10
  44. package/dist/assets/components/skeleton.tsx +13 -5
  45. package/dist/assets/components/slider.tsx +12 -10
  46. package/dist/assets/components/switch.tsx +4 -4
  47. package/dist/assets/components/table.tsx +5 -5
  48. package/dist/assets/components/tabs.tsx +8 -8
  49. package/dist/assets/components/textarea.tsx +11 -9
  50. package/dist/assets/components/toast.tsx +7 -7
  51. package/dist/assets/components/toggle.tsx +27 -7
  52. package/dist/assets/components/tooltip.tsx +10 -8
  53. package/dist/assets/components/user.tsx +8 -6
  54. package/dist/assets/dev-tools/SonanceDevTools.tsx +851 -708
  55. package/dist/assets/dev-tools/components/ApplyFirstPreview.tsx +10 -10
  56. package/dist/assets/dev-tools/components/ChatHistory.tsx +145 -0
  57. package/dist/assets/dev-tools/components/ChatInterface.tsx +444 -295
  58. package/dist/assets/dev-tools/components/ChatTabBar.tsx +82 -0
  59. package/dist/assets/dev-tools/components/DiffPreview.tsx +1 -1
  60. package/dist/assets/dev-tools/components/InlineDiffPreview.tsx +528 -0
  61. package/dist/assets/dev-tools/components/InspectorOverlay.tsx +21 -18
  62. package/dist/assets/dev-tools/components/PropertiesPanel.tsx +1345 -0
  63. package/dist/assets/dev-tools/components/ScreenshotAnnotator.tsx +1 -1
  64. package/dist/assets/dev-tools/components/SectionHighlight.tsx +1 -1
  65. package/dist/assets/dev-tools/components/VisionDiffPreview.tsx +7 -7
  66. package/dist/assets/dev-tools/components/VisionModeBorder.tsx +12 -63
  67. package/dist/assets/dev-tools/constants.ts +38 -6
  68. package/dist/assets/dev-tools/hooks/index.ts +69 -0
  69. package/dist/assets/dev-tools/hooks/useComponentDetection.ts +132 -0
  70. package/dist/assets/dev-tools/hooks/useComputedStyles.ts +471 -0
  71. package/dist/assets/dev-tools/hooks/useContentHash.ts +212 -0
  72. package/dist/assets/dev-tools/hooks/useElementScanner.ts +398 -0
  73. package/dist/assets/dev-tools/hooks/useImageDetection.ts +162 -0
  74. package/dist/assets/dev-tools/hooks/useTextDetection.ts +217 -0
  75. package/dist/assets/dev-tools/index.ts +3 -0
  76. package/dist/assets/dev-tools/panels/AnalysisPanel.tsx +32 -32
  77. package/dist/assets/dev-tools/panels/ComponentsPanel.tsx +384 -131
  78. package/dist/assets/dev-tools/panels/TextPanel.tsx +10 -10
  79. package/dist/assets/dev-tools/types.ts +93 -2
  80. package/dist/assets/globals.css +225 -9
  81. package/dist/assets/styles/brand-overrides.css +3 -2
  82. package/dist/assets/utils.ts +2 -1
  83. package/dist/index.js +22 -3
  84. 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
- "bg-card border border-card-border transition-all duration-200",
10
+ "transition-all duration-200 backdrop-blur-lg",
9
11
  {
10
12
  variants: {
11
13
  variant: {
12
- default: "hover:border-border-hover hover:bg-card-hover",
13
- elevated: "shadow-md hover:shadow-lg",
14
- glass: "bg-card/80 backdrop-blur-sm border-white/10 hover:bg-card/90",
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-lg",
18
- default: "rounded-xl",
19
- spacious: "rounded-2xl",
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
- if (variant === "elevated") {
46
- const stateMap: Record<string, string> = {
47
- hover: "shadow-lg",
48
- focus: "ring-2 ring-primary/20 ring-offset-2 ring-offset-background",
49
- };
50
- return stateMap[state] || "";
51
- }
52
-
53
- if (variant === "glass") {
54
- const stateMap: Record<string, string> = {
55
- hover: "bg-card/90",
56
- focus: "ring-2 ring-primary/20 ring-offset-2 ring-offset-background",
57
- };
58
- return stateMap[state] || "";
59
- }
60
-
61
- const stateMap: Record<string, string> = {
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 border-border bg-input transition-all duration-150 hover:border-border-hover checked:border-primary checked:bg-primary focus:outline-none focus:ring-2 focus:ring-primary/20 focus:ring-offset-2 focus:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50",
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-md",
17
- md: "h-5 w-5 rounded-md",
18
- lg: "h-6 w-6 rounded-lg",
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-hover",
50
- focus: "ring-2 ring-primary/20 ring-offset-2 ring-offset-background",
51
- checked: "border-primary bg-primary",
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-background-secondary text-foreground",
16
- primary: "bg-primary/10 text-primary",
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 data-sonance-name="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-background-tertiary">
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-background-secondary p-3 sm:p-4 w-full max-w-full",
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
- filename && "rounded-t-none"
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-background border border-border rounded-sm",
103
- "text-foreground-muted hover:text-foreground",
104
- "opacity-0 group-hover:opacity-100 transition-opacity",
105
- "focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-border-focus"
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-background-secondary border border-border rounded-sm",
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-sm bg-card text-foreground",
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
- )} data-sonance-name="command"
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 shadow-lg" showClose={false}>
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 className="flex items-center border-b border-border px-3" cmdk-input-wrapper="">
56
- <Search className="mr-2 h-4 w-4 shrink-0 opacity-50" />
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 rounded-sm bg-transparent py-3 text-sm outline-none placeholder:text-foreground-muted disabled:cursor-not-allowed disabled:opacity-50",
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 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-widest [&_[cmdk-group-heading]]:text-foreground-muted",
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-border", className)}
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-sm px-2 py-1.5 text-sm outline-none",
132
- "data-[selected=true]:bg-secondary-hover data-[selected=true]:text-foreground",
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
- id="command-shortcut-span"
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
- )} data-sonance-name="command"
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-sm px-2 py-1.5 text-sm outline-none",
25
- "focus:bg-secondary-hover focus:text-foreground",
26
- "data-[state=open]:bg-secondary-hover data-[state=open]:text-foreground",
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-sm border border-border bg-card p-1 text-foreground shadow-md",
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-sm border border-border bg-card p-1 text-foreground shadow-md",
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-sm px-2 py-1.5 text-sm outline-none",
95
- "focus:bg-secondary-hover focus:text-foreground",
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-sm py-1.5 pl-8 pr-2 text-sm outline-none",
113
- "focus:bg-secondary-hover focus:text-foreground",
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 id="context-menu-checkbox-item-span" className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
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-sm py-1.5 pl-8 pr-2 text-sm outline-none",
139
- "focus:bg-secondary-hover focus:text-foreground",
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 id="context-menu-radio-item-span" className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
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-border", className)}
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 id="context-menu-shortcut-span" data-sonance-name="context-menu"
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-overlay/80 backdrop-blur-sm animate-in fade-in duration-200"
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 bg-card/95 backdrop-blur-xl border border-border rounded-2xl shadow-2xl",
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-lg text-foreground-muted hover:text-foreground hover:bg-secondary-hover transition-all duration-150"
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 data-sonance-name="divider"
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)} data-sonance-name="divider"
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-border" />
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-border" />
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-border", className)} data-sonance-name="divider"
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-background border-border shadow-xl",
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-lg text-xs",
15
- sm: "rounded-xl text-xs",
16
- md: "rounded-xl text-sm",
17
- lg: "rounded-2xl text-sm",
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
- default: "bg-card border-border",
21
- glass: "bg-card/95 border-border/50 backdrop-blur-xl",
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: "glass",
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-md px-2 py-1 text-xs",
37
- sm: "rounded-lg px-2.5 py-1.5 text-xs",
38
- md: "rounded-lg px-3 py-2 text-sm",
39
- lg: "rounded-xl px-3.5 py-2.5 text-sm",
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-secondary-hover focus:text-foreground",
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-sm border border-border bg-card p-4 text-foreground shadow-md outline-none",
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-background-secondary",
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