@webdevarif/dashui 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -204,8 +204,12 @@ declare function NotificationBell({ count, onClick, className, }: NotificationBe
204
204
 
205
205
  interface ThemeToggleProps {
206
206
  className?: string;
207
+ /** External controlled theme value. When provided, next-themes is not used. */
208
+ theme?: string;
209
+ /** External toggle handler. When provided, next-themes setTheme is not called. */
210
+ onToggle?: () => void;
207
211
  }
208
- declare function ThemeToggle({ className }: ThemeToggleProps): react_jsx_runtime.JSX.Element;
212
+ declare function ThemeToggle({ className, theme: externalTheme, onToggle }: ThemeToggleProps): react_jsx_runtime.JSX.Element;
209
213
 
210
214
  interface NavItem {
211
215
  href: string;
@@ -532,6 +536,15 @@ interface PostSidebarSectionProps {
532
536
  }
533
537
  declare function PostSidebarSection({ title, children, defaultOpen, className, }: PostSidebarSectionProps): react_jsx_runtime.JSX.Element;
534
538
 
539
+ interface HslColorInputProps {
540
+ value: string;
541
+ onChange: (value: string) => void;
542
+ className?: string;
543
+ inputClassName?: string;
544
+ disabled?: boolean;
545
+ }
546
+ declare function HslColorInput({ value, onChange, className, inputClassName, disabled, }: HslColorInputProps): react_jsx_runtime.JSX.Element;
547
+
535
548
  declare function useDisclosure(initial?: boolean): {
536
549
  isOpen: boolean;
537
550
  open: () => void;
@@ -616,4 +629,4 @@ interface SkeletonProps {
616
629
  }
617
630
  declare function Skeleton({ width, height, rounded, style }: SkeletonProps): react_jsx_runtime.JSX.Element;
618
631
 
619
- export { Alert, type AlertProps, AppShell, type AppShellProps, AuthButton, AuthCard, AuthDivider, AuthField, AuthFootnote, AuthHeader, AuthLogo, AuthShell, Badge, type BadgeProps, type Breadcrumb, Button, type ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, type Column, ConfirmDialog, type ConfirmDialogProps, DashboardLayout, type DashboardLayoutProps, DataTable, type DataTableProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, FormField, type FormFieldProps, FormLayout, type FormLayoutProps, FormSection, type FormSectionProps, ImagePickerField, type ImagePickerFieldProps, Input, type InputProps, Label, LoadingSpinner, type LoadingSpinnerProps, MediaCard, type MediaCardFile, type MediaCardProps, MediaGrid, type MediaGridProps, MediaPickerDialog, type MediaPickerDialogFolder, type MediaPickerDialogProps, type NavItem, NotificationBell, type NotificationBellProps, Page, type PageProps, PageSection, type PageSectionProps, Pagination, type PaginationProps, PlanBadge, type PlanBadgeProps, type PlanId, Popover, PopoverContent, PopoverTrigger, PostEditorShell, type PostEditorShellProps, PostFiltersBar, type PostFiltersBarProps, type PostListItem, PostListTable, type PostListTableProps, PostSidebarSection, type PostSidebarSectionProps, type PostStatus, PostStatusBadge, type PostStatusBadgeProps, SearchBar, type SearchBarProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sidebar, type SidebarItem, type SidebarProps, Skeleton, SlugInput, type SlugInputProps, type Stat, Stats, type StatsProps, StorageBar, type StorageBarProps, Switch, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, ThemeToggle, type ThemeToggleProps, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TopBar, type TopBarProps, type UploadItem, badgeVariants, buttonVariants, cn, useDisclosure, usePagination };
632
+ export { Alert, type AlertProps, AppShell, type AppShellProps, AuthButton, AuthCard, AuthDivider, AuthField, AuthFootnote, AuthHeader, AuthLogo, AuthShell, Badge, type BadgeProps, type Breadcrumb, Button, type ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, type Column, ConfirmDialog, type ConfirmDialogProps, DashboardLayout, type DashboardLayoutProps, DataTable, type DataTableProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, FormField, type FormFieldProps, FormLayout, type FormLayoutProps, FormSection, type FormSectionProps, HslColorInput, ImagePickerField, type ImagePickerFieldProps, Input, type InputProps, Label, LoadingSpinner, type LoadingSpinnerProps, MediaCard, type MediaCardFile, type MediaCardProps, MediaGrid, type MediaGridProps, MediaPickerDialog, type MediaPickerDialogFolder, type MediaPickerDialogProps, type NavItem, NotificationBell, type NotificationBellProps, Page, type PageProps, PageSection, type PageSectionProps, Pagination, type PaginationProps, PlanBadge, type PlanBadgeProps, type PlanId, Popover, PopoverContent, PopoverTrigger, PostEditorShell, type PostEditorShellProps, PostFiltersBar, type PostFiltersBarProps, type PostListItem, PostListTable, type PostListTableProps, PostSidebarSection, type PostSidebarSectionProps, type PostStatus, PostStatusBadge, type PostStatusBadgeProps, SearchBar, type SearchBarProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sidebar, type SidebarItem, type SidebarProps, Skeleton, SlugInput, type SlugInputProps, type Stat, Stats, type StatsProps, StorageBar, type StorageBarProps, Switch, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, ThemeToggle, type ThemeToggleProps, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TopBar, type TopBarProps, type UploadItem, badgeVariants, buttonVariants, cn, useDisclosure, usePagination };
package/dist/index.d.ts CHANGED
@@ -204,8 +204,12 @@ declare function NotificationBell({ count, onClick, className, }: NotificationBe
204
204
 
205
205
  interface ThemeToggleProps {
206
206
  className?: string;
207
+ /** External controlled theme value. When provided, next-themes is not used. */
208
+ theme?: string;
209
+ /** External toggle handler. When provided, next-themes setTheme is not called. */
210
+ onToggle?: () => void;
207
211
  }
208
- declare function ThemeToggle({ className }: ThemeToggleProps): react_jsx_runtime.JSX.Element;
212
+ declare function ThemeToggle({ className, theme: externalTheme, onToggle }: ThemeToggleProps): react_jsx_runtime.JSX.Element;
209
213
 
210
214
  interface NavItem {
211
215
  href: string;
@@ -532,6 +536,15 @@ interface PostSidebarSectionProps {
532
536
  }
533
537
  declare function PostSidebarSection({ title, children, defaultOpen, className, }: PostSidebarSectionProps): react_jsx_runtime.JSX.Element;
534
538
 
539
+ interface HslColorInputProps {
540
+ value: string;
541
+ onChange: (value: string) => void;
542
+ className?: string;
543
+ inputClassName?: string;
544
+ disabled?: boolean;
545
+ }
546
+ declare function HslColorInput({ value, onChange, className, inputClassName, disabled, }: HslColorInputProps): react_jsx_runtime.JSX.Element;
547
+
535
548
  declare function useDisclosure(initial?: boolean): {
536
549
  isOpen: boolean;
537
550
  open: () => void;
@@ -616,4 +629,4 @@ interface SkeletonProps {
616
629
  }
617
630
  declare function Skeleton({ width, height, rounded, style }: SkeletonProps): react_jsx_runtime.JSX.Element;
618
631
 
619
- export { Alert, type AlertProps, AppShell, type AppShellProps, AuthButton, AuthCard, AuthDivider, AuthField, AuthFootnote, AuthHeader, AuthLogo, AuthShell, Badge, type BadgeProps, type Breadcrumb, Button, type ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, type Column, ConfirmDialog, type ConfirmDialogProps, DashboardLayout, type DashboardLayoutProps, DataTable, type DataTableProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, FormField, type FormFieldProps, FormLayout, type FormLayoutProps, FormSection, type FormSectionProps, ImagePickerField, type ImagePickerFieldProps, Input, type InputProps, Label, LoadingSpinner, type LoadingSpinnerProps, MediaCard, type MediaCardFile, type MediaCardProps, MediaGrid, type MediaGridProps, MediaPickerDialog, type MediaPickerDialogFolder, type MediaPickerDialogProps, type NavItem, NotificationBell, type NotificationBellProps, Page, type PageProps, PageSection, type PageSectionProps, Pagination, type PaginationProps, PlanBadge, type PlanBadgeProps, type PlanId, Popover, PopoverContent, PopoverTrigger, PostEditorShell, type PostEditorShellProps, PostFiltersBar, type PostFiltersBarProps, type PostListItem, PostListTable, type PostListTableProps, PostSidebarSection, type PostSidebarSectionProps, type PostStatus, PostStatusBadge, type PostStatusBadgeProps, SearchBar, type SearchBarProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sidebar, type SidebarItem, type SidebarProps, Skeleton, SlugInput, type SlugInputProps, type Stat, Stats, type StatsProps, StorageBar, type StorageBarProps, Switch, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, ThemeToggle, type ThemeToggleProps, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TopBar, type TopBarProps, type UploadItem, badgeVariants, buttonVariants, cn, useDisclosure, usePagination };
632
+ export { Alert, type AlertProps, AppShell, type AppShellProps, AuthButton, AuthCard, AuthDivider, AuthField, AuthFootnote, AuthHeader, AuthLogo, AuthShell, Badge, type BadgeProps, type Breadcrumb, Button, type ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, type Column, ConfirmDialog, type ConfirmDialogProps, DashboardLayout, type DashboardLayoutProps, DataTable, type DataTableProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, FormField, type FormFieldProps, FormLayout, type FormLayoutProps, FormSection, type FormSectionProps, HslColorInput, ImagePickerField, type ImagePickerFieldProps, Input, type InputProps, Label, LoadingSpinner, type LoadingSpinnerProps, MediaCard, type MediaCardFile, type MediaCardProps, MediaGrid, type MediaGridProps, MediaPickerDialog, type MediaPickerDialogFolder, type MediaPickerDialogProps, type NavItem, NotificationBell, type NotificationBellProps, Page, type PageProps, PageSection, type PageSectionProps, Pagination, type PaginationProps, PlanBadge, type PlanBadgeProps, type PlanId, Popover, PopoverContent, PopoverTrigger, PostEditorShell, type PostEditorShellProps, PostFiltersBar, type PostFiltersBarProps, type PostListItem, PostListTable, type PostListTableProps, PostSidebarSection, type PostSidebarSectionProps, type PostStatus, PostStatusBadge, type PostStatusBadgeProps, SearchBar, type SearchBarProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sidebar, type SidebarItem, type SidebarProps, Skeleton, SlugInput, type SlugInputProps, type Stat, Stats, type StatsProps, StorageBar, type StorageBarProps, Switch, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, ThemeToggle, type ThemeToggleProps, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TopBar, type TopBarProps, type UploadItem, badgeVariants, buttonVariants, cn, useDisclosure, usePagination };
package/dist/index.js CHANGED
@@ -81,6 +81,7 @@ __export(index_exports, {
81
81
  FormField: () => FormField,
82
82
  FormLayout: () => FormLayout,
83
83
  FormSection: () => FormSection,
84
+ HslColorInput: () => HslColorInput,
84
85
  ImagePickerField: () => ImagePickerField,
85
86
  Input: () => Input,
86
87
  Label: () => Label2,
@@ -1207,7 +1208,7 @@ function NotificationBell({
1207
1208
  var React17 = __toESM(require("react"));
1208
1209
  var import_next_themes = require("next-themes");
1209
1210
  var import_jsx_runtime24 = require("react/jsx-runtime");
1210
- function ThemeToggle({ className }) {
1211
+ function ThemeToggle({ className, theme: externalTheme, onToggle }) {
1211
1212
  const { resolvedTheme, setTheme } = (0, import_next_themes.useTheme)();
1212
1213
  const [mounted, setMounted] = React17.useState(false);
1213
1214
  React17.useEffect(() => {
@@ -1226,11 +1227,12 @@ function ThemeToggle({ className }) {
1226
1227
  }
1227
1228
  );
1228
1229
  }
1229
- const isDark = resolvedTheme === "dark";
1230
+ const isDark = externalTheme !== void 0 ? externalTheme === "dark" : resolvedTheme === "dark";
1231
+ const handleToggle = onToggle ?? (() => setTheme(isDark ? "light" : "dark"));
1230
1232
  return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1231
1233
  "button",
1232
1234
  {
1233
- onClick: () => setTheme(isDark ? "light" : "dark"),
1235
+ onClick: handleToggle,
1234
1236
  className: cn(
1235
1237
  "flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
1236
1238
  className
@@ -3305,10 +3307,126 @@ function PostSidebarSection({
3305
3307
  ] });
3306
3308
  }
3307
3309
 
3308
- // src/hooks/index.ts
3310
+ // src/components/ui/hsl-color-input.tsx
3309
3311
  var import_react = require("react");
3312
+ var import_react_colorful = require("react-colorful");
3313
+ var import_jsx_runtime49 = require("react/jsx-runtime");
3314
+ function parseHsl(value) {
3315
+ if (!value) return { h: 0, s: 0, l: 0 };
3316
+ const parts = value.trim().split(/\s+/);
3317
+ const h = parseFloat(parts[0]) || 0;
3318
+ const s = parseFloat(parts[1]) || 0;
3319
+ const l = parseFloat(parts[2]) || 0;
3320
+ return { h, s, l };
3321
+ }
3322
+ function formatHsl(color) {
3323
+ return `${Math.round(color.h)} ${Math.round(color.s)}% ${Math.round(color.l)}%`;
3324
+ }
3325
+ function HslColorInput({
3326
+ value,
3327
+ onChange,
3328
+ className,
3329
+ inputClassName,
3330
+ disabled
3331
+ }) {
3332
+ const [open, setOpen] = (0, import_react.useState)(false);
3333
+ const [inputVal, setInputVal] = (0, import_react.useState)(value);
3334
+ const containerRef = (0, import_react.useRef)(null);
3335
+ (0, import_react.useEffect)(() => {
3336
+ setInputVal(value);
3337
+ }, [value]);
3338
+ (0, import_react.useEffect)(() => {
3339
+ if (!open) return;
3340
+ const handler = (e) => {
3341
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
3342
+ setOpen(false);
3343
+ }
3344
+ };
3345
+ document.addEventListener("mousedown", handler);
3346
+ return () => document.removeEventListener("mousedown", handler);
3347
+ }, [open]);
3348
+ const hslColor = parseHsl(value);
3349
+ const cssColor = value ? `hsl(${value})` : "transparent";
3350
+ const handlePickerChange = (0, import_react.useCallback)((color) => {
3351
+ const formatted = formatHsl(color);
3352
+ setInputVal(formatted);
3353
+ onChange(formatted);
3354
+ }, [onChange]);
3355
+ const handleInputChange = (e) => {
3356
+ const v = e.target.value;
3357
+ setInputVal(v);
3358
+ if (/^\d+\s+\d+%?\s+\d+%?$/.test(v.trim()) || /^\d+(\.\d+)?\s+\d+(\.\d+)?%\s+\d+(\.\d+)?%$/.test(v.trim())) {
3359
+ onChange(v);
3360
+ }
3361
+ };
3362
+ const handleInputBlur = () => {
3363
+ setInputVal(value);
3364
+ };
3365
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { ref: containerRef, className: cn("relative flex items-center gap-1.5", className), children: [
3366
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
3367
+ "button",
3368
+ {
3369
+ type: "button",
3370
+ disabled,
3371
+ onClick: () => setOpen((o) => !o),
3372
+ className: cn(
3373
+ "w-5 h-5 rounded border border-white/10 shrink-0 transition-all",
3374
+ "hover:scale-110 hover:border-white/30 focus:outline-none focus:ring-1 focus:ring-white/20",
3375
+ disabled && "opacity-50 cursor-not-allowed"
3376
+ ),
3377
+ style: { background: cssColor },
3378
+ title: value,
3379
+ "aria-label": "Open color picker"
3380
+ }
3381
+ ),
3382
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
3383
+ "input",
3384
+ {
3385
+ type: "text",
3386
+ value: inputVal,
3387
+ onChange: handleInputChange,
3388
+ onBlur: handleInputBlur,
3389
+ disabled,
3390
+ placeholder: "0 0% 0%",
3391
+ className: cn(
3392
+ "w-28 bg-white/5 border border-white/10 rounded px-1.5 py-0.5",
3393
+ "text-xs text-white/70 font-mono outline-none",
3394
+ "focus:border-white/30 placeholder:text-white/20",
3395
+ "disabled:opacity-50 disabled:cursor-not-allowed",
3396
+ inputClassName
3397
+ )
3398
+ }
3399
+ ),
3400
+ open && /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: cn(
3401
+ "absolute z-50 top-full left-0 mt-2",
3402
+ "bg-[#1a1c2e] border border-white/10 rounded-xl shadow-2xl p-3",
3403
+ "flex flex-col gap-3"
3404
+ ), children: [
3405
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
3406
+ import_react_colorful.HslColorPicker,
3407
+ {
3408
+ color: hslColor,
3409
+ onChange: handlePickerChange
3410
+ }
3411
+ ),
3412
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-center gap-2", children: [
3413
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
3414
+ "div",
3415
+ {
3416
+ className: "w-6 h-6 rounded border border-white/10 shrink-0",
3417
+ style: { background: cssColor }
3418
+ }
3419
+ ),
3420
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "text-xs font-mono text-white/50 truncate", children: value || "none" })
3421
+ ] })
3422
+ ] })
3423
+ ] });
3424
+ }
3425
+
3426
+ // src/hooks/index.ts
3427
+ var import_react2 = require("react");
3310
3428
  function useDisclosure(initial = false) {
3311
- const [isOpen, setIsOpen] = (0, import_react.useState)(initial);
3429
+ const [isOpen, setIsOpen] = (0, import_react2.useState)(initial);
3312
3430
  return {
3313
3431
  isOpen,
3314
3432
  open: () => setIsOpen(true),
@@ -3318,15 +3436,15 @@ function useDisclosure(initial = false) {
3318
3436
  };
3319
3437
  }
3320
3438
  function usePagination(total, pageSize = 20) {
3321
- const [page, setPage] = (0, import_react.useState)(1);
3439
+ const [page, setPage] = (0, import_react2.useState)(1);
3322
3440
  const totalPages = Math.ceil(total / pageSize);
3323
3441
  return { page, setPage, pageSize, total, totalPages };
3324
3442
  }
3325
3443
 
3326
3444
  // src/components/auth/AuthShell.tsx
3327
- var import_jsx_runtime49 = require("react/jsx-runtime");
3445
+ var import_jsx_runtime50 = require("react/jsx-runtime");
3328
3446
  function AuthShell({ children, pattern = "dots", maxWidth = "520px" }) {
3329
- return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(
3447
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(
3330
3448
  "div",
3331
3449
  {
3332
3450
  style: {
@@ -3341,7 +3459,7 @@ function AuthShell({ children, pattern = "dots", maxWidth = "520px" }) {
3341
3459
  overflow: "hidden"
3342
3460
  },
3343
3461
  children: [
3344
- pattern === "dots" && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
3462
+ pattern === "dots" && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
3345
3463
  "div",
3346
3464
  {
3347
3465
  "aria-hidden": true,
@@ -3355,7 +3473,7 @@ function AuthShell({ children, pattern = "dots", maxWidth = "520px" }) {
3355
3473
  }
3356
3474
  }
3357
3475
  ),
3358
- pattern === "grid" && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
3476
+ pattern === "grid" && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
3359
3477
  "div",
3360
3478
  {
3361
3479
  "aria-hidden": true,
@@ -3369,16 +3487,16 @@ function AuthShell({ children, pattern = "dots", maxWidth = "520px" }) {
3369
3487
  }
3370
3488
  }
3371
3489
  ),
3372
- /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { style: { position: "relative", zIndex: 1, width: "100%", maxWidth }, children })
3490
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { style: { position: "relative", zIndex: 1, width: "100%", maxWidth }, children })
3373
3491
  ]
3374
3492
  }
3375
3493
  );
3376
3494
  }
3377
3495
 
3378
3496
  // src/components/auth/AuthCard.tsx
3379
- var import_jsx_runtime50 = require("react/jsx-runtime");
3497
+ var import_jsx_runtime51 = require("react/jsx-runtime");
3380
3498
  function AuthCard({ children, padding = "24px 28px" }) {
3381
- return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
3499
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
3382
3500
  "div",
3383
3501
  {
3384
3502
  style: {
@@ -3395,10 +3513,10 @@ function AuthCard({ children, padding = "24px 28px" }) {
3395
3513
  }
3396
3514
 
3397
3515
  // src/components/auth/AuthLogo.tsx
3398
- var import_jsx_runtime51 = require("react/jsx-runtime");
3516
+ var import_jsx_runtime52 = require("react/jsx-runtime");
3399
3517
  function AuthLogo({ appName = "Builify CMS", letter = "B", imageUrl, size = 36 }) {
3400
- return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", gap: "10px", marginBottom: "28px" }, children: [
3401
- imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
3518
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", gap: "10px", marginBottom: "28px" }, children: [
3519
+ imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
3402
3520
  "img",
3403
3521
  {
3404
3522
  src: imageUrl,
@@ -3407,7 +3525,7 @@ function AuthLogo({ appName = "Builify CMS", letter = "B", imageUrl, size = 36 }
3407
3525
  height: size,
3408
3526
  style: { borderRadius: "calc(var(--radius, 0.5rem) * 1.2)", flexShrink: 0, display: "block" }
3409
3527
  }
3410
- ) : /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
3528
+ ) : /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
3411
3529
  "div",
3412
3530
  {
3413
3531
  style: {
@@ -3426,7 +3544,7 @@ function AuthLogo({ appName = "Builify CMS", letter = "B", imageUrl, size = 36 }
3426
3544
  children: letter
3427
3545
  }
3428
3546
  ),
3429
- /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
3547
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
3430
3548
  "span",
3431
3549
  {
3432
3550
  style: {
@@ -3442,10 +3560,10 @@ function AuthLogo({ appName = "Builify CMS", letter = "B", imageUrl, size = 36 }
3442
3560
  }
3443
3561
 
3444
3562
  // src/components/auth/AuthHeader.tsx
3445
- var import_jsx_runtime52 = require("react/jsx-runtime");
3563
+ var import_jsx_runtime53 = require("react/jsx-runtime");
3446
3564
  function AuthHeader({ title, description }) {
3447
- return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { style: { marginBottom: "24px", textAlign: "center" }, children: [
3448
- /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
3565
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { style: { marginBottom: "24px", textAlign: "center" }, children: [
3566
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
3449
3567
  "h1",
3450
3568
  {
3451
3569
  style: {
@@ -3458,7 +3576,7 @@ function AuthHeader({ title, description }) {
3458
3576
  children: title
3459
3577
  }
3460
3578
  ),
3461
- description && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
3579
+ description && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
3462
3580
  "p",
3463
3581
  {
3464
3582
  style: {
@@ -3474,12 +3592,12 @@ function AuthHeader({ title, description }) {
3474
3592
  }
3475
3593
 
3476
3594
  // src/components/auth/AuthField.tsx
3477
- var import_jsx_runtime53 = require("react/jsx-runtime");
3595
+ var import_jsx_runtime54 = require("react/jsx-runtime");
3478
3596
  function AuthField({ label, error, hint, rightLabel, id, ...props }) {
3479
3597
  const fieldId = id ?? label.toLowerCase().replace(/\s+/g, "-");
3480
- return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "6px" }, children: [
3481
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [
3482
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
3598
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "6px" }, children: [
3599
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [
3600
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
3483
3601
  "label",
3484
3602
  {
3485
3603
  htmlFor: fieldId,
@@ -3491,9 +3609,9 @@ function AuthField({ label, error, hint, rightLabel, id, ...props }) {
3491
3609
  children: label
3492
3610
  }
3493
3611
  ),
3494
- rightLabel && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { style: { fontSize: "0.8125rem" }, children: rightLabel })
3612
+ rightLabel && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { style: { fontSize: "0.8125rem" }, children: rightLabel })
3495
3613
  ] }),
3496
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
3614
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
3497
3615
  "input",
3498
3616
  {
3499
3617
  id: fieldId,
@@ -3523,13 +3641,13 @@ function AuthField({ label, error, hint, rightLabel, id, ...props }) {
3523
3641
  ...props
3524
3642
  }
3525
3643
  ),
3526
- error && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("p", { style: { fontSize: "0.8rem", color: "var(--destructive)", margin: 0 }, children: error }),
3527
- hint && !error && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("p", { style: { fontSize: "0.8rem", color: "var(--muted-foreground)", margin: 0 }, children: hint })
3644
+ error && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { style: { fontSize: "0.8rem", color: "var(--destructive)", margin: 0 }, children: error }),
3645
+ hint && !error && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { style: { fontSize: "0.8rem", color: "var(--muted-foreground)", margin: 0 }, children: hint })
3528
3646
  ] });
3529
3647
  }
3530
3648
 
3531
3649
  // src/components/auth/AuthButton.tsx
3532
- var import_jsx_runtime54 = require("react/jsx-runtime");
3650
+ var import_jsx_runtime55 = require("react/jsx-runtime");
3533
3651
  function AuthButton({
3534
3652
  loading,
3535
3653
  variant = "primary",
@@ -3572,7 +3690,7 @@ function AuthButton({
3572
3690
  color: "var(--foreground)"
3573
3691
  }
3574
3692
  };
3575
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
3693
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
3576
3694
  "button",
3577
3695
  {
3578
3696
  disabled: loading || disabled,
@@ -3584,8 +3702,8 @@ function AuthButton({
3584
3702
  e.currentTarget.style.filter = "none";
3585
3703
  },
3586
3704
  ...props,
3587
- children: loading ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_jsx_runtime54.Fragment, { children: [
3588
- /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
3705
+ children: loading ? /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_jsx_runtime55.Fragment, { children: [
3706
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
3589
3707
  "span",
3590
3708
  {
3591
3709
  style: {
@@ -3606,19 +3724,19 @@ function AuthButton({
3606
3724
  }
3607
3725
 
3608
3726
  // src/components/auth/AuthDivider.tsx
3609
- var import_jsx_runtime55 = require("react/jsx-runtime");
3727
+ var import_jsx_runtime56 = require("react/jsx-runtime");
3610
3728
  function AuthDivider({ label = "or" }) {
3611
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "12px", margin: "20px 0" }, children: [
3612
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { style: { flex: 1, height: 1, background: "var(--border)" } }),
3613
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { style: { fontSize: "0.75rem", color: "var(--muted-foreground)", userSelect: "none" }, children: label }),
3614
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { style: { flex: 1, height: 1, background: "var(--border)" } })
3729
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "12px", margin: "20px 0" }, children: [
3730
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("div", { style: { flex: 1, height: 1, background: "var(--border)" } }),
3731
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { style: { fontSize: "0.75rem", color: "var(--muted-foreground)", userSelect: "none" }, children: label }),
3732
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("div", { style: { flex: 1, height: 1, background: "var(--border)" } })
3615
3733
  ] });
3616
3734
  }
3617
3735
 
3618
3736
  // src/components/auth/AuthFootnote.tsx
3619
- var import_jsx_runtime56 = require("react/jsx-runtime");
3737
+ var import_jsx_runtime57 = require("react/jsx-runtime");
3620
3738
  function AuthFootnote({ text, linkText, linkHref }) {
3621
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("p", { style: {
3739
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("p", { style: {
3622
3740
  textAlign: "center",
3623
3741
  marginTop: "20px",
3624
3742
  fontSize: "0.8125rem",
@@ -3626,7 +3744,7 @@ function AuthFootnote({ text, linkText, linkHref }) {
3626
3744
  }, children: [
3627
3745
  text,
3628
3746
  " ",
3629
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
3747
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
3630
3748
  "a",
3631
3749
  {
3632
3750
  href: linkHref,
@@ -3698,6 +3816,7 @@ var import_next_themes2 = require("next-themes");
3698
3816
  FormField,
3699
3817
  FormLayout,
3700
3818
  FormSection,
3819
+ HslColorInput,
3701
3820
  ImagePickerField,
3702
3821
  Input,
3703
3822
  Label,