@elytracms/studio 0.0.29 → 0.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/convex/redirects.ts +3 -0
- package/convex/schema.ts +2 -0
- package/dist/components/app-views/default-modules.d.ts +3 -1
- package/dist/components/app-views/default-modules.js +63 -19
- package/dist/components/app-views/default-modules.js.map +1 -1
- package/dist/components/app-views/studio-config.d.ts +10 -0
- package/dist/components/app-views/studio-config.js.map +1 -1
- package/dist/components/builder/property-inspector.js +3 -2
- package/dist/components/builder/property-inspector.js.map +1 -1
- package/dist/components/builder/reuse-context.js +2 -1
- package/dist/components/builder/reuse-context.js.map +1 -1
- package/dist/components/cms/cms-index.js +2 -1
- package/dist/components/cms/cms-index.js.map +1 -1
- package/dist/components/cms/cms-store.d.ts +11 -2
- package/dist/components/cms/cms-store.js +17 -4
- package/dist/components/cms/cms-store.js.map +1 -1
- package/dist/components/cms/collection-table.js +5 -4
- package/dist/components/cms/collection-table.js.map +1 -1
- package/dist/components/cms/detail-editor.js +5 -4
- package/dist/components/cms/detail-editor.js.map +1 -1
- package/dist/components/cms/editable-cell.js +3 -2
- package/dist/components/cms/editable-cell.js.map +1 -1
- package/dist/components/cms/field-control.js +6 -5
- package/dist/components/cms/field-control.js.map +1 -1
- package/dist/components/cms/scalar-value-editor.js +2 -1
- package/dist/components/cms/scalar-value-editor.js.map +1 -1
- package/dist/components/components/field-inspector.js +3 -2
- package/dist/components/components/field-inspector.js.map +1 -1
- package/dist/components/current-user-menu.js +4 -2
- package/dist/components/current-user-menu.js.map +1 -1
- package/dist/components/redirects/redirects-collection-view-source.d.ts +4 -3
- package/dist/components/redirects/redirects-collection-view-source.js +23 -3
- package/dist/components/redirects/redirects-collection-view-source.js.map +1 -1
- package/dist/components/redirects/redirects-store.js +1 -0
- package/dist/components/redirects/redirects-store.js.map +1 -1
- package/dist/customization.d.ts +7 -0
- package/dist/customization.js +6 -0
- package/dist/customization.js.map +1 -1
- package/dist/lib/cms-views/view-model.js +2 -2
- package/dist/lib/cms-views/view-model.js.map +1 -1
- package/dist/lib/i18n/i18n.d.ts +59 -0
- package/dist/lib/i18n/i18n.js +131 -0
- package/dist/lib/i18n/i18n.js.map +1 -0
- package/dist/lib/i18n/index.d.ts +12 -0
- package/dist/lib/i18n/index.js +4 -0
- package/dist/lib/i18n/index.js.map +1 -0
- package/dist/lib/i18n/messages.en.d.ts +15 -0
- package/dist/lib/i18n/messages.en.js +39 -0
- package/dist/lib/i18n/messages.en.js.map +1 -0
- package/dist/lib/i18n/types.d.ts +45 -0
- package/dist/lib/i18n/types.js +19 -0
- package/dist/lib/i18n/types.js.map +1 -0
- package/dist/lib/persistence/convex-adapter.js +2 -0
- package/dist/lib/persistence/convex-adapter.js.map +1 -1
- package/dist/lib/references/reference-model.js +4 -3
- package/dist/lib/references/reference-model.js.map +1 -1
- package/dist/lib/workspace/index.d.ts +8 -0
- package/dist/lib/workspace/index.js +10 -0
- package/dist/lib/workspace/index.js.map +1 -1
- package/dist/ui/badge.d.ts +1 -1
- package/package.json +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detail-editor.js","sourceRoot":"","sources":["../../../src/components/cms/detail-editor.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Link, STUDIO_PROJECT_ROUTE, studioPath, useNavigate } from '@elytracms/studio/router'\nimport {\n Check,\n CircleAlert,\n CircleCheck,\n ExternalLink,\n Eye,\n EyeOff,\n GitCompareArrows,\n History,\n Languages,\n Link2,\n Loader2,\n Lock,\n MoreHorizontal,\n Tag,\n Trash2,\n X,\n} from 'lucide-react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n FIELD_WIDTH_SPANS,\n SIDEBAR_FIELD_GROUP,\n clearHiddenValues,\n documentKey,\n groupOrder,\n groupSectionOf,\n hasAliases,\n hiddenGroupNames,\n isBlocksField,\n isFieldHidden,\n isFieldLocalized,\n isSingleton,\n resolveDocumentForLocale,\n resolveDocumentTitle,\n resolveField,\n sidebarFields,\n titleFieldOf,\n staticFieldHidden,\n urlForDocument,\n} from '@elytracms/core/cms-core'\nimport type {\n CmsDocument,\n CmsValidationIssue,\n CollectionDef,\n DocumentRef,\n DocumentUrl,\n FieldDef,\n FieldGroupSection,\n FieldWidth,\n Locale,\n LocaleConfig,\n} from '@elytracms/core/cms-core'\nimport { blockRootsOf } from '@elytracms/core/project-graph'\nimport {\n Badge,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n CollapsibleSection,\n Field,\n Heading,\n Row,\n Spacer,\n Stack,\n Text,\n toast,\n} from '@elytracms/studio/ui'\nimport { getStudioRegistry } from '@elytracms/studio/lib/registry'\nimport { collectEmbedRefs, resolveReuseCapability } from '../builder/reuse'\nimport { cn } from '@elytracms/studio/lib/utils'\nimport {\n LocaleSwitcher,\n displayedFieldFallback,\n hasLocaleVariant,\n localeChipLabel,\n setStudioLocale,\n} from '@elytracms/studio/lib/locale'\nimport { parseDocumentFieldPath } from '@elytracms/studio/lib/references'\nimport type { ReferenceAction } from '@elytracms/studio/lib/references'\nimport { FallbackChip, fallbackTitle } from './cell'\nimport { FieldControl } from './field-control'\nimport { CompositionFieldEditor } from '../builder/composition-field-editor'\nimport { fieldLabel } from './cms-store'\nimport { useCmsCollectionViewSource } from '../collection-view/cms-collection-view-source'\nimport { CollectionViewProvider, useCollectionView } from '../collection-view/collection-view-context'\nimport { resolveFieldAccess } from '@elytracms/studio/lib/collection-view/collection-view-source'\nimport type { CollectionViewSource } from '@elytracms/studio/lib/collection-view/collection-view-source'\nimport { DocStateBadge } from './doc-state'\nimport { UnsavedChangesGuard } from '../guards'\nimport { ReferenceConfirmDialog } from './reference-confirm'\nimport { ReferencesPanel } from '../references/references-panel'\nimport { InspectorSidebar } from '../inspector/inspector-sidebar'\nimport type { InspectorPane } from '../inspector/inspector-sidebar'\nimport { DocumentEditorProvider } from './document-editor-context'\nimport type { CompareState } from './document-editor-context'\nimport { VersionsPane } from './versions-pane'\nimport { VersionCompare } from './version-compare'\nimport { IssuesPane } from './issues-pane'\nimport { DetailsPane } from './details-pane'\nimport { useSetBreadcrumb } from '../breadcrumb-context'\nimport type { BreadcrumbItem } from '../breadcrumb-context'\nimport { resolveDeploymentFrontendUrl, resolveDeploymentRoutes } from '@elytracms/studio/lib/workspace'\nimport { usePublishedDocuments } from '@elytracms/studio/lib/cms/published-documents'\n\n/** The conventional slug field name (mirrors `url-for-document`'s `SLUG_FIELD`). */\nconst SLUG_FIELD = 'slug'\n\nexport function DetailEditor({\n projectId,\n collectionId,\n documentId,\n focusPath,\n}: {\n projectId: string\n collectionId: string\n documentId: string\n /** Reference-index field path (`?field=`, EC-172): highlight + scroll to the exact field. */\n focusPath?: string\n}) {\n // AD-19: the edit shell is a portable surface over a CollectionViewSource, just\n // like the list. `DetailEditor` is the CMS entry point — it builds the CMS source\n // and hands it to the portable {@link PortableDetailEditor} so `EditorBody` (and\n // the shared field controls / pickers) render over the source, never `useCms()`.\n const source = useCmsCollectionViewSource(collectionId)\n if (!source) {\n return (\n <DocumentNotFound\n projectId={projectId}\n listPath={studioPath.cmsCollection(collectionId)}\n label={collectionId}\n />\n )\n }\n return (\n <PortableDetailEditor source={source} projectId={projectId} documentId={documentId} focusPath={focusPath} />\n )\n}\n\n/**\n * The portable edit shell (EC-240 / AD-19): resolve the record by id from ANY\n * {@link CollectionViewSource}, then render the shared {@link EditorBody} over it.\n * The CMS entry point ({@link DetailEditor}) and the users rail both mount this —\n * routing (the \"back to list\" target, the not-found link) is rail-owned via\n * `source.listPath`, so the shell never hard-codes the CMS route.\n */\nexport function PortableDetailEditor({\n source,\n projectId,\n documentId,\n focusPath,\n}: {\n source: CollectionViewSource\n projectId: string\n documentId: string\n focusPath?: string\n}) {\n const doc = source.get({ collection: source.collectionId, id: documentId })\n // EC-274: singleton opening is owned by `SingletonGate` (it resolves the lone\n // document and materializes it). The detail editor just renders the document it\n // is given by id — singletons need no special case here.\n if (!doc) {\n return (\n <DocumentNotFound\n projectId={projectId}\n listPath={source.listPath}\n label={source.schema.form?.label ?? source.collectionId}\n />\n )\n }\n return (\n <CollectionViewProvider source={source}>\n <EditorBody\n key={`${source.collectionId}/${documentId}`}\n projectId={projectId}\n collection={source.schema}\n doc={doc}\n focusPath={focusPath}\n />\n </CollectionViewProvider>\n )\n}\n\n/** The record-not-found state — a heading + a rail-owned \"back to list\" link. */\nfunction DocumentNotFound({\n projectId,\n listPath,\n label,\n}: {\n projectId: string\n listPath?: string\n label: string\n}) {\n return (\n <div className=\"grid h-full place-items-center p-8\">\n <Stack gap=\"3\" align=\"center\" className=\"text-center\">\n <Heading level={2} size=\"h2\">\n Not found\n </Heading>\n {listPath !== undefined ? (\n <Link\n to={STUDIO_PROJECT_ROUTE}\n params={{ projectId, _splat: listPath }}\n className=\"text-sm text-primary hover:underline\"\n >\n Back to {label}\n </Link>\n ) : null}\n </Stack>\n </div>\n )\n}\n\n/** The loaded state of a document's pinned published snapshot (EC-226). */\ntype PublishedSnapshot =\n | { status: 'loading' }\n | { status: 'ready'; doc: CmsDocument }\n | { status: 'missing' }\n\nfunction EditorBody({\n projectId,\n collection,\n doc,\n focusPath,\n}: {\n projectId: string\n collection: CollectionDef\n doc: CmsDocument\n focusPath?: string\n}) {\n const source = useCollectionView()\n const navigate = useNavigate()\n // AD-19: capability flags gate whole shell regions AND their method groups, so\n // the SAME edit shell serves a non-publishing / non-versioned / single-locale\n // rail (the users rail, EC-240) without a bespoke editor. A false flag hides its\n // region entirely — no dead controls, no reads fired on that region's behalf.\n const canPublish = source.capabilities.publish\n const canVersions = source.capabilities.versions\n const canLocales = source.capabilities.locales\n // References is the CMS content-graph surface (the reference index tracks the\n // publishable document rail). A non-publishing rail (users, future redirects) is\n // not part of that graph, so its References tab would be structurally empty —\n // gate it off. A dedicated `references` capability can split this later if a\n // non-publishing-but-referenceable rail appears (YAGNI today).\n const showReferences = canPublish\n // Principal-based field access (EC-240, AD-18): `edit|read|hidden`, resolved\n // per field for the current principal. Default-open — a source with no policy\n // derives it from `isFieldReadOnly`. Access depends on the record's identity, not\n // its edited values (content-conditional hiding is the separate `isHidden` axis),\n // so it keys off the stable `doc`, never the live draft.\n const accessOf = useCallback(\n (field: FieldDef) => resolveFieldAccess(source, field, doc),\n [source, doc],\n )\n // EC-217: a singleton collection has no list — there is nowhere to go \"back\"\n // to, and its one document is fixed (never deleted). The header drops the\n // back-crumb/id line and the Delete action accordingly.\n const singleton = isSingleton(collection)\n const [draft, setDraft] = useState<CmsDocument>(() => structuredClone(doc))\n // The studio's ambient active locale (EC-176): the form displays and edits\n // exactly this locale — switched via the shared LocaleSwitcher, never per field.\n const locale = source.activeLocale\n // Bumped when a version restore replaces the draft out-of-band, to remount the\n // (uncontrolled) canvas editor from the restored value (EC-224).\n const [restoreNonce, setRestoreNonce] = useState(0)\n // EC-173: unpublish/delete go through the reference-aware confirmation.\n const [confirmAction, setConfirmAction] = useState<ReferenceAction | null>(null)\n // Stable so the document-editor context value (EC-224) doesn't churn each render.\n const ref = useMemo(() => ({ collection: collection.id, id: doc.id }), [collection.id, doc.id])\n const confirmTargets = useMemo(\n () => [{ collection: collection.id, id: doc.id }],\n [collection.id, doc.id],\n )\n\n // EC-226: the draft/published VIEW perspective. Draft = the editable working\n // draft; Published = the pinned published snapshot, rendered read-only. Only\n // meaningful when the document is published.\n const published = source.publishing?.isPublished(ref) ?? false\n const [perspective, setPerspective] = useState<'draft' | 'published'>('draft')\n const [publishedSnapshot, setPublishedSnapshot] = useState<PublishedSnapshot>({ status: 'loading' })\n // Snap back to Draft if the document is unpublished while viewing Published.\n useEffect(() => {\n if (!published) setPerspective('draft')\n }, [published])\n // Load the pinned published snapshot when viewing Published (fresh each switch,\n // so it reflects the current pin after a re-publish). `loadDocumentVersions` is\n // a stable callback, so this only re-runs on a perspective/ref change.\n const loadVersions = source.versioning?.load\n useEffect(() => {\n if (perspective !== 'published') return\n if (!loadVersions) return\n let cancelled = false\n setPublishedSnapshot({ status: 'loading' })\n void (async () => {\n const view = await loadVersions(ref)\n if (cancelled) return\n const pinned =\n view.publishedVersion !== undefined\n ? view.versions.find((v) => v.version === view.publishedVersion)?.snapshot\n : undefined\n setPublishedSnapshot(pinned ? { status: 'ready', doc: pinned } : { status: 'missing' })\n })()\n return () => {\n cancelled = true\n }\n }, [perspective, ref, loadVersions])\n\n // The whole fieldset is read-only when viewing Published. The form/canvas\n // render the pinned snapshot ONLY once it has loaded — never the draft, which\n // must not be presented as published; until then the body shows a placeholder.\n const viewReadOnly = perspective === 'published'\n const viewDoc =\n viewReadOnly && publishedSnapshot.status === 'ready' ? publishedSnapshot.doc : draft\n const publishedPending = viewReadOnly && publishedSnapshot.status !== 'ready'\n\n const dirty = JSON.stringify(draft) !== JSON.stringify(doc)\n const schemaIssues = useMemo(() => source.validate(draft), [source, draft])\n // EC-300/AD-16: composition embeds (hard references) whose target isn't published\n // would render empty on the live site. Surface them as errors in the Issues panel,\n // but they DON'T gate the Publish button (schema errors do) — publishing is\n // confirm-through, so the editor can publish the page and the reusable together\n // knowingly. The publish guard below catches them.\n const referenceIssues = useMemo(\n () => unpublishedEmbedIssues(collection, draft, source),\n [collection, draft, source],\n )\n const issues = useMemo(\n () => [...schemaIssues, ...referenceIssues],\n [schemaIssues, referenceIssues],\n )\n const errorCount = schemaIssues.filter((i) => i.severity === 'error').length\n const hasErrors = errorCount > 0\n const hasUnpublishedRefs = referenceIssues.length > 0\n\n // --- Save mode (EC-225 autosave · EC-240 explicit) -------------------------\n // A publishing rail AUTOSAVES: the draft persists 1s after the last edit and\n // publish is the deliberate commit. A non-publishing rail (users, EC-240) has no\n // publish step, so silent apply is the wrong default for authority data — it\n // SAVES EXPLICITLY instead: edits stay in the draft until the Save button, and a\n // navigation guard protects unsaved changes. (Role stays in `members`, applied\n // on Save and enforced immediately — never behind a publish pointer.)\n // Refs let the unmount flush read the latest values without re-subscribing.\n const explicitSave = !canPublish\n const draftRef = useRef(draft)\n draftRef.current = draft\n const dirtyRef = useRef(dirty)\n dirtyRef.current = dirty\n const sourceRef = useRef(source)\n sourceRef.current = source\n const explicitSaveRef = useRef(explicitSave)\n explicitSaveRef.current = explicitSave\n\n useEffect(() => {\n if (explicitSave) return // explicit rails persist only via the Save button\n if (!dirty) return\n const timer = window.setTimeout(() => sourceRef.current.save(draftRef.current), 1000)\n return () => window.clearTimeout(timer)\n }, [dirty, draft, explicitSave])\n\n // Flush a still-pending AUTOSAVE edit on unmount (navigating away inside the\n // debounce window) so nothing is lost. Explicit rails never flush silently —\n // their `UnsavedChangesGuard` catches the navigation instead. Unmount-only.\n useEffect(\n () => () => {\n if (!explicitSaveRef.current && dirtyRef.current) sourceRef.current.save(draftRef.current)\n },\n [],\n )\n const errorsByField = useMemo(() => {\n const map = new Map<string, string>()\n for (const issue of issues) {\n // validateDocument populates meta.field for field-level issues (works for\n // both `values` and `localized/<locale>` paths, unlike positional indexing).\n const field = issue.meta?.field\n if (typeof field === 'string' && !map.has(field)) map.set(field, issue.message)\n }\n return map\n }, [issues])\n\n const tabs = collection.form?.tabs ?? ['main']\n // EC-269: References gets its own dedicated, visibility-gated tab — it mounts\n // (and loads) only when selected, and unmounts on leave, so normal editing\n // never triggers reference fetching. Appended after the collection's content tabs.\n const REFERENCES_TAB = 'references'\n // EC-298: the version-compare view is a sticky framework tab (kept open while\n // you tab to the real fields; closed only by its ✕).\n const COMPARE_TAB = 'compare'\n const [activeTab, setActiveTab] = useState(tabs[0]!)\n // EC-285: the reserved `sidebar` group is document-level metadata (slug, author…)\n // — it renders in the Details inspector pane, not as a content tab, so it is\n // excluded from the tab fields here and collected once below.\n const sidebarFieldDefs = useMemo(() => sidebarFields(collection), [collection])\n // EC-273: only STATICALLY hidden fields (`hidden: true`) are structurally\n // excluded here; a conditionally (predicate) hidden field stays in the tab and\n // is evaluated per-render against the current values (it may show or hide as the\n // editor types).\n const tabFields = collection.fields.filter(\n (f) =>\n (f.form?.tab ?? tabs[0]) === activeTab &&\n !staticFieldHidden(f) &&\n f.form?.group !== SIDEBAR_FIELD_GROUP,\n )\n const groups = groupFields(tabFields, collection)\n // EC-188 (AD-12): a composition (`blocks`) field is a special content feature,\n // not a field-row — it takes over its tab with the full page-builder canvas.\n // Convention: such a field lives on its own dedicated fieldset tab.\n const canvasField = tabFields.find(isBlocksField)\n\n const [highlightedField, setHighlightedField] = useState<string | null>(null)\n // EC-285: the form-path inspector's active pane, controlled so a jump to a\n // `sidebar`-group field can open the Details pane (where it renders). Undefined\n // = uncontrolled (the sidebar defaults to its first pane).\n const [inspectorPaneId, setInspectorPaneId] = useState<string>()\n // EC-298: the open version comparison. The Compare tab is STICKY — opening it\n // sets the selection and focuses the tab; tabbing to the real fields keeps it\n // open (the selection persists) so an editor can flip between diff and fields;\n // only its ✕ closes it. `activeTab === COMPARE_TAB` is when the diff is visible.\n const [compare, setCompare] = useState<CompareState | null>(null)\n const startCompare = useCallback((base: number) => {\n setCompare({ base, target: 'draft' })\n setActiveTab(COMPARE_TAB)\n setInspectorPaneId('versions')\n }, [])\n const setCompareBase = useCallback((base: number) => {\n setCompare((c) => (c ? { ...c, base } : { base, target: 'draft' }))\n }, [])\n const setCompareTarget = useCallback((target: number | 'draft') => {\n setCompare((c) => (c ? { ...c, target } : c))\n }, [])\n const exitCompare = useCallback(() => {\n setCompare(null)\n setActiveTab((prev) => (prev === COMPARE_TAB ? tabs[0]! : prev))\n }, [tabs])\n // A content tab (schema tab or References). Selecting one leaves the Compare\n // view VISIBLE-wise but keeps the comparison open (sticky) — the diff is one\n // click away on its still-present tab chip.\n const renderContentTab = (tab: string) => {\n const active = tab === activeTab\n return (\n <button\n key={tab}\n type=\"button\"\n aria-pressed={active}\n onClick={() => setActiveTab(tab)}\n className={cn(\n 'rounded-md px-2.5 py-1 text-xs font-medium capitalize transition-colors',\n active ? 'bg-accent text-accent-foreground' : 'text-muted-foreground hover:bg-muted',\n )}\n >\n {tab}\n </button>\n )\n }\n // Focus a field by name: switch to its tab (and locale, when given), scroll the\n // control into view, and ring-highlight it. Shared by the reference deep-link\n // (`focusPath`, EC-172) and the Issues pane's jump-to-field (EC-283).\n const focusTimersRef = useRef<number[]>([])\n const focusField = useCallback(\n (fieldName: string, localeHint?: string) => {\n const field = collection.fields.find((f) => f.name === fieldName)\n if (!field) return\n // EC-285: a `sidebar`-group field renders in the Details inspector pane, not\n // a content tab — open that pane instead of switching tabs.\n if (field.form?.group === SIDEBAR_FIELD_GROUP) {\n setInspectorPaneId('details')\n } else {\n const fieldTabs = collection.form?.tabs ?? ['main']\n setActiveTab(field.form?.tab ?? fieldTabs[0]!)\n }\n if (localeHint !== undefined && source.localeConfig.locales.includes(localeHint)) {\n setStudioLocale(localeHint)\n }\n setHighlightedField(field.name)\n // Clear any timers from a prior jump so back-to-back jumps don't fight.\n focusTimersRef.current.forEach((t) => window.clearTimeout(t))\n const scrollTimer = window.setTimeout(() => {\n // Some controls (relation/asset pickers) don't render the input id —\n // the field label (`htmlFor`) is always present.\n const control =\n document.getElementById(`f-${field.name}`) ??\n document.querySelector(`label[for=\"${CSS.escape(`f-${field.name}`)}\"]`)\n control?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n }, 60)\n const clearTimer = window.setTimeout(() => setHighlightedField(null), 3200)\n focusTimersRef.current = [scrollTimer, clearTimer]\n },\n [collection, source.localeConfig],\n )\n useEffect(() => () => focusTimersRef.current.forEach((t) => window.clearTimeout(t)), [])\n\n // Reference deep links (EC-172): `?field=<index path>` pinpoints the exact field.\n useEffect(() => {\n if (!focusPath) return\n const parsed = parseDocumentFieldPath(focusPath)\n if (!parsed) return\n focusField(parsed.field, parsed.locale)\n }, [focusPath, focusField])\n\n function getValue(field: FieldDef): unknown {\n // EC-226: read from the active VIEW (the draft, or the pinned published\n // snapshot when viewing Published) — never directly from `draft`.\n if (isFieldLocalized(collection, field.name)) {\n // Display the explicit variant when it exists, else the EC-018 fallback\n // value — labeled as such by the field's fallback marker (EC-176), so a\n // German view shows the English text visibly, never an unexplained blank.\n const explicit = viewDoc.localized?.[locale]?.[field.name]\n if (explicit !== undefined) return explicit\n return resolveField(collection, viewDoc, field.name, locale, source.localeConfig).value\n }\n return viewDoc.values[field.name]\n }\n\n function setValue(field: FieldDef, value: unknown) {\n setDraft((d) => {\n if (isFieldLocalized(collection, field.name)) {\n const perLocale = { ...(d.localized?.[locale] ?? {}) }\n if (value === undefined) delete perLocale[field.name]\n else perLocale[field.name] = value\n return { ...d, localized: { ...d.localized, [locale]: perLocale } }\n }\n const values = { ...d.values }\n if (value === undefined) delete values[field.name]\n else values[field.name] = value\n return { ...d, values }\n })\n }\n\n // EC-273: conditional-visibility context — the draft's values for the active\n // locale, against which a field's `hidden(values)` predicate is evaluated. A\n // hidden field's row is omitted (and it is not validated). Recomputed as the\n // draft changes, so a field shows/hides live as the editor types.\n const conditionValues = { ...draft.values, ...(draft.localized?.[locale] ?? {}) }\n const isHidden = (field: FieldDef) => isFieldHidden(field, { values: conditionValues })\n // Visible = not content-hidden AND not principal-hidden (EC-240 access === 'hidden').\n const isFieldShown = (field: FieldDef) => !isHidden(field) && accessOf(field) !== 'hidden'\n const visibleSidebarFields = sidebarFieldDefs.filter(isFieldShown)\n // EC-306: presentational group sections hidden right now (static or predicate) —\n // skipped entirely, like a hidden field. Recomputed live as the draft changes.\n const hiddenGroups = hiddenGroupNames(collection, { values: conditionValues })\n\n // One document field row (label + fallback/translation/read-only badges + the\n // control), shared by the content groups and the EC-285 Details pane so a\n // sidebar field renders identically — same control, validation, localization,\n // and EC-283 highlight/jump target — wherever it surfaces. Returns null when the\n // field is conditionally hidden (EC-273).\n function renderFieldRow(field: FieldDef) {\n if (isHidden(field)) return null\n // EC-240: principal-based access. `hidden` drops the row entirely (this\n // principal can't see the field); `read` renders it read-only. Distinct from\n // the content-conditional `isHidden` above and the view-level read-only\n // (Published perspective) — the control honors all three.\n const access = accessOf(field)\n if (access === 'hidden') return null\n const fieldLevelReadOnly = access === 'read'\n const fieldReadOnly = viewReadOnly || fieldLevelReadOnly\n const localized = isFieldLocalized(collection, field.name)\n // Fallback visibility (EC-176): the control DISPLAYS the fallback value, and\n // this marker says so on the exact field.\n const fallback = localized\n ? displayedFieldFallback(collection, viewDoc, field.name, locale, source.localeConfig)\n : null\n // The variant was created in this editing session (the saved document doesn't\n // have it yet): editing a fallback-shown value is an explicit translation act.\n // Moot (and hidden) while viewing the read-only published snapshot.\n const newlyTranslated =\n !viewReadOnly &&\n localized &&\n hasLocaleVariant(draft, field.name, locale) &&\n !hasLocaleVariant(doc, field.name, locale)\n return (\n <Field\n key={field.name}\n className={cn(\n 'rounded-md transition-shadow',\n highlightedField === field.name && 'bg-primary/5 p-2 ring-2 ring-primary/70',\n )}\n label={\n <Row gap=\"2\">\n <span>{fieldLabel(field)}</span>\n {field.validation?.required ? <span className=\"text-destructive\">*</span> : null}\n {localized ? <Badge variant=\"outline\">{locale}</Badge> : null}\n {fallback ? (\n <Badge\n variant=\"warning\"\n title={fallbackTitle(fallback)}\n data-testid={`field-fallback-${field.name}`}\n >\n showing {localeChipLabel(fallback.sourceLocale)}\n </Badge>\n ) : null}\n {newlyTranslated ? (\n <Badge variant=\"success\" data-testid={`field-translated-${field.name}`}>\n <Languages className=\"size-3\" /> translated to {localeChipLabel(locale)}\n </Badge>\n ) : null}\n {fieldLevelReadOnly ? (\n <Badge variant=\"outline\">\n <Lock className=\"size-3\" /> read-only\n </Badge>\n ) : null}\n <Spacer />\n </Row>\n }\n htmlFor={`f-${field.name}`}\n hint={\n fallback ? (\n <>\n Showing the {localeChipLabel(fallback.sourceLocale)} (fallback) value — edit to\n translate to {localeChipLabel(locale)}. Clearing the {localeChipLabel(locale)} text\n falls back again.\n </>\n ) : (\n field.form?.description\n )\n }\n error={fieldReadOnly ? undefined : errorsByField.get(field.name)}\n >\n <FieldControl\n id={`f-${field.name}`}\n field={field}\n value={getValue(field)}\n onChange={(v) => setValue(field, v)}\n readOnly={fieldReadOnly}\n />\n {/* EC-246d: the slug's derived URL, shown read-only right under the input —\n makes it unmistakable that the path is derived, not a second field. */}\n {field.name === SLUG_FIELD && routableCollection ? <PathPreview url={draftUrl} /> : null}\n </Field>\n )\n }\n\n function save() {\n source.save(draft)\n }\n\n // EC-224: a version restore swaps the working draft for an older snapshot; the\n // open editor adopts it so the form/canvas re-render from the restored content\n // (the operation already persisted it, so it lands clean/non-dirty).\n function replaceDraft(next: CmsDocument) {\n setDraft(next)\n // The canvas editor is uncontrolled after mount (it builds its graph once and\n // lifts edits OUT). A restore replaces the draft from outside, so bump the\n // nonce to REMOUNT the canvas from the restored value — otherwise it keeps the\n // pre-restore tree and the next edit would clobber the restore.\n setRestoreNonce((n) => n + 1)\n }\n\n // The frame-owned `Versions` pane (EC-224) — appended after any view-supplied\n // pane (the canvas's `Properties`). One instance feeds both the form view's\n // sidebar and the canvas view's sidebar.\n const versionsPane = useMemo<InspectorPane>(\n () => ({\n id: 'versions',\n label: 'Versions',\n icon: <History className=\"size-3.5\" />,\n render: () => <VersionsPane />,\n }),\n [],\n )\n // The frame-owned `Issues` pane (EC-283) — the document-scoped validation\n // surface that replaces the always-on footer band. The tab carries a count\n // badge (error- vs warning-toned) so a non-zero count is discoverable from\n // any tab; document-level issues (e.g. EC-260 nesting-depth) live only here.\n const issuesPane = useMemo<InspectorPane>(\n () => ({\n id: 'issues',\n label: 'Issues',\n icon: <CircleAlert className=\"size-3.5\" />,\n badge:\n issues.length === 0 ? undefined : (\n <Badge\n variant={issues.some((i) => i.severity === 'error') ? 'error' : 'warning'}\n className=\"px-1.5 py-0 leading-none\"\n >\n {issues.length}\n </Badge>\n ),\n render: () => (\n <IssuesPane issues={issues} collection={collection} onJumpToField={focusField} />\n ),\n }),\n [issues, errorCount, collection, focusField],\n )\n // EC-284 + EC-285: the document-metadata pane — slot assignment (EC-284) and/or\n // the document-level `sidebar`-group fields (EC-285). Present only when the\n // collection has either, so it never adds an empty tab elsewhere. First in the\n // order, so a slotted / sidebar-bearing document opens straight to it. Not\n // memoized: its render closes over per-render edit state (draft, highlight,\n // field errors) via `renderFieldRow`, and the inspector re-renders with the rest\n // of the editor anyway, so a stable pane identity would buy nothing here.\n const detailsPane: InspectorPane | null =\n hasAliases(collection) || visibleSidebarFields.length > 0\n ? {\n id: 'details',\n label: 'Details',\n icon: <Tag className=\"size-3.5\" />,\n render: () => (\n <DetailsPane\n collection={collection}\n doc={draft}\n siblings={source.documents()}\n readOnly={viewReadOnly}\n fields={visibleSidebarFields}\n renderField={renderFieldRow}\n onAliasChange={(alias) =>\n setDraft((d) => {\n const next = { ...d }\n if (alias === undefined) delete next.alias\n else next.alias = alias\n return next\n })\n }\n />\n ),\n }\n : null\n // Versions is capability-gated (AD-19): a non-versioned rail (users) never mounts\n // the pane, so no version read fires on its records.\n const trailingPanes = [\n ...(detailsPane ? [detailsPane] : []),\n ...(canVersions ? [versionsPane] : []),\n issuesPane,\n ]\n\n // EC-268: the Publish button is its own indicator — pending while the publish\n // round-trips, a brief success, and an error toast if it rejects at transport.\n const [publishState, setPublishState] = useState<'idle' | 'pending' | 'success'>('idle')\n // EC-300/AD-16: confirm-through guard when the page embeds unpublished reusables.\n const [publishConfirm, setPublishConfirm] = useState(false)\n\n // Gate publish on the confirm-through dialog when there are unpublished hard\n // references (they'd render empty on the live site); schema errors already\n // disable the button, so they never reach here.\n function handlePublish() {\n if (hasUnpublishedRefs) {\n setPublishConfirm(true)\n return\n }\n void doPublish()\n }\n\n async function doPublish() {\n // EC-273: clean conditionally-hidden values from the draft AT PUBLISH TIME.\n // While editing, the draft keeps them so an accidental hide (e.g. flipping a\n // link's type) is recoverable; publishing is the intentional moment we commit\n // the cleanup — into the draft AND the snapshot, so both go clean together (the\n // reference index updates off the saved draft, so a now-unlinked page becomes\n // deletable once the change is published). Also captures the latest edit in case\n // Publish is clicked inside the autosave debounce window; the serial persister\n // runs the upsert before the publish so the snapshot is exactly this draft (EC-225).\n const cleaned = clearHiddenValues(collection, draft)\n if (cleaned !== draft) setDraft(cleaned)\n if (cleaned !== draft || dirty) source.save(cleaned)\n // Publish snapshots the draft as a version and pins it (EC-224). The live\n // row stays a continuous draft — published-ness is the version pointer\n // (`source.publishing.isPublished`). Pre-gated by `disabled={hasErrors}`; the optimistic\n // flip reconciles against the backend (EC-225), so a logical rejection the\n // gate doesn't cover (schema divergence) self-corrects the badge. A hard\n // failure (transport) rejects the flush — surface it loudly (EC-268).\n setPublishState('pending')\n try {\n await source.publishing?.publish(ref)\n setPublishState('success')\n setTimeout(() => setPublishState('idle'), 1800)\n } catch (error) {\n setPublishState('idle')\n toast.error(error instanceof Error ? `Publish failed: ${error.message}` : 'Publish failed.')\n }\n }\n\n function handleConfirmedAction() {\n if (confirmAction === 'unpublish') {\n setConfirmAction(null)\n void source.publishing?.unpublish(ref)\n return\n }\n if (confirmAction === 'delete') {\n setConfirmAction(null)\n source.remove(ref)\n // Return to the rail's list (rail-owned `listPath`), or the project index if\n // the rail has no list surface (AD-19 — never a hard-coded CMS route).\n void navigate({\n to: STUDIO_PROJECT_ROUTE,\n params: { projectId, _splat: source.listPath ?? studioPath.index() },\n })\n }\n }\n\n // While the published snapshot is pending, don't derive the title from the\n // draft (it must not read as the published title) — fall back to the id.\n const title = publishedPending ? '' : primaryTitle(viewDoc, collection, locale, source.localeConfig)\n // EC-242: the untranslated-title chip applies only to a field-backed title; a\n // function title pattern has no single source field to mark as a fallback.\n const titleFallback =\n publishedPending || typeof collection.titleField === 'function'\n ? null\n : displayedFieldFallback(\n collection,\n viewDoc,\n titleFieldOf(collection)?.name ?? 'title',\n locale,\n source.localeConfig,\n )\n\n // EC-214: the document is the active record — contribute the collection (a\n // link back to its list) and the document title to the global header\n // breadcrumb, replacing the editor's own back-link + collection/id line. A\n // singleton has no list, so it contributes a single, non-linked crumb. The\n // title tracks the live draft so a rename updates the crumb immediately.\n const breadcrumbItems = useMemo<BreadcrumbItem[]>(() => {\n const collectionLabel = collection.form?.label ?? collection.id\n // A singleton (no list) or a rail with no list surface contributes a single,\n // non-linked crumb; otherwise the collection crumb links back to its list via\n // the rail-owned `listPath` (never a hard-coded CMS route — AD-19).\n if (singleton || source.listPath === undefined) return [{ label: collectionLabel }]\n const docTitle = primaryTitle(draft, collection, locale, source.localeConfig) || doc.id\n return [\n {\n label: collectionLabel,\n to: STUDIO_PROJECT_ROUTE,\n params: { projectId, _splat: source.listPath },\n },\n { label: docTitle },\n ]\n }, [singleton, collection, draft, locale, source.localeConfig, source.listPath, doc.id, projectId])\n useSetBreadcrumb(breadcrumbItems)\n\n // EC-205/EC-216: the LIVE URL derives strictly from PUBLISHED data — the\n // document's pinned published snapshot and its published ancestors — never the\n // draft (an unpublished slug/parent edit must not leak into the live URL). The\n // pool is exactly what the live site serves, so a published doc resolves to the\n // URL visitors actually get; `undefined` until the doc is published (and the\n // pool has loaded). The collection being routable gates the disabled hint below.\n const publishedDocs = usePublishedDocuments(source.projectId, collection.id)\n const routableCollection = useMemo(\n () => resolveDeploymentRoutes().some((route) => route.document?.collection === collection.id),\n [collection.id],\n )\n const liveUrl = useMemo(() => {\n const published = publishedDocs.byId.get(doc.id)\n if (!published) return undefined\n return urlForDocument(\n {\n routes: resolveDeploymentRoutes(),\n frontendUrl: resolveDeploymentFrontendUrl(),\n localeConfig: source.localeConfig,\n },\n collection,\n published,\n { siblings: [...publishedDocs.byId.values()], locale },\n )\n }, [publishedDocs, collection, doc.id, locale, source.localeConfig])\n // EC-246d: the DRAFT path — derived from the current edit (slug + parent chain),\n // not the published pool — so the slug field shows the URL forming live, before\n // the first publish. Read-only: the slug is the single editable source, the path\n // is always derived (never a second stored field). `undefined` until a slug\n // resolves a route (a fresh hierarchy page with no slug has no path yet).\n const draftUrl = useMemo(\n () =>\n urlForDocument(\n { routes: resolveDeploymentRoutes(), localeConfig: source.localeConfig },\n collection,\n viewDoc,\n { siblings: source.documents(), locale },\n ),\n [collection, viewDoc, locale, source],\n )\n\n // EC-240: hide the tab bar when there is nothing to navigate — a single content\n // tab with no References/Compare (the users rail). When framework tabs ARE\n // present we KEEP the content tab(s) so there is always a way back to the form;\n // only a genuinely single-tab surface drops them. And drop the whole lens row\n // when it would be empty (no tabs to show, no locale/perspective controls), so a\n // bare rail (users) shows no orphaned row.\n const hasFrameworkTabs = showReferences || compare !== null\n const showContentTabs = tabs.length > 1 || hasFrameworkTabs\n const showLensRow = showContentTabs || canLocales || canPublish\n\n return (\n <DocumentEditorProvider\n value={{\n projectId,\n collection,\n docRef: ref,\n draft,\n dirty,\n hasErrors,\n viewReadOnly,\n save,\n replaceDraft,\n compare,\n compareActive: activeTab === COMPARE_TAB,\n startCompare,\n setCompareBase,\n setCompareTarget,\n exitCompare,\n }}\n >\n <div className={cn('flex h-full min-h-0 flex-col', viewReadOnly && 'bg-info/[0.04]')}>\n {/* Header — the back-link + collection/id line moved into the global\n breadcrumb (EC-214); this keeps only the record title + actions. */}\n <div className=\"shrink-0 border-b border-border px-4 py-3 sm:px-6\">\n <Row gap=\"3\">\n <Row gap=\"2\" align=\"center\" className=\"min-w-0\">\n <Heading level={1} size=\"h2\" className=\"truncate\">\n {singleton ? collection.form?.label ?? collection.id : title || doc.id}\n </Heading>\n {singleton ? null : <FallbackChip fallback={titleFallback} testId=\"doc-title-fallback\" />}\n </Row>\n <Spacer />\n {/* Save status — an autosave rail reports Saving…/Saved; an explicit rail\n (users) reports Unsaved changes until the Save button commits. */}\n <Text size=\"xs\" tone=\"muted\" className=\"whitespace-nowrap\" data-testid=\"autosave-status\">\n {source.lastError\n ? 'Save failed'\n : explicitSave\n ? dirty\n ? 'Unsaved changes'\n : 'Saved'\n : dirty\n ? 'Saving…'\n : 'Saved'}\n </Text>\n {canPublish ? <DocStateBadge published={published} /> : null}\n {/* EC-216: open the document's live URL. Enabled once published with a\n configured frontendUrl; otherwise a disabled hint explains why. */}\n {/* EC-216 + EC-205: open the document's LIVE (published) URL. Enabled\n only once the published snapshot exists and a frontendUrl is set;\n otherwise a disabled hint explains why. Hidden for non-routable\n collections (e.g. singletons). */}\n {routableCollection ? (\n liveUrl?.href ? (\n <Button asChild variant=\"outline\" size=\"sm\" title={`Open ${liveUrl.path}`}>\n <a href={liveUrl.href} target=\"_blank\" rel=\"noreferrer\" data-testid=\"view-live\">\n <ExternalLink /> View live\n </a>\n </Button>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled\n data-testid=\"view-live-disabled\"\n title={\n publishedDocs.status === 'loading'\n ? 'Loading the live URL…'\n : !published\n ? 'Publish to view the live page'\n : 'Set frontendUrl in elytra.config.ts to enable'\n }\n >\n <ExternalLink /> View live\n </Button>\n )\n ) : null}\n {canPublish ? (\n <Button\n size=\"sm\"\n onClick={handlePublish}\n disabled={hasErrors || viewReadOnly || publishState === 'pending'}\n title={\n viewReadOnly\n ? 'Switch to Draft to publish'\n : hasErrors\n ? `Fix ${errorCount} ${errorCount === 1 ? 'issue' : 'issues'} to publish`\n : undefined\n }\n >\n {publishState === 'pending' ? (\n <>\n <Loader2 className=\"animate-spin\" /> Publishing…\n </>\n ) : publishState === 'success' ? (\n <>\n <CircleCheck /> Published\n </>\n ) : (\n <>\n <Eye /> Publish\n </>\n )}\n </Button>\n ) : null}\n {/* EC-240: an explicit-save rail commits the draft on demand (no publish\n step). Disabled until there are unsaved edits; the guard covers leaving. */}\n {explicitSave ? (\n <Button size=\"sm\" onClick={save} disabled={!dirty} data-testid=\"doc-save\">\n <Check /> Save\n </Button>\n ) : null}\n {/* EC-217: a singleton is never deleted; with nothing else to show\n (an unpublished singleton) the actions menu is omitted entirely. */}\n {published || !singleton ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"icon-sm\" aria-label=\"More actions\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {published ? (\n <DropdownMenuItem onClick={() => setConfirmAction('unpublish')}>\n <EyeOff /> Unpublish\n </DropdownMenuItem>\n ) : null}\n {singleton ? null : (\n <DropdownMenuItem\n data-testid=\"doc-delete\"\n className=\"text-destructive\"\n onClick={() => setConfirmAction('delete')}\n >\n <Trash2 /> Delete\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </Row>\n\n {/* EC-246a consistency: this lens row mirrors the list header — the tabs\n (EC-073) lead on the left (like the list's view tabs), and the lens\n CONTROLS sit on the right: the ambient locale switcher (EC-176) then the\n Draft/Published view perspective (EC-226) — exactly where the list keeps\n locale + Display, so the locale no longer jumps sides between views. */}\n {showLensRow ? (\n <Row gap=\"3\" className=\"mt-3\" wrap>\n <Row gap=\"1\" align=\"center\">\n {/* Schema content tabs (EC-073), then a divider, then the framework\n tabs (EC-269 References; EC-298 the transient Compare chip). While\n comparing, no content tab is highlighted — the Compare chip is the\n active view, and clicking a content tab closes the comparison. A\n single-tab surface with no framework tabs hides these entirely. */}\n {showContentTabs ? tabs.map((tab) => renderContentTab(tab)) : null}\n {showReferences ? (\n <>\n <div className=\"mx-1 h-4 w-px bg-border\" aria-hidden />\n {renderContentTab(REFERENCES_TAB)}\n </>\n ) : null}\n {compare ? (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-colors',\n activeTab === COMPARE_TAB\n ? 'bg-accent text-accent-foreground'\n : 'text-muted-foreground hover:bg-muted',\n )}\n >\n <button\n type=\"button\"\n onClick={() => setActiveTab(COMPARE_TAB)}\n aria-pressed={activeTab === COMPARE_TAB}\n className=\"inline-flex items-center gap-1\"\n >\n <GitCompareArrows className=\"size-3\" aria-hidden /> Compare\n </button>\n <button\n type=\"button\"\n onClick={exitCompare}\n aria-label=\"Close compare\"\n className=\"ml-0.5 rounded p-0.5 hover:bg-background/40\"\n >\n <X className=\"size-3\" />\n </button>\n </span>\n ) : null}\n </Row>\n <Spacer />\n {canLocales ? <LocaleSwitcher /> : null}\n {canPublish ? (\n <Row gap=\"px\" className=\"rounded-md bg-muted/60 p-0.5\">\n <PerspectiveButton\n label=\"Draft\"\n active={perspective === 'draft'}\n onClick={() => setPerspective('draft')}\n />\n <PerspectiveButton\n label=\"Published\"\n active={perspective === 'published'}\n accent=\"info\"\n disabled={!published}\n title={published ? undefined : 'Publish this document to view its published version'}\n onClick={() => setPerspective('published')}\n />\n </Row>\n ) : null}\n </Row>\n ) : null}\n </div>\n\n {/* EC-214: an unmistakable banner whenever the read-only Published snapshot\n is in view — disabled controls + a footer notice alone read as too\n subtle. Paired with the tinted surface and the accented toggle. */}\n {viewReadOnly ? (\n <Row\n gap=\"2\"\n className=\"shrink-0 border-b border-info/30 bg-info/10 px-4 py-1.5 text-info sm:px-6\"\n data-testid=\"published-view-banner\"\n >\n <Lock className=\"size-3.5 shrink-0\" aria-hidden />\n <Text size=\"xs\" className=\"text-info\">\n Viewing the published version — read-only.\n </Text>\n <Spacer />\n <button\n type=\"button\"\n onClick={() => setPerspective('draft')}\n className=\"text-xs font-medium underline-offset-2 hover:underline\"\n >\n Switch to Draft\n </button>\n </Row>\n ) : null}\n\n {/* Body — a blocks field takes over the body with the page-builder canvas\n (which carries its own inspector sidebar, EC-188/EC-224); otherwise the\n field form sits beside the shared inspector sidebar (Versions). In\n Published view the snapshot must load before rendering — the draft is\n never shown as published (EC-226). */}\n {publishedPending ? (\n <div className=\"grid min-h-0 flex-1 place-items-center p-8\">\n <Text size=\"sm\" tone=\"muted\">\n {publishedSnapshot.status === 'loading'\n ? 'Loading the published version…'\n : 'No published version found for this document.'}\n </Text>\n </div>\n ) : activeTab === COMPARE_TAB && compare ? (\n // EC-298: the version compare view takes over the main area, with the\n // shared inspector (Versions pane) staying on as the navigator — an\n // in-app surface, not a modal, so arbitrary versions can be browsed.\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <div className=\"min-h-0 flex-1 overflow-auto\">\n <VersionCompare />\n </div>\n <InspectorSidebar\n panes={trailingPanes}\n activeId={inspectorPaneId}\n onActiveChange={setInspectorPaneId}\n className=\"w-[320px] shrink-0 border-l border-border\"\n />\n </div>\n ) : canvasField ? (\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <CompositionFieldEditor\n key={`${canvasField.name}:${restoreNonce}:${perspective}`}\n field={canvasField}\n value={getValue(canvasField)}\n onChange={(v) => setValue(canvasField, v)}\n readOnly={viewReadOnly || source.isFieldReadOnly(canvasField)}\n trailingPanes={trailingPanes}\n />\n </div>\n ) : activeTab === REFERENCES_TAB ? (\n // EC-269: mounted only while this tab is active → reference data loads on\n // demand and is torn down on leave (no fetching during normal editing).\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <div className=\"min-h-0 flex-1 overflow-auto p-4 sm:p-6\">\n <div className=\"mx-auto w-full max-w-2xl\">\n <ReferencesPanel\n projectId={projectId}\n source={{ type: 'document', id: documentKey(ref) }}\n target={{ type: 'document', id: documentKey(ref) }}\n />\n </div>\n </div>\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <div className=\"min-h-0 flex-1 overflow-auto p-4 sm:p-6\">\n <div className=\"mx-auto w-full max-w-2xl\">\n <Stack gap=\"6\">\n {groups.map((group) => {\n // EC-306: a conditionally/statically hidden group section is skipped\n // entirely (its fields are also exempt from validation).\n if (hiddenGroups.has(group.name)) return null\n // EC-273/EC-240: drop a fieldset whose every field is hidden — whether\n // content-conditionally or for this principal — so the form never\n // shows an empty section header.\n const visible = group.fields.filter(isFieldShown)\n if (visible.length === 0) return null\n const section = group.section\n return (\n <CollapsibleSection\n key={group.name}\n collapsible={section?.collapsible}\n defaultOpen={section?.defaultOpen}\n title={\n <Text\n size=\"sm\"\n weight=\"semibold\"\n className={section?.title ? undefined : 'capitalize'}\n >\n {section?.title ?? group.name}\n </Text>\n }\n >\n {/* EC-306: fractional field widths — a 12-col grid honoring each\n field's `form.width`, collapsing to one column on narrow widths. */}\n <div className=\"grid grid-cols-1 gap-4 p-4 md:grid-cols-12\">\n {visible.map((field) => (\n <div\n key={field.name}\n className={cn('col-span-1', fieldWidthColSpan(field.form?.width))}\n >\n {renderFieldRow(field)}\n </div>\n ))}\n </div>\n </CollapsibleSection>\n )\n })}\n </Stack>\n </div>\n </div>\n <InspectorSidebar\n panes={trailingPanes}\n activeId={inspectorPaneId}\n onActiveChange={setInspectorPaneId}\n className=\"w-[320px] shrink-0 border-l border-border\"\n />\n </div>\n )}\n\n {/* EC-283: the always-on validation footer is retired. Validation now lives\n in the document-scoped `Issues` inspector pane (full list + jump-to-field,\n count badge on its tab), field issues stay inline, and the Publish button\n gates on errors. Read-only is announced by the top banner (EC-214). */}\n\n {/* EC-240: on an explicit-save rail (no autosave), guard navigation away from\n unsaved edits — offer Save / Discard / Cancel. Autosave rails flush on\n unmount instead, so the guard is inert there. */}\n {explicitSave ? (\n <UnsavedChangesGuard\n when={dirty}\n onSave={() => {\n save()\n return true\n }}\n description=\"You have unsaved changes to this record. Save them before leaving, or discard them.\"\n />\n ) : null}\n\n {/* Reference-aware unpublish/delete confirmation (EC-173). */}\n {confirmAction !== null ? (\n <ReferenceConfirmDialog\n projectId={projectId}\n action={confirmAction}\n targets={confirmTargets}\n open\n onOpenChange={(open) => {\n if (!open) setConfirmAction(null)\n }}\n onConfirm={handleConfirmedAction}\n />\n ) : null}\n\n {/* EC-300/AD-16: confirm-through guard for unpublished hard references. The\n schema is valid (those errors block the button); these would just render\n empty on the live site, so the editor confirms rather than being blocked. */}\n <Dialog open={publishConfirm} onOpenChange={(open) => { if (!open) setPublishConfirm(false) }}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Publish with unpublished references?</DialogTitle>\n <DialogDescription>\n This page references content that isn’t published yet — those sections will be empty on\n the live site until you publish it too.\n </DialogDescription>\n </DialogHeader>\n <Stack gap=\"1\">\n {referenceIssues.map((issue, i) => (\n <Text key={`${issue.meta?.id ?? i}`} size=\"xs\" tone=\"muted\">\n • {issue.message}\n </Text>\n ))}\n {/* Awareness only — other (non-blocking) issues don't gate publish, but\n surfacing the count keeps the confirm honest (AD-16). Schema errors\n can't be here: they disable the button before it opens. */}\n {schemaIssues.length > 0 ? (\n <Text size=\"xs\" tone=\"muted\" className=\"mt-1\">\n This page also has {schemaIssues.length} other unresolved{' '}\n {schemaIssues.length === 1 ? 'issue' : 'issues'} — see the Issues tab.\n </Text>\n ) : null}\n </Stack>\n <DialogFooter className=\"mt-4\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPublishConfirm(false)}>\n Cancel\n </Button>\n <Button\n size=\"sm\"\n data-testid=\"publish-anyway\"\n onClick={() => {\n setPublishConfirm(false)\n void doPublish()\n }}\n >\n Publish anyway\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n </DocumentEditorProvider>\n )\n}\n\n/**\n * EC-300/AD-16 — errors for composition embeds (hard references) whose target isn't\n * published: they render empty on the live site. Walks every `blocks` field of the\n * document for reuse embeds; a missing target is an `unknown-relation-target` error,\n * an unpublished one an `unpublished-relation-target` error. Publishing is\n * confirm-through (not blocked), so these feed the Issues panel + the publish\n * confirmation, never the button's disabled gate. No reuse capability → none.\n */\nfunction unpublishedEmbedIssues(\n collection: CollectionDef,\n draft: CmsDocument,\n source: CollectionViewSource,\n): CmsValidationIssue[] {\n const capability = resolveReuseCapability(getStudioRegistry().registry.list(), source.collections)\n if (!capability) return []\n const issues: CmsValidationIssue[] = []\n const seen = new Set<string>()\n for (const field of collection.fields) {\n if (!isBlocksField(field)) continue\n for (const ref of collectEmbedRefs(blockRootsOf(draft.values?.[field.name]), capability)) {\n const key = `${ref.collection}:${ref.id}`\n if (seen.has(key)) continue\n seen.add(key)\n const exists = source.get(ref) !== undefined\n if (exists && (source.publishing?.isPublished(ref) ?? false)) continue\n issues.push(unpublishedEmbedIssue(collection, draft, field.name, ref, exists, source))\n }\n }\n return issues\n}\n\n/** One unpublished/missing reuse-embed issue (EC-300). */\nfunction unpublishedEmbedIssue(\n collection: CollectionDef,\n draft: CmsDocument,\n field: string,\n ref: DocumentRef,\n exists: boolean,\n source: CollectionViewSource,\n): CmsValidationIssue {\n return {\n code: exists ? 'unpublished-relation-target' : 'unknown-relation-target',\n severity: 'error',\n message: exists\n ? `Embeds the reusable “${source.titleOf(ref)}”, which isn’t published — it will be empty on the live site until you publish it.`\n : `Embeds a reusable that no longer exists (“${ref.id}”) — fix or remove the embed.`,\n path: [field],\n collectionId: collection.id,\n documentId: draft.id,\n meta: { field, target: ref.collection, id: ref.id },\n }\n}\n\n/**\n * A segmented-control button for the Draft/Published view toggle (EC-226). The\n * `accent` variant (EC-214) gives the active Published segment a distinct info\n * treatment, so the read-only mode is obvious at the control itself.\n */\nfunction PerspectiveButton({\n label,\n active,\n accent,\n disabled,\n title,\n onClick,\n}: {\n label: string\n active: boolean\n accent?: 'info'\n disabled?: boolean\n title?: string\n onClick: () => void\n}) {\n return (\n <button\n type=\"button\"\n aria-pressed={active}\n disabled={disabled}\n title={title}\n onClick={onClick}\n className={cn(\n 'rounded px-2.5 py-1 text-xs font-medium transition-colors disabled:opacity-40',\n active\n ? accent === 'info'\n ? 'bg-info text-info-foreground shadow-sm'\n : 'bg-background text-foreground shadow-sm'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n {label}\n </button>\n )\n}\n\n/**\n * EC-246d: the slug's derived route path, shown read-only directly under the slug\n * input. The slug is the single editable source; the path is composed by the route\n * resolver (`urlForDocument`) from slug + parent chain and never stored. Draft-aware,\n * so it updates as the editor types. Until a slug resolves a route (a fresh\n * hierarchy page), a hint explains where the URL comes from.\n */\nfunction PathPreview({ url }: { url?: DocumentUrl }) {\n return (\n <Row gap=\"1\" className=\"text-xs text-muted-foreground\" data-testid=\"slug-path-preview\">\n <Link2 className=\"size-3 shrink-0\" aria-hidden />\n {url ? (\n <Text as=\"span\" size=\"xs\" tone=\"muted\" className=\"min-w-0 truncate\" title={url.path}>\n Served at <span className=\"font-medium text-foreground/80\">{url.path}</span>\n </Text>\n ) : (\n <Text as=\"span\" size=\"xs\" tone=\"muted\">\n The URL is derived from the slug (and parent) — set a slug to define it.\n </Text>\n )}\n </Row>\n )\n}\n\ninterface FieldGroup {\n name: string\n fields: FieldDef[]\n /** EC-306: the presentational section descriptor, if one was declared for this group. */\n section?: FieldGroupSection\n}\n\nfunction groupFields(fields: FieldDef[], collection: CollectionDef): FieldGroup[] {\n const order = groupOrder(collection.form)\n const byGroup = new Map<string, FieldDef[]>()\n for (const field of fields) {\n const group = field.form?.group ?? 'fields'\n if (!byGroup.has(group)) byGroup.set(group, [])\n byGroup.get(group)!.push(field)\n }\n const names = [...byGroup.keys()].sort((a, b) => {\n const ia = order.indexOf(a)\n const ib = order.indexOf(b)\n return (ia < 0 ? 99 : ia) - (ib < 0 ? 99 : ib)\n })\n return names.map((name) => ({\n name,\n section: groupSectionOf(collection.form, name),\n fields: byGroup.get(name)!.sort((a, b) => (a.form?.order ?? 99) - (b.form?.order ?? 99)),\n }))\n}\n\n// EC-306: translate a field's grid span (FIELD_WIDTH_SPANS, owned + tested in\n// core) into a literal Tailwind col-span class. Literal strings so Tailwind's\n// scanner generates them; the span math itself is single-sourced in core.\nconst COL_SPAN_CLASS: Record<number, string> = {\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n 6: 'md:col-span-6',\n 8: 'md:col-span-8',\n 9: 'md:col-span-9',\n 12: 'md:col-span-12',\n}\n\nfunction fieldWidthColSpan(width: FieldWidth | undefined): string {\n return COL_SPAN_CLASS[FIELD_WIDTH_SPANS[width ?? '100%']] ?? 'md:col-span-12'\n}\n\nfunction primaryTitle(\n doc: CmsDocument,\n collection: CollectionDef,\n locale: Locale,\n config: LocaleConfig,\n): string {\n // EC-242: the header title is the document identity (resolveDocumentTitle) — a\n // string `titleField` or a function pattern — over the fallback-resolved values,\n // the same resolver that drives relation labels and the list title column.\n return resolveDocumentTitle(collection, resolveDocumentForLocale(collection, doc, locale, config), '')\n}\n"]}
|
|
1
|
+
{"version":3,"file":"detail-editor.js","sourceRoot":"","sources":["../../../src/components/cms/detail-editor.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Link, STUDIO_PROJECT_ROUTE, studioPath, useNavigate } from '@elytracms/studio/router'\nimport {\n Check,\n CircleAlert,\n CircleCheck,\n ExternalLink,\n Eye,\n EyeOff,\n GitCompareArrows,\n History,\n Languages,\n Link2,\n Loader2,\n Lock,\n MoreHorizontal,\n Tag,\n Trash2,\n X,\n} from 'lucide-react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n FIELD_WIDTH_SPANS,\n SIDEBAR_FIELD_GROUP,\n clearHiddenValues,\n documentKey,\n groupOrder,\n groupSectionOf,\n hasAliases,\n hiddenGroupNames,\n isBlocksField,\n isFieldHidden,\n isFieldLocalized,\n isSingleton,\n resolveDocumentForLocale,\n resolveDocumentTitle,\n resolveField,\n sidebarFields,\n titleFieldOf,\n staticFieldHidden,\n urlForDocument,\n} from '@elytracms/core/cms-core'\nimport type {\n CmsDocument,\n CmsValidationIssue,\n CollectionDef,\n DocumentRef,\n DocumentUrl,\n FieldDef,\n FieldGroupSection,\n FieldWidth,\n Locale,\n LocaleConfig,\n} from '@elytracms/core/cms-core'\nimport { blockRootsOf } from '@elytracms/core/project-graph'\nimport {\n Badge,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n CollapsibleSection,\n Field,\n Heading,\n Row,\n Spacer,\n Stack,\n Text,\n toast,\n} from '@elytracms/studio/ui'\nimport { getStudioRegistry } from '@elytracms/studio/lib/registry'\nimport { collectEmbedRefs, resolveReuseCapability } from '../builder/reuse'\nimport { cn } from '@elytracms/studio/lib/utils'\nimport { localizedLabel } from '@elytracms/studio/lib/i18n'\nimport {\n LocaleSwitcher,\n displayedFieldFallback,\n hasLocaleVariant,\n localeChipLabel,\n setStudioLocale,\n} from '@elytracms/studio/lib/locale'\nimport { parseDocumentFieldPath } from '@elytracms/studio/lib/references'\nimport type { ReferenceAction } from '@elytracms/studio/lib/references'\nimport { FallbackChip, fallbackTitle } from './cell'\nimport { FieldControl } from './field-control'\nimport { CompositionFieldEditor } from '../builder/composition-field-editor'\nimport { fieldLabel } from './cms-store'\nimport { useCmsCollectionViewSource } from '../collection-view/cms-collection-view-source'\nimport { CollectionViewProvider, useCollectionView } from '../collection-view/collection-view-context'\nimport { resolveFieldAccess } from '@elytracms/studio/lib/collection-view/collection-view-source'\nimport type { CollectionViewSource } from '@elytracms/studio/lib/collection-view/collection-view-source'\nimport { DocStateBadge } from './doc-state'\nimport { UnsavedChangesGuard } from '../guards'\nimport { ReferenceConfirmDialog } from './reference-confirm'\nimport { ReferencesPanel } from '../references/references-panel'\nimport { InspectorSidebar } from '../inspector/inspector-sidebar'\nimport type { InspectorPane } from '../inspector/inspector-sidebar'\nimport { DocumentEditorProvider } from './document-editor-context'\nimport type { CompareState } from './document-editor-context'\nimport { VersionsPane } from './versions-pane'\nimport { VersionCompare } from './version-compare'\nimport { IssuesPane } from './issues-pane'\nimport { DetailsPane } from './details-pane'\nimport { useSetBreadcrumb } from '../breadcrumb-context'\nimport type { BreadcrumbItem } from '../breadcrumb-context'\nimport { resolveDeploymentFrontendUrl, resolveDeploymentRoutes } from '@elytracms/studio/lib/workspace'\nimport { usePublishedDocuments } from '@elytracms/studio/lib/cms/published-documents'\n\n/** The conventional slug field name (mirrors `url-for-document`'s `SLUG_FIELD`). */\nconst SLUG_FIELD = 'slug'\n\nexport function DetailEditor({\n projectId,\n collectionId,\n documentId,\n focusPath,\n}: {\n projectId: string\n collectionId: string\n documentId: string\n /** Reference-index field path (`?field=`, EC-172): highlight + scroll to the exact field. */\n focusPath?: string\n}) {\n // AD-19: the edit shell is a portable surface over a CollectionViewSource, just\n // like the list. `DetailEditor` is the CMS entry point — it builds the CMS source\n // and hands it to the portable {@link PortableDetailEditor} so `EditorBody` (and\n // the shared field controls / pickers) render over the source, never `useCms()`.\n const source = useCmsCollectionViewSource(collectionId)\n if (!source) {\n return (\n <DocumentNotFound\n projectId={projectId}\n listPath={studioPath.cmsCollection(collectionId)}\n label={collectionId}\n />\n )\n }\n return (\n <PortableDetailEditor source={source} projectId={projectId} documentId={documentId} focusPath={focusPath} />\n )\n}\n\n/**\n * The portable edit shell (EC-240 / AD-19): resolve the record by id from ANY\n * {@link CollectionViewSource}, then render the shared {@link EditorBody} over it.\n * The CMS entry point ({@link DetailEditor}) and the users rail both mount this —\n * routing (the \"back to list\" target, the not-found link) is rail-owned via\n * `source.listPath`, so the shell never hard-codes the CMS route.\n */\nexport function PortableDetailEditor({\n source,\n projectId,\n documentId,\n focusPath,\n}: {\n source: CollectionViewSource\n projectId: string\n documentId: string\n focusPath?: string\n}) {\n const doc = source.get({ collection: source.collectionId, id: documentId })\n // EC-274: singleton opening is owned by `SingletonGate` (it resolves the lone\n // document and materializes it). The detail editor just renders the document it\n // is given by id — singletons need no special case here.\n if (!doc) {\n return (\n <DocumentNotFound\n projectId={projectId}\n listPath={source.listPath}\n label={localizedLabel(source.schema.form?.label, source.collectionId)}\n />\n )\n }\n return (\n <CollectionViewProvider source={source}>\n <EditorBody\n key={`${source.collectionId}/${documentId}`}\n projectId={projectId}\n collection={source.schema}\n doc={doc}\n focusPath={focusPath}\n />\n </CollectionViewProvider>\n )\n}\n\n/** The record-not-found state — a heading + a rail-owned \"back to list\" link. */\nfunction DocumentNotFound({\n projectId,\n listPath,\n label,\n}: {\n projectId: string\n listPath?: string\n label: string\n}) {\n return (\n <div className=\"grid h-full place-items-center p-8\">\n <Stack gap=\"3\" align=\"center\" className=\"text-center\">\n <Heading level={2} size=\"h2\">\n Not found\n </Heading>\n {listPath !== undefined ? (\n <Link\n to={STUDIO_PROJECT_ROUTE}\n params={{ projectId, _splat: listPath }}\n className=\"text-sm text-primary hover:underline\"\n >\n Back to {label}\n </Link>\n ) : null}\n </Stack>\n </div>\n )\n}\n\n/** The loaded state of a document's pinned published snapshot (EC-226). */\ntype PublishedSnapshot =\n | { status: 'loading' }\n | { status: 'ready'; doc: CmsDocument }\n | { status: 'missing' }\n\nfunction EditorBody({\n projectId,\n collection,\n doc,\n focusPath,\n}: {\n projectId: string\n collection: CollectionDef\n doc: CmsDocument\n focusPath?: string\n}) {\n const source = useCollectionView()\n const navigate = useNavigate()\n // AD-19: capability flags gate whole shell regions AND their method groups, so\n // the SAME edit shell serves a non-publishing / non-versioned / single-locale\n // rail (the users rail, EC-240) without a bespoke editor. A false flag hides its\n // region entirely — no dead controls, no reads fired on that region's behalf.\n const canPublish = source.capabilities.publish\n const canVersions = source.capabilities.versions\n const canLocales = source.capabilities.locales\n // References is the CMS content-graph surface (the reference index tracks the\n // publishable document rail). A non-publishing rail (users, future redirects) is\n // not part of that graph, so its References tab would be structurally empty —\n // gate it off. A dedicated `references` capability can split this later if a\n // non-publishing-but-referenceable rail appears (YAGNI today).\n const showReferences = canPublish\n // Principal-based field access (EC-240, AD-18): `edit|read|hidden`, resolved\n // per field for the current principal. Default-open — a source with no policy\n // derives it from `isFieldReadOnly`. Access depends on the record's identity, not\n // its edited values (content-conditional hiding is the separate `isHidden` axis),\n // so it keys off the stable `doc`, never the live draft.\n const accessOf = useCallback(\n (field: FieldDef) => resolveFieldAccess(source, field, doc),\n [source, doc],\n )\n // EC-217: a singleton collection has no list — there is nowhere to go \"back\"\n // to, and its one document is fixed (never deleted). The header drops the\n // back-crumb/id line and the Delete action accordingly.\n const singleton = isSingleton(collection)\n const [draft, setDraft] = useState<CmsDocument>(() => structuredClone(doc))\n // The studio's ambient active locale (EC-176): the form displays and edits\n // exactly this locale — switched via the shared LocaleSwitcher, never per field.\n const locale = source.activeLocale\n // Bumped when a version restore replaces the draft out-of-band, to remount the\n // (uncontrolled) canvas editor from the restored value (EC-224).\n const [restoreNonce, setRestoreNonce] = useState(0)\n // EC-173: unpublish/delete go through the reference-aware confirmation.\n const [confirmAction, setConfirmAction] = useState<ReferenceAction | null>(null)\n // Stable so the document-editor context value (EC-224) doesn't churn each render.\n const ref = useMemo(() => ({ collection: collection.id, id: doc.id }), [collection.id, doc.id])\n const confirmTargets = useMemo(\n () => [{ collection: collection.id, id: doc.id }],\n [collection.id, doc.id],\n )\n\n // EC-226: the draft/published VIEW perspective. Draft = the editable working\n // draft; Published = the pinned published snapshot, rendered read-only. Only\n // meaningful when the document is published.\n const published = source.publishing?.isPublished(ref) ?? false\n const [perspective, setPerspective] = useState<'draft' | 'published'>('draft')\n const [publishedSnapshot, setPublishedSnapshot] = useState<PublishedSnapshot>({ status: 'loading' })\n // Snap back to Draft if the document is unpublished while viewing Published.\n useEffect(() => {\n if (!published) setPerspective('draft')\n }, [published])\n // Load the pinned published snapshot when viewing Published (fresh each switch,\n // so it reflects the current pin after a re-publish). `loadDocumentVersions` is\n // a stable callback, so this only re-runs on a perspective/ref change.\n const loadVersions = source.versioning?.load\n useEffect(() => {\n if (perspective !== 'published') return\n if (!loadVersions) return\n let cancelled = false\n setPublishedSnapshot({ status: 'loading' })\n void (async () => {\n const view = await loadVersions(ref)\n if (cancelled) return\n const pinned =\n view.publishedVersion !== undefined\n ? view.versions.find((v) => v.version === view.publishedVersion)?.snapshot\n : undefined\n setPublishedSnapshot(pinned ? { status: 'ready', doc: pinned } : { status: 'missing' })\n })()\n return () => {\n cancelled = true\n }\n }, [perspective, ref, loadVersions])\n\n // The whole fieldset is read-only when viewing Published. The form/canvas\n // render the pinned snapshot ONLY once it has loaded — never the draft, which\n // must not be presented as published; until then the body shows a placeholder.\n const viewReadOnly = perspective === 'published'\n const viewDoc =\n viewReadOnly && publishedSnapshot.status === 'ready' ? publishedSnapshot.doc : draft\n const publishedPending = viewReadOnly && publishedSnapshot.status !== 'ready'\n\n const dirty = JSON.stringify(draft) !== JSON.stringify(doc)\n const schemaIssues = useMemo(() => source.validate(draft), [source, draft])\n // EC-300/AD-16: composition embeds (hard references) whose target isn't published\n // would render empty on the live site. Surface them as errors in the Issues panel,\n // but they DON'T gate the Publish button (schema errors do) — publishing is\n // confirm-through, so the editor can publish the page and the reusable together\n // knowingly. The publish guard below catches them.\n const referenceIssues = useMemo(\n () => unpublishedEmbedIssues(collection, draft, source),\n [collection, draft, source],\n )\n const issues = useMemo(\n () => [...schemaIssues, ...referenceIssues],\n [schemaIssues, referenceIssues],\n )\n const errorCount = schemaIssues.filter((i) => i.severity === 'error').length\n const hasErrors = errorCount > 0\n const hasUnpublishedRefs = referenceIssues.length > 0\n\n // --- Save mode (EC-225 autosave · EC-240 explicit) -------------------------\n // A publishing rail AUTOSAVES: the draft persists 1s after the last edit and\n // publish is the deliberate commit. A non-publishing rail (users, EC-240) has no\n // publish step, so silent apply is the wrong default for authority data — it\n // SAVES EXPLICITLY instead: edits stay in the draft until the Save button, and a\n // navigation guard protects unsaved changes. (Role stays in `members`, applied\n // on Save and enforced immediately — never behind a publish pointer.)\n // Refs let the unmount flush read the latest values without re-subscribing.\n const explicitSave = !canPublish\n const draftRef = useRef(draft)\n draftRef.current = draft\n const dirtyRef = useRef(dirty)\n dirtyRef.current = dirty\n const sourceRef = useRef(source)\n sourceRef.current = source\n const explicitSaveRef = useRef(explicitSave)\n explicitSaveRef.current = explicitSave\n\n useEffect(() => {\n if (explicitSave) return // explicit rails persist only via the Save button\n if (!dirty) return\n const timer = window.setTimeout(() => sourceRef.current.save(draftRef.current), 1000)\n return () => window.clearTimeout(timer)\n }, [dirty, draft, explicitSave])\n\n // Flush a still-pending AUTOSAVE edit on unmount (navigating away inside the\n // debounce window) so nothing is lost. Explicit rails never flush silently —\n // their `UnsavedChangesGuard` catches the navigation instead. Unmount-only.\n useEffect(\n () => () => {\n if (!explicitSaveRef.current && dirtyRef.current) sourceRef.current.save(draftRef.current)\n },\n [],\n )\n const errorsByField = useMemo(() => {\n const map = new Map<string, string>()\n for (const issue of issues) {\n // validateDocument populates meta.field for field-level issues (works for\n // both `values` and `localized/<locale>` paths, unlike positional indexing).\n const field = issue.meta?.field\n if (typeof field === 'string' && !map.has(field)) map.set(field, issue.message)\n }\n return map\n }, [issues])\n\n const tabs = collection.form?.tabs ?? ['main']\n // EC-269: References gets its own dedicated, visibility-gated tab — it mounts\n // (and loads) only when selected, and unmounts on leave, so normal editing\n // never triggers reference fetching. Appended after the collection's content tabs.\n const REFERENCES_TAB = 'references'\n // EC-298: the version-compare view is a sticky framework tab (kept open while\n // you tab to the real fields; closed only by its ✕).\n const COMPARE_TAB = 'compare'\n const [activeTab, setActiveTab] = useState(tabs[0]!)\n // EC-285: the reserved `sidebar` group is document-level metadata (slug, author…)\n // — it renders in the Details inspector pane, not as a content tab, so it is\n // excluded from the tab fields here and collected once below.\n const sidebarFieldDefs = useMemo(() => sidebarFields(collection), [collection])\n // EC-273: only STATICALLY hidden fields (`hidden: true`) are structurally\n // excluded here; a conditionally (predicate) hidden field stays in the tab and\n // is evaluated per-render against the current values (it may show or hide as the\n // editor types).\n const tabFields = collection.fields.filter(\n (f) =>\n (f.form?.tab ?? tabs[0]) === activeTab &&\n !staticFieldHidden(f) &&\n f.form?.group !== SIDEBAR_FIELD_GROUP,\n )\n const groups = groupFields(tabFields, collection)\n // EC-188 (AD-12): a composition (`blocks`) field is a special content feature,\n // not a field-row — it takes over its tab with the full page-builder canvas.\n // Convention: such a field lives on its own dedicated fieldset tab.\n const canvasField = tabFields.find(isBlocksField)\n\n const [highlightedField, setHighlightedField] = useState<string | null>(null)\n // EC-285: the form-path inspector's active pane, controlled so a jump to a\n // `sidebar`-group field can open the Details pane (where it renders). Undefined\n // = uncontrolled (the sidebar defaults to its first pane).\n const [inspectorPaneId, setInspectorPaneId] = useState<string>()\n // EC-298: the open version comparison. The Compare tab is STICKY — opening it\n // sets the selection and focuses the tab; tabbing to the real fields keeps it\n // open (the selection persists) so an editor can flip between diff and fields;\n // only its ✕ closes it. `activeTab === COMPARE_TAB` is when the diff is visible.\n const [compare, setCompare] = useState<CompareState | null>(null)\n const startCompare = useCallback((base: number) => {\n setCompare({ base, target: 'draft' })\n setActiveTab(COMPARE_TAB)\n setInspectorPaneId('versions')\n }, [])\n const setCompareBase = useCallback((base: number) => {\n setCompare((c) => (c ? { ...c, base } : { base, target: 'draft' }))\n }, [])\n const setCompareTarget = useCallback((target: number | 'draft') => {\n setCompare((c) => (c ? { ...c, target } : c))\n }, [])\n const exitCompare = useCallback(() => {\n setCompare(null)\n setActiveTab((prev) => (prev === COMPARE_TAB ? tabs[0]! : prev))\n }, [tabs])\n // A content tab (schema tab or References). Selecting one leaves the Compare\n // view VISIBLE-wise but keeps the comparison open (sticky) — the diff is one\n // click away on its still-present tab chip.\n const renderContentTab = (tab: string) => {\n const active = tab === activeTab\n return (\n <button\n key={tab}\n type=\"button\"\n aria-pressed={active}\n onClick={() => setActiveTab(tab)}\n className={cn(\n 'rounded-md px-2.5 py-1 text-xs font-medium capitalize transition-colors',\n active ? 'bg-accent text-accent-foreground' : 'text-muted-foreground hover:bg-muted',\n )}\n >\n {tab}\n </button>\n )\n }\n // Focus a field by name: switch to its tab (and locale, when given), scroll the\n // control into view, and ring-highlight it. Shared by the reference deep-link\n // (`focusPath`, EC-172) and the Issues pane's jump-to-field (EC-283).\n const focusTimersRef = useRef<number[]>([])\n const focusField = useCallback(\n (fieldName: string, localeHint?: string) => {\n const field = collection.fields.find((f) => f.name === fieldName)\n if (!field) return\n // EC-285: a `sidebar`-group field renders in the Details inspector pane, not\n // a content tab — open that pane instead of switching tabs.\n if (field.form?.group === SIDEBAR_FIELD_GROUP) {\n setInspectorPaneId('details')\n } else {\n const fieldTabs = collection.form?.tabs ?? ['main']\n setActiveTab(field.form?.tab ?? fieldTabs[0]!)\n }\n if (localeHint !== undefined && source.localeConfig.locales.includes(localeHint)) {\n setStudioLocale(localeHint)\n }\n setHighlightedField(field.name)\n // Clear any timers from a prior jump so back-to-back jumps don't fight.\n focusTimersRef.current.forEach((t) => window.clearTimeout(t))\n const scrollTimer = window.setTimeout(() => {\n // Some controls (relation/asset pickers) don't render the input id —\n // the field label (`htmlFor`) is always present.\n const control =\n document.getElementById(`f-${field.name}`) ??\n document.querySelector(`label[for=\"${CSS.escape(`f-${field.name}`)}\"]`)\n control?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n }, 60)\n const clearTimer = window.setTimeout(() => setHighlightedField(null), 3200)\n focusTimersRef.current = [scrollTimer, clearTimer]\n },\n [collection, source.localeConfig],\n )\n useEffect(() => () => focusTimersRef.current.forEach((t) => window.clearTimeout(t)), [])\n\n // Reference deep links (EC-172): `?field=<index path>` pinpoints the exact field.\n useEffect(() => {\n if (!focusPath) return\n const parsed = parseDocumentFieldPath(focusPath)\n if (!parsed) return\n focusField(parsed.field, parsed.locale)\n }, [focusPath, focusField])\n\n function getValue(field: FieldDef): unknown {\n // EC-226: read from the active VIEW (the draft, or the pinned published\n // snapshot when viewing Published) — never directly from `draft`.\n if (isFieldLocalized(collection, field.name)) {\n // Display the explicit variant when it exists, else the EC-018 fallback\n // value — labeled as such by the field's fallback marker (EC-176), so a\n // German view shows the English text visibly, never an unexplained blank.\n const explicit = viewDoc.localized?.[locale]?.[field.name]\n if (explicit !== undefined) return explicit\n return resolveField(collection, viewDoc, field.name, locale, source.localeConfig).value\n }\n return viewDoc.values[field.name]\n }\n\n function setValue(field: FieldDef, value: unknown) {\n setDraft((d) => {\n if (isFieldLocalized(collection, field.name)) {\n const perLocale = { ...(d.localized?.[locale] ?? {}) }\n if (value === undefined) delete perLocale[field.name]\n else perLocale[field.name] = value\n return { ...d, localized: { ...d.localized, [locale]: perLocale } }\n }\n const values = { ...d.values }\n if (value === undefined) delete values[field.name]\n else values[field.name] = value\n return { ...d, values }\n })\n }\n\n // EC-273: conditional-visibility context — the draft's values for the active\n // locale, against which a field's `hidden(values)` predicate is evaluated. A\n // hidden field's row is omitted (and it is not validated). Recomputed as the\n // draft changes, so a field shows/hides live as the editor types.\n const conditionValues = { ...draft.values, ...(draft.localized?.[locale] ?? {}) }\n const isHidden = (field: FieldDef) => isFieldHidden(field, { values: conditionValues })\n // Visible = not content-hidden AND not principal-hidden (EC-240 access === 'hidden').\n const isFieldShown = (field: FieldDef) => !isHidden(field) && accessOf(field) !== 'hidden'\n const visibleSidebarFields = sidebarFieldDefs.filter(isFieldShown)\n // EC-306: presentational group sections hidden right now (static or predicate) —\n // skipped entirely, like a hidden field. Recomputed live as the draft changes.\n const hiddenGroups = hiddenGroupNames(collection, { values: conditionValues })\n\n // One document field row (label + fallback/translation/read-only badges + the\n // control), shared by the content groups and the EC-285 Details pane so a\n // sidebar field renders identically — same control, validation, localization,\n // and EC-283 highlight/jump target — wherever it surfaces. Returns null when the\n // field is conditionally hidden (EC-273).\n function renderFieldRow(field: FieldDef) {\n if (isHidden(field)) return null\n // EC-240: principal-based access. `hidden` drops the row entirely (this\n // principal can't see the field); `read` renders it read-only. Distinct from\n // the content-conditional `isHidden` above and the view-level read-only\n // (Published perspective) — the control honors all three.\n const access = accessOf(field)\n if (access === 'hidden') return null\n const fieldLevelReadOnly = access === 'read'\n const fieldReadOnly = viewReadOnly || fieldLevelReadOnly\n const localized = isFieldLocalized(collection, field.name)\n // Fallback visibility (EC-176): the control DISPLAYS the fallback value, and\n // this marker says so on the exact field.\n const fallback = localized\n ? displayedFieldFallback(collection, viewDoc, field.name, locale, source.localeConfig)\n : null\n // The variant was created in this editing session (the saved document doesn't\n // have it yet): editing a fallback-shown value is an explicit translation act.\n // Moot (and hidden) while viewing the read-only published snapshot.\n const newlyTranslated =\n !viewReadOnly &&\n localized &&\n hasLocaleVariant(draft, field.name, locale) &&\n !hasLocaleVariant(doc, field.name, locale)\n return (\n <Field\n key={field.name}\n className={cn(\n 'rounded-md transition-shadow',\n highlightedField === field.name && 'bg-primary/5 p-2 ring-2 ring-primary/70',\n )}\n label={\n <Row gap=\"2\">\n <span>{fieldLabel(field)}</span>\n {field.validation?.required ? <span className=\"text-destructive\">*</span> : null}\n {localized ? <Badge variant=\"outline\">{locale}</Badge> : null}\n {fallback ? (\n <Badge\n variant=\"warning\"\n title={fallbackTitle(fallback)}\n data-testid={`field-fallback-${field.name}`}\n >\n showing {localeChipLabel(fallback.sourceLocale)}\n </Badge>\n ) : null}\n {newlyTranslated ? (\n <Badge variant=\"success\" data-testid={`field-translated-${field.name}`}>\n <Languages className=\"size-3\" /> translated to {localeChipLabel(locale)}\n </Badge>\n ) : null}\n {fieldLevelReadOnly ? (\n <Badge variant=\"outline\">\n <Lock className=\"size-3\" /> read-only\n </Badge>\n ) : null}\n <Spacer />\n </Row>\n }\n htmlFor={`f-${field.name}`}\n hint={\n fallback ? (\n <>\n Showing the {localeChipLabel(fallback.sourceLocale)} (fallback) value — edit to\n translate to {localeChipLabel(locale)}. Clearing the {localeChipLabel(locale)} text\n falls back again.\n </>\n ) : (\n localizedLabel(field.form?.description) || undefined\n )\n }\n error={fieldReadOnly ? undefined : errorsByField.get(field.name)}\n >\n <FieldControl\n id={`f-${field.name}`}\n field={field}\n value={getValue(field)}\n onChange={(v) => setValue(field, v)}\n readOnly={fieldReadOnly}\n />\n {/* EC-246d: the slug's derived URL, shown read-only right under the input —\n makes it unmistakable that the path is derived, not a second field. */}\n {field.name === SLUG_FIELD && routableCollection ? <PathPreview url={draftUrl} /> : null}\n </Field>\n )\n }\n\n function save() {\n source.save(draft)\n }\n\n // EC-224: a version restore swaps the working draft for an older snapshot; the\n // open editor adopts it so the form/canvas re-render from the restored content\n // (the operation already persisted it, so it lands clean/non-dirty).\n function replaceDraft(next: CmsDocument) {\n setDraft(next)\n // The canvas editor is uncontrolled after mount (it builds its graph once and\n // lifts edits OUT). A restore replaces the draft from outside, so bump the\n // nonce to REMOUNT the canvas from the restored value — otherwise it keeps the\n // pre-restore tree and the next edit would clobber the restore.\n setRestoreNonce((n) => n + 1)\n }\n\n // The frame-owned `Versions` pane (EC-224) — appended after any view-supplied\n // pane (the canvas's `Properties`). One instance feeds both the form view's\n // sidebar and the canvas view's sidebar.\n const versionsPane = useMemo<InspectorPane>(\n () => ({\n id: 'versions',\n label: 'Versions',\n icon: <History className=\"size-3.5\" />,\n render: () => <VersionsPane />,\n }),\n [],\n )\n // The frame-owned `Issues` pane (EC-283) — the document-scoped validation\n // surface that replaces the always-on footer band. The tab carries a count\n // badge (error- vs warning-toned) so a non-zero count is discoverable from\n // any tab; document-level issues (e.g. EC-260 nesting-depth) live only here.\n const issuesPane = useMemo<InspectorPane>(\n () => ({\n id: 'issues',\n label: 'Issues',\n icon: <CircleAlert className=\"size-3.5\" />,\n badge:\n issues.length === 0 ? undefined : (\n <Badge\n variant={issues.some((i) => i.severity === 'error') ? 'error' : 'warning'}\n className=\"px-1.5 py-0 leading-none\"\n >\n {issues.length}\n </Badge>\n ),\n render: () => (\n <IssuesPane issues={issues} collection={collection} onJumpToField={focusField} />\n ),\n }),\n [issues, errorCount, collection, focusField],\n )\n // EC-284 + EC-285: the document-metadata pane — slot assignment (EC-284) and/or\n // the document-level `sidebar`-group fields (EC-285). Present only when the\n // collection has either, so it never adds an empty tab elsewhere. First in the\n // order, so a slotted / sidebar-bearing document opens straight to it. Not\n // memoized: its render closes over per-render edit state (draft, highlight,\n // field errors) via `renderFieldRow`, and the inspector re-renders with the rest\n // of the editor anyway, so a stable pane identity would buy nothing here.\n const detailsPane: InspectorPane | null =\n hasAliases(collection) || visibleSidebarFields.length > 0\n ? {\n id: 'details',\n label: 'Details',\n icon: <Tag className=\"size-3.5\" />,\n render: () => (\n <DetailsPane\n collection={collection}\n doc={draft}\n siblings={source.documents()}\n readOnly={viewReadOnly}\n fields={visibleSidebarFields}\n renderField={renderFieldRow}\n onAliasChange={(alias) =>\n setDraft((d) => {\n const next = { ...d }\n if (alias === undefined) delete next.alias\n else next.alias = alias\n return next\n })\n }\n />\n ),\n }\n : null\n // Versions is capability-gated (AD-19): a non-versioned rail (users) never mounts\n // the pane, so no version read fires on its records.\n const trailingPanes = [\n ...(detailsPane ? [detailsPane] : []),\n ...(canVersions ? [versionsPane] : []),\n issuesPane,\n ]\n\n // EC-268: the Publish button is its own indicator — pending while the publish\n // round-trips, a brief success, and an error toast if it rejects at transport.\n const [publishState, setPublishState] = useState<'idle' | 'pending' | 'success'>('idle')\n // EC-300/AD-16: confirm-through guard when the page embeds unpublished reusables.\n const [publishConfirm, setPublishConfirm] = useState(false)\n\n // Gate publish on the confirm-through dialog when there are unpublished hard\n // references (they'd render empty on the live site); schema errors already\n // disable the button, so they never reach here.\n function handlePublish() {\n if (hasUnpublishedRefs) {\n setPublishConfirm(true)\n return\n }\n void doPublish()\n }\n\n async function doPublish() {\n // EC-273: clean conditionally-hidden values from the draft AT PUBLISH TIME.\n // While editing, the draft keeps them so an accidental hide (e.g. flipping a\n // link's type) is recoverable; publishing is the intentional moment we commit\n // the cleanup — into the draft AND the snapshot, so both go clean together (the\n // reference index updates off the saved draft, so a now-unlinked page becomes\n // deletable once the change is published). Also captures the latest edit in case\n // Publish is clicked inside the autosave debounce window; the serial persister\n // runs the upsert before the publish so the snapshot is exactly this draft (EC-225).\n const cleaned = clearHiddenValues(collection, draft)\n if (cleaned !== draft) setDraft(cleaned)\n if (cleaned !== draft || dirty) source.save(cleaned)\n // Publish snapshots the draft as a version and pins it (EC-224). The live\n // row stays a continuous draft — published-ness is the version pointer\n // (`source.publishing.isPublished`). Pre-gated by `disabled={hasErrors}`; the optimistic\n // flip reconciles against the backend (EC-225), so a logical rejection the\n // gate doesn't cover (schema divergence) self-corrects the badge. A hard\n // failure (transport) rejects the flush — surface it loudly (EC-268).\n setPublishState('pending')\n try {\n await source.publishing?.publish(ref)\n setPublishState('success')\n setTimeout(() => setPublishState('idle'), 1800)\n } catch (error) {\n setPublishState('idle')\n toast.error(error instanceof Error ? `Publish failed: ${error.message}` : 'Publish failed.')\n }\n }\n\n function handleConfirmedAction() {\n if (confirmAction === 'unpublish') {\n setConfirmAction(null)\n void source.publishing?.unpublish(ref)\n return\n }\n if (confirmAction === 'delete') {\n setConfirmAction(null)\n source.remove(ref)\n // Return to the rail's list (rail-owned `listPath`), or the project index if\n // the rail has no list surface (AD-19 — never a hard-coded CMS route).\n void navigate({\n to: STUDIO_PROJECT_ROUTE,\n params: { projectId, _splat: source.listPath ?? studioPath.index() },\n })\n }\n }\n\n // While the published snapshot is pending, don't derive the title from the\n // draft (it must not read as the published title) — fall back to the id.\n const title = publishedPending ? '' : primaryTitle(viewDoc, collection, locale, source.localeConfig)\n // EC-242: the untranslated-title chip applies only to a field-backed title; a\n // function title pattern has no single source field to mark as a fallback.\n const titleFallback =\n publishedPending || typeof collection.titleField === 'function'\n ? null\n : displayedFieldFallback(\n collection,\n viewDoc,\n titleFieldOf(collection)?.name ?? 'title',\n locale,\n source.localeConfig,\n )\n\n // EC-214: the document is the active record — contribute the collection (a\n // link back to its list) and the document title to the global header\n // breadcrumb, replacing the editor's own back-link + collection/id line. A\n // singleton has no list, so it contributes a single, non-linked crumb. The\n // title tracks the live draft so a rename updates the crumb immediately.\n const breadcrumbItems = useMemo<BreadcrumbItem[]>(() => {\n const collectionLabel = localizedLabel(collection.form?.label, collection.id)\n // A singleton (no list) or a rail with no list surface contributes a single,\n // non-linked crumb; otherwise the collection crumb links back to its list via\n // the rail-owned `listPath` (never a hard-coded CMS route — AD-19).\n if (singleton || source.listPath === undefined) return [{ label: collectionLabel }]\n const docTitle = primaryTitle(draft, collection, locale, source.localeConfig) || doc.id\n return [\n {\n label: collectionLabel,\n to: STUDIO_PROJECT_ROUTE,\n params: { projectId, _splat: source.listPath },\n },\n { label: docTitle },\n ]\n }, [singleton, collection, draft, locale, source.localeConfig, source.listPath, doc.id, projectId])\n useSetBreadcrumb(breadcrumbItems)\n\n // EC-205/EC-216: the LIVE URL derives strictly from PUBLISHED data — the\n // document's pinned published snapshot and its published ancestors — never the\n // draft (an unpublished slug/parent edit must not leak into the live URL). The\n // pool is exactly what the live site serves, so a published doc resolves to the\n // URL visitors actually get; `undefined` until the doc is published (and the\n // pool has loaded). The collection being routable gates the disabled hint below.\n const publishedDocs = usePublishedDocuments(source.projectId, collection.id)\n const routableCollection = useMemo(\n () => resolveDeploymentRoutes().some((route) => route.document?.collection === collection.id),\n [collection.id],\n )\n const liveUrl = useMemo(() => {\n const published = publishedDocs.byId.get(doc.id)\n if (!published) return undefined\n return urlForDocument(\n {\n routes: resolveDeploymentRoutes(),\n frontendUrl: resolveDeploymentFrontendUrl(),\n localeConfig: source.localeConfig,\n },\n collection,\n published,\n { siblings: [...publishedDocs.byId.values()], locale },\n )\n }, [publishedDocs, collection, doc.id, locale, source.localeConfig])\n // EC-246d: the DRAFT path — derived from the current edit (slug + parent chain),\n // not the published pool — so the slug field shows the URL forming live, before\n // the first publish. Read-only: the slug is the single editable source, the path\n // is always derived (never a second stored field). `undefined` until a slug\n // resolves a route (a fresh hierarchy page with no slug has no path yet).\n const draftUrl = useMemo(\n () =>\n urlForDocument(\n { routes: resolveDeploymentRoutes(), localeConfig: source.localeConfig },\n collection,\n viewDoc,\n { siblings: source.documents(), locale },\n ),\n [collection, viewDoc, locale, source],\n )\n\n // EC-240: hide the tab bar when there is nothing to navigate — a single content\n // tab with no References/Compare (the users rail). When framework tabs ARE\n // present we KEEP the content tab(s) so there is always a way back to the form;\n // only a genuinely single-tab surface drops them. And drop the whole lens row\n // when it would be empty (no tabs to show, no locale/perspective controls), so a\n // bare rail (users) shows no orphaned row.\n const hasFrameworkTabs = showReferences || compare !== null\n const showContentTabs = tabs.length > 1 || hasFrameworkTabs\n const showLensRow = showContentTabs || canLocales || canPublish\n\n return (\n <DocumentEditorProvider\n value={{\n projectId,\n collection,\n docRef: ref,\n draft,\n dirty,\n hasErrors,\n viewReadOnly,\n save,\n replaceDraft,\n compare,\n compareActive: activeTab === COMPARE_TAB,\n startCompare,\n setCompareBase,\n setCompareTarget,\n exitCompare,\n }}\n >\n <div className={cn('flex h-full min-h-0 flex-col', viewReadOnly && 'bg-info/[0.04]')}>\n {/* Header — the back-link + collection/id line moved into the global\n breadcrumb (EC-214); this keeps only the record title + actions. */}\n <div className=\"shrink-0 border-b border-border px-4 py-3 sm:px-6\">\n <Row gap=\"3\">\n <Row gap=\"2\" align=\"center\" className=\"min-w-0\">\n <Heading level={1} size=\"h2\" className=\"truncate\">\n {singleton ? localizedLabel(collection.form?.label, collection.id) : title || doc.id}\n </Heading>\n {singleton ? null : <FallbackChip fallback={titleFallback} testId=\"doc-title-fallback\" />}\n </Row>\n <Spacer />\n {/* Save status — an autosave rail reports Saving…/Saved; an explicit rail\n (users) reports Unsaved changes until the Save button commits. */}\n <Text size=\"xs\" tone=\"muted\" className=\"whitespace-nowrap\" data-testid=\"autosave-status\">\n {source.lastError\n ? 'Save failed'\n : explicitSave\n ? dirty\n ? 'Unsaved changes'\n : 'Saved'\n : dirty\n ? 'Saving…'\n : 'Saved'}\n </Text>\n {canPublish ? <DocStateBadge published={published} /> : null}\n {/* EC-216: open the document's live URL. Enabled once published with a\n configured frontendUrl; otherwise a disabled hint explains why. */}\n {/* EC-216 + EC-205: open the document's LIVE (published) URL. Enabled\n only once the published snapshot exists and a frontendUrl is set;\n otherwise a disabled hint explains why. Hidden for non-routable\n collections (e.g. singletons). */}\n {routableCollection ? (\n liveUrl?.href ? (\n <Button asChild variant=\"outline\" size=\"sm\" title={`Open ${liveUrl.path}`}>\n <a href={liveUrl.href} target=\"_blank\" rel=\"noreferrer\" data-testid=\"view-live\">\n <ExternalLink /> View live\n </a>\n </Button>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled\n data-testid=\"view-live-disabled\"\n title={\n publishedDocs.status === 'loading'\n ? 'Loading the live URL…'\n : !published\n ? 'Publish to view the live page'\n : 'Set frontendUrl in elytra.config.ts to enable'\n }\n >\n <ExternalLink /> View live\n </Button>\n )\n ) : null}\n {canPublish ? (\n <Button\n size=\"sm\"\n onClick={handlePublish}\n disabled={hasErrors || viewReadOnly || publishState === 'pending'}\n title={\n viewReadOnly\n ? 'Switch to Draft to publish'\n : hasErrors\n ? `Fix ${errorCount} ${errorCount === 1 ? 'issue' : 'issues'} to publish`\n : undefined\n }\n >\n {publishState === 'pending' ? (\n <>\n <Loader2 className=\"animate-spin\" /> Publishing…\n </>\n ) : publishState === 'success' ? (\n <>\n <CircleCheck /> Published\n </>\n ) : (\n <>\n <Eye /> Publish\n </>\n )}\n </Button>\n ) : null}\n {/* EC-240: an explicit-save rail commits the draft on demand (no publish\n step). Disabled until there are unsaved edits; the guard covers leaving. */}\n {explicitSave ? (\n <Button size=\"sm\" onClick={save} disabled={!dirty} data-testid=\"doc-save\">\n <Check /> Save\n </Button>\n ) : null}\n {/* EC-217: a singleton is never deleted; with nothing else to show\n (an unpublished singleton) the actions menu is omitted entirely. */}\n {published || !singleton ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"icon-sm\" aria-label=\"More actions\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {published ? (\n <DropdownMenuItem onClick={() => setConfirmAction('unpublish')}>\n <EyeOff /> Unpublish\n </DropdownMenuItem>\n ) : null}\n {singleton ? null : (\n <DropdownMenuItem\n data-testid=\"doc-delete\"\n className=\"text-destructive\"\n onClick={() => setConfirmAction('delete')}\n >\n <Trash2 /> Delete\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </Row>\n\n {/* EC-246a consistency: this lens row mirrors the list header — the tabs\n (EC-073) lead on the left (like the list's view tabs), and the lens\n CONTROLS sit on the right: the ambient locale switcher (EC-176) then the\n Draft/Published view perspective (EC-226) — exactly where the list keeps\n locale + Display, so the locale no longer jumps sides between views. */}\n {showLensRow ? (\n <Row gap=\"3\" className=\"mt-3\" wrap>\n <Row gap=\"1\" align=\"center\">\n {/* Schema content tabs (EC-073), then a divider, then the framework\n tabs (EC-269 References; EC-298 the transient Compare chip). While\n comparing, no content tab is highlighted — the Compare chip is the\n active view, and clicking a content tab closes the comparison. A\n single-tab surface with no framework tabs hides these entirely. */}\n {showContentTabs ? tabs.map((tab) => renderContentTab(tab)) : null}\n {showReferences ? (\n <>\n <div className=\"mx-1 h-4 w-px bg-border\" aria-hidden />\n {renderContentTab(REFERENCES_TAB)}\n </>\n ) : null}\n {compare ? (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-colors',\n activeTab === COMPARE_TAB\n ? 'bg-accent text-accent-foreground'\n : 'text-muted-foreground hover:bg-muted',\n )}\n >\n <button\n type=\"button\"\n onClick={() => setActiveTab(COMPARE_TAB)}\n aria-pressed={activeTab === COMPARE_TAB}\n className=\"inline-flex items-center gap-1\"\n >\n <GitCompareArrows className=\"size-3\" aria-hidden /> Compare\n </button>\n <button\n type=\"button\"\n onClick={exitCompare}\n aria-label=\"Close compare\"\n className=\"ml-0.5 rounded p-0.5 hover:bg-background/40\"\n >\n <X className=\"size-3\" />\n </button>\n </span>\n ) : null}\n </Row>\n <Spacer />\n {canLocales ? <LocaleSwitcher /> : null}\n {canPublish ? (\n <Row gap=\"px\" className=\"rounded-md bg-muted/60 p-0.5\">\n <PerspectiveButton\n label=\"Draft\"\n active={perspective === 'draft'}\n onClick={() => setPerspective('draft')}\n />\n <PerspectiveButton\n label=\"Published\"\n active={perspective === 'published'}\n accent=\"info\"\n disabled={!published}\n title={published ? undefined : 'Publish this document to view its published version'}\n onClick={() => setPerspective('published')}\n />\n </Row>\n ) : null}\n </Row>\n ) : null}\n </div>\n\n {/* EC-214: an unmistakable banner whenever the read-only Published snapshot\n is in view — disabled controls + a footer notice alone read as too\n subtle. Paired with the tinted surface and the accented toggle. */}\n {viewReadOnly ? (\n <Row\n gap=\"2\"\n className=\"shrink-0 border-b border-info/30 bg-info/10 px-4 py-1.5 text-info sm:px-6\"\n data-testid=\"published-view-banner\"\n >\n <Lock className=\"size-3.5 shrink-0\" aria-hidden />\n <Text size=\"xs\" className=\"text-info\">\n Viewing the published version — read-only.\n </Text>\n <Spacer />\n <button\n type=\"button\"\n onClick={() => setPerspective('draft')}\n className=\"text-xs font-medium underline-offset-2 hover:underline\"\n >\n Switch to Draft\n </button>\n </Row>\n ) : null}\n\n {/* Body — a blocks field takes over the body with the page-builder canvas\n (which carries its own inspector sidebar, EC-188/EC-224); otherwise the\n field form sits beside the shared inspector sidebar (Versions). In\n Published view the snapshot must load before rendering — the draft is\n never shown as published (EC-226). */}\n {publishedPending ? (\n <div className=\"grid min-h-0 flex-1 place-items-center p-8\">\n <Text size=\"sm\" tone=\"muted\">\n {publishedSnapshot.status === 'loading'\n ? 'Loading the published version…'\n : 'No published version found for this document.'}\n </Text>\n </div>\n ) : activeTab === COMPARE_TAB && compare ? (\n // EC-298: the version compare view takes over the main area, with the\n // shared inspector (Versions pane) staying on as the navigator — an\n // in-app surface, not a modal, so arbitrary versions can be browsed.\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <div className=\"min-h-0 flex-1 overflow-auto\">\n <VersionCompare />\n </div>\n <InspectorSidebar\n panes={trailingPanes}\n activeId={inspectorPaneId}\n onActiveChange={setInspectorPaneId}\n className=\"w-[320px] shrink-0 border-l border-border\"\n />\n </div>\n ) : canvasField ? (\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <CompositionFieldEditor\n key={`${canvasField.name}:${restoreNonce}:${perspective}`}\n field={canvasField}\n value={getValue(canvasField)}\n onChange={(v) => setValue(canvasField, v)}\n readOnly={viewReadOnly || source.isFieldReadOnly(canvasField)}\n trailingPanes={trailingPanes}\n />\n </div>\n ) : activeTab === REFERENCES_TAB ? (\n // EC-269: mounted only while this tab is active → reference data loads on\n // demand and is torn down on leave (no fetching during normal editing).\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <div className=\"min-h-0 flex-1 overflow-auto p-4 sm:p-6\">\n <div className=\"mx-auto w-full max-w-2xl\">\n <ReferencesPanel\n projectId={projectId}\n source={{ type: 'document', id: documentKey(ref) }}\n target={{ type: 'document', id: documentKey(ref) }}\n />\n </div>\n </div>\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <div className=\"min-h-0 flex-1 overflow-auto p-4 sm:p-6\">\n <div className=\"mx-auto w-full max-w-2xl\">\n <Stack gap=\"6\">\n {groups.map((group) => {\n // EC-306: a conditionally/statically hidden group section is skipped\n // entirely (its fields are also exempt from validation).\n if (hiddenGroups.has(group.name)) return null\n // EC-273/EC-240: drop a fieldset whose every field is hidden — whether\n // content-conditionally or for this principal — so the form never\n // shows an empty section header.\n const visible = group.fields.filter(isFieldShown)\n if (visible.length === 0) return null\n const section = group.section\n return (\n <CollapsibleSection\n key={group.name}\n collapsible={section?.collapsible}\n defaultOpen={section?.defaultOpen}\n title={\n <Text\n size=\"sm\"\n weight=\"semibold\"\n className={section?.title ? undefined : 'capitalize'}\n >\n {section?.title ?? group.name}\n </Text>\n }\n >\n {/* EC-306: fractional field widths — a 12-col grid honoring each\n field's `form.width`, collapsing to one column on narrow widths. */}\n <div className=\"grid grid-cols-1 gap-4 p-4 md:grid-cols-12\">\n {visible.map((field) => (\n <div\n key={field.name}\n className={cn('col-span-1', fieldWidthColSpan(field.form?.width))}\n >\n {renderFieldRow(field)}\n </div>\n ))}\n </div>\n </CollapsibleSection>\n )\n })}\n </Stack>\n </div>\n </div>\n <InspectorSidebar\n panes={trailingPanes}\n activeId={inspectorPaneId}\n onActiveChange={setInspectorPaneId}\n className=\"w-[320px] shrink-0 border-l border-border\"\n />\n </div>\n )}\n\n {/* EC-283: the always-on validation footer is retired. Validation now lives\n in the document-scoped `Issues` inspector pane (full list + jump-to-field,\n count badge on its tab), field issues stay inline, and the Publish button\n gates on errors. Read-only is announced by the top banner (EC-214). */}\n\n {/* EC-240: on an explicit-save rail (no autosave), guard navigation away from\n unsaved edits — offer Save / Discard / Cancel. Autosave rails flush on\n unmount instead, so the guard is inert there. */}\n {explicitSave ? (\n <UnsavedChangesGuard\n when={dirty}\n onSave={() => {\n save()\n return true\n }}\n description=\"You have unsaved changes to this record. Save them before leaving, or discard them.\"\n />\n ) : null}\n\n {/* Reference-aware unpublish/delete confirmation (EC-173). */}\n {confirmAction !== null ? (\n <ReferenceConfirmDialog\n projectId={projectId}\n action={confirmAction}\n targets={confirmTargets}\n open\n onOpenChange={(open) => {\n if (!open) setConfirmAction(null)\n }}\n onConfirm={handleConfirmedAction}\n />\n ) : null}\n\n {/* EC-300/AD-16: confirm-through guard for unpublished hard references. The\n schema is valid (those errors block the button); these would just render\n empty on the live site, so the editor confirms rather than being blocked. */}\n <Dialog open={publishConfirm} onOpenChange={(open) => { if (!open) setPublishConfirm(false) }}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Publish with unpublished references?</DialogTitle>\n <DialogDescription>\n This page references content that isn’t published yet — those sections will be empty on\n the live site until you publish it too.\n </DialogDescription>\n </DialogHeader>\n <Stack gap=\"1\">\n {referenceIssues.map((issue, i) => (\n <Text key={`${issue.meta?.id ?? i}`} size=\"xs\" tone=\"muted\">\n • {issue.message}\n </Text>\n ))}\n {/* Awareness only — other (non-blocking) issues don't gate publish, but\n surfacing the count keeps the confirm honest (AD-16). Schema errors\n can't be here: they disable the button before it opens. */}\n {schemaIssues.length > 0 ? (\n <Text size=\"xs\" tone=\"muted\" className=\"mt-1\">\n This page also has {schemaIssues.length} other unresolved{' '}\n {schemaIssues.length === 1 ? 'issue' : 'issues'} — see the Issues tab.\n </Text>\n ) : null}\n </Stack>\n <DialogFooter className=\"mt-4\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPublishConfirm(false)}>\n Cancel\n </Button>\n <Button\n size=\"sm\"\n data-testid=\"publish-anyway\"\n onClick={() => {\n setPublishConfirm(false)\n void doPublish()\n }}\n >\n Publish anyway\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n </DocumentEditorProvider>\n )\n}\n\n/**\n * EC-300/AD-16 — errors for composition embeds (hard references) whose target isn't\n * published: they render empty on the live site. Walks every `blocks` field of the\n * document for reuse embeds; a missing target is an `unknown-relation-target` error,\n * an unpublished one an `unpublished-relation-target` error. Publishing is\n * confirm-through (not blocked), so these feed the Issues panel + the publish\n * confirmation, never the button's disabled gate. No reuse capability → none.\n */\nfunction unpublishedEmbedIssues(\n collection: CollectionDef,\n draft: CmsDocument,\n source: CollectionViewSource,\n): CmsValidationIssue[] {\n const capability = resolveReuseCapability(getStudioRegistry().registry.list(), source.collections)\n if (!capability) return []\n const issues: CmsValidationIssue[] = []\n const seen = new Set<string>()\n for (const field of collection.fields) {\n if (!isBlocksField(field)) continue\n for (const ref of collectEmbedRefs(blockRootsOf(draft.values?.[field.name]), capability)) {\n const key = `${ref.collection}:${ref.id}`\n if (seen.has(key)) continue\n seen.add(key)\n const exists = source.get(ref) !== undefined\n if (exists && (source.publishing?.isPublished(ref) ?? false)) continue\n issues.push(unpublishedEmbedIssue(collection, draft, field.name, ref, exists, source))\n }\n }\n return issues\n}\n\n/** One unpublished/missing reuse-embed issue (EC-300). */\nfunction unpublishedEmbedIssue(\n collection: CollectionDef,\n draft: CmsDocument,\n field: string,\n ref: DocumentRef,\n exists: boolean,\n source: CollectionViewSource,\n): CmsValidationIssue {\n return {\n code: exists ? 'unpublished-relation-target' : 'unknown-relation-target',\n severity: 'error',\n message: exists\n ? `Embeds the reusable “${source.titleOf(ref)}”, which isn’t published — it will be empty on the live site until you publish it.`\n : `Embeds a reusable that no longer exists (“${ref.id}”) — fix or remove the embed.`,\n path: [field],\n collectionId: collection.id,\n documentId: draft.id,\n meta: { field, target: ref.collection, id: ref.id },\n }\n}\n\n/**\n * A segmented-control button for the Draft/Published view toggle (EC-226). The\n * `accent` variant (EC-214) gives the active Published segment a distinct info\n * treatment, so the read-only mode is obvious at the control itself.\n */\nfunction PerspectiveButton({\n label,\n active,\n accent,\n disabled,\n title,\n onClick,\n}: {\n label: string\n active: boolean\n accent?: 'info'\n disabled?: boolean\n title?: string\n onClick: () => void\n}) {\n return (\n <button\n type=\"button\"\n aria-pressed={active}\n disabled={disabled}\n title={title}\n onClick={onClick}\n className={cn(\n 'rounded px-2.5 py-1 text-xs font-medium transition-colors disabled:opacity-40',\n active\n ? accent === 'info'\n ? 'bg-info text-info-foreground shadow-sm'\n : 'bg-background text-foreground shadow-sm'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n {label}\n </button>\n )\n}\n\n/**\n * EC-246d: the slug's derived route path, shown read-only directly under the slug\n * input. The slug is the single editable source; the path is composed by the route\n * resolver (`urlForDocument`) from slug + parent chain and never stored. Draft-aware,\n * so it updates as the editor types. Until a slug resolves a route (a fresh\n * hierarchy page), a hint explains where the URL comes from.\n */\nfunction PathPreview({ url }: { url?: DocumentUrl }) {\n return (\n <Row gap=\"1\" className=\"text-xs text-muted-foreground\" data-testid=\"slug-path-preview\">\n <Link2 className=\"size-3 shrink-0\" aria-hidden />\n {url ? (\n <Text as=\"span\" size=\"xs\" tone=\"muted\" className=\"min-w-0 truncate\" title={url.path}>\n Served at <span className=\"font-medium text-foreground/80\">{url.path}</span>\n </Text>\n ) : (\n <Text as=\"span\" size=\"xs\" tone=\"muted\">\n The URL is derived from the slug (and parent) — set a slug to define it.\n </Text>\n )}\n </Row>\n )\n}\n\ninterface FieldGroup {\n name: string\n fields: FieldDef[]\n /** EC-306: the presentational section descriptor, if one was declared for this group. */\n section?: FieldGroupSection\n}\n\nfunction groupFields(fields: FieldDef[], collection: CollectionDef): FieldGroup[] {\n const order = groupOrder(collection.form)\n const byGroup = new Map<string, FieldDef[]>()\n for (const field of fields) {\n const group = field.form?.group ?? 'fields'\n if (!byGroup.has(group)) byGroup.set(group, [])\n byGroup.get(group)!.push(field)\n }\n const names = [...byGroup.keys()].sort((a, b) => {\n const ia = order.indexOf(a)\n const ib = order.indexOf(b)\n return (ia < 0 ? 99 : ia) - (ib < 0 ? 99 : ib)\n })\n return names.map((name) => ({\n name,\n section: groupSectionOf(collection.form, name),\n fields: byGroup.get(name)!.sort((a, b) => (a.form?.order ?? 99) - (b.form?.order ?? 99)),\n }))\n}\n\n// EC-306: translate a field's grid span (FIELD_WIDTH_SPANS, owned + tested in\n// core) into a literal Tailwind col-span class. Literal strings so Tailwind's\n// scanner generates them; the span math itself is single-sourced in core.\nconst COL_SPAN_CLASS: Record<number, string> = {\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n 6: 'md:col-span-6',\n 8: 'md:col-span-8',\n 9: 'md:col-span-9',\n 12: 'md:col-span-12',\n}\n\nfunction fieldWidthColSpan(width: FieldWidth | undefined): string {\n return COL_SPAN_CLASS[FIELD_WIDTH_SPANS[width ?? '100%']] ?? 'md:col-span-12'\n}\n\nfunction primaryTitle(\n doc: CmsDocument,\n collection: CollectionDef,\n locale: Locale,\n config: LocaleConfig,\n): string {\n // EC-242: the header title is the document identity (resolveDocumentTitle) — a\n // string `titleField` or a function pattern — over the fallback-resolved values,\n // the same resolver that drives relation labels and the list title column.\n return resolveDocumentTitle(collection, resolveDocumentForLocale(collection, doc, locale, config), '')\n}\n"]}
|
|
@@ -3,6 +3,7 @@ import { useRef, useState } from 'react';
|
|
|
3
3
|
import { isFieldLocalized } from '@elytracms/core/cms-core';
|
|
4
4
|
import { Badge, Input, Row, Select, Text } from '@elytracms/studio/ui';
|
|
5
5
|
import { cn } from '@elytracms/studio/lib/utils';
|
|
6
|
+
import { localizedLabel } from '@elytracms/studio/lib/i18n';
|
|
6
7
|
import { editCreatesVariant, resolveDisplayedValue } from '@elytracms/studio/lib/locale';
|
|
7
8
|
import { applyAssetSelection, singleAssetIdOf } from '../assets/asset-selection';
|
|
8
9
|
import { CellValue, toRefArray } from './cell';
|
|
@@ -116,7 +117,7 @@ function CellEditorControl({ field, draft, onDraft, }) {
|
|
|
116
117
|
if (field.multiple) {
|
|
117
118
|
return _jsx(MultiSelectControl, { field: field, draft: draft, onDraft: onDraft });
|
|
118
119
|
}
|
|
119
|
-
return (_jsxs(Select, { autoFocus: true, value: typeof draft === 'string' ? draft : '', onChange: (event) => onDraft(event.target.value), className: "h-7 py-0 text-sm", "data-testid": "cell-editor-select", children: [_jsx("option", { value: "", children: "\u2014" }), field.options.map((opt) => (_jsx("option", { value: opt.value, children: opt.label
|
|
120
|
+
return (_jsxs(Select, { autoFocus: true, value: typeof draft === 'string' ? draft : '', onChange: (event) => onDraft(event.target.value), className: "h-7 py-0 text-sm", "data-testid": "cell-editor-select", children: [_jsx("option", { value: "", children: "\u2014" }), field.options.map((opt) => (_jsx("option", { value: opt.value, children: localizedLabel(opt.label, opt.value) }, opt.value)))] }));
|
|
120
121
|
default:
|
|
121
122
|
return (_jsx(Input, { autoFocus: true, value: typeof draft === 'string' ? draft : '', onChange: (event) => onDraft(event.target.value), className: "h-7 text-sm", "data-testid": "cell-editor-text" }));
|
|
122
123
|
}
|
|
@@ -125,7 +126,7 @@ function MultiSelectControl({ field, draft, onDraft, }) {
|
|
|
125
126
|
const selected = Array.isArray(draft) ? draft : [];
|
|
126
127
|
return (_jsx(Row, { gap: "2", wrap: true, "data-testid": "cell-editor-multiselect", children: field.options.map((opt, index) => {
|
|
127
128
|
const on = selected.includes(opt.value);
|
|
128
|
-
return (_jsxs("label", { className: "flex items-center gap-1.5 text-xs", children: [_jsx("input", { autoFocus: index === 0, type: "checkbox", checked: on, onChange: () => onDraft(on ? selected.filter((v) => v !== opt.value) : [...selected, opt.value]), className: "size-3.5 accent-primary" }), opt.label
|
|
129
|
+
return (_jsxs("label", { className: "flex items-center gap-1.5 text-xs", children: [_jsx("input", { autoFocus: index === 0, type: "checkbox", checked: on, onChange: () => onDraft(on ? selected.filter((v) => v !== opt.value) : [...selected, opt.value]), className: "size-3.5 accent-primary" }), localizedLabel(opt.label, opt.value)] }, opt.value));
|
|
129
130
|
}) }));
|
|
130
131
|
}
|
|
131
132
|
/** Relation/asset cells reuse the existing lightweight pickers, opened from the cell. */
|