@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 +15 -2
- package/dist/index.d.ts +15 -2
- package/dist/index.js +161 -42
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +160 -42
- package/dist/index.mjs.map +1 -1
- package/dist/styles/globals.css +23 -4
- package/package.json +80 -79
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:
|
|
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/
|
|
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,
|
|
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,
|
|
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
|
|
3445
|
+
var import_jsx_runtime50 = require("react/jsx-runtime");
|
|
3328
3446
|
function AuthShell({ children, pattern = "dots", maxWidth = "520px" }) {
|
|
3329
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
3497
|
+
var import_jsx_runtime51 = require("react/jsx-runtime");
|
|
3380
3498
|
function AuthCard({ children, padding = "24px 28px" }) {
|
|
3381
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
3401
|
-
imageUrl ? /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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
|
|
3563
|
+
var import_jsx_runtime53 = require("react/jsx-runtime");
|
|
3446
3564
|
function AuthHeader({ title, description }) {
|
|
3447
|
-
return /* @__PURE__ */ (0,
|
|
3448
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
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,
|
|
3481
|
-
/* @__PURE__ */ (0,
|
|
3482
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
3612
|
+
rightLabel && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { style: { fontSize: "0.8125rem" }, children: rightLabel })
|
|
3495
3613
|
] }),
|
|
3496
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
3527
|
-
hint && !error && /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
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,
|
|
3588
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
3727
|
+
var import_jsx_runtime56 = require("react/jsx-runtime");
|
|
3610
3728
|
function AuthDivider({ label = "or" }) {
|
|
3611
|
-
return /* @__PURE__ */ (0,
|
|
3612
|
-
/* @__PURE__ */ (0,
|
|
3613
|
-
/* @__PURE__ */ (0,
|
|
3614
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
3737
|
+
var import_jsx_runtime57 = require("react/jsx-runtime");
|
|
3620
3738
|
function AuthFootnote({ text, linkText, linkHref }) {
|
|
3621
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|