canvas-ui-sdk 0.3.17 → 0.3.19

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 (34) hide show
  1. package/dist/index.d.ts +30 -75
  2. package/dist/index.js +550 -676
  3. package/dist/index.js.map +1 -1
  4. package/mcp/dist/index.js +2 -32
  5. package/package.json +1 -4
  6. package/registry/blocks/content-dropzone.json +2 -2
  7. package/registry/blocks/filter-popover.json +1 -1
  8. package/registry/blocks/fixed-column-data-table.json +1 -1
  9. package/registry/blocks/menufocus-template.json +1 -1
  10. package/registry/blocks/nested-comments-table.json +1 -1
  11. package/registry/blocks/nested-data-table.json +1 -1
  12. package/registry/blocks/page-previews.json +4 -14
  13. package/registry/blocks/standard-data-table.json +1 -1
  14. package/registry/blocks/title-group.json +1 -1
  15. package/registry/blocks/video-chat-controls.json +1 -1
  16. package/registry/blocks/video-playlist.json +1 -1
  17. package/registry/hooks/use-css-variable-sync.json +1 -1
  18. package/registry/index.json +1 -16
  19. package/registry/layout/dashboard-shell.json +1 -1
  20. package/registry/layout/header.json +1 -1
  21. package/registry/ui/checkbox.json +1 -1
  22. package/registry/ui/dialog.json +1 -1
  23. package/registry/ui/dropdown-menu.json +1 -1
  24. package/registry/ui/file-uploader.json +1 -1
  25. package/registry/ui/image-uploader.json +1 -1
  26. package/registry/ui/multiselect-checkbox-field.json +1 -1
  27. package/registry/ui/radio-group.json +1 -1
  28. package/registry/ui/select.json +1 -1
  29. package/registry/ui/sheet.json +1 -1
  30. package/registry/ui/slider.json +1 -1
  31. package/registry/ui/switch.json +1 -1
  32. package/registry/blocks/canvas-item.json +0 -18
  33. package/registry/blocks/component-palette.json +0 -21
  34. package/registry/blocks/infinity-canvas.json +0 -58
package/dist/index.js CHANGED
@@ -4,10 +4,10 @@ import { clsx } from 'clsx';
4
4
  import { twMerge } from 'tailwind-merge';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
  import * as React14 from 'react';
7
- import React14__default, { createContext, useState, useContext, useEffect, useRef, Children, useMemo, useCallback } from 'react';
7
+ import React14__default, { createContext, useState, useContext, useEffect, useRef, Children, useMemo, useCallback, useLayoutEffect } from 'react';
8
8
  import { Slot } from '@radix-ui/react-slot';
9
9
  import { cva } from 'class-variance-authority';
10
- import { Check, Calendar as Calendar$1, Upload, FileText, Trash2, ChevronLeft, ChevronRight, X, Search, Layout, Settings, User, LogIn, List, MessageSquare, CreditCard, Video, Play, Table, LayoutGrid, Layers, SlidersHorizontal, Type, Users, Image, Star, Award, Hash, MapPin, Megaphone, Newspaper, Building, Square, CheckSquare, ToggleLeft, CircleDot, Tags, Key, Bell, Home, PieChart, ShoppingBag, Mail, Phone, MessageCircle, ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon, XIcon, CheckIcon, CircleIcon, ChevronUpIcon, PanelLeftIcon, Info, ShoppingCart, LogOut, Menu, ChevronDown, Filter, Wand2, Paperclip, MoreHorizontal, PenSquare, Briefcase as Briefcase$1, MoreVertical, Minus, Plus, Instagram, Linkedin, Twitter, Facebook, Globe as Globe$1, DollarSign, BookOpen, Eye, CheckCircle, Zap, Camera as Camera$1, VideoOff, Mic, MicOff, Cast, Pencil, GripHorizontal, ChevronUp, Sparkles, Copy, ArrowRight, GitBranch, FileBox, ExternalLink, Target as Target$1, AlertCircle, Quote, GripVertical, ArrowUp, Heart as Heart$1, Link2, FolderPlus, ThumbsUp, ChevronsRight, ChevronsLeft, RefreshCw, Send, Bookmark } from 'lucide-react';
10
+ import { Check, Calendar as Calendar$1, Upload, FileText, Trash2, ChevronLeft, ChevronRight, X, Search, User, Key, CreditCard, Bell, Home, Users, MessageSquare, PieChart, ShoppingBag, Mail, Phone, MessageCircle, ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon, XIcon, CheckIcon, CircleIcon, ChevronUpIcon, PanelLeftIcon, Info, LayoutGrid, ShoppingCart, LogOut, Menu, ChevronDown, Filter, Wand2, Image, Paperclip, MoreHorizontal, PenSquare, Star as Star$1, Briefcase as Briefcase$1, MoreVertical, Minus, Plus, MapPin, Instagram, Linkedin, Twitter, Facebook, Globe as Globe$1, DollarSign, Video, BookOpen, Eye, CheckCircle, Zap, Camera as Camera$1, VideoOff, Mic, MicOff, Cast, Play, Pencil, ChevronUp, Sparkles, Copy, ArrowRight, GitBranch, FileBox, ExternalLink, Target as Target$1, AlertCircle, Quote, GripVertical, PanelRightClose, ArrowUp, Heart as Heart$1, Link2, FolderPlus, ThumbsUp, ChevronsRight, ChevronsLeft, RefreshCw, Send, Bookmark } from 'lucide-react';
11
11
  import { getDefaultClassNames, DayPicker } from 'react-day-picker';
12
12
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
13
13
  import * as DialogPrimitive from '@radix-ui/react-dialog';
@@ -22,10 +22,8 @@ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
22
22
  import * as SliderPrimitive from '@radix-ui/react-slider';
23
23
  import * as SwitchPrimitive from '@radix-ui/react-switch';
24
24
  import * as TabsPrimitive from '@radix-ui/react-tabs';
25
- import { Flag, Target, Rocket, Trophy, Shield, Heart, Megaphone as Megaphone$1, Phone as Phone$1, Envelope, ChatCircle, Drop, Fire, Moon, Sun, Tree, Leaf, Lightbulb, MusicNote, Camera, PencilSimple, Palette, ChartLine, Handshake, Storefront, Buildings, Briefcase, WifiHigh, Cloud, Globe, Database, Cpu, Terminal, Code, Infinity, Sparkle, Lightning, Star as Star$1, Hexagon, Diamond, ArrowUpRight, ArrowDownRight, MagnifyingGlass, MapPin as MapPin$1, Calendar as Calendar$2, Users as Users$1, ArrowRight as ArrowRight$1, CaretLeft, CaretRight, Check as Check$1, FacebookLogo, TwitterLogo, LinkedinLogo, InstagramLogo, XLogo, Info as Info$1, CaretUp, CaretDown, DotsThreeVertical, Gear, Mountains, ShieldCheck, Coffee, Coins, CurrencyDollar, Smiley, Image as Image$1, Clock, Bed, CreditCard as CreditCard$1, UserFocus, UsersFour, Eye as Eye$1, Books } from '@phosphor-icons/react';
25
+ import { Flag, Target, Rocket, Trophy, Shield, Heart, Megaphone, Phone as Phone$1, Envelope, ChatCircle, Drop, Fire, Moon, Sun, Tree, Leaf, Lightbulb, MusicNote, Camera, PencilSimple, Palette, ChartLine, Handshake, Storefront, Buildings, Briefcase, WifiHigh, Cloud, Globe, Database, Cpu, Terminal, Code, Infinity, Sparkle, Lightning, Star, Hexagon, Diamond, ArrowUpRight, ArrowDownRight, MagnifyingGlass, MapPin as MapPin$1, Calendar as Calendar$2, Users as Users$1, ArrowRight as ArrowRight$1, CaretLeft, CaretRight, Check as Check$1, FacebookLogo, TwitterLogo, LinkedinLogo, InstagramLogo, XLogo, Info as Info$1, CaretUp, CaretDown, DotsThreeVertical, Gear, Mountains, ShieldCheck, Coffee, Coins, CurrencyDollar, Smiley, Image as Image$1, Clock, Bed, CreditCard as CreditCard$1, UserFocus, UsersFour, Eye as Eye$1, Books } from '@phosphor-icons/react';
26
26
  import * as VisuallyHidden from '@radix-ui/react-visually-hidden';
27
- import { useDraggable } from '@dnd-kit/core';
28
- import { CSS } from '@dnd-kit/utilities';
29
27
  import { Chart, CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip as Tooltip$1, Legend, Filler, ArcElement } from 'chart.js';
30
28
  import { Line, Doughnut } from 'react-chartjs-2';
31
29
  import { startOfMonth, addMonths, isBefore, subMonths, format, endOfMonth, startOfWeek, endOfWeek, addDays, isSameMonth, isSameDay, isWithinInterval } from 'date-fns';
@@ -461,7 +459,7 @@ var Checkbox = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__
461
459
  ref,
462
460
  className: cn(
463
461
  "peer size-4 shrink-0 rounded-[var(--radius-xs)] border border-[var(--canvas-border-input)]",
464
- "bg-[var(--canvas-background)] transition-colors",
462
+ "bg-[var(--canvas-background)] transition-colors cursor-pointer",
465
463
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--canvas-border-input-focus)]",
466
464
  "disabled:cursor-not-allowed disabled:bg-[var(--canvas-input-disabled-bg)] disabled:border-[var(--canvas-input-disabled-border)]",
467
465
  "data-[state=checked]:bg-[var(--canvas-primary)] data-[state=checked]:border-[var(--canvas-primary)]",
@@ -613,7 +611,7 @@ function DialogContent({
613
611
  DialogPrimitive.Close,
614
612
  {
615
613
  "data-slot": "dialog-close",
616
- className: "ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
614
+ className: "cursor-pointer ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
617
615
  children: [
618
616
  /* @__PURE__ */ jsx(XIcon, {}),
619
617
  /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
@@ -731,7 +729,7 @@ function DropdownMenuItem({
731
729
  "data-inset": inset,
732
730
  "data-variant": variant,
733
731
  className: cn(
734
- "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground focus:[&_svg:not([class*='text-'])]:text-accent-foreground relative flex cursor-default items-center gap-1.5 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
732
+ "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground focus:[&_svg:not([class*='text-'])]:text-accent-foreground relative flex cursor-pointer items-center gap-1.5 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
735
733
  className
736
734
  ),
737
735
  ...props
@@ -749,7 +747,7 @@ function DropdownMenuCheckboxItem({
749
747
  {
750
748
  "data-slot": "dropdown-menu-checkbox-item",
751
749
  className: cn(
752
- "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
750
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
753
751
  className
754
752
  ),
755
753
  checked,
@@ -782,7 +780,7 @@ function DropdownMenuRadioItem({
782
780
  {
783
781
  "data-slot": "dropdown-menu-radio-item",
784
782
  className: cn(
785
- "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
783
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
786
784
  className
787
785
  ),
788
786
  ...props,
@@ -857,7 +855,7 @@ function DropdownMenuSubTrigger({
857
855
  "data-slot": "dropdown-menu-sub-trigger",
858
856
  "data-inset": inset,
859
857
  className: cn(
860
- "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
858
+ "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
861
859
  className
862
860
  ),
863
861
  ...props,
@@ -1067,7 +1065,7 @@ var FileUploader = React14.forwardRef(
1067
1065
  onClick: () => handleDelete(file.id),
1068
1066
  disabled,
1069
1067
  className: cn(
1070
- "shrink-0 text-[var(--canvas-text-muted)] hover:text-[var(--canvas-destructive)] transition-colors",
1068
+ "cursor-pointer shrink-0 text-[var(--canvas-text-muted)] hover:text-[var(--canvas-destructive)] transition-colors",
1071
1069
  disabled && "opacity-60 cursor-not-allowed"
1072
1070
  ),
1073
1071
  children: /* @__PURE__ */ jsx(Trash2, { style: { width: "16px", height: "16px" } })
@@ -1238,7 +1236,7 @@ var ImageUploader = React14.forwardRef(
1238
1236
  "div",
1239
1237
  {
1240
1238
  className: cn(
1241
- "flex flex-col shrink-0 rounded-[var(--radius-xs)] border overflow-hidden",
1239
+ "cursor-pointer flex flex-col shrink-0 rounded-[var(--radius-xs)] border overflow-hidden",
1242
1240
  isSelected ? "border-[var(--canvas-primary)]" : "border-[var(--canvas-border)]"
1243
1241
  ),
1244
1242
  onClick: () => onSelectImage?.(image.id),
@@ -1284,7 +1282,7 @@ var ImageUploader = React14.forwardRef(
1284
1282
  },
1285
1283
  disabled: disabled || isFirst,
1286
1284
  className: cn(
1287
- "flex items-center justify-center rounded-full transition-colors",
1285
+ "cursor-pointer flex items-center justify-center rounded-full transition-colors",
1288
1286
  isFirst || disabled ? "bg-[var(--canvas-surface)] border border-[var(--canvas-border)] text-[var(--canvas-text-muted)]" : "bg-[var(--canvas-text)] text-[var(--canvas-primary-foreground)]"
1289
1287
  ),
1290
1288
  style: { width: "24px", height: "24px" },
@@ -1301,7 +1299,7 @@ var ImageUploader = React14.forwardRef(
1301
1299
  },
1302
1300
  disabled: disabled || isLast,
1303
1301
  className: cn(
1304
- "flex items-center justify-center rounded-full transition-colors",
1302
+ "cursor-pointer flex items-center justify-center rounded-full transition-colors",
1305
1303
  isLast || disabled ? "bg-[var(--canvas-surface)] border border-[var(--canvas-border)] text-[var(--canvas-text-muted)]" : "bg-[var(--canvas-text)] text-[var(--canvas-primary-foreground)]"
1306
1304
  ),
1307
1305
  style: { width: "24px", height: "24px" },
@@ -1317,7 +1315,7 @@ var ImageUploader = React14.forwardRef(
1317
1315
  handleDelete(image.id);
1318
1316
  },
1319
1317
  disabled,
1320
- className: "flex items-center justify-center rounded-full bg-[var(--canvas-text)] text-[var(--canvas-primary-foreground)] transition-colors",
1318
+ className: "cursor-pointer flex items-center justify-center rounded-full bg-[var(--canvas-text)] text-[var(--canvas-primary-foreground)] transition-colors",
1321
1319
  style: { width: "24px", height: "24px" },
1322
1320
  children: /* @__PURE__ */ jsx(Trash2, { style: { width: "16px", height: "16px" } })
1323
1321
  }
@@ -1449,7 +1447,7 @@ var MultiselectCheckboxField = React14.forwardRef(
1449
1447
  onClick: () => handleToggle(option.id),
1450
1448
  disabled,
1451
1449
  className: cn(
1452
- "flex items-center gap-2 bg-[var(--canvas-background)] border overflow-hidden transition-colors",
1450
+ "cursor-pointer flex items-center gap-2 bg-[var(--canvas-background)] border overflow-hidden transition-colors",
1453
1451
  "focus:outline-none focus:ring-2 focus:ring-[var(--canvas-border-input-focus)]",
1454
1452
  isSelected ? "border-[var(--canvas-primary)]" : "border-[var(--canvas-border-input)]",
1455
1453
  disabled && "cursor-not-allowed bg-[var(--canvas-input-disabled-bg)] border-[var(--canvas-input-disabled-border)] opacity-60"
@@ -1652,7 +1650,7 @@ function RadioGroupItem({
1652
1650
  {
1653
1651
  "data-slot": "radio-group-item",
1654
1652
  className: cn(
1655
- "aspect-square size-4 shrink-0 rounded-full border border-[var(--canvas-border-input)] bg-[var(--canvas-background)] transition-colors",
1653
+ "cursor-pointer aspect-square size-4 shrink-0 rounded-full border border-[var(--canvas-border-input)] bg-[var(--canvas-background)] transition-colors",
1656
1654
  "outline-none focus-visible:ring-2 focus-visible:ring-[var(--canvas-border-input-focus)]",
1657
1655
  "aria-invalid:border-[var(--canvas-border-input-invalid)] aria-invalid:ring-[var(--canvas-border-input-invalid)]/20",
1658
1656
  "disabled:cursor-not-allowed disabled:bg-[var(--canvas-input-disabled-bg)] disabled:border-[var(--canvas-input-disabled-border)]",
@@ -1871,7 +1869,7 @@ var Searchbox = React14.forwardRef(
1871
1869
  Searchbox.displayName = "Searchbox";
1872
1870
  var selectTriggerVariants = cva(
1873
1871
  // Base styles using CSS variables
1874
- "flex w-full items-center justify-between gap-2 bg-[var(--canvas-background)] border border-[var(--canvas-border-input)] text-[var(--canvas-text)] whitespace-nowrap transition-colors outline-none focus:border-[var(--canvas-border-input-focus)] focus:ring-2 focus:ring-[var(--canvas-border-input-focus)] disabled:cursor-not-allowed disabled:bg-[var(--canvas-input-disabled-bg)] disabled:border-[var(--canvas-input-disabled-border)] disabled:text-[var(--canvas-input-disabled-text)] aria-invalid:border-[var(--canvas-border-input-invalid)] data-[placeholder]:text-[var(--canvas-text-placeholder)] [&_svg:not([class*='text-'])]:text-[var(--canvas-text-muted)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 font-[family-name:var(--typo-global-font)]",
1872
+ "cursor-pointer flex w-full items-center justify-between gap-2 bg-[var(--canvas-background)] border border-[var(--canvas-border-input)] text-[var(--canvas-text)] whitespace-nowrap transition-colors outline-none focus:border-[var(--canvas-border-input-focus)] focus:ring-2 focus:ring-[var(--canvas-border-input-focus)] disabled:cursor-not-allowed disabled:bg-[var(--canvas-input-disabled-bg)] disabled:border-[var(--canvas-input-disabled-border)] disabled:text-[var(--canvas-input-disabled-text)] aria-invalid:border-[var(--canvas-border-input-invalid)] data-[placeholder]:text-[var(--canvas-text-placeholder)] [&_svg:not([class*='text-'])]:text-[var(--canvas-text-muted)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 font-[family-name:var(--typo-global-font)]",
1875
1873
  {
1876
1874
  variants: {
1877
1875
  inputSize: {
@@ -1979,7 +1977,7 @@ function SelectItem({
1979
1977
  {
1980
1978
  "data-slot": "select-item",
1981
1979
  className: cn(
1982
- "focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 font-[family-name:var(--typo-global-font)]",
1980
+ "focus:bg-accent focus:text-accent-foreground data-[state=checked]:text-[var(--canvas-primary)] [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 font-[family-name:var(--typo-global-font)]",
1983
1981
  className
1984
1982
  ),
1985
1983
  ...props,
@@ -2198,7 +2196,7 @@ function SheetContent({
2198
2196
  ...props,
2199
2197
  children: [
2200
2198
  children,
2201
- /* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none", children: [
2199
+ /* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "cursor-pointer ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none", children: [
2202
2200
  /* @__PURE__ */ jsx(XIcon, { className: "size-4" }),
2203
2201
  /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
2204
2202
  ] })
@@ -2988,7 +2986,7 @@ var Slider = React14.forwardRef(({
2988
2986
  SliderPrimitive.Thumb,
2989
2987
  {
2990
2988
  className: cn(
2991
- "block rounded-full border-2 border-[var(--canvas-background)] bg-[var(--canvas-primary)]",
2989
+ "cursor-grab active:cursor-grabbing block rounded-full border-2 border-[var(--canvas-background)] bg-[var(--canvas-primary)]",
2992
2990
  "shadow-[0px_1px_2px_0px_rgba(0,0,0,0.08)]",
2993
2991
  "ring-offset-background transition-colors",
2994
2992
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--canvas-border-input-focus)]",
@@ -3023,7 +3021,7 @@ function Switch({
3023
3021
  {
3024
3022
  "data-slot": "switch",
3025
3023
  className: cn(
3026
- "peer inline-flex h-5 w-9 shrink-0 items-center rounded-full border-2 border-transparent transition-colors",
3024
+ "peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors",
3027
3025
  "data-[state=checked]:bg-[var(--canvas-primary)] data-[state=unchecked]:bg-[var(--canvas-border)]",
3028
3026
  "outline-none focus-visible:ring-2 focus-visible:ring-[var(--canvas-border-input-focus)]",
3029
3027
  "disabled:cursor-not-allowed disabled:data-[state=checked]:bg-[var(--canvas-input-disabled-text)] disabled:data-[state=unchecked]:bg-[var(--canvas-input-disabled-border)]",
@@ -3563,11 +3561,15 @@ function ThemeProvider({
3563
3561
  }) {
3564
3562
  const [previewBranding, setPreviewBranding] = useState(null);
3565
3563
  const [previewImages, setPreviewImages] = useState(null);
3564
+ const [isMounted, setIsMounted] = useState(false);
3565
+ useEffect(() => {
3566
+ setIsMounted(true);
3567
+ }, []);
3566
3568
  const contextValue = {
3567
3569
  images,
3568
3570
  branding,
3569
3571
  brandAssets,
3570
- isMounted: true
3572
+ isMounted
3571
3573
  };
3572
3574
  const previewBrandingValue = {
3573
3575
  previewBranding,
@@ -3660,7 +3662,7 @@ var iconShapes = {
3660
3662
  var iconMap = {
3661
3663
  Diamond,
3662
3664
  Hexagon,
3663
- Star: Star$1,
3665
+ Star,
3664
3666
  Lightning,
3665
3667
  Sparkle,
3666
3668
  Infinity,
@@ -3690,7 +3692,7 @@ var iconMap = {
3690
3692
  ChatCircle,
3691
3693
  Envelope,
3692
3694
  Phone: Phone$1,
3693
- Megaphone: Megaphone$1,
3695
+ Megaphone,
3694
3696
  Heart,
3695
3697
  Shield,
3696
3698
  Trophy,
@@ -3864,6 +3866,7 @@ function Header({
3864
3866
  /* @__PURE__ */ jsx(
3865
3867
  Button,
3866
3868
  {
3869
+ variant: "primary",
3867
3870
  className: "w-full",
3868
3871
  size: "default",
3869
3872
  onClick: onCheckout,
@@ -4220,7 +4223,7 @@ function Header({
4220
4223
  /* @__PURE__ */ jsx(
4221
4224
  Button,
4222
4225
  {
4223
- variant: "outline",
4226
+ variant: "primary-outline",
4224
4227
  size: "default",
4225
4228
  onClick: onLogin,
4226
4229
  children: "Log in"
@@ -4229,7 +4232,7 @@ function Header({
4229
4232
  /* @__PURE__ */ jsx(
4230
4233
  Button,
4231
4234
  {
4232
- variant: "default",
4235
+ variant: "primary",
4233
4236
  size: "default",
4234
4237
  onClick: onSignUp,
4235
4238
  children: "Sign up"
@@ -4362,7 +4365,7 @@ function Header({
4362
4365
  /* @__PURE__ */ jsx(
4363
4366
  Button,
4364
4367
  {
4365
- variant: "outline",
4368
+ variant: "primary-outline",
4366
4369
  className: "w-full",
4367
4370
  size: "lg",
4368
4371
  onClick: () => {
@@ -4375,7 +4378,7 @@ function Header({
4375
4378
  /* @__PURE__ */ jsx(
4376
4379
  Button,
4377
4380
  {
4378
- variant: "default",
4381
+ variant: "primary",
4379
4382
  className: "w-full",
4380
4383
  size: "lg",
4381
4384
  onClick: () => {
@@ -4557,7 +4560,7 @@ var iconShapes2 = [
4557
4560
  var iconMap2 = {
4558
4561
  Diamond: Diamond,
4559
4562
  Hexagon: Hexagon,
4560
- Star: Star$1,
4563
+ Star: Star,
4561
4564
  Lightning: Lightning,
4562
4565
  Sparkle: Sparkle,
4563
4566
  Infinity: Infinity,
@@ -4587,7 +4590,7 @@ var iconMap2 = {
4587
4590
  ChatCircle: ChatCircle,
4588
4591
  Envelope: Envelope,
4589
4592
  Phone: Phone$1,
4590
- Megaphone: Megaphone$1,
4593
+ Megaphone: Megaphone,
4591
4594
  Heart: Heart,
4592
4595
  Shield: Shield,
4593
4596
  Trophy: Trophy,
@@ -4702,7 +4705,31 @@ function broadcastCSSVariables(variables) {
4702
4705
  }
4703
4706
  });
4704
4707
  }
4705
- function setupCSSVariableListener() {
4708
+ function broadcastBranding(branding) {
4709
+ const iframes = document.querySelectorAll("iframe");
4710
+ iframes.forEach((iframe) => {
4711
+ try {
4712
+ iframe.contentWindow?.postMessage(
4713
+ { type: "branding-update", branding },
4714
+ "*"
4715
+ );
4716
+ } catch {
4717
+ }
4718
+ });
4719
+ }
4720
+ function broadcastImages(images) {
4721
+ const iframes = document.querySelectorAll("iframe");
4722
+ iframes.forEach((iframe) => {
4723
+ try {
4724
+ iframe.contentWindow?.postMessage(
4725
+ { type: "images-update", images },
4726
+ "*"
4727
+ );
4728
+ } catch {
4729
+ }
4730
+ });
4731
+ }
4732
+ function setupCSSVariableListener(options) {
4706
4733
  if (typeof window === "undefined") return () => {
4707
4734
  };
4708
4735
  const handler = (event) => {
@@ -4716,15 +4743,21 @@ function setupCSSVariableListener() {
4716
4743
  document.documentElement.style.removeProperty(name);
4717
4744
  });
4718
4745
  }
4746
+ if (event.data?.type === "branding-update") {
4747
+ options?.onBrandingUpdate?.(event.data.branding);
4748
+ }
4749
+ if (event.data?.type === "images-update") {
4750
+ options?.onImagesUpdate?.(event.data.images);
4751
+ }
4719
4752
  };
4720
4753
  window.addEventListener("message", handler);
4721
4754
  return () => window.removeEventListener("message", handler);
4722
4755
  }
4723
4756
 
4724
4757
  // src/hooks/use-css-variable-sync.ts
4725
- function useCSSVariableSync() {
4758
+ function useCSSVariableSync(options) {
4726
4759
  useEffect(() => {
4727
- const cleanup = setupCSSVariableListener();
4760
+ const cleanup = setupCSSVariableListener(options);
4728
4761
  return cleanup;
4729
4762
  }, []);
4730
4763
  }
@@ -4746,7 +4779,7 @@ function DashboardShell({
4746
4779
  onAppMenuClick?.();
4747
4780
  console.log("App menu clicked - implement app-level mobile menu here");
4748
4781
  };
4749
- return /* @__PURE__ */ jsxs("div", { className: "min-h-screen bg-[var(--canvas-background)]", children: [
4782
+ return /* @__PURE__ */ jsxs("div", { className: "min-h-screen min-w-0 bg-[var(--canvas-background)]", children: [
4750
4783
  /* @__PURE__ */ jsx("div", { className: "fixed top-0 left-0 right-0 lg:left-[var(--sidebar-width)] z-40", children: /* @__PURE__ */ jsx(Header, { onMenuClick: handleAppMenuClick }) }),
4751
4784
  /* @__PURE__ */ jsx("div", { className: "hidden lg:block fixed top-0 left-0 bottom-0 z-50 w-[var(--sidebar-width)]", children: /* @__PURE__ */ jsx(
4752
4785
  Sidebar2,
@@ -4792,7 +4825,8 @@ function DashboardShell({
4792
4825
  className: cn(
4793
4826
  "pt-[var(--header-height)]",
4794
4827
  "lg:pl-[var(--sidebar-width)]",
4795
- "min-h-screen"
4828
+ "min-h-screen",
4829
+ "overflow-x-hidden"
4796
4830
  ),
4797
4831
  children: /* @__PURE__ */ jsxs(
4798
4832
  "div",
@@ -4830,7 +4864,7 @@ var iconShapes3 = [
4830
4864
  var iconMap3 = {
4831
4865
  Diamond: Diamond,
4832
4866
  Hexagon: Hexagon,
4833
- Star: Star$1,
4867
+ Star: Star,
4834
4868
  Lightning: Lightning,
4835
4869
  Sparkle: Sparkle,
4836
4870
  Infinity: Infinity,
@@ -4860,7 +4894,7 @@ var iconMap3 = {
4860
4894
  ChatCircle: ChatCircle,
4861
4895
  Envelope: Envelope,
4862
4896
  Phone: Phone$1,
4863
- Megaphone: Megaphone$1,
4897
+ Megaphone: Megaphone,
4864
4898
  Heart: Heart,
4865
4899
  Shield: Shield,
4866
4900
  Trophy: Trophy,
@@ -5088,7 +5122,7 @@ var iconShapes4 = [
5088
5122
  var iconMap4 = {
5089
5123
  Diamond: Diamond,
5090
5124
  Hexagon: Hexagon,
5091
- Star: Star$1,
5125
+ Star: Star,
5092
5126
  Lightning: Lightning,
5093
5127
  Sparkle: Sparkle,
5094
5128
  Infinity: Infinity,
@@ -5118,7 +5152,7 @@ var iconMap4 = {
5118
5152
  ChatCircle: ChatCircle,
5119
5153
  Envelope: Envelope,
5120
5154
  Phone: Phone$1,
5121
- Megaphone: Megaphone$1,
5155
+ Megaphone: Megaphone,
5122
5156
  Heart: Heart,
5123
5157
  Shield: Shield,
5124
5158
  Trophy: Trophy,
@@ -5870,9 +5904,16 @@ var defaultDateRange = {
5870
5904
  startPlaceholder: "Start date",
5871
5905
  endPlaceholder: "End date"
5872
5906
  };
5907
+ var filterLabelStyle = {
5908
+ fontFamily: "var(--typo-input-label-font)",
5909
+ fontSize: "var(--typo-input-label-sm-size, 12px)",
5910
+ fontWeight: "var(--typo-input-label-weight)",
5911
+ letterSpacing: "var(--typo-input-label-spacing)",
5912
+ lineHeight: "var(--typo-input-label-line-height)"
5913
+ };
5873
5914
  function FilterDropdown({ config, value, onChange }) {
5874
5915
  return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
5875
- /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: { fontSize: "var(--typo-input-label-sm-size)", fontWeight: "var(--typo-input-label-weight)" }, children: config.label }),
5916
+ /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: filterLabelStyle, children: config.label }),
5876
5917
  /* @__PURE__ */ jsxs(Select, { value: value || void 0, onValueChange: onChange, children: [
5877
5918
  /* @__PURE__ */ jsx(SelectTrigger, { inputSize: "sm", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: config.placeholder }) }),
5878
5919
  /* @__PURE__ */ jsx(SelectContent, { position: "popper", side: "bottom", sideOffset: 4, children: config.options.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option.id, children: option.label }, option.id)) })
@@ -5947,7 +5988,7 @@ function FilterPopover({
5947
5988
  "button",
5948
5989
  {
5949
5990
  className: cn(
5950
- "flex items-center justify-between gap-2 bg-[var(--canvas-background)] border text-[var(--canvas-text)] whitespace-nowrap transition-colors outline-none focus:border-[var(--canvas-border-input-focus)] focus:ring-2 focus:ring-[var(--canvas-border-input-focus)] focus:ring-offset-2 data-[state=open]:border-[var(--canvas-border-input-focus)]",
5991
+ "cursor-pointer flex items-center justify-between gap-2 bg-[var(--canvas-background)] border text-[var(--canvas-text)] whitespace-nowrap transition-colors outline-none focus:border-[var(--canvas-border-input-focus)] focus:ring-2 focus:ring-[var(--canvas-border-input-focus)] data-[state=open]:border-[var(--canvas-border-input-focus)]",
5951
5992
  className
5952
5993
  ),
5953
5994
  style: {
@@ -5981,11 +6022,11 @@ function FilterPopover({
5981
6022
  children: [
5982
6023
  /* @__PURE__ */ jsxs("div", { className: "p-4 space-y-5 max-h-[480px] overflow-y-auto", children: [
5983
6024
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
5984
- /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: { fontSize: "var(--typo-input-label-sm-size)", fontWeight: "var(--typo-input-label-weight)" }, children: "Text Input" }),
6025
+ /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: filterLabelStyle, children: "Text Input" }),
5985
6026
  /* @__PURE__ */ jsx(TextInput, { inputSize: "sm", placeholder: "Enter text..." })
5986
6027
  ] }),
5987
6028
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
5988
- /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: { fontSize: "var(--typo-input-label-sm-size)", fontWeight: "var(--typo-input-label-weight)" }, children: "Searchbox" }),
6029
+ /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: filterLabelStyle, children: "Searchbox" }),
5989
6030
  /* @__PURE__ */ jsx(Searchbox, { inputSize: "sm", placeholder: "Search..." })
5990
6031
  ] }),
5991
6032
  dropdowns.slice(0, 1).map((dropdown) => /* @__PURE__ */ jsx(
@@ -5998,11 +6039,11 @@ function FilterPopover({
5998
6039
  dropdown.id
5999
6040
  )),
6000
6041
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
6001
- /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: { fontSize: "var(--typo-input-label-sm-size)", fontWeight: "var(--typo-input-label-weight)" }, children: "Date Input" }),
6042
+ /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: filterLabelStyle, children: "Date Input" }),
6002
6043
  /* @__PURE__ */ jsx(DateInput, { inputSize: "sm" })
6003
6044
  ] }),
6004
6045
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
6005
- /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: { fontSize: "var(--typo-input-label-sm-size)", fontWeight: "var(--typo-input-label-weight)" }, children: "Radio Buttons" }),
6046
+ /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: filterLabelStyle, children: "Radio Buttons" }),
6006
6047
  /* @__PURE__ */ jsxs(RadioGroup2, { defaultValue: "option1", className: "flex", children: [
6007
6048
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
6008
6049
  /* @__PURE__ */ jsx(RadioGroupItem, { value: "option1", id: "radio1" }),
@@ -6031,7 +6072,7 @@ function FilterPopover({
6031
6072
  ] })
6032
6073
  ] }),
6033
6074
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
6034
- /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: { fontSize: "var(--typo-input-label-sm-size)", fontWeight: "var(--typo-input-label-weight)" }, children: "Radio Buttons List" }),
6075
+ /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: filterLabelStyle, children: "Radio Buttons List" }),
6035
6076
  /* @__PURE__ */ jsxs(RadioGroup2, { defaultValue: "list-opt1", className: "flex flex-col gap-2", children: [
6036
6077
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
6037
6078
  /* @__PURE__ */ jsx(RadioGroupItem, { value: "list-opt1", id: "radio-list-1" }),
@@ -6072,7 +6113,7 @@ function FilterPopover({
6072
6113
  ] })
6073
6114
  ] }),
6074
6115
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
6075
- /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: { fontSize: "var(--typo-input-label-sm-size)", fontWeight: "var(--typo-input-label-weight)" }, children: "Checkbox" }),
6116
+ /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: filterLabelStyle, children: "Checkbox" }),
6076
6117
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
6077
6118
  /* @__PURE__ */ jsx(Checkbox, { id: "single-checkbox" }),
6078
6119
  /* @__PURE__ */ jsx(
@@ -6087,7 +6128,7 @@ function FilterPopover({
6087
6128
  ] })
6088
6129
  ] }),
6089
6130
  checkboxGroup && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
6090
- /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: { fontSize: "var(--typo-input-label-sm-size)", fontWeight: "var(--typo-input-label-weight)" }, children: "Checkbox List" }),
6131
+ /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: filterLabelStyle, children: "Checkbox List" }),
6091
6132
  /* @__PURE__ */ jsx("div", { className: "space-y-2", children: checkboxGroup.options.map((option) => /* @__PURE__ */ jsx(
6092
6133
  CheckboxWithLabel,
6093
6134
  {
@@ -6099,7 +6140,7 @@ function FilterPopover({
6099
6140
  )) })
6100
6141
  ] }),
6101
6142
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
6102
- /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: { fontSize: "var(--typo-input-label-sm-size)", fontWeight: "var(--typo-input-label-weight)" }, children: "Toggle" }),
6143
+ /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: filterLabelStyle, children: "Toggle" }),
6103
6144
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
6104
6145
  /* @__PURE__ */ jsx(Switch, { id: "toggle-switch" }),
6105
6146
  /* @__PURE__ */ jsx(
@@ -6114,7 +6155,7 @@ function FilterPopover({
6114
6155
  ] })
6115
6156
  ] }),
6116
6157
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
6117
- /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: { fontSize: "var(--typo-input-label-sm-size)", fontWeight: "var(--typo-input-label-weight)" }, children: "Multiselect Tags" }),
6158
+ /* @__PURE__ */ jsx("label", { className: "text-[var(--canvas-text-muted)]", style: filterLabelStyle, children: "Multiselect Tags" }),
6118
6159
  /* @__PURE__ */ jsx(MultiselectTags, { inputSize: "sm", tags: ["Tag 1", "Tag 2"], placeholder: "Add..." })
6119
6160
  ] })
6120
6161
  ] }),
@@ -6965,7 +7006,7 @@ var iconShapes5 = [
6965
7006
  var iconMap5 = {
6966
7007
  Diamond: Diamond,
6967
7008
  Hexagon: Hexagon,
6968
- Star: Star$1,
7009
+ Star: Star,
6969
7010
  Lightning: Lightning,
6970
7011
  Sparkle: Sparkle,
6971
7012
  Infinity: Infinity,
@@ -6995,7 +7036,7 @@ var iconMap5 = {
6995
7036
  ChatCircle: ChatCircle,
6996
7037
  Envelope: Envelope,
6997
7038
  Phone: Phone$1,
6998
- Megaphone: Megaphone$1,
7039
+ Megaphone: Megaphone,
6999
7040
  Heart: Heart,
7000
7041
  Shield: Shield,
7001
7042
  Trophy: Trophy,
@@ -7968,7 +8009,7 @@ function ContentDropzone({
7968
8009
  "div",
7969
8010
  {
7970
8011
  className: cn(
7971
- "flex flex-col gap-10",
8012
+ "flex flex-col gap-[var(--spacing-4xl)]",
7972
8013
  className
7973
8014
  ),
7974
8015
  children
@@ -8287,7 +8328,7 @@ function MenuSection({
8287
8328
  }
8288
8329
  var tabIcons = {
8289
8330
  briefcase: Briefcase$1,
8290
- star: Star,
8331
+ star: Star$1,
8291
8332
  user: User
8292
8333
  };
8293
8334
  function PillTabs({
@@ -8423,10 +8464,7 @@ function TitleGroup({
8423
8464
  paddingLeft: "var(--btn-small-px)",
8424
8465
  paddingRight: "var(--btn-small-px)",
8425
8466
  fontSize: "var(--btn-small-font-size)",
8426
- borderRadius: "var(--btn-small-radius)",
8427
- backgroundColor: "var(--btn-primary-bg)",
8428
- color: "var(--btn-primary-text)",
8429
- borderColor: "var(--btn-primary-border)"
8467
+ borderRadius: "var(--btn-small-radius)"
8430
8468
  },
8431
8469
  children: actionButtonText
8432
8470
  }
@@ -8809,7 +8847,7 @@ function MenufocusTemplate({
8809
8847
  "button",
8810
8848
  {
8811
8849
  className: cn(
8812
- "flex items-center justify-center rounded-full hover:bg-[var(--canvas-surface)] transition-colors focus:outline-none focus:ring-2 focus:ring-[var(--canvas-primary)] focus:ring-offset-2",
8850
+ "cursor-pointer flex items-center justify-center rounded-full hover:bg-[var(--canvas-surface)] transition-colors focus:outline-none focus:ring-2 focus:ring-[var(--canvas-primary)] focus:ring-offset-2",
8813
8851
  buttonSize,
8814
8852
  className
8815
8853
  ),
@@ -8936,6 +8974,7 @@ function StandardDataTable({
8936
8974
  /* @__PURE__ */ jsx("tbody", { children: data.map((row) => /* @__PURE__ */ jsxs(
8937
8975
  "tr",
8938
8976
  {
8977
+ className: "hover:bg-[var(--canvas-surface)] transition-colors",
8939
8978
  style: { borderBottom: "1px solid var(--canvas-border)" },
8940
8979
  children: [
8941
8980
  /* @__PURE__ */ jsx(
@@ -9210,6 +9249,7 @@ function FixedColumnDataTable({
9210
9249
  /* @__PURE__ */ jsx("tbody", { children: data.map((row) => /* @__PURE__ */ jsxs(
9211
9250
  "tr",
9212
9251
  {
9252
+ className: "hover:bg-[var(--canvas-surface)] transition-colors",
9213
9253
  style: { borderBottom: "1px solid var(--canvas-border)" },
9214
9254
  children: [
9215
9255
  /* @__PURE__ */ jsx(TableCell2, { isFixed: true, className: "pr-8", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
@@ -9430,7 +9470,7 @@ function NestedTable({ children, onChildAction }) {
9430
9470
  children.map((child, index) => /* @__PURE__ */ jsxs(
9431
9471
  "div",
9432
9472
  {
9433
- className: "grid items-center",
9473
+ className: "grid items-center hover:bg-[var(--canvas-surface)] transition-colors rounded-sm",
9434
9474
  style: {
9435
9475
  borderBottom: index < children.length - 1 ? "1px solid var(--canvas-border)" : "none",
9436
9476
  padding: "var(--spacing-md) 0",
@@ -9450,7 +9490,7 @@ function NestedTable({ children, onChildAction }) {
9450
9490
  "button",
9451
9491
  {
9452
9492
  onClick: () => onChildAction?.("view", child),
9453
- className: "flex items-center justify-center size-8 rounded-full hover:bg-[var(--canvas-surface)] transition-colors",
9493
+ className: "cursor-pointer flex items-center justify-center size-8 rounded-full hover:bg-[var(--canvas-surface)] transition-colors",
9454
9494
  "aria-label": `View ${child.name}`,
9455
9495
  children: /* @__PURE__ */ jsx(Eye, { size: 20, style: { color: "var(--canvas-text-muted)" } })
9456
9496
  }
@@ -9530,7 +9570,7 @@ function NestedDataTable({
9530
9570
  /* @__PURE__ */ jsxs(
9531
9571
  "div",
9532
9572
  {
9533
- className: "grid items-center",
9573
+ className: "grid items-center hover:bg-[var(--canvas-surface)] transition-colors rounded-sm",
9534
9574
  style: {
9535
9575
  padding: "var(--spacing-md) 0",
9536
9576
  minHeight: "64px",
@@ -10573,7 +10613,7 @@ function CommentInput2({
10573
10613
  "button",
10574
10614
  {
10575
10615
  type: "button",
10576
- className: "absolute right-3 top-1/2 -translate-y-1/2",
10616
+ className: "cursor-pointer absolute right-3 top-1/2 -translate-y-1/2",
10577
10617
  style: { color: "var(--canvas-text-placeholder)" },
10578
10618
  children: /* @__PURE__ */ jsx(Paperclip, { className: "w-5 h-5" })
10579
10619
  }
@@ -10605,7 +10645,7 @@ function CommentActions2({
10605
10645
  {
10606
10646
  type: "button",
10607
10647
  onClick: onReply,
10608
- className: "flex items-center",
10648
+ className: "cursor-pointer flex items-center",
10609
10649
  style: {
10610
10650
  gap: "var(--spacing-sm)",
10611
10651
  fontFamily: "var(--typo-body-s-font, var(--typo-global-font))",
@@ -10622,7 +10662,7 @@ function CommentActions2({
10622
10662
  {
10623
10663
  type: "button",
10624
10664
  onClick: onLike,
10625
- className: "flex items-center",
10665
+ className: "cursor-pointer flex items-center",
10626
10666
  style: {
10627
10667
  gap: "var(--spacing-sm)",
10628
10668
  fontFamily: "var(--typo-body-s-font, var(--typo-global-font))",
@@ -10805,6 +10845,7 @@ function CommentItem({
10805
10845
  "button",
10806
10846
  {
10807
10847
  type: "button",
10848
+ className: "cursor-pointer",
10808
10849
  onClick: () => setShowReplies(!showReplies),
10809
10850
  style: {
10810
10851
  fontFamily: "var(--typo-body-xs-font, var(--typo-global-font))",
@@ -11105,7 +11146,7 @@ function ProfileCard({
11105
11146
  /* @__PURE__ */ jsx(Typography, { variant: "body-s", color: "muted", className: "text-center", children: username })
11106
11147
  ] }),
11107
11148
  rating > 0 && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-0.5 mt-3", children: [...Array(5)].map((_, i) => /* @__PURE__ */ jsx(
11108
- Star,
11149
+ Star$1,
11109
11150
  {
11110
11151
  className: cn(
11111
11152
  "size-4",
@@ -11205,7 +11246,7 @@ function SidebarProfileCard({
11205
11246
  ] })
11206
11247
  ] }),
11207
11248
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 justify-center", children: [
11208
- /* @__PURE__ */ jsx(Star, { className: "size-4 fill-[var(--canvas-primary)] text-[var(--canvas-primary)]" }),
11249
+ /* @__PURE__ */ jsx(Star$1, { className: "size-4 fill-[var(--canvas-primary)] text-[var(--canvas-primary)]" }),
11209
11250
  /* @__PURE__ */ jsx(Typography, { variant: "body-xs", className: "font-semibold", children: rating }),
11210
11251
  /* @__PURE__ */ jsx(Typography, { variant: "body-xs", color: "muted", children: reviewCount })
11211
11252
  ] }),
@@ -11375,7 +11416,7 @@ function SkillsCard({
11375
11416
  }
11376
11417
  var badgeIcons = {
11377
11418
  zap: Zap,
11378
- star: Star,
11419
+ star: Star$1,
11379
11420
  check: CheckCircle
11380
11421
  };
11381
11422
  var badgeColors = {
@@ -11818,7 +11859,7 @@ function StarRating2({ rating, reviewCount }) {
11818
11859
  style: { gap: "var(--spacing-xxs, 2px)" },
11819
11860
  children: [
11820
11861
  [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsx(
11821
- Star,
11862
+ Star$1,
11822
11863
  {
11823
11864
  className: "size-5",
11824
11865
  fill: star <= rating ? "var(--canvas-primary)" : "var(--canvas-border)",
@@ -13905,7 +13946,7 @@ function ControlButton({ icon, onClick, isActive = true, label }) {
13905
13946
  onClick,
13906
13947
  "aria-label": label,
13907
13948
  className: cn(
13908
- "w-10 h-10 rounded-full flex items-center justify-center",
13949
+ "cursor-pointer w-10 h-10 rounded-full flex items-center justify-center",
13909
13950
  "shadow-sm transition-colors",
13910
13951
  isActive ? "bg-[var(--canvas-sidebar-light-text)] text-[var(--canvas-primary-foreground)] hover:opacity-80" : "bg-[var(--canvas-destructive)] text-[var(--canvas-primary-foreground)] hover:opacity-80"
13911
13952
  ),
@@ -14088,7 +14129,7 @@ function VideoPlaylistCard({
14088
14129
  "button",
14089
14130
  {
14090
14131
  type: "button",
14091
- className: "flex items-center gap-2 p-4 border-b border-[var(--canvas-border)] text-left w-full",
14132
+ className: "cursor-pointer flex items-center gap-2 p-4 border-b border-[var(--canvas-border)] text-left w-full",
14092
14133
  onClick: () => setIsCollapsed(!isCollapsed),
14093
14134
  children: [
14094
14135
  /* @__PURE__ */ jsx("div", { className: "w-4 h-4 shrink-0 flex items-center justify-center", children: isCollapsed ? /* @__PURE__ */ jsx(Plus, { className: "w-4 h-4 text-[var(--canvas-text)]" }) : /* @__PURE__ */ jsx(Minus, { className: "w-4 h-4 text-[var(--canvas-text)]" }) }),
@@ -14478,327 +14519,6 @@ function CreditCardDisplay({
14478
14519
  }
14479
14520
  );
14480
14521
  }
14481
- function CanvasItem({
14482
- item,
14483
- isSelected,
14484
- onSelect,
14485
- onDelete,
14486
- onDragStart,
14487
- scale,
14488
- children
14489
- }) {
14490
- const [isDragging, setIsDragging] = useState(false);
14491
- const handleDragHandleMouseDown = (e) => {
14492
- e.preventDefault();
14493
- e.stopPropagation();
14494
- setIsDragging(true);
14495
- onSelect(item.id);
14496
- onDragStart(item.id, e.clientX, e.clientY, item.x, item.y);
14497
- };
14498
- const handleClick = (e) => {
14499
- e.stopPropagation();
14500
- onSelect(item.id);
14501
- };
14502
- const handleDelete = (e) => {
14503
- e.stopPropagation();
14504
- onDelete(item.id);
14505
- };
14506
- return /* @__PURE__ */ jsxs(
14507
- "div",
14508
- {
14509
- className: cn(
14510
- "absolute group",
14511
- "transition-shadow duration-150",
14512
- isSelected && "ring-2 ring-[var(--canvas-primary)] ring-offset-2",
14513
- isDragging && "opacity-90 shadow-2xl z-50"
14514
- ),
14515
- style: {
14516
- left: item.x,
14517
- top: item.y
14518
- },
14519
- onClick: handleClick,
14520
- children: [
14521
- /* @__PURE__ */ jsxs(
14522
- "div",
14523
- {
14524
- className: cn(
14525
- "absolute -top-9 left-0 right-0 flex items-center justify-between px-2 py-1.5",
14526
- "bg-[var(--canvas-text)] rounded-t-md",
14527
- "opacity-0 group-hover:opacity-100 transition-opacity",
14528
- isSelected && "opacity-100"
14529
- ),
14530
- children: [
14531
- /* @__PURE__ */ jsxs(
14532
- "div",
14533
- {
14534
- onMouseDown: handleDragHandleMouseDown,
14535
- className: "flex items-center gap-1.5 text-white/90 cursor-grab active:cursor-grabbing select-none",
14536
- style: { fontSize: "var(--typo-body-xs-size)" },
14537
- children: [
14538
- /* @__PURE__ */ jsx(GripHorizontal, { className: "size-4" }),
14539
- /* @__PURE__ */ jsx("span", { className: "text-[11px] font-medium", children: item.componentType })
14540
- ]
14541
- }
14542
- ),
14543
- /* @__PURE__ */ jsx(
14544
- "button",
14545
- {
14546
- onClick: handleDelete,
14547
- className: "p-1 rounded hover:bg-white/20 text-white/80 hover:text-white transition-colors",
14548
- "aria-label": "Delete component",
14549
- children: /* @__PURE__ */ jsx(X, { className: "size-3.5" })
14550
- }
14551
- )
14552
- ]
14553
- }
14554
- ),
14555
- /* @__PURE__ */ jsx("div", { className: "pointer-events-none", children })
14556
- ]
14557
- }
14558
- );
14559
- }
14560
- var paletteComponents = [
14561
- // =====================
14562
- // PAGE TEMPLATES
14563
- // =====================
14564
- { id: "page-about", type: "PageAbout", label: "About", icon: /* @__PURE__ */ jsx(Layout, { className: "size-4" }), category: "Page Templates" },
14565
- { id: "page-account", type: "PageAccount", label: "Account Settings", icon: /* @__PURE__ */ jsx(Settings, { className: "size-4" }), category: "Page Templates" },
14566
- { id: "page-admin-portal", type: "PageAdminPortal", label: "Admin Portal", icon: /* @__PURE__ */ jsx(Layout, { className: "size-4" }), category: "Page Templates" },
14567
- { id: "page-centered-profile", type: "PageCenteredProfile", label: "Centered Profile", icon: /* @__PURE__ */ jsx(User, { className: "size-4" }), category: "Page Templates" },
14568
- { id: "page-double-sidebar", type: "PageDoubleSidebar", label: "Double Sidebar", icon: /* @__PURE__ */ jsx(Layout, { className: "size-4" }), category: "Page Templates" },
14569
- { id: "page-icon-sidebar", type: "PageIconSidebar", label: "Icon Sidebar", icon: /* @__PURE__ */ jsx(Layout, { className: "size-4" }), category: "Page Templates" },
14570
- { id: "page-login", type: "PageLogin", label: "Login / Signup", icon: /* @__PURE__ */ jsx(LogIn, { className: "size-4" }), category: "Page Templates" },
14571
- { id: "page-menu-sections", type: "PageMenuSections", label: "Menu Sections", icon: /* @__PURE__ */ jsx(List, { className: "size-4" }), category: "Page Templates" },
14572
- { id: "page-messenger", type: "PageMessenger", label: "Messenger", icon: /* @__PURE__ */ jsx(MessageSquare, { className: "size-4" }), category: "Page Templates" },
14573
- { id: "page-mobile-menu", type: "PageMobileMenu", label: "Mobile Menu", icon: /* @__PURE__ */ jsx(Layout, { className: "size-4" }), category: "Page Templates" },
14574
- { id: "page-multistep-progressbar", type: "PageMultistepProgressbar", label: "Multistep + Progress", icon: /* @__PURE__ */ jsx(List, { className: "size-4" }), category: "Page Templates" },
14575
- { id: "page-multistep-sidebar", type: "PageMultistepSidebar", label: "Multistep + Sidebar", icon: /* @__PURE__ */ jsx(List, { className: "size-4" }), category: "Page Templates" },
14576
- { id: "page-pricing", type: "PagePricing", label: "Pricing", icon: /* @__PURE__ */ jsx(CreditCard, { className: "size-4" }), category: "Page Templates" },
14577
- { id: "page-product-homepage", type: "PageProductHomepage", label: "Product Homepage", icon: /* @__PURE__ */ jsx(Layout, { className: "size-4" }), category: "Page Templates" },
14578
- { id: "page-reset-password", type: "PageResetPassword", label: "Reset Password", icon: /* @__PURE__ */ jsx(LogIn, { className: "size-4" }), category: "Page Templates" },
14579
- { id: "page-search-bar", type: "PageSearchBar", label: "Search Bar", icon: /* @__PURE__ */ jsx(Search, { className: "size-4" }), category: "Page Templates" },
14580
- { id: "page-sidebar-profile", type: "PageSidebarProfile", label: "Sidebar Profile", icon: /* @__PURE__ */ jsx(User, { className: "size-4" }), category: "Page Templates" },
14581
- { id: "page-standard", type: "PageStandard", label: "Standard Page", icon: /* @__PURE__ */ jsx(Layout, { className: "size-4" }), category: "Page Templates" },
14582
- { id: "page-standard-multistep", type: "PageStandardMultistep", label: "Standard Multistep", icon: /* @__PURE__ */ jsx(List, { className: "size-4" }), category: "Page Templates" },
14583
- { id: "page-standard-search", type: "PageStandardSearch", label: "Standard Search", icon: /* @__PURE__ */ jsx(Search, { className: "size-4" }), category: "Page Templates" },
14584
- { id: "page-vertical-multistep", type: "PageVerticalMultistep", label: "Vertical Multistep", icon: /* @__PURE__ */ jsx(List, { className: "size-4" }), category: "Page Templates" },
14585
- { id: "page-video-chat", type: "PageVideoChat", label: "Video Chat", icon: /* @__PURE__ */ jsx(Video, { className: "size-4" }), category: "Page Templates" },
14586
- { id: "page-video-list", type: "PageVideoList", label: "Video List", icon: /* @__PURE__ */ jsx(Play, { className: "size-4" }), category: "Page Templates" },
14587
- // =====================
14588
- // BLOCKS
14589
- // =====================
14590
- // Data & Tables
14591
- { id: "standard-data-table", type: "StandardDataTable", label: "Data Table", icon: /* @__PURE__ */ jsx(Table, { className: "size-4" }), category: "Blocks" },
14592
- // Cards & Profiles
14593
- { id: "profile-card", type: "ProfileCard", label: "Profile Card", icon: /* @__PURE__ */ jsx(User, { className: "size-4" }), category: "Blocks" },
14594
- { id: "sidebar-profile-card", type: "SidebarProfileCard", label: "Sidebar Profile Card", icon: /* @__PURE__ */ jsx(User, { className: "size-4" }), category: "Blocks" },
14595
- { id: "profile-info-cards", type: "ProfileInfoCards", label: "Profile Info Cards", icon: /* @__PURE__ */ jsx(LayoutGrid, { className: "size-4" }), category: "Blocks" },
14596
- { id: "sidebar-cards", type: "SidebarCards", label: "Sidebar Cards", icon: /* @__PURE__ */ jsx(Layers, { className: "size-4" }), category: "Blocks" },
14597
- { id: "credit-card-display", type: "CreditCardDisplay", label: "Credit Card Display", icon: /* @__PURE__ */ jsx(CreditCard, { className: "size-4" }), category: "Blocks" },
14598
- // Navigation & Progress
14599
- { id: "step-tracker", type: "StepTracker", label: "Step Tracker", icon: /* @__PURE__ */ jsx(List, { className: "size-4" }), category: "Blocks" },
14600
- { id: "vertical-step-tracker", type: "VerticalStepTracker", label: "Vertical Step Tracker", icon: /* @__PURE__ */ jsx(List, { className: "size-4" }), category: "Blocks" },
14601
- { id: "progress-bar", type: "ProgressBar", label: "Progress Bar", icon: /* @__PURE__ */ jsx(SlidersHorizontal, { className: "size-4" }), category: "Blocks" },
14602
- { id: "pill-tabs", type: "PillTabs", label: "Pill Tabs", icon: /* @__PURE__ */ jsx(LayoutGrid, { className: "size-4" }), category: "Blocks" },
14603
- { id: "mobile-bottom-nav", type: "MobileBottomNav", label: "Mobile Bottom Nav", icon: /* @__PURE__ */ jsx(Layout, { className: "size-4" }), category: "Blocks" },
14604
- // Banners & Headers
14605
- { id: "flair-banner", type: "FlairBanner", label: "Flair Banner", icon: /* @__PURE__ */ jsx(Type, { className: "size-4" }), category: "Blocks" },
14606
- { id: "gradient-banner", type: "GradientBanner", label: "Gradient Banner", icon: /* @__PURE__ */ jsx(Type, { className: "size-4" }), category: "Blocks" },
14607
- { id: "page-header-section", type: "PageHeaderSection", label: "Page Header Section", icon: /* @__PURE__ */ jsx(FileText, { className: "size-4" }), category: "Blocks" },
14608
- // Chat & Messaging
14609
- { id: "messenger-sidebar", type: "MessengerSidebar", label: "Messenger Sidebar", icon: /* @__PURE__ */ jsx(MessageSquare, { className: "size-4" }), category: "Blocks" },
14610
- { id: "chat-message", type: "ChatMessage", label: "Chat Message", icon: /* @__PURE__ */ jsx(MessageSquare, { className: "size-4" }), category: "Blocks" },
14611
- // Video
14612
- { id: "video-chat-controls", type: "VideoChatControls", label: "Video Chat Controls", icon: /* @__PURE__ */ jsx(Video, { className: "size-4" }), category: "Blocks" },
14613
- { id: "webcam-preview", type: "WebcamPreview", label: "Webcam Preview", icon: /* @__PURE__ */ jsx(Video, { className: "size-4" }), category: "Blocks" },
14614
- { id: "participant-list", type: "ParticipantList", label: "Participant List", icon: /* @__PURE__ */ jsx(Users, { className: "size-4" }), category: "Blocks" },
14615
- { id: "video-content-section", type: "VideoContentSection", label: "Video Content Section", icon: /* @__PURE__ */ jsx(Play, { className: "size-4" }), category: "Blocks" },
14616
- { id: "video-playlist", type: "VideoPlaylist", label: "Video Playlist", icon: /* @__PURE__ */ jsx(List, { className: "size-4" }), category: "Blocks" },
14617
- // Search & Filters
14618
- { id: "search-bar", type: "SearchBar", label: "Search Bar", icon: /* @__PURE__ */ jsx(Search, { className: "size-4" }), category: "Blocks" },
14619
- { id: "filter-popover", type: "FilterPopover", label: "Filter Popover", icon: /* @__PURE__ */ jsx(SlidersHorizontal, { className: "size-4" }), category: "Blocks" },
14620
- // Forms & Settings
14621
- { id: "settings-list-row", type: "SettingsListRow", label: "Settings List Row", icon: /* @__PURE__ */ jsx(Settings, { className: "size-4" }), category: "Blocks" },
14622
- { id: "profile-image-uploader", type: "ProfileImageUploader", label: "Profile Image Uploader", icon: /* @__PURE__ */ jsx(Image, { className: "size-4" }), category: "Blocks" },
14623
- { id: "login-branding-panel", type: "LoginBrandingPanel", label: "Login Branding Panel", icon: /* @__PURE__ */ jsx(Layout, { className: "size-4" }), category: "Blocks" },
14624
- // Marketing - Heroes
14625
- { id: "hero-section", type: "HeroSection", label: "Hero Section", icon: /* @__PURE__ */ jsx(Image, { className: "size-4" }), category: "Blocks" },
14626
- { id: "hero-dark-with-image", type: "HeroDarkWithImage", label: "Hero Dark + Image", icon: /* @__PURE__ */ jsx(Image, { className: "size-4" }), category: "Blocks" },
14627
- { id: "centered-hero", type: "CenteredHero", label: "Centered Hero", icon: /* @__PURE__ */ jsx(Image, { className: "size-4" }), category: "Blocks" },
14628
- // Marketing - Social Proof
14629
- { id: "testimonial-carousel", type: "TestimonialCarousel", label: "Testimonial Carousel", icon: /* @__PURE__ */ jsx(MessageSquare, { className: "size-4" }), category: "Blocks" },
14630
- { id: "reviews-grid", type: "ReviewsGrid", label: "Reviews Grid", icon: /* @__PURE__ */ jsx(Star, { className: "size-4" }), category: "Blocks" },
14631
- { id: "social-proof", type: "SocialProof", label: "Social Proof (Logos)", icon: /* @__PURE__ */ jsx(Award, { className: "size-4" }), category: "Blocks" },
14632
- { id: "metrics-section", type: "MetricsSection", label: "Metrics Section", icon: /* @__PURE__ */ jsx(Hash, { className: "size-4" }), category: "Blocks" },
14633
- // Marketing - Features
14634
- { id: "feature-with-image", type: "FeatureWithImage", label: "Feature + Image", icon: /* @__PURE__ */ jsx(Image, { className: "size-4" }), category: "Blocks" },
14635
- { id: "core-values-grid", type: "CoreValuesGrid", label: "Core Values Grid", icon: /* @__PURE__ */ jsx(LayoutGrid, { className: "size-4" }), category: "Blocks" },
14636
- { id: "destination-cards", type: "DestinationCards", label: "Destination Cards", icon: /* @__PURE__ */ jsx(MapPin, { className: "size-4" }), category: "Blocks" },
14637
- // Marketing - Team
14638
- { id: "team-cards-grid", type: "TeamCardsGrid", label: "Team Cards Grid", icon: /* @__PURE__ */ jsx(Users, { className: "size-4" }), category: "Blocks" },
14639
- { id: "team-circular-grid", type: "TeamCircularGrid", label: "Team Circular Grid", icon: /* @__PURE__ */ jsx(Users, { className: "size-4" }), category: "Blocks" },
14640
- // Marketing - CTA & Footer
14641
- { id: "cta-banner", type: "CtaBanner", label: "CTA Banner", icon: /* @__PURE__ */ jsx(Megaphone, { className: "size-4" }), category: "Blocks" },
14642
- { id: "footer-navbar", type: "FooterNavbar", label: "Footer Navbar", icon: /* @__PURE__ */ jsx(Layout, { className: "size-4" }), category: "Blocks" },
14643
- // Marketing - Other
14644
- { id: "featured-news-cards", type: "FeaturedNewsCards", label: "Featured News Cards", icon: /* @__PURE__ */ jsx(Newspaper, { className: "size-4" }), category: "Blocks" },
14645
- { id: "office-locations", type: "OfficeLocations", label: "Office Locations", icon: /* @__PURE__ */ jsx(Building, { className: "size-4" }), category: "Blocks" },
14646
- // Pricing
14647
- { id: "pricing-cards", type: "PricingCards", label: "Pricing Cards", icon: /* @__PURE__ */ jsx(CreditCard, { className: "size-4" }), category: "Blocks" },
14648
- { id: "faq-accordion", type: "FaqAccordion", label: "FAQ Accordion", icon: /* @__PURE__ */ jsx(List, { className: "size-4" }), category: "Blocks" },
14649
- { id: "features-comparison", type: "FeaturesComparison", label: "Features Comparison", icon: /* @__PURE__ */ jsx(Table, { className: "size-4" }), category: "Blocks" },
14650
- // =====================
14651
- // COMPONENTS (UI Primitives)
14652
- // =====================
14653
- { id: "button", type: "Button", label: "Button", icon: /* @__PURE__ */ jsx(Square, { className: "size-4" }), category: "Components" },
14654
- { id: "checkbox", type: "Checkbox", label: "Checkbox", icon: /* @__PURE__ */ jsx(CheckSquare, { className: "size-4" }), category: "Components" },
14655
- { id: "date-input", type: "DateInput", label: "Date Input", icon: /* @__PURE__ */ jsx(Calendar$1, { className: "size-4" }), category: "Components" },
14656
- { id: "input", type: "Input", label: "Text Input", icon: /* @__PURE__ */ jsx(Type, { className: "size-4" }), category: "Components" },
14657
- { id: "select", type: "Select", label: "Select", icon: /* @__PURE__ */ jsx(List, { className: "size-4" }), category: "Components" },
14658
- { id: "switch", type: "Switch", label: "Switch", icon: /* @__PURE__ */ jsx(ToggleLeft, { className: "size-4" }), category: "Components" },
14659
- { id: "radio-group", type: "RadioGroup", label: "Radio Group", icon: /* @__PURE__ */ jsx(CircleDot, { className: "size-4" }), category: "Components" },
14660
- { id: "multiselect-tags", type: "MultiselectTags", label: "Multiselect Tags", icon: /* @__PURE__ */ jsx(Tags, { className: "size-4" }), category: "Components" },
14661
- { id: "avatar", type: "Avatar", label: "Avatar", icon: /* @__PURE__ */ jsx(User, { className: "size-4" }), category: "Components" },
14662
- { id: "badge", type: "Badge", label: "Badge", icon: /* @__PURE__ */ jsx(Award, { className: "size-4" }), category: "Components" }
14663
- ];
14664
- var componentsByCategory = paletteComponents.reduce((acc, comp) => {
14665
- if (!acc[comp.category]) {
14666
- acc[comp.category] = [];
14667
- }
14668
- acc[comp.category].push(comp);
14669
- return acc;
14670
- }, {});
14671
- var categoryOrder = ["Page Templates", "Blocks", "Components"];
14672
- function DraggableComponent({ component }) {
14673
- const [isMounted, setIsMounted] = useState(false);
14674
- const { attributes, listeners, setNodeRef, transform, isDragging } = useDraggable({
14675
- id: component.id,
14676
- data: {
14677
- type: component.type,
14678
- label: component.label
14679
- }
14680
- });
14681
- useEffect(() => {
14682
- setIsMounted(true);
14683
- }, []);
14684
- const style = {
14685
- transform: CSS.Transform.toString(transform),
14686
- opacity: isDragging ? 0.5 : 1
14687
- };
14688
- return /* @__PURE__ */ jsxs(
14689
- "div",
14690
- {
14691
- ref: setNodeRef,
14692
- style,
14693
- ...isMounted ? attributes : {},
14694
- ...isMounted ? listeners : {},
14695
- className: cn(
14696
- "flex items-center gap-3 px-3 py-2.5 rounded-md cursor-grab active:cursor-grabbing",
14697
- "border border-transparent",
14698
- "hover:bg-[var(--canvas-surface)] hover:border-[var(--canvas-border)]",
14699
- "transition-colors group"
14700
- ),
14701
- children: [
14702
- /* @__PURE__ */ jsx(
14703
- "div",
14704
- {
14705
- className: "flex items-center justify-center size-8 rounded-md bg-[var(--canvas-surface-brand)] text-[var(--canvas-primary)]",
14706
- children: component.icon
14707
- }
14708
- ),
14709
- /* @__PURE__ */ jsx(
14710
- "span",
14711
- {
14712
- className: "text-[var(--canvas-text)]",
14713
- style: {
14714
- fontFamily: "var(--typo-body-s-font, var(--typo-global-font))",
14715
- fontSize: "var(--typo-body-s-size)"
14716
- },
14717
- children: component.label
14718
- }
14719
- )
14720
- ]
14721
- }
14722
- );
14723
- }
14724
- function CategorySection({ category, components, defaultExpanded = true }) {
14725
- const [isExpanded, setIsExpanded] = useState(defaultExpanded);
14726
- return /* @__PURE__ */ jsxs("div", { className: "mb-2", children: [
14727
- /* @__PURE__ */ jsxs(
14728
- "button",
14729
- {
14730
- onClick: () => setIsExpanded(!isExpanded),
14731
- className: "cursor-pointer flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-[var(--canvas-surface)] rounded-md transition-colors",
14732
- children: [
14733
- isExpanded ? /* @__PURE__ */ jsx(ChevronDown, { className: "size-4 text-[var(--canvas-text-muted)]" }) : /* @__PURE__ */ jsx(ChevronRight, { className: "size-4 text-[var(--canvas-text-muted)]" }),
14734
- /* @__PURE__ */ jsx(
14735
- "span",
14736
- {
14737
- className: "font-semibold uppercase tracking-wider text-[var(--canvas-text-muted)]",
14738
- style: { fontSize: "var(--typo-body-xs-size)" },
14739
- children: category
14740
- }
14741
- ),
14742
- /* @__PURE__ */ jsx("span", { className: "ml-auto text-[var(--canvas-text-placeholder)]", style: { fontSize: "var(--typo-body-xs-size)" }, children: components.length })
14743
- ]
14744
- }
14745
- ),
14746
- isExpanded && /* @__PURE__ */ jsx("div", { className: "mt-1 ml-2 space-y-0.5", children: components.map((component) => /* @__PURE__ */ jsx(DraggableComponent, { component }, component.id)) })
14747
- ] });
14748
- }
14749
- function ComponentPalette({ className }) {
14750
- return /* @__PURE__ */ jsxs(
14751
- "aside",
14752
- {
14753
- className: cn(
14754
- "w-[280px] h-full flex flex-col",
14755
- "bg-[var(--canvas-background)] border-r border-[var(--canvas-border)]",
14756
- className
14757
- ),
14758
- children: [
14759
- /* @__PURE__ */ jsxs("div", { className: "px-4 py-4 border-b border-[var(--canvas-border)]", children: [
14760
- /* @__PURE__ */ jsx(
14761
- "h2",
14762
- {
14763
- className: "font-semibold text-[var(--canvas-text)]",
14764
- style: {
14765
- fontFamily: "var(--typo-body-m-font, var(--typo-global-font))",
14766
- fontSize: "var(--typo-body-s-size)"
14767
- },
14768
- children: "Components"
14769
- }
14770
- ),
14771
- /* @__PURE__ */ jsx(
14772
- "p",
14773
- {
14774
- className: "text-[var(--canvas-text-muted)] mt-1",
14775
- style: { fontSize: "var(--typo-body-xs-size)" },
14776
- children: "Drag components onto the canvas"
14777
- }
14778
- )
14779
- ] }),
14780
- /* @__PURE__ */ jsx(ScrollArea, { className: "flex-1", children: /* @__PURE__ */ jsx("div", { className: "p-3", children: categoryOrder.map((category) => {
14781
- const components = componentsByCategory[category];
14782
- if (!components) return null;
14783
- return /* @__PURE__ */ jsx(
14784
- CategorySection,
14785
- {
14786
- category,
14787
- components,
14788
- defaultExpanded: category !== "Page Templates"
14789
- },
14790
- category
14791
- );
14792
- }) }) }),
14793
- /* @__PURE__ */ jsx("div", { className: "px-4 py-3 border-t border-[var(--canvas-border)] bg-[var(--canvas-surface)]", children: /* @__PURE__ */ jsxs("p", { className: "text-[var(--canvas-text-placeholder)]", style: { fontSize: "var(--typo-body-xs-size)" }, children: [
14794
- "Tip: Press ",
14795
- /* @__PURE__ */ jsx("kbd", { className: "px-1.5 py-0.5 bg-[var(--canvas-background)] rounded border border-[var(--canvas-border)]", style: { fontSize: "10px" }, children: "Delete" }),
14796
- " to remove selected"
14797
- ] }) })
14798
- ]
14799
- }
14800
- );
14801
- }
14802
14522
 
14803
14523
  // src/lib/component-registry.ts
14804
14524
  var layoutShells = {
@@ -15053,8 +14773,8 @@ var blocks = {
15053
14773
  },
15054
14774
  ContentDropzone: {
15055
14775
  path: "@/components/blocks",
15056
- description: "Placeholder dropzone for content areas during development.",
15057
- props: ["label?", "className?"]
14776
+ description: "Placeholder dropzone for content areas. Shows dashed placeholder when empty; arranges children in a flex column with 32px (--spacing-4xl) gap between blocks. Within a block, use 12px (--spacing-lg) gap between title groups and their content.",
14777
+ props: ["height?", "className?", "children?"]
15058
14778
  },
15059
14779
  UpvotingPostsTable: {
15060
14780
  path: "@/components/blocks",
@@ -15175,23 +14895,6 @@ var groupModalDrawerBlocks = {
15175
14895
  props: ["title?", "description?", "rows?: FormRowConfig[]", "sortOptions?", "filterOptions?", "inputSize?: 'sm' | 'default' | 'lg'", "onAddNew?", "onCancel?", "onSave?", "onFieldChange?", "showHeader?", "showFooter?"]
15176
14896
  }
15177
14897
  };
15178
- var canvasBlocks = {
15179
- InfinityCanvas: {
15180
- path: "@/components/blocks",
15181
- description: "Pannable, zoomable infinite canvas for placing components. Supports drag-and-drop from palette.",
15182
- props: ["items: CanvasItemData[]", "onItemsChange", "selectedId", "onSelectItem"]
15183
- },
15184
- ComponentPalette: {
15185
- path: "@/components/blocks",
15186
- description: "Sidebar listing draggable components grouped by category. Used with InfinityCanvas.",
15187
- props: ["className?"]
15188
- },
15189
- CanvasItem: {
15190
- path: "@/components/blocks",
15191
- description: "Wrapper for components placed on the infinity canvas. Handles positioning and selection.",
15192
- props: ["item: CanvasItemData", "isSelected", "onSelect", "onDelete", "children"]
15193
- }
15194
- };
15195
14898
  var videoBlocks = {
15196
14899
  VideoChatControls: {
15197
14900
  path: "@/components/blocks",
@@ -15465,12 +15168,6 @@ var pageTemplates = {
15465
15168
  description: "Video content page with player and playlist sidebar.",
15466
15169
  shell: "custom (no shell)",
15467
15170
  blocks: ["VideoContentSection", "VideoPlaylist", "YouTubePlayer"]
15468
- },
15469
- "page-canvas": {
15470
- path: "/page-canvas",
15471
- description: "Figma-style infinite canvas whiteboard. Drag components from sidebar palette onto a pannable, zoomable canvas.",
15472
- shell: "custom (no shell)",
15473
- blocks: ["InfinityCanvas", "ComponentPalette", "CanvasItem", "Header"]
15474
15171
  }
15475
15172
  };
15476
15173
  function buildComponentOptions() {
@@ -16411,7 +16108,7 @@ function StarRating3({ rating }) {
16411
16108
  className: "flex items-center",
16412
16109
  style: { gap: "var(--spacing-xxs, 2px)" },
16413
16110
  children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsx(
16414
- Star,
16111
+ Star$1,
16415
16112
  {
16416
16113
  className: "size-5",
16417
16114
  fill: star <= rating ? "var(--canvas-primary)" : "var(--canvas-border)",
@@ -16804,7 +16501,7 @@ function ProfileTileCard({ item, onClick }) {
16804
16501
  style: { gap: "4px" },
16805
16502
  children: [
16806
16503
  /* @__PURE__ */ jsx(
16807
- Star,
16504
+ Star$1,
16808
16505
  {
16809
16506
  className: "w-5 h-5",
16810
16507
  style: { color: "var(--canvas-primary)", fill: "var(--canvas-primary)" }
@@ -20876,7 +20573,7 @@ function FeaturedPlaces() {
20876
20573
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mt-6", children: [
20877
20574
  /* @__PURE__ */ jsx(Typography, { variant: "body-xl", as: "h3", style: { fontWeight: 600 }, children: place.name }),
20878
20575
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
20879
- /* @__PURE__ */ jsx(Star$1, { size: 16, weight: "fill", style: { color: "var(--canvas-primary)" } }),
20576
+ /* @__PURE__ */ jsx(Star, { size: 16, weight: "fill", style: { color: "var(--canvas-primary)" } }),
20880
20577
  /* @__PURE__ */ jsx(Typography, { variant: "body-s", as: "span", children: place.rating })
20881
20578
  ] })
20882
20579
  ] }),
@@ -20963,7 +20660,7 @@ function HowItWorks({ variant = "light", features = defaultFeatures }) {
20963
20660
  }
20964
20661
  var defaultCategories = [
20965
20662
  { id: "1", title: "Most popular", count: "5,000 homes", icon: /* @__PURE__ */ jsx(Heart, { size: 48 }) },
20966
- { id: "2", title: "Top rated", count: "5,000 homes", icon: /* @__PURE__ */ jsx(Star$1, { size: 48 }) },
20663
+ { id: "2", title: "Top rated", count: "5,000 homes", icon: /* @__PURE__ */ jsx(Star, { size: 48 }) },
20967
20664
  { id: "3", title: "Unique stays", count: "5,000 homes", icon: /* @__PURE__ */ jsx(Sun, { size: 48 }) },
20968
20665
  { id: "4", title: "Affordable", count: "5,000 homes", icon: /* @__PURE__ */ jsx(CurrencyDollar, { size: 48 }) },
20969
20666
  { id: "5", title: "Friendly staff", count: "5,000 homes", icon: /* @__PURE__ */ jsx(Smiley, { size: 48 }) },
@@ -21150,7 +20847,7 @@ var defaultSteps2 = [
21150
20847
  id: "4",
21151
20848
  title: "Share your experience",
21152
20849
  description: "Leave a review for the property and host for other users to see",
21153
- icon: /* @__PURE__ */ jsx(Star$1, { size: 24 })
20850
+ icon: /* @__PURE__ */ jsx(Star, { size: 24 })
21154
20851
  }
21155
20852
  ];
21156
20853
  function VerticalHowItWorks({
@@ -23307,7 +23004,17 @@ var brandColorVars = [
23307
23004
  "--canvas-sidebar-dark-active-bg",
23308
23005
  "--canvas-sidebar-dark-text",
23309
23006
  "--canvas-sidebar-dark-border",
23310
- "--canvas-border-input-focus"
23007
+ "--canvas-border-input-focus",
23008
+ // Button colors that track primary
23009
+ "--btn-primary-bg",
23010
+ "--btn-primary-border",
23011
+ "--btn-primary-bg-hover",
23012
+ "--btn-primary-border-hover",
23013
+ "--btn-primary-outline-text",
23014
+ "--btn-primary-outline-border",
23015
+ "--btn-primary-outline-text-hover",
23016
+ "--btn-primary-outline-border-hover",
23017
+ "--btn-primary-neutral-bg-hover"
23311
23018
  ];
23312
23019
  function isEqual(a, b) {
23313
23020
  if (a === b) return true;
@@ -23640,11 +23347,17 @@ function useThemeState(options) {
23640
23347
  setOverrides((prev) => {
23641
23348
  const effectivePrimaryColor = newValues["--canvas-primary"] || prev["--canvas-primary"] || defaultColors["--canvas-primary"];
23642
23349
  varsToUpdate.forEach((varName) => {
23643
- if (varName === "--canvas-sidebar-light-active-text" || varName === "--canvas-border-input-focus") {
23350
+ if (varName === "--canvas-sidebar-light-active-text" || varName === "--canvas-border-input-focus" || varName === "--btn-primary-bg" || varName === "--btn-primary-border" || varName === "--btn-primary-outline-text" || varName === "--btn-primary-outline-border" || varName === "--btn-primary-outline-text-hover" || varName === "--btn-primary-outline-border-hover" || varName === "--btn-primary-neutral-bg-hover") {
23644
23351
  newValues[varName] = effectivePrimaryColor;
23645
23352
  (document.body ?? document.documentElement).style.setProperty(varName, effectivePrimaryColor);
23646
23353
  return;
23647
23354
  }
23355
+ if (varName === "--btn-primary-bg-hover" || varName === "--btn-primary-border-hover") {
23356
+ const primaryDarkColor = newValues["--canvas-primary-dark"] || prev["--canvas-primary-dark"] || defaultColors["--canvas-primary-dark"];
23357
+ newValues[varName] = primaryDarkColor;
23358
+ (document.body ?? document.documentElement).style.setProperty(varName, primaryDarkColor);
23359
+ return;
23360
+ }
23648
23361
  if (varName === "--canvas-primary") return;
23649
23362
  const defaultColor = defaultColors[varName];
23650
23363
  if (!defaultColor || !defaultColor.startsWith("#")) return;
@@ -23693,6 +23406,9 @@ function useThemeState(options) {
23693
23406
  const isDirty = useMemo(() => {
23694
23407
  return !isEqual(overrides, savedOverrides) || !isEqual(branding, savedBranding) || !isEqual(images, savedImages) || !isEqual(customButtonStyles, savedCustomButtonStyles);
23695
23408
  }, [overrides, savedOverrides, branding, savedBranding, images, savedImages, customButtonStyles, savedCustomButtonStyles]);
23409
+ const hasCustomizations = useMemo(() => {
23410
+ return Object.keys(savedOverrides).length > 0 || !isEqual(savedBranding, defaultBranding) || !isEqual(savedImages, defaultImages) || !isEqual(savedCustomButtonStyles, defaultCustomButtonStyles);
23411
+ }, [savedOverrides, savedBranding, savedImages, savedCustomButtonStyles]);
23696
23412
  const unsavedChangesCount = useMemo(() => {
23697
23413
  let count = 0;
23698
23414
  const allKeys = /* @__PURE__ */ new Set([...Object.keys(overrides), ...Object.keys(savedOverrides)]);
@@ -23732,7 +23448,8 @@ function useThemeState(options) {
23732
23448
  setBrandHue,
23733
23449
  setBrandVibrancy,
23734
23450
  setSyncRelatedColors,
23735
- applyBrandHueVibrancy
23451
+ applyBrandHueVibrancy,
23452
+ hasCustomizations
23736
23453
  };
23737
23454
  }
23738
23455
  function HslColorPicker({ value, onChange }) {
@@ -24010,7 +23727,6 @@ function ColorInputRow({
24010
23727
  {
24011
23728
  className: "w-auto p-0",
24012
23729
  align: "start",
24013
- onPointerDownOutside: (e) => e.preventDefault(),
24014
23730
  children: /* @__PURE__ */ jsx(HslColorPicker, { value, onChange })
24015
23731
  }
24016
23732
  )
@@ -24109,7 +23825,6 @@ function VariableColorRow({
24109
23825
  {
24110
23826
  className: "w-auto p-0",
24111
23827
  align: "start",
24112
- onPointerDownOutside: (e) => e.preventDefault(),
24113
23828
  children: /* @__PURE__ */ jsx(
24114
23829
  HslColorPicker,
24115
23830
  {
@@ -24251,7 +23966,6 @@ function ColorsPanel({ theme }) {
24251
23966
  {
24252
23967
  style: {
24253
23968
  padding: "12px",
24254
- background: "#f9fafb",
24255
23969
  borderRadius: "8px",
24256
23970
  border: "1px solid #e5e7eb"
24257
23971
  },
@@ -24447,7 +24161,7 @@ function ColorsPanel({ theme }) {
24447
24161
  var logoIcons = [
24448
24162
  { name: "Diamond", icon: Diamond },
24449
24163
  { name: "Hexagon", icon: Hexagon },
24450
- { name: "Star", icon: Star$1 },
24164
+ { name: "Star", icon: Star },
24451
24165
  { name: "Lightning", icon: Lightning },
24452
24166
  { name: "Sparkle", icon: Sparkle },
24453
24167
  { name: "Infinity", icon: Infinity },
@@ -24477,7 +24191,7 @@ var logoIcons = [
24477
24191
  { name: "ChatCircle", icon: ChatCircle },
24478
24192
  { name: "Envelope", icon: Envelope },
24479
24193
  { name: "Phone", icon: Phone$1 },
24480
- { name: "Megaphone", icon: Megaphone$1 },
24194
+ { name: "Megaphone", icon: Megaphone },
24481
24195
  { name: "Heart", icon: Heart },
24482
24196
  { name: "Shield", icon: Shield },
24483
24197
  { name: "Trophy", icon: Trophy },
@@ -24537,7 +24251,6 @@ function ImagesPanel({ theme, onImageUpload }) {
24537
24251
  gap: "12px",
24538
24252
  marginBottom: "16px",
24539
24253
  padding: "16px",
24540
- background: "#f9fafb",
24541
24254
  borderRadius: "8px",
24542
24255
  border: "1px solid #e5e7eb"
24543
24256
  },
@@ -24690,7 +24403,10 @@ function ImagesPanel({ theme, onImageUpload }) {
24690
24403
  style: {
24691
24404
  display: "grid",
24692
24405
  gridTemplateColumns: "repeat(8, 1fr)",
24693
- gap: "4px"
24406
+ gap: "4px",
24407
+ border: "1px solid #e5e7eb",
24408
+ borderRadius: "8px",
24409
+ padding: "6px"
24694
24410
  },
24695
24411
  children: logoIcons.map((icon) => {
24696
24412
  const isSelected = theme.branding.iconName === icon.name;
@@ -24816,7 +24532,6 @@ function ImageUploadRow({
24816
24532
  alignItems: "center",
24817
24533
  gap: "10px",
24818
24534
  padding: "8px 10px",
24819
- background: "#f9fafb",
24820
24535
  borderRadius: "6px",
24821
24536
  border: "1px solid #e5e7eb"
24822
24537
  },
@@ -24982,7 +24697,7 @@ function TypographyPanel({ theme }) {
24982
24697
  }, []);
24983
24698
  const globalFont = theme.variables["--typo-global-font"] || "Inter";
24984
24699
  return /* @__PURE__ */ jsxs("div", { "data-theme-drawer-panel": true, className: "p-4", children: [
24985
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between p-3 bg-[var(--canvas-surface)] rounded-lg border border-[var(--canvas-border)] mb-5", children: [
24700
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between p-3 rounded-lg border border-[var(--canvas-border)] mb-5", children: [
24986
24701
  /* @__PURE__ */ jsxs("div", { children: [
24987
24702
  /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold text-[var(--canvas-text)]", children: "Global Font" }),
24988
24703
  /* @__PURE__ */ jsx("div", { className: "text-[11px] text-[var(--canvas-text-muted)] mt-0.5", children: "Default font for all text styles" })
@@ -26043,12 +25758,9 @@ var drawerStyles = {
26043
25758
  },
26044
25759
  tabBar: {
26045
25760
  display: "flex",
26046
- background: "#f2f2f2",
26047
- padding: "3px",
26048
- gap: "2px",
25761
+ gap: "8px",
26049
25762
  flexShrink: 0,
26050
25763
  overflowX: "auto",
26051
- borderRadius: "8px",
26052
25764
  margin: "0 16px 8px"
26053
25765
  },
26054
25766
  tab: (active) => ({
@@ -26056,7 +25768,7 @@ var drawerStyles = {
26056
25768
  fontSize: "12px",
26057
25769
  fontWeight: 500,
26058
25770
  color: active ? "#ffffff" : "#6b7280",
26059
- background: active ? "#171717" : "transparent",
25771
+ background: active ? "#171717" : "#f3f4f6",
26060
25772
  border: "none",
26061
25773
  borderRadius: "6px",
26062
25774
  cursor: "pointer",
@@ -26112,7 +25824,11 @@ function ThemeDrawer({
26112
25824
  storageKey,
26113
25825
  title = "Design Variables",
26114
25826
  width = 464,
26115
- readOnly = false
25827
+ readOnly = false,
25828
+ hideSave = false,
25829
+ docked = false,
25830
+ stickyTopOffset = 0,
25831
+ children
26116
25832
  }) {
26117
25833
  if (devOnly && process.env.NODE_ENV === "production") {
26118
25834
  return null;
@@ -26120,6 +25836,8 @@ function ThemeDrawer({
26120
25836
  const [open, setOpen] = useState(defaultOpen);
26121
25837
  const [activeTab, setActiveTab] = useState("colors");
26122
25838
  const [resetConfirmOpen, setResetConfirmOpen] = useState(false);
25839
+ const [localPreviewBranding, setLocalPreviewBranding] = useState(null);
25840
+ const [localPreviewImages, setLocalPreviewImages] = useState(null);
26123
25841
  const isRight = triggerPosition === "bottom-right";
26124
25842
  const [dragPos, setDragPos] = useState({ x: 20, y: 20 });
26125
25843
  const isDraggingRef = useRef(false);
@@ -26158,6 +25876,8 @@ function ThemeDrawer({
26158
25876
  },
26159
25877
  []
26160
25878
  );
25879
+ const contentRef = useRef(null);
25880
+ const prevOverrideKeysRef = useRef(/* @__PURE__ */ new Set());
26161
25881
  const theme = useThemeState({
26162
25882
  storageKey,
26163
25883
  initialOverrides,
@@ -26173,13 +25893,21 @@ function ThemeDrawer({
26173
25893
  useEffect(() => {
26174
25894
  if (open) {
26175
25895
  setPreviewBranding(theme.branding);
25896
+ setLocalPreviewBranding(theme.branding);
26176
25897
  }
26177
25898
  }, [open, theme.branding, setPreviewBranding]);
26178
25899
  useEffect(() => {
26179
25900
  if (open) {
26180
25901
  setPreviewImages(theme.images);
25902
+ setLocalPreviewImages(theme.images);
26181
25903
  }
26182
25904
  }, [open, theme.images, setPreviewImages]);
25905
+ useEffect(() => {
25906
+ broadcastBranding(open ? theme.branding : null);
25907
+ }, [open, theme.branding]);
25908
+ useEffect(() => {
25909
+ broadcastImages(open ? theme.images : null);
25910
+ }, [open, theme.images]);
26183
25911
  const handleOpenChange = useCallback(
26184
25912
  (newOpen) => {
26185
25913
  if (!newOpen) {
@@ -26188,6 +25916,8 @@ function ThemeDrawer({
26188
25916
  }
26189
25917
  setPreviewBranding(null);
26190
25918
  setPreviewImages(null);
25919
+ setLocalPreviewBranding(null);
25920
+ setLocalPreviewImages(null);
26191
25921
  setResetConfirmOpen(false);
26192
25922
  }
26193
25923
  setOpen(newOpen);
@@ -26204,76 +25934,401 @@ function ThemeDrawer({
26204
25934
  theme.resetAll();
26205
25935
  setPreviewBranding(null);
26206
25936
  setPreviewImages(null);
25937
+ setLocalPreviewBranding(null);
25938
+ setLocalPreviewImages(null);
26207
25939
  setResetConfirmOpen(false);
26208
25940
  }, [theme, setPreviewBranding, setPreviewImages]);
26209
25941
  const activePanels = enabledPanels ? panelConfig.filter((p) => enabledPanels.includes(p.id)) : panelConfig;
26210
- const showFooter = !readOnly && (theme.isDirty || resetConfirmOpen);
26211
- return /* @__PURE__ */ jsxs(Fragment, { children: [
26212
- !open && /* @__PURE__ */ jsxs(
25942
+ const showFooter = !readOnly && (!hideSave && theme.isDirty || resetConfirmOpen || theme.hasCustomizations);
25943
+ useEffect(() => {
25944
+ if (!docked || !open) return;
25945
+ const handleEscape = (e) => {
25946
+ if (e.key === "Escape") {
25947
+ handleOpenChange(false);
25948
+ }
25949
+ };
25950
+ document.addEventListener("keydown", handleEscape);
25951
+ return () => document.removeEventListener("keydown", handleEscape);
25952
+ }, [docked, open, handleOpenChange]);
25953
+ useLayoutEffect(() => {
25954
+ const el = contentRef.current;
25955
+ if (!el) return;
25956
+ const currentKeys = new Set(Object.keys(theme.overrides));
25957
+ prevOverrideKeysRef.current.forEach((key) => {
25958
+ if (!currentKeys.has(key)) {
25959
+ const defaultValue = theme.variables[key];
25960
+ if (defaultValue) {
25961
+ el.style.setProperty(key, defaultValue);
25962
+ } else {
25963
+ el.style.removeProperty(key);
25964
+ }
25965
+ }
25966
+ });
25967
+ Object.entries(theme.overrides).forEach(([name, value]) => {
25968
+ el.style.setProperty(name, value);
25969
+ });
25970
+ prevOverrideKeysRef.current = currentKeys;
25971
+ }, [theme.overrides, theme.variables]);
25972
+ const scrollHeight = docked ? `calc(100vh - ${stickyTopOffset}px - ${showFooter ? 200 : 150}px)` : `calc(100vh - ${showFooter ? 200 : 150}px)`;
25973
+ const tabBar = /* @__PURE__ */ jsx("div", { style: drawerStyles.tabBar, children: activePanels.map((panel) => {
25974
+ const isActive = activeTab === panel.id;
25975
+ return /* @__PURE__ */ jsx(
25976
+ "button",
25977
+ {
25978
+ onClick: () => setActiveTab(panel.id),
25979
+ style: drawerStyles.tab(isActive),
25980
+ onMouseEnter: (e) => {
25981
+ if (!isActive) {
25982
+ e.currentTarget.style.background = "#e5e7eb";
25983
+ }
25984
+ },
25985
+ onMouseLeave: (e) => {
25986
+ if (!isActive) {
25987
+ e.currentTarget.style.background = "#f3f4f6";
25988
+ }
25989
+ },
25990
+ children: panel.label
25991
+ },
25992
+ panel.id
25993
+ );
25994
+ }) });
25995
+ const panelContent = /* @__PURE__ */ jsx(
25996
+ ScrollArea,
25997
+ {
25998
+ className: "flex-1 overflow-hidden",
25999
+ style: { height: scrollHeight },
26000
+ children: /* @__PURE__ */ jsxs("div", { style: drawerStyles.container, children: [
26001
+ activeTab === "colors" && /* @__PURE__ */ jsx(ColorsPanel, { theme }),
26002
+ activeTab === "images" && /* @__PURE__ */ jsx(ImagesPanel, { theme, onImageUpload }),
26003
+ activeTab === "typography" && /* @__PURE__ */ jsx(TypographyPanel, { theme }),
26004
+ activeTab === "buttons" && /* @__PURE__ */ jsx(ButtonsPanel, { theme }),
26005
+ activeTab === "inputs" && /* @__PURE__ */ jsx(InputsPanel, { theme }),
26006
+ activeTab === "export" && /* @__PURE__ */ jsx(ExportPanel, { theme })
26007
+ ] })
26008
+ }
26009
+ );
26010
+ const footerContent = showFooter ? /* @__PURE__ */ jsx("div", { style: drawerStyles.footer, children: resetConfirmOpen ? /* @__PURE__ */ jsxs(
26011
+ "div",
26012
+ {
26013
+ style: {
26014
+ display: "flex",
26015
+ flexDirection: "column",
26016
+ gap: "8px",
26017
+ width: "100%"
26018
+ },
26019
+ children: [
26020
+ /* @__PURE__ */ jsx(
26021
+ "span",
26022
+ {
26023
+ style: {
26024
+ fontSize: "13px",
26025
+ color: "#374151",
26026
+ textAlign: "center"
26027
+ },
26028
+ children: "Reset all settings to defaults?"
26029
+ }
26030
+ ),
26031
+ /* @__PURE__ */ jsxs(
26032
+ "div",
26033
+ {
26034
+ style: {
26035
+ display: "flex",
26036
+ gap: "8px",
26037
+ justifyContent: "center"
26038
+ },
26039
+ children: [
26040
+ /* @__PURE__ */ jsx(
26041
+ "button",
26042
+ {
26043
+ onClick: () => setResetConfirmOpen(false),
26044
+ style: {
26045
+ fontSize: "13px",
26046
+ fontWeight: 500,
26047
+ color: "#374151",
26048
+ background: "#ffffff",
26049
+ border: "1px solid #e5e7eb",
26050
+ cursor: "pointer",
26051
+ padding: "6px 16px",
26052
+ borderRadius: "6px"
26053
+ },
26054
+ children: "Cancel"
26055
+ }
26056
+ ),
26057
+ /* @__PURE__ */ jsx(
26058
+ "button",
26059
+ {
26060
+ onClick: handleReset,
26061
+ style: {
26062
+ fontSize: "13px",
26063
+ fontWeight: 500,
26064
+ color: "#ffffff",
26065
+ background: "#dc2626",
26066
+ border: "1px solid #dc2626",
26067
+ cursor: "pointer",
26068
+ padding: "6px 16px",
26069
+ borderRadius: "6px"
26070
+ },
26071
+ children: "Reset All"
26072
+ }
26073
+ )
26074
+ ]
26075
+ }
26076
+ )
26077
+ ]
26078
+ }
26079
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
26080
+ !hideSave && theme.isDirty && /* @__PURE__ */ jsxs(
26213
26081
  "div",
26214
26082
  {
26215
26083
  style: {
26216
- position: "fixed",
26217
- bottom: `${dragPos.y}px`,
26218
- ...isRight ? { right: `${dragPos.x}px` } : { left: `${dragPos.x}px` },
26219
- zIndex: 9999,
26220
26084
  display: "flex",
26221
- alignItems: "center",
26222
- gap: "0"
26085
+ gap: "8px",
26086
+ width: "100%"
26223
26087
  },
26224
26088
  children: [
26225
26089
  /* @__PURE__ */ jsx(
26226
- "div",
26090
+ "button",
26227
26091
  {
26228
- onPointerDown: handleDragPointerDown,
26229
- onPointerMove: handleDragPointerMove,
26230
- onPointerUp: handleDragPointerUp,
26092
+ onClick: handleDiscard,
26231
26093
  style: {
26232
- cursor: "grab",
26233
- padding: "4px 2px",
26234
- display: "flex",
26235
- alignItems: "center",
26236
- opacity: 0.25,
26237
- touchAction: "none"
26094
+ flex: 1,
26095
+ fontSize: "13px",
26096
+ fontWeight: 500,
26097
+ color: "#374151",
26098
+ background: "#ffffff",
26099
+ border: "1px solid #e5e7eb",
26100
+ cursor: "pointer",
26101
+ padding: "8px 16px",
26102
+ borderRadius: "6px"
26238
26103
  },
26239
- children: /* @__PURE__ */ jsx(GripVertical, { size: 12, color: "#9ca3af" })
26104
+ children: "Discard"
26240
26105
  }
26241
26106
  ),
26242
26107
  /* @__PURE__ */ jsx(
26243
26108
  "button",
26244
26109
  {
26245
- onClick: () => setOpen(true),
26110
+ onClick: handleSave,
26246
26111
  style: {
26247
- width: "36px",
26248
- height: "36px",
26249
- borderRadius: "10px",
26250
- background: "#ffffff",
26251
- color: "#6b7280",
26252
- border: "1px solid #e5e7eb",
26112
+ flex: 1,
26113
+ fontSize: "13px",
26114
+ fontWeight: 600,
26115
+ color: "#ffffff",
26116
+ background: "#1f2937",
26117
+ border: "1px solid #1f2937",
26253
26118
  cursor: "pointer",
26254
- display: "flex",
26255
- alignItems: "center",
26256
- justifyContent: "center",
26257
- boxShadow: "0 1px 3px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.06)",
26258
- transition: "transform 150ms, box-shadow 150ms, border-color 150ms"
26259
- },
26260
- onMouseEnter: (e) => {
26261
- e.currentTarget.style.transform = "scale(1.06)";
26262
- e.currentTarget.style.boxShadow = "0 4px 6px rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.06)";
26263
- e.currentTarget.style.borderColor = "#d1d5db";
26119
+ padding: "8px 16px",
26120
+ borderRadius: "6px"
26264
26121
  },
26265
- onMouseLeave: (e) => {
26266
- e.currentTarget.style.transform = "scale(1)";
26267
- e.currentTarget.style.boxShadow = "0 1px 3px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.06)";
26268
- e.currentTarget.style.borderColor = "#e5e7eb";
26269
- },
26270
- "aria-label": "Open theme editor",
26271
- children: /* @__PURE__ */ jsx(PaletteIcon6, {})
26122
+ children: "Save"
26272
26123
  }
26273
26124
  )
26274
26125
  ]
26275
26126
  }
26276
26127
  ),
26128
+ /* @__PURE__ */ jsx(
26129
+ "button",
26130
+ {
26131
+ onClick: () => setResetConfirmOpen(true),
26132
+ style: {
26133
+ fontSize: "12px",
26134
+ fontWeight: 400,
26135
+ color: "#9ca3af",
26136
+ background: "none",
26137
+ border: "none",
26138
+ cursor: "pointer",
26139
+ padding: "2px 0",
26140
+ textAlign: "center",
26141
+ textDecoration: "underline",
26142
+ textUnderlineOffset: "2px"
26143
+ },
26144
+ children: "Reset all to defaults"
26145
+ }
26146
+ )
26147
+ ] }) }) : null;
26148
+ const headerBlock = /* @__PURE__ */ jsxs("div", { style: { padding: "16px 0 0" }, children: [
26149
+ /* @__PURE__ */ jsx(
26150
+ "div",
26151
+ {
26152
+ style: {
26153
+ fontSize: "16px",
26154
+ fontWeight: 700,
26155
+ color: "#1f2937",
26156
+ fontFamily: drawerStyles.container.fontFamily
26157
+ },
26158
+ children: title
26159
+ }
26160
+ ),
26161
+ /* @__PURE__ */ jsx(
26162
+ "div",
26163
+ {
26164
+ style: {
26165
+ fontSize: "13px",
26166
+ color: "#6b7280",
26167
+ marginTop: "2px",
26168
+ marginBottom: "12px",
26169
+ fontFamily: drawerStyles.container.fontFamily
26170
+ },
26171
+ children: theme.unsavedChangesCount > 0 ? `${theme.unsavedChangesCount} unsaved change${theme.unsavedChangesCount !== 1 ? "s" : ""}` : "Customize your design system"
26172
+ }
26173
+ )
26174
+ ] });
26175
+ const triggerButton = !open && /* @__PURE__ */ jsxs(
26176
+ "div",
26177
+ {
26178
+ style: {
26179
+ position: "fixed",
26180
+ bottom: `${dragPos.y}px`,
26181
+ ...isRight ? { right: `${dragPos.x}px` } : { left: `${dragPos.x}px` },
26182
+ zIndex: 9999,
26183
+ display: "flex",
26184
+ alignItems: "center",
26185
+ gap: "0"
26186
+ },
26187
+ children: [
26188
+ /* @__PURE__ */ jsx(
26189
+ "div",
26190
+ {
26191
+ onPointerDown: handleDragPointerDown,
26192
+ onPointerMove: handleDragPointerMove,
26193
+ onPointerUp: handleDragPointerUp,
26194
+ style: {
26195
+ cursor: "grab",
26196
+ padding: "4px 2px",
26197
+ display: "flex",
26198
+ alignItems: "center",
26199
+ opacity: 0.25,
26200
+ touchAction: "none"
26201
+ },
26202
+ children: /* @__PURE__ */ jsx(GripVertical, { size: 12, color: "#9ca3af" })
26203
+ }
26204
+ ),
26205
+ /* @__PURE__ */ jsx(
26206
+ "button",
26207
+ {
26208
+ onClick: () => setOpen(true),
26209
+ style: {
26210
+ width: "36px",
26211
+ height: "36px",
26212
+ borderRadius: "10px",
26213
+ background: "#ffffff",
26214
+ color: "#6b7280",
26215
+ border: "1px solid #e5e7eb",
26216
+ cursor: "pointer",
26217
+ display: "flex",
26218
+ alignItems: "center",
26219
+ justifyContent: "center",
26220
+ boxShadow: "0 1px 3px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.06)",
26221
+ transition: "transform 150ms, box-shadow 150ms, border-color 150ms"
26222
+ },
26223
+ onMouseEnter: (e) => {
26224
+ e.currentTarget.style.transform = "scale(1.06)";
26225
+ e.currentTarget.style.boxShadow = "0 4px 6px rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.06)";
26226
+ e.currentTarget.style.borderColor = "#d1d5db";
26227
+ },
26228
+ onMouseLeave: (e) => {
26229
+ e.currentTarget.style.transform = "scale(1)";
26230
+ e.currentTarget.style.boxShadow = "0 1px 3px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.06)";
26231
+ e.currentTarget.style.borderColor = "#e5e7eb";
26232
+ },
26233
+ "aria-label": "Open theme editor",
26234
+ children: /* @__PURE__ */ jsx(PaletteIcon6, {})
26235
+ }
26236
+ )
26237
+ ]
26238
+ }
26239
+ );
26240
+ const dockedAside = /* @__PURE__ */ jsx(
26241
+ "aside",
26242
+ {
26243
+ "data-theme-drawer": true,
26244
+ style: {
26245
+ width: open ? `${width}px` : "0px",
26246
+ transition: "width 300ms cubic-bezier(0.4, 0, 0.2, 1)",
26247
+ overflow: "hidden",
26248
+ flexShrink: 0
26249
+ },
26250
+ children: /* @__PURE__ */ jsxs(
26251
+ "div",
26252
+ {
26253
+ style: {
26254
+ width: `${width}px`,
26255
+ height: `calc(100vh - ${stickyTopOffset}px)`,
26256
+ position: "sticky",
26257
+ top: `${stickyTopOffset}px`,
26258
+ display: "flex",
26259
+ flexDirection: "column",
26260
+ borderLeft: "1px solid #e5e7eb",
26261
+ background: "#ffffff",
26262
+ ...drawerStyles.container
26263
+ },
26264
+ children: [
26265
+ /* @__PURE__ */ jsx(
26266
+ "button",
26267
+ {
26268
+ onClick: () => handleOpenChange(false),
26269
+ style: {
26270
+ position: "absolute",
26271
+ top: 16,
26272
+ right: 16,
26273
+ width: 24,
26274
+ height: 24,
26275
+ display: "flex",
26276
+ alignItems: "center",
26277
+ justifyContent: "center",
26278
+ background: "transparent",
26279
+ border: "none",
26280
+ cursor: "pointer",
26281
+ opacity: 0.5,
26282
+ transition: "opacity 150ms",
26283
+ zIndex: 10
26284
+ },
26285
+ onMouseEnter: (e) => {
26286
+ e.currentTarget.style.opacity = "1";
26287
+ },
26288
+ onMouseLeave: (e) => {
26289
+ e.currentTarget.style.opacity = "0.5";
26290
+ },
26291
+ "aria-label": "Close theme editor",
26292
+ children: /* @__PURE__ */ jsx(PanelRightClose, { size: 16, color: "#6b7280" })
26293
+ }
26294
+ ),
26295
+ /* @__PURE__ */ jsx("div", { style: { padding: "16px 16px 12px", background: "#ffffff" }, children: headerBlock }),
26296
+ tabBar,
26297
+ panelContent,
26298
+ footerContent
26299
+ ]
26300
+ }
26301
+ )
26302
+ }
26303
+ );
26304
+ if (docked && children) {
26305
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
26306
+ triggerButton,
26307
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", minHeight: "100vh" }, children: [
26308
+ /* @__PURE__ */ jsx(
26309
+ PreviewBrandingContext.Provider,
26310
+ {
26311
+ value: {
26312
+ previewBranding: localPreviewBranding,
26313
+ setPreviewBranding: setLocalPreviewBranding,
26314
+ previewImages: localPreviewImages,
26315
+ setPreviewImages: setLocalPreviewImages
26316
+ },
26317
+ children: /* @__PURE__ */ jsx("div", { ref: contentRef, style: { flex: 1, minWidth: 0, overflow: "auto", transform: "translateZ(0)" }, children })
26318
+ }
26319
+ ),
26320
+ dockedAside
26321
+ ] })
26322
+ ] });
26323
+ }
26324
+ if (docked) {
26325
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
26326
+ triggerButton,
26327
+ dockedAside
26328
+ ] });
26329
+ }
26330
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
26331
+ triggerButton,
26277
26332
  /* @__PURE__ */ jsx(Sheet, { open, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxs(
26278
26333
  SheetContent,
26279
26334
  {
@@ -26286,7 +26341,7 @@ function ThemeDrawer({
26286
26341
  maxWidth: `${width}px`
26287
26342
  },
26288
26343
  children: [
26289
- /* @__PURE__ */ jsx(
26344
+ /* @__PURE__ */ jsxs(
26290
26345
  SheetHeader,
26291
26346
  {
26292
26347
  className: "!p-0",
@@ -26294,197 +26349,16 @@ function ThemeDrawer({
26294
26349
  padding: "16px 16px 12px",
26295
26350
  background: "#ffffff"
26296
26351
  },
26297
- children: /* @__PURE__ */ jsxs("div", { style: { padding: "16px 16px 0" }, children: [
26298
- /* @__PURE__ */ jsx(
26299
- SheetTitle,
26300
- {
26301
- style: {
26302
- fontSize: "16px",
26303
- fontWeight: 700,
26304
- color: "#1f2937",
26305
- fontFamily: drawerStyles.container.fontFamily
26306
- },
26307
- children: title
26308
- }
26309
- ),
26310
- /* @__PURE__ */ jsx(
26311
- SheetDescription,
26312
- {
26313
- style: {
26314
- fontSize: "13px",
26315
- color: "#6b7280",
26316
- marginTop: "2px",
26317
- marginBottom: "12px",
26318
- fontFamily: drawerStyles.container.fontFamily
26319
- },
26320
- children: theme.unsavedChangesCount > 0 ? `${theme.unsavedChangesCount} unsaved change${theme.unsavedChangesCount !== 1 ? "s" : ""}` : "Customize your design system"
26321
- }
26322
- )
26323
- ] })
26324
- }
26325
- ),
26326
- /* @__PURE__ */ jsx("div", { style: drawerStyles.tabBar, children: activePanels.map((panel) => /* @__PURE__ */ jsx(
26327
- "button",
26328
- {
26329
- onClick: () => setActiveTab(panel.id),
26330
- style: drawerStyles.tab(activeTab === panel.id),
26331
- children: panel.label
26332
- },
26333
- panel.id
26334
- )) }),
26335
- /* @__PURE__ */ jsx(
26336
- ScrollArea,
26337
- {
26338
- className: "flex-1 overflow-hidden",
26339
- style: { height: `calc(100vh - ${showFooter ? 200 : 150}px)` },
26340
- children: /* @__PURE__ */ jsxs("div", { style: drawerStyles.container, children: [
26341
- activeTab === "colors" && /* @__PURE__ */ jsx(ColorsPanel, { theme }),
26342
- activeTab === "images" && /* @__PURE__ */ jsx(ImagesPanel, { theme, onImageUpload }),
26343
- activeTab === "typography" && /* @__PURE__ */ jsx(TypographyPanel, { theme }),
26344
- activeTab === "buttons" && /* @__PURE__ */ jsx(ButtonsPanel, { theme }),
26345
- activeTab === "inputs" && /* @__PURE__ */ jsx(InputsPanel, { theme }),
26346
- activeTab === "export" && /* @__PURE__ */ jsx(ExportPanel, { theme })
26347
- ] })
26348
- }
26349
- ),
26350
- showFooter && /* @__PURE__ */ jsx("div", { style: drawerStyles.footer, children: resetConfirmOpen ? /* @__PURE__ */ jsxs(
26351
- "div",
26352
- {
26353
- style: {
26354
- display: "flex",
26355
- flexDirection: "column",
26356
- gap: "8px",
26357
- width: "100%"
26358
- },
26359
26352
  children: [
26360
- /* @__PURE__ */ jsx(
26361
- "span",
26362
- {
26363
- style: {
26364
- fontSize: "13px",
26365
- color: "#374151",
26366
- textAlign: "center"
26367
- },
26368
- children: "Reset all settings to defaults?"
26369
- }
26370
- ),
26371
- /* @__PURE__ */ jsxs(
26372
- "div",
26373
- {
26374
- style: {
26375
- display: "flex",
26376
- gap: "8px",
26377
- justifyContent: "center"
26378
- },
26379
- children: [
26380
- /* @__PURE__ */ jsx(
26381
- "button",
26382
- {
26383
- onClick: () => setResetConfirmOpen(false),
26384
- style: {
26385
- fontSize: "13px",
26386
- fontWeight: 500,
26387
- color: "#374151",
26388
- background: "#ffffff",
26389
- border: "1px solid #e5e7eb",
26390
- cursor: "pointer",
26391
- padding: "6px 16px",
26392
- borderRadius: "6px"
26393
- },
26394
- children: "Cancel"
26395
- }
26396
- ),
26397
- /* @__PURE__ */ jsx(
26398
- "button",
26399
- {
26400
- onClick: handleReset,
26401
- style: {
26402
- fontSize: "13px",
26403
- fontWeight: 500,
26404
- color: "#ffffff",
26405
- background: "#dc2626",
26406
- border: "1px solid #dc2626",
26407
- cursor: "pointer",
26408
- padding: "6px 16px",
26409
- borderRadius: "6px"
26410
- },
26411
- children: "Reset All"
26412
- }
26413
- )
26414
- ]
26415
- }
26416
- )
26353
+ /* @__PURE__ */ jsx(SheetTitle, { className: "sr-only", children: title }),
26354
+ /* @__PURE__ */ jsx(SheetDescription, { className: "sr-only", children: "Customize your design system" }),
26355
+ headerBlock
26417
26356
  ]
26418
26357
  }
26419
- ) : /* @__PURE__ */ jsxs(Fragment, { children: [
26420
- /* @__PURE__ */ jsxs(
26421
- "div",
26422
- {
26423
- style: {
26424
- display: "flex",
26425
- gap: "8px",
26426
- width: "100%"
26427
- },
26428
- children: [
26429
- /* @__PURE__ */ jsx(
26430
- "button",
26431
- {
26432
- onClick: handleDiscard,
26433
- style: {
26434
- flex: 1,
26435
- fontSize: "13px",
26436
- fontWeight: 500,
26437
- color: "#374151",
26438
- background: "#ffffff",
26439
- border: "1px solid #e5e7eb",
26440
- cursor: "pointer",
26441
- padding: "8px 16px",
26442
- borderRadius: "6px"
26443
- },
26444
- children: "Discard"
26445
- }
26446
- ),
26447
- /* @__PURE__ */ jsx(
26448
- "button",
26449
- {
26450
- onClick: handleSave,
26451
- style: {
26452
- flex: 1,
26453
- fontSize: "13px",
26454
- fontWeight: 600,
26455
- color: "#ffffff",
26456
- background: "#1f2937",
26457
- border: "1px solid #1f2937",
26458
- cursor: "pointer",
26459
- padding: "8px 16px",
26460
- borderRadius: "6px"
26461
- },
26462
- children: "Save"
26463
- }
26464
- )
26465
- ]
26466
- }
26467
- ),
26468
- /* @__PURE__ */ jsx(
26469
- "button",
26470
- {
26471
- onClick: () => setResetConfirmOpen(true),
26472
- style: {
26473
- fontSize: "12px",
26474
- fontWeight: 400,
26475
- color: "#9ca3af",
26476
- background: "none",
26477
- border: "none",
26478
- cursor: "pointer",
26479
- padding: "2px 0",
26480
- textAlign: "center",
26481
- textDecoration: "underline",
26482
- textUnderlineOffset: "2px"
26483
- },
26484
- children: "Reset all to defaults"
26485
- }
26486
- )
26487
- ] }) })
26358
+ ),
26359
+ tabBar,
26360
+ panelContent,
26361
+ footerContent
26488
26362
  ]
26489
26363
  }
26490
26364
  ) })
@@ -26510,6 +26384,6 @@ function getTopLevelScreens(allScreens) {
26510
26384
  return allScreens.filter((s) => !s.parentId);
26511
26385
  }
26512
26386
 
26513
- export { AccountSettingsShell, ActivityFeed, Avatar, AvatarFallback, AvatarImage, BadgesCard, BlogCards, BottomInputChatWidget, Button, Calendar, CanvasItem, CategoryGrid, CenteredHero, ChatBubble, ChatDateSeparator, ChatInput, ChatMessageList, Checkbox, CheckboxWithLabel, CircularProgressBar, CircularProgressBarList, ColorInputRow, ComponentPalette, ComponentSearch, ContentDropzone, ContentWithImage, CoreValuesGrid, CreditCardDisplay, CtaBanner, CustomComponentHelper, DashboardHeader, DashboardShell, DateInput, DescriptionCard, DestinationCards, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DonutChartWidget, DoubleSidebar, DoubleSidebarShell, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, FaqAccordion, FaqsTable, FeatureWithImage, FeaturedNewsCards, FeaturedPlaces, FeaturesComparison, FileUploader, FilterPopover, FixedColumnDataTable, FlairBanner, FooterNavbar, FormGroup, GallerySection, GradientBanner, GraphMetricTilesDemo, GridTilesList, Header, HeroDarkCentered, HeroDarkWithImage, HeroFullwidthImage, HeroSection, HowItWorks, HslColorPicker, IconSidebar, IconSidebarShell, ImageFeedWithNestedComments, ImageUploader, InfoCard, Input, Label2 as Label, LargeImageLabelsList, Sidebar2 as LayoutSidebar, LineChartWidget, LineTabs, LinksCard, Loader, LoginBrandingPanel, MenuSection, MenufocusTemplate, MessengerInput, MessengerSidebar, MetricCard, MetricCardsRow, MetricListCard, MetricsSection, MobileBottomNav, MobileMenuShell, MonthlyCalendarWidget, MultiselectCheckboxField, MultiselectTags, MultistepProgressBarShell, MultistepShell, MultistepSidebarShell, NestedCommentsTable, NestedDataTable, OfficeLocations, PageHeaderSection, Pagination, ParticipantList, PersonaCard, PersonaGrid, PillTabs, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortfolioCard, PreviewBrandingContext, PricingCards, PricingCta, ProfileCard, ProfileGridTilesList, ProfileImageUploader, ProgressBar, ProgressMetricCard, ProjectContextShell, PromptChipsRow, PromptTemplate, RadioGroup2 as RadioGroup, RadioGroupItem, RangeInput, ReviewsGrid, ReviewsTable, ScreenFlowchart, ScreenPromptBuilder, ScreenPromptTemplate, ScrollArea, ScrollBar, SearchBar, SearchBarShell, SearchSidebar, Searchbox, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SelectablePills, Separator3 as Separator, SettingsListRow, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarNav, SidebarProfileCard, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, SkillsCard, Slider, SlideshowGridTiles, SocialFeed, SocialProof, StandardDataTable, StandardListWithImage, StandardPageShell, StatsCard, StepTracker, Switch, Tabs, TabsContent, TabsList, TabsTrigger, TeamCardsGrid, TeamCircularGrid, TestimonialCarousel, TextInput, Textarea, ThemeContext, ThemeDrawer, ThemeProvider, TitleGroup, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TwoColumnWidgets, Typography, UpvotingPostsTable, VerticalHowItWorks, VerticalMultistepShell, VerticalStepTracker, VideoChatControls, VideoContentSection, VideoPlaylistCard, VideoPlaylistItem, WebcamPreview, YouTubePlayer, accountTabs, allColorVariables, blocks, broadcastCSSVariables, buttonVariants, canvasBlocks, cn, colorVariables, defaultBranding, defaultButtonColorStyles, defaultButtonColors, defaultButtonSizes, defaultColors, defaultCustomButtonStyles, defaultDoubleSidebarSections, defaultIconNavItems, defaultImages, defaultInputSizes, defaultProgressBarSteps, defaultSteps, defaultSupportLinks, defaultTypography, defaultVerticalSteps, getChildScreens, getScreenUrl, getTopLevelScreens, groupModalDrawerBlocks, layoutPrimitives, layoutShells, marketingBlocks, pageTemplates, pricingBlocks, removeCSSVariables, setCSSVariable, setCSSVariables, setupCSSVariableListener, useCSSVariableSync, useIsMobile, usePreviewBranding, useSidebar, useThemeBrandAssets, useThemeBranding, useThemeImages, videoBlocks };
26387
+ export { AccountSettingsShell, ActivityFeed, Avatar, AvatarFallback, AvatarImage, BadgesCard, BlogCards, BottomInputChatWidget, Button, Calendar, CategoryGrid, CenteredHero, ChatBubble, ChatDateSeparator, ChatInput, ChatMessageList, Checkbox, CheckboxWithLabel, CircularProgressBar, CircularProgressBarList, ColorInputRow, ComponentSearch, ContentDropzone, ContentWithImage, CoreValuesGrid, CreditCardDisplay, CtaBanner, CustomComponentHelper, DashboardHeader, DashboardShell, DateInput, DescriptionCard, DestinationCards, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DonutChartWidget, DoubleSidebar, DoubleSidebarShell, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, FaqAccordion, FaqsTable, FeatureWithImage, FeaturedNewsCards, FeaturedPlaces, FeaturesComparison, FileUploader, FilterPopover, FixedColumnDataTable, FlairBanner, FooterNavbar, FormGroup, GallerySection, GradientBanner, GraphMetricTilesDemo, GridTilesList, Header, HeroDarkCentered, HeroDarkWithImage, HeroFullwidthImage, HeroSection, HowItWorks, HslColorPicker, IconSidebar, IconSidebarShell, ImageFeedWithNestedComments, ImageUploader, InfoCard, Input, Label2 as Label, LargeImageLabelsList, Sidebar2 as LayoutSidebar, LineChartWidget, LineTabs, LinksCard, Loader, LoginBrandingPanel, MenuSection, MenufocusTemplate, MessengerInput, MessengerSidebar, MetricCard, MetricCardsRow, MetricListCard, MetricsSection, MobileBottomNav, MobileMenuShell, MonthlyCalendarWidget, MultiselectCheckboxField, MultiselectTags, MultistepProgressBarShell, MultistepShell, MultistepSidebarShell, NestedCommentsTable, NestedDataTable, OfficeLocations, PageHeaderSection, Pagination, ParticipantList, PersonaCard, PersonaGrid, PillTabs, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortfolioCard, PreviewBrandingContext, PricingCards, PricingCta, ProfileCard, ProfileGridTilesList, ProfileImageUploader, ProgressBar, ProgressMetricCard, ProjectContextShell, PromptChipsRow, PromptTemplate, RadioGroup2 as RadioGroup, RadioGroupItem, RangeInput, ReviewsGrid, ReviewsTable, ScreenFlowchart, ScreenPromptBuilder, ScreenPromptTemplate, ScrollArea, ScrollBar, SearchBar, SearchBarShell, SearchSidebar, Searchbox, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SelectablePills, Separator3 as Separator, SettingsListRow, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarNav, SidebarProfileCard, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, SkillsCard, Slider, SlideshowGridTiles, SocialFeed, SocialProof, StandardDataTable, StandardListWithImage, StandardPageShell, StatsCard, StepTracker, Switch, Tabs, TabsContent, TabsList, TabsTrigger, TeamCardsGrid, TeamCircularGrid, TestimonialCarousel, TextInput, Textarea, ThemeContext, ThemeDrawer, ThemeProvider, TitleGroup, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TwoColumnWidgets, Typography, UpvotingPostsTable, VerticalHowItWorks, VerticalMultistepShell, VerticalStepTracker, VideoChatControls, VideoContentSection, VideoPlaylistCard, VideoPlaylistItem, WebcamPreview, YouTubePlayer, accountTabs, allColorVariables, blocks, broadcastBranding, broadcastCSSVariables, broadcastImages, buttonVariants, cn, colorVariables, defaultBranding, defaultButtonColorStyles, defaultButtonColors, defaultButtonSizes, defaultColors, defaultCustomButtonStyles, defaultDoubleSidebarSections, defaultIconNavItems, defaultImages, defaultInputSizes, defaultProgressBarSteps, defaultSteps, defaultSupportLinks, defaultTypography, defaultVerticalSteps, getChildScreens, getScreenUrl, getTopLevelScreens, groupModalDrawerBlocks, layoutPrimitives, layoutShells, marketingBlocks, pageTemplates, pricingBlocks, removeCSSVariables, setCSSVariable, setCSSVariables, setupCSSVariableListener, useCSSVariableSync, useIsMobile, usePreviewBranding, useSidebar, useThemeBrandAssets, useThemeBranding, useThemeImages, videoBlocks };
26514
26388
  //# sourceMappingURL=index.js.map
26515
26389
  //# sourceMappingURL=index.js.map