@kyro-cms/admin 0.9.4 → 0.9.6
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.cjs +966 -585
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +29 -9
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +649 -268
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/components/ActionBar.tsx +254 -70
- package/src/components/Admin.tsx +10 -17
- package/src/components/ApiKeysManager.tsx +1 -0
- package/src/components/AuditLogsPage.tsx +3 -3
- package/src/components/AutoForm.tsx +51 -34
- package/src/components/DetailView.tsx +37 -13
- package/src/components/GraphQLPlayground.tsx +460 -224
- package/src/components/ListView.tsx +3 -3
- package/src/components/LoginPage.tsx +5 -30
- package/src/components/MediaGallery.tsx +122 -15
- package/src/components/RestPlayground.tsx +443 -519
- package/src/components/Sidebar.astro +6 -2
- package/src/components/UserManagement.tsx +4 -4
- package/src/components/WebhookManager.tsx +4 -4
- package/src/components/blocks/AccordionBlock.tsx +1 -1
- package/src/components/blocks/ArrayBlock.tsx +1 -1
- package/src/components/blocks/ChildBlocksTree.tsx +6 -6
- package/src/components/blocks/CodeBlock.tsx +1 -1
- package/src/components/blocks/FileBlock.tsx +1 -1
- package/src/components/blocks/HeroBlock.tsx +1 -1
- package/src/components/blocks/ListBlock.tsx +1 -1
- package/src/components/blocks/RelationshipBlock.tsx +1 -1
- package/src/components/blocks/RichTextBlock.tsx +1 -1
- package/src/components/blocks/VideoBlock.tsx +1 -1
- package/src/components/fields/BlocksField.tsx +17 -19
- package/src/components/ui/PageHeader.tsx +205 -83
- package/src/components/ui/Pagination.tsx +2 -2
- package/src/components/ui/SlidePanel.tsx +4 -4
- package/src/layouts/AdminLayout.astro +64 -4
- package/src/lib/useResourceManager.ts +1 -0
- package/src/pages/graphql-explorer.astro +7 -51
- package/src/pages/graphql.astro +7 -119
- package/src/pages/index.astro +4 -63
- package/src/pages/rest-playground.astro +3 -29
- package/src/styles/main.css +32 -9
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React, { createContext, lazy, useState, useContext, useRef, useEffect, useCallback, useMemo, Suspense } from 'react';
|
|
2
2
|
import { create, useStore } from 'zustand';
|
|
3
3
|
import { persist, createJSONStorage } from 'zustand/middleware';
|
|
4
|
-
import { GripVertical, Copy, X, Video, Mail, Clock, Database, Users, Tag, Image, Activity, CircleHelp, Sparkles, Blocks, Columns3, Link2, ListOrdered, Box, Heading1, Star, AlignLeft, ChevronDown, File, Code, List, Plus, ChevronRight, ChevronUp, Search, LoaderCircle, Check, RefreshCw, Undo, Redo, Bold, Italic, Underline, Strikethrough, Highlighter, Palette, CheckSquare, Quote, Terminal, Minus, AlignCenter, AlignRight, Link, Minimize2, Maximize2, Grid3X3, FolderPlus, FolderInput, Folder, Trash2, Film, Music, FileText, Archive, Download, Crop, Server, CodeXml,
|
|
4
|
+
import { GripVertical, Copy, X, Video, Mail, Clock, Database, Users, Tag, Image, Activity, CircleHelp, Sparkles, Blocks, Columns3, Link2, ListOrdered, Box, Heading1, Star, AlignLeft, ChevronDown, File, Code, List, Plus, ChevronRight, ChevronUp, Search, LoaderCircle, Check, RefreshCw, Undo, Redo, Bold, Italic, Underline, Strikethrough, Highlighter, Palette, CheckSquare, Quote, Terminal, Minus, AlignCenter, AlignRight, Link, Minimize2, Maximize2, Grid3X3, Filter, FolderPlus, FolderInput, Folder, Trash2, Film, Music, FileText, Archive, Download, Crop, Server, CodeXml, Pencil, Eye, Send, Info, TriangleAlert, ShieldAlert, CircleCheck, History, CheckCircle2, User, GitCompare, Undo2, ExternalLink, Settings, Shield, Hexagon, Network, Sun, Moon, LogOut, ArrowRight, LayoutDashboard, ArrowUpRight, Webhook, Zap, Pause, Play, Key, Lock, EyeOff, CirclePlay, RefreshCcw, Save, UserPlus, LockOpen } from 'lucide-react';
|
|
5
5
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
6
6
|
import { createPortal } from 'react-dom';
|
|
7
7
|
import { useEditor, EditorContent } from '@tiptap/react';
|
|
@@ -437,6 +437,84 @@ function Shimmer({ variant, count = 1, className = "" }) {
|
|
|
437
437
|
i
|
|
438
438
|
)) });
|
|
439
439
|
}
|
|
440
|
+
function BackButton({ back }) {
|
|
441
|
+
if (back.href) {
|
|
442
|
+
return /* @__PURE__ */ jsx(
|
|
443
|
+
"a",
|
|
444
|
+
{
|
|
445
|
+
href: back.href,
|
|
446
|
+
onClick: (e) => {
|
|
447
|
+
if (back.onClick) {
|
|
448
|
+
e.preventDefault();
|
|
449
|
+
back.onClick();
|
|
450
|
+
}
|
|
451
|
+
},
|
|
452
|
+
className: "p-1.5 rounded-lg hover:bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] transition-all",
|
|
453
|
+
children: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: /* @__PURE__ */ jsx("path", { d: "M19 12H5M12 19l-7-7 7-7" }) })
|
|
454
|
+
}
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
return /* @__PURE__ */ jsx(
|
|
458
|
+
"button",
|
|
459
|
+
{
|
|
460
|
+
type: "button",
|
|
461
|
+
onClick: back.onClick,
|
|
462
|
+
className: "p-1.5 rounded-lg hover:bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] transition-all",
|
|
463
|
+
children: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: /* @__PURE__ */ jsx("path", { d: "M19 12H5M12 19l-7-7 7-7" }) })
|
|
464
|
+
}
|
|
465
|
+
);
|
|
466
|
+
}
|
|
467
|
+
function DesktopBreadcrumbs({ breadcrumbs }) {
|
|
468
|
+
return breadcrumbs?.map((crumb, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
469
|
+
i > 0 && /* @__PURE__ */ jsx("span", { className: "opacity-20 text-[10px]", children: "/" }),
|
|
470
|
+
crumb.href || crumb.onClick ? /* @__PURE__ */ jsx(
|
|
471
|
+
"a",
|
|
472
|
+
{
|
|
473
|
+
href: crumb.href,
|
|
474
|
+
onClick: (e) => {
|
|
475
|
+
if (crumb.onClick) {
|
|
476
|
+
e.preventDefault();
|
|
477
|
+
crumb.onClick();
|
|
478
|
+
}
|
|
479
|
+
},
|
|
480
|
+
className: "text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-primary)] transition-all",
|
|
481
|
+
children: crumb.label
|
|
482
|
+
}
|
|
483
|
+
) : /* @__PURE__ */ jsx("span", { className: "text-[10px] font-bold tracking-widest opacity-40", children: crumb.label })
|
|
484
|
+
] }, i));
|
|
485
|
+
}
|
|
486
|
+
function ActionsSlot({ actions }) {
|
|
487
|
+
if (Array.isArray(actions)) {
|
|
488
|
+
return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-3", children: actions.map((act, i) => /* @__PURE__ */ jsxs(
|
|
489
|
+
"button",
|
|
490
|
+
{
|
|
491
|
+
type: "button",
|
|
492
|
+
onClick: act.onClick,
|
|
493
|
+
className: `flex items-center gap-2 px-6 py-2.5 rounded-xl font-bold text-sm transition-all shadow-lg shadow-[var(--kyro-primary)]/10 ${act.variant === "outline" ? "border border-[var(--kyro-border)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)]" : act.variant === "ghost" ? "text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)] shadow-none" : "kyro-btn-primary hover:opacity-90"} ${act.className || ""}`,
|
|
494
|
+
children: [
|
|
495
|
+
act.icon && /* @__PURE__ */ jsx(act.icon, { className: "w-4 h-4" }),
|
|
496
|
+
act.label
|
|
497
|
+
]
|
|
498
|
+
},
|
|
499
|
+
i
|
|
500
|
+
)) });
|
|
501
|
+
}
|
|
502
|
+
return /* @__PURE__ */ jsx(Fragment, { children: actions });
|
|
503
|
+
}
|
|
504
|
+
function SingleAction({ action }) {
|
|
505
|
+
return /* @__PURE__ */ jsxs(
|
|
506
|
+
"button",
|
|
507
|
+
{
|
|
508
|
+
type: "button",
|
|
509
|
+
onClick: action.onClick,
|
|
510
|
+
className: `kyro-btn kyro-btn-primary flex items-center gap-2 px-6 py-2.5 rounded-xl font-bold text-sm hover:opacity-90 transition-all shadow-lg shadow-[var(--kyro-primary)]/10 w-full lg:w-auto justify-center ${action.className || ""}`,
|
|
511
|
+
children: [
|
|
512
|
+
action.icon && /* @__PURE__ */ jsx(action.icon, { className: "w-4 h-4" }),
|
|
513
|
+
action.label
|
|
514
|
+
]
|
|
515
|
+
}
|
|
516
|
+
);
|
|
517
|
+
}
|
|
440
518
|
function PageHeader({
|
|
441
519
|
title,
|
|
442
520
|
description,
|
|
@@ -448,80 +526,79 @@ function PageHeader({
|
|
|
448
526
|
actions,
|
|
449
527
|
children
|
|
450
528
|
}) {
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
e.preventDefault();
|
|
477
|
-
crumb.onClick();
|
|
529
|
+
const lastBreadcrumb = breadcrumbs?.[breadcrumbs.length - 1];
|
|
530
|
+
return /* @__PURE__ */ jsxs("div", { className: "surface-tile px-3 md:px-6 py-3 md:pt-4 mb-4 md:mb-8", children: [
|
|
531
|
+
/* @__PURE__ */ jsxs("div", { className: "md:hidden space-y-2", children: [
|
|
532
|
+
(breadcrumbs || back) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
533
|
+
back && /* @__PURE__ */ jsx(BackButton, { back }),
|
|
534
|
+
/* @__PURE__ */ jsxs("details", { className: "group [&::-webkit-details-marker]:hidden flex-1 min-w-0", children: [
|
|
535
|
+
/* @__PURE__ */ jsxs("summary", { className: "flex items-center gap-2 cursor-pointer list-none", children: [
|
|
536
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1 text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] truncate", children: lastBreadcrumb?.label || "" }),
|
|
537
|
+
/* @__PURE__ */ jsx("svg", { className: "w-3 h-3 text-[var(--kyro-text-secondary)] opacity-40 group-open:rotate-180 transition-transform", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: /* @__PURE__ */ jsx("path", { d: "M6 9l6 6 6-6" }) })
|
|
538
|
+
] }),
|
|
539
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-2 pt-2 border-t border-[var(--kyro-border)] space-y-2", children: [
|
|
540
|
+
breadcrumbs && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: breadcrumbs.map((crumb, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
541
|
+
i > 0 && /* @__PURE__ */ jsx("span", { className: "opacity-20 text-[10px]", children: "/" }),
|
|
542
|
+
crumb.href || crumb.onClick ? /* @__PURE__ */ jsx(
|
|
543
|
+
"a",
|
|
544
|
+
{
|
|
545
|
+
href: crumb.href,
|
|
546
|
+
onClick: (e) => {
|
|
547
|
+
if (crumb.onClick) {
|
|
548
|
+
e.preventDefault();
|
|
549
|
+
crumb.onClick();
|
|
550
|
+
}
|
|
551
|
+
},
|
|
552
|
+
className: "text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-primary)] transition-all",
|
|
553
|
+
children: crumb.label
|
|
478
554
|
}
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
] }
|
|
555
|
+
) : /* @__PURE__ */ jsx("span", { className: "text-[10px] font-bold tracking-widest opacity-40", children: crumb.label })
|
|
556
|
+
] }, i)) }),
|
|
557
|
+
metadata && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 flex-wrap", children: metadata.map((item, i) => /* @__PURE__ */ jsx(React.Fragment, { children: item }, i)) }),
|
|
558
|
+
children
|
|
559
|
+
] })
|
|
560
|
+
] })
|
|
485
561
|
] }),
|
|
486
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-
|
|
487
|
-
Icon && /* @__PURE__ */ jsx(Icon, { className: "w-
|
|
488
|
-
title && /* @__PURE__ */ jsx("h1", { className: "text-
|
|
562
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
563
|
+
Icon && /* @__PURE__ */ jsx(Icon, { className: "w-5 h-5 text-[var(--kyro-primary)] shrink-0" }),
|
|
564
|
+
title && /* @__PURE__ */ jsx("h1", { className: "text-lg font-bold tracking-tighter text-[var(--kyro-text-primary)] truncate", children: title }),
|
|
565
|
+
metadata && !description && /* @__PURE__ */ jsx("span", { className: "h-2 w-2 rounded-full bg-[var(--kyro-primary)] shrink-0" })
|
|
489
566
|
] }),
|
|
490
|
-
description && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2
|
|
491
|
-
/* @__PURE__ */ jsx("p", { className: "text-[var(--kyro-text-secondary)] font-medium opacity-60 line-clamp-1", children: description }),
|
|
492
|
-
metadata && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: metadata.map((item, i) => /* @__PURE__ */ jsxs(
|
|
567
|
+
description && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1", children: [
|
|
568
|
+
/* @__PURE__ */ jsx("p", { className: "text-[var(--kyro-text-secondary)] font-medium opacity-60 line-clamp-1 min-w-0 text-xs", children: description }),
|
|
569
|
+
metadata && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: metadata.map((item, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
493
570
|
i === 0 && /* @__PURE__ */ jsx("span", { className: "opacity-20 ml-1", children: "\xB7" }),
|
|
494
571
|
item
|
|
495
|
-
] }, i)) })
|
|
496
|
-
children
|
|
572
|
+
] }, i)) })
|
|
497
573
|
] })
|
|
498
574
|
] }),
|
|
499
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-
|
|
500
|
-
|
|
501
|
-
"
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
)
|
|
575
|
+
/* @__PURE__ */ jsxs("div", { className: "hidden md:flex md:flex-row md:items-center justify-between gap-6", children: [
|
|
576
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
577
|
+
(breadcrumbs || back) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
578
|
+
back && /* @__PURE__ */ jsx(BackButton, { back }),
|
|
579
|
+
breadcrumbs && /* @__PURE__ */ jsx(DesktopBreadcrumbs, { breadcrumbs })
|
|
580
|
+
] }),
|
|
581
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
582
|
+
Icon && /* @__PURE__ */ jsx(Icon, { className: "w-6 h-6 text-[var(--kyro-primary)]" }),
|
|
583
|
+
title && /* @__PURE__ */ jsx("h1", { className: "text-xl font-bold tracking-tighter text-[var(--kyro-text-primary)] truncate", children: title })
|
|
584
|
+
] }),
|
|
585
|
+
(description || metadata) && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1 mt-1", children: [
|
|
586
|
+
description && /* @__PURE__ */ jsx("p", { className: "text-[var(--kyro-text-secondary)] font-medium opacity-60 line-clamp-1 min-w-0", children: description }),
|
|
587
|
+
metadata && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: metadata.map((item, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
588
|
+
i === 0 && (description || i > 0) && /* @__PURE__ */ jsx("span", { className: "opacity-20 ml-1", children: "\xB7" }),
|
|
589
|
+
item
|
|
590
|
+
] }, i)) }),
|
|
591
|
+
children
|
|
592
|
+
] })
|
|
593
|
+
] }),
|
|
594
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 flex-wrap shrink-0", children: [
|
|
595
|
+
actions && /* @__PURE__ */ jsx(ActionsSlot, { actions }),
|
|
596
|
+
action && /* @__PURE__ */ jsx(SingleAction, { action })
|
|
597
|
+
] })
|
|
598
|
+
] }),
|
|
599
|
+
(actions || action) && /* @__PURE__ */ jsxs("div", { className: "md:hidden flex items-center gap-2 mt-3 pt-3 border-t border-[var(--kyro-border)]", children: [
|
|
600
|
+
action && /* @__PURE__ */ jsx(SingleAction, { action }),
|
|
601
|
+
actions && /* @__PURE__ */ jsx(ActionsSlot, { actions })
|
|
525
602
|
] })
|
|
526
603
|
] });
|
|
527
604
|
}
|
|
@@ -583,7 +660,7 @@ function Button({
|
|
|
583
660
|
}
|
|
584
661
|
function Pagination({ page, totalPages, totalDocs, limit, onPageChange, onLimitChange }) {
|
|
585
662
|
if (totalPages <= 1) return null;
|
|
586
|
-
return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-t border-[var(--kyro-border)]", children: [
|
|
663
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-3 px-4 py-3 border-t border-[var(--kyro-border)]", children: [
|
|
587
664
|
totalDocs !== void 0 && limit ? /* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--kyro-text-secondary)] font-medium", children: [
|
|
588
665
|
"Showing ",
|
|
589
666
|
(page - 1) * limit + 1,
|
|
@@ -592,7 +669,7 @@ function Pagination({ page, totalPages, totalDocs, limit, onPageChange, onLimitC
|
|
|
592
669
|
" of ",
|
|
593
670
|
totalDocs
|
|
594
671
|
] }) : /* @__PURE__ */ jsx("span", {}),
|
|
595
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
672
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-wrap justify-center", children: [
|
|
596
673
|
onLimitChange && /* @__PURE__ */ jsxs(
|
|
597
674
|
"select",
|
|
598
675
|
{
|
|
@@ -947,8 +1024,8 @@ function ListView({
|
|
|
947
1024
|
}
|
|
948
1025
|
),
|
|
949
1026
|
/* @__PURE__ */ jsxs("div", { className: "surface-tile p-4 flex flex-col lg:flex-row gap-4 items-start lg:items-center", children: [
|
|
950
|
-
/* @__PURE__ */ jsxs("div", { className: "relative flex-1 max-w-md", children: [
|
|
951
|
-
/* @__PURE__ */ jsx(Search, { className: "w-4 h-4" }),
|
|
1027
|
+
/* @__PURE__ */ jsxs("div", { className: "relative flex-1 w-full lg:max-w-md", children: [
|
|
1028
|
+
/* @__PURE__ */ jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--kyro-text-muted)]" }),
|
|
952
1029
|
/* @__PURE__ */ jsx(
|
|
953
1030
|
"input",
|
|
954
1031
|
{
|
|
@@ -1140,7 +1217,7 @@ function ListView({
|
|
|
1140
1217
|
}
|
|
1141
1218
|
)
|
|
1142
1219
|
] }) : /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-left", children: [
|
|
1143
|
-
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "text-[var(--kyro-text-secondary)] font-bold text-[10px] tracking-[0.3em] border-b border-[var(--kyro-border)]", children: [
|
|
1220
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "text-[var(--kyro-text-secondary)] font-bold text-[10px] tracking-[0.3em] border-b border-[var(--kyro-border)] whitespace-nowrap", children: [
|
|
1144
1221
|
/* @__PURE__ */ jsx("th", { className: "px-4 py-4 w-10", children: /* @__PURE__ */ jsx(
|
|
1145
1222
|
"input",
|
|
1146
1223
|
{
|
|
@@ -1933,10 +2010,10 @@ function SlidePanel({
|
|
|
1933
2010
|
};
|
|
1934
2011
|
}, [open, onClose]);
|
|
1935
2012
|
const widthClasses = {
|
|
1936
|
-
sm: "w-[320px]",
|
|
1937
|
-
md: "w-[400px]",
|
|
1938
|
-
lg: "w-[550px]",
|
|
1939
|
-
xl: "w-[700px]"
|
|
2013
|
+
sm: "w-full sm:w-[320px]",
|
|
2014
|
+
md: "w-full sm:w-[400px]",
|
|
2015
|
+
lg: "w-full sm:w-[550px]",
|
|
2016
|
+
xl: "w-full sm:w-[700px]"
|
|
1940
2017
|
};
|
|
1941
2018
|
if (!open || !hydrated) return null;
|
|
1942
2019
|
return createPortal(
|
|
@@ -2236,6 +2313,7 @@ function MediaGallery({
|
|
|
2236
2313
|
{}
|
|
2237
2314
|
);
|
|
2238
2315
|
const [showNewFolderModal, setShowNewFolderModal] = useState(false);
|
|
2316
|
+
const [showMobileFilters, setShowMobileFilters] = useState(false);
|
|
2239
2317
|
const [storageConfigured, setStorageConfigured] = useState(null);
|
|
2240
2318
|
const [storageChecked, setStorageChecked] = useState(false);
|
|
2241
2319
|
const [showStorageConfigModal, setShowStorageConfigModal] = useState(false);
|
|
@@ -2389,6 +2467,7 @@ function MediaGallery({
|
|
|
2389
2467
|
await apiPost("/api/media/folders", { name });
|
|
2390
2468
|
loadFolders();
|
|
2391
2469
|
setShowNewFolderModal(false);
|
|
2470
|
+
toast.success(`Folder "${name}" created`);
|
|
2392
2471
|
} catch (error) {
|
|
2393
2472
|
console.error("Failed to create folder:", error);
|
|
2394
2473
|
toast.error("Failed to create folder");
|
|
@@ -2406,6 +2485,7 @@ function MediaGallery({
|
|
|
2406
2485
|
if (currentFolder === folder) setCurrentFolder("");
|
|
2407
2486
|
loadFolders();
|
|
2408
2487
|
loadMedia();
|
|
2488
|
+
toast.success(`Folder "${folder}" deleted`);
|
|
2409
2489
|
} catch (error) {
|
|
2410
2490
|
console.error("Failed to delete folder:", error);
|
|
2411
2491
|
toast.error("Failed to delete folder");
|
|
@@ -2420,8 +2500,10 @@ function MediaGallery({
|
|
|
2420
2500
|
if (panelItem?.id === id) {
|
|
2421
2501
|
setPanelItem(result.doc);
|
|
2422
2502
|
}
|
|
2503
|
+
toast.success("Metadata updated");
|
|
2423
2504
|
} catch (error) {
|
|
2424
2505
|
console.error("Failed to update metadata:", error);
|
|
2506
|
+
toast.error("Failed to update metadata");
|
|
2425
2507
|
}
|
|
2426
2508
|
};
|
|
2427
2509
|
const onImageLoad = (e) => {
|
|
@@ -2470,6 +2552,7 @@ function MediaGallery({
|
|
|
2470
2552
|
await apiUpload("/api/media", formData);
|
|
2471
2553
|
loadMedia();
|
|
2472
2554
|
setShowCrop(false);
|
|
2555
|
+
toast.success("Cropped image saved");
|
|
2473
2556
|
}
|
|
2474
2557
|
}
|
|
2475
2558
|
} catch (err) {
|
|
@@ -2505,7 +2588,7 @@ function MediaGallery({
|
|
|
2505
2588
|
}
|
|
2506
2589
|
},
|
|
2507
2590
|
children: [
|
|
2508
|
-
/* @__PURE__ */ jsxs("div", { className: `flex flex-col lg:flex-row lg:items-center justify-between gap-6 border-b border-[var(--kyro-border)] backdrop-blur-md sticky top-0
|
|
2591
|
+
/* @__PURE__ */ jsxs("div", { className: `flex flex-col lg:flex-row lg:items-center justify-between gap-6 border-b border-[var(--kyro-border)] backdrop-blur-md sticky top-0 ${pickerMode ? "p-2" : "p-6 rounded-xl surface-tile"}`, children: [
|
|
2509
2592
|
!pickerMode && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-4", children: /* @__PURE__ */ jsxs("div", { children: [
|
|
2510
2593
|
/* @__PURE__ */ jsx("h2", { className: "text-xl font-bold tracking-tighter text-[var(--kyro-text-primary)]", children: "Media Library" }),
|
|
2511
2594
|
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-3 mt-1", children: /* @__PURE__ */ jsxs("span", { className: "text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] opacity-50", children: [
|
|
@@ -2516,7 +2599,7 @@ function MediaGallery({
|
|
|
2516
2599
|
] }) }),
|
|
2517
2600
|
/* @__PURE__ */ jsxs("div", { className: `flex items-center gap-3 flex-wrap lg:flex-nowrap ${pickerMode ? "w-full" : ""}`, children: [
|
|
2518
2601
|
/* @__PURE__ */ jsxs("div", { className: "relative group flex-1 min-w-[200px]", children: [
|
|
2519
|
-
/* @__PURE__ */ jsx(Search, { className: "w-4 h-4" }),
|
|
2602
|
+
/* @__PURE__ */ jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--kyro-text-muted)]" }),
|
|
2520
2603
|
/* @__PURE__ */ jsx(
|
|
2521
2604
|
"input",
|
|
2522
2605
|
{
|
|
@@ -2529,21 +2612,31 @@ function MediaGallery({
|
|
|
2529
2612
|
)
|
|
2530
2613
|
] }),
|
|
2531
2614
|
!pickerMode && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
2532
|
-
/* @__PURE__ */ jsxs("div", { className: "flex
|
|
2533
|
-
/* @__PURE__ */
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2615
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
2616
|
+
/* @__PURE__ */ jsxs("div", { className: "flex bg-[var(--kyro-surface-accent)] p-1 rounded-xl border border-[var(--kyro-border)]", children: [
|
|
2617
|
+
/* @__PURE__ */ jsx(
|
|
2618
|
+
"button",
|
|
2619
|
+
{
|
|
2620
|
+
onClick: () => setView("grid"),
|
|
2621
|
+
className: `p-2 rounded-lg transition-all ${view === "grid" ? "bg-[var(--kyro-surface)] shadow-sm text-[var(--kyro-text-primary)]" : "text-[var(--kyro-text-secondary)] opacity-50 hover:opacity-100"}`,
|
|
2622
|
+
children: /* @__PURE__ */ jsx(Grid3X3, { className: "w-4 h-4" })
|
|
2623
|
+
}
|
|
2624
|
+
),
|
|
2625
|
+
/* @__PURE__ */ jsx(
|
|
2626
|
+
"button",
|
|
2627
|
+
{
|
|
2628
|
+
onClick: () => setView("list"),
|
|
2629
|
+
className: `p-2 rounded-lg transition-all ${view === "list" ? "bg-[var(--kyro-surface)] shadow-sm text-[var(--kyro-text-primary)]" : "text-[var(--kyro-text-secondary)] opacity-50 hover:opacity-100"}`,
|
|
2630
|
+
children: /* @__PURE__ */ jsx(File, { className: "w-4 h-4" })
|
|
2631
|
+
}
|
|
2632
|
+
)
|
|
2633
|
+
] }),
|
|
2541
2634
|
/* @__PURE__ */ jsx(
|
|
2542
2635
|
"button",
|
|
2543
2636
|
{
|
|
2544
|
-
onClick: () =>
|
|
2545
|
-
className:
|
|
2546
|
-
children: /* @__PURE__ */ jsx(
|
|
2637
|
+
onClick: () => setShowMobileFilters(true),
|
|
2638
|
+
className: "md:hidden p-2 rounded-xl bg-[var(--kyro-surface-accent)] border border-[var(--kyro-border)] text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)] transition-colors",
|
|
2639
|
+
children: /* @__PURE__ */ jsx(Filter, { className: "w-4 h-4" })
|
|
2547
2640
|
}
|
|
2548
2641
|
)
|
|
2549
2642
|
] }),
|
|
@@ -2642,7 +2735,7 @@ function MediaGallery({
|
|
|
2642
2735
|
] })
|
|
2643
2736
|
] }) }),
|
|
2644
2737
|
/* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col min-h-0 bg-[var(--kyro-bg)]", children: [
|
|
2645
|
-
/* @__PURE__ */ jsx("div", { className: `flex-1 overflow-y-auto custom-scrollbar ${pickerMode ? "px-2 py-4" : "py-8 px-4"}`, children: loading ? /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-4
|
|
2738
|
+
/* @__PURE__ */ jsx("div", { className: `flex-1 overflow-y-auto custom-scrollbar ${pickerMode ? "px-2 py-4" : "py-4 px-2 md:py-8 md:px-4"}`, children: loading ? /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-4 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5", children: /* @__PURE__ */ jsx(Shimmer, { variant: "media-card", count: 12 }) }) : items.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center py-32 text-center", children: [
|
|
2646
2739
|
/* @__PURE__ */ jsx("div", { className: "w-24 h-24 rounded-[2rem] bg-[var(--kyro-surface-accent)] flex items-center justify-center mb-8 rotate-12 group-hover:rotate-0 transition-transform duration-500", children: /* @__PURE__ */ jsx(Grid3X3, { className: "w-10 h-10 text-[var(--kyro-text-muted)] opacity-30" }) }),
|
|
2647
2740
|
/* @__PURE__ */ jsx("h3", { className: "text-xl font-bold text-[var(--kyro-text-primary)] tracking-tight", children: "No assets found" }),
|
|
2648
2741
|
/* @__PURE__ */ jsx("p", { className: "text-[var(--kyro-text-secondary)] mt-2 max-w-xs mx-auto text-sm font-medium leading-relaxed", children: "Upload your first file or create a folder to organize your media assets." }),
|
|
@@ -2842,6 +2935,105 @@ function MediaGallery({
|
|
|
2842
2935
|
)
|
|
2843
2936
|
] })
|
|
2844
2937
|
] }),
|
|
2938
|
+
showMobileFilters && !pickerMode && /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-[70] md:hidden", children: [
|
|
2939
|
+
/* @__PURE__ */ jsx(
|
|
2940
|
+
"div",
|
|
2941
|
+
{
|
|
2942
|
+
className: "fixed inset-0 bg-black/50 backdrop-blur-sm",
|
|
2943
|
+
onClick: () => setShowMobileFilters(false)
|
|
2944
|
+
}
|
|
2945
|
+
),
|
|
2946
|
+
/* @__PURE__ */ jsxs("div", { className: "fixed bottom-0 left-0 right-0 bg-[var(--kyro-surface)] rounded-t-3xl shadow-2xl max-h-[70vh] overflow-y-auto animate-in slide-in-from-bottom-12 duration-300", children: [
|
|
2947
|
+
/* @__PURE__ */ jsxs("div", { className: "sticky top-0 bg-[var(--kyro-surface)] z-10 flex items-center justify-between p-6 pb-4 border-b border-[var(--kyro-border)]", children: [
|
|
2948
|
+
/* @__PURE__ */ jsx("h3", { className: "text-sm font-bold tracking-tight text-[var(--kyro-text-primary)]", children: "Filters" }),
|
|
2949
|
+
/* @__PURE__ */ jsx(
|
|
2950
|
+
"button",
|
|
2951
|
+
{
|
|
2952
|
+
onClick: () => setShowMobileFilters(false),
|
|
2953
|
+
className: "p-2 rounded-xl hover:bg-[var(--kyro-surface-accent)] transition-colors text-[var(--kyro-text-muted)]",
|
|
2954
|
+
children: /* @__PURE__ */ jsx(X, { className: "w-4 h-4" })
|
|
2955
|
+
}
|
|
2956
|
+
)
|
|
2957
|
+
] }),
|
|
2958
|
+
/* @__PURE__ */ jsxs("div", { className: "p-6 space-y-8", children: [
|
|
2959
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
2960
|
+
/* @__PURE__ */ jsx("span", { className: "text-[10px] font-bold tracking-[0.2em] text-[var(--kyro-text-secondary)] opacity-40 block mb-4", children: "Quick Filters" }),
|
|
2961
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: ["all", "image", "video", "audio", "document", "archive"].map((t) => /* @__PURE__ */ jsx(
|
|
2962
|
+
"button",
|
|
2963
|
+
{
|
|
2964
|
+
onClick: () => {
|
|
2965
|
+
setFilter(t);
|
|
2966
|
+
setShowMobileFilters(false);
|
|
2967
|
+
},
|
|
2968
|
+
className: `px-4 py-2 rounded-xl text-[11px] font-bold capitalize transition-all border ${filter === t ? "bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] border-transparent" : "bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] border-[var(--kyro-border)] hover:border-[var(--kyro-text-muted)]"}`,
|
|
2969
|
+
children: t
|
|
2970
|
+
},
|
|
2971
|
+
t
|
|
2972
|
+
)) })
|
|
2973
|
+
] }),
|
|
2974
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
2975
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-4", children: [
|
|
2976
|
+
/* @__PURE__ */ jsx("span", { className: "text-[10px] font-bold tracking-[0.2em] text-[var(--kyro-text-secondary)] opacity-40", children: "Folders" }),
|
|
2977
|
+
/* @__PURE__ */ jsx(
|
|
2978
|
+
"button",
|
|
2979
|
+
{
|
|
2980
|
+
onClick: () => {
|
|
2981
|
+
setShowNewFolderModal(true);
|
|
2982
|
+
setShowMobileFilters(false);
|
|
2983
|
+
},
|
|
2984
|
+
className: "p-1.5 hover:bg-[var(--kyro-surface-accent)] rounded-lg transition-colors text-[var(--kyro-text-primary)]",
|
|
2985
|
+
children: /* @__PURE__ */ jsx(FolderPlus, { className: "w-4 h-4" })
|
|
2986
|
+
}
|
|
2987
|
+
)
|
|
2988
|
+
] }),
|
|
2989
|
+
/* @__PURE__ */ jsxs("nav", { className: "space-y-1", children: [
|
|
2990
|
+
/* @__PURE__ */ jsxs(
|
|
2991
|
+
"button",
|
|
2992
|
+
{
|
|
2993
|
+
onClick: () => {
|
|
2994
|
+
setCurrentFolder("");
|
|
2995
|
+
setShowMobileFilters(false);
|
|
2996
|
+
},
|
|
2997
|
+
className: `w-full flex items-center gap-3 px-4 py-2.5 rounded-xl text-xs font-bold transition-all ${currentFolder === "" ? "bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] shadow-md" : "text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)] hover:text-[var(--kyro-text-primary)]"}`,
|
|
2998
|
+
children: [
|
|
2999
|
+
/* @__PURE__ */ jsx(FolderInput, { className: "w-4 h-4 opacity-70" }),
|
|
3000
|
+
"All Assets"
|
|
3001
|
+
]
|
|
3002
|
+
}
|
|
3003
|
+
),
|
|
3004
|
+
folders.map((folder) => /* @__PURE__ */ jsxs("div", { className: "group relative", children: [
|
|
3005
|
+
/* @__PURE__ */ jsxs(
|
|
3006
|
+
"button",
|
|
3007
|
+
{
|
|
3008
|
+
onClick: () => {
|
|
3009
|
+
setCurrentFolder(folder);
|
|
3010
|
+
setShowMobileFilters(false);
|
|
3011
|
+
},
|
|
3012
|
+
className: `w-full flex items-center gap-3 px-4 py-2.5 rounded-xl text-xs font-bold transition-all ${currentFolder === folder ? "bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] shadow-md" : "text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)] hover:text-[var(--kyro-text-primary)]"}`,
|
|
3013
|
+
children: [
|
|
3014
|
+
/* @__PURE__ */ jsx("div", { className: "w-4 h-4 flex items-center justify-center opacity-70", children: /* @__PURE__ */ jsx(Folder, { fill: currentFolder === folder ? "currentColor" : "none" }) }),
|
|
3015
|
+
folder
|
|
3016
|
+
]
|
|
3017
|
+
}
|
|
3018
|
+
),
|
|
3019
|
+
/* @__PURE__ */ jsx(
|
|
3020
|
+
"button",
|
|
3021
|
+
{
|
|
3022
|
+
onClick: (e) => {
|
|
3023
|
+
e.stopPropagation();
|
|
3024
|
+
handleDeleteFolder(folder);
|
|
3025
|
+
setShowMobileFilters(false);
|
|
3026
|
+
},
|
|
3027
|
+
className: "absolute right-2 top-1/2 -translate-y-1/2 p-1.5 text-red-500 opacity-0 group-hover:opacity-100 transition-all hover:bg-red-50 rounded-lg",
|
|
3028
|
+
children: /* @__PURE__ */ jsx(Trash2, { className: "w-3.5 h-3.5" })
|
|
3029
|
+
}
|
|
3030
|
+
)
|
|
3031
|
+
] }, folder))
|
|
3032
|
+
] })
|
|
3033
|
+
] })
|
|
3034
|
+
] })
|
|
3035
|
+
] })
|
|
3036
|
+
] }),
|
|
2845
3037
|
/* @__PURE__ */ jsx(
|
|
2846
3038
|
SlidePanel,
|
|
2847
3039
|
{
|
|
@@ -3139,6 +3331,8 @@ function MediaGallery({
|
|
|
3139
3331
|
setShowStorageConfigModal(false);
|
|
3140
3332
|
setStorageConfigured(true);
|
|
3141
3333
|
window.location.reload();
|
|
3334
|
+
}).catch(() => {
|
|
3335
|
+
toast.error("Failed to configure storage");
|
|
3142
3336
|
});
|
|
3143
3337
|
},
|
|
3144
3338
|
className: "flex-1 px-4 py-3 border border-[var(--kyro-border)] text-[var(--kyro-text-secondary)] rounded-xl font-bold hover:bg-[var(--kyro-surface-accent)] transition-colors",
|
|
@@ -6100,7 +6294,7 @@ var VideoBlock = ({
|
|
|
6100
6294
|
{
|
|
6101
6295
|
type: "button",
|
|
6102
6296
|
onClick: () => removeBlock(block3.id),
|
|
6103
|
-
className: "p-1 hover:bg-
|
|
6297
|
+
className: "p-1 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-danger)]",
|
|
6104
6298
|
title: "Remove",
|
|
6105
6299
|
children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
|
|
6106
6300
|
}
|
|
@@ -6124,7 +6318,7 @@ var ListField = ({
|
|
|
6124
6318
|
onChange,
|
|
6125
6319
|
compact = false
|
|
6126
6320
|
}) => {
|
|
6127
|
-
const [inputValue, setInputValue] =
|
|
6321
|
+
const [inputValue, setInputValue] = React.useState("");
|
|
6128
6322
|
const handleAdd = () => {
|
|
6129
6323
|
if (inputValue.trim()) {
|
|
6130
6324
|
onChange([...items, inputValue.trim()]);
|
|
@@ -6210,7 +6404,7 @@ var ListBlock = ({
|
|
|
6210
6404
|
{
|
|
6211
6405
|
type: "button",
|
|
6212
6406
|
onClick: () => removeBlock(block3.id),
|
|
6213
|
-
className: "p-1 hover:bg-
|
|
6407
|
+
className: "p-1 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-danger)]",
|
|
6214
6408
|
title: "Remove",
|
|
6215
6409
|
children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
|
|
6216
6410
|
}
|
|
@@ -6259,7 +6453,7 @@ var CodeBlock = ({
|
|
|
6259
6453
|
{
|
|
6260
6454
|
type: "button",
|
|
6261
6455
|
onClick: () => removeBlock(block3.id),
|
|
6262
|
-
className: "p-1.5 hover:bg-
|
|
6456
|
+
className: "p-1.5 hover:bg-[var(--kyro-danger-bg)] rounded-lg transition-all text-[var(--kyro-text-muted)] hover:text-[var(--kyro-danger)]",
|
|
6263
6457
|
title: "Remove",
|
|
6264
6458
|
children: /* @__PURE__ */ jsx(X, { className: "w-4 h-4" })
|
|
6265
6459
|
}
|
|
@@ -6358,7 +6552,7 @@ var FileBlock = ({
|
|
|
6358
6552
|
{
|
|
6359
6553
|
type: "button",
|
|
6360
6554
|
onClick: () => removeBlock(block3.id),
|
|
6361
|
-
className: "p-1 hover:bg-
|
|
6555
|
+
className: "p-1 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-danger)]",
|
|
6362
6556
|
title: "Remove",
|
|
6363
6557
|
children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
|
|
6364
6558
|
}
|
|
@@ -6380,7 +6574,7 @@ var AccordionField = ({
|
|
|
6380
6574
|
onChange,
|
|
6381
6575
|
compact = false
|
|
6382
6576
|
}) => {
|
|
6383
|
-
const [openIndex, setOpenIndex] =
|
|
6577
|
+
const [openIndex, setOpenIndex] = React.useState(0);
|
|
6384
6578
|
const handleTitleChange = (index, value) => {
|
|
6385
6579
|
const newItems = [...items];
|
|
6386
6580
|
newItems[index] = { ...newItems[index], title: value };
|
|
@@ -6604,7 +6798,7 @@ var AccordionBlock = ({
|
|
|
6604
6798
|
{
|
|
6605
6799
|
type: "button",
|
|
6606
6800
|
onClick: () => removeBlock(block3.id),
|
|
6607
|
-
className: "p-1 hover:bg-
|
|
6801
|
+
className: "p-1 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-danger)]",
|
|
6608
6802
|
title: "Remove",
|
|
6609
6803
|
children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
|
|
6610
6804
|
}
|
|
@@ -6656,7 +6850,7 @@ var RichTextBlock = ({
|
|
|
6656
6850
|
{
|
|
6657
6851
|
type: "button",
|
|
6658
6852
|
onClick: () => removeBlock(block3.id),
|
|
6659
|
-
className: "p-1 hover:bg-
|
|
6853
|
+
className: "p-1 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-danger)]",
|
|
6660
6854
|
title: "Remove",
|
|
6661
6855
|
children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
|
|
6662
6856
|
}
|
|
@@ -6806,7 +7000,7 @@ function ArrayLayout({
|
|
|
6806
7000
|
const firstField = fields2[0];
|
|
6807
7001
|
const labelField = firstField?.name || "user";
|
|
6808
7002
|
const isRelationship = firstField?.type === "relationship";
|
|
6809
|
-
const [openIndex, setOpenIndex] =
|
|
7003
|
+
const [openIndex, setOpenIndex] = React.useState(0);
|
|
6810
7004
|
function getItemLabel(item) {
|
|
6811
7005
|
for (const key of ["label", "title", "name"]) {
|
|
6812
7006
|
const val = item[key];
|
|
@@ -7443,7 +7637,7 @@ var ChildBlocksTree = ({
|
|
|
7443
7637
|
handleRemoveChild(child.id);
|
|
7444
7638
|
setConfirmDeleteId(null);
|
|
7445
7639
|
},
|
|
7446
|
-
className: "px-2 py-1 text-xs bg-
|
|
7640
|
+
className: "px-2 py-1 text-xs bg-[var(--kyro-danger)] text-white rounded",
|
|
7447
7641
|
children: "Remove"
|
|
7448
7642
|
}
|
|
7449
7643
|
),
|
|
@@ -7466,8 +7660,8 @@ var ChildBlocksTree = ({
|
|
|
7466
7660
|
e.stopPropagation();
|
|
7467
7661
|
setConfirmDeleteId(child.id);
|
|
7468
7662
|
},
|
|
7469
|
-
className: "p-1.5 rounded-md transition-opacity cursor-pointer hover:bg-
|
|
7470
|
-
children: /* @__PURE__ */ jsx(X, { className: "w-3.5 h-3.5 text-
|
|
7663
|
+
className: "p-1.5 rounded-md transition-opacity cursor-pointer hover:bg-[var(--kyro-danger-bg)]",
|
|
7664
|
+
children: /* @__PURE__ */ jsx(X, { className: "w-3.5 h-3.5 text-[var(--kyro-danger)] invisible group-hover/column:visible" })
|
|
7471
7665
|
}
|
|
7472
7666
|
)
|
|
7473
7667
|
]
|
|
@@ -7664,7 +7858,7 @@ var NestedChildBlocks = ({
|
|
|
7664
7858
|
handleRemoveChild(child.id);
|
|
7665
7859
|
setConfirmDeleteId(null);
|
|
7666
7860
|
},
|
|
7667
|
-
className: "px-2 py-1 text-xs bg-
|
|
7861
|
+
className: "px-2 py-1 text-xs bg-[var(--kyro-danger)] text-white rounded",
|
|
7668
7862
|
children: "Remove"
|
|
7669
7863
|
}
|
|
7670
7864
|
),
|
|
@@ -7687,8 +7881,8 @@ var NestedChildBlocks = ({
|
|
|
7687
7881
|
e.stopPropagation();
|
|
7688
7882
|
setConfirmDeleteId(child.id);
|
|
7689
7883
|
},
|
|
7690
|
-
className: "p-1.5 rounded-md invisible group-hover:visible transition-opacity cursor-pointer hover:bg-
|
|
7691
|
-
children: /* @__PURE__ */ jsx(X, { className: "w-3.5 h-3.5 text-
|
|
7884
|
+
className: "p-1.5 rounded-md invisible group-hover:visible transition-opacity cursor-pointer hover:bg-[var(--kyro-danger-bg)]",
|
|
7885
|
+
children: /* @__PURE__ */ jsx(X, { className: "w-3.5 h-3.5 text-[var(--kyro-danger)]" })
|
|
7692
7886
|
}
|
|
7693
7887
|
)
|
|
7694
7888
|
]
|
|
@@ -7821,7 +8015,7 @@ var HeroBlock = ({
|
|
|
7821
8015
|
{
|
|
7822
8016
|
type: "button",
|
|
7823
8017
|
onClick: () => removeBlock(block3.id),
|
|
7824
|
-
className: "p-1 hover:bg-
|
|
8018
|
+
className: "p-1 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-danger)]",
|
|
7825
8019
|
title: "Remove",
|
|
7826
8020
|
children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
|
|
7827
8021
|
}
|
|
@@ -8049,7 +8243,7 @@ var ArrayBlock = ({
|
|
|
8049
8243
|
{
|
|
8050
8244
|
type: "button",
|
|
8051
8245
|
onClick: () => removeBlock(block3.id),
|
|
8052
|
-
className: "p-1 hover:bg-
|
|
8246
|
+
className: "p-1 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-danger)]",
|
|
8053
8247
|
title: "Remove",
|
|
8054
8248
|
children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
|
|
8055
8249
|
}
|
|
@@ -8266,7 +8460,7 @@ var RelationshipBlock = ({
|
|
|
8266
8460
|
{
|
|
8267
8461
|
type: "button",
|
|
8268
8462
|
onClick: () => removeBlock(block3.id),
|
|
8269
|
-
className: "p-1 hover:bg-
|
|
8463
|
+
className: "p-1 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-danger)]",
|
|
8270
8464
|
title: "Remove",
|
|
8271
8465
|
children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
|
|
8272
8466
|
}
|
|
@@ -8466,7 +8660,7 @@ var SortableBlockComponent = ({
|
|
|
8466
8660
|
removeBlock(block3.id);
|
|
8467
8661
|
setShowDeleteConfirm(false);
|
|
8468
8662
|
},
|
|
8469
|
-
className: "px-1.5 py-0.5 text-[9px] bg-
|
|
8663
|
+
className: "px-1.5 py-0.5 text-[9px] bg-[var(--kyro-danger)] text-white rounded font-semibold transition-colors hover:brightness-90",
|
|
8470
8664
|
children: "Remove"
|
|
8471
8665
|
}
|
|
8472
8666
|
),
|
|
@@ -8501,7 +8695,7 @@ var SortableBlockComponent = ({
|
|
|
8501
8695
|
e.stopPropagation();
|
|
8502
8696
|
setShowDeleteConfirm(true);
|
|
8503
8697
|
},
|
|
8504
|
-
className: "p-0.5 hover:bg-
|
|
8698
|
+
className: "p-0.5 hover:bg-[var(--kyro-danger-bg)] hover:text-[var(--kyro-danger)] rounded text-[var(--kyro-text-muted)] transition-colors",
|
|
8505
8699
|
title: "Remove",
|
|
8506
8700
|
children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
|
|
8507
8701
|
}
|
|
@@ -8520,11 +8714,11 @@ var SortableBlockComponent = ({
|
|
|
8520
8714
|
)
|
|
8521
8715
|
] });
|
|
8522
8716
|
}
|
|
8523
|
-
return /* @__PURE__ */ jsxs("div", { ref: setNodeRef, style, className: "relative group pl-8 mb-2", children: [
|
|
8717
|
+
return /* @__PURE__ */ jsxs("div", { ref: setNodeRef, style, className: "relative group md:pl-8 mb-2", children: [
|
|
8524
8718
|
/* @__PURE__ */ jsx(
|
|
8525
8719
|
"div",
|
|
8526
8720
|
{
|
|
8527
|
-
className: "absolute left-0 top-1/2 -translate-y-1/2 p-1.5 cursor-grab active:cursor-grabbing text-[var(--kyro-text-muted)] opacity-0 group-hover:opacity-100 transition-opacity hover:bg-[var(--kyro-surface-accent)] rounded",
|
|
8721
|
+
className: "hidden md:absolute left-0 top-1/2 -translate-y-1/2 p-1.5 cursor-grab active:cursor-grabbing text-[var(--kyro-text-muted)] opacity-0 group-hover:opacity-100 transition-opacity hover:bg-[var(--kyro-surface-accent)] rounded",
|
|
8528
8722
|
...attributes,
|
|
8529
8723
|
...listeners,
|
|
8530
8724
|
children: /* @__PURE__ */ jsx(GripVertical, { className: "w-4 h-4" })
|
|
@@ -8565,7 +8759,7 @@ var SortableBlockComponent = ({
|
|
|
8565
8759
|
removeBlock(block3.id);
|
|
8566
8760
|
setShowDeleteConfirm(false);
|
|
8567
8761
|
},
|
|
8568
|
-
className: "px-2.5 py-1 text-[10px] bg-
|
|
8762
|
+
className: "px-2.5 py-1 text-[10px] bg-[var(--kyro-danger)] text-white rounded font-semibold transition-colors hover:brightness-90",
|
|
8569
8763
|
children: "Remove"
|
|
8570
8764
|
}
|
|
8571
8765
|
),
|
|
@@ -8602,7 +8796,7 @@ var SortableBlockComponent = ({
|
|
|
8602
8796
|
e.stopPropagation();
|
|
8603
8797
|
setShowDeleteConfirm(true);
|
|
8604
8798
|
},
|
|
8605
|
-
className: "p-1 hover:bg-
|
|
8799
|
+
className: "p-1 hover:bg-[var(--kyro-danger-bg)] hover:text-[var(--kyro-danger)] rounded text-[var(--kyro-text-muted)] transition-colors",
|
|
8606
8800
|
title: "Remove Block",
|
|
8607
8801
|
children: /* @__PURE__ */ jsx(X, { className: "w-3.5 h-3.5" })
|
|
8608
8802
|
}
|
|
@@ -8621,7 +8815,7 @@ var SortableBlockComponent = ({
|
|
|
8621
8815
|
)
|
|
8622
8816
|
] });
|
|
8623
8817
|
};
|
|
8624
|
-
var SortableBlock =
|
|
8818
|
+
var SortableBlock = React.memo(SortableBlockComponent);
|
|
8625
8819
|
var BlocksField = ({
|
|
8626
8820
|
field: field3,
|
|
8627
8821
|
value,
|
|
@@ -8792,7 +8986,7 @@ var BlocksField = ({
|
|
|
8792
8986
|
}
|
|
8793
8987
|
}
|
|
8794
8988
|
};
|
|
8795
|
-
const activeBlock = activeDrag ?
|
|
8989
|
+
const activeBlock = activeDrag ? dynamicCategories.flatMap((cat) => cat.blocks).find((b) => `drawer-${b.type}` === activeDrag.id) || blocks2.find((b) => b.id === activeDrag.id) : null;
|
|
8796
8990
|
activeBlock ? "label" in activeBlock ? activeBlock.label : activeBlock.type : "Block";
|
|
8797
8991
|
useEffect(() => {
|
|
8798
8992
|
if (!isDropdownOpen) return;
|
|
@@ -10040,7 +10234,7 @@ function AutoForm({
|
|
|
10040
10234
|
return /* @__PURE__ */ jsx(
|
|
10041
10235
|
"div",
|
|
10042
10236
|
{
|
|
10043
|
-
className: "kyro-form-row flex gap-6 items-end",
|
|
10237
|
+
className: "kyro-form-row flex flex-col md:flex-row gap-4 md:gap-6 items-start md:items-end w-full",
|
|
10044
10238
|
children: rowFields?.map((f) => {
|
|
10045
10239
|
const fAdmin = f.admin || {};
|
|
10046
10240
|
const actionUrl = fAdmin?.action;
|
|
@@ -10272,24 +10466,24 @@ function AutoForm({
|
|
|
10272
10466
|
const statusLabel = hasUnpublishedChanges ? "Draft (unpublished changes)" : docStatus === "published" ? "Published" : "Draft";
|
|
10273
10467
|
const statusColor = docStatus === "published" && !hasUnsavedChanges ? "bg-[var(--kyro-success)]" : hasUnpublishedChanges ? "bg-[var(--kyro-warning)]" : "bg-[var(--kyro-text-muted)]";
|
|
10274
10468
|
const statusBadgeBg = docStatus === "published" && !hasUnpublishedChanges ? "bg-[var(--kyro-success)]/10 text-[var(--kyro-success)] border-[var(--kyro-success)]/20" : hasUnpublishedChanges ? "bg-[var(--kyro-warning)]/10 text-[var(--kyro-warning)] border-[var(--kyro-warning)]/20" : "bg-[var(--kyro-text-muted)]/10 text-[var(--kyro-text-muted)] border-[var(--kyro-text-muted)]/20";
|
|
10275
|
-
return /* @__PURE__ */ jsxs("header", { className: "surface-tile px-8 py-6 flex items-center justify-between sticky top-0 z-50 border-b border-[var(--kyro-border)] mb-8 bg-[var(--kyro-surface)] backdrop-blur-md", children: [
|
|
10276
|
-
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
10277
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
10469
|
+
return /* @__PURE__ */ jsxs("header", { className: "surface-tile px-3 md:px-8 py-2 md:py-6 flex items-center justify-between max-md:static sticky top-0 z-50 border-b border-[var(--kyro-border)] mb-0 md:mb-8 bg-[var(--kyro-surface)] backdrop-blur-md", children: [
|
|
10470
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1 md:gap-2 min-w-0", children: [
|
|
10471
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 md:gap-3 flex-wrap min-w-0", children: [
|
|
10278
10472
|
/* @__PURE__ */ jsx(
|
|
10279
10473
|
"a",
|
|
10280
10474
|
{
|
|
10281
10475
|
href: `/${collectionSlug}`,
|
|
10282
|
-
className: "p-2 border border-[var(--kyro-border)] rounded-xl hover:bg-[var(--kyro-bg-secondary)] transition-colors",
|
|
10476
|
+
className: "p-1.5 md:p-2 border-0 md:border border-[var(--kyro-border)] rounded-xl hover:bg-[var(--kyro-bg-secondary)] transition-colors shrink-0",
|
|
10283
10477
|
children: /* @__PURE__ */ jsx(ChevronRight, { className: "w-4 h-4" })
|
|
10284
10478
|
}
|
|
10285
10479
|
),
|
|
10286
|
-
/* @__PURE__ */ jsx("h1", { className: "text-xl font-bold tracking-tighter", children: docTitle }),
|
|
10287
|
-
/* @__PURE__ */ jsxs("span", { className: `inline-flex items-center gap-1.5 px-2 rounded-full text-[10px] font-regular border ${statusBadgeBg}`, children: [
|
|
10480
|
+
/* @__PURE__ */ jsx("h1", { className: "text-lg md:text-xl font-bold tracking-tighter truncate min-w-0", children: docTitle }),
|
|
10481
|
+
/* @__PURE__ */ jsxs("span", { className: `shrink-0 inline-flex items-center gap-1.5 px-2 rounded-full text-[10px] font-regular border ${statusBadgeBg}`, children: [
|
|
10288
10482
|
/* @__PURE__ */ jsx("span", { className: `h-1.5 w-1.5 rounded-full ${statusColor}` }),
|
|
10289
10483
|
statusLabel
|
|
10290
10484
|
] })
|
|
10291
10485
|
] }),
|
|
10292
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 text-[11px] font-medium tracking-wide opacity-60 ml-12", children: [
|
|
10486
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 text-[11px] font-medium tracking-wide opacity-60 md:ml-12", children: [
|
|
10293
10487
|
autoSaveStatus === "saving" && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5 text-[var(--kyro-text-muted)]", children: [
|
|
10294
10488
|
/* @__PURE__ */ jsxs(
|
|
10295
10489
|
"svg",
|
|
@@ -10410,7 +10604,7 @@ function AutoForm({
|
|
|
10410
10604
|
] })
|
|
10411
10605
|
] })
|
|
10412
10606
|
] }),
|
|
10413
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-6", children: [
|
|
10607
|
+
/* @__PURE__ */ jsxs("div", { className: "max-md:hidden flex items-center gap-6", children: [
|
|
10414
10608
|
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1 bg-[var(--kyro-bg-secondary)] p-1 rounded-xl border border-[var(--kyro-border)]", children: ["edit", "version", "api"].map((v) => /* @__PURE__ */ jsx(
|
|
10415
10609
|
"button",
|
|
10416
10610
|
{
|
|
@@ -10595,15 +10789,15 @@ function AutoForm({
|
|
|
10595
10789
|
};
|
|
10596
10790
|
const renderEditView = () => {
|
|
10597
10791
|
if (layout === "single") {
|
|
10598
|
-
return /* @__PURE__ */ jsx("div", { className: "w-full space-y-8", children: /* @__PURE__ */ jsx("div", { className: "surface-tile p-8 space-y-8", children: config.fields.map((f) => renderField(f)) }) });
|
|
10792
|
+
return /* @__PURE__ */ jsx("div", { className: "w-full space-y-6 md:space-y-8", children: /* @__PURE__ */ jsx("div", { className: "surface-tile p-4 md:p-8 space-y-6 md:space-y-8", children: config.fields.map((f) => renderField(f)) }) });
|
|
10599
10793
|
}
|
|
10600
10794
|
const hasSidebarFields = config.fields.some((f) => f.admin?.position === "sidebar") && !showPreview;
|
|
10601
10795
|
return /* @__PURE__ */ jsxs(
|
|
10602
10796
|
"div",
|
|
10603
10797
|
{
|
|
10604
|
-
className: `w-full mx-auto grid gap-8 pb-32 transition-all duration-700 ${showPreview ? "grid-cols-1 lg:grid-cols-2" : sidebarCollapsed || !hasSidebarFields ? "grid-cols-1" : "grid-cols-1 lg:grid-cols-[1fr_380px]"}`,
|
|
10798
|
+
className: `w-full mx-auto grid gap-4 md:gap-8 pb-32 transition-all duration-700 ${showPreview ? "grid-cols-1 lg:grid-cols-2" : sidebarCollapsed || !hasSidebarFields ? "grid-cols-1" : "grid-cols-1 lg:grid-cols-[1fr_380px]"}`,
|
|
10605
10799
|
children: [
|
|
10606
|
-
/* @__PURE__ */ jsx("div", { className: "space-y-8 animate-in fade-in slide-in-from-left-4 duration-500", children: config.tabs ? renderField({ type: "tabs", tabs: config.tabs }) : /* @__PURE__ */ jsx("div", { className: "surface-tile p-8 space-y-8", children: config.fields.filter(
|
|
10800
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-6 md:space-y-8 animate-in fade-in slide-in-from-left-4 duration-500", children: config.tabs ? renderField({ type: "tabs", tabs: config.tabs }) : /* @__PURE__ */ jsx("div", { className: "surface-tile p-4 md:p-8 space-y-6 md:space-y-8", children: config.fields.filter(
|
|
10607
10801
|
(f) => !f.admin?.position || f.admin.position === "main"
|
|
10608
10802
|
).map((f) => renderField(f)) }) }),
|
|
10609
10803
|
showPreview ? /* @__PURE__ */ jsx("div", { className: "sticky top-36 h-[calc(100vh-280px)] animate-in fade-in slide-in-from-right-10 duration-700", children: /* @__PURE__ */ jsxs("div", { className: "w-full h-full rounded-3xl border border-[var(--kyro-border)] bg-[var(--kyro-bg-secondary)] shadow-2xl overflow-hidden relative group", children: [
|
|
@@ -10620,9 +10814,18 @@ function AutoForm({
|
|
|
10620
10814
|
}
|
|
10621
10815
|
),
|
|
10622
10816
|
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-transparent pointer-events-none border-[12px] border-[var(--kyro-surface)] rounded-3xl" })
|
|
10623
|
-
] }) }) : sidebarCollapsed ? null : /* @__PURE__ */ jsx("div", { className: "space-y-6 animate-in fade-in slide-in-from-right-4 duration-500", children: config.fields.some((f) => f.admin?.position === "sidebar") && /* @__PURE__ */ jsxs(
|
|
10624
|
-
/* @__PURE__ */
|
|
10625
|
-
|
|
10817
|
+
] }) }) : sidebarCollapsed ? null : /* @__PURE__ */ jsx("div", { className: "space-y-4 md:space-y-6 animate-in fade-in slide-in-from-right-4 duration-500", children: config.fields.some((f) => f.admin?.position === "sidebar") && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
10818
|
+
/* @__PURE__ */ jsxs("div", { className: "hidden lg:block surface-tile p-6 space-y-6", children: [
|
|
10819
|
+
/* @__PURE__ */ jsx("h3", { className: "text-[10px] font-bold tracking-[0.2em] opacity-40", children: "Settings" }),
|
|
10820
|
+
config.fields.filter((f) => f.admin?.position === "sidebar").map((f) => renderField(f))
|
|
10821
|
+
] }),
|
|
10822
|
+
/* @__PURE__ */ jsxs("details", { className: "lg:hidden surface-tile p-4 space-y-4 group", children: [
|
|
10823
|
+
/* @__PURE__ */ jsxs("summary", { className: "cursor-pointer font-semibold text-xs tracking-widest opacity-40 text-[var(--kyro-text-secondary)] select-none flex items-center gap-2", children: [
|
|
10824
|
+
/* @__PURE__ */ jsx("svg", { className: "w-3 h-3 transition-transform group-open:rotate-90", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx("path", { d: "M9 18l6-6-6-6" }) }),
|
|
10825
|
+
"Settings"
|
|
10826
|
+
] }),
|
|
10827
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-4 pt-4 border-t border-[var(--kyro-border)]", children: config.fields.filter((f) => f.admin?.position === "sidebar").map((f) => renderField(f)) })
|
|
10828
|
+
] })
|
|
10626
10829
|
] }) })
|
|
10627
10830
|
]
|
|
10628
10831
|
}
|
|
@@ -10874,7 +11077,7 @@ function AutoForm({
|
|
|
10874
11077
|
}
|
|
10875
11078
|
)
|
|
10876
11079
|
] }),
|
|
10877
|
-
/* @__PURE__ */ jsxs("main", { className: "w-full", children: [
|
|
11080
|
+
/* @__PURE__ */ jsxs("main", { className: "w-full pt-6 md:pt-0", children: [
|
|
10878
11081
|
view === "edit" && renderEditView(),
|
|
10879
11082
|
view === "version" && renderVersionView(),
|
|
10880
11083
|
view === "api" && renderApiView()
|
|
@@ -10892,9 +11095,13 @@ function ActionBar({
|
|
|
10892
11095
|
onViewHistory,
|
|
10893
11096
|
onPreview,
|
|
10894
11097
|
onDelete,
|
|
11098
|
+
onBack,
|
|
11099
|
+
onToggleSidebar,
|
|
10895
11100
|
publishedAt,
|
|
10896
11101
|
updatedAt
|
|
10897
11102
|
}) {
|
|
11103
|
+
const view = useAutoFormStore((s) => s.view) || "edit";
|
|
11104
|
+
const setView = useAutoFormStore((s) => s.setView);
|
|
10898
11105
|
const getSaveStatusText = () => {
|
|
10899
11106
|
if (saveStatus === "saving") return "Saving...";
|
|
10900
11107
|
if (saveStatus === "saved") return "Saved";
|
|
@@ -10941,101 +11148,268 @@ function ActionBar({
|
|
|
10941
11148
|
if (!dateStr) return "Never";
|
|
10942
11149
|
return new Date(dateStr).toLocaleString();
|
|
10943
11150
|
};
|
|
10944
|
-
return /* @__PURE__ */ jsxs(
|
|
10945
|
-
/* @__PURE__ */ jsxs("div", { className: "flex
|
|
10946
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-
|
|
11151
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
11152
|
+
/* @__PURE__ */ jsxs("div", { className: "md:hidden flex flex-col gap-3 py-3 px-4 bg-[var(--kyro-bg)] border-t border-[var(--kyro-border)]", children: [
|
|
11153
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
11154
|
+
onBack && /* @__PURE__ */ jsx(
|
|
11155
|
+
"button",
|
|
11156
|
+
{
|
|
11157
|
+
type: "button",
|
|
11158
|
+
onClick: onBack,
|
|
11159
|
+
className: "p-2 rounded-lg hover:bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] transition-all",
|
|
11160
|
+
children: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: /* @__PURE__ */ jsx("path", { d: "M19 12H5M12 19l-7-7 7-7" }) })
|
|
11161
|
+
}
|
|
11162
|
+
),
|
|
11163
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 ml-auto", children: [
|
|
11164
|
+
onPreview && /* @__PURE__ */ jsx(
|
|
11165
|
+
"button",
|
|
11166
|
+
{
|
|
11167
|
+
type: "button",
|
|
11168
|
+
onClick: onPreview,
|
|
11169
|
+
className: "p-2 rounded-lg hover:bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] transition-all",
|
|
11170
|
+
title: "Preview",
|
|
11171
|
+
children: /* @__PURE__ */ jsx(Eye, { className: "w-4 h-4" })
|
|
11172
|
+
}
|
|
11173
|
+
),
|
|
11174
|
+
onViewHistory && /* @__PURE__ */ jsx(
|
|
11175
|
+
"button",
|
|
11176
|
+
{
|
|
11177
|
+
type: "button",
|
|
11178
|
+
onClick: onViewHistory,
|
|
11179
|
+
className: "p-2 rounded-lg hover:bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] transition-all",
|
|
11180
|
+
title: "View History",
|
|
11181
|
+
children: /* @__PURE__ */ jsx(Clock, { className: "w-4 h-4" })
|
|
11182
|
+
}
|
|
11183
|
+
),
|
|
11184
|
+
onDuplicate && /* @__PURE__ */ jsx(
|
|
11185
|
+
"button",
|
|
11186
|
+
{
|
|
11187
|
+
type: "button",
|
|
11188
|
+
onClick: onDuplicate,
|
|
11189
|
+
className: "p-2 rounded-lg hover:bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] transition-all",
|
|
11190
|
+
title: "Duplicate",
|
|
11191
|
+
children: /* @__PURE__ */ jsx(Copy, { className: "w-4 h-4" })
|
|
11192
|
+
}
|
|
11193
|
+
),
|
|
11194
|
+
onDelete && /* @__PURE__ */ jsx(
|
|
11195
|
+
"button",
|
|
11196
|
+
{
|
|
11197
|
+
type: "button",
|
|
11198
|
+
onClick: onDelete,
|
|
11199
|
+
className: "p-2 rounded-lg hover:bg-[var(--kyro-danger-bg)] text-[var(--kyro-error)] transition-all",
|
|
11200
|
+
title: "Delete",
|
|
11201
|
+
children: /* @__PURE__ */ jsx(Trash2, { className: "w-4 h-4" })
|
|
11202
|
+
}
|
|
11203
|
+
),
|
|
11204
|
+
onToggleSidebar && /* @__PURE__ */ jsx(
|
|
11205
|
+
"button",
|
|
11206
|
+
{
|
|
11207
|
+
type: "button",
|
|
11208
|
+
onClick: onToggleSidebar,
|
|
11209
|
+
className: "p-2 rounded-lg hover:bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] transition-all",
|
|
11210
|
+
title: "Toggle Sidebar",
|
|
11211
|
+
children: /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [
|
|
11212
|
+
/* @__PURE__ */ jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }),
|
|
11213
|
+
/* @__PURE__ */ jsx("line", { x1: "9", y1: "3", x2: "9", y2: "21" })
|
|
11214
|
+
] })
|
|
11215
|
+
}
|
|
11216
|
+
)
|
|
11217
|
+
] })
|
|
11218
|
+
] }),
|
|
11219
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1 bg-[var(--kyro-bg-secondary)] p-0.5 rounded-lg border border-[var(--kyro-border)] self-start", children: ["edit", "version", "api"].map((v) => /* @__PURE__ */ jsx(
|
|
11220
|
+
"button",
|
|
11221
|
+
{
|
|
11222
|
+
type: "button",
|
|
11223
|
+
onClick: () => setView(v),
|
|
11224
|
+
className: `px-4 py-1.5 text-xs font-bold rounded-md transition-all ${view === v ? "bg-[var(--kyro-surface)] shadow-sm border border-[var(--kyro-border)] text-[var(--kyro-text-primary)]" : "text-[var(--kyro-text-secondary)] opacity-50 hover:opacity-100"}`,
|
|
11225
|
+
children: v === "edit" ? "Edit" : v === "version" ? "Version" : "API"
|
|
11226
|
+
},
|
|
11227
|
+
v
|
|
11228
|
+
)) }),
|
|
11229
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [
|
|
10947
11230
|
getStatusBadge(),
|
|
10948
11231
|
getSaveStatusText() && /* @__PURE__ */ jsxs(
|
|
10949
11232
|
"span",
|
|
10950
11233
|
{
|
|
10951
|
-
className: `text-
|
|
11234
|
+
className: `text-xs ${saveStatus === "error" ? "text-[var(--kyro-error)]" : "text-[var(--kyro-text-muted)]"}`,
|
|
10952
11235
|
children: [
|
|
10953
11236
|
saveStatus === "saving" ? /* @__PURE__ */ jsx(Spinner, { size: "sm", className: "inline mr-1" }) : null,
|
|
10954
11237
|
getSaveStatusText()
|
|
10955
11238
|
]
|
|
10956
11239
|
}
|
|
10957
|
-
)
|
|
11240
|
+
),
|
|
11241
|
+
/* @__PURE__ */ jsxs("span", { className: "text-[10px] text-[var(--kyro-text-muted)] ml-auto", children: [
|
|
11242
|
+
updatedAt && `Updated ${formatDate2(updatedAt)}`,
|
|
11243
|
+
publishedAt && status === "published" && ` \xB7 Published ${formatDate2(publishedAt)}`
|
|
11244
|
+
] })
|
|
10958
11245
|
] }),
|
|
10959
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
10960
|
-
|
|
10961
|
-
"
|
|
10962
|
-
|
|
11246
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
11247
|
+
status === "draft" && onPublish && /* @__PURE__ */ jsxs(
|
|
11248
|
+
"button",
|
|
11249
|
+
{
|
|
11250
|
+
type: "button",
|
|
11251
|
+
onClick: onPublish,
|
|
11252
|
+
disabled: saveStatus === "saving",
|
|
11253
|
+
className: "kyro-btn kyro-btn-primary kyro-btn-md flex items-center gap-2 flex-1 justify-center",
|
|
11254
|
+
children: [
|
|
11255
|
+
/* @__PURE__ */ jsx(Send, { className: "w-4 h-4" }),
|
|
11256
|
+
"Publish"
|
|
11257
|
+
]
|
|
11258
|
+
}
|
|
11259
|
+
),
|
|
11260
|
+
status === "published" && onUnpublish && /* @__PURE__ */ jsxs(
|
|
11261
|
+
"button",
|
|
11262
|
+
{
|
|
11263
|
+
type: "button",
|
|
11264
|
+
onClick: onUnpublish,
|
|
11265
|
+
disabled: saveStatus === "saving",
|
|
11266
|
+
className: "kyro-btn kyro-btn-secondary kyro-btn-md flex items-center gap-2 flex-1 justify-center",
|
|
11267
|
+
children: [
|
|
11268
|
+
/* @__PURE__ */ jsx(Undo, { className: "w-4 h-4" }),
|
|
11269
|
+
"Unpublish"
|
|
11270
|
+
]
|
|
11271
|
+
}
|
|
11272
|
+
),
|
|
11273
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxs(
|
|
11274
|
+
SplitButton,
|
|
11275
|
+
{
|
|
11276
|
+
status,
|
|
11277
|
+
saveStatus,
|
|
11278
|
+
hasChanges,
|
|
11279
|
+
onPublish: onSave,
|
|
11280
|
+
children: [
|
|
11281
|
+
onDuplicate && /* @__PURE__ */ jsx(
|
|
11282
|
+
DropdownItem,
|
|
11283
|
+
{
|
|
11284
|
+
icon: /* @__PURE__ */ jsx(Copy, { className: "w-4 h-4" }),
|
|
11285
|
+
children: "Duplicate"
|
|
11286
|
+
}
|
|
11287
|
+
),
|
|
11288
|
+
onViewHistory && /* @__PURE__ */ jsx(
|
|
11289
|
+
DropdownItem,
|
|
11290
|
+
{
|
|
11291
|
+
icon: /* @__PURE__ */ jsx(Clock, { className: "w-4 h-4" }),
|
|
11292
|
+
children: "View History"
|
|
11293
|
+
}
|
|
11294
|
+
),
|
|
11295
|
+
onPreview && /* @__PURE__ */ jsx(
|
|
11296
|
+
DropdownItem,
|
|
11297
|
+
{
|
|
11298
|
+
icon: /* @__PURE__ */ jsx(Eye, { className: "w-4 h-4" }),
|
|
11299
|
+
children: "Preview"
|
|
11300
|
+
}
|
|
11301
|
+
),
|
|
11302
|
+
(onDuplicate || onViewHistory || onPreview) && /* @__PURE__ */ jsx(DropdownSeparator, {}),
|
|
11303
|
+
onDelete && /* @__PURE__ */ jsx(
|
|
11304
|
+
DropdownItem,
|
|
11305
|
+
{
|
|
11306
|
+
onClick: onDelete,
|
|
11307
|
+
danger: true,
|
|
11308
|
+
icon: /* @__PURE__ */ jsx(Trash2, { className: "w-4 h-4" }),
|
|
11309
|
+
children: "Delete"
|
|
11310
|
+
}
|
|
11311
|
+
)
|
|
11312
|
+
]
|
|
11313
|
+
}
|
|
11314
|
+
) })
|
|
11315
|
+
] })
|
|
11316
|
+
] }),
|
|
11317
|
+
/* @__PURE__ */ jsxs("div", { className: "hidden md:flex flex-row items-center justify-between gap-4 py-3 px-6 bg-transparent border-0 static z-40", children: [
|
|
11318
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-row items-center gap-4", children: [
|
|
11319
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
11320
|
+
getStatusBadge(),
|
|
11321
|
+
getSaveStatusText() && /* @__PURE__ */ jsxs(
|
|
11322
|
+
"span",
|
|
11323
|
+
{
|
|
11324
|
+
className: `text-sm ${saveStatus === "error" ? "text-[var(--kyro-error)]" : "text-[var(--kyro-text-muted)]"}`,
|
|
11325
|
+
children: [
|
|
11326
|
+
saveStatus === "saving" ? /* @__PURE__ */ jsx(Spinner, { size: "sm", className: "inline mr-1" }) : null,
|
|
11327
|
+
getSaveStatusText()
|
|
11328
|
+
]
|
|
11329
|
+
}
|
|
11330
|
+
)
|
|
10963
11331
|
] }),
|
|
10964
|
-
|
|
10965
|
-
"
|
|
10966
|
-
|
|
11332
|
+
/* @__PURE__ */ jsxs("div", { className: "text-xs space-y-0.5", children: [
|
|
11333
|
+
updatedAt && /* @__PURE__ */ jsxs("div", { className: "text-[var(--kyro-text-muted)]", children: [
|
|
11334
|
+
"Updated: ",
|
|
11335
|
+
formatDate2(updatedAt)
|
|
11336
|
+
] }),
|
|
11337
|
+
publishedAt && status === "published" && /* @__PURE__ */ jsxs("div", { className: "text-[var(--kyro-primary)] font-medium", children: [
|
|
11338
|
+
"Published: ",
|
|
11339
|
+
formatDate2(publishedAt)
|
|
11340
|
+
] })
|
|
10967
11341
|
] })
|
|
11342
|
+
] }),
|
|
11343
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [
|
|
11344
|
+
status === "draft" && onPublish && /* @__PURE__ */ jsxs(
|
|
11345
|
+
"button",
|
|
11346
|
+
{
|
|
11347
|
+
type: "button",
|
|
11348
|
+
onClick: onPublish,
|
|
11349
|
+
disabled: saveStatus === "saving",
|
|
11350
|
+
className: "kyro-btn kyro-btn-primary kyro-btn-md flex items-center gap-2",
|
|
11351
|
+
children: [
|
|
11352
|
+
/* @__PURE__ */ jsx(Send, { className: "w-4 h-4" }),
|
|
11353
|
+
"Publish"
|
|
11354
|
+
]
|
|
11355
|
+
}
|
|
11356
|
+
),
|
|
11357
|
+
status === "published" && onUnpublish && /* @__PURE__ */ jsxs(
|
|
11358
|
+
"button",
|
|
11359
|
+
{
|
|
11360
|
+
type: "button",
|
|
11361
|
+
onClick: onUnpublish,
|
|
11362
|
+
disabled: saveStatus === "saving",
|
|
11363
|
+
className: "kyro-btn kyro-btn-secondary kyro-btn-md flex items-center gap-2",
|
|
11364
|
+
children: [
|
|
11365
|
+
/* @__PURE__ */ jsx(Undo, { className: "w-4 h-4" }),
|
|
11366
|
+
"Unpublish"
|
|
11367
|
+
]
|
|
11368
|
+
}
|
|
11369
|
+
),
|
|
11370
|
+
/* @__PURE__ */ jsxs(
|
|
11371
|
+
SplitButton,
|
|
11372
|
+
{
|
|
11373
|
+
status,
|
|
11374
|
+
saveStatus,
|
|
11375
|
+
hasChanges,
|
|
11376
|
+
onPublish: onSave,
|
|
11377
|
+
children: [
|
|
11378
|
+
onDuplicate && /* @__PURE__ */ jsx(
|
|
11379
|
+
DropdownItem,
|
|
11380
|
+
{
|
|
11381
|
+
icon: /* @__PURE__ */ jsx(Copy, { className: "w-4 h-4" }),
|
|
11382
|
+
children: "Duplicate"
|
|
11383
|
+
}
|
|
11384
|
+
),
|
|
11385
|
+
onViewHistory && /* @__PURE__ */ jsx(
|
|
11386
|
+
DropdownItem,
|
|
11387
|
+
{
|
|
11388
|
+
icon: /* @__PURE__ */ jsx(Clock, { className: "w-4 h-4" }),
|
|
11389
|
+
children: "View History"
|
|
11390
|
+
}
|
|
11391
|
+
),
|
|
11392
|
+
onPreview && /* @__PURE__ */ jsx(
|
|
11393
|
+
DropdownItem,
|
|
11394
|
+
{
|
|
11395
|
+
icon: /* @__PURE__ */ jsx(Eye, { className: "w-4 h-4" }),
|
|
11396
|
+
children: "Preview"
|
|
11397
|
+
}
|
|
11398
|
+
),
|
|
11399
|
+
(onDuplicate || onViewHistory || onPreview) && /* @__PURE__ */ jsx(DropdownSeparator, {}),
|
|
11400
|
+
onDelete && /* @__PURE__ */ jsx(
|
|
11401
|
+
DropdownItem,
|
|
11402
|
+
{
|
|
11403
|
+
onClick: onDelete,
|
|
11404
|
+
danger: true,
|
|
11405
|
+
icon: /* @__PURE__ */ jsx(Trash2, { className: "w-4 h-4" }),
|
|
11406
|
+
children: "Delete"
|
|
11407
|
+
}
|
|
11408
|
+
)
|
|
11409
|
+
]
|
|
11410
|
+
}
|
|
11411
|
+
)
|
|
10968
11412
|
] })
|
|
10969
|
-
] }),
|
|
10970
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
10971
|
-
status === "draft" && onPublish && /* @__PURE__ */ jsxs(
|
|
10972
|
-
"button",
|
|
10973
|
-
{
|
|
10974
|
-
type: "button",
|
|
10975
|
-
onClick: onPublish,
|
|
10976
|
-
disabled: saveStatus === "saving",
|
|
10977
|
-
className: "kyro-btn kyro-btn-primary kyro-btn-md flex items-center gap-2",
|
|
10978
|
-
children: [
|
|
10979
|
-
/* @__PURE__ */ jsx(Send, { className: "w-4 h-4" }),
|
|
10980
|
-
"Publish"
|
|
10981
|
-
]
|
|
10982
|
-
}
|
|
10983
|
-
),
|
|
10984
|
-
status === "published" && onUnpublish && /* @__PURE__ */ jsxs(
|
|
10985
|
-
"button",
|
|
10986
|
-
{
|
|
10987
|
-
type: "button",
|
|
10988
|
-
onClick: onUnpublish,
|
|
10989
|
-
disabled: saveStatus === "saving",
|
|
10990
|
-
className: "kyro-btn kyro-btn-secondary kyro-btn-md flex items-center gap-2",
|
|
10991
|
-
children: [
|
|
10992
|
-
/* @__PURE__ */ jsx(Undo, { className: "w-4 h-4" }),
|
|
10993
|
-
"Unpublish"
|
|
10994
|
-
]
|
|
10995
|
-
}
|
|
10996
|
-
),
|
|
10997
|
-
/* @__PURE__ */ jsxs(
|
|
10998
|
-
SplitButton,
|
|
10999
|
-
{
|
|
11000
|
-
status,
|
|
11001
|
-
saveStatus,
|
|
11002
|
-
hasChanges,
|
|
11003
|
-
onPublish: onSave,
|
|
11004
|
-
children: [
|
|
11005
|
-
onDuplicate && /* @__PURE__ */ jsx(
|
|
11006
|
-
DropdownItem,
|
|
11007
|
-
{
|
|
11008
|
-
icon: /* @__PURE__ */ jsx(Copy, { className: "w-4 h-4" }),
|
|
11009
|
-
children: "Duplicate"
|
|
11010
|
-
}
|
|
11011
|
-
),
|
|
11012
|
-
onViewHistory && /* @__PURE__ */ jsx(
|
|
11013
|
-
DropdownItem,
|
|
11014
|
-
{
|
|
11015
|
-
icon: /* @__PURE__ */ jsx(Clock, { className: "w-4 h-4" }),
|
|
11016
|
-
children: "View History"
|
|
11017
|
-
}
|
|
11018
|
-
),
|
|
11019
|
-
onPreview && /* @__PURE__ */ jsx(
|
|
11020
|
-
DropdownItem,
|
|
11021
|
-
{
|
|
11022
|
-
icon: /* @__PURE__ */ jsx(Eye, { className: "w-4 h-4" }),
|
|
11023
|
-
children: "Preview"
|
|
11024
|
-
}
|
|
11025
|
-
),
|
|
11026
|
-
(onDuplicate || onViewHistory || onPreview) && /* @__PURE__ */ jsx(DropdownSeparator, {}),
|
|
11027
|
-
onDelete && /* @__PURE__ */ jsx(
|
|
11028
|
-
DropdownItem,
|
|
11029
|
-
{
|
|
11030
|
-
onClick: onDelete,
|
|
11031
|
-
danger: true,
|
|
11032
|
-
icon: /* @__PURE__ */ jsx(Trash2, { className: "w-4 h-4" }),
|
|
11033
|
-
children: "Delete"
|
|
11034
|
-
}
|
|
11035
|
-
)
|
|
11036
|
-
]
|
|
11037
|
-
}
|
|
11038
|
-
)
|
|
11039
11413
|
] })
|
|
11040
11414
|
] });
|
|
11041
11415
|
}
|
|
@@ -11259,7 +11633,27 @@ function DetailView({
|
|
|
11259
11633
|
]
|
|
11260
11634
|
}
|
|
11261
11635
|
),
|
|
11262
|
-
|
|
11636
|
+
isSingleLayout ? /* @__PURE__ */ jsx("div", { className: "md:hidden", children: /* @__PURE__ */ jsx(
|
|
11637
|
+
ActionBar,
|
|
11638
|
+
{
|
|
11639
|
+
status,
|
|
11640
|
+
saveStatus,
|
|
11641
|
+
hasChanges,
|
|
11642
|
+
onSave: () => handleSave(false),
|
|
11643
|
+
onPublish: handlePublish,
|
|
11644
|
+
onUnpublish: status === "published" ? handleUnpublish : void 0,
|
|
11645
|
+
onDuplicate: handleDuplicate,
|
|
11646
|
+
onViewHistory: () => {
|
|
11647
|
+
window.dispatchEvent(new CustomEvent("kyro:show-version-history"));
|
|
11648
|
+
},
|
|
11649
|
+
onPreview: () => window.open(`/preview/${slug}/${documentId}`, "_blank"),
|
|
11650
|
+
onDelete: handleDeleteTrigger,
|
|
11651
|
+
onBack,
|
|
11652
|
+
onToggleSidebar: () => window.dispatchEvent(new CustomEvent("toggle-sidebar")),
|
|
11653
|
+
publishedAt,
|
|
11654
|
+
updatedAt
|
|
11655
|
+
}
|
|
11656
|
+
) }) : /* @__PURE__ */ jsx(
|
|
11263
11657
|
ActionBar,
|
|
11264
11658
|
{
|
|
11265
11659
|
status,
|
|
@@ -11274,6 +11668,8 @@ function DetailView({
|
|
|
11274
11668
|
},
|
|
11275
11669
|
onPreview: () => window.open(`/preview/${slug}/${documentId}`, "_blank"),
|
|
11276
11670
|
onDelete: handleDeleteTrigger,
|
|
11671
|
+
onBack,
|
|
11672
|
+
onToggleSidebar: () => window.dispatchEvent(new CustomEvent("toggle-sidebar")),
|
|
11277
11673
|
publishedAt,
|
|
11278
11674
|
updatedAt
|
|
11279
11675
|
}
|
|
@@ -11281,9 +11677,9 @@ function DetailView({
|
|
|
11281
11677
|
/* @__PURE__ */ jsxs(
|
|
11282
11678
|
"div",
|
|
11283
11679
|
{
|
|
11284
|
-
className: isSingleLayout ? "w-full pb-32 pt-8" : "w-full mx-auto grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-8 pb-32",
|
|
11680
|
+
className: isSingleLayout ? "w-full pb-32 pt-4 md:pt-8" : "w-full mx-auto grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-4 md:gap-8 pt-4 md:pt-0 pb-32",
|
|
11285
11681
|
children: [
|
|
11286
|
-
/* @__PURE__ */ jsx("div", { className: "space-y-8 min-w-0", children: /* @__PURE__ */ jsxs("div", { className: "surface-tile p-8", children: [
|
|
11682
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-4 md:space-y-8 min-w-0", children: /* @__PURE__ */ jsxs("div", { className: "surface-tile p-4 md:p-8", children: [
|
|
11287
11683
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-8 px-1", children: [
|
|
11288
11684
|
/* @__PURE__ */ jsx("h2", { className: "text-[10px] font-bold tracking-[0.2em] opacity-40", children: "Core Configuration" }),
|
|
11289
11685
|
/* @__PURE__ */ jsx("div", { className: "h-px flex-1 bg-[var(--kyro-border)] ml-6 opacity-30" })
|
|
@@ -11325,10 +11721,10 @@ function DetailView({
|
|
|
11325
11721
|
)
|
|
11326
11722
|
] })
|
|
11327
11723
|
] }) }),
|
|
11328
|
-
!isSingleLayout && /* @__PURE__ */ jsxs("div", { className: "space-y-6 animate-in fade-in slide-in-from-right-4 duration-500", children: [
|
|
11329
|
-
/* @__PURE__ */ jsxs("div", { className: "surface-tile p-8", children: [
|
|
11330
|
-
/* @__PURE__ */ jsx("h3", { className: "text-[10px] font-bold tracking-[0.2em] opacity-40 mb-6", children: "Metadata" }),
|
|
11331
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
11724
|
+
!isSingleLayout && /* @__PURE__ */ jsxs("div", { className: "space-y-4 md:space-y-6 animate-in fade-in slide-in-from-right-4 duration-500", children: [
|
|
11725
|
+
/* @__PURE__ */ jsxs("div", { className: "surface-tile p-4 md:p-8", children: [
|
|
11726
|
+
/* @__PURE__ */ jsx("h3", { className: "text-[10px] font-bold tracking-[0.2em] opacity-40 mb-4 md:mb-6", children: "Metadata" }),
|
|
11727
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-4 md:space-y-6", children: [
|
|
11332
11728
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
11333
11729
|
/* @__PURE__ */ jsx("span", { className: "text-[10px] font-bold tracking-widest opacity-40", children: "Dynamic Status" }),
|
|
11334
11730
|
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
|
|
@@ -11362,9 +11758,9 @@ function DetailView({
|
|
|
11362
11758
|
] })
|
|
11363
11759
|
] })
|
|
11364
11760
|
] }),
|
|
11365
|
-
/* @__PURE__ */ jsxs("div", { className: "surface-tile p-8 bg-[var(--kyro-bg-secondary)]", children: [
|
|
11366
|
-
/* @__PURE__ */ jsx("h3", { className: "text-[10px] font-bold tracking-[0.2em] opacity-40 mb-4", children: "Quick Links" }),
|
|
11367
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
11761
|
+
/* @__PURE__ */ jsxs("div", { className: "surface-tile p-4 md:p-8 bg-[var(--kyro-bg-secondary)]", children: [
|
|
11762
|
+
/* @__PURE__ */ jsx("h3", { className: "text-[10px] font-bold tracking-[0.2em] opacity-40 mb-3 md:mb-4", children: "Quick Links" }),
|
|
11763
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2 md:space-y-3", children: [
|
|
11368
11764
|
/* @__PURE__ */ jsx(
|
|
11369
11765
|
"button",
|
|
11370
11766
|
{
|
|
@@ -11451,8 +11847,8 @@ function CreateView({
|
|
|
11451
11847
|
] });
|
|
11452
11848
|
}
|
|
11453
11849
|
function Toast({ type, message, onClose }) {
|
|
11454
|
-
const [isPaused, setIsPaused] =
|
|
11455
|
-
const timerRef =
|
|
11850
|
+
const [isPaused, setIsPaused] = React.useState(false);
|
|
11851
|
+
const timerRef = React.useRef(null);
|
|
11456
11852
|
const startTimer = () => {
|
|
11457
11853
|
if (timerRef.current) clearTimeout(timerRef.current);
|
|
11458
11854
|
timerRef.current = setTimeout(onClose, 5e3);
|
|
@@ -11460,7 +11856,7 @@ function Toast({ type, message, onClose }) {
|
|
|
11460
11856
|
const clearTimer = () => {
|
|
11461
11857
|
if (timerRef.current) clearTimeout(timerRef.current);
|
|
11462
11858
|
};
|
|
11463
|
-
|
|
11859
|
+
React.useEffect(() => {
|
|
11464
11860
|
if (!isPaused) {
|
|
11465
11861
|
startTimer();
|
|
11466
11862
|
} else {
|
|
@@ -11506,14 +11902,19 @@ function useToast() {
|
|
|
11506
11902
|
const toasts = useToastStore((state) => state.toasts);
|
|
11507
11903
|
return { toasts, addToast, removeToast };
|
|
11508
11904
|
}
|
|
11905
|
+
function Toaster() {
|
|
11906
|
+
const toasts = useToastStore((state) => state.toasts);
|
|
11907
|
+
const removeToast = useToastStore((state) => state.removeToast);
|
|
11908
|
+
return /* @__PURE__ */ jsx("div", { className: "kyro-toasts-container", style: { position: "fixed", bottom: "24px", right: "24px", display: "flex", flexDirection: "column", gap: "12px", zIndex: 9999, pointerEvents: "none" }, children: toasts.map((t) => /* @__PURE__ */ jsx("div", { style: { pointerEvents: "auto" }, children: /* @__PURE__ */ jsx(Toast, { type: t.type, message: t.message, onClose: () => removeToast(t.id) }) }, t.id)) });
|
|
11909
|
+
}
|
|
11509
11910
|
function LoginPage({ onAuth, theme = "light" }) {
|
|
11510
11911
|
const [mode, setMode] = useState("login");
|
|
11511
11912
|
const [email, setEmail] = useState("");
|
|
11512
11913
|
const [password, setPassword] = useState("");
|
|
11513
11914
|
const [confirmPassword, setConfirmPassword] = useState("");
|
|
11514
11915
|
const [loading, setLoading] = useState(false);
|
|
11515
|
-
const [toasts, setToasts] = useState([]);
|
|
11516
11916
|
const [isFirstUser, setIsFirstUser] = useState(false);
|
|
11917
|
+
const addToast = useToastStore((state) => state.addToast);
|
|
11517
11918
|
useEffect(() => {
|
|
11518
11919
|
checkIfFirstUser();
|
|
11519
11920
|
}, []);
|
|
@@ -11525,13 +11926,6 @@ function LoginPage({ onAuth, theme = "light" }) {
|
|
|
11525
11926
|
setMode("register");
|
|
11526
11927
|
}
|
|
11527
11928
|
};
|
|
11528
|
-
const addToast = (type, message) => {
|
|
11529
|
-
const id = Math.random().toString(36).substring(7);
|
|
11530
|
-
setToasts((prev) => [...prev, { id, type, message }]);
|
|
11531
|
-
setTimeout(() => {
|
|
11532
|
-
setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
11533
|
-
}, 5e3);
|
|
11534
|
-
};
|
|
11535
11929
|
const handleSubmit = async (e) => {
|
|
11536
11930
|
e.preventDefault();
|
|
11537
11931
|
setLoading(true);
|
|
@@ -11557,7 +11951,7 @@ function LoginPage({ onAuth, theme = "light" }) {
|
|
|
11557
11951
|
setLoading(false);
|
|
11558
11952
|
}
|
|
11559
11953
|
};
|
|
11560
|
-
return /* @__PURE__ */ jsx(ThemeProvider, { defaultMode: theme, children: /* @__PURE__ */
|
|
11954
|
+
return /* @__PURE__ */ jsx(ThemeProvider, { defaultMode: theme, children: /* @__PURE__ */ jsxs("div", { className: "kyro-login-page", children: [
|
|
11561
11955
|
/* @__PURE__ */ jsxs("div", { className: "kyro-login-container", children: [
|
|
11562
11956
|
/* @__PURE__ */ jsxs("div", { className: "kyro-login-header", children: [
|
|
11563
11957
|
/* @__PURE__ */ jsx("h1", { className: "kyro-login-title", children: isFirstUser ? "Create Admin Account" : mode === "login" ? "Sign In" : "Create Account" }),
|
|
@@ -11647,16 +12041,8 @@ function LoginPage({ onAuth, theme = "light" }) {
|
|
|
11647
12041
|
)
|
|
11648
12042
|
] }) }) })
|
|
11649
12043
|
] }),
|
|
11650
|
-
|
|
11651
|
-
|
|
11652
|
-
{
|
|
11653
|
-
type: toast2.type,
|
|
11654
|
-
message: toast2.message,
|
|
11655
|
-
onClose: () => setToasts((prev) => prev.filter((t) => t.id !== toast2.id))
|
|
11656
|
-
},
|
|
11657
|
-
toast2.id
|
|
11658
|
-
))
|
|
11659
|
-
] }) }) });
|
|
12044
|
+
/* @__PURE__ */ jsx(Toaster, {})
|
|
12045
|
+
] }) });
|
|
11660
12046
|
}
|
|
11661
12047
|
function Dashboard({ collections: collections2, onNavigate, user }) {
|
|
11662
12048
|
const { permissions } = useAuthStore();
|
|
@@ -12078,7 +12464,7 @@ function UserManagement() {
|
|
|
12078
12464
|
const filteredUsers = users.filter(
|
|
12079
12465
|
(u) => u.email.toLowerCase().includes(searchQuery.toLowerCase()) || u.name?.toLowerCase().includes(searchQuery.toLowerCase())
|
|
12080
12466
|
);
|
|
12081
|
-
return /* @__PURE__ */ jsxs("div", { className: "w-full space-y-6 animate-in fade-in slide-in-from-bottom-4 duration-700 px-8 pb-12", children: [
|
|
12467
|
+
return /* @__PURE__ */ jsxs("div", { className: "w-full space-y-6 animate-in fade-in slide-in-from-bottom-4 duration-700 px-4 md:px-8 pb-12", children: [
|
|
12082
12468
|
/* @__PURE__ */ jsx(
|
|
12083
12469
|
PageHeader,
|
|
12084
12470
|
{
|
|
@@ -12116,8 +12502,8 @@ function UserManagement() {
|
|
|
12116
12502
|
/* @__PURE__ */ jsx("button", { className: "px-4 py-1.5 text-[10px] font-bold tracking-widest opacity-40 hover:opacity-100 transition-all", children: "LOCKED" })
|
|
12117
12503
|
] })
|
|
12118
12504
|
] }),
|
|
12119
|
-
/* @__PURE__ */ jsx("div", { className: "surface-tile overflow-
|
|
12120
|
-
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "text-[var(--kyro-text-secondary)] font-bold text-[9px] tracking-[0.2em] uppercase border-b border-[var(--kyro-border)]", children: [
|
|
12505
|
+
/* @__PURE__ */ jsx("div", { className: "surface-tile overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-left", children: [
|
|
12506
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "text-[var(--kyro-text-secondary)] font-bold text-[9px] tracking-[0.2em] uppercase border-b border-[var(--kyro-border)] whitespace-nowrap", children: [
|
|
12121
12507
|
/* @__PURE__ */ jsx("th", { className: "px-6 py-4 w-64", children: "Member Identity" }),
|
|
12122
12508
|
/* @__PURE__ */ jsx("th", { className: "px-6 py-4", children: "Administrative Role" }),
|
|
12123
12509
|
/* @__PURE__ */ jsx("th", { className: "px-6 py-4", children: "Security Status" }),
|
|
@@ -12848,6 +13234,7 @@ function useResourceManager(options) {
|
|
|
12848
13234
|
await apiDelete(`${options.endpoint}/${id}`);
|
|
12849
13235
|
setItems((prev) => prev.filter((item) => item.id !== id));
|
|
12850
13236
|
options.onSuccess?.("delete", id);
|
|
13237
|
+
toast.success(`${resourceName} deleted`);
|
|
12851
13238
|
} catch (e) {
|
|
12852
13239
|
const message = e instanceof Error ? e.message : `Failed to delete ${resourceName}`;
|
|
12853
13240
|
toast.error(message);
|
|
@@ -13076,12 +13463,12 @@ function WebhookManager() {
|
|
|
13076
13463
|
] })
|
|
13077
13464
|
] })
|
|
13078
13465
|
] }),
|
|
13079
|
-
/* @__PURE__ */ jsxs("div", { className: "grid sm:grid-cols-3 gap-6 pt-2", children: [
|
|
13466
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-6 pt-2", children: [
|
|
13080
13467
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
13081
13468
|
/* @__PURE__ */ jsx("span", { className: "text-[9px] font-bold uppercase tracking-widest opacity-30", children: "Destination" }),
|
|
13082
13469
|
/* @__PURE__ */ jsx("div", { className: "font-mono text-xs opacity-60 truncate max-w-[200px]", title: webhook.url, children: webhook.url })
|
|
13083
13470
|
] }),
|
|
13084
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-1 border-l border-[var(--kyro-border)] pl-6", children: [
|
|
13471
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-1 sm:border-l border-t sm:border-t-0 border-[var(--kyro-border)] pt-4 sm:pt-0 sm:pl-6 mt-4 sm:mt-0", children: [
|
|
13085
13472
|
/* @__PURE__ */ jsx("span", { className: "text-[9px] font-bold uppercase tracking-widest opacity-30", children: "Events" }),
|
|
13086
13473
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1", children: [
|
|
13087
13474
|
webhook.events.slice(0, 2).map((event) => /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-[8px] font-bold px-1.5 opacity-60", children: event }, event)),
|
|
@@ -13092,7 +13479,7 @@ function WebhookManager() {
|
|
|
13092
13479
|
] })
|
|
13093
13480
|
] })
|
|
13094
13481
|
] }),
|
|
13095
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-1 border-l border-[var(--kyro-border)] pl-6", children: [
|
|
13482
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-1 sm:border-l border-t sm:border-t-0 border-[var(--kyro-border)] pt-4 sm:pt-0 sm:pl-6 mt-4 sm:mt-0", children: [
|
|
13096
13483
|
/* @__PURE__ */ jsx("span", { className: "text-[9px] font-bold uppercase tracking-widest opacity-30", children: "Activity" }),
|
|
13097
13484
|
/* @__PURE__ */ jsxs("div", { className: "text-[10px] font-bold opacity-60 flex items-center gap-1.5", children: [
|
|
13098
13485
|
/* @__PURE__ */ jsx(Clock, { className: "w-3 h-3" }),
|
|
@@ -13195,7 +13582,7 @@ function WebhookManager() {
|
|
|
13195
13582
|
] }),
|
|
13196
13583
|
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
13197
13584
|
/* @__PURE__ */ jsx("label", { className: "block text-xs font-bold mb-1.5 text-[var(--kyro-text-secondary)] uppercase tracking-wider", children: "Subscribed Events" }),
|
|
13198
|
-
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-4", children: eventOptions.map((opt) => /* @__PURE__ */ jsxs(
|
|
13585
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: eventOptions.map((opt) => /* @__PURE__ */ jsxs(
|
|
13199
13586
|
"button",
|
|
13200
13587
|
{
|
|
13201
13588
|
type: "button",
|
|
@@ -13711,8 +14098,6 @@ function Admin({ config, theme = "light", onThemeChange }) {
|
|
|
13711
14098
|
const [currentView, setCurrentView] = useState("list");
|
|
13712
14099
|
const [activeDocumentId, setActiveDocumentId] = useState(null);
|
|
13713
14100
|
const [isCommandPaletteOpen, setIsCommandPaletteOpen] = useState(false);
|
|
13714
|
-
const toasts = useToastStore((state) => state.toasts);
|
|
13715
|
-
const removeToast = useToastStore((state) => state.removeToast);
|
|
13716
14101
|
useEffect(() => {
|
|
13717
14102
|
const checkAuth = async () => {
|
|
13718
14103
|
try {
|
|
@@ -13748,7 +14133,11 @@ function Admin({ config, theme = "light", onThemeChange }) {
|
|
|
13748
14133
|
}
|
|
13749
14134
|
};
|
|
13750
14135
|
window.addEventListener("keydown", handleKeyDown);
|
|
13751
|
-
|
|
14136
|
+
window.openCommandPalette = () => setIsCommandPaletteOpen(true);
|
|
14137
|
+
return () => {
|
|
14138
|
+
window.removeEventListener("keydown", handleKeyDown);
|
|
14139
|
+
delete window.openCommandPalette;
|
|
14140
|
+
};
|
|
13752
14141
|
}, []);
|
|
13753
14142
|
if (!authenticated) {
|
|
13754
14143
|
return /* @__PURE__ */ jsx(
|
|
@@ -13834,15 +14223,7 @@ function Admin({ config, theme = "light", onThemeChange }) {
|
|
|
13834
14223
|
renderContent()
|
|
13835
14224
|
] }) }) }),
|
|
13836
14225
|
/* @__PURE__ */ jsx(GlobalModal, {}),
|
|
13837
|
-
/* @__PURE__ */ jsx(
|
|
13838
|
-
Toast,
|
|
13839
|
-
{
|
|
13840
|
-
type: t.type,
|
|
13841
|
-
message: t.message,
|
|
13842
|
-
onClose: () => removeToast(t.id)
|
|
13843
|
-
},
|
|
13844
|
-
t.id
|
|
13845
|
-
)) })
|
|
14226
|
+
/* @__PURE__ */ jsx(Toaster, {})
|
|
13846
14227
|
] }) });
|
|
13847
14228
|
}
|
|
13848
14229
|
function BulkActionsBar({
|