@actuate-media/cms-admin 0.48.0 → 0.49.1

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 +22 -0
  2. package/dist/AdminRoot.d.ts +10 -0
  3. package/dist/AdminRoot.d.ts.map +1 -1
  4. package/dist/AdminRoot.js +25 -43
  5. package/dist/AdminRoot.js.map +1 -1
  6. package/dist/LoginRoot.d.ts +54 -0
  7. package/dist/LoginRoot.d.ts.map +1 -0
  8. package/dist/LoginRoot.js +59 -0
  9. package/dist/LoginRoot.js.map +1 -0
  10. package/dist/__tests__/components/modal.render.test.d.ts +2 -0
  11. package/dist/__tests__/components/modal.render.test.d.ts.map +1 -0
  12. package/dist/__tests__/components/modal.render.test.js +37 -0
  13. package/dist/__tests__/components/modal.render.test.js.map +1 -0
  14. package/dist/__tests__/views/login-root.render.test.d.ts +2 -0
  15. package/dist/__tests__/views/login-root.render.test.d.ts.map +1 -0
  16. package/dist/__tests__/views/login-root.render.test.js +79 -0
  17. package/dist/__tests__/views/login-root.render.test.js.map +1 -0
  18. package/dist/actuate-admin.css +1 -1
  19. package/dist/components/MediaPickerModal.d.ts +1 -1
  20. package/dist/components/MediaPickerModal.d.ts.map +1 -1
  21. package/dist/components/MediaPickerModal.js +12 -11
  22. package/dist/components/MediaPickerModal.js.map +1 -1
  23. package/dist/components/SchedulePublishDialog.d.ts +1 -1
  24. package/dist/components/SchedulePublishDialog.d.ts.map +1 -1
  25. package/dist/components/SchedulePublishDialog.js +6 -4
  26. package/dist/components/SchedulePublishDialog.js.map +1 -1
  27. package/dist/components/SharePreviewLinkDialog.d.ts +1 -1
  28. package/dist/components/SharePreviewLinkDialog.d.ts.map +1 -1
  29. package/dist/components/SharePreviewLinkDialog.js +10 -9
  30. package/dist/components/SharePreviewLinkDialog.js.map +1 -1
  31. package/dist/components/VersionHistory.d.ts +1 -1
  32. package/dist/components/VersionHistory.d.ts.map +1 -1
  33. package/dist/components/VersionHistory.js +14 -14
  34. package/dist/components/VersionHistory.js.map +1 -1
  35. package/dist/components/ui/Modal.d.ts +17 -1
  36. package/dist/components/ui/Modal.d.ts.map +1 -1
  37. package/dist/components/ui/Modal.js +16 -15
  38. package/dist/components/ui/Modal.js.map +1 -1
  39. package/dist/fields/BlockBuilderField.d.ts.map +1 -1
  40. package/dist/fields/BlockBuilderField.js +6 -4
  41. package/dist/fields/BlockBuilderField.js.map +1 -1
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +1 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/lib/root-chrome.d.ts +15 -0
  47. package/dist/lib/root-chrome.d.ts.map +1 -0
  48. package/dist/lib/root-chrome.js +41 -0
  49. package/dist/lib/root-chrome.js.map +1 -0
  50. package/dist/views/HiddenLoginNotFound.d.ts +8 -0
  51. package/dist/views/HiddenLoginNotFound.d.ts.map +1 -0
  52. package/dist/views/HiddenLoginNotFound.js +29 -0
  53. package/dist/views/HiddenLoginNotFound.js.map +1 -0
  54. package/dist/views/page-builder/AIGenerateDialog.d.ts +1 -1
  55. package/dist/views/page-builder/AIGenerateDialog.d.ts.map +1 -1
  56. package/dist/views/page-builder/AIGenerateDialog.js +23 -23
  57. package/dist/views/page-builder/AIGenerateDialog.js.map +1 -1
  58. package/package.json +2 -2
  59. package/src/AdminRoot.tsx +61 -59
  60. package/src/LoginRoot.tsx +166 -0
  61. package/src/__tests__/components/modal.render.test.tsx +57 -0
  62. package/src/__tests__/views/login-root.render.test.tsx +115 -0
  63. package/src/components/MediaPickerModal.tsx +143 -119
  64. package/src/components/SchedulePublishDialog.tsx +118 -93
  65. package/src/components/SharePreviewLinkDialog.tsx +115 -93
  66. package/src/components/VersionHistory.tsx +98 -82
  67. package/src/components/ui/Modal.tsx +48 -39
  68. package/src/fields/BlockBuilderField.tsx +26 -19
  69. package/src/index.ts +2 -0
  70. package/src/lib/root-chrome.ts +40 -0
  71. package/src/views/HiddenLoginNotFound.tsx +45 -0
  72. package/src/views/page-builder/AIGenerateDialog.tsx +347 -335
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type React from 'react';
2
+ /**
3
+ * Full-viewport overlay style shared by the admin and login mounts so the CMS
4
+ * UI renders above any consumer page chrome, with its own stacking context.
5
+ */
6
+ export declare const ISOLATION_STYLE: React.CSSProperties;
7
+ /**
8
+ * The admin (and its login screens) are private application UI and must never
9
+ * be indexed. Ensure a `noindex, nofollow` robots meta tag is present while
10
+ * mounted, as defense-in-depth alongside the server `robots.txt` Disallow
11
+ * rule. This covers every consumer install (the admin page is typically a
12
+ * client component that can't export Next.js route metadata).
13
+ */
14
+ export declare function useRobotsNoIndex(): void;
15
+ //# sourceMappingURL=root-chrome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-chrome.d.ts","sourceRoot":"","sources":["../../src/lib/root-chrome.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,aAMnC,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAiBvC"}
@@ -0,0 +1,41 @@
1
+ import { useEffect } from 'react';
2
+ /**
3
+ * Full-viewport overlay style shared by the admin and login mounts so the CMS
4
+ * UI renders above any consumer page chrome, with its own stacking context.
5
+ */
6
+ export const ISOLATION_STYLE = {
7
+ position: 'fixed',
8
+ inset: '0',
9
+ zIndex: 50,
10
+ overflow: 'auto',
11
+ isolation: 'isolate',
12
+ };
13
+ /**
14
+ * The admin (and its login screens) are private application UI and must never
15
+ * be indexed. Ensure a `noindex, nofollow` robots meta tag is present while
16
+ * mounted, as defense-in-depth alongside the server `robots.txt` Disallow
17
+ * rule. This covers every consumer install (the admin page is typically a
18
+ * client component that can't export Next.js route metadata).
19
+ */
20
+ export function useRobotsNoIndex() {
21
+ useEffect(() => {
22
+ if (typeof document === 'undefined')
23
+ return;
24
+ const prev = document.querySelector('meta[name="robots"]');
25
+ const prevContent = prev?.getAttribute('content') ?? null;
26
+ const meta = prev ?? document.createElement('meta');
27
+ meta.setAttribute('name', 'robots');
28
+ meta.setAttribute('content', 'noindex, nofollow');
29
+ if (!prev)
30
+ document.head.appendChild(meta);
31
+ return () => {
32
+ if (prevContent === null) {
33
+ meta.remove();
34
+ }
35
+ else {
36
+ meta.setAttribute('content', prevContent);
37
+ }
38
+ };
39
+ }, []);
40
+ }
41
+ //# sourceMappingURL=root-chrome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-chrome.js","sourceRoot":"","sources":["../../src/lib/root-chrome.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGjC;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAwB;IAClD,QAAQ,EAAE,OAAO;IACjB,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,SAAS;CACrB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,OAAM;QAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAkB,qBAAqB,CAAC,CAAA;QAC3E,MAAM,WAAW,GAAG,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,CAAA;QACzD,MAAM,IAAI,GAAG,IAAI,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QACnD,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACnC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAA;QACjD,IAAI,CAAC,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QAC1C,OAAO,GAAG,EAAE;YACV,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,EAAE,CAAA;YACf,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Rendered at the admin mount for signed-out visitors on split-login installs
3
+ * (`config.admin.loginPath` set). Mimics the framework's default 404 page so
4
+ * hitting `/admin` reveals nothing — no login form, no admin branding, and no
5
+ * redirect that would leak the real login location.
6
+ */
7
+ export declare function HiddenLoginNotFound(): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=HiddenLoginNotFound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HiddenLoginNotFound.d.ts","sourceRoot":"","sources":["../../src/views/HiddenLoginNotFound.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,mBAAmB,4CAoClC"}
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * Rendered at the admin mount for signed-out visitors on split-login installs
5
+ * (`config.admin.loginPath` set). Mimics the framework's default 404 page so
6
+ * hitting `/admin` reveals nothing — no login form, no admin branding, and no
7
+ * redirect that would leak the real login location.
8
+ */
9
+ export function HiddenLoginNotFound() {
10
+ return (_jsx("div", { style: {
11
+ fontFamily: 'system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
12
+ height: '100vh',
13
+ display: 'flex',
14
+ alignItems: 'center',
15
+ justifyContent: 'center',
16
+ background: '#fff',
17
+ color: '#000',
18
+ textAlign: 'center',
19
+ }, children: _jsxs("div", { style: { display: 'flex', alignItems: 'center', lineHeight: '49px' }, children: [_jsx("h1", { style: {
20
+ display: 'inline-block',
21
+ margin: '0 20px 0 0',
22
+ paddingRight: 23,
23
+ fontSize: 24,
24
+ fontWeight: 500,
25
+ verticalAlign: 'top',
26
+ borderRight: '1px solid rgba(0, 0, 0, .3)',
27
+ }, children: "404" }), _jsx("div", { style: { display: 'inline-block' }, children: _jsx("h2", { style: { margin: 0, fontSize: 14, fontWeight: 400, lineHeight: '49px' }, children: "This page could not be found." }) })] }) }));
28
+ }
29
+ //# sourceMappingURL=HiddenLoginNotFound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HiddenLoginNotFound.js","sourceRoot":"","sources":["../../src/views/HiddenLoginNotFound.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CACL,cACE,KAAK,EAAE;YACL,UAAU,EAAE,6DAA6D;YACzE,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,UAAU,EAAE,MAAM;YAClB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,QAAQ;SACpB,YAED,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,aACvE,aACE,KAAK,EAAE;wBACL,OAAO,EAAE,cAAc;wBACvB,MAAM,EAAE,YAAY;wBACpB,YAAY,EAAE,EAAE;wBAChB,QAAQ,EAAE,EAAE;wBACZ,UAAU,EAAE,GAAG;wBACf,aAAa,EAAE,KAAK;wBACpB,WAAW,EAAE,6BAA6B;qBAC3C,oBAGE,EACL,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,YACrC,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,8CAEtE,GACD,IACF,GACF,CACP,CAAA;AACH,CAAC"}
@@ -4,5 +4,5 @@ export interface AIGenerateDialogProps {
4
4
  onClose: () => void;
5
5
  onAccept: (tree: PageNode) => void;
6
6
  }
7
- export declare function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogProps): import("react/jsx-runtime").JSX.Element | null;
7
+ export declare function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogProps): import("react/jsx-runtime").JSX.Element;
8
8
  //# sourceMappingURL=AIGenerateDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AIGenerateDialog.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/AIGenerateDialog.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,yBAAyB,CAAA;AAEvE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAA;CACnC;AAgED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,qBAAqB,kDA2elF"}
1
+ {"version":3,"file":"AIGenerateDialog.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/AIGenerateDialog.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,yBAAyB,CAAA;AAEvE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAA;CACnC;AAgED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,qBAAqB,2CAqflF"}
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuate-media/cms-admin",
3
- "version": "0.48.0",
3
+ "version": "0.49.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/actuate-media/actuatecms.git",
@@ -89,7 +89,7 @@
89
89
  "tailwindcss": "^4.0.0",
90
90
  "typescript": "^5.7.0",
91
91
  "vitest": "^4.1.0",
92
- "@actuate-media/cms-core": "0.65.0",
92
+ "@actuate-media/cms-core": "0.66.0",
93
93
  "@actuate-media/component-blocks": "0.2.1"
94
94
  },
95
95
  "scripts": {
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 {
@@ -26,6 +28,8 @@ import { ScriptTags } from './views/ScriptTags.js'
26
28
  import { ScriptTagEditor } from './views/ScriptTagEditor.js'
27
29
  import { SetupWizard } from './views/SetupWizard.js'
28
30
  import { Login } from './views/Login.js'
31
+ import { HiddenLoginNotFound } from './views/HiddenLoginNotFound.js'
32
+ import { ISOLATION_STYLE, useRobotsNoIndex } from './lib/root-chrome.js'
29
33
  import { ForgotPassword } from './views/ForgotPassword.js'
30
34
  import { ResetPassword } from './views/ResetPassword.js'
31
35
  import { ErrorBoundary } from './components/ErrorBoundary.js'
@@ -57,6 +61,16 @@ export interface AdminRootProps {
57
61
  session: any
58
62
  basePath?: string
59
63
  initialPath?: string
64
+ /**
65
+ * Split-login mode: the URL path where the unauthenticated auth screens
66
+ * (login, setup wizard, forgot/reset password) are mounted via `LoginRoot`,
67
+ * e.g. `/securelogin`. When set (and different from `basePath`), signed-out
68
+ * visitors to the admin mount see a 404 lookalike instead of a login form —
69
+ * the admin's existence isn't advertised at the well-known `/admin` path.
70
+ * Keep in sync with `config.admin.loginPath` so middleware guards and
71
+ * emailed reset/invite links agree on the location.
72
+ */
73
+ loginPath?: string
60
74
  setupRequired?: boolean
61
75
  onSetupComplete?: (data: {
62
76
  name: string
@@ -101,6 +115,7 @@ function AdminShell({
101
115
  session,
102
116
  basePath = '/admin',
103
117
  initialPath = '/',
118
+ loginPath,
104
119
  setupRequired,
105
120
  onSetupComplete,
106
121
  onLogin,
@@ -244,7 +259,16 @@ function AdminShell({
244
259
  return map
245
260
  }, [config])
246
261
 
262
+ // Split-login mode: the auth screens (login, wizard, forgot/reset) live on
263
+ // their own mount (`LoginRoot` at `loginPath`), so signed-out traffic to the
264
+ // admin mount gets a 404 lookalike. No redirect — that would leak the real
265
+ // login location to anyone probing the well-known `/admin` path.
266
+ const hideAuthScreens = Boolean(loginPath && loginPath !== basePath)
267
+
247
268
  if (setupRequired && onSetupComplete) {
269
+ if (hideAuthScreens) {
270
+ return <HiddenLoginNotFound />
271
+ }
248
272
  return (
249
273
  <SetupWizard
250
274
  onComplete={onSetupComplete}
@@ -254,6 +278,9 @@ function AdminShell({
254
278
  }
255
279
 
256
280
  if (!session && !setupRequired) {
281
+ if (hideAuthScreens) {
282
+ return <HiddenLoginNotFound />
283
+ }
257
284
  if (matchRoute('/forgot-password')) {
258
285
  return <ForgotPassword onNavigate={navigate} />
259
286
  }
@@ -667,42 +694,45 @@ function AdminShell({
667
694
  onLogout={handleLogout}
668
695
  >
669
696
  <ErrorBoundary>{renderView()}</ErrorBoundary>
670
- {shortcutHelpOpen && <ShortcutHelp onClose={() => setShortcutHelpOpen(false)} />}
697
+ <ShortcutHelp open={shortcutHelpOpen} onClose={() => setShortcutHelpOpen(false)} />
671
698
  </Layout>
672
699
  )
673
700
  }
674
701
 
675
- function ShortcutHelp({ onClose }: { onClose: () => void }) {
702
+ function ShortcutHelp({ open, onClose }: { open: boolean; onClose: () => void }) {
676
703
  return (
677
- <div
678
- className="fixed inset-0 z-100 flex items-center justify-center bg-black/50"
679
- onClick={(e) => {
680
- if (e.target === e.currentTarget) onClose()
681
- }}
682
- >
683
- <div className="bg-card text-card-foreground border-border mx-4 w-full max-w-sm rounded-xl border p-6 shadow-2xl">
684
- <h3 className="mb-4 text-lg font-semibold">Keyboard Shortcuts</h3>
685
- <div className="space-y-3 text-sm">
686
- {[
687
- ['⌘ K', 'Open search'],
688
- ['⌘ S', 'Save document'],
689
- ['⌘ /', 'Toggle this help'],
690
- ['Esc', 'Close panel / modal'],
691
- ].map(([key, desc]) => (
692
- <div key={key} className="flex items-center justify-between">
693
- <span className="text-muted-foreground">{desc}</span>
694
- <kbd className="bg-muted rounded px-2 py-1 font-mono text-xs">{key}</kbd>
695
- </div>
696
- ))}
697
- </div>
698
- <button
699
- onClick={onClose}
700
- 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"
701
710
  >
702
- Close
703
- </button>
704
- </div>
705
- </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>
706
736
  )
707
737
  }
708
738
 
@@ -789,38 +819,10 @@ function useAdminPageTitle(config: any, currentPath: string) {
789
819
  // value doesn't change on every render.
790
820
  const EMPTY_RENDERERS: AdminSectionRendererMap = {}
791
821
 
792
- const ISOLATION_STYLE: React.CSSProperties = {
793
- position: 'fixed',
794
- inset: '0',
795
- zIndex: 50,
796
- overflow: 'auto',
797
- isolation: 'isolate',
798
- }
799
-
800
822
  export function AdminRoot(props: AdminRootProps) {
801
823
  const defaultDarkMode = props.config?.admin?.branding?.darkMode
802
824
 
803
- // The admin is private application UI and must never be indexed. Ensure a
804
- // `noindex, nofollow` robots meta tag is present while the admin is mounted,
805
- // as defense-in-depth alongside the server `robots.txt` Disallow rule. This
806
- // covers every consumer install (the admin page is typically a client
807
- // component that can't export Next.js route metadata).
808
- useEffect(() => {
809
- if (typeof document === 'undefined') return
810
- const PREV = document.querySelector<HTMLMetaElement>('meta[name="robots"]')
811
- const prevContent = PREV?.getAttribute('content') ?? null
812
- const meta = PREV ?? document.createElement('meta')
813
- meta.setAttribute('name', 'robots')
814
- meta.setAttribute('content', 'noindex, nofollow')
815
- if (!PREV) document.head.appendChild(meta)
816
- return () => {
817
- if (prevContent === null) {
818
- meta.remove()
819
- } else {
820
- meta.setAttribute('content', prevContent)
821
- }
822
- }
823
- }, [])
825
+ useRobotsNoIndex()
824
826
 
825
827
  return (
826
828
  <div style={ISOLATION_STYLE} className="actuate-admin">