@actuate-media/cms-admin 0.76.6 → 0.77.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/__tests__/lib/preview-link.test.d.ts +2 -0
  3. package/dist/__tests__/lib/preview-link.test.d.ts.map +1 -0
  4. package/dist/__tests__/lib/preview-link.test.js +27 -0
  5. package/dist/__tests__/lib/preview-link.test.js.map +1 -0
  6. package/dist/__tests__/views/editor-top-bar.render.test.js +19 -0
  7. package/dist/__tests__/views/editor-top-bar.render.test.js.map +1 -1
  8. package/dist/__tests__/views/form-editor.render.test.d.ts +2 -0
  9. package/dist/__tests__/views/form-editor.render.test.d.ts.map +1 -0
  10. package/dist/__tests__/views/form-editor.render.test.js +146 -0
  11. package/dist/__tests__/views/form-editor.render.test.js.map +1 -0
  12. package/dist/actuate-admin.css +1 -1
  13. package/dist/lib/forms-service.d.ts +15 -3
  14. package/dist/lib/forms-service.d.ts.map +1 -1
  15. package/dist/lib/forms-service.js.map +1 -1
  16. package/dist/lib/preview-link.d.ts +7 -0
  17. package/dist/lib/preview-link.d.ts.map +1 -1
  18. package/dist/lib/preview-link.js +16 -0
  19. package/dist/lib/preview-link.js.map +1 -1
  20. package/dist/views/FormEditor.d.ts.map +1 -1
  21. package/dist/views/FormEditor.js +211 -116
  22. package/dist/views/FormEditor.js.map +1 -1
  23. package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
  24. package/dist/views/page-editor/EditorTopBar.js +6 -1
  25. package/dist/views/page-editor/EditorTopBar.js.map +1 -1
  26. package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
  27. package/dist/views/page-editor/PageSectionEditor.js +14 -1
  28. package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
  29. package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
  30. package/dist/views/post-editor/PostSectionEditor.js +11 -1
  31. package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
  32. package/package.json +9 -9
  33. package/src/__tests__/lib/preview-link.test.ts +39 -0
  34. package/src/__tests__/views/editor-top-bar.render.test.tsx +22 -0
  35. package/src/__tests__/views/form-editor.render.test.tsx +186 -0
  36. package/src/lib/forms-service.ts +16 -1
  37. package/src/lib/preview-link.ts +21 -0
  38. package/src/views/FormEditor.tsx +655 -510
  39. package/src/views/page-editor/EditorTopBar.tsx +11 -4
  40. package/src/views/page-editor/PageSectionEditor.tsx +18 -0
  41. package/src/views/post-editor/PostSectionEditor.tsx +15 -0
@@ -27,6 +27,13 @@ export interface PublicPreviewUrlParts {
27
27
  * public route can drop the `PUBLISHED` filter for this one document.
28
28
  */
29
29
  export declare function buildPublicPreviewUrl({ siteUrl, urlPrefix, slug, token, }: PublicPreviewUrlParts): string;
30
+ /**
31
+ * Build the public **live** URL for a document — the same path as
32
+ * {@link buildPublicPreviewUrl} but WITHOUT a preview token, so it opens the
33
+ * published version rather than a draft. Home-style slugs (`home` / `index` /
34
+ * empty) collapse to `/`, matching how the resolver serves the site root.
35
+ */
36
+ export declare function buildPublicUrl({ siteUrl, urlPrefix, slug, }: Omit<PublicPreviewUrlParts, 'token'>): string;
30
37
  /** Resolve the public site origin: explicit config first, else the current tab's origin. */
31
38
  export declare function resolveSiteUrl(configSiteUrl?: string | null): string;
32
39
  //# sourceMappingURL=preview-link.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"preview-link.d.ts","sourceRoot":"","sources":["../../src/lib/preview-link.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAYrE;AAED,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAA;IACf,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EACP,SAAS,EACT,IAAI,EACJ,KAAK,GACN,EAAE,qBAAqB,GAAG,MAAM,CAMhC;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIpE"}
1
+ {"version":3,"file":"preview-link.d.ts","sourceRoot":"","sources":["../../src/lib/preview-link.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAYrE;AAED,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAA;IACf,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EACP,SAAS,EACT,IAAI,EACJ,KAAK,GACN,EAAE,qBAAqB,GAAG,MAAM,CAMhC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,EACT,IAAI,GACL,EAAE,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC,GAAG,MAAM,CAS/C;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIpE"}
@@ -29,6 +29,22 @@ export function buildPublicPreviewUrl({ siteUrl, urlPrefix, slug, token, }) {
29
29
  const path = prefix ? `/${prefix}/${cleanSlug}` : `/${cleanSlug}`;
30
30
  return `${base}${path}?preview=${encodeURIComponent(token)}`;
31
31
  }
32
+ /**
33
+ * Build the public **live** URL for a document — the same path as
34
+ * {@link buildPublicPreviewUrl} but WITHOUT a preview token, so it opens the
35
+ * published version rather than a draft. Home-style slugs (`home` / `index` /
36
+ * empty) collapse to `/`, matching how the resolver serves the site root.
37
+ */
38
+ export function buildPublicUrl({ siteUrl, urlPrefix, slug, }) {
39
+ const base = (siteUrl ?? '').replace(/\/+$/, '');
40
+ const cleanSlug = slug.replace(/^\/+|\/+$/g, '');
41
+ if (cleanSlug === '' || cleanSlug === 'home' || cleanSlug === 'index') {
42
+ return base || '/';
43
+ }
44
+ const prefix = (urlPrefix ?? '').replace(/^\/+|\/+$/g, '');
45
+ const path = prefix ? `/${prefix}/${cleanSlug}` : `/${cleanSlug}`;
46
+ return `${base}${path}`;
47
+ }
32
48
  /** Resolve the public site origin: explicit config first, else the current tab's origin. */
33
49
  export function resolveSiteUrl(configSiteUrl) {
34
50
  if (configSiteUrl && configSiteUrl.trim())
@@ -1 +1 @@
1
- {"version":3,"file":"preview-link.js","sourceRoot":"","sources":["../../src/lib/preview-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,UAAkB,EAClB,UAAmB;IAEnB,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,gBAAgB,EAChB;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;KAC7D,CACF,CAAA;IACD,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,gCAAgC,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAA;AACjB,CAAC;AAaD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,EACpC,OAAO,EACP,SAAS,EACT,IAAI,EACJ,KAAK,GACiB;IACtB,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAA;IACjE,OAAO,GAAG,IAAI,GAAG,IAAI,YAAY,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAA;AAC9D,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,cAAc,CAAC,aAA6B;IAC1D,IAAI,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE;QAAE,OAAO,aAAa,CAAC,IAAI,EAAE,CAAA;IACtE,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAA;IAChE,OAAO,EAAE,CAAA;AACX,CAAC"}
1
+ {"version":3,"file":"preview-link.js","sourceRoot":"","sources":["../../src/lib/preview-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,UAAkB,EAClB,UAAmB;IAEnB,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,gBAAgB,EAChB;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;KAC7D,CACF,CAAA;IACD,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,gCAAgC,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAA;AACjB,CAAC;AAaD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,EACpC,OAAO,EACP,SAAS,EACT,IAAI,EACJ,KAAK,GACiB;IACtB,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAA;IACjE,OAAO,GAAG,IAAI,GAAG,IAAI,YAAY,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAA;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,EACT,IAAI,GACiC;IACrC,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;IAChD,IAAI,SAAS,KAAK,EAAE,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACtE,OAAO,IAAI,IAAI,GAAG,CAAA;IACpB,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAA;IACjE,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,CAAA;AACzB,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,cAAc,CAAC,aAA6B;IAC1D,IAAI,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE;QAAE,OAAO,aAAa,CAAC,IAAI,EAAE,CAAA;IACtE,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAA;IAChE,OAAO,EAAE,CAAA;AACX,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"FormEditor.d.ts","sourceRoot":"","sources":["../../src/views/FormEditor.tsx"],"names":[],"mappings":"AA6DA,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,eAAe,2CAohBjE"}
1
+ {"version":3,"file":"FormEditor.d.ts","sourceRoot":"","sources":["../../src/views/FormEditor.tsx"],"names":[],"mappings":"AAwFA,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,eAAe,2CAKjE"}
@@ -1,131 +1,226 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState, useCallback, useEffect } from 'react';
4
- import { Save, ArrowLeft, Plus, Trash2, GripVertical, MessageSquare, ExternalLink, BarChart3, ChevronDown, ChevronRight, Loader2, } from 'lucide-react';
5
- import { useApiData } from '../lib/useApiData.js';
6
- import { cmsApi } from '../lib/api.js';
3
+ /**
4
+ * Full-page form editor the canonical place to configure everything about a
5
+ * form. Backed entirely by the typed Forms API (`lib/forms-service.ts`), the
6
+ * same backend as the Forms list's inline Schema pane, so the two surfaces can
7
+ * never drift:
8
+ *
9
+ * - Details → name / description / status + post-submit confirmation
10
+ * (`PATCH /forms/:id` — `successMessage` / `redirectUrl`,
11
+ * which the public submission pipeline actually reads)
12
+ * - Fields → versioned schema editor (`PUT /forms/:id/schema`)
13
+ * - Notifications→ shared NotificationsPanel (`/forms/:id/notifications`)
14
+ * - Analytics → GA4 event tracking config (persisted on the definition,
15
+ * exposed on the public schema, fired by `<ActuateForm>`)
16
+ * - Embed → shared EmbedPanel (endpoints, snippet, allowed domains)
17
+ * - Integrations → shared WebhooksPanel (signed CRM/Zapier webhooks)
18
+ *
19
+ * New forms get a focused create screen (details + starting fields); saving
20
+ * routes into this editor so notifications/embed/webhooks — which need a form
21
+ * id — are one click away.
22
+ */
23
+ import * as Tabs from '@radix-ui/react-tabs';
24
+ import { ArrowLeft, ExternalLink, Inbox, Loader2, MessageSquare, Save } from 'lucide-react';
25
+ import { useCallback, useEffect, useState } from 'react';
26
+ import { toast } from 'sonner';
27
+ import { EmbedPanel } from '../components/forms/EmbedPanel.js';
28
+ import { FieldsPanel } from '../components/forms/FieldsPanel.js';
29
+ import { NotificationsPanel } from '../components/forms/NotificationsPanel.js';
30
+ import { WebhooksPanel } from '../components/forms/WebhooksPanel.js';
31
+ import { FormStatusBadge, FormsErrorState, FormsLoading, btnPrimary, btnSecondary, } from '../components/forms/primitives.js';
7
32
  import { Toggle } from '../components/ui/Toggle.js';
8
- const FIELD_TYPES = [
9
- { value: 'text', label: 'Text' },
10
- { value: 'email', label: 'Email' },
11
- { value: 'tel', label: 'Phone' },
12
- { value: 'textarea', label: 'Textarea' },
13
- { value: 'select', label: 'Dropdown' },
14
- { value: 'checkbox', label: 'Checkbox' },
15
- { value: 'number', label: 'Number' },
16
- { value: 'date', label: 'Date' },
17
- { value: 'url', label: 'URL' },
18
- { value: 'file', label: 'File Upload' },
19
- { value: 'hidden', label: 'Hidden' },
33
+ import { emitFormsChanged } from '../lib/forms-events.js';
34
+ import { createForm, fetchFormById, fetchFormSchema, saveFormSchema, updateForm, } from '../lib/forms-service.js';
35
+ import { useNavigationBlocker } from '../router/index.js';
36
+ const inputCls = 'border-border bg-input-background text-foreground focus-visible:ring-ring w-full rounded-lg border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none';
37
+ const TABS = [
38
+ { id: 'details', label: 'Details' },
39
+ { id: 'fields', label: 'Fields' },
40
+ { id: 'notifications', label: 'Notifications' },
41
+ { id: 'analytics', label: 'Analytics' },
42
+ { id: 'embed', label: 'Embed' },
43
+ { id: 'integrations', label: 'Integrations' },
20
44
  ];
45
+ function detailsFromForm(form) {
46
+ return {
47
+ name: form.name,
48
+ description: form.description ?? '',
49
+ status: form.status,
50
+ // The submission pipeline redirects whenever redirectUrl is non-empty,
51
+ // otherwise it shows successMessage — mirror that decision here.
52
+ confirmationType: form.redirectUrl?.trim() ? 'redirect' : 'message',
53
+ successMessage: form.successMessage ?? '',
54
+ redirectUrl: form.redirectUrl ?? '',
55
+ };
56
+ }
57
+ const DEFAULT_ANALYTICS = { enabled: false };
21
58
  export function FormEditor({ formId, onNavigate }) {
22
- const isNew = !formId;
23
- const { data: existingForm, loading } = useApiData(formId ? `/collections/forms/${formId}` : null);
24
- const [name, setName] = useState('');
25
- const [description, setDescription] = useState('');
26
- const [status, setStatus] = useState('active');
59
+ if (!formId) {
60
+ return _jsx(NewFormEditor, { onNavigate: onNavigate });
61
+ }
62
+ return _jsx(ExistingFormEditor, { formId: formId, onNavigate: onNavigate });
63
+ }
64
+ // ─── Existing form ─────────────────────────────────────────────────────────
65
+ function ExistingFormEditor({ formId, onNavigate, }) {
66
+ const [form, setForm] = useState(null);
67
+ const [loading, setLoading] = useState(true);
68
+ const [error, setError] = useState(null);
69
+ const [tab, setTab] = useState('details');
70
+ const [details, setDetails] = useState(null);
71
+ const [detailsDirty, setDetailsDirty] = useState(false);
72
+ const [savingDetails, setSavingDetails] = useState(false);
27
73
  const [fields, setFields] = useState([]);
28
- const [saving, setSaving] = useState(false);
29
- const [expandedSection, setExpandedSection] = useState('fields');
30
- const [confirmation, setConfirmation] = useState({
31
- type: 'message',
32
- message: 'Thank you! Your submission has been received.',
33
- redirectUrl: '',
34
- redirectDelay: 0,
35
- });
36
- const [analytics, setAnalytics] = useState({
37
- enabled: false,
38
- measurementId: '',
39
- submitEventName: 'form_submit',
40
- startEventName: 'form_start',
41
- trackAsConversion: false,
42
- conversionValue: 0,
43
- conversionCurrency: 'USD',
44
- customParameters: {},
45
- });
46
- useEffect(() => {
47
- if (existingForm) {
48
- const d = existingForm.data ?? existingForm;
49
- setName(d.name ?? '');
50
- setDescription(d.description ?? '');
51
- setStatus(d.status ?? 'active');
52
- if (Array.isArray(d.fields))
53
- setFields(d.fields);
54
- if (d.confirmation) {
55
- setConfirmation((prev) => ({ ...prev, ...d.confirmation }));
56
- }
57
- if (d.analytics) {
58
- setAnalytics((prev) => ({ ...prev, ...d.analytics }));
59
- }
60
- }
61
- }, [existingForm]);
62
- const addField = useCallback((type) => {
63
- setFields((prev) => [
64
- ...prev,
65
- {
66
- id: crypto.randomUUID(),
67
- type,
68
- label: `New ${type} field`,
69
- required: false,
70
- },
71
- ]);
72
- }, []);
73
- const removeField = useCallback((id) => {
74
- setFields((prev) => prev.filter((f) => f.id !== id));
75
- }, []);
76
- const updateField = useCallback((id, updates) => {
77
- setFields((prev) => prev.map((f) => (f.id === id ? { ...f, ...updates } : f)));
78
- }, []);
79
- const moveField = useCallback((from, to) => {
80
- setFields((prev) => {
81
- const next = [...prev];
82
- const [moved] = next.splice(from, 1);
83
- next.splice(to, 0, moved);
84
- return next;
85
- });
86
- }, []);
87
- const handleSave = async () => {
88
- setSaving(true);
74
+ const [fieldsDirty, setFieldsDirty] = useState(false);
75
+ const [savingFields, setSavingFields] = useState(false);
76
+ const [analytics, setAnalytics] = useState(DEFAULT_ANALYTICS);
77
+ const [analyticsDirty, setAnalyticsDirty] = useState(false);
78
+ const [savingAnalytics, setSavingAnalytics] = useState(false);
79
+ useNavigationBlocker(detailsDirty || fieldsDirty || analyticsDirty);
80
+ const load = useCallback(async () => {
81
+ setLoading(true);
82
+ setError(null);
89
83
  try {
90
- const payload = {
91
- name,
92
- description,
93
- status,
94
- fields,
95
- confirmation,
96
- analytics: analytics.enabled ? analytics : { enabled: false },
97
- };
98
- if (isNew) {
99
- await cmsApi('/collections/forms', {
100
- method: 'POST',
101
- body: JSON.stringify(payload),
102
- });
84
+ const [loaded, schema] = await Promise.all([fetchFormById(formId), fetchFormSchema(formId)]);
85
+ if (!loaded) {
86
+ setError('Form not found');
87
+ return;
103
88
  }
104
- else {
105
- await cmsApi(`/collections/forms/${formId}`, {
106
- method: 'PUT',
107
- body: JSON.stringify(payload),
108
- });
109
- }
110
- onNavigate?.('/forms');
89
+ setForm(loaded);
90
+ setDetails(detailsFromForm(loaded));
91
+ setAnalytics(loaded.analytics ?? DEFAULT_ANALYTICS);
92
+ setFields(schema.fields);
93
+ setDetailsDirty(false);
94
+ setFieldsDirty(false);
95
+ setAnalyticsDirty(false);
96
+ }
97
+ catch (e) {
98
+ setError(e instanceof Error ? e.message : 'Failed to load form');
111
99
  }
112
100
  finally {
113
- setSaving(false);
101
+ setLoading(false);
114
102
  }
115
- };
116
- const toggleSection = (section) => {
117
- setExpandedSection(expandedSection === section ? null : section);
118
- };
103
+ }, [formId]);
104
+ useEffect(() => {
105
+ void load();
106
+ }, [load]);
107
+ function patchDetails(patch) {
108
+ setDetails((cur) => (cur ? { ...cur, ...patch } : cur));
109
+ setDetailsDirty(true);
110
+ }
111
+ function patchAnalytics(patch) {
112
+ setAnalytics((cur) => ({ ...cur, ...patch }));
113
+ setAnalyticsDirty(true);
114
+ }
115
+ async function saveDetails() {
116
+ if (!details)
117
+ return;
118
+ setSavingDetails(true);
119
+ const res = await updateForm(formId, {
120
+ name: details.name,
121
+ description: details.description,
122
+ status: details.status,
123
+ successMessage: details.successMessage,
124
+ // Message mode must clear the URL — a non-empty redirectUrl always wins
125
+ // in the submission pipeline.
126
+ redirectUrl: details.confirmationType === 'redirect' ? details.redirectUrl : '',
127
+ });
128
+ setSavingDetails(false);
129
+ if (res.error) {
130
+ toast.error(res.error);
131
+ return;
132
+ }
133
+ if (res.data) {
134
+ setForm(res.data);
135
+ setDetails(detailsFromForm(res.data));
136
+ }
137
+ setDetailsDirty(false);
138
+ toast.success('Form details saved.');
139
+ emitFormsChanged();
140
+ }
141
+ async function saveFields() {
142
+ setSavingFields(true);
143
+ const res = await saveFormSchema(formId, fields.map((f, i) => ({ ...f, sortOrder: i })));
144
+ setSavingFields(false);
145
+ if (res.error) {
146
+ toast.error(res.error);
147
+ return;
148
+ }
149
+ setFieldsDirty(false);
150
+ toast.success('Schema saved.');
151
+ emitFormsChanged();
152
+ }
153
+ async function saveAnalytics() {
154
+ setSavingAnalytics(true);
155
+ const res = await updateForm(formId, { analytics });
156
+ setSavingAnalytics(false);
157
+ if (res.error) {
158
+ toast.error(res.error);
159
+ return;
160
+ }
161
+ if (res.data)
162
+ setAnalytics(res.data.analytics ?? { enabled: false });
163
+ setAnalyticsDirty(false);
164
+ toast.success('Analytics settings saved.');
165
+ }
119
166
  if (loading) {
120
- return (_jsx("div", { className: "flex h-64 items-center justify-center p-4", children: _jsx(Loader2, { className: "text-primary h-6 w-6 animate-spin" }) }));
167
+ return (_jsx("div", { className: "max-w-4xl p-3 pr-6 sm:p-4 sm:pr-8", children: _jsx(FormsLoading, { label: "Loading form\u2026" }) }));
168
+ }
169
+ if (error || !form || !details) {
170
+ return (_jsx("div", { className: "max-w-4xl p-3 pr-6 sm:p-4 sm:pr-8", children: _jsx(FormsErrorState, { message: error ?? 'Form not found', onRetry: () => void load() }) }));
121
171
  }
122
- return (_jsxs("div", { className: "max-w-4xl p-3 pr-6 sm:p-4 sm:pr-8", children: [_jsxs("div", { className: "mb-6 flex items-center gap-3", children: [_jsx("button", { onClick: () => onNavigate?.('/forms'), className: "hover:bg-muted rounded-lg p-2 transition-colors", children: _jsx(ArrowLeft, { className: "text-muted-foreground h-5 w-5" }) }), _jsx("div", { className: "flex-1", children: _jsx("h1", { className: "text-foreground text-xl font-medium", children: isNew ? 'New Form' : 'Edit Form' }) }), _jsxs("button", { onClick: handleSave, disabled: saving || !name.trim(), className: "bg-primary text-primary-foreground hover:bg-primary/90 flex items-center gap-2 rounded-lg px-4 py-2 text-sm transition-colors disabled:opacity-50", children: [saving ? _jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : _jsx(Save, { className: "h-4 w-4" }), saving ? 'Saving...' : 'Save'] })] }), _jsx("div", { className: "border-border bg-card mb-4 rounded-lg border p-4", children: _jsxs("div", { className: "grid gap-4", children: [_jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Form Name" }), _jsx("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), placeholder: "e.g. Contact Form", className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Description" }), _jsx("input", { type: "text", value: description, onChange: (e) => setDescription(e.target.value), placeholder: "Brief description of this form", className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Status" }), _jsxs("select", { value: status, onChange: (e) => setStatus(e.target.value), className: "border-border focus-visible:ring-ring/50 rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none", children: [_jsx("option", { value: "active", children: "Active" }), _jsx("option", { value: "inactive", children: "Inactive" })] })] })] }) }), _jsxs("div", { className: "border-border bg-card mb-4 rounded-lg border", children: [_jsx("button", { onClick: () => toggleSection('fields'), className: "hover:bg-muted flex w-full items-center justify-between p-4 transition-colors", children: _jsxs("div", { className: "flex items-center gap-2", children: [expandedSection === 'fields' ? (_jsx(ChevronDown, { className: "h-4 w-4" })) : (_jsx(ChevronRight, { className: "h-4 w-4" })), _jsx("span", { className: "text-foreground font-medium", children: "Form Fields" }), _jsxs("span", { className: "text-muted-foreground text-sm", children: ["(", fields.length, ")"] })] }) }), expandedSection === 'fields' && (_jsxs("div", { className: "border-border border-t p-4", children: [_jsx("div", { className: "mb-4 flex flex-wrap gap-2", children: FIELD_TYPES.map((ft) => (_jsxs("button", { onClick: () => addField(ft.value), className: "border-border hover:bg-muted flex items-center gap-1 rounded-lg border px-3 py-1.5 text-xs transition-colors", children: [_jsx(Plus, { className: "h-3 w-3" }), " ", ft.label] }, ft.value))) }), fields.length === 0 ? (_jsx("p", { className: "text-muted-foreground py-6 text-center text-sm", children: "Click a field type above to add it to your form." })) : (_jsx("div", { className: "flex flex-col gap-2", children: fields.map((field, index) => (_jsxs("div", { draggable: true, onDragStart: (e) => e.dataTransfer.setData('text/plain', String(index)), onDragOver: (e) => e.preventDefault(), onDrop: (e) => {
123
- const from = Number(e.dataTransfer.getData('text/plain'));
124
- moveField(from, index);
125
- }, className: "border-border bg-muted hover:bg-card flex items-center gap-3 rounded-lg border p-3 transition-colors", children: [_jsx(GripVertical, { className: "text-muted-foreground h-4 w-4 shrink-0 cursor-grab" }), _jsx("input", { type: "text", value: field.label, onChange: (e) => updateField(field.id, { label: e.target.value }), className: "border-border focus-visible:ring-ring/50 flex-1 rounded border px-2 py-1 text-sm focus:ring-1 focus:outline-none" }), _jsx("span", { className: "bg-muted text-muted-foreground shrink-0 rounded px-2 py-0.5 text-xs", children: field.type }), _jsxs("label", { className: "text-muted-foreground flex shrink-0 items-center gap-1 text-xs", children: [_jsx("input", { type: "checkbox", checked: field.required, onChange: (e) => updateField(field.id, { required: e.target.checked }), className: "rounded" }), "Required"] }), _jsx("button", { onClick: () => removeField(field.id), className: "text-destructive hover:bg-destructive/10 shrink-0 rounded p-1 transition-colors", children: _jsx(Trash2, { className: "h-4 w-4" }) })] }, field.id))) }))] }))] }), _jsxs("div", { className: "border-border bg-card mb-4 rounded-lg border", children: [_jsx("button", { onClick: () => toggleSection('confirmation'), className: "hover:bg-muted flex w-full items-center justify-between p-4 transition-colors", children: _jsxs("div", { className: "flex items-center gap-2", children: [expandedSection === 'confirmation' ? (_jsx(ChevronDown, { className: "h-4 w-4" })) : (_jsx(ChevronRight, { className: "h-4 w-4" })), _jsx(MessageSquare, { className: "text-success h-4 w-4" }), _jsx("span", { className: "text-foreground font-medium", children: "Confirmation" }), _jsx("span", { className: "bg-muted text-muted-foreground rounded px-2 py-0.5 text-xs", children: confirmation.type === 'message' ? 'Show Message' : 'Redirect' })] }) }), expandedSection === 'confirmation' && (_jsxs("div", { className: "border-border border-t p-4", children: [_jsxs("div", { className: "mb-4", children: [_jsx("label", { className: "text-foreground mb-2 block text-sm font-medium", children: "After submission" }), _jsxs("div", { className: "flex gap-3", children: [_jsxs("label", { className: `flex cursor-pointer items-center gap-2 rounded-lg border px-4 py-2 transition-colors ${confirmation.type === 'message'
126
- ? 'border-primary bg-accent'
127
- : 'border-border hover:bg-muted bg-transparent'}`, children: [_jsx("input", { type: "radio", name: "confirmationType", value: "message", checked: confirmation.type === 'message', onChange: () => setConfirmation((c) => ({ ...c, type: 'message' })), className: "text-primary" }), _jsx(MessageSquare, { className: "h-4 w-4" }), _jsx("span", { className: "text-sm", children: "Show Message" })] }), _jsxs("label", { className: `flex cursor-pointer items-center gap-2 rounded-lg border px-4 py-2 transition-colors ${confirmation.type === 'redirect'
128
- ? 'border-primary bg-accent'
129
- : 'border-border hover:bg-muted bg-transparent'}`, children: [_jsx("input", { type: "radio", name: "confirmationType", value: "redirect", checked: confirmation.type === 'redirect', onChange: () => setConfirmation((c) => ({ ...c, type: 'redirect' })), className: "text-primary" }), _jsx(ExternalLink, { className: "h-4 w-4" }), _jsx("span", { className: "text-sm", children: "Redirect to Page" })] })] })] }), confirmation.type === 'message' ? (_jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Success Message" }), _jsx("textarea", { value: confirmation.message, onChange: (e) => setConfirmation((c) => ({ ...c, message: e.target.value })), rows: 3, className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none", placeholder: "Thank you! Your submission has been received." })] })) : (_jsxs("div", { className: "grid gap-3", children: [_jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Redirect URL" }), _jsx("input", { type: "url", value: confirmation.redirectUrl, onChange: (e) => setConfirmation((c) => ({ ...c, redirectUrl: e.target.value })), placeholder: "https://example.com/thank-you", className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Redirect Delay (ms)" }), _jsx("input", { type: "number", value: confirmation.redirectDelay, onChange: (e) => setConfirmation((c) => ({ ...c, redirectDelay: Number(e.target.value) })), min: 0, step: 500, className: "border-border focus-visible:ring-ring/50 w-32 rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: "0 = instant redirect" })] })] }))] }))] }), _jsxs("div", { className: "border-border bg-card mb-4 rounded-lg border", children: [_jsx("button", { onClick: () => toggleSection('analytics'), className: "hover:bg-muted flex w-full items-center justify-between p-4 transition-colors", children: _jsxs("div", { className: "flex items-center gap-2", children: [expandedSection === 'analytics' ? (_jsx(ChevronDown, { className: "h-4 w-4" })) : (_jsx(ChevronRight, { className: "h-4 w-4" })), _jsx(BarChart3, { className: "text-brand h-4 w-4" }), _jsx("span", { className: "text-foreground font-medium", children: "GA4 Analytics" }), _jsx("span", { className: `rounded px-2 py-0.5 text-xs ${analytics.enabled ? 'bg-success/10 text-success' : 'bg-muted text-muted-foreground'}`, children: analytics.enabled ? 'Enabled' : 'Disabled' })] }) }), expandedSection === 'analytics' && (_jsxs("div", { className: "border-border border-t p-4", children: [_jsxs("div", { className: "mb-4 flex items-center gap-3", children: [_jsx(Toggle, { checked: analytics.enabled, onCheckedChange: (v) => setAnalytics((a) => ({ ...a, enabled: v })), "aria-label": "Push events to Google Analytics 4" }), _jsx("span", { className: "text-foreground text-sm font-medium", children: "Push events to Google Analytics 4" })] }), analytics.enabled && (_jsxs("div", { className: "grid gap-4 pl-12", children: [_jsxs("div", { children: [_jsxs("label", { className: "text-foreground mb-1 block text-sm font-medium", children: ["GA4 Measurement ID", _jsx("span", { className: "text-muted-foreground font-normal", children: " (optional)" })] }), _jsx("input", { type: "text", value: analytics.measurementId, onChange: (e) => setAnalytics((a) => ({ ...a, measurementId: e.target.value })), placeholder: "G-XXXXXXXXXX", className: "border-border focus-visible:ring-ring/50 w-64 rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: "Leave blank to use your site's default GA4 tag" })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Submit Event Name" }), _jsx("input", { type: "text", value: analytics.submitEventName, onChange: (e) => setAnalytics((a) => ({ ...a, submitEventName: e.target.value })), className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Start Event Name" }), _jsx("input", { type: "text", value: analytics.startEventName, onChange: (e) => setAnalytics((a) => ({ ...a, startEventName: e.target.value })), className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] })] }), _jsxs("div", { className: "border-border border-t pt-4", children: [_jsxs("div", { className: "mb-3 flex items-center gap-3", children: [_jsx("input", { type: "checkbox", id: "trackConversion", checked: analytics.trackAsConversion, onChange: (e) => setAnalytics((a) => ({ ...a, trackAsConversion: e.target.checked })), className: "rounded" }), _jsx("label", { htmlFor: "trackConversion", className: "text-foreground text-sm font-medium", children: "Track as conversion event" })] }), analytics.trackAsConversion && (_jsxs("div", { className: "ml-6 grid grid-cols-2 gap-4", children: [_jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Conversion Value" }), _jsx("input", { type: "number", value: analytics.conversionValue, onChange: (e) => setAnalytics((a) => ({ ...a, conversionValue: Number(e.target.value) })), min: 0, step: 0.01, className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Currency" }), _jsxs("select", { value: analytics.conversionCurrency, onChange: (e) => setAnalytics((a) => ({ ...a, conversionCurrency: e.target.value })), className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none", children: [_jsx("option", { value: "USD", children: "USD" }), _jsx("option", { value: "EUR", children: "EUR" }), _jsx("option", { value: "GBP", children: "GBP" }), _jsx("option", { value: "CAD", children: "CAD" }), _jsx("option", { value: "AUD", children: "AUD" })] })] })] }))] }), _jsx("div", { className: "border-info/30 bg-info/10 rounded-lg border p-3", children: _jsxs("p", { className: "text-foreground text-xs", children: [_jsx("strong", { children: "Note:" }), " Your site must have the GA4 snippet or GTM container installed. Actuate pushes events via", ' ', _jsx("code", { className: "bg-info/10 rounded px-1", children: "gtag()" }), " /", _jsx("code", { className: "bg-info/10 rounded px-1", children: "dataLayer" }), " \u2014 it does not load the GA4 script."] }) })] }))] }))] })] }));
172
+ return (_jsxs("div", { className: "max-w-4xl p-3 pr-6 sm:p-4 sm:pr-8", children: [_jsxs("div", { className: "mb-6 flex items-center gap-3", children: [_jsx("button", { onClick: () => onNavigate?.('/forms'), "aria-label": "Back to forms", className: "hover:bg-muted focus-visible:ring-ring rounded-lg p-2 transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(ArrowLeft, { className: "text-muted-foreground h-5 w-5", "aria-hidden": true }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("h1", { className: "text-foreground truncate text-xl font-medium", children: form.name }), _jsx(FormStatusBadge, { status: form.status })] }), _jsxs("p", { className: "text-muted-foreground truncate font-mono text-xs", children: ["/", form.slug] })] }), _jsxs("button", { onClick: () => onNavigate?.(`/forms/${formId}/submissions`), className: btnSecondary, children: [_jsx(Inbox, { className: "h-4 w-4", "aria-hidden": true }), "View Entries"] })] }), _jsxs(Tabs.Root, { value: tab, onValueChange: setTab, children: [_jsx(Tabs.List, { className: "border-border mb-4 flex gap-0.5 overflow-x-auto border-b", "aria-label": "Form settings sections", children: TABS.map((t) => (_jsx(Tabs.Trigger, { value: t.id, className: "text-muted-foreground hover:text-foreground focus-visible:ring-ring data-[state=active]:border-primary data-[state=active]:text-foreground -mb-px border-b-2 border-transparent px-3 py-2 text-sm font-medium whitespace-nowrap transition-colors focus-visible:ring-2 focus-visible:outline-none", children: t.label }, t.id))) }), _jsx(Tabs.Content, { value: "details", tabIndex: -1, children: _jsx(DetailsTab, { details: details, onPatch: patchDetails, onSave: () => void saveDetails(), saving: savingDetails }) }), _jsx(Tabs.Content, { value: "fields", tabIndex: -1, children: _jsxs("div", { className: "border-border bg-card space-y-4 rounded-lg border p-4", children: [_jsx(FieldsPanel, { fields: fields, onChange: (next) => {
173
+ setFields(next);
174
+ setFieldsDirty(true);
175
+ }, hasSubmissions: (form.totalEntries ?? 0) > 0 }), _jsx("div", { className: "flex justify-end", children: _jsxs("button", { className: btnPrimary, onClick: () => void saveFields(), disabled: savingFields || !fieldsDirty, children: [savingFields ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(Save, { className: "h-4 w-4", "aria-hidden": true })), savingFields ? 'Saving…' : 'Save Schema'] }) })] }) }), _jsx(Tabs.Content, { value: "notifications", tabIndex: -1, children: _jsx("div", { className: "border-border bg-card rounded-lg border p-4", children: _jsx(NotificationsPanel, { formId: formId }) }) }), _jsx(Tabs.Content, { value: "analytics", tabIndex: -1, children: _jsx(AnalyticsTab, { analytics: analytics, onPatch: patchAnalytics, onSave: () => void saveAnalytics(), saving: savingAnalytics }) }), _jsx(Tabs.Content, { value: "embed", tabIndex: -1, children: _jsx("div", { className: "border-border bg-card rounded-lg border p-4", children: _jsx(EmbedPanel, { formId: formId, slug: form.slug, status: form.status }) }) }), _jsx(Tabs.Content, { value: "integrations", tabIndex: -1, children: _jsx("div", { className: "border-border bg-card rounded-lg border p-4", children: _jsx(WebhooksPanel, { formId: formId, formSlug: form.slug }) }) })] })] }));
176
+ }
177
+ // ─── Details tab ────────────────────────────────────────────────────────────
178
+ function DetailsTab({ details, onPatch, onSave, saving, }) {
179
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { className: "border-border bg-card rounded-lg border p-4", children: _jsxs("div", { className: "grid gap-4", children: [_jsx(Field, { label: "Form Name", children: _jsx("input", { type: "text", value: details.name, onChange: (e) => onPatch({ name: e.target.value }), placeholder: "e.g. Contact Form", className: inputCls }) }), _jsx(Field, { label: "Description", children: _jsx("input", { type: "text", value: details.description, onChange: (e) => onPatch({ description: e.target.value }), placeholder: "Brief description of this form", className: inputCls }) }), _jsx(Field, { label: "Status", hint: "Only active forms accept submissions; archived forms are hidden from embed pickers.", children: _jsxs("select", { value: details.status, onChange: (e) => onPatch({ status: e.target.value }), className: "border-border bg-input-background text-foreground focus-visible:ring-ring rounded-lg border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none", children: [_jsx("option", { value: "active", children: "Active" }), _jsx("option", { value: "draft", children: "Draft" }), _jsx("option", { value: "archived", children: "Archived" })] }) })] }) }), _jsxs("div", { className: "border-border bg-card rounded-lg border p-4", children: [_jsx("h2", { className: "text-foreground mb-3 text-base font-medium", children: "Confirmation" }), _jsxs("fieldset", { className: "mb-4", children: [_jsx("legend", { className: "text-foreground mb-2 block text-sm font-medium", children: "After submission" }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsxs("label", { className: `flex cursor-pointer items-center gap-2 rounded-lg border px-4 py-2 transition-colors ${details.confirmationType === 'message'
180
+ ? 'border-primary bg-accent'
181
+ : 'border-border hover:bg-muted bg-transparent'}`, children: [_jsx("input", { type: "radio", name: "confirmationType", value: "message", checked: details.confirmationType === 'message', onChange: () => onPatch({ confirmationType: 'message' }), className: "text-primary" }), _jsx(MessageSquare, { className: "h-4 w-4", "aria-hidden": true }), _jsx("span", { className: "text-sm", children: "Show Message" })] }), _jsxs("label", { className: `flex cursor-pointer items-center gap-2 rounded-lg border px-4 py-2 transition-colors ${details.confirmationType === 'redirect'
182
+ ? 'border-primary bg-accent'
183
+ : 'border-border hover:bg-muted bg-transparent'}`, children: [_jsx("input", { type: "radio", name: "confirmationType", value: "redirect", checked: details.confirmationType === 'redirect', onChange: () => onPatch({ confirmationType: 'redirect' }), className: "text-primary" }), _jsx(ExternalLink, { className: "h-4 w-4", "aria-hidden": true }), _jsx("span", { className: "text-sm", children: "Redirect to Page" })] })] })] }), details.confirmationType === 'message' ? (_jsx(Field, { label: "Success Message", children: _jsx("textarea", { value: details.successMessage, onChange: (e) => onPatch({ successMessage: e.target.value }), rows: 3, placeholder: "Thank you! Your submission has been received.", className: inputCls }) })) : (_jsx(Field, { label: "Redirect URL", children: _jsx("input", { type: "url", value: details.redirectUrl, onChange: (e) => onPatch({ redirectUrl: e.target.value }), placeholder: "https://example.com/thank-you", className: inputCls }) }))] }), _jsx("div", { className: "flex justify-end", children: _jsxs("button", { className: btnPrimary, onClick: onSave, disabled: saving || !details.name.trim(), children: [saving ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(Save, { className: "h-4 w-4", "aria-hidden": true })), saving ? 'Saving…' : 'Save Details'] }) })] }));
184
+ }
185
+ // ─── Analytics tab ──────────────────────────────────────────────────────────
186
+ function AnalyticsTab({ analytics, onPatch, onSave, saving, }) {
187
+ return (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "border-border bg-card rounded-lg border p-4", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "text-foreground block text-sm font-medium", children: "Push events to Google Analytics 4" }), _jsx("span", { className: "text-muted-foreground block text-sm", children: "Fires form start, submit, and error events on the public site." })] }), _jsx(Toggle, { checked: analytics.enabled, onCheckedChange: (v) => onPatch({ enabled: v }), "aria-label": "Push events to Google Analytics 4" })] }), analytics.enabled && (_jsxs("div", { className: "mt-4 grid gap-4", children: [_jsx(Field, { label: "GA4 Measurement ID", hint: "Leave blank to use your site's default GA4 tag", children: _jsx("input", { type: "text", value: analytics.measurementId ?? '', onChange: (e) => onPatch({ measurementId: e.target.value }), placeholder: "G-XXXXXXXXXX", className: `${inputCls} max-w-64` }) }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsx(Field, { label: "Submit Event Name", children: _jsx("input", { type: "text", value: analytics.submitEventName ?? '', onChange: (e) => onPatch({ submitEventName: e.target.value }), placeholder: "form_submit", className: inputCls }) }), _jsx(Field, { label: "Start Event Name", children: _jsx("input", { type: "text", value: analytics.startEventName ?? '', onChange: (e) => onPatch({ startEventName: e.target.value }), placeholder: "form_start", className: inputCls }) })] }), _jsxs("div", { className: "border-border border-t pt-4", children: [_jsxs("div", { className: "mb-3 flex items-center gap-3", children: [_jsx("input", { type: "checkbox", id: "trackConversion", checked: analytics.trackAsConversion ?? false, onChange: (e) => onPatch({ trackAsConversion: e.target.checked }), className: "rounded" }), _jsx("label", { htmlFor: "trackConversion", className: "text-foreground text-sm font-medium", children: "Track as conversion event" })] }), analytics.trackAsConversion && (_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsx(Field, { label: "Conversion Value", children: _jsx("input", { type: "number", value: analytics.conversionValue ?? 0, onChange: (e) => onPatch({ conversionValue: Number(e.target.value) }), min: 0, step: 0.01, className: inputCls }) }), _jsx(Field, { label: "Currency", children: _jsxs("select", { value: analytics.conversionCurrency ?? 'USD', onChange: (e) => onPatch({ conversionCurrency: e.target.value }), className: inputCls, children: [_jsx("option", { value: "USD", children: "USD" }), _jsx("option", { value: "EUR", children: "EUR" }), _jsx("option", { value: "GBP", children: "GBP" }), _jsx("option", { value: "CAD", children: "CAD" }), _jsx("option", { value: "AUD", children: "AUD" })] }) })] }))] }), _jsx("div", { className: "border-info/30 bg-info/10 rounded-lg border p-3", children: _jsxs("p", { className: "text-foreground text-xs", children: [_jsx("strong", { children: "Note:" }), " Your site must have the GA4 snippet or GTM container installed. Actuate pushes events via", ' ', _jsx("code", { className: "bg-info/10 rounded px-1", children: "gtag()" }), " /", _jsx("code", { className: "bg-info/10 rounded px-1", children: "dataLayer" }), " \u2014 it does not load the GA4 script."] }) })] }))] }), _jsx("div", { className: "flex justify-end", children: _jsxs("button", { className: btnPrimary, onClick: onSave, disabled: saving, children: [saving ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(Save, { className: "h-4 w-4", "aria-hidden": true })), saving ? 'Saving…' : 'Save Analytics'] }) })] }));
188
+ }
189
+ // ─── New form ───────────────────────────────────────────────────────────────
190
+ function NewFormEditor({ onNavigate }) {
191
+ const [name, setName] = useState('');
192
+ const [description, setDescription] = useState('');
193
+ const [status, setStatus] = useState('active');
194
+ const [fields, setFields] = useState([]);
195
+ const [saving, setSaving] = useState(false);
196
+ const [dirty, setDirty] = useState(false);
197
+ useNavigationBlocker(dirty && !saving);
198
+ async function handleCreate() {
199
+ setSaving(true);
200
+ const res = await createForm({ name, description, status, fields });
201
+ setSaving(false);
202
+ if (res.error || !res.data) {
203
+ toast.error(res.error ?? 'Failed to create form');
204
+ return;
205
+ }
206
+ setDirty(false);
207
+ toast.success('Form created. Configure notifications, embed, and integrations here.');
208
+ emitFormsChanged();
209
+ onNavigate?.(`/forms/${res.data.id}/edit`);
210
+ }
211
+ return (_jsxs("div", { className: "max-w-4xl p-3 pr-6 sm:p-4 sm:pr-8", children: [_jsxs("div", { className: "mb-6 flex items-center gap-3", children: [_jsx("button", { onClick: () => onNavigate?.('/forms'), "aria-label": "Back to forms", className: "hover:bg-muted focus-visible:ring-ring rounded-lg p-2 transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(ArrowLeft, { className: "text-muted-foreground h-5 w-5", "aria-hidden": true }) }), _jsx("h1", { className: "text-foreground flex-1 text-xl font-medium", children: "New Form" }), _jsxs("button", { onClick: () => void handleCreate(), disabled: saving || !name.trim(), className: btnPrimary, children: [saving ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(Save, { className: "h-4 w-4", "aria-hidden": true })), saving ? 'Creating…' : 'Create Form'] })] }), _jsx("div", { className: "border-border bg-card mb-4 rounded-lg border p-4", children: _jsxs("div", { className: "grid gap-4", children: [_jsx(Field, { label: "Form Name", children: _jsx("input", { type: "text", value: name, onChange: (e) => {
212
+ setName(e.target.value);
213
+ setDirty(true);
214
+ }, placeholder: "e.g. Contact Form", className: inputCls }) }), _jsx(Field, { label: "Description", children: _jsx("input", { type: "text", value: description, onChange: (e) => {
215
+ setDescription(e.target.value);
216
+ setDirty(true);
217
+ }, placeholder: "Brief description of this form", className: inputCls }) }), _jsx(Field, { label: "Status", children: _jsxs("select", { value: status, onChange: (e) => setStatus(e.target.value), className: "border-border bg-input-background text-foreground focus-visible:ring-ring rounded-lg border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none", children: [_jsx("option", { value: "active", children: "Active" }), _jsx("option", { value: "draft", children: "Draft" })] }) })] }) }), _jsxs("div", { className: "border-border bg-card rounded-lg border p-4", children: [_jsx("h2", { className: "text-foreground mb-3 text-base font-medium", children: "Fields" }), _jsx(FieldsPanel, { fields: fields, onChange: (next) => {
218
+ setFields(next);
219
+ setDirty(true);
220
+ }, hasSubmissions: false })] }), _jsx("p", { className: "text-muted-foreground mt-4 text-sm", children: "Confirmation, notifications, analytics, embed, and integrations are configured after the form is created." })] }));
221
+ }
222
+ // ─── Shared bits ────────────────────────────────────────────────────────────
223
+ function Field({ label, hint, children, }) {
224
+ return (_jsxs("label", { className: "block", children: [_jsx("span", { className: "text-foreground mb-1 block text-sm font-medium", children: label }), children, hint && _jsx("span", { className: "text-muted-foreground mt-1 block text-xs", children: hint })] }));
130
225
  }
131
226
  //# sourceMappingURL=FormEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormEditor.js","sourceRoot":"","sources":["../../src/views/FormEditor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FormEditor.js","sourceRoot":"","sources":["../../src/views/FormEditor.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EditorTopBar.d.ts","sourceRoot":"","sources":["../../../src/views/page-editor/EditorTopBar.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAA;AAE7D,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,UAAU,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,kFAAkF;IAClF,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,6EAA6E;IAC7E,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,EAAE,UAAU,CAAA;IACpB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;IACnC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAA;IAChC,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,qFAAqF;IACrF,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAgBD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,EACT,UAAU,EACV,OAAO,EACP,UAAU,EACV,YAAmB,EACnB,qBAAqB,EACrB,QAAQ,EACR,SAAmB,EACnB,UAAU,EACV,MAAM,EACN,SAAS,EACT,YAAY,EACZ,SAAS,EACT,WAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,OAAe,EACf,QAAY,EACZ,WAAW,EACX,SAAS,EACT,UAAU,EACV,aAAoB,EACpB,WAAkB,EAClB,oBAA2B,EAC3B,eAAoB,GACrB,EAAE,iBAAiB,2CAgPnB"}
1
+ {"version":3,"file":"EditorTopBar.d.ts","sourceRoot":"","sources":["../../../src/views/page-editor/EditorTopBar.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAA;AAE7D,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,UAAU,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,kFAAkF;IAClF,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,6EAA6E;IAC7E,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,EAAE,UAAU,CAAA;IACpB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;IACnC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAA;IAChC,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,qFAAqF;IACrF,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAgBD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,EACT,UAAU,EACV,OAAO,EACP,UAAU,EACV,YAAmB,EACnB,qBAAqB,EACrB,QAAQ,EACR,SAAmB,EACnB,UAAU,EACV,MAAM,EACN,SAAS,EACT,YAAY,EACZ,SAAS,EACT,WAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,OAAe,EACf,QAAY,EACZ,WAAW,EACX,SAAS,EACT,UAAU,EACV,aAAoB,EACpB,WAAkB,EAClB,oBAA2B,EAC3B,eAAoB,GACrB,EAAE,iBAAiB,2CAuPnB"}
@@ -24,6 +24,9 @@ export function EditorTopBar({ title, status, dirty, saveState, publishing, canE
24
24
  const previewLabel = structural
25
25
  ? 'Preview structure (custom sections show placeholders)'
26
26
  : 'Preview page';
27
+ // For a published document the external-link button opens the LIVE page (no
28
+ // preview token); otherwise it opens a token-gated preview of the draft.
29
+ const isLive = status === 'PUBLISHED';
27
30
  const publishBlocked = !canPublish || !publishReady || publishing || saveState === 'saving';
28
31
  const publishTitle = publishing
29
32
  ? 'Publishing…'
@@ -66,7 +69,9 @@ export function EditorTopBar({ title, status, dirty, saveState, publishing, canE
66
69
  : 'Inline site preview — render the draft through your public site, in place', className: `rounded-lg p-2 transition-colors ${sitePreview
67
70
  ? 'bg-primary text-primary-foreground'
68
71
  : 'text-muted-foreground hover:text-foreground hover:bg-accent'}`, children: _jsx(Globe, { className: "h-4 w-4", "aria-hidden": true }) })), onViewOnSite &&
69
- (structural ? (_jsxs("button", { type: "button", onClick: onViewOnSite, title: "Open the draft on your public site \u2014 the real design preview", className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors", children: [_jsx(ExternalLink, { className: "h-3.5 w-3.5", "aria-hidden": true }), "View on site"] })) : (_jsx("button", { type: "button", onClick: onViewOnSite, "aria-label": "View draft on site", title: "View draft on site", className: "text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg p-2", children: _jsx(ExternalLink, { className: "h-4 w-4", "aria-hidden": true }) }))), _jsx("button", { type: "button", onClick: onSaveDraft, disabled: !canEdit || saveState === 'saving' || (!dirty && saveState !== 'error'), className: "border-border text-foreground hover:bg-accent rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: saveState === 'saving' ? 'Saving…' : 'Save Draft' }), onSchedule && (_jsxs("button", { type: "button", onClick: onSchedule, disabled: scheduleBlocked, title: scheduleTitle, "aria-label": scheduledAt ? 'Reschedule publish' : 'Schedule publish', className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(Calendar, { className: "h-3.5 w-3.5", "aria-hidden": true }), _jsx("span", { className: "hidden sm:inline", children: scheduledAt ? 'Reschedule' : 'Schedule' })] })), _jsxs("button", { type: "button", onClick: onPublish, disabled: publishBlocked, title: publishTitle, "aria-disabled": publishBlocked, className: "bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3.5 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [publishing && _jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", "aria-hidden": true }), "Publish"] })] })] }));
72
+ (structural ? (_jsxs("button", { type: "button", onClick: onViewOnSite, title: isLive
73
+ ? 'Open the live published page in a new tab'
74
+ : 'Open the draft on your public site — the real design preview', className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors", children: [_jsx(ExternalLink, { className: "h-3.5 w-3.5", "aria-hidden": true }), isLive ? 'View live' : 'View on site'] })) : (_jsx("button", { type: "button", onClick: onViewOnSite, "aria-label": isLive ? 'View live page' : 'View draft on site', title: isLive ? 'View live page' : 'View draft on site', className: "text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg p-2", children: _jsx(ExternalLink, { className: "h-4 w-4", "aria-hidden": true }) }))), _jsx("button", { type: "button", onClick: onSaveDraft, disabled: !canEdit || saveState === 'saving' || (!dirty && saveState !== 'error'), className: "border-border text-foreground hover:bg-accent rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: saveState === 'saving' ? 'Saving…' : 'Save Draft' }), onSchedule && (_jsxs("button", { type: "button", onClick: onSchedule, disabled: scheduleBlocked, title: scheduleTitle, "aria-label": scheduledAt ? 'Reschedule publish' : 'Schedule publish', className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(Calendar, { className: "h-3.5 w-3.5", "aria-hidden": true }), _jsx("span", { className: "hidden sm:inline", children: scheduledAt ? 'Reschedule' : 'Schedule' })] })), _jsxs("button", { type: "button", onClick: onPublish, disabled: publishBlocked, title: publishTitle, "aria-disabled": publishBlocked, className: "bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3.5 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [publishing && _jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", "aria-hidden": true }), "Publish"] })] })] }));
70
75
  }
71
76
  function SaveStatus({ state, dirty }) {
72
77
  if (state === 'saving') {