@webdevarif/dashui 0.3.13 → 0.5.0

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.mjs CHANGED
@@ -2320,9 +2320,227 @@ function FormSection({
2320
2320
  ] });
2321
2321
  }
2322
2322
 
2323
+ // src/components/form/local-input.tsx
2324
+ import { useState as useState5, useRef as useRef3, useEffect as useEffect4 } from "react";
2325
+ import { jsx as jsx39 } from "react/jsx-runtime";
2326
+ function LocalInput({
2327
+ value,
2328
+ onChange,
2329
+ commitOnBlur,
2330
+ ...rest
2331
+ }) {
2332
+ const [local, setLocal] = useState5(String(value ?? ""));
2333
+ const ref = useRef3(null);
2334
+ const onChangeRef = useRef3(onChange);
2335
+ onChangeRef.current = onChange;
2336
+ useEffect4(() => {
2337
+ if (document.activeElement !== ref.current) {
2338
+ setLocal(String(value ?? ""));
2339
+ }
2340
+ }, [value]);
2341
+ return /* @__PURE__ */ jsx39(
2342
+ "input",
2343
+ {
2344
+ ref,
2345
+ ...rest,
2346
+ value: local,
2347
+ onChange: (e) => {
2348
+ setLocal(e.target.value);
2349
+ if (!commitOnBlur) {
2350
+ onChangeRef.current(e.target.value);
2351
+ }
2352
+ },
2353
+ onBlur: (e) => {
2354
+ if (commitOnBlur) {
2355
+ onChangeRef.current(e.target.value);
2356
+ }
2357
+ }
2358
+ }
2359
+ );
2360
+ }
2361
+
2362
+ // src/components/form/responsive-size-device-icon.tsx
2363
+ import { useState as useState6 } from "react";
2364
+
2365
+ // src/components/form/responsive-types.tsx
2366
+ import { jsx as jsx40, jsxs as jsxs25 } from "react/jsx-runtime";
2367
+ var DEVICES = [
2368
+ { key: "desktop", label: "Desktop", width: "1200px" },
2369
+ { key: "laptop", label: "Laptop", width: "1024px" },
2370
+ { key: "tablet", label: "Tablet", width: "768px" },
2371
+ { key: "mobile", label: "Mobile", width: "375px" }
2372
+ ];
2373
+ var DEVICE_ICONS = {
2374
+ desktop: /* @__PURE__ */ jsxs25("svg", { className: "w-3.5 h-3.5", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
2375
+ /* @__PURE__ */ jsx40("rect", { x: "2", y: "4", width: "20", height: "14", rx: "2" }),
2376
+ /* @__PURE__ */ jsx40("path", { d: "M8 20h8M12 18v2" })
2377
+ ] }),
2378
+ laptop: /* @__PURE__ */ jsxs25("svg", { className: "w-3.5 h-3.5", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
2379
+ /* @__PURE__ */ jsx40("rect", { x: "3", y: "5", width: "18", height: "12", rx: "1.5" }),
2380
+ /* @__PURE__ */ jsx40("path", { d: "M1 19h22" })
2381
+ ] }),
2382
+ tablet: /* @__PURE__ */ jsxs25("svg", { className: "w-3.5 h-3.5", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
2383
+ /* @__PURE__ */ jsx40("rect", { x: "4", y: "2", width: "16", height: "20", rx: "2" }),
2384
+ /* @__PURE__ */ jsx40("circle", { cx: "12", cy: "18", r: "0.5", fill: "currentColor" })
2385
+ ] }),
2386
+ mobile: /* @__PURE__ */ jsxs25("svg", { className: "w-3.5 h-3.5", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
2387
+ /* @__PURE__ */ jsx40("rect", { x: "6", y: "2", width: "12", height: "20", rx: "2" }),
2388
+ /* @__PURE__ */ jsx40("circle", { cx: "12", cy: "18", r: "0.5", fill: "currentColor" })
2389
+ ] })
2390
+ };
2391
+
2392
+ // src/components/form/responsive-size-device-icon.tsx
2393
+ import { jsx as jsx41, jsxs as jsxs26 } from "react/jsx-runtime";
2394
+ function ResponsiveSizeDeviceIcon({
2395
+ activeDevice,
2396
+ setActiveDevice
2397
+ }) {
2398
+ const [open, setOpen] = useState6(false);
2399
+ return /* @__PURE__ */ jsxs26("div", { className: "relative", children: [
2400
+ /* @__PURE__ */ jsx41(
2401
+ "button",
2402
+ {
2403
+ type: "button",
2404
+ onClick: () => setOpen((o) => !o),
2405
+ className: "flex items-center text-white/30 hover:text-white/60 transition-colors",
2406
+ children: DEVICE_ICONS[activeDevice]
2407
+ }
2408
+ ),
2409
+ open && /* @__PURE__ */ jsx41(
2410
+ "div",
2411
+ {
2412
+ className: "absolute left-0 top-full mt-1 z-[200] rounded-lg overflow-hidden border border-white/10 shadow-xl",
2413
+ style: { background: "#1e2030", minWidth: 160 },
2414
+ children: DEVICES.map((d) => /* @__PURE__ */ jsxs26(
2415
+ "button",
2416
+ {
2417
+ type: "button",
2418
+ onClick: () => {
2419
+ setActiveDevice(d.key);
2420
+ setOpen(false);
2421
+ },
2422
+ className: "w-full flex items-center gap-3 px-3 py-2 text-xs hover:bg-white/10 transition-colors",
2423
+ children: [
2424
+ /* @__PURE__ */ jsx41("span", { className: "text-white/60", children: DEVICE_ICONS[d.key] }),
2425
+ /* @__PURE__ */ jsx41("span", { className: "text-white/70 flex-1 text-left", children: d.label }),
2426
+ /* @__PURE__ */ jsx41("span", { className: "text-white/30", children: d.width }),
2427
+ activeDevice === d.key && /* @__PURE__ */ jsx41(
2428
+ "svg",
2429
+ {
2430
+ className: "w-3 h-3 text-[#287f71] shrink-0",
2431
+ viewBox: "0 0 24 24",
2432
+ fill: "none",
2433
+ stroke: "currentColor",
2434
+ strokeWidth: "2.5",
2435
+ children: /* @__PURE__ */ jsx41("path", { d: "m5 13 4 4L19 7" })
2436
+ }
2437
+ )
2438
+ ]
2439
+ },
2440
+ d.key
2441
+ ))
2442
+ }
2443
+ )
2444
+ ] });
2445
+ }
2446
+
2447
+ // src/components/form/responsive-size-field.tsx
2448
+ import { useState as useState7 } from "react";
2449
+ import { jsx as jsx42, jsxs as jsxs27 } from "react/jsx-runtime";
2450
+ function ResponsiveSizeField({
2451
+ value,
2452
+ unit,
2453
+ customUnit,
2454
+ activeDevice,
2455
+ onSizeChange,
2456
+ onUnitChange,
2457
+ onCustomChange
2458
+ }) {
2459
+ const [unitOpen, setUnitOpen] = useState7(false);
2460
+ const currentVal = value[activeDevice] ?? value.desktop ?? 0;
2461
+ const isCustom = unit === "custom";
2462
+ return /* @__PURE__ */ jsxs27("div", { className: "relative flex items-center border border-white/10 rounded-md bg-white/5 w-full", style: { height: 32 }, children: [
2463
+ isCustom ? /* @__PURE__ */ jsx42(
2464
+ LocalInput,
2465
+ {
2466
+ type: "text",
2467
+ value: customUnit || "",
2468
+ onChange: (v) => onCustomChange?.(v),
2469
+ commitOnBlur: true,
2470
+ placeholder: "e.g. 2rem",
2471
+ className: "flex-1 min-w-0 bg-transparent px-2 text-xs text-white/80 outline-none h-full"
2472
+ }
2473
+ ) : /* @__PURE__ */ jsx42(
2474
+ LocalInput,
2475
+ {
2476
+ type: "number",
2477
+ min: 0,
2478
+ value: currentVal,
2479
+ onChange: (v) => onSizeChange(activeDevice, +v),
2480
+ commitOnBlur: true,
2481
+ className: "flex-1 min-w-0 bg-transparent px-2 text-xs text-white/80 outline-none text-center h-full"
2482
+ }
2483
+ ),
2484
+ isCustom ? /* @__PURE__ */ jsxs27("div", { className: "relative shrink-0", children: [
2485
+ /* @__PURE__ */ jsx42(
2486
+ "div",
2487
+ {
2488
+ role: "button",
2489
+ tabIndex: 0,
2490
+ onClick: () => setUnitOpen((o) => !o),
2491
+ title: "Choose unit",
2492
+ className: "flex items-center justify-center px-2 h-full text-white/30 hover:text-white/60 transition-colors cursor-pointer",
2493
+ children: /* @__PURE__ */ jsx42(
2494
+ "svg",
2495
+ {
2496
+ className: "w-3 h-3",
2497
+ viewBox: "0 0 24 24",
2498
+ fill: "none",
2499
+ stroke: "currentColor",
2500
+ strokeWidth: "1.5",
2501
+ children: /* @__PURE__ */ jsx42("path", { d: "m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Z" })
2502
+ }
2503
+ )
2504
+ }
2505
+ ),
2506
+ unitOpen && /* @__PURE__ */ jsx42(
2507
+ "div",
2508
+ {
2509
+ className: "absolute right-0 top-full mt-1 z-[200] rounded-lg overflow-hidden border border-white/10 shadow-xl",
2510
+ style: { background: "#1e2030", minWidth: 60 },
2511
+ children: ["px", "rem", "em", "vh", "vw"].map((u) => /* @__PURE__ */ jsx42(
2512
+ "div",
2513
+ {
2514
+ role: "button",
2515
+ tabIndex: 0,
2516
+ onClick: () => {
2517
+ onUnitChange(u);
2518
+ setUnitOpen(false);
2519
+ },
2520
+ className: "w-full px-3 py-2 text-xs text-white/70 hover:bg-white/10 text-right transition-colors cursor-pointer",
2521
+ children: u
2522
+ },
2523
+ u
2524
+ ))
2525
+ }
2526
+ )
2527
+ ] }) : /* @__PURE__ */ jsxs27(Select, { value: unit, onValueChange: onUnitChange, children: [
2528
+ /* @__PURE__ */ jsx42(
2529
+ SelectTrigger,
2530
+ {
2531
+ className: "h-full border-0 rounded-l-none rounded-r-lg px-2 text-xs text-white/50 bg-transparent focus:ring-0 shadow-none",
2532
+ style: { width: 52, minWidth: 52 },
2533
+ children: /* @__PURE__ */ jsx42(SelectValue, {})
2534
+ }
2535
+ ),
2536
+ /* @__PURE__ */ jsx42(SelectContent, { style: { background: "#1a1c2e", border: "1px solid rgba(255,255,255,0.1)", color: "rgba(255,255,255,0.7)" }, children: ["px", "rem", "em", "vh", "vw", "custom"].map((u) => /* @__PURE__ */ jsx42(SelectItem, { value: u, children: u }, u)) })
2537
+ ] })
2538
+ ] });
2539
+ }
2540
+
2323
2541
  // src/components/feedback/alert.tsx
2324
2542
  import { AlertCircle, CheckCircle2, Info, AlertTriangle, X as X2 } from "lucide-react";
2325
- import { jsx as jsx39, jsxs as jsxs25 } from "react/jsx-runtime";
2543
+ import { jsx as jsx43, jsxs as jsxs28 } from "react/jsx-runtime";
2326
2544
  var variantConfig = {
2327
2545
  info: {
2328
2546
  icon: Info,
@@ -2351,7 +2569,7 @@ function Alert({
2351
2569
  }) {
2352
2570
  const config = variantConfig[variant];
2353
2571
  const Icon2 = config.icon;
2354
- return /* @__PURE__ */ jsxs25(
2572
+ return /* @__PURE__ */ jsxs28(
2355
2573
  "div",
2356
2574
  {
2357
2575
  className: cn(
@@ -2361,17 +2579,17 @@ function Alert({
2361
2579
  ),
2362
2580
  role: "alert",
2363
2581
  children: [
2364
- /* @__PURE__ */ jsx39(Icon2, { className: "mt-0.5 h-5 w-5 shrink-0" }),
2365
- /* @__PURE__ */ jsxs25("div", { className: "flex-1", children: [
2366
- title && /* @__PURE__ */ jsx39("p", { className: "font-medium", children: title }),
2367
- /* @__PURE__ */ jsx39("div", { className: cn("text-sm", title && "mt-1"), children })
2582
+ /* @__PURE__ */ jsx43(Icon2, { className: "mt-0.5 h-5 w-5 shrink-0" }),
2583
+ /* @__PURE__ */ jsxs28("div", { className: "flex-1", children: [
2584
+ title && /* @__PURE__ */ jsx43("p", { className: "font-medium", children: title }),
2585
+ /* @__PURE__ */ jsx43("div", { className: cn("text-sm", title && "mt-1"), children })
2368
2586
  ] }),
2369
- dismissible && /* @__PURE__ */ jsx39(
2587
+ dismissible && /* @__PURE__ */ jsx43(
2370
2588
  "button",
2371
2589
  {
2372
2590
  onClick: onDismiss,
2373
2591
  className: "absolute right-3 top-3 rounded-md p-1 opacity-70 hover:opacity-100",
2374
- children: /* @__PURE__ */ jsx39(X2, { className: "h-4 w-4" })
2592
+ children: /* @__PURE__ */ jsx43(X2, { className: "h-4 w-4" })
2375
2593
  }
2376
2594
  )
2377
2595
  ]
@@ -2381,14 +2599,14 @@ function Alert({
2381
2599
 
2382
2600
  // src/components/feedback/loading-spinner.tsx
2383
2601
  import { Loader2 } from "lucide-react";
2384
- import { jsx as jsx40 } from "react/jsx-runtime";
2602
+ import { jsx as jsx44 } from "react/jsx-runtime";
2385
2603
  var sizeMap2 = {
2386
2604
  sm: "h-4 w-4",
2387
2605
  md: "h-6 w-6",
2388
2606
  lg: "h-8 w-8"
2389
2607
  };
2390
2608
  function LoadingSpinner({ size = "md", className }) {
2391
- return /* @__PURE__ */ jsx40(
2609
+ return /* @__PURE__ */ jsx44(
2392
2610
  Loader2,
2393
2611
  {
2394
2612
  className: cn("animate-spin text-muted-foreground", sizeMap2[size], className)
@@ -2397,7 +2615,7 @@ function LoadingSpinner({ size = "md", className }) {
2397
2615
  }
2398
2616
 
2399
2617
  // src/components/feedback/confirm-dialog.tsx
2400
- import { jsx as jsx41, jsxs as jsxs26 } from "react/jsx-runtime";
2618
+ import { jsx as jsx45, jsxs as jsxs29 } from "react/jsx-runtime";
2401
2619
  function ConfirmDialog({
2402
2620
  open,
2403
2621
  onOpenChange,
@@ -2409,13 +2627,13 @@ function ConfirmDialog({
2409
2627
  loading,
2410
2628
  variant = "default"
2411
2629
  }) {
2412
- return /* @__PURE__ */ jsx41(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs26(DialogContent, { children: [
2413
- /* @__PURE__ */ jsxs26(DialogHeader, { children: [
2414
- /* @__PURE__ */ jsx41(DialogTitle, { children: title }),
2415
- description && /* @__PURE__ */ jsx41(DialogDescription, { children: description })
2630
+ return /* @__PURE__ */ jsx45(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs29(DialogContent, { children: [
2631
+ /* @__PURE__ */ jsxs29(DialogHeader, { children: [
2632
+ /* @__PURE__ */ jsx45(DialogTitle, { children: title }),
2633
+ description && /* @__PURE__ */ jsx45(DialogDescription, { children: description })
2416
2634
  ] }),
2417
- /* @__PURE__ */ jsxs26(DialogFooter, { children: [
2418
- /* @__PURE__ */ jsx41(
2635
+ /* @__PURE__ */ jsxs29(DialogFooter, { children: [
2636
+ /* @__PURE__ */ jsx45(
2419
2637
  Button,
2420
2638
  {
2421
2639
  variant: "outline",
@@ -2424,14 +2642,14 @@ function ConfirmDialog({
2424
2642
  children: cancelLabel
2425
2643
  }
2426
2644
  ),
2427
- /* @__PURE__ */ jsxs26(
2645
+ /* @__PURE__ */ jsxs29(
2428
2646
  Button,
2429
2647
  {
2430
2648
  variant: variant === "destructive" ? "destructive" : "default",
2431
2649
  onClick: onConfirm,
2432
2650
  disabled: loading,
2433
2651
  children: [
2434
- loading && /* @__PURE__ */ jsx41(LoadingSpinner, { size: "sm", className: "mr-2" }),
2652
+ loading && /* @__PURE__ */ jsx45(LoadingSpinner, { size: "sm", className: "mr-2" }),
2435
2653
  confirmLabel
2436
2654
  ]
2437
2655
  }
@@ -2441,7 +2659,7 @@ function ConfirmDialog({
2441
2659
  }
2442
2660
 
2443
2661
  // src/components/content/post-status-badge.tsx
2444
- import { jsx as jsx42, jsxs as jsxs27 } from "react/jsx-runtime";
2662
+ import { jsx as jsx46, jsxs as jsxs30 } from "react/jsx-runtime";
2445
2663
  var statusConfig = {
2446
2664
  DRAFT: {
2447
2665
  label: "Draft",
@@ -2474,7 +2692,7 @@ function PostStatusBadge({
2474
2692
  className
2475
2693
  }) {
2476
2694
  const config = statusConfig[status];
2477
- return /* @__PURE__ */ jsxs27(
2695
+ return /* @__PURE__ */ jsxs30(
2478
2696
  "span",
2479
2697
  {
2480
2698
  className: cn(
@@ -2484,7 +2702,7 @@ function PostStatusBadge({
2484
2702
  className
2485
2703
  ),
2486
2704
  children: [
2487
- /* @__PURE__ */ jsx42(
2705
+ /* @__PURE__ */ jsx46(
2488
2706
  "span",
2489
2707
  {
2490
2708
  className: cn("inline-block rounded-full", config.dot, {
@@ -2503,9 +2721,9 @@ function PostStatusBadge({
2503
2721
  import * as React21 from "react";
2504
2722
 
2505
2723
  // src/components/Skeleton.tsx
2506
- import { jsx as jsx43 } from "react/jsx-runtime";
2724
+ import { jsx as jsx47 } from "react/jsx-runtime";
2507
2725
  function Skeleton2({ width = "100%", height = 16, rounded, style }) {
2508
- return /* @__PURE__ */ jsx43(
2726
+ return /* @__PURE__ */ jsx47(
2509
2727
  "div",
2510
2728
  {
2511
2729
  style: {
@@ -2518,7 +2736,7 @@ function Skeleton2({ width = "100%", height = 16, rounded, style }) {
2518
2736
  flexShrink: 0,
2519
2737
  ...style
2520
2738
  },
2521
- children: /* @__PURE__ */ jsx43(
2739
+ children: /* @__PURE__ */ jsx47(
2522
2740
  "div",
2523
2741
  {
2524
2742
  style: {
@@ -2534,49 +2752,49 @@ function Skeleton2({ width = "100%", height = 16, rounded, style }) {
2534
2752
  }
2535
2753
 
2536
2754
  // src/components/content/post-list-table.tsx
2537
- import { jsx as jsx44, jsxs as jsxs28 } from "react/jsx-runtime";
2755
+ import { jsx as jsx48, jsxs as jsxs31 } from "react/jsx-runtime";
2538
2756
  function IconEdit() {
2539
- return /* @__PURE__ */ jsxs28("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2540
- /* @__PURE__ */ jsx44("path", { d: "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" }),
2541
- /* @__PURE__ */ jsx44("path", { d: "M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" })
2757
+ return /* @__PURE__ */ jsxs31("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2758
+ /* @__PURE__ */ jsx48("path", { d: "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" }),
2759
+ /* @__PURE__ */ jsx48("path", { d: "M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" })
2542
2760
  ] });
2543
2761
  }
2544
2762
  function IconTrash() {
2545
- return /* @__PURE__ */ jsxs28("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2546
- /* @__PURE__ */ jsx44("polyline", { points: "3 6 5 6 21 6" }),
2547
- /* @__PURE__ */ jsx44("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }),
2548
- /* @__PURE__ */ jsx44("path", { d: "M10 11v6" }),
2549
- /* @__PURE__ */ jsx44("path", { d: "M14 11v6" }),
2550
- /* @__PURE__ */ jsx44("path", { d: "M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2" })
2763
+ return /* @__PURE__ */ jsxs31("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2764
+ /* @__PURE__ */ jsx48("polyline", { points: "3 6 5 6 21 6" }),
2765
+ /* @__PURE__ */ jsx48("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }),
2766
+ /* @__PURE__ */ jsx48("path", { d: "M10 11v6" }),
2767
+ /* @__PURE__ */ jsx48("path", { d: "M14 11v6" }),
2768
+ /* @__PURE__ */ jsx48("path", { d: "M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2" })
2551
2769
  ] });
2552
2770
  }
2553
2771
  function IconCopy() {
2554
- return /* @__PURE__ */ jsxs28("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2555
- /* @__PURE__ */ jsx44("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }),
2556
- /* @__PURE__ */ jsx44("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
2772
+ return /* @__PURE__ */ jsxs31("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2773
+ /* @__PURE__ */ jsx48("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }),
2774
+ /* @__PURE__ */ jsx48("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
2557
2775
  ] });
2558
2776
  }
2559
2777
  function IconMoreHorizontal() {
2560
- return /* @__PURE__ */ jsxs28("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2561
- /* @__PURE__ */ jsx44("circle", { cx: "5", cy: "12", r: "1", fill: "currentColor" }),
2562
- /* @__PURE__ */ jsx44("circle", { cx: "12", cy: "12", r: "1", fill: "currentColor" }),
2563
- /* @__PURE__ */ jsx44("circle", { cx: "19", cy: "12", r: "1", fill: "currentColor" })
2778
+ return /* @__PURE__ */ jsxs31("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2779
+ /* @__PURE__ */ jsx48("circle", { cx: "5", cy: "12", r: "1", fill: "currentColor" }),
2780
+ /* @__PURE__ */ jsx48("circle", { cx: "12", cy: "12", r: "1", fill: "currentColor" }),
2781
+ /* @__PURE__ */ jsx48("circle", { cx: "19", cy: "12", r: "1", fill: "currentColor" })
2564
2782
  ] });
2565
2783
  }
2566
2784
  function IconChevronRight() {
2567
- return /* @__PURE__ */ jsx44("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx44("polyline", { points: "9 18 15 12 9 6" }) });
2785
+ return /* @__PURE__ */ jsx48("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx48("polyline", { points: "9 18 15 12 9 6" }) });
2568
2786
  }
2569
2787
  function IconImage() {
2570
- return /* @__PURE__ */ jsxs28("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
2571
- /* @__PURE__ */ jsx44("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }),
2572
- /* @__PURE__ */ jsx44("circle", { cx: "8.5", cy: "8.5", r: "1.5" }),
2573
- /* @__PURE__ */ jsx44("polyline", { points: "21 15 16 10 5 21" })
2788
+ return /* @__PURE__ */ jsxs31("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
2789
+ /* @__PURE__ */ jsx48("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }),
2790
+ /* @__PURE__ */ jsx48("circle", { cx: "8.5", cy: "8.5", r: "1.5" }),
2791
+ /* @__PURE__ */ jsx48("polyline", { points: "21 15 16 10 5 21" })
2574
2792
  ] });
2575
2793
  }
2576
2794
  function IconPlus() {
2577
- return /* @__PURE__ */ jsxs28("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2578
- /* @__PURE__ */ jsx44("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
2579
- /* @__PURE__ */ jsx44("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
2795
+ return /* @__PURE__ */ jsxs31("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2796
+ /* @__PURE__ */ jsx48("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
2797
+ /* @__PURE__ */ jsx48("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
2580
2798
  ] });
2581
2799
  }
2582
2800
  function formatDate(date) {
@@ -2609,17 +2827,17 @@ function RowActions({ post, onEdit, onDelete, onDuplicate, onStatusChange }) {
2609
2827
  { label: "Publish", value: "PUBLISHED" },
2610
2828
  { label: "Archive", value: "ARCHIVED" }
2611
2829
  ];
2612
- return /* @__PURE__ */ jsxs28("div", { className: "relative flex items-center gap-1", ref, children: [
2613
- /* @__PURE__ */ jsx44(
2830
+ return /* @__PURE__ */ jsxs31("div", { className: "relative flex items-center gap-1", ref, children: [
2831
+ /* @__PURE__ */ jsx48(
2614
2832
  "button",
2615
2833
  {
2616
2834
  onClick: () => onEdit?.(post.id),
2617
2835
  className: "inline-flex items-center justify-center h-7 w-7 rounded-md text-muted-foreground hover:bg-accent hover:text-foreground transition-colors",
2618
2836
  title: "Edit",
2619
- children: /* @__PURE__ */ jsx44(IconEdit, {})
2837
+ children: /* @__PURE__ */ jsx48(IconEdit, {})
2620
2838
  }
2621
2839
  ),
2622
- /* @__PURE__ */ jsx44(
2840
+ /* @__PURE__ */ jsx48(
2623
2841
  "button",
2624
2842
  {
2625
2843
  onClick: () => {
@@ -2628,11 +2846,11 @@ function RowActions({ post, onEdit, onDelete, onDuplicate, onStatusChange }) {
2628
2846
  },
2629
2847
  className: "inline-flex items-center justify-center h-7 w-7 rounded-md text-muted-foreground hover:bg-accent hover:text-foreground transition-colors",
2630
2848
  title: "More actions",
2631
- children: /* @__PURE__ */ jsx44(IconMoreHorizontal, {})
2849
+ children: /* @__PURE__ */ jsx48(IconMoreHorizontal, {})
2632
2850
  }
2633
2851
  ),
2634
- open && /* @__PURE__ */ jsxs28("div", { className: "absolute right-0 top-8 z-50 min-w-[160px] rounded-lg border border-border bg-card shadow-md py-1", children: [
2635
- /* @__PURE__ */ jsxs28(
2852
+ open && /* @__PURE__ */ jsxs31("div", { className: "absolute right-0 top-8 z-50 min-w-[160px] rounded-lg border border-border bg-card shadow-md py-1", children: [
2853
+ /* @__PURE__ */ jsxs31(
2636
2854
  "button",
2637
2855
  {
2638
2856
  onClick: () => {
@@ -2641,13 +2859,13 @@ function RowActions({ post, onEdit, onDelete, onDuplicate, onStatusChange }) {
2641
2859
  },
2642
2860
  className: "flex w-full items-center gap-2 px-3 py-1.5 text-sm hover:bg-accent transition-colors",
2643
2861
  children: [
2644
- /* @__PURE__ */ jsx44(IconCopy, {}),
2862
+ /* @__PURE__ */ jsx48(IconCopy, {}),
2645
2863
  "Duplicate"
2646
2864
  ]
2647
2865
  }
2648
2866
  ),
2649
- /* @__PURE__ */ jsxs28("div", { className: "relative", children: [
2650
- /* @__PURE__ */ jsxs28(
2867
+ /* @__PURE__ */ jsxs31("div", { className: "relative", children: [
2868
+ /* @__PURE__ */ jsxs31(
2651
2869
  "button",
2652
2870
  {
2653
2871
  onMouseEnter: () => setStatusOpen(true),
@@ -2655,18 +2873,18 @@ function RowActions({ post, onEdit, onDelete, onDuplicate, onStatusChange }) {
2655
2873
  onClick: () => setStatusOpen((v) => !v),
2656
2874
  className: "flex w-full items-center justify-between gap-2 px-3 py-1.5 text-sm hover:bg-accent transition-colors",
2657
2875
  children: [
2658
- /* @__PURE__ */ jsx44("span", { children: "Change status" }),
2659
- /* @__PURE__ */ jsx44(IconChevronRight, {})
2876
+ /* @__PURE__ */ jsx48("span", { children: "Change status" }),
2877
+ /* @__PURE__ */ jsx48(IconChevronRight, {})
2660
2878
  ]
2661
2879
  }
2662
2880
  ),
2663
- statusOpen && /* @__PURE__ */ jsx44(
2881
+ statusOpen && /* @__PURE__ */ jsx48(
2664
2882
  "div",
2665
2883
  {
2666
2884
  className: "absolute left-full top-0 z-50 min-w-[130px] rounded-lg border border-border bg-card shadow-md py-1",
2667
2885
  onMouseEnter: () => setStatusOpen(true),
2668
2886
  onMouseLeave: () => setStatusOpen(false),
2669
- children: statusOptions.map((opt) => /* @__PURE__ */ jsx44(
2887
+ children: statusOptions.map((opt) => /* @__PURE__ */ jsx48(
2670
2888
  "button",
2671
2889
  {
2672
2890
  onClick: () => {
@@ -2685,8 +2903,8 @@ function RowActions({ post, onEdit, onDelete, onDuplicate, onStatusChange }) {
2685
2903
  }
2686
2904
  )
2687
2905
  ] }),
2688
- /* @__PURE__ */ jsx44("div", { className: "my-1 border-t border-border" }),
2689
- /* @__PURE__ */ jsxs28(
2906
+ /* @__PURE__ */ jsx48("div", { className: "my-1 border-t border-border" }),
2907
+ /* @__PURE__ */ jsxs31(
2690
2908
  "button",
2691
2909
  {
2692
2910
  onClick: () => {
@@ -2695,7 +2913,7 @@ function RowActions({ post, onEdit, onDelete, onDuplicate, onStatusChange }) {
2695
2913
  },
2696
2914
  className: "flex w-full items-center gap-2 px-3 py-1.5 text-sm text-destructive hover:bg-destructive/10 transition-colors",
2697
2915
  children: [
2698
- /* @__PURE__ */ jsx44(IconTrash, {}),
2916
+ /* @__PURE__ */ jsx48(IconTrash, {}),
2699
2917
  "Delete"
2700
2918
  ]
2701
2919
  }
@@ -2704,21 +2922,21 @@ function RowActions({ post, onEdit, onDelete, onDuplicate, onStatusChange }) {
2704
2922
  ] });
2705
2923
  }
2706
2924
  function SkeletonRow() {
2707
- return /* @__PURE__ */ jsxs28("tr", { children: [
2708
- /* @__PURE__ */ jsx44("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx44(Skeleton2, { className: "w-10 h-10 rounded-lg" }) }),
2709
- /* @__PURE__ */ jsxs28("td", { className: "px-4 py-3", children: [
2710
- /* @__PURE__ */ jsx44(Skeleton2, { className: "h-4 w-40 mb-1.5" }),
2711
- /* @__PURE__ */ jsx44(Skeleton2, { className: "h-3 w-24" })
2925
+ return /* @__PURE__ */ jsxs31("tr", { children: [
2926
+ /* @__PURE__ */ jsx48("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx48(Skeleton2, { className: "w-10 h-10 rounded-lg" }) }),
2927
+ /* @__PURE__ */ jsxs31("td", { className: "px-4 py-3", children: [
2928
+ /* @__PURE__ */ jsx48(Skeleton2, { className: "h-4 w-40 mb-1.5" }),
2929
+ /* @__PURE__ */ jsx48(Skeleton2, { className: "h-3 w-24" })
2712
2930
  ] }),
2713
- /* @__PURE__ */ jsx44("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx44(Skeleton2, { className: "h-5 w-20 rounded-full" }) }),
2714
- /* @__PURE__ */ jsx44("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
2715
- /* @__PURE__ */ jsx44(Skeleton2, { className: "w-6 h-6 rounded-full" }),
2716
- /* @__PURE__ */ jsx44(Skeleton2, { className: "h-4 w-20" })
2931
+ /* @__PURE__ */ jsx48("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx48(Skeleton2, { className: "h-5 w-20 rounded-full" }) }),
2932
+ /* @__PURE__ */ jsx48("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxs31("div", { className: "flex items-center gap-2", children: [
2933
+ /* @__PURE__ */ jsx48(Skeleton2, { className: "w-6 h-6 rounded-full" }),
2934
+ /* @__PURE__ */ jsx48(Skeleton2, { className: "h-4 w-20" })
2717
2935
  ] }) }),
2718
- /* @__PURE__ */ jsx44("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx44(Skeleton2, { className: "h-4 w-24" }) }),
2719
- /* @__PURE__ */ jsx44("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxs28("div", { className: "flex gap-1", children: [
2720
- /* @__PURE__ */ jsx44(Skeleton2, { className: "w-7 h-7 rounded-md" }),
2721
- /* @__PURE__ */ jsx44(Skeleton2, { className: "w-7 h-7 rounded-md" })
2936
+ /* @__PURE__ */ jsx48("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx48(Skeleton2, { className: "h-4 w-24" }) }),
2937
+ /* @__PURE__ */ jsx48("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxs31("div", { className: "flex gap-1", children: [
2938
+ /* @__PURE__ */ jsx48(Skeleton2, { className: "w-7 h-7 rounded-md" }),
2939
+ /* @__PURE__ */ jsx48(Skeleton2, { className: "w-7 h-7 rounded-md" })
2722
2940
  ] }) })
2723
2941
  ] });
2724
2942
  }
@@ -2737,45 +2955,45 @@ function PostListTable({
2737
2955
  className
2738
2956
  }) {
2739
2957
  const isEmpty = !loading && posts.length === 0;
2740
- return /* @__PURE__ */ jsxs28("div", { className: cn("w-full overflow-x-auto rounded-lg border border-border bg-card", className), children: [
2741
- /* @__PURE__ */ jsxs28("table", { className: "w-full text-sm", children: [
2742
- /* @__PURE__ */ jsx44("thead", { children: /* @__PURE__ */ jsxs28("tr", { className: "border-b border-border bg-muted/40", children: [
2743
- /* @__PURE__ */ jsx44("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground w-14", children: "Image" }),
2744
- /* @__PURE__ */ jsx44("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Title" }),
2745
- /* @__PURE__ */ jsx44("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Status" }),
2746
- /* @__PURE__ */ jsx44("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Author" }),
2747
- /* @__PURE__ */ jsx44("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Date" }),
2748
- /* @__PURE__ */ jsx44("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground", children: "Actions" })
2958
+ return /* @__PURE__ */ jsxs31("div", { className: cn("w-full overflow-x-auto rounded-lg border border-border bg-card", className), children: [
2959
+ /* @__PURE__ */ jsxs31("table", { className: "w-full text-sm", children: [
2960
+ /* @__PURE__ */ jsx48("thead", { children: /* @__PURE__ */ jsxs31("tr", { className: "border-b border-border bg-muted/40", children: [
2961
+ /* @__PURE__ */ jsx48("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground w-14", children: "Image" }),
2962
+ /* @__PURE__ */ jsx48("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Title" }),
2963
+ /* @__PURE__ */ jsx48("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Status" }),
2964
+ /* @__PURE__ */ jsx48("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Author" }),
2965
+ /* @__PURE__ */ jsx48("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Date" }),
2966
+ /* @__PURE__ */ jsx48("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground", children: "Actions" })
2749
2967
  ] }) }),
2750
- /* @__PURE__ */ jsx44("tbody", { children: loading ? Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsx44(SkeletonRow, {}, i)) : isEmpty ? null : posts.map((post) => {
2968
+ /* @__PURE__ */ jsx48("tbody", { children: loading ? Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsx48(SkeletonRow, {}, i)) : isEmpty ? null : posts.map((post) => {
2751
2969
  const date = post.status === "PUBLISHED" && post.publishedAt ? formatDate(post.publishedAt) : formatDate(post.createdAt);
2752
- return /* @__PURE__ */ jsxs28(
2970
+ return /* @__PURE__ */ jsxs31(
2753
2971
  "tr",
2754
2972
  {
2755
2973
  className: "border-b border-border last:border-0 hover:bg-muted/30 transition-colors",
2756
2974
  children: [
2757
- /* @__PURE__ */ jsx44("td", { className: "px-4 py-3", children: post.featuredImageUrl ? /* @__PURE__ */ jsx44(
2975
+ /* @__PURE__ */ jsx48("td", { className: "px-4 py-3", children: post.featuredImageUrl ? /* @__PURE__ */ jsx48(
2758
2976
  "img",
2759
2977
  {
2760
2978
  src: post.featuredImageUrl,
2761
2979
  alt: post.title,
2762
2980
  className: "w-10 h-10 rounded-lg object-cover"
2763
2981
  }
2764
- ) : /* @__PURE__ */ jsx44("div", { className: "w-10 h-10 rounded-lg bg-muted flex items-center justify-center text-muted-foreground", children: /* @__PURE__ */ jsx44(IconImage, {}) }) }),
2765
- /* @__PURE__ */ jsxs28("td", { className: "px-4 py-3", children: [
2766
- /* @__PURE__ */ jsx44("div", { className: "font-medium text-foreground leading-tight truncate max-w-[240px]", children: post.title }),
2767
- /* @__PURE__ */ jsxs28("div", { className: "text-xs text-muted-foreground mt-0.5 truncate max-w-[240px]", children: [
2982
+ ) : /* @__PURE__ */ jsx48("div", { className: "w-10 h-10 rounded-lg bg-muted flex items-center justify-center text-muted-foreground", children: /* @__PURE__ */ jsx48(IconImage, {}) }) }),
2983
+ /* @__PURE__ */ jsxs31("td", { className: "px-4 py-3", children: [
2984
+ /* @__PURE__ */ jsx48("div", { className: "font-medium text-foreground leading-tight truncate max-w-[240px]", children: post.title }),
2985
+ /* @__PURE__ */ jsxs31("div", { className: "text-xs text-muted-foreground mt-0.5 truncate max-w-[240px]", children: [
2768
2986
  "/",
2769
2987
  post.slug
2770
2988
  ] })
2771
2989
  ] }),
2772
- /* @__PURE__ */ jsx44("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx44(PostStatusBadge, { status: post.status, size: "sm" }) }),
2773
- /* @__PURE__ */ jsx44("td", { className: "px-4 py-3", children: post.author ? /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
2774
- /* @__PURE__ */ jsx44("div", { className: "w-6 h-6 rounded-full bg-primary/20 text-primary flex items-center justify-center text-[10px] font-semibold shrink-0", children: getInitials(post.author) }),
2775
- /* @__PURE__ */ jsx44("span", { className: "text-sm text-foreground truncate max-w-[100px]", children: post.author })
2776
- ] }) : /* @__PURE__ */ jsx44("span", { className: "text-muted-foreground text-xs", children: "\u2014" }) }),
2777
- /* @__PURE__ */ jsx44("td", { className: "px-4 py-3 text-sm text-muted-foreground whitespace-nowrap", children: date }),
2778
- /* @__PURE__ */ jsx44("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx44("div", { className: "flex justify-end", children: /* @__PURE__ */ jsx44(
2990
+ /* @__PURE__ */ jsx48("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx48(PostStatusBadge, { status: post.status, size: "sm" }) }),
2991
+ /* @__PURE__ */ jsx48("td", { className: "px-4 py-3", children: post.author ? /* @__PURE__ */ jsxs31("div", { className: "flex items-center gap-2", children: [
2992
+ /* @__PURE__ */ jsx48("div", { className: "w-6 h-6 rounded-full bg-primary/20 text-primary flex items-center justify-center text-[10px] font-semibold shrink-0", children: getInitials(post.author) }),
2993
+ /* @__PURE__ */ jsx48("span", { className: "text-sm text-foreground truncate max-w-[100px]", children: post.author })
2994
+ ] }) : /* @__PURE__ */ jsx48("span", { className: "text-muted-foreground text-xs", children: "\u2014" }) }),
2995
+ /* @__PURE__ */ jsx48("td", { className: "px-4 py-3 text-sm text-muted-foreground whitespace-nowrap", children: date }),
2996
+ /* @__PURE__ */ jsx48("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx48("div", { className: "flex justify-end", children: /* @__PURE__ */ jsx48(
2779
2997
  RowActions,
2780
2998
  {
2781
2999
  post,
@@ -2791,22 +3009,22 @@ function PostListTable({
2791
3009
  );
2792
3010
  }) })
2793
3011
  ] }),
2794
- isEmpty && /* @__PURE__ */ jsxs28("div", { className: "flex flex-col items-center justify-center py-16 px-6 text-center", children: [
2795
- /* @__PURE__ */ jsx44("div", { className: "text-muted-foreground mb-3", children: emptyIcon ?? /* @__PURE__ */ jsxs28("svg", { width: "40", height: "40", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round", className: "opacity-40", children: [
2796
- /* @__PURE__ */ jsx44("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" }),
2797
- /* @__PURE__ */ jsx44("polyline", { points: "14 2 14 8 20 8" }),
2798
- /* @__PURE__ */ jsx44("line", { x1: "16", y1: "13", x2: "8", y2: "13" }),
2799
- /* @__PURE__ */ jsx44("line", { x1: "16", y1: "17", x2: "8", y2: "17" }),
2800
- /* @__PURE__ */ jsx44("polyline", { points: "10 9 9 9 8 9" })
3012
+ isEmpty && /* @__PURE__ */ jsxs31("div", { className: "flex flex-col items-center justify-center py-16 px-6 text-center", children: [
3013
+ /* @__PURE__ */ jsx48("div", { className: "text-muted-foreground mb-3", children: emptyIcon ?? /* @__PURE__ */ jsxs31("svg", { width: "40", height: "40", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round", className: "opacity-40", children: [
3014
+ /* @__PURE__ */ jsx48("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" }),
3015
+ /* @__PURE__ */ jsx48("polyline", { points: "14 2 14 8 20 8" }),
3016
+ /* @__PURE__ */ jsx48("line", { x1: "16", y1: "13", x2: "8", y2: "13" }),
3017
+ /* @__PURE__ */ jsx48("line", { x1: "16", y1: "17", x2: "8", y2: "17" }),
3018
+ /* @__PURE__ */ jsx48("polyline", { points: "10 9 9 9 8 9" })
2801
3019
  ] }) }),
2802
- /* @__PURE__ */ jsx44("p", { className: "text-sm text-muted-foreground mb-4", children: emptyMessage ?? `No ${singularLabel.toLowerCase()}s yet.` }),
2803
- onNewPost && /* @__PURE__ */ jsxs28(
3020
+ /* @__PURE__ */ jsx48("p", { className: "text-sm text-muted-foreground mb-4", children: emptyMessage ?? `No ${singularLabel.toLowerCase()}s yet.` }),
3021
+ onNewPost && /* @__PURE__ */ jsxs31(
2804
3022
  "button",
2805
3023
  {
2806
3024
  onClick: onNewPost,
2807
3025
  className: "inline-flex items-center gap-1.5 rounded-lg bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors",
2808
3026
  children: [
2809
- /* @__PURE__ */ jsx44(IconPlus, {}),
3027
+ /* @__PURE__ */ jsx48(IconPlus, {}),
2810
3028
  newPostLabel ?? `New ${singularLabel}`
2811
3029
  ]
2812
3030
  }
@@ -2816,7 +3034,7 @@ function PostListTable({
2816
3034
  }
2817
3035
 
2818
3036
  // src/components/content/post-filters-bar.tsx
2819
- import { jsx as jsx45, jsxs as jsxs29 } from "react/jsx-runtime";
3037
+ import { jsx as jsx49, jsxs as jsxs32 } from "react/jsx-runtime";
2820
3038
  var STATUS_TABS = [
2821
3039
  { value: "all", label: "All" },
2822
3040
  { value: "DRAFT", label: "Draft" },
@@ -2825,7 +3043,7 @@ var STATUS_TABS = [
2825
3043
  { value: "ARCHIVED", label: "Archived" }
2826
3044
  ];
2827
3045
  function IconSearch() {
2828
- return /* @__PURE__ */ jsxs29(
3046
+ return /* @__PURE__ */ jsxs32(
2829
3047
  "svg",
2830
3048
  {
2831
3049
  width: "14",
@@ -2837,14 +3055,14 @@ function IconSearch() {
2837
3055
  strokeLinecap: "round",
2838
3056
  strokeLinejoin: "round",
2839
3057
  children: [
2840
- /* @__PURE__ */ jsx45("circle", { cx: "11", cy: "11", r: "8" }),
2841
- /* @__PURE__ */ jsx45("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" })
3058
+ /* @__PURE__ */ jsx49("circle", { cx: "11", cy: "11", r: "8" }),
3059
+ /* @__PURE__ */ jsx49("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" })
2842
3060
  ]
2843
3061
  }
2844
3062
  );
2845
3063
  }
2846
3064
  function IconPlus2() {
2847
- return /* @__PURE__ */ jsxs29(
3065
+ return /* @__PURE__ */ jsxs32(
2848
3066
  "svg",
2849
3067
  {
2850
3068
  width: "14",
@@ -2856,8 +3074,8 @@ function IconPlus2() {
2856
3074
  strokeLinecap: "round",
2857
3075
  strokeLinejoin: "round",
2858
3076
  children: [
2859
- /* @__PURE__ */ jsx45("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
2860
- /* @__PURE__ */ jsx45("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
3077
+ /* @__PURE__ */ jsx49("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
3078
+ /* @__PURE__ */ jsx49("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
2861
3079
  ]
2862
3080
  }
2863
3081
  );
@@ -2873,11 +3091,11 @@ function PostFiltersBar({
2873
3091
  typeLabel = "Posts",
2874
3092
  className
2875
3093
  }) {
2876
- return /* @__PURE__ */ jsxs29("div", { className: cn("space-y-2", className), children: [
2877
- /* @__PURE__ */ jsxs29("div", { className: "flex flex-wrap items-center gap-3", children: [
2878
- /* @__PURE__ */ jsxs29("div", { className: "relative flex items-center", children: [
2879
- /* @__PURE__ */ jsx45("span", { className: "absolute left-2.5 text-muted-foreground pointer-events-none", children: /* @__PURE__ */ jsx45(IconSearch, {}) }),
2880
- /* @__PURE__ */ jsx45(
3094
+ return /* @__PURE__ */ jsxs32("div", { className: cn("space-y-2", className), children: [
3095
+ /* @__PURE__ */ jsxs32("div", { className: "flex flex-wrap items-center gap-3", children: [
3096
+ /* @__PURE__ */ jsxs32("div", { className: "relative flex items-center", children: [
3097
+ /* @__PURE__ */ jsx49("span", { className: "absolute left-2.5 text-muted-foreground pointer-events-none", children: /* @__PURE__ */ jsx49(IconSearch, {}) }),
3098
+ /* @__PURE__ */ jsx49(
2881
3099
  "input",
2882
3100
  {
2883
3101
  type: "text",
@@ -2888,7 +3106,7 @@ function PostFiltersBar({
2888
3106
  }
2889
3107
  )
2890
3108
  ] }),
2891
- /* @__PURE__ */ jsx45("div", { className: "flex items-center gap-1 rounded-lg bg-muted p-0.5", children: STATUS_TABS.map((tab) => /* @__PURE__ */ jsx45(
3109
+ /* @__PURE__ */ jsx49("div", { className: "flex items-center gap-1 rounded-lg bg-muted p-0.5", children: STATUS_TABS.map((tab) => /* @__PURE__ */ jsx49(
2892
3110
  "button",
2893
3111
  {
2894
3112
  onClick: () => onStatusChange(tab.value),
@@ -2900,20 +3118,20 @@ function PostFiltersBar({
2900
3118
  },
2901
3119
  tab.value
2902
3120
  )) }),
2903
- /* @__PURE__ */ jsx45("div", { className: "flex-1" }),
2904
- onNew && /* @__PURE__ */ jsxs29(
3121
+ /* @__PURE__ */ jsx49("div", { className: "flex-1" }),
3122
+ onNew && /* @__PURE__ */ jsxs32(
2905
3123
  "button",
2906
3124
  {
2907
3125
  onClick: onNew,
2908
3126
  className: "inline-flex items-center gap-1.5 h-8 rounded-lg bg-primary px-3 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors",
2909
3127
  children: [
2910
- /* @__PURE__ */ jsx45(IconPlus2, {}),
3128
+ /* @__PURE__ */ jsx49(IconPlus2, {}),
2911
3129
  newLabel
2912
3130
  ]
2913
3131
  }
2914
3132
  )
2915
3133
  ] }),
2916
- total !== void 0 && /* @__PURE__ */ jsxs29("p", { className: "text-xs text-muted-foreground", children: [
3134
+ total !== void 0 && /* @__PURE__ */ jsxs32("p", { className: "text-xs text-muted-foreground", children: [
2917
3135
  total,
2918
3136
  " ",
2919
3137
  total === 1 ? typeLabel.replace(/s$/, "") : typeLabel
@@ -2922,9 +3140,9 @@ function PostFiltersBar({
2922
3140
  }
2923
3141
 
2924
3142
  // src/components/content/post-editor-shell.tsx
2925
- import { jsx as jsx46, jsxs as jsxs30 } from "react/jsx-runtime";
3143
+ import { jsx as jsx50, jsxs as jsxs33 } from "react/jsx-runtime";
2926
3144
  function IconArrowLeft() {
2927
- return /* @__PURE__ */ jsxs30(
3145
+ return /* @__PURE__ */ jsxs33(
2928
3146
  "svg",
2929
3147
  {
2930
3148
  width: "14",
@@ -2936,14 +3154,14 @@ function IconArrowLeft() {
2936
3154
  strokeLinecap: "round",
2937
3155
  strokeLinejoin: "round",
2938
3156
  children: [
2939
- /* @__PURE__ */ jsx46("line", { x1: "19", y1: "12", x2: "5", y2: "12" }),
2940
- /* @__PURE__ */ jsx46("polyline", { points: "12 19 5 12 12 5" })
3157
+ /* @__PURE__ */ jsx50("line", { x1: "19", y1: "12", x2: "5", y2: "12" }),
3158
+ /* @__PURE__ */ jsx50("polyline", { points: "12 19 5 12 12 5" })
2941
3159
  ]
2942
3160
  }
2943
3161
  );
2944
3162
  }
2945
3163
  function IconSpinner() {
2946
- return /* @__PURE__ */ jsx46(
3164
+ return /* @__PURE__ */ jsx50(
2947
3165
  "svg",
2948
3166
  {
2949
3167
  width: "14",
@@ -2955,12 +3173,12 @@ function IconSpinner() {
2955
3173
  strokeLinecap: "round",
2956
3174
  strokeLinejoin: "round",
2957
3175
  className: "animate-spin",
2958
- children: /* @__PURE__ */ jsx46("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
3176
+ children: /* @__PURE__ */ jsx50("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
2959
3177
  }
2960
3178
  );
2961
3179
  }
2962
3180
  function IconMoreHorizontal2() {
2963
- return /* @__PURE__ */ jsxs30(
3181
+ return /* @__PURE__ */ jsxs33(
2964
3182
  "svg",
2965
3183
  {
2966
3184
  width: "16",
@@ -2972,9 +3190,9 @@ function IconMoreHorizontal2() {
2972
3190
  strokeLinecap: "round",
2973
3191
  strokeLinejoin: "round",
2974
3192
  children: [
2975
- /* @__PURE__ */ jsx46("circle", { cx: "5", cy: "12", r: "1", fill: "currentColor" }),
2976
- /* @__PURE__ */ jsx46("circle", { cx: "12", cy: "12", r: "1", fill: "currentColor" }),
2977
- /* @__PURE__ */ jsx46("circle", { cx: "19", cy: "12", r: "1", fill: "currentColor" })
3193
+ /* @__PURE__ */ jsx50("circle", { cx: "5", cy: "12", r: "1", fill: "currentColor" }),
3194
+ /* @__PURE__ */ jsx50("circle", { cx: "12", cy: "12", r: "1", fill: "currentColor" }),
3195
+ /* @__PURE__ */ jsx50("circle", { cx: "19", cy: "12", r: "1", fill: "currentColor" })
2978
3196
  ]
2979
3197
  }
2980
3198
  );
@@ -2992,60 +3210,60 @@ function PostEditorShell({
2992
3210
  sidebar,
2993
3211
  className
2994
3212
  }) {
2995
- return /* @__PURE__ */ jsxs30("div", { className: cn("flex flex-col h-screen bg-background overflow-hidden", className), children: [
2996
- /* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-3 h-14 px-4 border-b border-border bg-card shrink-0", children: [
2997
- onBack && /* @__PURE__ */ jsxs30(
3213
+ return /* @__PURE__ */ jsxs33("div", { className: cn("flex flex-col h-screen bg-background overflow-hidden", className), children: [
3214
+ /* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-3 h-14 px-4 border-b border-border bg-card shrink-0", children: [
3215
+ onBack && /* @__PURE__ */ jsxs33(
2998
3216
  "button",
2999
3217
  {
3000
3218
  onClick: onBack,
3001
3219
  className: "inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-sm text-muted-foreground hover:bg-accent hover:text-foreground transition-colors",
3002
3220
  children: [
3003
- /* @__PURE__ */ jsx46(IconArrowLeft, {}),
3221
+ /* @__PURE__ */ jsx50(IconArrowLeft, {}),
3004
3222
  backLabel
3005
3223
  ]
3006
3224
  }
3007
3225
  ),
3008
- onBack && /* @__PURE__ */ jsx46("div", { className: "h-5 w-px bg-border" }),
3009
- title && /* @__PURE__ */ jsx46("span", { className: "text-sm font-medium text-muted-foreground truncate max-w-xs", children: title }),
3010
- status && /* @__PURE__ */ jsx46(PostStatusBadge, { status, size: "sm" }),
3011
- /* @__PURE__ */ jsx46("div", { className: "flex-1" }),
3012
- /* @__PURE__ */ jsx46("button", { className: "inline-flex items-center justify-center h-8 w-8 rounded-lg text-muted-foreground hover:bg-accent hover:text-foreground transition-colors", children: /* @__PURE__ */ jsx46(IconMoreHorizontal2, {}) }),
3013
- /* @__PURE__ */ jsxs30(
3226
+ onBack && /* @__PURE__ */ jsx50("div", { className: "h-5 w-px bg-border" }),
3227
+ title && /* @__PURE__ */ jsx50("span", { className: "text-sm font-medium text-muted-foreground truncate max-w-xs", children: title }),
3228
+ status && /* @__PURE__ */ jsx50(PostStatusBadge, { status, size: "sm" }),
3229
+ /* @__PURE__ */ jsx50("div", { className: "flex-1" }),
3230
+ /* @__PURE__ */ jsx50("button", { className: "inline-flex items-center justify-center h-8 w-8 rounded-lg text-muted-foreground hover:bg-accent hover:text-foreground transition-colors", children: /* @__PURE__ */ jsx50(IconMoreHorizontal2, {}) }),
3231
+ /* @__PURE__ */ jsxs33(
3014
3232
  "button",
3015
3233
  {
3016
3234
  onClick: onSave,
3017
3235
  disabled: saving,
3018
3236
  className: "inline-flex items-center gap-1.5 h-8 rounded-lg border border-border bg-background px-3 text-sm font-medium hover:bg-accent transition-colors disabled:opacity-60",
3019
3237
  children: [
3020
- saving && /* @__PURE__ */ jsx46(IconSpinner, {}),
3238
+ saving && /* @__PURE__ */ jsx50(IconSpinner, {}),
3021
3239
  "Save Draft"
3022
3240
  ]
3023
3241
  }
3024
3242
  ),
3025
- /* @__PURE__ */ jsxs30(
3243
+ /* @__PURE__ */ jsxs33(
3026
3244
  "button",
3027
3245
  {
3028
3246
  onClick: onPublish,
3029
3247
  disabled: publishing,
3030
3248
  className: "inline-flex items-center gap-1.5 h-8 rounded-lg bg-primary px-3 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-60",
3031
3249
  children: [
3032
- publishing && /* @__PURE__ */ jsx46(IconSpinner, {}),
3250
+ publishing && /* @__PURE__ */ jsx50(IconSpinner, {}),
3033
3251
  "Publish"
3034
3252
  ]
3035
3253
  }
3036
3254
  )
3037
3255
  ] }),
3038
- /* @__PURE__ */ jsxs30("div", { className: "flex flex-1 overflow-hidden", children: [
3039
- /* @__PURE__ */ jsx46("div", { className: "flex-1 overflow-y-auto p-6", children: /* @__PURE__ */ jsx46("div", { className: "max-w-3xl mx-auto", children }) }),
3040
- /* @__PURE__ */ jsx46("div", { className: "w-72 shrink-0 border-l border-border overflow-y-auto p-4", children: sidebar })
3256
+ /* @__PURE__ */ jsxs33("div", { className: "flex flex-1 overflow-hidden", children: [
3257
+ /* @__PURE__ */ jsx50("div", { className: "flex-1 overflow-y-auto p-6", children: /* @__PURE__ */ jsx50("div", { className: "max-w-3xl mx-auto", children }) }),
3258
+ /* @__PURE__ */ jsx50("div", { className: "w-72 shrink-0 border-l border-border overflow-y-auto p-4", children: sidebar })
3041
3259
  ] })
3042
3260
  ] });
3043
3261
  }
3044
3262
 
3045
3263
  // src/components/content/slug-input.tsx
3046
- import { jsx as jsx47, jsxs as jsxs31 } from "react/jsx-runtime";
3264
+ import { jsx as jsx51, jsxs as jsxs34 } from "react/jsx-runtime";
3047
3265
  function IconRefresh() {
3048
- return /* @__PURE__ */ jsxs31(
3266
+ return /* @__PURE__ */ jsxs34(
3049
3267
  "svg",
3050
3268
  {
3051
3269
  width: "13",
@@ -3057,9 +3275,9 @@ function IconRefresh() {
3057
3275
  strokeLinecap: "round",
3058
3276
  strokeLinejoin: "round",
3059
3277
  children: [
3060
- /* @__PURE__ */ jsx47("polyline", { points: "23 4 23 10 17 10" }),
3061
- /* @__PURE__ */ jsx47("polyline", { points: "1 20 1 14 7 14" }),
3062
- /* @__PURE__ */ jsx47("path", { d: "M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15" })
3278
+ /* @__PURE__ */ jsx51("polyline", { points: "23 4 23 10 17 10" }),
3279
+ /* @__PURE__ */ jsx51("polyline", { points: "1 20 1 14 7 14" }),
3280
+ /* @__PURE__ */ jsx51("path", { d: "M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15" })
3063
3281
  ]
3064
3282
  }
3065
3283
  );
@@ -3072,10 +3290,10 @@ function SlugInput({
3072
3290
  disabled = false,
3073
3291
  className
3074
3292
  }) {
3075
- return /* @__PURE__ */ jsxs31("div", { className: cn("space-y-1", className), children: [
3076
- /* @__PURE__ */ jsxs31("div", { className: "flex items-center gap-1", children: [
3077
- prefix && /* @__PURE__ */ jsx47("span", { className: "shrink-0 text-sm text-muted-foreground select-none", children: prefix }),
3078
- /* @__PURE__ */ jsx47(
3293
+ return /* @__PURE__ */ jsxs34("div", { className: cn("space-y-1", className), children: [
3294
+ /* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-1", children: [
3295
+ prefix && /* @__PURE__ */ jsx51("span", { className: "shrink-0 text-sm text-muted-foreground select-none", children: prefix }),
3296
+ /* @__PURE__ */ jsx51(
3079
3297
  "input",
3080
3298
  {
3081
3299
  type: "text",
@@ -3089,26 +3307,26 @@ function SlugInput({
3089
3307
  placeholder: "your-slug-here"
3090
3308
  }
3091
3309
  ),
3092
- onGenerate && /* @__PURE__ */ jsx47(
3310
+ onGenerate && /* @__PURE__ */ jsx51(
3093
3311
  "button",
3094
3312
  {
3095
3313
  onClick: onGenerate,
3096
3314
  disabled,
3097
3315
  title: "Generate slug",
3098
3316
  className: "inline-flex items-center justify-center h-7 w-7 rounded-md text-muted-foreground hover:bg-accent hover:text-foreground transition-colors disabled:opacity-60",
3099
- children: /* @__PURE__ */ jsx47(IconRefresh, {})
3317
+ children: /* @__PURE__ */ jsx51(IconRefresh, {})
3100
3318
  }
3101
3319
  )
3102
3320
  ] }),
3103
- /* @__PURE__ */ jsx47("p", { className: "text-[10px] text-muted-foreground", children: "Only lowercase letters, numbers, and hyphens" })
3321
+ /* @__PURE__ */ jsx51("p", { className: "text-[10px] text-muted-foreground", children: "Only lowercase letters, numbers, and hyphens" })
3104
3322
  ] });
3105
3323
  }
3106
3324
 
3107
3325
  // src/components/content/post-sidebar-section.tsx
3108
3326
  import * as React22 from "react";
3109
- import { jsx as jsx48, jsxs as jsxs32 } from "react/jsx-runtime";
3327
+ import { jsx as jsx52, jsxs as jsxs35 } from "react/jsx-runtime";
3110
3328
  function IconChevronDown() {
3111
- return /* @__PURE__ */ jsx48(
3329
+ return /* @__PURE__ */ jsx52(
3112
3330
  "svg",
3113
3331
  {
3114
3332
  width: "14",
@@ -3119,7 +3337,7 @@ function IconChevronDown() {
3119
3337
  strokeWidth: "2",
3120
3338
  strokeLinecap: "round",
3121
3339
  strokeLinejoin: "round",
3122
- children: /* @__PURE__ */ jsx48("polyline", { points: "6 9 12 15 18 9" })
3340
+ children: /* @__PURE__ */ jsx52("polyline", { points: "6 9 12 15 18 9" })
3123
3341
  }
3124
3342
  );
3125
3343
  }
@@ -3130,28 +3348,28 @@ function PostSidebarSection({
3130
3348
  className
3131
3349
  }) {
3132
3350
  const [open, setOpen] = React22.useState(defaultOpen);
3133
- return /* @__PURE__ */ jsxs32("div", { className: cn("border-b border-border", className), children: [
3134
- /* @__PURE__ */ jsxs32(
3351
+ return /* @__PURE__ */ jsxs35("div", { className: cn("border-b border-border", className), children: [
3352
+ /* @__PURE__ */ jsxs35(
3135
3353
  "button",
3136
3354
  {
3137
3355
  onClick: () => setOpen((v) => !v),
3138
3356
  className: "flex w-full items-center justify-between py-3 px-0 text-sm font-medium text-foreground hover:text-primary transition-colors",
3139
3357
  children: [
3140
3358
  title,
3141
- /* @__PURE__ */ jsx48(
3359
+ /* @__PURE__ */ jsx52(
3142
3360
  "span",
3143
3361
  {
3144
3362
  className: cn(
3145
3363
  "text-muted-foreground transition-transform duration-200",
3146
3364
  open ? "rotate-0" : "-rotate-90"
3147
3365
  ),
3148
- children: /* @__PURE__ */ jsx48(IconChevronDown, {})
3366
+ children: /* @__PURE__ */ jsx52(IconChevronDown, {})
3149
3367
  }
3150
3368
  )
3151
3369
  ]
3152
3370
  }
3153
3371
  ),
3154
- /* @__PURE__ */ jsx48(
3372
+ /* @__PURE__ */ jsx52(
3155
3373
  "div",
3156
3374
  {
3157
3375
  className: cn(
@@ -3165,7 +3383,7 @@ function PostSidebarSection({
3165
3383
  }
3166
3384
 
3167
3385
  // src/components/ui/hsl-color-input.tsx
3168
- import { useState as useState8, useRef as useRef5, useEffect as useEffect6, useCallback as useCallback2 } from "react";
3386
+ import { useState as useState11, useRef as useRef6, useEffect as useEffect7, useCallback as useCallback2 } from "react";
3169
3387
  import Color2 from "color";
3170
3388
  import * as Popover2 from "@radix-ui/react-popover";
3171
3389
 
@@ -3176,13 +3394,13 @@ import {
3176
3394
  memo,
3177
3395
  useCallback,
3178
3396
  useContext,
3179
- useEffect as useEffect5,
3397
+ useEffect as useEffect6,
3180
3398
  useMemo as useMemo2,
3181
- useRef as useRef4,
3182
- useState as useState7
3399
+ useRef as useRef5,
3400
+ useState as useState10
3183
3401
  } from "react";
3184
3402
  import * as Slider from "@radix-ui/react-slider";
3185
- import { jsx as jsx49, jsxs as jsxs33 } from "react/jsx-runtime";
3403
+ import { jsx as jsx53, jsxs as jsxs36 } from "react/jsx-runtime";
3186
3404
  var ColorPickerContext = createContext(void 0);
3187
3405
  var useColorPicker = () => {
3188
3406
  const ctx = useContext(ColorPickerContext);
@@ -3203,13 +3421,13 @@ var ColorPicker = ({
3203
3421
  return Color("#000000");
3204
3422
  }
3205
3423
  })();
3206
- const [hue, setHueState] = useState7(initial.hue());
3207
- const [saturation, setSaturationState] = useState7(initial.saturationl());
3208
- const [lightness, setLightnessState] = useState7(initial.lightness());
3209
- const [alpha, setAlphaState] = useState7(initial.alpha() * 100);
3210
- const [mode, setMode] = useState7("HEX");
3211
- const notifyRef = useRef4(onChange);
3212
- useEffect5(() => {
3424
+ const [hue, setHueState] = useState10(initial.hue());
3425
+ const [saturation, setSaturationState] = useState10(initial.saturationl());
3426
+ const [lightness, setLightnessState] = useState10(initial.lightness());
3427
+ const [alpha, setAlphaState] = useState10(initial.alpha() * 100);
3428
+ const [mode, setMode] = useState10("HEX");
3429
+ const notifyRef = useRef5(onChange);
3430
+ useEffect6(() => {
3213
3431
  notifyRef.current = onChange;
3214
3432
  }, [onChange]);
3215
3433
  const notify = useCallback((h, s, l, a) => {
@@ -3231,14 +3449,14 @@ var ColorPicker = ({
3231
3449
  setAlphaState(a);
3232
3450
  notify(hue, saturation, lightness, a);
3233
3451
  }, [hue, saturation, lightness, notify]);
3234
- return /* @__PURE__ */ jsx49(ColorPickerContext.Provider, { value: { hue, saturation, lightness, alpha, mode, setHue, setSaturation, setLightness, setAlpha, setMode }, children: /* @__PURE__ */ jsx49("div", { className: cn("flex flex-col gap-3", className), ...props, children }) });
3452
+ return /* @__PURE__ */ jsx53(ColorPickerContext.Provider, { value: { hue, saturation, lightness, alpha, mode, setHue, setSaturation, setLightness, setAlpha, setMode }, children: /* @__PURE__ */ jsx53("div", { className: cn("flex flex-col gap-3", className), ...props, children }) });
3235
3453
  };
3236
3454
  var ColorPickerSelection = memo(({ className, ...props }) => {
3237
- const containerRef = useRef4(null);
3238
- const [isDragging, setIsDragging] = useState7(false);
3455
+ const containerRef = useRef5(null);
3456
+ const [isDragging, setIsDragging] = useState10(false);
3239
3457
  const { hue, saturation, lightness, setSaturation, setLightness } = useColorPicker();
3240
- const [posX, setPosX] = useState7(() => saturation / 100);
3241
- const [posY, setPosY] = useState7(() => {
3458
+ const [posX, setPosX] = useState10(() => saturation / 100);
3459
+ const [posY, setPosY] = useState10(() => {
3242
3460
  const x = saturation / 100;
3243
3461
  const topL = x < 0.01 ? 100 : 50 + 50 * (1 - x);
3244
3462
  return topL > 0 ? Math.max(0, Math.min(1, 1 - lightness / topL)) : 0;
@@ -3257,7 +3475,7 @@ var ColorPickerSelection = memo(({ className, ...props }) => {
3257
3475
  setSaturation(x * 100);
3258
3476
  setLightness((x < 0.01 ? 100 : 50 + 50 * (1 - x)) * (1 - y));
3259
3477
  }, [isDragging, setSaturation, setLightness]);
3260
- useEffect5(() => {
3478
+ useEffect6(() => {
3261
3479
  if (!isDragging) return;
3262
3480
  const up = () => setIsDragging(false);
3263
3481
  window.addEventListener("pointermove", handleMove);
@@ -3267,7 +3485,7 @@ var ColorPickerSelection = memo(({ className, ...props }) => {
3267
3485
  window.removeEventListener("pointerup", up);
3268
3486
  };
3269
3487
  }, [isDragging, handleMove]);
3270
- return /* @__PURE__ */ jsx49(
3488
+ return /* @__PURE__ */ jsx53(
3271
3489
  "div",
3272
3490
  {
3273
3491
  ref: containerRef,
@@ -3279,7 +3497,7 @@ var ColorPickerSelection = memo(({ className, ...props }) => {
3279
3497
  handleMove(e.nativeEvent);
3280
3498
  },
3281
3499
  ...props,
3282
- children: /* @__PURE__ */ jsx49(
3500
+ children: /* @__PURE__ */ jsx53(
3283
3501
  "div",
3284
3502
  {
3285
3503
  className: "pointer-events-none absolute h-4 w-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white",
@@ -3292,23 +3510,23 @@ var ColorPickerSelection = memo(({ className, ...props }) => {
3292
3510
  ColorPickerSelection.displayName = "ColorPickerSelection";
3293
3511
  var ColorPickerHue = ({ className, ...props }) => {
3294
3512
  const { hue, setHue } = useColorPicker();
3295
- return /* @__PURE__ */ jsxs33(Slider.Root, { className: cn("relative flex h-4 w-full touch-none items-center", className), max: 360, step: 1, value: [hue], onValueChange: ([h]) => setHue(h), ...props, children: [
3296
- /* @__PURE__ */ jsx49(Slider.Track, { className: "relative h-3 w-full grow rounded-full bg-[linear-gradient(90deg,#f00,#ff0,#0f0,#0ff,#00f,#f0f,#f00)]", children: /* @__PURE__ */ jsx49(Slider.Range, { className: "absolute h-full" }) }),
3297
- /* @__PURE__ */ jsx49(Slider.Thumb, { className: "block h-4 w-4 rounded-full border-2 border-white shadow-md focus:outline-none", style: { boxShadow: "0 0 0 1px rgba(0,0,0,0.4)" } })
3513
+ return /* @__PURE__ */ jsxs36(Slider.Root, { className: cn("relative flex h-4 w-full touch-none items-center", className), max: 360, step: 1, value: [hue], onValueChange: ([h]) => setHue(h), ...props, children: [
3514
+ /* @__PURE__ */ jsx53(Slider.Track, { className: "relative h-3 w-full grow rounded-full bg-[linear-gradient(90deg,#f00,#ff0,#0f0,#0ff,#00f,#f0f,#f00)]", children: /* @__PURE__ */ jsx53(Slider.Range, { className: "absolute h-full" }) }),
3515
+ /* @__PURE__ */ jsx53(Slider.Thumb, { className: "block h-4 w-4 rounded-full border-2 border-white shadow-md focus:outline-none", style: { boxShadow: "0 0 0 1px rgba(0,0,0,0.4)" } })
3298
3516
  ] });
3299
3517
  };
3300
3518
  var ColorPickerAlpha = ({ className, ...props }) => {
3301
3519
  const { alpha, setAlpha, hue, saturation, lightness } = useColorPicker();
3302
- return /* @__PURE__ */ jsxs33(Slider.Root, { className: cn("relative flex h-4 w-full touch-none items-center", className), max: 100, step: 1, value: [alpha], onValueChange: ([a]) => setAlpha(a), ...props, children: [
3303
- /* @__PURE__ */ jsx49(Slider.Track, { className: "relative h-3 w-full grow rounded-full", style: {
3520
+ return /* @__PURE__ */ jsxs36(Slider.Root, { className: cn("relative flex h-4 w-full touch-none items-center", className), max: 100, step: 1, value: [alpha], onValueChange: ([a]) => setAlpha(a), ...props, children: [
3521
+ /* @__PURE__ */ jsx53(Slider.Track, { className: "relative h-3 w-full grow rounded-full", style: {
3304
3522
  backgroundImage: `linear-gradient(90deg,transparent,hsl(${hue},${saturation}%,${lightness}%)),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==")`
3305
- }, children: /* @__PURE__ */ jsx49(Slider.Range, { className: "absolute h-full" }) }),
3306
- /* @__PURE__ */ jsx49(Slider.Thumb, { className: "block h-4 w-4 rounded-full border-2 border-white shadow-md focus:outline-none", style: { boxShadow: "0 0 0 1px rgba(0,0,0,0.4)" } })
3523
+ }, children: /* @__PURE__ */ jsx53(Slider.Range, { className: "absolute h-full" }) }),
3524
+ /* @__PURE__ */ jsx53(Slider.Thumb, { className: "block h-4 w-4 rounded-full border-2 border-white shadow-md focus:outline-none", style: { boxShadow: "0 0 0 1px rgba(0,0,0,0.4)" } })
3307
3525
  ] });
3308
3526
  };
3309
3527
  var ColorPickerEyeDropper = ({ className, ...props }) => {
3310
3528
  const { setHue, setSaturation, setLightness, setAlpha } = useColorPicker();
3311
- return /* @__PURE__ */ jsx49(
3529
+ return /* @__PURE__ */ jsx53(
3312
3530
  "button",
3313
3531
  {
3314
3532
  type: "button",
@@ -3327,18 +3545,18 @@ var ColorPickerEyeDropper = ({ className, ...props }) => {
3327
3545
  className: cn("shrink-0 focus:outline-none", className),
3328
3546
  style: { width: 32, height: 32, display: "flex", alignItems: "center", justifyContent: "center", borderRadius: 6, border: "1px solid rgba(255,255,255,0.12)", backgroundColor: "rgba(255,255,255,0.05)", color: "rgba(255,255,255,0.5)", cursor: "pointer" },
3329
3547
  ...props,
3330
- children: /* @__PURE__ */ jsxs33("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
3331
- /* @__PURE__ */ jsx49("path", { d: "M9.53 16.122a3 3 0 0 0-5.78 1.128 2.25 2.25 0 0 1-2.4 2.245 4.5 4.5 0 0 0 8.4-2.245c0-.399-.078-.78-.22-1.128Z" }),
3332
- /* @__PURE__ */ jsx49("path", { d: "m13.5 10.5 2.25-2.25m0 0 2.25-2.25M15.75 8.25l2.25 2.25M15.75 8.25 13.5 6m4.5-1.5 1.5-1.5" }),
3333
- /* @__PURE__ */ jsx49("path", { d: "M6.75 7.5 10.5 4.5c.5-.375 1.25-.375 1.5 0l6.75 6.75c.375.5.375 1.25 0 1.5L15 16.5" })
3548
+ children: /* @__PURE__ */ jsxs36("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
3549
+ /* @__PURE__ */ jsx53("path", { d: "M9.53 16.122a3 3 0 0 0-5.78 1.128 2.25 2.25 0 0 1-2.4 2.245 4.5 4.5 0 0 0 8.4-2.245c0-.399-.078-.78-.22-1.128Z" }),
3550
+ /* @__PURE__ */ jsx53("path", { d: "m13.5 10.5 2.25-2.25m0 0 2.25-2.25M15.75 8.25l2.25 2.25M15.75 8.25 13.5 6m4.5-1.5 1.5-1.5" }),
3551
+ /* @__PURE__ */ jsx53("path", { d: "M6.75 7.5 10.5 4.5c.5-.375 1.25-.375 1.5 0l6.75 6.75c.375.5.375 1.25 0 1.5L15 16.5" })
3334
3552
  ] })
3335
3553
  }
3336
3554
  );
3337
3555
  };
3338
3556
  var ColorPickerOutput = ({ className, ...props }) => {
3339
3557
  const { mode, setMode } = useColorPicker();
3340
- return /* @__PURE__ */ jsxs33("div", { className: cn("relative shrink-0", className), ...props, children: [
3341
- /* @__PURE__ */ jsx49(
3558
+ return /* @__PURE__ */ jsxs36("div", { className: cn("relative shrink-0", className), ...props, children: [
3559
+ /* @__PURE__ */ jsx53(
3342
3560
  "select",
3343
3561
  {
3344
3562
  value: mode,
@@ -3358,16 +3576,16 @@ var ColorPickerOutput = ({ className, ...props }) => {
3358
3576
  appearance: "none",
3359
3577
  WebkitAppearance: "none"
3360
3578
  },
3361
- children: ["HEX", "HSL", "RGB"].map((f) => /* @__PURE__ */ jsx49("option", { value: f, style: { backgroundColor: "#1e2130", color: "rgba(255,255,255,0.8)" }, children: f }, f))
3579
+ children: ["HEX", "HSL", "RGB"].map((f) => /* @__PURE__ */ jsx53("option", { value: f, style: { backgroundColor: "#1e2130", color: "rgba(255,255,255,0.8)" }, children: f }, f))
3362
3580
  }
3363
3581
  ),
3364
- /* @__PURE__ */ jsx49("svg", { style: { position: "absolute", right: 6, top: "50%", transform: "translateY(-50%)", width: 12, height: 12, color: "rgba(255,255,255,0.35)", pointerEvents: "none" }, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: /* @__PURE__ */ jsx49("path", { d: "m6 9 6 6 6-6" }) })
3582
+ /* @__PURE__ */ jsx53("svg", { style: { position: "absolute", right: 6, top: "50%", transform: "translateY(-50%)", width: 12, height: 12, color: "rgba(255,255,255,0.35)", pointerEvents: "none" }, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: /* @__PURE__ */ jsx53("path", { d: "m6 9 6 6 6-6" }) })
3365
3583
  ] });
3366
3584
  };
3367
3585
  var ColorPickerFormat = ({ className, ...props }) => {
3368
3586
  const { hue, saturation, lightness, alpha, mode, setHue, setSaturation, setLightness, setAlpha } = useColorPicker();
3369
- const [focused, setFocused] = useState7(false);
3370
- const [localVal, setLocalVal] = useState7("");
3587
+ const [focused, setFocused] = useState10(false);
3588
+ const [localVal, setLocalVal] = useState10("");
3371
3589
  const computedVal = (() => {
3372
3590
  try {
3373
3591
  const c = Color.hsl(hue, saturation, lightness).alpha(alpha / 100);
@@ -3381,7 +3599,7 @@ var ColorPickerFormat = ({ className, ...props }) => {
3381
3599
  }
3382
3600
  return "";
3383
3601
  })();
3384
- useEffect5(() => {
3602
+ useEffect6(() => {
3385
3603
  if (!focused) setLocalVal(computedVal);
3386
3604
  }, [computedVal, focused]);
3387
3605
  const tryApply = (raw) => {
@@ -3411,7 +3629,7 @@ var ColorPickerFormat = ({ className, ...props }) => {
3411
3629
  } catch {
3412
3630
  }
3413
3631
  };
3414
- return /* @__PURE__ */ jsx49(
3632
+ return /* @__PURE__ */ jsx53(
3415
3633
  "input",
3416
3634
  {
3417
3635
  type: "text",
@@ -3449,14 +3667,14 @@ var ColorPickerFormat = ({ className, ...props }) => {
3449
3667
  var ColorPickerHexOutput = ({ className, ...props }) => {
3450
3668
  const { hue, saturation, lightness } = useColorPicker();
3451
3669
  const hex = Color.hsl(hue, saturation, lightness).hex();
3452
- return /* @__PURE__ */ jsxs33("div", { className: cn("flex items-center gap-1.5 px-0.5", className), ...props, children: [
3453
- /* @__PURE__ */ jsx49("div", { className: "w-5 h-5 rounded border border-white/20 shrink-0", style: { background: `hsl(${hue},${saturation}%,${lightness}%)` } }),
3454
- /* @__PURE__ */ jsx49("span", { className: "text-xs font-mono text-white/50", children: hex })
3670
+ return /* @__PURE__ */ jsxs36("div", { className: cn("flex items-center gap-1.5 px-0.5", className), ...props, children: [
3671
+ /* @__PURE__ */ jsx53("div", { className: "w-5 h-5 rounded border border-white/20 shrink-0", style: { background: `hsl(${hue},${saturation}%,${lightness}%)` } }),
3672
+ /* @__PURE__ */ jsx53("span", { className: "text-xs font-mono text-white/50", children: hex })
3455
3673
  ] });
3456
3674
  };
3457
3675
 
3458
3676
  // src/components/ui/hsl-color-input.tsx
3459
- import { jsx as jsx50, jsxs as jsxs34 } from "react/jsx-runtime";
3677
+ import { jsx as jsx54, jsxs as jsxs37 } from "react/jsx-runtime";
3460
3678
  function hslToHex(hsl) {
3461
3679
  if (!hsl) return "#000000";
3462
3680
  try {
@@ -3479,7 +3697,7 @@ function hexToHsl(hex) {
3479
3697
  }
3480
3698
  function ColorReader({ onHexChange }) {
3481
3699
  const { hue, saturation, lightness, alpha } = useColorPicker();
3482
- useEffect6(() => {
3700
+ useEffect7(() => {
3483
3701
  try {
3484
3702
  const hex = Color2.hsl(hue, saturation, lightness).alpha(alpha / 100).hex();
3485
3703
  onHexChange(hex);
@@ -3489,15 +3707,15 @@ function ColorReader({ onHexChange }) {
3489
3707
  return null;
3490
3708
  }
3491
3709
  function HslColorInput({ value, onChange, className, inputClassName, disabled }) {
3492
- const [open, setOpen] = useState8(false);
3710
+ const [open, setOpen] = useState11(false);
3493
3711
  const hexValue = hslToHex(value);
3494
3712
  const cssColor = value ? `hsl(${value})` : "transparent";
3495
- const pendingHexRef = useRef5(hexValue);
3496
- const onChangeRef = useRef5(onChange);
3497
- useEffect6(() => {
3713
+ const pendingHexRef = useRef6(hexValue);
3714
+ const onChangeRef = useRef6(onChange);
3715
+ useEffect7(() => {
3498
3716
  onChangeRef.current = onChange;
3499
3717
  }, [onChange]);
3500
- useEffect6(() => {
3718
+ useEffect7(() => {
3501
3719
  if (open) pendingHexRef.current = hexValue;
3502
3720
  }, [open, hexValue]);
3503
3721
  const handleHexChange = useCallback2((hex) => {
@@ -3512,8 +3730,8 @@ function HslColorInput({ value, onChange, className, inputClassName, disabled })
3512
3730
  }
3513
3731
  setOpen(newOpen);
3514
3732
  }, [open, hexValue]);
3515
- return /* @__PURE__ */ jsxs34(Popover2.Root, { open, onOpenChange: disabled ? void 0 : handleOpenChange, children: [
3516
- /* @__PURE__ */ jsx50(Popover2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs34(
3733
+ return /* @__PURE__ */ jsxs37(Popover2.Root, { open, onOpenChange: disabled ? void 0 : handleOpenChange, children: [
3734
+ /* @__PURE__ */ jsx54(Popover2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs37(
3517
3735
  "button",
3518
3736
  {
3519
3737
  type: "button",
@@ -3528,18 +3746,18 @@ function HslColorInput({ value, onChange, className, inputClassName, disabled })
3528
3746
  ),
3529
3747
  "aria-label": "Pick color",
3530
3748
  children: [
3531
- /* @__PURE__ */ jsx50(
3749
+ /* @__PURE__ */ jsx54(
3532
3750
  "span",
3533
3751
  {
3534
3752
  className: "w-4 h-4 rounded-full border border-white/20 shrink-0 inline-block",
3535
3753
  style: { background: cssColor }
3536
3754
  }
3537
3755
  ),
3538
- /* @__PURE__ */ jsx50("span", { children: hexValue.toUpperCase() })
3756
+ /* @__PURE__ */ jsx54("span", { children: hexValue.toUpperCase() })
3539
3757
  ]
3540
3758
  }
3541
3759
  ) }),
3542
- /* @__PURE__ */ jsx50(Popover2.Portal, { children: /* @__PURE__ */ jsx50(
3760
+ /* @__PURE__ */ jsx54(Popover2.Portal, { children: /* @__PURE__ */ jsx54(
3543
3761
  Popover2.Content,
3544
3762
  {
3545
3763
  sideOffset: 6,
@@ -3550,19 +3768,19 @@ function HslColorInput({ value, onChange, className, inputClassName, disabled })
3550
3768
  "focus:outline-none"
3551
3769
  ),
3552
3770
  onInteractOutside: () => handleOpenChange(false),
3553
- children: open && /* @__PURE__ */ jsxs34(ColorPicker, { defaultValue: hexValue, className: "gap-2.5", children: [
3554
- /* @__PURE__ */ jsx50(ColorReader, { onHexChange: handleHexChange }),
3555
- /* @__PURE__ */ jsx50(ColorPickerSelection, { className: "h-32 w-full rounded-lg" }),
3556
- /* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-3", children: [
3557
- /* @__PURE__ */ jsx50(ColorPickerEyeDropper, {}),
3558
- /* @__PURE__ */ jsxs34("div", { className: "flex flex-col gap-1.5 flex-1", children: [
3559
- /* @__PURE__ */ jsx50(ColorPickerHue, {}),
3560
- /* @__PURE__ */ jsx50(ColorPickerAlpha, {})
3771
+ children: open && /* @__PURE__ */ jsxs37(ColorPicker, { defaultValue: hexValue, className: "gap-2.5", children: [
3772
+ /* @__PURE__ */ jsx54(ColorReader, { onHexChange: handleHexChange }),
3773
+ /* @__PURE__ */ jsx54(ColorPickerSelection, { className: "h-32 w-full rounded-lg" }),
3774
+ /* @__PURE__ */ jsxs37("div", { className: "flex items-center gap-3", children: [
3775
+ /* @__PURE__ */ jsx54(ColorPickerEyeDropper, {}),
3776
+ /* @__PURE__ */ jsxs37("div", { className: "flex flex-col gap-1.5 flex-1", children: [
3777
+ /* @__PURE__ */ jsx54(ColorPickerHue, {}),
3778
+ /* @__PURE__ */ jsx54(ColorPickerAlpha, {})
3561
3779
  ] })
3562
3780
  ] }),
3563
- /* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-1.5 min-w-0", children: [
3564
- /* @__PURE__ */ jsx50(ColorPickerOutput, {}),
3565
- /* @__PURE__ */ jsx50(ColorPickerFormat, { className: "min-w-0" })
3781
+ /* @__PURE__ */ jsxs37("div", { className: "flex items-center gap-1.5 min-w-0", children: [
3782
+ /* @__PURE__ */ jsx54(ColorPickerOutput, {}),
3783
+ /* @__PURE__ */ jsx54(ColorPickerFormat, { className: "min-w-0" })
3566
3784
  ] })
3567
3785
  ] }, hexValue)
3568
3786
  }
@@ -3571,9 +3789,9 @@ function HslColorInput({ value, onChange, className, inputClassName, disabled })
3571
3789
  }
3572
3790
 
3573
3791
  // src/hooks/index.ts
3574
- import { useState as useState9 } from "react";
3792
+ import { useState as useState12 } from "react";
3575
3793
  function useDisclosure(initial = false) {
3576
- const [isOpen, setIsOpen] = useState9(initial);
3794
+ const [isOpen, setIsOpen] = useState12(initial);
3577
3795
  return {
3578
3796
  isOpen,
3579
3797
  open: () => setIsOpen(true),
@@ -3583,15 +3801,15 @@ function useDisclosure(initial = false) {
3583
3801
  };
3584
3802
  }
3585
3803
  function usePagination(total, pageSize = 20) {
3586
- const [page, setPage] = useState9(1);
3804
+ const [page, setPage] = useState12(1);
3587
3805
  const totalPages = Math.ceil(total / pageSize);
3588
3806
  return { page, setPage, pageSize, total, totalPages };
3589
3807
  }
3590
3808
 
3591
3809
  // src/components/auth/AuthShell.tsx
3592
- import { jsx as jsx51, jsxs as jsxs35 } from "react/jsx-runtime";
3810
+ import { jsx as jsx55, jsxs as jsxs38 } from "react/jsx-runtime";
3593
3811
  function AuthShell({ children, pattern = "dots", maxWidth = "520px" }) {
3594
- return /* @__PURE__ */ jsxs35(
3812
+ return /* @__PURE__ */ jsxs38(
3595
3813
  "div",
3596
3814
  {
3597
3815
  style: {
@@ -3606,7 +3824,7 @@ function AuthShell({ children, pattern = "dots", maxWidth = "520px" }) {
3606
3824
  overflow: "hidden"
3607
3825
  },
3608
3826
  children: [
3609
- pattern === "dots" && /* @__PURE__ */ jsx51(
3827
+ pattern === "dots" && /* @__PURE__ */ jsx55(
3610
3828
  "div",
3611
3829
  {
3612
3830
  "aria-hidden": true,
@@ -3620,7 +3838,7 @@ function AuthShell({ children, pattern = "dots", maxWidth = "520px" }) {
3620
3838
  }
3621
3839
  }
3622
3840
  ),
3623
- pattern === "grid" && /* @__PURE__ */ jsx51(
3841
+ pattern === "grid" && /* @__PURE__ */ jsx55(
3624
3842
  "div",
3625
3843
  {
3626
3844
  "aria-hidden": true,
@@ -3634,16 +3852,16 @@ function AuthShell({ children, pattern = "dots", maxWidth = "520px" }) {
3634
3852
  }
3635
3853
  }
3636
3854
  ),
3637
- /* @__PURE__ */ jsx51("div", { style: { position: "relative", zIndex: 1, width: "100%", maxWidth }, children })
3855
+ /* @__PURE__ */ jsx55("div", { style: { position: "relative", zIndex: 1, width: "100%", maxWidth }, children })
3638
3856
  ]
3639
3857
  }
3640
3858
  );
3641
3859
  }
3642
3860
 
3643
3861
  // src/components/auth/AuthCard.tsx
3644
- import { jsx as jsx52 } from "react/jsx-runtime";
3862
+ import { jsx as jsx56 } from "react/jsx-runtime";
3645
3863
  function AuthCard({ children, padding = "24px 28px" }) {
3646
- return /* @__PURE__ */ jsx52(
3864
+ return /* @__PURE__ */ jsx56(
3647
3865
  "div",
3648
3866
  {
3649
3867
  style: {
@@ -3660,10 +3878,10 @@ function AuthCard({ children, padding = "24px 28px" }) {
3660
3878
  }
3661
3879
 
3662
3880
  // src/components/auth/AuthLogo.tsx
3663
- import { jsx as jsx53, jsxs as jsxs36 } from "react/jsx-runtime";
3881
+ import { jsx as jsx57, jsxs as jsxs39 } from "react/jsx-runtime";
3664
3882
  function AuthLogo({ appName = "Builify CMS", letter = "B", imageUrl, size = 36 }) {
3665
- return /* @__PURE__ */ jsxs36("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", gap: "10px", marginBottom: "28px" }, children: [
3666
- imageUrl ? /* @__PURE__ */ jsx53(
3883
+ return /* @__PURE__ */ jsxs39("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", gap: "10px", marginBottom: "28px" }, children: [
3884
+ imageUrl ? /* @__PURE__ */ jsx57(
3667
3885
  "img",
3668
3886
  {
3669
3887
  src: imageUrl,
@@ -3672,7 +3890,7 @@ function AuthLogo({ appName = "Builify CMS", letter = "B", imageUrl, size = 36 }
3672
3890
  height: size,
3673
3891
  style: { borderRadius: "calc(var(--radius, 0.5rem) * 1.2)", flexShrink: 0, display: "block" }
3674
3892
  }
3675
- ) : /* @__PURE__ */ jsx53(
3893
+ ) : /* @__PURE__ */ jsx57(
3676
3894
  "div",
3677
3895
  {
3678
3896
  style: {
@@ -3691,7 +3909,7 @@ function AuthLogo({ appName = "Builify CMS", letter = "B", imageUrl, size = 36 }
3691
3909
  children: letter
3692
3910
  }
3693
3911
  ),
3694
- /* @__PURE__ */ jsx53(
3912
+ /* @__PURE__ */ jsx57(
3695
3913
  "span",
3696
3914
  {
3697
3915
  style: {
@@ -3707,10 +3925,10 @@ function AuthLogo({ appName = "Builify CMS", letter = "B", imageUrl, size = 36 }
3707
3925
  }
3708
3926
 
3709
3927
  // src/components/auth/AuthHeader.tsx
3710
- import { jsx as jsx54, jsxs as jsxs37 } from "react/jsx-runtime";
3928
+ import { jsx as jsx58, jsxs as jsxs40 } from "react/jsx-runtime";
3711
3929
  function AuthHeader({ title, description }) {
3712
- return /* @__PURE__ */ jsxs37("div", { style: { marginBottom: "24px", textAlign: "center" }, children: [
3713
- /* @__PURE__ */ jsx54(
3930
+ return /* @__PURE__ */ jsxs40("div", { style: { marginBottom: "24px", textAlign: "center" }, children: [
3931
+ /* @__PURE__ */ jsx58(
3714
3932
  "h1",
3715
3933
  {
3716
3934
  style: {
@@ -3723,7 +3941,7 @@ function AuthHeader({ title, description }) {
3723
3941
  children: title
3724
3942
  }
3725
3943
  ),
3726
- description && /* @__PURE__ */ jsx54(
3944
+ description && /* @__PURE__ */ jsx58(
3727
3945
  "p",
3728
3946
  {
3729
3947
  style: {
@@ -3739,12 +3957,12 @@ function AuthHeader({ title, description }) {
3739
3957
  }
3740
3958
 
3741
3959
  // src/components/auth/AuthField.tsx
3742
- import { jsx as jsx55, jsxs as jsxs38 } from "react/jsx-runtime";
3960
+ import { jsx as jsx59, jsxs as jsxs41 } from "react/jsx-runtime";
3743
3961
  function AuthField({ label, error, hint, rightLabel, id, ...props }) {
3744
3962
  const fieldId = id ?? label.toLowerCase().replace(/\s+/g, "-");
3745
- return /* @__PURE__ */ jsxs38("div", { style: { display: "flex", flexDirection: "column", gap: "6px" }, children: [
3746
- /* @__PURE__ */ jsxs38("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [
3747
- /* @__PURE__ */ jsx55(
3963
+ return /* @__PURE__ */ jsxs41("div", { style: { display: "flex", flexDirection: "column", gap: "6px" }, children: [
3964
+ /* @__PURE__ */ jsxs41("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [
3965
+ /* @__PURE__ */ jsx59(
3748
3966
  "label",
3749
3967
  {
3750
3968
  htmlFor: fieldId,
@@ -3756,9 +3974,9 @@ function AuthField({ label, error, hint, rightLabel, id, ...props }) {
3756
3974
  children: label
3757
3975
  }
3758
3976
  ),
3759
- rightLabel && /* @__PURE__ */ jsx55("span", { style: { fontSize: "0.8125rem" }, children: rightLabel })
3977
+ rightLabel && /* @__PURE__ */ jsx59("span", { style: { fontSize: "0.8125rem" }, children: rightLabel })
3760
3978
  ] }),
3761
- /* @__PURE__ */ jsx55(
3979
+ /* @__PURE__ */ jsx59(
3762
3980
  "input",
3763
3981
  {
3764
3982
  id: fieldId,
@@ -3788,13 +4006,13 @@ function AuthField({ label, error, hint, rightLabel, id, ...props }) {
3788
4006
  ...props
3789
4007
  }
3790
4008
  ),
3791
- error && /* @__PURE__ */ jsx55("p", { style: { fontSize: "0.8rem", color: "var(--destructive)", margin: 0 }, children: error }),
3792
- hint && !error && /* @__PURE__ */ jsx55("p", { style: { fontSize: "0.8rem", color: "var(--muted-foreground)", margin: 0 }, children: hint })
4009
+ error && /* @__PURE__ */ jsx59("p", { style: { fontSize: "0.8rem", color: "var(--destructive)", margin: 0 }, children: error }),
4010
+ hint && !error && /* @__PURE__ */ jsx59("p", { style: { fontSize: "0.8rem", color: "var(--muted-foreground)", margin: 0 }, children: hint })
3793
4011
  ] });
3794
4012
  }
3795
4013
 
3796
4014
  // src/components/auth/AuthButton.tsx
3797
- import { Fragment as Fragment5, jsx as jsx56, jsxs as jsxs39 } from "react/jsx-runtime";
4015
+ import { Fragment as Fragment5, jsx as jsx60, jsxs as jsxs42 } from "react/jsx-runtime";
3798
4016
  function AuthButton({
3799
4017
  loading,
3800
4018
  variant = "primary",
@@ -3837,7 +4055,7 @@ function AuthButton({
3837
4055
  color: "var(--foreground)"
3838
4056
  }
3839
4057
  };
3840
- return /* @__PURE__ */ jsx56(
4058
+ return /* @__PURE__ */ jsx60(
3841
4059
  "button",
3842
4060
  {
3843
4061
  disabled: loading || disabled,
@@ -3849,8 +4067,8 @@ function AuthButton({
3849
4067
  e.currentTarget.style.filter = "none";
3850
4068
  },
3851
4069
  ...props,
3852
- children: loading ? /* @__PURE__ */ jsxs39(Fragment5, { children: [
3853
- /* @__PURE__ */ jsx56(
4070
+ children: loading ? /* @__PURE__ */ jsxs42(Fragment5, { children: [
4071
+ /* @__PURE__ */ jsx60(
3854
4072
  "span",
3855
4073
  {
3856
4074
  style: {
@@ -3871,19 +4089,19 @@ function AuthButton({
3871
4089
  }
3872
4090
 
3873
4091
  // src/components/auth/AuthDivider.tsx
3874
- import { jsx as jsx57, jsxs as jsxs40 } from "react/jsx-runtime";
4092
+ import { jsx as jsx61, jsxs as jsxs43 } from "react/jsx-runtime";
3875
4093
  function AuthDivider({ label = "or" }) {
3876
- return /* @__PURE__ */ jsxs40("div", { style: { display: "flex", alignItems: "center", gap: "12px", margin: "20px 0" }, children: [
3877
- /* @__PURE__ */ jsx57("div", { style: { flex: 1, height: 1, background: "var(--border)" } }),
3878
- /* @__PURE__ */ jsx57("span", { style: { fontSize: "0.75rem", color: "var(--muted-foreground)", userSelect: "none" }, children: label }),
3879
- /* @__PURE__ */ jsx57("div", { style: { flex: 1, height: 1, background: "var(--border)" } })
4094
+ return /* @__PURE__ */ jsxs43("div", { style: { display: "flex", alignItems: "center", gap: "12px", margin: "20px 0" }, children: [
4095
+ /* @__PURE__ */ jsx61("div", { style: { flex: 1, height: 1, background: "var(--border)" } }),
4096
+ /* @__PURE__ */ jsx61("span", { style: { fontSize: "0.75rem", color: "var(--muted-foreground)", userSelect: "none" }, children: label }),
4097
+ /* @__PURE__ */ jsx61("div", { style: { flex: 1, height: 1, background: "var(--border)" } })
3880
4098
  ] });
3881
4099
  }
3882
4100
 
3883
4101
  // src/components/auth/AuthFootnote.tsx
3884
- import { jsx as jsx58, jsxs as jsxs41 } from "react/jsx-runtime";
4102
+ import { jsx as jsx62, jsxs as jsxs44 } from "react/jsx-runtime";
3885
4103
  function AuthFootnote({ text, linkText, linkHref }) {
3886
- return /* @__PURE__ */ jsxs41("p", { style: {
4104
+ return /* @__PURE__ */ jsxs44("p", { style: {
3887
4105
  textAlign: "center",
3888
4106
  marginTop: "20px",
3889
4107
  fontSize: "0.8125rem",
@@ -3891,7 +4109,7 @@ function AuthFootnote({ text, linkText, linkHref }) {
3891
4109
  }, children: [
3892
4110
  text,
3893
4111
  " ",
3894
- /* @__PURE__ */ jsx58(
4112
+ /* @__PURE__ */ jsx62(
3895
4113
  "a",
3896
4114
  {
3897
4115
  href: linkHref,
@@ -3939,6 +4157,8 @@ export {
3939
4157
  ColorPickerOutput,
3940
4158
  ColorPickerSelection,
3941
4159
  ConfirmDialog,
4160
+ DEVICES,
4161
+ DEVICE_ICONS,
3942
4162
  DashboardLayout,
3943
4163
  DataTable,
3944
4164
  Dialog,
@@ -3975,6 +4195,7 @@ export {
3975
4195
  Input,
3976
4196
  Label2 as Label,
3977
4197
  LoadingSpinner,
4198
+ LocalInput,
3978
4199
  MediaCard,
3979
4200
  MediaGrid,
3980
4201
  MediaPickerDialog,
@@ -3991,6 +4212,8 @@ export {
3991
4212
  PostListTable,
3992
4213
  PostSidebarSection,
3993
4214
  PostStatusBadge,
4215
+ ResponsiveSizeDeviceIcon,
4216
+ ResponsiveSizeField,
3994
4217
  SearchBar,
3995
4218
  Select,
3996
4219
  SelectContent,