@actuate-media/cms-admin 0.49.0 → 0.49.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/AdminRoot.d.ts.map +1 -1
  3. package/dist/AdminRoot.js +10 -11
  4. package/dist/AdminRoot.js.map +1 -1
  5. package/dist/__tests__/components/modal.render.test.d.ts +2 -0
  6. package/dist/__tests__/components/modal.render.test.d.ts.map +1 -0
  7. package/dist/__tests__/components/modal.render.test.js +37 -0
  8. package/dist/__tests__/components/modal.render.test.js.map +1 -0
  9. package/dist/actuate-admin.css +1 -1
  10. package/dist/components/FolderTree.js +19 -19
  11. package/dist/components/FolderTree.js.map +1 -1
  12. package/dist/components/MediaPickerModal.d.ts +1 -1
  13. package/dist/components/MediaPickerModal.d.ts.map +1 -1
  14. package/dist/components/MediaPickerModal.js +12 -11
  15. package/dist/components/MediaPickerModal.js.map +1 -1
  16. package/dist/components/SchedulePublishDialog.d.ts +1 -1
  17. package/dist/components/SchedulePublishDialog.d.ts.map +1 -1
  18. package/dist/components/SchedulePublishDialog.js +6 -4
  19. package/dist/components/SchedulePublishDialog.js.map +1 -1
  20. package/dist/components/SharePreviewLinkDialog.d.ts +1 -1
  21. package/dist/components/SharePreviewLinkDialog.d.ts.map +1 -1
  22. package/dist/components/SharePreviewLinkDialog.js +10 -9
  23. package/dist/components/SharePreviewLinkDialog.js.map +1 -1
  24. package/dist/components/VersionHistory.d.ts +1 -1
  25. package/dist/components/VersionHistory.d.ts.map +1 -1
  26. package/dist/components/VersionHistory.js +14 -14
  27. package/dist/components/VersionHistory.js.map +1 -1
  28. package/dist/components/ui/Modal.d.ts +17 -1
  29. package/dist/components/ui/Modal.d.ts.map +1 -1
  30. package/dist/components/ui/Modal.js +16 -15
  31. package/dist/components/ui/Modal.js.map +1 -1
  32. package/dist/fields/BlockBuilderField.d.ts.map +1 -1
  33. package/dist/fields/BlockBuilderField.js +6 -4
  34. package/dist/fields/BlockBuilderField.js.map +1 -1
  35. package/dist/views/MediaBrowser.d.ts.map +1 -1
  36. package/dist/views/MediaBrowser.js +16 -16
  37. package/dist/views/MediaBrowser.js.map +1 -1
  38. package/dist/views/Pages/PagesListView.d.ts.map +1 -1
  39. package/dist/views/Pages/PagesListView.js +3 -3
  40. package/dist/views/Pages/PagesListView.js.map +1 -1
  41. package/dist/views/Posts/PostsListView.d.ts.map +1 -1
  42. package/dist/views/Posts/PostsListView.js +3 -3
  43. package/dist/views/Posts/PostsListView.js.map +1 -1
  44. package/dist/views/Redirects.d.ts.map +1 -1
  45. package/dist/views/Redirects.js +7 -7
  46. package/dist/views/Redirects.js.map +1 -1
  47. package/dist/views/ScriptTagEditor.js +4 -4
  48. package/dist/views/ScriptTagEditor.js.map +1 -1
  49. package/dist/views/ScriptTags.d.ts.map +1 -1
  50. package/dist/views/ScriptTags.js +5 -5
  51. package/dist/views/ScriptTags.js.map +1 -1
  52. package/dist/views/page-builder/AIGenerateDialog.d.ts +1 -1
  53. package/dist/views/page-builder/AIGenerateDialog.d.ts.map +1 -1
  54. package/dist/views/page-builder/AIGenerateDialog.js +23 -23
  55. package/dist/views/page-builder/AIGenerateDialog.js.map +1 -1
  56. package/package.json +1 -1
  57. package/src/AdminRoot.tsx +35 -30
  58. package/src/__tests__/components/modal.render.test.tsx +57 -0
  59. package/src/components/FolderTree.tsx +32 -32
  60. package/src/components/MediaPickerModal.tsx +143 -119
  61. package/src/components/SchedulePublishDialog.tsx +118 -93
  62. package/src/components/SharePreviewLinkDialog.tsx +115 -93
  63. package/src/components/VersionHistory.tsx +98 -82
  64. package/src/components/ui/Modal.tsx +48 -39
  65. package/src/fields/BlockBuilderField.tsx +26 -19
  66. package/src/views/MediaBrowser.tsx +128 -120
  67. package/src/views/Pages/PagesListView.tsx +123 -115
  68. package/src/views/Posts/PostsListView.tsx +114 -110
  69. package/src/views/Redirects.tsx +48 -44
  70. package/src/views/ScriptTagEditor.tsx +40 -40
  71. package/src/views/ScriptTags.tsx +34 -30
  72. package/src/views/page-builder/AIGenerateDialog.tsx +347 -335
@@ -1,9 +1,11 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState, useCallback } from 'react';
4
+ import * as Dialog from '@radix-ui/react-dialog';
4
5
  import { Sparkles, X, Loader2, Check, ChevronDown, ChevronUp, AlertTriangle, Wand2, FileText, Search, Accessibility, ArrowRight, } from 'lucide-react';
5
6
  import { toast } from 'sonner';
6
7
  import { cmsApi } from '../../lib/api.js';
8
+ import { adminPortalContainer } from '../../lib/portal-container.js';
7
9
  const ALL_STEPS = [
8
10
  {
9
11
  key: 'structure',
@@ -145,29 +147,27 @@ export function AIGenerateDialog({ open, onClose, onAccept }) {
145
147
  handleClose();
146
148
  }
147
149
  }, [result, onAccept, handleClose]);
148
- if (!open)
149
- return null;
150
- return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center", children: [_jsx("div", { className: "absolute inset-0 bg-black/50", onClick: handleClose }), _jsxs("div", { className: "bg-card border-border relative flex max-h-[85vh] w-full max-w-2xl flex-col overflow-hidden rounded-xl border shadow-2xl", children: [_jsxs("div", { className: "border-border flex items-center justify-between border-b px-6 py-4", children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx("div", { className: "bg-primary/10 rounded-lg p-1.5", children: _jsx(Sparkles, { size: 18, className: "text-primary" }) }), _jsxs("div", { children: [_jsx("h2", { className: "text-foreground text-base font-medium", children: "AI Page Generator" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Describe your page and let AI build it" })] })] }), _jsx("button", { onClick: handleClose, className: "hover:bg-muted rounded-md p-1.5 transition-colors", "aria-label": "Close", children: _jsx(X, { size: 16, className: "text-muted-foreground" }) })] }), _jsxs("div", { className: "flex-1 overflow-y-auto p-6", children: [phase === 'prompt' && (_jsxs("div", { className: "space-y-5", children: [error && (_jsxs("div", { className: "bg-destructive/5 border-destructive/20 flex items-start gap-2.5 rounded-lg border p-3", children: [_jsx(AlertTriangle, { size: 16, className: "text-destructive mt-0.5 shrink-0" }), _jsx("p", { className: "text-destructive text-sm", children: error })] })), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1.5 block text-sm font-medium", children: "Describe your page" }), _jsx("textarea", { value: prompt, onChange: (e) => setPrompt(e.target.value), placeholder: "e.g. A landing page for a plumbing company with a hero section, service cards, testimonials, and a contact form", rows: 4, className: "bg-background border-border focus:ring-primary/40 text-foreground placeholder:text-muted-foreground w-full resize-none rounded-lg border px-3 py-2.5 text-sm focus:ring-2 focus:outline-none", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1.5 block text-sm font-medium", children: "Tone" }), _jsx("div", { className: "flex flex-wrap gap-2", children: TONES.map((t) => (_jsx("button", { onClick: () => setTone(t.value), className: `rounded-full border px-3 py-1.5 text-xs transition-colors ${tone === t.value
151
- ? 'border-primary bg-primary/10 text-primary'
152
- : 'border-border bg-background text-muted-foreground hover:border-primary/40'}`, children: t.label }, t.value))) })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1.5 block text-sm font-medium", children: "Generation steps" }), _jsx("div", { className: "space-y-1.5", children: ALL_STEPS.map((step) => (_jsxs("label", { className: `flex cursor-pointer items-center gap-3 rounded-lg border p-2.5 transition-colors ${enabledSteps.has(step.key)
150
+ return (_jsx(Dialog.Root, { open: open, onOpenChange: (next) => !next && handleClose(), children: _jsxs(Dialog.Portal, { container: adminPortalContainer(), children: [_jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-black/50" }), _jsxs(Dialog.Content, { className: "bg-card border-border text-card-foreground fixed top-1/2 left-1/2 z-50 flex max-h-[85vh] w-[calc(100%-2rem)] max-w-2xl -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl border shadow-2xl focus:outline-none", children: [_jsxs("div", { className: "border-border flex items-center justify-between border-b px-6 py-4", children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx("div", { className: "bg-primary/10 rounded-lg p-1.5", children: _jsx(Sparkles, { size: 18, className: "text-primary", "aria-hidden": true }) }), _jsxs("div", { children: [_jsx(Dialog.Title, { className: "text-foreground text-base font-medium", children: "AI Page Generator" }), _jsx(Dialog.Description, { className: "text-muted-foreground text-xs", children: "Describe your page and let AI build it" })] })] }), _jsx(Dialog.Close, { asChild: true, children: _jsx("button", { type: "button", className: "hover:bg-muted text-muted-foreground hover:text-foreground focus-visible:ring-ring rounded-md p-1.5 transition-colors focus-visible:ring-2 focus-visible:outline-none", "aria-label": "Close AI page generator", children: _jsx(X, { size: 16, "aria-hidden": true }) }) })] }), _jsxs("div", { className: "flex-1 overflow-y-auto p-6", children: [phase === 'prompt' && (_jsxs("div", { className: "space-y-5", children: [error && (_jsxs("div", { className: "bg-destructive/5 border-destructive/20 flex items-start gap-2.5 rounded-lg border p-3", children: [_jsx(AlertTriangle, { size: 16, className: "text-destructive mt-0.5 shrink-0" }), _jsx("p", { className: "text-destructive text-sm", children: error })] })), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1.5 block text-sm font-medium", children: "Describe your page" }), _jsx("textarea", { value: prompt, onChange: (e) => setPrompt(e.target.value), placeholder: "e.g. A landing page for a plumbing company with a hero section, service cards, testimonials, and a contact form", rows: 4, className: "bg-background border-border focus:ring-primary/40 text-foreground placeholder:text-muted-foreground w-full resize-none rounded-lg border px-3 py-2.5 text-sm focus:ring-2 focus:outline-none", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1.5 block text-sm font-medium", children: "Tone" }), _jsx("div", { className: "flex flex-wrap gap-2", children: TONES.map((t) => (_jsx("button", { onClick: () => setTone(t.value), className: `rounded-full border px-3 py-1.5 text-xs transition-colors ${tone === t.value
151
+ ? 'border-primary bg-primary/10 text-primary'
152
+ : 'border-border bg-background text-muted-foreground hover:border-primary/40'}`, children: t.label }, t.value))) })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1.5 block text-sm font-medium", children: "Generation steps" }), _jsx("div", { className: "space-y-1.5", children: ALL_STEPS.map((step) => (_jsxs("label", { className: `flex cursor-pointer items-center gap-3 rounded-lg border p-2.5 transition-colors ${enabledSteps.has(step.key)
153
+ ? 'border-primary/30 bg-primary/5'
154
+ : 'border-border bg-background'} ${step.key === 'structure' ? 'cursor-not-allowed opacity-70' : 'hover:border-primary/20'}`, children: [_jsx("input", { type: "checkbox", checked: enabledSteps.has(step.key), onChange: () => toggleStep(step.key), disabled: step.key === 'structure', className: "sr-only" }), _jsx("div", { className: `flex h-5 w-5 shrink-0 items-center justify-center rounded ${enabledSteps.has(step.key)
155
+ ? 'bg-primary text-primary-foreground'
156
+ : 'bg-muted border-border border'}`, children: enabledSteps.has(step.key) && _jsx(Check, { size: 12 }) }), _jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground", children: step.icon }), _jsxs("div", { children: [_jsx("span", { className: "text-foreground text-sm", children: step.label }), _jsx("span", { className: "text-muted-foreground ml-2 text-xs", children: step.description })] })] })] }, step.key))) })] }), _jsxs("div", { children: [_jsxs("button", { onClick: () => setShowContext(!showContext), className: "text-muted-foreground hover:text-foreground flex items-center gap-1.5 text-sm transition-colors", children: [showContext ? _jsx(ChevronUp, { size: 14 }) : _jsx(ChevronDown, { size: 14 }), "Business context (optional)"] }), showContext && (_jsxs("div", { className: "bg-muted/50 border-border mt-3 space-y-3 rounded-lg border p-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-3", children: [_jsxs("div", { children: [_jsx("label", { className: "text-muted-foreground mb-1 block text-xs", children: "Business name" }), _jsx("input", { type: "text", value: businessName, onChange: (e) => setBusiness(e.target.value), className: "bg-background border-border focus:ring-primary/40 text-foreground w-full rounded-md border px-2.5 py-1.5 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-muted-foreground mb-1 block text-xs", children: "Industry" }), _jsx("input", { type: "text", value: industry, onChange: (e) => setIndustry(e.target.value), className: "bg-background border-border focus:ring-primary/40 text-foreground w-full rounded-md border px-2.5 py-1.5 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-muted-foreground mb-1 block text-xs", children: "Phone" }), _jsx("input", { type: "text", value: phone, onChange: (e) => setPhone(e.target.value), className: "bg-background border-border focus:ring-primary/40 text-foreground w-full rounded-md border px-2.5 py-1.5 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-muted-foreground mb-1 block text-xs", children: "Address" }), _jsx("input", { type: "text", value: address, onChange: (e) => setAddress(e.target.value), className: "bg-background border-border focus:ring-primary/40 text-foreground w-full rounded-md border px-2.5 py-1.5 text-sm focus:ring-2 focus:outline-none" })] })] }), _jsxs("div", { children: [_jsx("label", { className: "text-muted-foreground mb-1 block text-xs", children: "Services (comma-separated)" }), _jsx("input", { type: "text", value: services, onChange: (e) => setServices(e.target.value), placeholder: "e.g. Web design, SEO, Content marketing", className: "bg-background border-border focus:ring-primary/40 text-foreground placeholder:text-muted-foreground w-full rounded-md border px-2.5 py-1.5 text-sm focus:ring-2 focus:outline-none" })] })] }))] })] })), phase === 'generating' && (_jsxs("div", { className: "space-y-6 py-8", children: [_jsxs("div", { className: "text-center", children: [_jsx(Loader2, { size: 32, className: "text-primary mx-auto mb-3 animate-spin" }), _jsx("p", { className: "text-foreground text-sm font-medium", children: stepMessage || 'Generating...' }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: "This may take 15-30 seconds" })] }), _jsx("div", { className: "space-y-2", children: ALL_STEPS.filter((s) => enabledSteps.has(s.key)).map((step) => {
157
+ const isComplete = completedSteps.includes(step.key);
158
+ const isCurrent = currentStep === step.key;
159
+ return (_jsxs("div", { className: `flex items-center gap-3 rounded-lg border p-3 transition-colors ${isComplete
153
160
  ? 'border-primary/30 bg-primary/5'
154
- : 'border-border bg-background'} ${step.key === 'structure' ? 'cursor-not-allowed opacity-70' : 'hover:border-primary/20'}`, children: [_jsx("input", { type: "checkbox", checked: enabledSteps.has(step.key), onChange: () => toggleStep(step.key), disabled: step.key === 'structure', className: "sr-only" }), _jsx("div", { className: `flex h-5 w-5 shrink-0 items-center justify-center rounded ${enabledSteps.has(step.key)
155
- ? 'bg-primary text-white'
156
- : 'bg-muted border-border border'}`, children: enabledSteps.has(step.key) && _jsx(Check, { size: 12 }) }), _jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground", children: step.icon }), _jsxs("div", { children: [_jsx("span", { className: "text-foreground text-sm", children: step.label }), _jsx("span", { className: "text-muted-foreground ml-2 text-xs", children: step.description })] })] })] }, step.key))) })] }), _jsxs("div", { children: [_jsxs("button", { onClick: () => setShowContext(!showContext), className: "text-muted-foreground hover:text-foreground flex items-center gap-1.5 text-sm transition-colors", children: [showContext ? _jsx(ChevronUp, { size: 14 }) : _jsx(ChevronDown, { size: 14 }), "Business context (optional)"] }), showContext && (_jsxs("div", { className: "bg-muted/50 border-border mt-3 space-y-3 rounded-lg border p-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-3", children: [_jsxs("div", { children: [_jsx("label", { className: "text-muted-foreground mb-1 block text-xs", children: "Business name" }), _jsx("input", { type: "text", value: businessName, onChange: (e) => setBusiness(e.target.value), className: "bg-background border-border focus:ring-primary/40 text-foreground w-full rounded-md border px-2.5 py-1.5 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-muted-foreground mb-1 block text-xs", children: "Industry" }), _jsx("input", { type: "text", value: industry, onChange: (e) => setIndustry(e.target.value), className: "bg-background border-border focus:ring-primary/40 text-foreground w-full rounded-md border px-2.5 py-1.5 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-muted-foreground mb-1 block text-xs", children: "Phone" }), _jsx("input", { type: "text", value: phone, onChange: (e) => setPhone(e.target.value), className: "bg-background border-border focus:ring-primary/40 text-foreground w-full rounded-md border px-2.5 py-1.5 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-muted-foreground mb-1 block text-xs", children: "Address" }), _jsx("input", { type: "text", value: address, onChange: (e) => setAddress(e.target.value), className: "bg-background border-border focus:ring-primary/40 text-foreground w-full rounded-md border px-2.5 py-1.5 text-sm focus:ring-2 focus:outline-none" })] })] }), _jsxs("div", { children: [_jsx("label", { className: "text-muted-foreground mb-1 block text-xs", children: "Services (comma-separated)" }), _jsx("input", { type: "text", value: services, onChange: (e) => setServices(e.target.value), placeholder: "e.g. Web design, SEO, Content marketing", className: "bg-background border-border focus:ring-primary/40 text-foreground placeholder:text-muted-foreground w-full rounded-md border px-2.5 py-1.5 text-sm focus:ring-2 focus:outline-none" })] })] }))] })] })), phase === 'generating' && (_jsxs("div", { className: "space-y-6 py-8", children: [_jsxs("div", { className: "text-center", children: [_jsx(Loader2, { size: 32, className: "text-primary mx-auto mb-3 animate-spin" }), _jsx("p", { className: "text-foreground text-sm font-medium", children: stepMessage || 'Generating...' }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: "This may take 15-30 seconds" })] }), _jsx("div", { className: "space-y-2", children: ALL_STEPS.filter((s) => enabledSteps.has(s.key)).map((step) => {
157
- const isComplete = completedSteps.includes(step.key);
158
- const isCurrent = currentStep === step.key;
159
- return (_jsxs("div", { className: `flex items-center gap-3 rounded-lg border p-3 transition-colors ${isComplete
160
- ? 'border-primary/30 bg-primary/5'
161
- : isCurrent
162
- ? 'border-primary/50 bg-primary/10'
163
- : 'border-border bg-muted/30'}`, children: [_jsx("div", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full", children: isComplete ? (_jsx("div", { className: "bg-primary flex h-6 w-6 items-center justify-center rounded-full", children: _jsx(Check, { size: 12, className: "text-white" }) })) : isCurrent ? (_jsx(Loader2, { size: 16, className: "text-primary animate-spin" })) : (_jsx("div", { className: "bg-muted border-border h-6 w-6 rounded-full border" })) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground", children: step.icon }), _jsx("span", { className: `text-sm ${isCurrent || isComplete ? 'text-foreground' : 'text-muted-foreground'}`, children: step.label })] })] }, step.key));
164
- }) })] })), phase === 'review' && result && (_jsxs("div", { className: "space-y-5", children: [_jsxs("div", { className: "bg-primary/5 border-primary/20 flex items-center gap-3 rounded-lg border p-4", children: [_jsx("div", { className: "bg-primary/10 flex h-10 w-10 shrink-0 items-center justify-center rounded-full", children: _jsx(Sparkles, { size: 18, className: "text-primary" }) }), _jsxs("div", { children: [_jsx("p", { className: "text-foreground text-sm font-medium", children: "Page generated successfully" }), _jsxs("p", { className: "text-muted-foreground mt-0.5 text-xs", children: [result.totalTokensUsed.toLocaleString(), " tokens", ' \u00B7 ', (result.totalDurationMs / 1000).toFixed(1), "s", ' \u00B7 ', result.steps.length, " step", result.steps.length !== 1 ? 's' : ''] })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("h3", { className: "text-foreground text-sm font-medium", children: "Generation steps" }), result.steps.map((step) => {
165
- const info = ALL_STEPS.find((s) => s.key === step.step);
166
- const isExpanded = expandedStep === step.step;
167
- return (_jsxs("div", { className: "border-border overflow-hidden rounded-lg border", children: [_jsxs("button", { onClick: () => setExpandedStep(isExpanded ? null : step.step), className: "hover:bg-muted/50 flex w-full items-center gap-3 p-3 text-left transition-colors", children: [_jsx("div", { className: "bg-primary flex h-6 w-6 shrink-0 items-center justify-center rounded-full", children: _jsx(Check, { size: 12, className: "text-white" }) }), _jsx("span", { className: "text-muted-foreground", children: info?.icon }), _jsx("span", { className: "text-foreground flex-1 text-sm", children: info?.label }), _jsxs("span", { className: "text-muted-foreground text-xs", children: [(step.metadata.durationMs / 1000).toFixed(1), "s"] }), isExpanded ? (_jsx(ChevronUp, { size: 14, className: "text-muted-foreground" })) : (_jsx(ChevronDown, { size: 14, className: "text-muted-foreground" }))] }), isExpanded && (_jsxs("div", { className: "border-border border-t px-3 pt-2 pb-3", children: [_jsx("ul", { className: "space-y-1", children: step.metadata.changes.map((change, i) => (_jsxs("li", { className: "text-muted-foreground flex items-start gap-2 text-xs", children: [_jsx(ArrowRight, { size: 10, className: "mt-0.5 shrink-0" }), change] }, i))) }), _jsxs("p", { className: "text-muted-foreground mt-2 text-xs", children: ["Tokens: ", step.metadata.tokensUsed.toLocaleString()] })] }))] }, step.step));
168
- })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Review the generated page in the canvas after accepting. You can always undo to revert." })] }))] }), _jsxs("div", { className: "border-border flex items-center justify-end gap-3 border-t px-6 py-4", children: [phase === 'prompt' && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: handleClose, className: "text-muted-foreground hover:text-foreground px-4 py-2 text-sm transition-colors", children: "Cancel" }), _jsxs("button", { onClick: handleGenerate, disabled: !prompt.trim(), className: "bg-primary hover:bg-primary/90 flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(Sparkles, { size: 14 }), "Generate Page"] })] })), phase === 'generating' && (_jsx("button", { onClick: handleClose, className: "text-muted-foreground hover:text-foreground px-4 py-2 text-sm transition-colors", children: "Cancel" })), phase === 'review' && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => {
169
- setPhase('prompt');
170
- setResult(null);
171
- }, className: "text-muted-foreground hover:text-foreground px-4 py-2 text-sm transition-colors", children: "Regenerate" }), _jsxs("button", { onClick: handleAccept, className: "bg-primary hover:bg-primary/90 flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white transition-colors", children: [_jsx(Check, { size: 14 }), "Accept & Apply"] })] }))] })] })] }));
161
+ : isCurrent
162
+ ? 'border-primary/50 bg-primary/10'
163
+ : 'border-border bg-muted/30'}`, children: [_jsx("div", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full", children: isComplete ? (_jsx("div", { className: "bg-primary flex h-6 w-6 items-center justify-center rounded-full", children: _jsx(Check, { size: 12, className: "text-primary-foreground" }) })) : isCurrent ? (_jsx(Loader2, { size: 16, className: "text-primary animate-spin" })) : (_jsx("div", { className: "bg-muted border-border h-6 w-6 rounded-full border" })) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground", children: step.icon }), _jsx("span", { className: `text-sm ${isCurrent || isComplete ? 'text-foreground' : 'text-muted-foreground'}`, children: step.label })] })] }, step.key));
164
+ }) })] })), phase === 'review' && result && (_jsxs("div", { className: "space-y-5", children: [_jsxs("div", { className: "bg-primary/5 border-primary/20 flex items-center gap-3 rounded-lg border p-4", children: [_jsx("div", { className: "bg-primary/10 flex h-10 w-10 shrink-0 items-center justify-center rounded-full", children: _jsx(Sparkles, { size: 18, className: "text-primary" }) }), _jsxs("div", { children: [_jsx("p", { className: "text-foreground text-sm font-medium", children: "Page generated successfully" }), _jsxs("p", { className: "text-muted-foreground mt-0.5 text-xs", children: [result.totalTokensUsed.toLocaleString(), " tokens", ' \u00B7 ', (result.totalDurationMs / 1000).toFixed(1), "s", ' \u00B7 ', result.steps.length, " step", result.steps.length !== 1 ? 's' : ''] })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("h3", { className: "text-foreground text-sm font-medium", children: "Generation steps" }), result.steps.map((step) => {
165
+ const info = ALL_STEPS.find((s) => s.key === step.step);
166
+ const isExpanded = expandedStep === step.step;
167
+ return (_jsxs("div", { className: "border-border overflow-hidden rounded-lg border", children: [_jsxs("button", { onClick: () => setExpandedStep(isExpanded ? null : step.step), className: "hover:bg-muted/50 flex w-full items-center gap-3 p-3 text-left transition-colors", children: [_jsx("div", { className: "bg-primary flex h-6 w-6 shrink-0 items-center justify-center rounded-full", children: _jsx(Check, { size: 12, className: "text-primary-foreground" }) }), _jsx("span", { className: "text-muted-foreground", children: info?.icon }), _jsx("span", { className: "text-foreground flex-1 text-sm", children: info?.label }), _jsxs("span", { className: "text-muted-foreground text-xs", children: [(step.metadata.durationMs / 1000).toFixed(1), "s"] }), isExpanded ? (_jsx(ChevronUp, { size: 14, className: "text-muted-foreground" })) : (_jsx(ChevronDown, { size: 14, className: "text-muted-foreground" }))] }), isExpanded && (_jsxs("div", { className: "border-border border-t px-3 pt-2 pb-3", children: [_jsx("ul", { className: "space-y-1", children: step.metadata.changes.map((change, i) => (_jsxs("li", { className: "text-muted-foreground flex items-start gap-2 text-xs", children: [_jsx(ArrowRight, { size: 10, className: "mt-0.5 shrink-0" }), change] }, i))) }), _jsxs("p", { className: "text-muted-foreground mt-2 text-xs", children: ["Tokens: ", step.metadata.tokensUsed.toLocaleString()] })] }))] }, step.step));
168
+ })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Review the generated page in the canvas after accepting. You can always undo to revert." })] }))] }), _jsxs("div", { className: "border-border flex items-center justify-end gap-3 border-t px-6 py-4", children: [phase === 'prompt' && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: handleClose, className: "text-muted-foreground hover:text-foreground px-4 py-2 text-sm transition-colors", children: "Cancel" }), _jsxs("button", { onClick: handleGenerate, disabled: !prompt.trim(), className: "bg-primary text-primary-foreground hover:bg-primary/90 flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(Sparkles, { size: 14 }), "Generate Page"] })] })), phase === 'generating' && (_jsx("button", { onClick: handleClose, className: "text-muted-foreground hover:text-foreground px-4 py-2 text-sm transition-colors", children: "Cancel" })), phase === 'review' && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => {
169
+ setPhase('prompt');
170
+ setResult(null);
171
+ }, className: "text-muted-foreground hover:text-foreground px-4 py-2 text-sm transition-colors", children: "Regenerate" }), _jsxs("button", { onClick: handleAccept, className: "bg-primary text-primary-foreground hover:bg-primary/90 flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors", children: [_jsx(Check, { size: 14 }), "Accept & Apply"] })] }))] })] })] }) }));
172
172
  }
173
173
  //# sourceMappingURL=AIGenerateDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AIGenerateDialog.js","sourceRoot":"","sources":["../../../src/views/page-builder/AIGenerateDialog.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AIGenerateDialog.js","sourceRoot":"","sources":["../../../src/views/page-builder/AIGenerateDialog.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAA;AAChD,OAAO,EACL,QAAQ,EACR,CAAC,EACD,OAAO,EACP,KAAK,EACL,WAAW,EACX,SAAS,EACT,aAAa,EACb,KAAK,EACL,QAAQ,EACR,MAAM,EACN,aAAa,EACb,UAAU,GACX,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAgBpE,MAAM,SAAS,GAAe;IAC5B;QACE,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI;QACzB,WAAW,EAAE,0CAA0C;KACxD;IACD;QACE,GAAG,EAAE,SAAS;QACd,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI;QAC5B,WAAW,EAAE,uCAAuC;KACrD;IACD;QACE,GAAG,EAAE,KAAK;QACV,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,GAAI;QAC1B,WAAW,EAAE,4CAA4C;KAC1D;IACD;QACE,GAAG,EAAE,eAAe;QACpB,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,GAAI;QACjC,WAAW,EAAE,2CAA2C;KACzD;CACF,CAAA;AAID,MAAM,KAAK,GAAqC;IAC9C,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;IAChD,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACpC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACxC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;IAC1C,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;CACrC,CAAA;AAoBD,MAAM,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAyB;IACjF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAQ,QAAQ,CAAC,CAAA;IACnD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACxC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAO,cAAc,CAAC,CAAA;IACtD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAC1D,CAAA;IACD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrD,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAE5C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAA;IAC1D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAA;IAClE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAElD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA8B,IAAI,CAAC,CAAA;IACvE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IAErE,MAAM,UAAU,GAAG,CAAC,IAAoB,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAA;QAClC,IAAI,IAAI,KAAK,WAAW;YAAE,OAAM;QAChC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC;QACD,eAAe,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAClB,SAAS,CAAC,EAAE,CAAC,CAAA;QACb,OAAO,CAAC,cAAc,CAAC,CAAA;QACvB,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;QAC1E,cAAc,CAAC,KAAK,CAAC,CAAA;QACrB,WAAW,CAAC,EAAE,CAAC,CAAA;QACf,WAAW,CAAC,EAAE,CAAC,CAAA;QACf,QAAQ,CAAC,EAAE,CAAC,CAAA;QACZ,UAAU,CAAC,EAAE,CAAC,CAAA;QACd,WAAW,CAAC,EAAE,CAAC,CAAA;QACf,cAAc,CAAC,EAAE,CAAC,CAAA;QAClB,iBAAiB,CAAC,EAAE,CAAC,CAAA;QACrB,cAAc,CAAC,EAAE,CAAC,CAAA;QAClB,SAAS,CAAC,IAAI,CAAC,CAAA;QACf,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,eAAe,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,UAAU,EAAE,CAAA;QACZ,OAAO,EAAE,CAAA;IACX,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;IAEzB,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAA;YAC1D,OAAM;QACR,CAAC;QAED,QAAQ,CAAC,YAAY,CAAC,CAAA;QACtB,QAAQ,CAAC,IAAI,CAAC,CAAA;QAEd,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAEhF,cAAc,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAA;QACzB,cAAc,CAAC,wBAAwB,CAAC,CAAA;QAExC,MAAM,OAAO,GAA4B,EAAE,CAAA;QAC3C,IAAI,YAAY;YAAE,OAAO,CAAC,YAAY,GAAG,YAAY,CAAA;QACrD,IAAI,QAAQ;YAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACzC,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;QAChC,IAAI,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAA;QACtC,IAAI,QAAQ;YACV,OAAO,CAAC,QAAQ,GAAG,QAAQ;iBACxB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,CAAA;QAEpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAuB,wBAAwB,EAAE;gBACvE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;oBACrB,KAAK;oBACL,IAAI;oBACJ,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;iBAC/D,CAAC;aACH,CAAC,CAAA;YAEF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBACnB,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBAClB,OAAM;YACR,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBACnB,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;gBACpD,QAAQ,CAAC,QAAQ,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAA;YAClE,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;IAElF,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;YACjB,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACrB,KAAK,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAA;YAC1C,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAA;IAEnC,OAAO,CACL,KAAC,MAAM,CAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,WAAW,EAAE,YACrE,MAAC,MAAM,CAAC,MAAM,IAAC,SAAS,EAAE,oBAAoB,EAAE,aAC9C,KAAC,MAAM,CAAC,OAAO,IAAC,SAAS,EAAC,gCAAgC,GAAG,EAC7D,MAAC,MAAM,CAAC,OAAO,IAAC,SAAS,EAAC,mOAAmO,aAE3P,eAAK,SAAS,EAAC,oEAAoE,aACjF,eAAK,SAAS,EAAC,2BAA2B,aACxC,cAAK,SAAS,EAAC,gCAAgC,YAC7C,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,wBAAe,GACvD,EACN,0BACE,KAAC,MAAM,CAAC,KAAK,IAAC,SAAS,EAAC,uCAAuC,kCAEhD,EACf,KAAC,MAAM,CAAC,WAAW,IAAC,SAAS,EAAC,+BAA+B,uDAExC,IACjB,IACF,EACN,KAAC,MAAM,CAAC,KAAK,IAAC,OAAO,kBACnB,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,uKAAuK,gBACtK,yBAAyB,YAEpC,KAAC,CAAC,IAAC,IAAI,EAAE,EAAE,wBAAgB,GACpB,GACI,IACX,EAGN,eAAK,SAAS,EAAC,4BAA4B,aACxC,KAAK,KAAK,QAAQ,IAAI,CACrB,eAAK,SAAS,EAAC,WAAW,aACvB,KAAK,IAAI,CACR,eAAK,SAAS,EAAC,uFAAuF,aACpG,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,kCAAkC,GAAG,EACxE,YAAG,SAAS,EAAC,0BAA0B,YAAE,KAAK,GAAK,IAC/C,CACP,EAGD,0BACE,gBAAO,SAAS,EAAC,kDAAkD,mCAE3D,EACR,mBACE,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1C,WAAW,EAAC,iHAAiH,EAC7H,IAAI,EAAE,CAAC,EACP,SAAS,EAAC,8LAA8L,EACxM,SAAS,SACT,IACE,EAGN,0BACE,gBAAO,SAAS,EAAC,kDAAkD,qBAAa,EAChF,cAAK,SAAS,EAAC,sBAAsB,YAClC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,iBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAC/B,SAAS,EAAE,6DACT,IAAI,KAAK,CAAC,CAAC,KAAK;4DACd,CAAC,CAAC,2CAA2C;4DAC7C,CAAC,CAAC,2EACN,EAAE,YAED,CAAC,CAAC,KAAK,IARH,CAAC,CAAC,KAAK,CASL,CACV,CAAC,GACE,IACF,EAGN,0BACE,gBAAO,SAAS,EAAC,kDAAkD,iCAE3D,EACR,cAAK,SAAS,EAAC,aAAa,YACzB,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACvB,iBAEE,SAAS,EAAE,oFACT,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;4DACxB,CAAC,CAAC,gCAAgC;4DAClC,CAAC,CAAC,6BACN,IAAI,IAAI,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,yBAAyB,EAAE,aAE5F,gBACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EACnC,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EACpC,QAAQ,EAAE,IAAI,CAAC,GAAG,KAAK,WAAW,EAClC,SAAS,EAAC,SAAS,GACnB,EACF,cACE,SAAS,EAAE,6DACT,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;oEACxB,CAAC,CAAC,oCAAoC;oEACtC,CAAC,CAAC,+BACN,EAAE,YAED,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,GAC9C,EACN,eAAK,SAAS,EAAC,wCAAwC,aACrD,eAAM,SAAS,EAAC,uBAAuB,YAAE,IAAI,CAAC,IAAI,GAAQ,EAC1D,0BACE,eAAM,SAAS,EAAC,yBAAyB,YAAE,IAAI,CAAC,KAAK,GAAQ,EAC7D,eAAM,SAAS,EAAC,oCAAoC,YACjD,IAAI,CAAC,WAAW,GACZ,IACH,IACF,KA/BD,IAAI,CAAC,GAAG,CAgCP,CACT,CAAC,GACE,IACF,EAGN,0BACE,kBACE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,EAC3C,SAAS,EAAC,iGAAiG,aAE1G,WAAW,CAAC,CAAC,CAAC,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,GAAI,mCAE3D,EACR,WAAW,IAAI,CACd,eAAK,SAAS,EAAC,gEAAgE,aAC7E,eAAK,SAAS,EAAC,wBAAwB,aACrC,0BACE,gBAAO,SAAS,EAAC,0CAA0C,8BAEnD,EACR,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5C,SAAS,EAAC,kJAAkJ,GAC5J,IACE,EACN,0BACE,gBAAO,SAAS,EAAC,0CAA0C,yBAEnD,EACR,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5C,SAAS,EAAC,kJAAkJ,GAC5J,IACE,EACN,0BACE,gBAAO,SAAS,EAAC,0CAA0C,sBAAc,EACzE,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAC,kJAAkJ,GAC5J,IACE,EACN,0BACE,gBAAO,SAAS,EAAC,0CAA0C,wBAEnD,EACR,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3C,SAAS,EAAC,kJAAkJ,GAC5J,IACE,IACF,EACN,0BACE,gBAAO,SAAS,EAAC,0CAA0C,2CAEnD,EACR,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5C,WAAW,EAAC,yCAAyC,EACrD,SAAS,EAAC,oLAAoL,GAC9L,IACE,IACF,CACP,IACG,IACF,CACP,EAEA,KAAK,KAAK,YAAY,IAAI,CACzB,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,aAAa,aAC1B,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,wCAAwC,GAAG,EACxE,YAAG,SAAS,EAAC,qCAAqC,YAC/C,WAAW,IAAI,eAAe,GAC7B,EACJ,YAAG,SAAS,EAAC,oCAAoC,4CAAgC,IAC7E,EAEN,cAAK,SAAS,EAAC,WAAW,YACvB,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gDAC7D,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gDACpD,MAAM,SAAS,GAAG,WAAW,KAAK,IAAI,CAAC,GAAG,CAAA;gDAE1C,OAAO,CACL,eAEE,SAAS,EAAE,mEACT,UAAU;wDACR,CAAC,CAAC,gCAAgC;wDAClC,CAAC,CAAC,SAAS;4DACT,CAAC,CAAC,iCAAiC;4DACnC,CAAC,CAAC,2BACR,EAAE,aAEF,cAAK,SAAS,EAAC,gEAAgE,YAC5E,UAAU,CAAC,CAAC,CAAC,CACZ,cAAK,SAAS,EAAC,kEAAkE,YAC/E,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,yBAAyB,GAAG,GACnD,CACP,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CACd,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,2BAA2B,GAAG,CAC5D,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,oDAAoD,GAAG,CACvE,GACG,EACN,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,uBAAuB,YAAE,IAAI,CAAC,IAAI,GAAQ,EAC1D,eACE,SAAS,EAAE,WAAW,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,uBAAuB,EAAE,YAE5F,IAAI,CAAC,KAAK,GACN,IACH,KA3BD,IAAI,CAAC,GAAG,CA4BT,CACP,CAAA;4CACH,CAAC,CAAC,GACE,IACF,CACP,EAEA,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,CAC/B,eAAK,SAAS,EAAC,WAAW,aAExB,eAAK,SAAS,EAAC,8EAA8E,aAC3F,cAAK,SAAS,EAAC,gFAAgF,YAC7F,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,GAAG,GAC3C,EACN,0BACE,YAAG,SAAS,EAAC,qCAAqC,4CAE9C,EACJ,aAAG,SAAS,EAAC,sCAAsC,aAChD,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,aACvC,UAAU,EACV,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAG,UAAU,EACvD,MAAM,CAAC,KAAK,CAAC,MAAM,WAAO,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAC7D,IACA,IACF,EAGN,eAAK,SAAS,EAAC,WAAW,aACxB,aAAI,SAAS,EAAC,qCAAqC,iCAAsB,EACxE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oDACzB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,CAAA;oDACvD,MAAM,UAAU,GAAG,YAAY,KAAK,IAAI,CAAC,IAAI,CAAA;oDAE7C,OAAO,CACL,eAEE,SAAS,EAAC,iDAAiD,aAE3D,kBACE,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAC7D,SAAS,EAAC,kFAAkF,aAE5F,cAAK,SAAS,EAAC,2EAA2E,YACxF,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,yBAAyB,GAAG,GACnD,EACN,eAAM,SAAS,EAAC,uBAAuB,YAAE,IAAI,EAAE,IAAI,GAAQ,EAC3D,eAAM,SAAS,EAAC,gCAAgC,YAAE,IAAI,EAAE,KAAK,GAAQ,EACrE,gBAAM,SAAS,EAAC,+BAA+B,aAC5C,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SACxC,EACN,UAAU,CAAC,CAAC,CAAC,CACZ,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,GAAG,CAC1D,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,GAAG,CAC5D,IACM,EACR,UAAU,IAAI,CACb,eAAK,SAAS,EAAC,uCAAuC,aACpD,aAAI,SAAS,EAAC,WAAW,YACtB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CACxC,cAEE,SAAS,EAAC,sDAAsD,aAEhE,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,iBAAiB,GAAG,EACnD,MAAM,KAJF,CAAC,CAKH,CACN,CAAC,GACC,EACL,aAAG,SAAS,EAAC,oCAAoC,yBACtC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,EAAE,IAChD,IACA,CACP,KAtCI,IAAI,CAAC,IAAI,CAuCV,CACP,CAAA;gDACH,CAAC,CAAC,IACE,EAEN,YAAG,SAAS,EAAC,+BAA+B,wGAGxC,IACA,CACP,IACG,EAGN,eAAK,SAAS,EAAC,sEAAsE,aAClF,KAAK,KAAK,QAAQ,IAAI,CACrB,8BACE,iBACE,OAAO,EAAE,WAAW,EACpB,SAAS,EAAC,iFAAiF,uBAGpF,EACT,kBACE,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EACxB,SAAS,EAAC,2LAA2L,aAErM,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,qBAEf,IACR,CACJ,EAEA,KAAK,KAAK,YAAY,IAAI,CACzB,iBACE,OAAO,EAAE,WAAW,EACpB,SAAS,EAAC,iFAAiF,uBAGpF,CACV,EAEA,KAAK,KAAK,QAAQ,IAAI,CACrB,8BACE,iBACE,OAAO,EAAE,GAAG,EAAE;gDACZ,QAAQ,CAAC,QAAQ,CAAC,CAAA;gDAClB,SAAS,CAAC,IAAI,CAAC,CAAA;4CACjB,CAAC,EACD,SAAS,EAAC,iFAAiF,2BAGpF,EACT,kBACE,OAAO,EAAE,YAAY,EACrB,SAAS,EAAC,2IAA2I,aAErJ,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,sBAEZ,IACR,CACJ,IACG,IACS,IACH,GACJ,CACf,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuate-media/cms-admin",
3
- "version": "0.49.0",
3
+ "version": "0.49.3",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/actuate-media/actuatecms.git",
package/src/AdminRoot.tsx CHANGED
@@ -1,8 +1,10 @@
1
1
  'use client'
2
2
 
3
3
  import { useState, useMemo, useEffect, useRef, useCallback } from 'react'
4
+ import * as Dialog from '@radix-ui/react-dialog'
4
5
  import { toast } from 'sonner'
5
6
  import { Layout } from './layout/Layout.js'
7
+ import { adminPortalContainer } from './lib/portal-container.js'
6
8
  import { useAdminRouter } from './router/index.js'
7
9
  import { cmsApi, ensureCsrfToken } from './lib/api.js'
8
10
  import {
@@ -692,42 +694,45 @@ function AdminShell({
692
694
  onLogout={handleLogout}
693
695
  >
694
696
  <ErrorBoundary>{renderView()}</ErrorBoundary>
695
- {shortcutHelpOpen && <ShortcutHelp onClose={() => setShortcutHelpOpen(false)} />}
697
+ <ShortcutHelp open={shortcutHelpOpen} onClose={() => setShortcutHelpOpen(false)} />
696
698
  </Layout>
697
699
  )
698
700
  }
699
701
 
700
- function ShortcutHelp({ onClose }: { onClose: () => void }) {
702
+ function ShortcutHelp({ open, onClose }: { open: boolean; onClose: () => void }) {
701
703
  return (
702
- <div
703
- className="fixed inset-0 z-100 flex items-center justify-center bg-black/50"
704
- onClick={(e) => {
705
- if (e.target === e.currentTarget) onClose()
706
- }}
707
- >
708
- <div className="bg-card text-card-foreground border-border mx-4 w-full max-w-sm rounded-xl border p-6 shadow-2xl">
709
- <h3 className="mb-4 text-lg font-semibold">Keyboard Shortcuts</h3>
710
- <div className="space-y-3 text-sm">
711
- {[
712
- ['⌘ K', 'Open search'],
713
- ['⌘ S', 'Save document'],
714
- ['⌘ /', 'Toggle this help'],
715
- ['Esc', 'Close panel / modal'],
716
- ].map(([key, desc]) => (
717
- <div key={key} className="flex items-center justify-between">
718
- <span className="text-muted-foreground">{desc}</span>
719
- <kbd className="bg-muted rounded px-2 py-1 font-mono text-xs">{key}</kbd>
720
- </div>
721
- ))}
722
- </div>
723
- <button
724
- onClick={onClose}
725
- className="bg-primary text-primary-foreground mt-4 w-full rounded-lg py-2 text-sm hover:opacity-90"
704
+ <Dialog.Root open={open} onOpenChange={(next) => !next && onClose()}>
705
+ <Dialog.Portal container={adminPortalContainer()}>
706
+ <Dialog.Overlay className="fixed inset-0 z-100 bg-black/50" />
707
+ <Dialog.Content
708
+ aria-describedby={undefined}
709
+ className="bg-card text-card-foreground border-border fixed top-1/2 left-1/2 z-100 mx-4 w-[calc(100%-2rem)] max-w-sm -translate-x-1/2 -translate-y-1/2 rounded-xl border p-6 shadow-2xl focus:outline-none"
726
710
  >
727
- Close
728
- </button>
729
- </div>
730
- </div>
711
+ <Dialog.Title className="mb-4 text-lg font-medium">Keyboard Shortcuts</Dialog.Title>
712
+ <div className="space-y-3 text-sm">
713
+ {[
714
+ ['⌘ K', 'Open search'],
715
+ ['⌘ S', 'Save document'],
716
+ ['⌘ /', 'Toggle this help'],
717
+ ['Esc', 'Close panel / modal'],
718
+ ].map(([key, desc]) => (
719
+ <div key={key} className="flex items-center justify-between">
720
+ <span className="text-muted-foreground">{desc}</span>
721
+ <kbd className="bg-muted rounded px-2 py-1 font-mono text-xs">{key}</kbd>
722
+ </div>
723
+ ))}
724
+ </div>
725
+ <Dialog.Close asChild>
726
+ <button
727
+ type="button"
728
+ className="bg-primary text-primary-foreground focus-visible:ring-ring mt-4 w-full rounded-lg py-2 text-sm hover:opacity-90 focus-visible:ring-2 focus-visible:outline-none"
729
+ >
730
+ Close
731
+ </button>
732
+ </Dialog.Close>
733
+ </Dialog.Content>
734
+ </Dialog.Portal>
735
+ </Dialog.Root>
731
736
  )
732
737
  }
733
738
 
@@ -0,0 +1,57 @@
1
+ // @vitest-environment happy-dom
2
+ import { describe, expect, it, vi } from 'vitest'
3
+ import { fireEvent, render, screen } from '@testing-library/react'
4
+
5
+ /**
6
+ * The shared admin Modal is built on Radix Dialog. These tests pin the
7
+ * accessibility contract that the migration introduced: the surface is exposed
8
+ * as a labelled dialog, the icon-only close control has an accessible name, and
9
+ * Escape / close both fire `onClose`. Hand-rolled `<div>` overlays gave us none
10
+ * of this.
11
+ */
12
+
13
+ const { Modal } = await import('../../components/ui/Modal.js')
14
+
15
+ describe('Modal accessibility', () => {
16
+ it('does not render content while closed', () => {
17
+ render(
18
+ <Modal open={false} onClose={() => {}} title="Edit page">
19
+ <p>Body</p>
20
+ </Modal>,
21
+ )
22
+ expect(screen.queryByRole('dialog')).toBeNull()
23
+ })
24
+
25
+ it('exposes a labelled dialog with an accessible close button', () => {
26
+ render(
27
+ <Modal open onClose={() => {}} title="Edit page">
28
+ <p>Body</p>
29
+ </Modal>,
30
+ )
31
+ // The title becomes the dialog's accessible name via aria-labelledby.
32
+ expect(screen.getByRole('dialog', { name: 'Edit page' })).toBeTruthy()
33
+ expect(screen.getByRole('button', { name: 'Close dialog' })).toBeTruthy()
34
+ })
35
+
36
+ it('fires onClose when the close button is activated', () => {
37
+ const onClose = vi.fn()
38
+ render(
39
+ <Modal open onClose={onClose} title="Edit page">
40
+ <p>Body</p>
41
+ </Modal>,
42
+ )
43
+ fireEvent.click(screen.getByRole('button', { name: 'Close dialog' }))
44
+ expect(onClose).toHaveBeenCalledTimes(1)
45
+ })
46
+
47
+ it('fires onClose when Escape is pressed', () => {
48
+ const onClose = vi.fn()
49
+ render(
50
+ <Modal open onClose={onClose} title="Edit page">
51
+ <p>Body</p>
52
+ </Modal>,
53
+ )
54
+ fireEvent.keyDown(document.body, { key: 'Escape' })
55
+ expect(onClose).toHaveBeenCalled()
56
+ })
57
+ })
@@ -191,10 +191,10 @@ export function FolderTree({
191
191
  <div
192
192
  className={`group flex cursor-pointer items-center gap-1 rounded-md px-2 py-1.5 text-sm transition-colors ${
193
193
  isActive
194
- ? 'bg-blue-50 font-medium text-blue-700'
194
+ ? 'bg-primary/10 text-primary font-medium'
195
195
  : isDragOver
196
- ? 'bg-blue-100 ring-2 ring-blue-300'
197
- : 'text-gray-700 hover:bg-gray-100'
196
+ ? 'bg-primary/15 ring-primary/40 ring-2'
197
+ : 'text-foreground hover:bg-muted'
198
198
  }`}
199
199
  style={{ paddingLeft: `${8 + depth * 16}px` }}
200
200
  onClick={() => onSelect({ type: 'folder', folderId: folder.id })}
@@ -208,7 +208,7 @@ export function FolderTree({
208
208
  >
209
209
  <button
210
210
  type="button"
211
- className={`rounded p-0.5 transition-colors hover:bg-gray-200 ${hasChildren ? '' : 'invisible'}`}
211
+ className={`hover:bg-muted rounded p-0.5 transition-colors ${hasChildren ? '' : 'invisible'}`}
212
212
  onClick={(e) => {
213
213
  e.stopPropagation()
214
214
  toggleExpand(folder.id)
@@ -222,9 +222,9 @@ export function FolderTree({
222
222
  </button>
223
223
 
224
224
  {isExpanded ? (
225
- <FolderOpen className="h-4 w-4 shrink-0 text-blue-500" />
225
+ <FolderOpen className="text-primary h-4 w-4 shrink-0" />
226
226
  ) : (
227
- <FolderIcon className="h-4 w-4 shrink-0 text-gray-400" />
227
+ <FolderIcon className="text-muted-foreground h-4 w-4 shrink-0" />
228
228
  )}
229
229
 
230
230
  {editingId === folder.id ? (
@@ -238,7 +238,7 @@ export function FolderTree({
238
238
  if (e.key === 'Enter') handleRename(folder.id)
239
239
  if (e.key === 'Escape') setEditingId(null)
240
240
  }}
241
- className="min-w-0 flex-1 rounded border border-blue-300 px-1 py-0 text-sm focus:ring-1 focus:ring-blue-500 focus:outline-none"
241
+ className="border-primary/50 focus:ring-ring min-w-0 flex-1 rounded border px-1 py-0 text-sm focus:ring-1 focus:outline-none"
242
242
  onClick={(e) => e.stopPropagation()}
243
243
  />
244
244
  ) : (
@@ -246,18 +246,18 @@ export function FolderTree({
246
246
  )}
247
247
 
248
248
  {count !== undefined && !editingId && (
249
- <span className="text-xs text-gray-400 tabular-nums">{count}</span>
249
+ <span className="text-muted-foreground text-xs tabular-nums">{count}</span>
250
250
  )}
251
251
 
252
252
  <button
253
253
  type="button"
254
- className="rounded p-0.5 opacity-0 transition-all group-hover:opacity-100 hover:bg-gray-200"
254
+ className="hover:bg-muted rounded p-0.5 opacity-0 transition-all group-hover:opacity-100"
255
255
  onClick={(e) => {
256
256
  e.stopPropagation()
257
257
  setContextMenu({ id: folder.id, x: e.clientX, y: e.clientY })
258
258
  }}
259
259
  >
260
- <MoreHorizontal className="h-3.5 w-3.5 text-gray-500" />
260
+ <MoreHorizontal className="text-muted-foreground h-3.5 w-3.5" />
261
261
  </button>
262
262
  </div>
263
263
 
@@ -269,7 +269,7 @@ export function FolderTree({
269
269
  className="flex items-center gap-1 px-2 py-1"
270
270
  style={{ paddingLeft: `${24 + (depth + 1) * 16}px` }}
271
271
  >
272
- <FolderIcon className="h-4 w-4 shrink-0 text-gray-400" />
272
+ <FolderIcon className="text-muted-foreground h-4 w-4 shrink-0" />
273
273
  <input
274
274
  ref={newFolderInputRef}
275
275
  type="text"
@@ -284,7 +284,7 @@ export function FolderTree({
284
284
  }
285
285
  }}
286
286
  placeholder="Folder name..."
287
- className="min-w-0 flex-1 rounded border border-blue-300 px-1 py-0 text-sm focus:ring-1 focus:ring-blue-500 focus:outline-none"
287
+ className="border-primary/50 focus:ring-ring min-w-0 flex-1 rounded border px-1 py-0 text-sm focus:ring-1 focus:outline-none"
288
288
  />
289
289
  </div>
290
290
  )}
@@ -297,7 +297,7 @@ export function FolderTree({
297
297
  if (loading) {
298
298
  return (
299
299
  <div className="flex items-center justify-center py-8">
300
- <Loader2 className="h-5 w-5 animate-spin text-gray-400" />
300
+ <Loader2 className="text-muted-foreground h-5 w-5 animate-spin" />
301
301
  </div>
302
302
  )
303
303
  }
@@ -309,8 +309,8 @@ export function FolderTree({
309
309
  type="button"
310
310
  className={`flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors ${
311
311
  isSelected({ type: 'smart', smart: 'all' })
312
- ? 'bg-blue-50 font-medium text-blue-700'
313
- : 'text-gray-700 hover:bg-gray-100'
312
+ ? 'bg-primary/10 text-primary font-medium'
313
+ : 'text-foreground hover:bg-muted'
314
314
  }`}
315
315
  onClick={() => onSelect({ type: 'smart', smart: 'all' })}
316
316
  onDragOver={(e) => handleDragOver(e, null)}
@@ -320,7 +320,7 @@ export function FolderTree({
320
320
  <LayoutGrid className="h-4 w-4 shrink-0" />
321
321
  <span className="flex-1 text-left">All</span>
322
322
  {totalCount !== undefined && (
323
- <span className="text-xs text-gray-400 tabular-nums">{totalCount}</span>
323
+ <span className="text-muted-foreground text-xs tabular-nums">{totalCount}</span>
324
324
  )}
325
325
  </button>
326
326
 
@@ -328,15 +328,15 @@ export function FolderTree({
328
328
  type="button"
329
329
  className={`flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors ${
330
330
  isSelected({ type: 'smart', smart: 'recent' })
331
- ? 'bg-blue-50 font-medium text-blue-700'
332
- : 'text-gray-700 hover:bg-gray-100'
331
+ ? 'bg-primary/10 text-primary font-medium'
332
+ : 'text-foreground hover:bg-muted'
333
333
  }`}
334
334
  onClick={() => onSelect({ type: 'smart', smart: 'recent' })}
335
335
  >
336
336
  <Clock className="h-4 w-4 shrink-0" />
337
337
  <span className="flex-1 text-left">Recent</span>
338
338
  {recentCount !== undefined && (
339
- <span className="text-xs text-gray-400 tabular-nums">{recentCount}</span>
339
+ <span className="text-muted-foreground text-xs tabular-nums">{recentCount}</span>
340
340
  )}
341
341
  </button>
342
342
 
@@ -344,27 +344,27 @@ export function FolderTree({
344
344
  type="button"
345
345
  className={`flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors ${
346
346
  isSelected({ type: 'smart', smart: 'uncategorized' })
347
- ? 'bg-blue-50 font-medium text-blue-700'
348
- : 'text-gray-700 hover:bg-gray-100'
347
+ ? 'bg-primary/10 text-primary font-medium'
348
+ : 'text-foreground hover:bg-muted'
349
349
  }`}
350
350
  onClick={() => onSelect({ type: 'smart', smart: 'uncategorized' })}
351
351
  >
352
352
  <Inbox className="h-4 w-4 shrink-0" />
353
353
  <span className="flex-1 text-left">Uncategorized</span>
354
354
  {uncategorizedCount !== undefined && (
355
- <span className="text-xs text-gray-400 tabular-nums">{uncategorizedCount}</span>
355
+ <span className="text-muted-foreground text-xs tabular-nums">{uncategorizedCount}</span>
356
356
  )}
357
357
  </button>
358
358
  </div>
359
359
 
360
- <div className="my-1 border-t border-gray-200" />
360
+ <div className="border-border my-1 border-t" />
361
361
 
362
362
  <div className="flex-1 space-y-0.5 overflow-y-auto px-1 py-1">
363
363
  {folders.map((folder) => renderFolder(folder, 0))}
364
364
 
365
365
  {creatingIn === null && (
366
366
  <div className="flex items-center gap-1 px-2 py-1">
367
- <FolderIcon className="ml-5 h-4 w-4 shrink-0 text-gray-400" />
367
+ <FolderIcon className="text-muted-foreground ml-5 h-4 w-4 shrink-0" />
368
368
  <input
369
369
  ref={newFolderInputRef}
370
370
  type="text"
@@ -379,20 +379,20 @@ export function FolderTree({
379
379
  }
380
380
  }}
381
381
  placeholder="Folder name..."
382
- className="min-w-0 flex-1 rounded border border-blue-300 px-1 py-0 text-sm focus:ring-1 focus:ring-blue-500 focus:outline-none"
382
+ className="border-primary/50 focus:ring-ring min-w-0 flex-1 rounded border px-1 py-0 text-sm focus:ring-1 focus:outline-none"
383
383
  />
384
384
  </div>
385
385
  )}
386
386
  </div>
387
387
 
388
- <div className="border-t border-gray-200 p-2">
388
+ <div className="border-border border-t p-2">
389
389
  <button
390
390
  type="button"
391
391
  onClick={() => {
392
392
  setCreatingIn(null)
393
393
  setNewFolderName('')
394
394
  }}
395
- className="flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-gray-600 transition-colors hover:bg-gray-100"
395
+ className="text-muted-foreground hover:bg-muted flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors"
396
396
  >
397
397
  <Plus className="h-4 w-4" />
398
398
  New Folder
@@ -401,12 +401,12 @@ export function FolderTree({
401
401
 
402
402
  {contextMenu && (
403
403
  <div
404
- className="fixed z-50 min-w-[160px] rounded-lg border border-gray-200 bg-white py-1 shadow-lg"
404
+ className="border-border bg-card fixed z-50 min-w-[160px] rounded-lg border py-1 shadow-lg"
405
405
  style={{ left: contextMenu.x, top: contextMenu.y }}
406
406
  >
407
407
  <button
408
408
  type="button"
409
- className="flex w-full items-center gap-2 px-3 py-1.5 text-sm text-gray-700 transition-colors hover:bg-gray-100"
409
+ className="text-foreground hover:bg-muted flex w-full items-center gap-2 px-3 py-1.5 text-sm transition-colors"
410
410
  onClick={() => {
411
411
  const folder = findFolder(folders, contextMenu.id)
412
412
  if (folder) {
@@ -421,7 +421,7 @@ export function FolderTree({
421
421
  </button>
422
422
  <button
423
423
  type="button"
424
- className="flex w-full items-center gap-2 px-3 py-1.5 text-sm text-gray-700 transition-colors hover:bg-gray-100"
424
+ className="text-foreground hover:bg-muted flex w-full items-center gap-2 px-3 py-1.5 text-sm transition-colors"
425
425
  onClick={() => {
426
426
  setCreatingIn(contextMenu.id)
427
427
  setNewFolderName('')
@@ -432,10 +432,10 @@ export function FolderTree({
432
432
  <FolderPlus className="h-3.5 w-3.5" />
433
433
  New Subfolder
434
434
  </button>
435
- <div className="my-1 border-t border-gray-200" />
435
+ <div className="border-border my-1 border-t" />
436
436
  <button
437
437
  type="button"
438
- className="flex w-full items-center gap-2 px-3 py-1.5 text-sm text-red-600 transition-colors hover:bg-red-50"
438
+ className="text-destructive hover:bg-destructive/10 flex w-full items-center gap-2 px-3 py-1.5 text-sm transition-colors"
439
439
  onClick={() => {
440
440
  handleDelete(contextMenu.id)
441
441
  setContextMenu(null)