@momentumcms/admin 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/fesm2022/{momentumcms-admin-array-field.component-CT5NlIEv.mjs → momentumcms-admin-array-field.component-Bjlcczwg.mjs} +2 -2
  2. package/fesm2022/{momentumcms-admin-array-field.component-CT5NlIEv.mjs.map → momentumcms-admin-array-field.component-Bjlcczwg.mjs.map} +1 -1
  3. package/fesm2022/{momentumcms-admin-blocks-field.component-Cz7HmuBK.mjs → momentumcms-admin-blocks-field.component-4vLqDGbB.mjs} +2 -2
  4. package/fesm2022/{momentumcms-admin-blocks-field.component-Cz7HmuBK.mjs.map → momentumcms-admin-blocks-field.component-4vLqDGbB.mjs.map} +1 -1
  5. package/fesm2022/{momentumcms-admin-collapsible-field.component-CtwrGQvg.mjs → momentumcms-admin-collapsible-field.component-63-9kSgm.mjs} +2 -2
  6. package/fesm2022/{momentumcms-admin-collapsible-field.component-CtwrGQvg.mjs.map → momentumcms-admin-collapsible-field.component-63-9kSgm.mjs.map} +1 -1
  7. package/fesm2022/{momentumcms-admin-global-edit.page-BBUtWCSl.mjs → momentumcms-admin-global-edit.page-DSnkwdgn.mjs} +2 -2
  8. package/fesm2022/{momentumcms-admin-global-edit.page-BBUtWCSl.mjs.map → momentumcms-admin-global-edit.page-DSnkwdgn.mjs.map} +1 -1
  9. package/fesm2022/{momentumcms-admin-group-field.component-BZeG8Oqy.mjs → momentumcms-admin-group-field.component-B48_zbo0.mjs} +2 -2
  10. package/fesm2022/{momentumcms-admin-group-field.component-BZeG8Oqy.mjs.map → momentumcms-admin-group-field.component-B48_zbo0.mjs.map} +1 -1
  11. package/fesm2022/{momentumcms-admin-momentumcms-admin-o0FbJXZN.mjs → momentumcms-admin-momentumcms-admin-D_47TVaR.mjs} +1531 -749
  12. package/fesm2022/momentumcms-admin-momentumcms-admin-D_47TVaR.mjs.map +1 -0
  13. package/fesm2022/{momentumcms-admin-relationship-field.component-BuxtRs2_.mjs → momentumcms-admin-relationship-field.component-D-UQgd7m.mjs} +2 -2
  14. package/fesm2022/{momentumcms-admin-relationship-field.component-BuxtRs2_.mjs.map → momentumcms-admin-relationship-field.component-D-UQgd7m.mjs.map} +1 -1
  15. package/fesm2022/{momentumcms-admin-rich-text-field.component-DKQ6pwp7.mjs → momentumcms-admin-rich-text-field.component-BC8pRU89.mjs} +2 -2
  16. package/fesm2022/{momentumcms-admin-rich-text-field.component-DKQ6pwp7.mjs.map → momentumcms-admin-rich-text-field.component-BC8pRU89.mjs.map} +1 -1
  17. package/fesm2022/{momentumcms-admin-row-field.component-ks3FXd4B.mjs → momentumcms-admin-row-field.component--EOPGDtM.mjs} +2 -2
  18. package/fesm2022/{momentumcms-admin-row-field.component-ks3FXd4B.mjs.map → momentumcms-admin-row-field.component--EOPGDtM.mjs.map} +1 -1
  19. package/fesm2022/{momentumcms-admin-tabs-field.component-mZ4dpZoD.mjs → momentumcms-admin-tabs-field.component-B4X73eCM.mjs} +2 -2
  20. package/fesm2022/{momentumcms-admin-tabs-field.component-mZ4dpZoD.mjs.map → momentumcms-admin-tabs-field.component-B4X73eCM.mjs.map} +1 -1
  21. package/fesm2022/momentumcms-admin.mjs +1 -1
  22. package/package.json +1 -1
  23. package/types/momentumcms-admin.d.ts +92 -29
  24. package/fesm2022/momentumcms-admin-momentumcms-admin-o0FbJXZN.mjs.map +0 -1
@@ -4,7 +4,7 @@ import { HttpClient } from '@angular/common/http';
4
4
  import { McmsFormField, Badge } from '@momentumcms/ui';
5
5
  import { NgIcon, provideIcons } from '@ng-icons/core';
6
6
  import { heroEye, heroPlus, heroXMark } from '@ng-icons/heroicons/outline';
7
- import { d as EntitySheetService, a as getFieldNodeState, i as isRecord, e as getTitleField } from './momentumcms-admin-momentumcms-admin-o0FbJXZN.mjs';
7
+ import { d as EntitySheetService, a as getFieldNodeState, i as isRecord, e as getTitleField } from './momentumcms-admin-momentumcms-admin-D_47TVaR.mjs';
8
8
  import { humanizeFieldName } from '@momentumcms/core';
9
9
 
10
10
  /**
@@ -470,4 +470,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
470
470
  }], ctorParameters: () => [], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }], formNode: [{ type: i0.Input, args: [{ isSignal: true, alias: "formNode", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], path: [{ type: i0.Input, args: [{ isSignal: true, alias: "path", required: true }] }], formModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "formModel", required: false }] }] } });
471
471
 
472
472
  export { RelationshipFieldRenderer };
473
- //# sourceMappingURL=momentumcms-admin-relationship-field.component-BuxtRs2_.mjs.map
473
+ //# sourceMappingURL=momentumcms-admin-relationship-field.component-D-UQgd7m.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"momentumcms-admin-relationship-field.component-BuxtRs2_.mjs","sources":["../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/relationship-field.component.ts"],"sourcesContent":["import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinject,\n\tinput,\n\tsignal,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Subscription } from 'rxjs';\nimport { McmsFormField, Badge } from '@momentumcms/ui';\nimport type { ValidationError } from '@momentumcms/ui';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroXMark, heroPlus, heroEye } from '@ng-icons/heroicons/outline';\nimport { EntitySheetService } from '../../../services/entity-sheet.service';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState, isRecord, getTitleField } from '../entity-form.types';\n\n/** Option for the relationship dropdown */\ninterface RelationshipOption {\n\tvalue: string;\n\tlabel: string;\n}\n\n/**\n * Relationship field renderer.\n *\n * Fetches related collection documents and renders a dropdown selector.\n * Supports single select (default) and multi-select (hasMany: true).\n * Multi-select shows selected items as badges with remove buttons.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n */\n@Component({\n\tselector: 'mcms-relationship-field-renderer',\n\timports: [McmsFormField, Badge, NgIcon],\n\tproviders: [provideIcons({ heroXMark, heroPlus, heroEye })],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<mcms-form-field\n\t\t\t[id]=\"fieldId()\"\n\t\t\t[required]=\"required()\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t[errors]=\"touchedErrors()\"\n\t\t>\n\t\t\t<span mcmsLabel>{{ label() }}</span>\n\n\t\t\t@if (isLoading()) {\n\t\t\t\t<p class=\"text-sm text-muted-foreground py-2\">Loading options...</p>\n\t\t\t} @else if (isMulti()) {\n\t\t\t\t@if (selectedOptions().length > 0) {\n\t\t\t\t\t<div class=\"flex flex-wrap gap-1 mb-2\">\n\t\t\t\t\t\t@for (opt of selectedOptions(); track opt.value) {\n\t\t\t\t\t\t\t<mcms-badge variant=\"secondary\">\n\t\t\t\t\t\t\t\t{{ opt.label }}\n\t\t\t\t\t\t\t\t@if (!isDisabled()) {\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"ml-1 hover:text-destructive\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"removeSelection(opt.value)\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'Remove ' + opt.label\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroXMark\" size=\"12\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</mcms-badge>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (!isDisabled()) {\n\t\t\t\t\t<select\n\t\t\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\t\t\tclass=\"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\"\n\t\t\t\t\t\t(change)=\"onMultiSelect($event)\"\n\t\t\t\t\t\t(blur)=\"onBlur()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<option value=\"\">Add {{ relatedLabel() }}...</option>\n\t\t\t\t\t\t@for (opt of availableOptions(); track opt.value) {\n\t\t\t\t\t\t\t<option [value]=\"opt.value\">{{ opt.label }}</option>\n\t\t\t\t\t\t}\n\t\t\t\t\t</select>\n\t\t\t\t}\n\t\t\t} @else {\n\t\t\t\t<select\n\t\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t\t\tclass=\"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n\t\t\t\t\t(change)=\"onSingleSelect($event)\"\n\t\t\t\t\t(blur)=\"onBlur()\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"\">Select {{ relatedLabel() }}...</option>\n\t\t\t\t\t@for (opt of allOptions(); track opt.value) {\n\t\t\t\t\t\t<option [value]=\"opt.value\" [selected]=\"opt.value === singleValue()\">\n\t\t\t\t\t\t\t{{ opt.label }}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t}\n\t\t\t\t</select>\n\t\t\t}\n\t\t</mcms-form-field>\n\n\t\t@if (entitySheetService && !isDisabled()) {\n\t\t\t<div class=\"flex gap-2 mt-1.5\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t(click)=\"onCreateRelated()\"\n\t\t\t\t\t[attr.aria-label]=\"'Create new ' + relatedLabel()\"\n\t\t\t\t>\n\t\t\t\t\t<ng-icon name=\"heroPlus\" size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\tNew\n\t\t\t\t</button>\n\t\t\t\t@if (hasSelection()) {\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t\t(click)=\"onViewRelated()\"\n\t\t\t\t\t\t[attr.aria-label]=\"'View ' + relatedLabel()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-icon name=\"heroEye\" size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t\tView\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t`,\n})\nexport class RelationshipFieldRenderer {\n\tprivate readonly http = inject(HttpClient);\n\treadonly entitySheetService = inject(EntitySheetService, { optional: true });\n\n\t/** Field definition (must be a RelationshipField) */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Full form model data (used for filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Loaded options from related collection */\n\treadonly allOptions = signal<RelationshipOption[]>([]);\n\n\t/** Loading state */\n\treadonly isLoading = signal(false);\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(\n\t\t() => this.mode() === 'view' || (this.field().admin?.readOnly ?? false),\n\t);\n\n\t/** Whether this is a hasMany relationship */\n\treadonly isMulti = computed((): boolean => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'relationship' ? (f.hasMany ?? false) : false;\n\t});\n\n\t/** Related collection slug extracted from the lazy collection reference */\n\treadonly relatedSlug = computed((): string => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'relationship') {\n\t\t\tconst config = f.collection();\n\t\t\tif (isRecord(config) && typeof config['slug'] === 'string') {\n\t\t\t\treturn config['slug'];\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t});\n\n\t/** The field name used to display document titles */\n\treadonly titleField = computed((): string => {\n\t\tconst f = this.field();\n\t\tif (f.type !== 'relationship') return 'id';\n\n\t\tconst config = f.collection();\n\t\tif (!isRecord(config)) return 'id';\n\n\t\treturn getTitleField(config);\n\t});\n\n\t/** Label for the related collection (singular) */\n\treadonly relatedLabel = computed((): string => {\n\t\tconst f = this.field();\n\t\tif (f.type !== 'relationship') return 'item';\n\n\t\tconst config = f.collection();\n\t\tif (!isRecord(config)) return 'item';\n\n\t\tconst labels = config['labels'];\n\t\tif (isRecord(labels) && typeof labels['singular'] === 'string') {\n\t\t\treturn labels['singular'];\n\t\t}\n\t\tif (typeof config['slug'] === 'string') {\n\t\t\treturn config['slug'];\n\t\t}\n\t\treturn 'item';\n\t});\n\n\t/** Current value for single-select mode */\n\treadonly singleValue = computed((): string => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return '';\n\t\tconst val = state.value();\n\t\tif (typeof val === 'string') return val;\n\t\t// Handle populated objects with an id\n\t\tif (isRecord(val) && typeof val['id'] === 'string') return val['id'];\n\t\treturn '';\n\t});\n\n\t/** Current values for multi-select mode */\n\treadonly multiValues = computed((): string[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return [];\n\t\tconst val = state.value();\n\t\tif (!Array.isArray(val)) return [];\n\t\treturn val\n\t\t\t.map((item: unknown) => {\n\t\t\t\tif (typeof item === 'string') return item;\n\t\t\t\tif (isRecord(item) && typeof item['id'] === 'string') return item['id'];\n\t\t\t\treturn '';\n\t\t\t})\n\t\t\t.filter((v: string) => v !== '');\n\t});\n\n\t/** Selected options for multi-select display (resolved to labels) */\n\treadonly selectedOptions = computed((): RelationshipOption[] => {\n\t\tconst values = this.multiValues();\n\t\tconst options = this.allOptions();\n\t\treturn values\n\t\t\t.map((v) => options.find((opt) => opt.value === v))\n\t\t\t.filter((opt): opt is RelationshipOption => opt !== undefined);\n\t});\n\n\t/** Available options for multi-select (excludes already selected) */\n\treadonly availableOptions = computed((): RelationshipOption[] => {\n\t\tconst selected = new Set(this.multiValues());\n\t\treturn this.allOptions().filter((opt) => !selected.has(opt.value));\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\tconstructor() {\n\t\t// Fetch related collection docs when the slug is resolved.\n\t\t// Uses onCleanup to cancel in-flight requests if the slug changes.\n\t\teffect((onCleanup) => {\n\t\t\tconst slug = this.relatedSlug();\n\t\t\tif (slug) {\n\t\t\t\tconst sub = this.fetchOptions(slug);\n\t\t\t\tonCleanup(() => sub.unsubscribe());\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Handle single-select change */\n\tonSingleSelect(event: Event): void {\n\t\tconst target = event.target;\n\t\tif (target instanceof HTMLSelectElement) {\n\t\t\tconst state = this.nodeState();\n\t\t\tif (state) {\n\t\t\t\tstate.value.set(target.value || null);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Handle multi-select add */\n\tonMultiSelect(event: Event): void {\n\t\tconst target = event.target;\n\t\tif (!(target instanceof HTMLSelectElement)) return;\n\n\t\tconst selectedValue = target.value;\n\t\tif (!selectedValue) return;\n\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\n\t\tconst currentValues = this.multiValues();\n\t\tif (!currentValues.includes(selectedValue)) {\n\t\t\tstate.value.set([...currentValues, selectedValue]);\n\t\t}\n\t\t// Reset dropdown to placeholder\n\t\ttarget.value = '';\n\t}\n\n\t/** Remove a value from multi-select */\n\tremoveSelection(valueToRemove: string): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst currentValues = this.multiValues();\n\t\tstate.value.set(currentValues.filter((v) => v !== valueToRemove));\n\t}\n\n\t/** Whether there is a current selection (for showing \"View\" button) */\n\treadonly hasSelection = computed(\n\t\t(): boolean => !!this.singleValue() || this.multiValues().length > 0,\n\t);\n\n\t/**\n\t * Handle blur from select elements.\n\t */\n\tonBlur(): void {\n\t\tconst state = this.nodeState();\n\t\tif (state) state.markAsTouched();\n\t}\n\n\t/** Open the entity sheet to create a new related entity */\n\tonCreateRelated(): void {\n\t\tconst slug = this.relatedSlug();\n\t\tif (!slug || !this.entitySheetService) return;\n\n\t\tthis.entitySheetService.openCreate(slug).subscribe((result) => {\n\t\t\tif (result.action === 'created' && result.entity) {\n\t\t\t\tconst state = this.nodeState();\n\t\t\t\tif (!state) return;\n\n\t\t\t\tconst entityId = String(result.entity.id);\n\t\t\t\tif (this.isMulti()) {\n\t\t\t\t\tconst current = this.multiValues();\n\t\t\t\t\tstate.value.set([...current, entityId]);\n\t\t\t\t} else {\n\t\t\t\t\tstate.value.set(entityId);\n\t\t\t\t}\n\n\t\t\t\t// Refresh options to include the newly created entity\n\t\t\t\tthis.fetchOptions(slug);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Open the entity sheet to view the selected related entity */\n\tonViewRelated(): void {\n\t\tconst slug = this.relatedSlug();\n\t\tif (!slug || !this.entitySheetService) return;\n\n\t\tconst id = this.isMulti() ? this.multiValues()[0] : this.singleValue();\n\t\tif (!id) return;\n\n\t\tthis.entitySheetService.openView(slug, id).subscribe((result) => {\n\t\t\tif (result.action === 'deleted') {\n\t\t\t\tconst state = this.nodeState();\n\t\t\t\tif (!state) return;\n\n\t\t\t\t// Clear the deleted entity from the selection\n\t\t\t\tif (this.isMulti()) {\n\t\t\t\t\tconst current = this.multiValues();\n\t\t\t\t\tstate.value.set(current.filter((v) => v !== id));\n\t\t\t\t} else {\n\t\t\t\t\tstate.value.set(null);\n\t\t\t\t}\n\n\t\t\t\t// Refresh options to remove the deleted entity\n\t\t\t\tthis.fetchOptions(slug);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Fetch options from the related collection API, returns subscription for cleanup */\n\tfetchOptions(slug: string): Subscription {\n\t\tthis.isLoading.set(true);\n\t\tconst titleField = this.titleField();\n\n\t\t// Build query params, including filterOptions if defined\n\t\tconst params: Record<string, string> = { limit: '100' };\n\t\tconst f = this.field();\n\t\tif (f.type === 'relationship' && f.filterOptions) {\n\t\t\tconst whereClause = f.filterOptions({ data: this.formModel() });\n\t\t\tfor (const [key, val] of Object.entries(whereClause)) {\n\t\t\t\tif (val !== undefined && val !== null) {\n\t\t\t\t\tparams[`where[${key}]`] = String(val);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.http\n\t\t\t.get<{ docs?: Array<Record<string, unknown>> }>(`/api/${slug}`, {\n\t\t\t\tparams,\n\t\t\t})\n\t\t\t.subscribe({\n\t\t\t\tnext: (response) => {\n\t\t\t\t\tconst docs = response.docs ?? [];\n\t\t\t\t\tconst options: RelationshipOption[] = docs.map((doc) => {\n\t\t\t\t\t\tconst id = typeof doc['id'] === 'string' ? doc['id'] : String(doc['id'] ?? '');\n\t\t\t\t\t\tconst titleValue = doc[titleField];\n\t\t\t\t\t\tconst label = titleField !== 'id' && typeof titleValue === 'string' ? titleValue : id;\n\t\t\t\t\t\treturn { value: id, label };\n\t\t\t\t\t});\n\t\t\t\t\tthis.allOptions.set(options);\n\t\t\t\t\tthis.isLoading.set(false);\n\t\t\t\t},\n\t\t\t\terror: (err: unknown) => {\n\t\t\t\t\tconsole.error(`Failed to load relationship options for \"${slug}\":`, err);\n\t\t\t\t\tthis.allOptions.set([]);\n\t\t\t\t\tthis.isLoading.set(false);\n\t\t\t\t},\n\t\t\t});\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"momentumcms-admin-relationship-field.component-D-UQgd7m.mjs","sources":["../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/relationship-field.component.ts"],"sourcesContent":["import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinject,\n\tinput,\n\tsignal,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Subscription } from 'rxjs';\nimport { McmsFormField, Badge } from '@momentumcms/ui';\nimport type { ValidationError } from '@momentumcms/ui';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroXMark, heroPlus, heroEye } from '@ng-icons/heroicons/outline';\nimport { EntitySheetService } from '../../../services/entity-sheet.service';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState, isRecord, getTitleField } from '../entity-form.types';\n\n/** Option for the relationship dropdown */\ninterface RelationshipOption {\n\tvalue: string;\n\tlabel: string;\n}\n\n/**\n * Relationship field renderer.\n *\n * Fetches related collection documents and renders a dropdown selector.\n * Supports single select (default) and multi-select (hasMany: true).\n * Multi-select shows selected items as badges with remove buttons.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n */\n@Component({\n\tselector: 'mcms-relationship-field-renderer',\n\timports: [McmsFormField, Badge, NgIcon],\n\tproviders: [provideIcons({ heroXMark, heroPlus, heroEye })],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<mcms-form-field\n\t\t\t[id]=\"fieldId()\"\n\t\t\t[required]=\"required()\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t[errors]=\"touchedErrors()\"\n\t\t>\n\t\t\t<span mcmsLabel>{{ label() }}</span>\n\n\t\t\t@if (isLoading()) {\n\t\t\t\t<p class=\"text-sm text-muted-foreground py-2\">Loading options...</p>\n\t\t\t} @else if (isMulti()) {\n\t\t\t\t@if (selectedOptions().length > 0) {\n\t\t\t\t\t<div class=\"flex flex-wrap gap-1 mb-2\">\n\t\t\t\t\t\t@for (opt of selectedOptions(); track opt.value) {\n\t\t\t\t\t\t\t<mcms-badge variant=\"secondary\">\n\t\t\t\t\t\t\t\t{{ opt.label }}\n\t\t\t\t\t\t\t\t@if (!isDisabled()) {\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"ml-1 hover:text-destructive\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"removeSelection(opt.value)\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'Remove ' + opt.label\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroXMark\" size=\"12\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</mcms-badge>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (!isDisabled()) {\n\t\t\t\t\t<select\n\t\t\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\t\t\tclass=\"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\"\n\t\t\t\t\t\t(change)=\"onMultiSelect($event)\"\n\t\t\t\t\t\t(blur)=\"onBlur()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<option value=\"\">Add {{ relatedLabel() }}...</option>\n\t\t\t\t\t\t@for (opt of availableOptions(); track opt.value) {\n\t\t\t\t\t\t\t<option [value]=\"opt.value\">{{ opt.label }}</option>\n\t\t\t\t\t\t}\n\t\t\t\t\t</select>\n\t\t\t\t}\n\t\t\t} @else {\n\t\t\t\t<select\n\t\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t\t\tclass=\"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n\t\t\t\t\t(change)=\"onSingleSelect($event)\"\n\t\t\t\t\t(blur)=\"onBlur()\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"\">Select {{ relatedLabel() }}...</option>\n\t\t\t\t\t@for (opt of allOptions(); track opt.value) {\n\t\t\t\t\t\t<option [value]=\"opt.value\" [selected]=\"opt.value === singleValue()\">\n\t\t\t\t\t\t\t{{ opt.label }}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t}\n\t\t\t\t</select>\n\t\t\t}\n\t\t</mcms-form-field>\n\n\t\t@if (entitySheetService && !isDisabled()) {\n\t\t\t<div class=\"flex gap-2 mt-1.5\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t(click)=\"onCreateRelated()\"\n\t\t\t\t\t[attr.aria-label]=\"'Create new ' + relatedLabel()\"\n\t\t\t\t>\n\t\t\t\t\t<ng-icon name=\"heroPlus\" size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\tNew\n\t\t\t\t</button>\n\t\t\t\t@if (hasSelection()) {\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t\t(click)=\"onViewRelated()\"\n\t\t\t\t\t\t[attr.aria-label]=\"'View ' + relatedLabel()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-icon name=\"heroEye\" size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t\tView\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t`,\n})\nexport class RelationshipFieldRenderer {\n\tprivate readonly http = inject(HttpClient);\n\treadonly entitySheetService = inject(EntitySheetService, { optional: true });\n\n\t/** Field definition (must be a RelationshipField) */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Full form model data (used for filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Loaded options from related collection */\n\treadonly allOptions = signal<RelationshipOption[]>([]);\n\n\t/** Loading state */\n\treadonly isLoading = signal(false);\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(\n\t\t() => this.mode() === 'view' || (this.field().admin?.readOnly ?? false),\n\t);\n\n\t/** Whether this is a hasMany relationship */\n\treadonly isMulti = computed((): boolean => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'relationship' ? (f.hasMany ?? false) : false;\n\t});\n\n\t/** Related collection slug extracted from the lazy collection reference */\n\treadonly relatedSlug = computed((): string => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'relationship') {\n\t\t\tconst config = f.collection();\n\t\t\tif (isRecord(config) && typeof config['slug'] === 'string') {\n\t\t\t\treturn config['slug'];\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t});\n\n\t/** The field name used to display document titles */\n\treadonly titleField = computed((): string => {\n\t\tconst f = this.field();\n\t\tif (f.type !== 'relationship') return 'id';\n\n\t\tconst config = f.collection();\n\t\tif (!isRecord(config)) return 'id';\n\n\t\treturn getTitleField(config);\n\t});\n\n\t/** Label for the related collection (singular) */\n\treadonly relatedLabel = computed((): string => {\n\t\tconst f = this.field();\n\t\tif (f.type !== 'relationship') return 'item';\n\n\t\tconst config = f.collection();\n\t\tif (!isRecord(config)) return 'item';\n\n\t\tconst labels = config['labels'];\n\t\tif (isRecord(labels) && typeof labels['singular'] === 'string') {\n\t\t\treturn labels['singular'];\n\t\t}\n\t\tif (typeof config['slug'] === 'string') {\n\t\t\treturn config['slug'];\n\t\t}\n\t\treturn 'item';\n\t});\n\n\t/** Current value for single-select mode */\n\treadonly singleValue = computed((): string => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return '';\n\t\tconst val = state.value();\n\t\tif (typeof val === 'string') return val;\n\t\t// Handle populated objects with an id\n\t\tif (isRecord(val) && typeof val['id'] === 'string') return val['id'];\n\t\treturn '';\n\t});\n\n\t/** Current values for multi-select mode */\n\treadonly multiValues = computed((): string[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return [];\n\t\tconst val = state.value();\n\t\tif (!Array.isArray(val)) return [];\n\t\treturn val\n\t\t\t.map((item: unknown) => {\n\t\t\t\tif (typeof item === 'string') return item;\n\t\t\t\tif (isRecord(item) && typeof item['id'] === 'string') return item['id'];\n\t\t\t\treturn '';\n\t\t\t})\n\t\t\t.filter((v: string) => v !== '');\n\t});\n\n\t/** Selected options for multi-select display (resolved to labels) */\n\treadonly selectedOptions = computed((): RelationshipOption[] => {\n\t\tconst values = this.multiValues();\n\t\tconst options = this.allOptions();\n\t\treturn values\n\t\t\t.map((v) => options.find((opt) => opt.value === v))\n\t\t\t.filter((opt): opt is RelationshipOption => opt !== undefined);\n\t});\n\n\t/** Available options for multi-select (excludes already selected) */\n\treadonly availableOptions = computed((): RelationshipOption[] => {\n\t\tconst selected = new Set(this.multiValues());\n\t\treturn this.allOptions().filter((opt) => !selected.has(opt.value));\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\tconstructor() {\n\t\t// Fetch related collection docs when the slug is resolved.\n\t\t// Uses onCleanup to cancel in-flight requests if the slug changes.\n\t\teffect((onCleanup) => {\n\t\t\tconst slug = this.relatedSlug();\n\t\t\tif (slug) {\n\t\t\t\tconst sub = this.fetchOptions(slug);\n\t\t\t\tonCleanup(() => sub.unsubscribe());\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Handle single-select change */\n\tonSingleSelect(event: Event): void {\n\t\tconst target = event.target;\n\t\tif (target instanceof HTMLSelectElement) {\n\t\t\tconst state = this.nodeState();\n\t\t\tif (state) {\n\t\t\t\tstate.value.set(target.value || null);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Handle multi-select add */\n\tonMultiSelect(event: Event): void {\n\t\tconst target = event.target;\n\t\tif (!(target instanceof HTMLSelectElement)) return;\n\n\t\tconst selectedValue = target.value;\n\t\tif (!selectedValue) return;\n\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\n\t\tconst currentValues = this.multiValues();\n\t\tif (!currentValues.includes(selectedValue)) {\n\t\t\tstate.value.set([...currentValues, selectedValue]);\n\t\t}\n\t\t// Reset dropdown to placeholder\n\t\ttarget.value = '';\n\t}\n\n\t/** Remove a value from multi-select */\n\tremoveSelection(valueToRemove: string): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst currentValues = this.multiValues();\n\t\tstate.value.set(currentValues.filter((v) => v !== valueToRemove));\n\t}\n\n\t/** Whether there is a current selection (for showing \"View\" button) */\n\treadonly hasSelection = computed(\n\t\t(): boolean => !!this.singleValue() || this.multiValues().length > 0,\n\t);\n\n\t/**\n\t * Handle blur from select elements.\n\t */\n\tonBlur(): void {\n\t\tconst state = this.nodeState();\n\t\tif (state) state.markAsTouched();\n\t}\n\n\t/** Open the entity sheet to create a new related entity */\n\tonCreateRelated(): void {\n\t\tconst slug = this.relatedSlug();\n\t\tif (!slug || !this.entitySheetService) return;\n\n\t\tthis.entitySheetService.openCreate(slug).subscribe((result) => {\n\t\t\tif (result.action === 'created' && result.entity) {\n\t\t\t\tconst state = this.nodeState();\n\t\t\t\tif (!state) return;\n\n\t\t\t\tconst entityId = String(result.entity.id);\n\t\t\t\tif (this.isMulti()) {\n\t\t\t\t\tconst current = this.multiValues();\n\t\t\t\t\tstate.value.set([...current, entityId]);\n\t\t\t\t} else {\n\t\t\t\t\tstate.value.set(entityId);\n\t\t\t\t}\n\n\t\t\t\t// Refresh options to include the newly created entity\n\t\t\t\tthis.fetchOptions(slug);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Open the entity sheet to view the selected related entity */\n\tonViewRelated(): void {\n\t\tconst slug = this.relatedSlug();\n\t\tif (!slug || !this.entitySheetService) return;\n\n\t\tconst id = this.isMulti() ? this.multiValues()[0] : this.singleValue();\n\t\tif (!id) return;\n\n\t\tthis.entitySheetService.openView(slug, id).subscribe((result) => {\n\t\t\tif (result.action === 'deleted') {\n\t\t\t\tconst state = this.nodeState();\n\t\t\t\tif (!state) return;\n\n\t\t\t\t// Clear the deleted entity from the selection\n\t\t\t\tif (this.isMulti()) {\n\t\t\t\t\tconst current = this.multiValues();\n\t\t\t\t\tstate.value.set(current.filter((v) => v !== id));\n\t\t\t\t} else {\n\t\t\t\t\tstate.value.set(null);\n\t\t\t\t}\n\n\t\t\t\t// Refresh options to remove the deleted entity\n\t\t\t\tthis.fetchOptions(slug);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Fetch options from the related collection API, returns subscription for cleanup */\n\tfetchOptions(slug: string): Subscription {\n\t\tthis.isLoading.set(true);\n\t\tconst titleField = this.titleField();\n\n\t\t// Build query params, including filterOptions if defined\n\t\tconst params: Record<string, string> = { limit: '100' };\n\t\tconst f = this.field();\n\t\tif (f.type === 'relationship' && f.filterOptions) {\n\t\t\tconst whereClause = f.filterOptions({ data: this.formModel() });\n\t\t\tfor (const [key, val] of Object.entries(whereClause)) {\n\t\t\t\tif (val !== undefined && val !== null) {\n\t\t\t\t\tparams[`where[${key}]`] = String(val);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.http\n\t\t\t.get<{ docs?: Array<Record<string, unknown>> }>(`/api/${slug}`, {\n\t\t\t\tparams,\n\t\t\t})\n\t\t\t.subscribe({\n\t\t\t\tnext: (response) => {\n\t\t\t\t\tconst docs = response.docs ?? [];\n\t\t\t\t\tconst options: RelationshipOption[] = docs.map((doc) => {\n\t\t\t\t\t\tconst id = typeof doc['id'] === 'string' ? doc['id'] : String(doc['id'] ?? '');\n\t\t\t\t\t\tconst titleValue = doc[titleField];\n\t\t\t\t\t\tconst label = titleField !== 'id' && typeof titleValue === 'string' ? titleValue : id;\n\t\t\t\t\t\treturn { value: id, label };\n\t\t\t\t\t});\n\t\t\t\t\tthis.allOptions.set(options);\n\t\t\t\t\tthis.isLoading.set(false);\n\t\t\t\t},\n\t\t\t\terror: (err: unknown) => {\n\t\t\t\t\tconsole.error(`Failed to load relationship options for \"${slug}\":`, err);\n\t\t\t\t\tthis.allOptions.set([]);\n\t\t\t\t\tthis.isLoading.set(false);\n\t\t\t\t},\n\t\t\t});\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { inject, DestroyRef, input, computed, viewChild, signal, afterNextRender, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { McmsFormField } from '@momentumcms/ui';
4
4
  import { humanizeFieldName } from '@momentumcms/core';
5
- import { a as getFieldNodeState } from './momentumcms-admin-momentumcms-admin-o0FbJXZN.mjs';
5
+ import { a as getFieldNodeState } from './momentumcms-admin-momentumcms-admin-D_47TVaR.mjs';
6
6
  import { Editor } from '@tiptap/core';
7
7
  import StarterKit from '@tiptap/starter-kit';
8
8
  import Underline from '@tiptap/extension-underline';
@@ -810,4 +810,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
810
810
  }], ctorParameters: () => [], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }], formNode: [{ type: i0.Input, args: [{ isSignal: true, alias: "formNode", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], path: [{ type: i0.Input, args: [{ isSignal: true, alias: "path", required: true }] }], editorRef: [{ type: i0.ViewChild, args: ['editorElement', { isSignal: true }] }] } });
811
811
 
812
812
  export { RichTextFieldRenderer };
813
- //# sourceMappingURL=momentumcms-admin-rich-text-field.component-DKQ6pwp7.mjs.map
813
+ //# sourceMappingURL=momentumcms-admin-rich-text-field.component-BC8pRU89.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"momentumcms-admin-rich-text-field.component-DKQ6pwp7.mjs","sources":["../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/rich-text-field.component.ts"],"sourcesContent":["import {\n\tafterNextRender,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport { McmsFormField } from '@momentumcms/ui';\nimport type { ValidationError } from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState } from '../entity-form.types';\nimport { Editor } from '@tiptap/core';\nimport StarterKit from '@tiptap/starter-kit';\nimport Underline from '@tiptap/extension-underline';\nimport Link from '@tiptap/extension-link';\nimport Placeholder from '@tiptap/extension-placeholder';\n\n/**\n * Rich text field renderer using TipTap editor.\n * Provides a toolbar with formatting options and stores content as HTML.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n */\n@Component({\n\tselector: 'mcms-rich-text-field-renderer',\n\timports: [McmsFormField],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<mcms-form-field\n\t\t\t[id]=\"fieldId()\"\n\t\t\t[required]=\"required()\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t[errors]=\"touchedErrors()\"\n\t\t>\n\t\t\t<span mcmsLabel>{{ label() }}</span>\n\n\t\t\t@if (!isDisabled()) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"rounded-md border border-input bg-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2\"\n\t\t\t\t>\n\t\t\t\t\t<!-- Toolbar -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"flex flex-wrap items-center gap-0.5 border-b border-input px-1 py-1\"\n\t\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\t\t[attr.aria-label]=\"label() + ' formatting'\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isBold()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isBold()\"\n\t\t\t\t\t\t\ttitle=\"Bold (Ctrl+B)\"\n\t\t\t\t\t\t\taria-label=\"Bold\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isBold()\"\n\t\t\t\t\t\t\t(click)=\"toggleBold()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"3\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n\t\t\t\t\t\t\t\t<path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isItalic()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isItalic()\"\n\t\t\t\t\t\t\ttitle=\"Italic (Ctrl+I)\"\n\t\t\t\t\t\t\taria-label=\"Italic\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isItalic()\"\n\t\t\t\t\t\t\t(click)=\"toggleItalic()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\" />\n\t\t\t\t\t\t\t\t<line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\" />\n\t\t\t\t\t\t\t\t<line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isUnderline()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isUnderline()\"\n\t\t\t\t\t\t\ttitle=\"Underline (Ctrl+U)\"\n\t\t\t\t\t\t\taria-label=\"Underline\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isUnderline()\"\n\t\t\t\t\t\t\t(click)=\"toggleUnderline()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path d=\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\" />\n\t\t\t\t\t\t\t\t<line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isStrike()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isStrike()\"\n\t\t\t\t\t\t\ttitle=\"Strikethrough\"\n\t\t\t\t\t\t\taria-label=\"Strikethrough\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isStrike()\"\n\t\t\t\t\t\t\t(click)=\"toggleStrike()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path d=\"M16 4H9a3 3 0 0 0-2.83 4\" />\n\t\t\t\t\t\t\t\t<path d=\"M14 12a4 4 0 0 1 0 8H6\" />\n\t\t\t\t\t\t\t\t<line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<div class=\"mx-1 h-6 w-px bg-border\" role=\"separator\"></div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-bold transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isHeading1()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isHeading1()\"\n\t\t\t\t\t\t\ttitle=\"Heading 1\"\n\t\t\t\t\t\t\taria-label=\"Heading 1\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isHeading1()\"\n\t\t\t\t\t\t\t(click)=\"toggleHeading(1)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tH1\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-bold transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isHeading2()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isHeading2()\"\n\t\t\t\t\t\t\ttitle=\"Heading 2\"\n\t\t\t\t\t\t\taria-label=\"Heading 2\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isHeading2()\"\n\t\t\t\t\t\t\t(click)=\"toggleHeading(2)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tH2\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-bold transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isHeading3()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isHeading3()\"\n\t\t\t\t\t\t\ttitle=\"Heading 3\"\n\t\t\t\t\t\t\taria-label=\"Heading 3\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isHeading3()\"\n\t\t\t\t\t\t\t(click)=\"toggleHeading(3)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tH3\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<div class=\"mx-1 h-6 w-px bg-border\" role=\"separator\"></div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isBulletList()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isBulletList()\"\n\t\t\t\t\t\t\ttitle=\"Bullet List\"\n\t\t\t\t\t\t\taria-label=\"Bullet list\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isBulletList()\"\n\t\t\t\t\t\t\t(click)=\"toggleBulletList()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" />\n\t\t\t\t\t\t\t\t<line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\n\t\t\t\t\t\t\t\t<line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\" />\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\" />\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isOrderedList()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isOrderedList()\"\n\t\t\t\t\t\t\ttitle=\"Numbered List\"\n\t\t\t\t\t\t\taria-label=\"Numbered list\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isOrderedList()\"\n\t\t\t\t\t\t\t(click)=\"toggleOrderedList()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" />\n\t\t\t\t\t\t\t\t<line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" />\n\t\t\t\t\t\t\t\t<line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" />\n\t\t\t\t\t\t\t\t<path d=\"M4 6h1v4\" />\n\t\t\t\t\t\t\t\t<path d=\"M4 10h2\" />\n\t\t\t\t\t\t\t\t<path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<div class=\"mx-1 h-6 w-px bg-border\" role=\"separator\"></div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isBlockquote()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isBlockquote()\"\n\t\t\t\t\t\t\ttitle=\"Blockquote\"\n\t\t\t\t\t\t\taria-label=\"Blockquote\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isBlockquote()\"\n\t\t\t\t\t\t\t(click)=\"toggleBlockquote()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M4.583 17.321C3.553 16.227 3 15 3 13.011c0-3.5 2.457-6.637 6.03-8.188l.893 1.378c-3.335 1.804-3.987 4.145-4.247 5.621.537-.278 1.24-.375 1.929-.311 1.804.167 3.226 1.648 3.226 3.489a3.5 3.5 0 01-3.5 3.5c-1.073 0-2.099-.49-2.748-1.179zm10 0C13.553 16.227 13 15 13 13.011c0-3.5 2.457-6.637 6.03-8.188l.893 1.378c-3.335 1.804-3.987 4.145-4.247 5.621.537-.278 1.24-.375 1.929-.311 1.804.167 3.226 1.648 3.226 3.489a3.5 3.5 0 01-3.5 3.5c-1.073 0-2.099-.49-2.748-1.179z\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isCodeBlock()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isCodeBlock()\"\n\t\t\t\t\t\t\ttitle=\"Code Block\"\n\t\t\t\t\t\t\taria-label=\"Code block\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isCodeBlock()\"\n\t\t\t\t\t\t\t(click)=\"toggleCodeBlock()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<polyline points=\"16 18 22 12 16 6\" />\n\t\t\t\t\t\t\t\t<polyline points=\"8 6 2 12 8 18\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\ttitle=\"Horizontal Rule\"\n\t\t\t\t\t\t\taria-label=\"Horizontal rule\"\n\t\t\t\t\t\t\t(click)=\"insertHorizontalRule()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Editor content area -->\n\t\t\t\t\t<div\n\t\t\t\t\t\t#editorElement\n\t\t\t\t\t\tclass=\"tiptap-editor prose prose-sm dark:prose-invert max-w-none px-3 py-2\"\n\t\t\t\t\t\tdata-testid=\"rich-text-editor\"\n\t\t\t\t\t></div>\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t<!-- Read-only view -->\n\t\t\t\t<div\n\t\t\t\t\tclass=\"prose prose-sm dark:prose-invert max-w-none rounded-md border border-input bg-muted/50 px-3 py-2\"\n\t\t\t\t\t[innerHTML]=\"stringValue()\"\n\t\t\t\t></div>\n\t\t\t}\n\t\t</mcms-form-field>\n\t`,\n\tstyles: `\n\t\t:host ::ng-deep .tiptap-editor {\n\t\t\tmin-height: 200px;\n\t\t\toutline: none;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror {\n\t\t\toutline: none;\n\t\t\tmin-height: 200px;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror p.is-editor-empty:first-child::before {\n\t\t\tcontent: attr(data-placeholder);\n\t\t\tfloat: left;\n\t\t\tcolor: hsl(var(--mcms-muted-foreground));\n\t\t\tpointer-events: none;\n\t\t\theight: 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror h1 {\n\t\t\tfont-size: 1.5em;\n\t\t\tfont-weight: 700;\n\t\t\tmargin: 0.5em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror h2 {\n\t\t\tfont-size: 1.25em;\n\t\t\tfont-weight: 600;\n\t\t\tmargin: 0.5em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror h3 {\n\t\t\tfont-size: 1.1em;\n\t\t\tfont-weight: 600;\n\t\t\tmargin: 0.5em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror ul {\n\t\t\tlist-style: disc;\n\t\t\tpadding-left: 1.5em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror ol {\n\t\t\tlist-style: decimal;\n\t\t\tpadding-left: 1.5em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror blockquote {\n\t\t\tborder-left: 3px solid hsl(var(--mcms-border));\n\t\t\tpadding-left: 1em;\n\t\t\tmargin-left: 0;\n\t\t\tcolor: hsl(var(--mcms-muted-foreground));\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror pre {\n\t\t\tbackground: hsl(var(--mcms-muted));\n\t\t\tborder-radius: 0.375rem;\n\t\t\tpadding: 0.75em;\n\t\t\tfont-family: monospace;\n\t\t\tfont-size: 0.875em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror code {\n\t\t\tbackground: hsl(var(--mcms-muted));\n\t\t\tborder-radius: 0.25rem;\n\t\t\tpadding: 0.125em 0.25em;\n\t\t\tfont-size: 0.875em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror hr {\n\t\t\tborder: none;\n\t\t\tborder-top: 1px solid hsl(var(--mcms-border));\n\t\t\tmargin: 1em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror a {\n\t\t\tcolor: hsl(var(--mcms-primary));\n\t\t\ttext-decoration: underline;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror p {\n\t\t\tmargin: 0.25em 0;\n\t\t}\n\t`,\n})\nexport class RichTextFieldRenderer {\n\tprivate readonly destroyRef = inject(DestroyRef);\n\n\t/** Field definition */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Editor container element */\n\treadonly editorRef = viewChild<ElementRef<HTMLElement>>('editorElement');\n\n\t/** TipTap editor instance */\n\tprivate editor: Editor | null = null;\n\n\t/** Whether we're currently updating from external value (prevents feedback loops) */\n\tprivate updatingFromExternal = false;\n\n\t/** Whether the editor has been initialized (browser only) */\n\treadonly editorReady = signal(false);\n\n\t/** Toolbar state signals */\n\treadonly isBold = signal(false);\n\treadonly isItalic = signal(false);\n\treadonly isUnderline = signal(false);\n\treadonly isStrike = signal(false);\n\treadonly isHeading1 = signal(false);\n\treadonly isHeading2 = signal(false);\n\treadonly isHeading3 = signal(false);\n\treadonly isBulletList = signal(false);\n\treadonly isOrderedList = signal(false);\n\treadonly isBlockquote = signal(false);\n\treadonly isCodeBlock = signal(false);\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(() => {\n\t\treturn this.mode() === 'view' || (this.field().admin?.readOnly ?? false);\n\t});\n\n\t/** String value from FieldState */\n\treadonly stringValue = computed(() => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return '';\n\t\tconst val = state.value();\n\t\treturn val === null || val === undefined ? '' : String(val);\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\tconstructor() {\n\t\t// Mount editor after first browser render (SSR-safe).\n\t\tafterNextRender(() => {\n\t\t\tthis.mountEditor();\n\t\t});\n\n\t\t// Sync external value changes into the editor\n\t\teffect(() => {\n\t\t\tconst val = this.stringValue();\n\t\t\tif (this.editor && !this.editor.isDestroyed) {\n\t\t\t\tconst currentHtml = this.editor.getHTML();\n\t\t\t\tif (val !== currentHtml && !(val === '' && currentHtml === '<p></p>')) {\n\t\t\t\t\tthis.updatingFromExternal = true;\n\t\t\t\t\tthis.editor.commands.setContent(val || '', { emitUpdate: false });\n\t\t\t\t\tthis.updatingFromExternal = false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.destroyRef.onDestroy(() => {\n\t\t\tthis.editor?.destroy();\n\t\t\tthis.editor = null;\n\t\t});\n\t}\n\n\t/**\n\t * Handle blur from editor.\n\t */\n\tonBlur(): void {\n\t\tconst state = this.nodeState();\n\t\tif (state) state.markAsTouched();\n\t}\n\n\tprivate mountEditor(): void {\n\t\tconst el = this.editorRef();\n\t\tif (!el || this.isDisabled() || this.editor) return;\n\n\t\tthis.editor = new Editor({\n\t\t\telement: el.nativeElement,\n\t\t\teditorProps: {\n\t\t\t\tattributes: {\n\t\t\t\t\trole: 'textbox',\n\t\t\t\t\t'aria-multiline': 'true',\n\t\t\t\t\t'aria-label': this.label() + ' editor',\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: [\n\t\t\t\tStarterKit.configure({\n\t\t\t\t\theading: { levels: [1, 2, 3] },\n\t\t\t\t}),\n\t\t\t\tUnderline,\n\t\t\t\tLink.configure({\n\t\t\t\t\topenOnClick: false,\n\t\t\t\t\tHTMLAttributes: {\n\t\t\t\t\t\trel: 'noopener noreferrer nofollow',\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tPlaceholder.configure({\n\t\t\t\t\tplaceholder: this.field().admin?.placeholder || 'Start writing...',\n\t\t\t\t}),\n\t\t\t],\n\t\t\tcontent: this.stringValue() || '',\n\t\t\teditable: true,\n\t\t\tonUpdate: ({ editor }) => {\n\t\t\t\tif (!this.updatingFromExternal) {\n\t\t\t\t\tconst html = editor.getHTML();\n\t\t\t\t\tconst value = html === '<p></p>' ? '' : html;\n\t\t\t\t\tconst state = this.nodeState();\n\t\t\t\t\tif (state) state.value.set(value);\n\t\t\t\t}\n\t\t\t},\n\t\t\tonSelectionUpdate: ({ editor }) => {\n\t\t\t\tthis.updateToolbarState(editor);\n\t\t\t},\n\t\t\tonTransaction: ({ editor }) => {\n\t\t\t\tthis.updateToolbarState(editor);\n\t\t\t},\n\t\t\tonBlur: () => {\n\t\t\t\tthis.onBlur();\n\t\t\t},\n\t\t});\n\n\t\tthis.editorReady.set(true);\n\t}\n\n\tprivate updateToolbarState(editor: Editor): void {\n\t\tthis.isBold.set(editor.isActive('bold'));\n\t\tthis.isItalic.set(editor.isActive('italic'));\n\t\tthis.isUnderline.set(editor.isActive('underline'));\n\t\tthis.isStrike.set(editor.isActive('strike'));\n\t\tthis.isHeading1.set(editor.isActive('heading', { level: 1 }));\n\t\tthis.isHeading2.set(editor.isActive('heading', { level: 2 }));\n\t\tthis.isHeading3.set(editor.isActive('heading', { level: 3 }));\n\t\tthis.isBulletList.set(editor.isActive('bulletList'));\n\t\tthis.isOrderedList.set(editor.isActive('orderedList'));\n\t\tthis.isBlockquote.set(editor.isActive('blockquote'));\n\t\tthis.isCodeBlock.set(editor.isActive('codeBlock'));\n\t}\n\n\ttoggleBold(): void {\n\t\tthis.editor?.chain().focus().toggleBold().run();\n\t}\n\n\ttoggleItalic(): void {\n\t\tthis.editor?.chain().focus().toggleItalic().run();\n\t}\n\n\ttoggleUnderline(): void {\n\t\tthis.editor?.chain().focus().toggleUnderline().run();\n\t}\n\n\ttoggleStrike(): void {\n\t\tthis.editor?.chain().focus().toggleStrike().run();\n\t}\n\n\ttoggleHeading(level: 1 | 2 | 3): void {\n\t\tthis.editor?.chain().focus().toggleHeading({ level }).run();\n\t}\n\n\ttoggleBulletList(): void {\n\t\tthis.editor?.chain().focus().toggleBulletList().run();\n\t}\n\n\ttoggleOrderedList(): void {\n\t\tthis.editor?.chain().focus().toggleOrderedList().run();\n\t}\n\n\ttoggleBlockquote(): void {\n\t\tthis.editor?.chain().focus().toggleBlockquote().run();\n\t}\n\n\ttoggleCodeBlock(): void {\n\t\tthis.editor?.chain().focus().toggleCodeBlock().run();\n\t}\n\n\tinsertHorizontalRule(): void {\n\t\tthis.editor?.chain().focus().setHorizontalRule().run();\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"momentumcms-admin-rich-text-field.component-BC8pRU89.mjs","sources":["../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/rich-text-field.component.ts"],"sourcesContent":["import {\n\tafterNextRender,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport { McmsFormField } from '@momentumcms/ui';\nimport type { ValidationError } from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState } from '../entity-form.types';\nimport { Editor } from '@tiptap/core';\nimport StarterKit from '@tiptap/starter-kit';\nimport Underline from '@tiptap/extension-underline';\nimport Link from '@tiptap/extension-link';\nimport Placeholder from '@tiptap/extension-placeholder';\n\n/**\n * Rich text field renderer using TipTap editor.\n * Provides a toolbar with formatting options and stores content as HTML.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n */\n@Component({\n\tselector: 'mcms-rich-text-field-renderer',\n\timports: [McmsFormField],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<mcms-form-field\n\t\t\t[id]=\"fieldId()\"\n\t\t\t[required]=\"required()\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t[errors]=\"touchedErrors()\"\n\t\t>\n\t\t\t<span mcmsLabel>{{ label() }}</span>\n\n\t\t\t@if (!isDisabled()) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"rounded-md border border-input bg-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2\"\n\t\t\t\t>\n\t\t\t\t\t<!-- Toolbar -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"flex flex-wrap items-center gap-0.5 border-b border-input px-1 py-1\"\n\t\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\t\t[attr.aria-label]=\"label() + ' formatting'\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isBold()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isBold()\"\n\t\t\t\t\t\t\ttitle=\"Bold (Ctrl+B)\"\n\t\t\t\t\t\t\taria-label=\"Bold\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isBold()\"\n\t\t\t\t\t\t\t(click)=\"toggleBold()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"3\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n\t\t\t\t\t\t\t\t<path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isItalic()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isItalic()\"\n\t\t\t\t\t\t\ttitle=\"Italic (Ctrl+I)\"\n\t\t\t\t\t\t\taria-label=\"Italic\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isItalic()\"\n\t\t\t\t\t\t\t(click)=\"toggleItalic()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\" />\n\t\t\t\t\t\t\t\t<line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\" />\n\t\t\t\t\t\t\t\t<line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isUnderline()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isUnderline()\"\n\t\t\t\t\t\t\ttitle=\"Underline (Ctrl+U)\"\n\t\t\t\t\t\t\taria-label=\"Underline\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isUnderline()\"\n\t\t\t\t\t\t\t(click)=\"toggleUnderline()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path d=\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\" />\n\t\t\t\t\t\t\t\t<line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isStrike()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isStrike()\"\n\t\t\t\t\t\t\ttitle=\"Strikethrough\"\n\t\t\t\t\t\t\taria-label=\"Strikethrough\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isStrike()\"\n\t\t\t\t\t\t\t(click)=\"toggleStrike()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path d=\"M16 4H9a3 3 0 0 0-2.83 4\" />\n\t\t\t\t\t\t\t\t<path d=\"M14 12a4 4 0 0 1 0 8H6\" />\n\t\t\t\t\t\t\t\t<line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<div class=\"mx-1 h-6 w-px bg-border\" role=\"separator\"></div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-bold transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isHeading1()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isHeading1()\"\n\t\t\t\t\t\t\ttitle=\"Heading 1\"\n\t\t\t\t\t\t\taria-label=\"Heading 1\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isHeading1()\"\n\t\t\t\t\t\t\t(click)=\"toggleHeading(1)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tH1\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-bold transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isHeading2()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isHeading2()\"\n\t\t\t\t\t\t\ttitle=\"Heading 2\"\n\t\t\t\t\t\t\taria-label=\"Heading 2\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isHeading2()\"\n\t\t\t\t\t\t\t(click)=\"toggleHeading(2)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tH2\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-bold transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isHeading3()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isHeading3()\"\n\t\t\t\t\t\t\ttitle=\"Heading 3\"\n\t\t\t\t\t\t\taria-label=\"Heading 3\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isHeading3()\"\n\t\t\t\t\t\t\t(click)=\"toggleHeading(3)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tH3\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<div class=\"mx-1 h-6 w-px bg-border\" role=\"separator\"></div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isBulletList()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isBulletList()\"\n\t\t\t\t\t\t\ttitle=\"Bullet List\"\n\t\t\t\t\t\t\taria-label=\"Bullet list\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isBulletList()\"\n\t\t\t\t\t\t\t(click)=\"toggleBulletList()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" />\n\t\t\t\t\t\t\t\t<line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\n\t\t\t\t\t\t\t\t<line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\" />\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\" />\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isOrderedList()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isOrderedList()\"\n\t\t\t\t\t\t\ttitle=\"Numbered List\"\n\t\t\t\t\t\t\taria-label=\"Numbered list\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isOrderedList()\"\n\t\t\t\t\t\t\t(click)=\"toggleOrderedList()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" />\n\t\t\t\t\t\t\t\t<line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" />\n\t\t\t\t\t\t\t\t<line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" />\n\t\t\t\t\t\t\t\t<path d=\"M4 6h1v4\" />\n\t\t\t\t\t\t\t\t<path d=\"M4 10h2\" />\n\t\t\t\t\t\t\t\t<path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<div class=\"mx-1 h-6 w-px bg-border\" role=\"separator\"></div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isBlockquote()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isBlockquote()\"\n\t\t\t\t\t\t\ttitle=\"Blockquote\"\n\t\t\t\t\t\t\taria-label=\"Blockquote\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isBlockquote()\"\n\t\t\t\t\t\t\t(click)=\"toggleBlockquote()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M4.583 17.321C3.553 16.227 3 15 3 13.011c0-3.5 2.457-6.637 6.03-8.188l.893 1.378c-3.335 1.804-3.987 4.145-4.247 5.621.537-.278 1.24-.375 1.929-.311 1.804.167 3.226 1.648 3.226 3.489a3.5 3.5 0 01-3.5 3.5c-1.073 0-2.099-.49-2.748-1.179zm10 0C13.553 16.227 13 15 13 13.011c0-3.5 2.457-6.637 6.03-8.188l.893 1.378c-3.335 1.804-3.987 4.145-4.247 5.621.537-.278 1.24-.375 1.929-.311 1.804.167 3.226 1.648 3.226 3.489a3.5 3.5 0 01-3.5 3.5c-1.073 0-2.099-.49-2.748-1.179z\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isCodeBlock()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isCodeBlock()\"\n\t\t\t\t\t\t\ttitle=\"Code Block\"\n\t\t\t\t\t\t\taria-label=\"Code block\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isCodeBlock()\"\n\t\t\t\t\t\t\t(click)=\"toggleCodeBlock()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<polyline points=\"16 18 22 12 16 6\" />\n\t\t\t\t\t\t\t\t<polyline points=\"8 6 2 12 8 18\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\ttitle=\"Horizontal Rule\"\n\t\t\t\t\t\t\taria-label=\"Horizontal rule\"\n\t\t\t\t\t\t\t(click)=\"insertHorizontalRule()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Editor content area -->\n\t\t\t\t\t<div\n\t\t\t\t\t\t#editorElement\n\t\t\t\t\t\tclass=\"tiptap-editor prose prose-sm dark:prose-invert max-w-none px-3 py-2\"\n\t\t\t\t\t\tdata-testid=\"rich-text-editor\"\n\t\t\t\t\t></div>\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t<!-- Read-only view -->\n\t\t\t\t<div\n\t\t\t\t\tclass=\"prose prose-sm dark:prose-invert max-w-none rounded-md border border-input bg-muted/50 px-3 py-2\"\n\t\t\t\t\t[innerHTML]=\"stringValue()\"\n\t\t\t\t></div>\n\t\t\t}\n\t\t</mcms-form-field>\n\t`,\n\tstyles: `\n\t\t:host ::ng-deep .tiptap-editor {\n\t\t\tmin-height: 200px;\n\t\t\toutline: none;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror {\n\t\t\toutline: none;\n\t\t\tmin-height: 200px;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror p.is-editor-empty:first-child::before {\n\t\t\tcontent: attr(data-placeholder);\n\t\t\tfloat: left;\n\t\t\tcolor: hsl(var(--mcms-muted-foreground));\n\t\t\tpointer-events: none;\n\t\t\theight: 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror h1 {\n\t\t\tfont-size: 1.5em;\n\t\t\tfont-weight: 700;\n\t\t\tmargin: 0.5em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror h2 {\n\t\t\tfont-size: 1.25em;\n\t\t\tfont-weight: 600;\n\t\t\tmargin: 0.5em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror h3 {\n\t\t\tfont-size: 1.1em;\n\t\t\tfont-weight: 600;\n\t\t\tmargin: 0.5em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror ul {\n\t\t\tlist-style: disc;\n\t\t\tpadding-left: 1.5em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror ol {\n\t\t\tlist-style: decimal;\n\t\t\tpadding-left: 1.5em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror blockquote {\n\t\t\tborder-left: 3px solid hsl(var(--mcms-border));\n\t\t\tpadding-left: 1em;\n\t\t\tmargin-left: 0;\n\t\t\tcolor: hsl(var(--mcms-muted-foreground));\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror pre {\n\t\t\tbackground: hsl(var(--mcms-muted));\n\t\t\tborder-radius: 0.375rem;\n\t\t\tpadding: 0.75em;\n\t\t\tfont-family: monospace;\n\t\t\tfont-size: 0.875em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror code {\n\t\t\tbackground: hsl(var(--mcms-muted));\n\t\t\tborder-radius: 0.25rem;\n\t\t\tpadding: 0.125em 0.25em;\n\t\t\tfont-size: 0.875em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror hr {\n\t\t\tborder: none;\n\t\t\tborder-top: 1px solid hsl(var(--mcms-border));\n\t\t\tmargin: 1em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror a {\n\t\t\tcolor: hsl(var(--mcms-primary));\n\t\t\ttext-decoration: underline;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror p {\n\t\t\tmargin: 0.25em 0;\n\t\t}\n\t`,\n})\nexport class RichTextFieldRenderer {\n\tprivate readonly destroyRef = inject(DestroyRef);\n\n\t/** Field definition */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Editor container element */\n\treadonly editorRef = viewChild<ElementRef<HTMLElement>>('editorElement');\n\n\t/** TipTap editor instance */\n\tprivate editor: Editor | null = null;\n\n\t/** Whether we're currently updating from external value (prevents feedback loops) */\n\tprivate updatingFromExternal = false;\n\n\t/** Whether the editor has been initialized (browser only) */\n\treadonly editorReady = signal(false);\n\n\t/** Toolbar state signals */\n\treadonly isBold = signal(false);\n\treadonly isItalic = signal(false);\n\treadonly isUnderline = signal(false);\n\treadonly isStrike = signal(false);\n\treadonly isHeading1 = signal(false);\n\treadonly isHeading2 = signal(false);\n\treadonly isHeading3 = signal(false);\n\treadonly isBulletList = signal(false);\n\treadonly isOrderedList = signal(false);\n\treadonly isBlockquote = signal(false);\n\treadonly isCodeBlock = signal(false);\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(() => {\n\t\treturn this.mode() === 'view' || (this.field().admin?.readOnly ?? false);\n\t});\n\n\t/** String value from FieldState */\n\treadonly stringValue = computed(() => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return '';\n\t\tconst val = state.value();\n\t\treturn val === null || val === undefined ? '' : String(val);\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\tconstructor() {\n\t\t// Mount editor after first browser render (SSR-safe).\n\t\tafterNextRender(() => {\n\t\t\tthis.mountEditor();\n\t\t});\n\n\t\t// Sync external value changes into the editor\n\t\teffect(() => {\n\t\t\tconst val = this.stringValue();\n\t\t\tif (this.editor && !this.editor.isDestroyed) {\n\t\t\t\tconst currentHtml = this.editor.getHTML();\n\t\t\t\tif (val !== currentHtml && !(val === '' && currentHtml === '<p></p>')) {\n\t\t\t\t\tthis.updatingFromExternal = true;\n\t\t\t\t\tthis.editor.commands.setContent(val || '', { emitUpdate: false });\n\t\t\t\t\tthis.updatingFromExternal = false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.destroyRef.onDestroy(() => {\n\t\t\tthis.editor?.destroy();\n\t\t\tthis.editor = null;\n\t\t});\n\t}\n\n\t/**\n\t * Handle blur from editor.\n\t */\n\tonBlur(): void {\n\t\tconst state = this.nodeState();\n\t\tif (state) state.markAsTouched();\n\t}\n\n\tprivate mountEditor(): void {\n\t\tconst el = this.editorRef();\n\t\tif (!el || this.isDisabled() || this.editor) return;\n\n\t\tthis.editor = new Editor({\n\t\t\telement: el.nativeElement,\n\t\t\teditorProps: {\n\t\t\t\tattributes: {\n\t\t\t\t\trole: 'textbox',\n\t\t\t\t\t'aria-multiline': 'true',\n\t\t\t\t\t'aria-label': this.label() + ' editor',\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: [\n\t\t\t\tStarterKit.configure({\n\t\t\t\t\theading: { levels: [1, 2, 3] },\n\t\t\t\t}),\n\t\t\t\tUnderline,\n\t\t\t\tLink.configure({\n\t\t\t\t\topenOnClick: false,\n\t\t\t\t\tHTMLAttributes: {\n\t\t\t\t\t\trel: 'noopener noreferrer nofollow',\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tPlaceholder.configure({\n\t\t\t\t\tplaceholder: this.field().admin?.placeholder || 'Start writing...',\n\t\t\t\t}),\n\t\t\t],\n\t\t\tcontent: this.stringValue() || '',\n\t\t\teditable: true,\n\t\t\tonUpdate: ({ editor }) => {\n\t\t\t\tif (!this.updatingFromExternal) {\n\t\t\t\t\tconst html = editor.getHTML();\n\t\t\t\t\tconst value = html === '<p></p>' ? '' : html;\n\t\t\t\t\tconst state = this.nodeState();\n\t\t\t\t\tif (state) state.value.set(value);\n\t\t\t\t}\n\t\t\t},\n\t\t\tonSelectionUpdate: ({ editor }) => {\n\t\t\t\tthis.updateToolbarState(editor);\n\t\t\t},\n\t\t\tonTransaction: ({ editor }) => {\n\t\t\t\tthis.updateToolbarState(editor);\n\t\t\t},\n\t\t\tonBlur: () => {\n\t\t\t\tthis.onBlur();\n\t\t\t},\n\t\t});\n\n\t\tthis.editorReady.set(true);\n\t}\n\n\tprivate updateToolbarState(editor: Editor): void {\n\t\tthis.isBold.set(editor.isActive('bold'));\n\t\tthis.isItalic.set(editor.isActive('italic'));\n\t\tthis.isUnderline.set(editor.isActive('underline'));\n\t\tthis.isStrike.set(editor.isActive('strike'));\n\t\tthis.isHeading1.set(editor.isActive('heading', { level: 1 }));\n\t\tthis.isHeading2.set(editor.isActive('heading', { level: 2 }));\n\t\tthis.isHeading3.set(editor.isActive('heading', { level: 3 }));\n\t\tthis.isBulletList.set(editor.isActive('bulletList'));\n\t\tthis.isOrderedList.set(editor.isActive('orderedList'));\n\t\tthis.isBlockquote.set(editor.isActive('blockquote'));\n\t\tthis.isCodeBlock.set(editor.isActive('codeBlock'));\n\t}\n\n\ttoggleBold(): void {\n\t\tthis.editor?.chain().focus().toggleBold().run();\n\t}\n\n\ttoggleItalic(): void {\n\t\tthis.editor?.chain().focus().toggleItalic().run();\n\t}\n\n\ttoggleUnderline(): void {\n\t\tthis.editor?.chain().focus().toggleUnderline().run();\n\t}\n\n\ttoggleStrike(): void {\n\t\tthis.editor?.chain().focus().toggleStrike().run();\n\t}\n\n\ttoggleHeading(level: 1 | 2 | 3): void {\n\t\tthis.editor?.chain().focus().toggleHeading({ level }).run();\n\t}\n\n\ttoggleBulletList(): void {\n\t\tthis.editor?.chain().focus().toggleBulletList().run();\n\t}\n\n\ttoggleOrderedList(): void {\n\t\tthis.editor?.chain().focus().toggleOrderedList().run();\n\t}\n\n\ttoggleBlockquote(): void {\n\t\tthis.editor?.chain().focus().toggleBlockquote().run();\n\t}\n\n\ttoggleCodeBlock(): void {\n\t\tthis.editor?.chain().focus().toggleCodeBlock().run();\n\t}\n\n\tinsertHorizontalRule(): void {\n\t\tthis.editor?.chain().focus().setHorizontalRule().run();\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAyBA;;;;;;AAMG;MA0YU,qBAAqB,CAAA;AAChB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGvC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAS;;AAG/B,IAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,oDAAC;;AAG/B,IAAA,IAAI,GAAG,KAAK,CAAiB,QAAQ,gDAAC;;AAGtC,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAU;;AAGvB,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,qDAAC;;AAGtE,IAAA,SAAS,GAAG,SAAS,CAA0B,eAAe,qDAAC;;IAGhE,MAAM,GAAkB,IAAI;;IAG5B,oBAAoB,GAAG,KAAK;;AAG3B,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;;AAG3B,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,kDAAC;AACtB,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,oDAAC;AACxB,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;AAC3B,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,oDAAC;AACxB,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAC1B,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAC1B,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAC1B,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAC5B,IAAA,aAAa,GAAG,MAAM,CAAC,KAAK,yDAAC;AAC7B,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAC5B,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;;IAG3B,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,MAAA,EAAS,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA,CAAE,mDAAC;;IAGpE,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAGlF,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,IAAI,KAAK,oDAAC;;AAGzD,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC;AACzE,IAAA,CAAC,sDAAC;;AAGO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;AAC9B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;AACrB,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE;AACzB,QAAA,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;AAC5D,IAAA,CAAC,uDAAC;;AAGO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAiC;AAClE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;AAC9B,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,EAAE;AACzC,QAAA,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACzE,IAAA,CAAC,yDAAC;AAEF,IAAA,WAAA,GAAA;;QAEC,eAAe,CAAC,MAAK;YACpB,IAAI,CAAC,WAAW,EAAE;AACnB,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACX,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;YAC9B,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACzC,gBAAA,IAAI,GAAG,KAAK,WAAW,IAAI,EAAE,GAAG,KAAK,EAAE,IAAI,WAAW,KAAK,SAAS,CAAC,EAAE;AACtE,oBAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,oBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACjE,oBAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;gBAClC;YACD;AACD,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC9B,YAAA,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;AACtB,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AACnB,QAAA,CAAC,CAAC;IACH;AAEA;;AAEG;IACH,MAAM,GAAA;AACL,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;AAC9B,QAAA,IAAI,KAAK;YAAE,KAAK,CAAC,aAAa,EAAE;IACjC;IAEQ,WAAW,GAAA;AAClB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;QAC3B,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM;YAAE;AAE7C,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,OAAO,EAAE,EAAE,CAAC,aAAa;AACzB,YAAA,WAAW,EAAE;AACZ,gBAAA,UAAU,EAAE;AACX,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,gBAAgB,EAAE,MAAM;AACxB,oBAAA,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,SAAS;AACtC,iBAAA;AACD,aAAA;AACD,YAAA,UAAU,EAAE;gBACX,UAAU,CAAC,SAAS,CAAC;oBACpB,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;iBAC9B,CAAC;gBACF,SAAS;gBACT,IAAI,CAAC,SAAS,CAAC;AACd,oBAAA,WAAW,EAAE,KAAK;AAClB,oBAAA,cAAc,EAAE;AACf,wBAAA,GAAG,EAAE,8BAA8B;AACnC,qBAAA;iBACD,CAAC;gBACF,WAAW,CAAC,SAAS,CAAC;oBACrB,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,IAAI,kBAAkB;iBAClE,CAAC;AACF,aAAA;AACD,YAAA,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;AACjC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,KAAI;AACxB,gBAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC/B,oBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE;AAC7B,oBAAA,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,GAAG,EAAE,GAAG,IAAI;AAC5C,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;AAC9B,oBAAA,IAAI,KAAK;AAAE,wBAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;gBAClC;YACD,CAAC;AACD,YAAA,iBAAiB,EAAE,CAAC,EAAE,MAAM,EAAE,KAAI;AACjC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;YAChC,CAAC;AACD,YAAA,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,KAAI;AAC7B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;YAChC,CAAC;YACD,MAAM,EAAE,MAAK;gBACZ,IAAI,CAAC,MAAM,EAAE;YACd,CAAC;AACD,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;AAEQ,IAAA,kBAAkB,CAAC,MAAc,EAAA;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACnD;IAEA,UAAU,GAAA;AACT,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE;IAChD;IAEA,YAAY,GAAA;AACX,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE;IAClD;IAEA,eAAe,GAAA;AACd,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE;IACrD;IAEA,YAAY,GAAA;AACX,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE;IAClD;AAEA,IAAA,aAAa,CAAC,KAAgB,EAAA;AAC7B,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE;IAC5D;IAEA,gBAAgB,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE;IACtD;IAEA,iBAAiB,GAAA;AAChB,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,iBAAiB,EAAE,CAAC,GAAG,EAAE;IACvD;IAEA,gBAAgB,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE;IACtD;IAEA,eAAe,GAAA;AACd,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE;IACrD;IAEA,oBAAoB,GAAA;AACnB,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,iBAAiB,EAAE,CAAC,GAAG,EAAE;IACvD;uGAjNY,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApYvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8ST,CAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,0/CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAjTS,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAuYX,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAzYjC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,+BAA+B,EAAA,OAAA,EAChC,CAAC,aAAa,CAAC,mBACP,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAA,QAAA,EACd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8ST,CAAA,CAAA,EAAA,MAAA,EAAA,CAAA,0/CAAA,CAAA,EAAA;ycAyGuD,eAAe,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;;;"}
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { b as getSubNode, F as FieldRenderer } from './momentumcms-admin-momentumcms-admin-o0FbJXZN.mjs';
3
+ import { b as getSubNode, F as FieldRenderer } from './momentumcms-admin-momentumcms-admin-D_47TVaR.mjs';
4
4
 
5
5
  /**
6
6
  * Row layout field renderer.
@@ -95,4 +95,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
95
95
  }], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }], formTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "formTree", required: false }] }], formModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "formModel", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], path: [{ type: i0.Input, args: [{ isSignal: true, alias: "path", required: true }] }] } });
96
96
 
97
97
  export { RowFieldRenderer };
98
- //# sourceMappingURL=momentumcms-admin-row-field.component-ks3FXd4B.mjs.map
98
+ //# sourceMappingURL=momentumcms-admin-row-field.component--EOPGDtM.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"momentumcms-admin-row-field.component-ks3FXd4B.mjs","sources":["../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/row-field.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getSubNode } from '../entity-form.types';\nimport { FieldRenderer } from './field-renderer.component';\n\n/**\n * Row layout field renderer.\n *\n * Displays child fields side-by-side in a horizontal row.\n * This is a layout-only field; it does not store data itself.\n * Child field FieldTree nodes are looked up from the root formTree\n * using flat field names.\n */\n@Component({\n\tselector: 'mcms-row-field-renderer',\n\timports: [FieldRenderer],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t@if (label()) {\n\t\t\t<h3 class=\"text-sm font-medium text-foreground mb-3\">{{ label() }}</h3>\n\t\t}\n\t\t@if (description()) {\n\t\t\t<p class=\"text-sm text-muted-foreground mb-3\">{{ description() }}</p>\n\t\t}\n\t\t<div class=\"grid gap-4\" [style.grid-template-columns]=\"gridColumns()\">\n\t\t\t@for (subField of subFields(); track subField.name) {\n\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t[formNode]=\"getChildFormNode(subField.name)\"\n\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"subField.name\"\n\t\t\t\t/>\n\t\t\t}\n\t\t</div>\n\t`,\n})\nexport class RowFieldRenderer {\n\t/** Field definition (must be a RowField) */\n\treadonly field = input.required<Field>();\n\n\t/** Root signal forms FieldTree (for looking up child field nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (unused for layout fields, kept for interface consistency) */\n\treadonly path = input.required<string>();\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || '');\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Child fields */\n\treadonly subFields = computed((): Field[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'row') {\n\t\t\treturn f.fields.filter((sf) => !sf.admin?.hidden);\n\t\t}\n\t\treturn [];\n\t});\n\n\t/** CSS grid columns: equal width for each child */\n\treadonly gridColumns = computed((): string => {\n\t\tconst count = this.subFields().length;\n\t\treturn `repeat(${count}, 1fr)`;\n\t});\n\n\t/** Get a FieldTree sub-node for a child field (flat path from root tree) */\n\tgetChildFormNode(fieldName: string): unknown {\n\t\treturn getSubNode(this.formTree(), fieldName);\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"momentumcms-admin-row-field.component--EOPGDtM.mjs","sources":["../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/row-field.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getSubNode } from '../entity-form.types';\nimport { FieldRenderer } from './field-renderer.component';\n\n/**\n * Row layout field renderer.\n *\n * Displays child fields side-by-side in a horizontal row.\n * This is a layout-only field; it does not store data itself.\n * Child field FieldTree nodes are looked up from the root formTree\n * using flat field names.\n */\n@Component({\n\tselector: 'mcms-row-field-renderer',\n\timports: [FieldRenderer],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t@if (label()) {\n\t\t\t<h3 class=\"text-sm font-medium text-foreground mb-3\">{{ label() }}</h3>\n\t\t}\n\t\t@if (description()) {\n\t\t\t<p class=\"text-sm text-muted-foreground mb-3\">{{ description() }}</p>\n\t\t}\n\t\t<div class=\"grid gap-4\" [style.grid-template-columns]=\"gridColumns()\">\n\t\t\t@for (subField of subFields(); track subField.name) {\n\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t[formNode]=\"getChildFormNode(subField.name)\"\n\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"subField.name\"\n\t\t\t\t/>\n\t\t\t}\n\t\t</div>\n\t`,\n})\nexport class RowFieldRenderer {\n\t/** Field definition (must be a RowField) */\n\treadonly field = input.required<Field>();\n\n\t/** Root signal forms FieldTree (for looking up child field nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (unused for layout fields, kept for interface consistency) */\n\treadonly path = input.required<string>();\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || '');\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Child fields */\n\treadonly subFields = computed((): Field[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'row') {\n\t\t\treturn f.fields.filter((sf) => !sf.admin?.hidden);\n\t\t}\n\t\treturn [];\n\t});\n\n\t/** CSS grid columns: equal width for each child */\n\treadonly gridColumns = computed((): string => {\n\t\tconst count = this.subFields().length;\n\t\treturn `repeat(${count}, 1fr)`;\n\t});\n\n\t/** Get a FieldTree sub-node for a child field (flat path from root tree) */\n\tgetChildFormNode(fieldName: string): unknown {\n\t\treturn getSubNode(this.formTree(), fieldName);\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { inject, input, signal, effect, untracked, computed, ChangeDetectionStra
3
3
  import { Router, ActivatedRoute } from '@angular/router';
4
4
  import { Tabs, TabsList, TabsTrigger, TabsContent } from '@momentumcms/ui';
5
5
  import { isNamedTab } from '@momentumcms/core';
6
- import { b as getSubNode, F as FieldRenderer } from './momentumcms-admin-momentumcms-admin-o0FbJXZN.mjs';
6
+ import { b as getSubNode, F as FieldRenderer } from './momentumcms-admin-momentumcms-admin-D_47TVaR.mjs';
7
7
 
8
8
  /**
9
9
  * Tabs layout field renderer.
@@ -186,4 +186,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
186
186
  }], ctorParameters: () => [], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }], formTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "formTree", required: false }] }], formModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "formModel", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], path: [{ type: i0.Input, args: [{ isSignal: true, alias: "path", required: true }] }] } });
187
187
 
188
188
  export { TabsFieldRenderer };
189
- //# sourceMappingURL=momentumcms-admin-tabs-field.component-mZ4dpZoD.mjs.map
189
+ //# sourceMappingURL=momentumcms-admin-tabs-field.component-B4X73eCM.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"momentumcms-admin-tabs-field.component-mZ4dpZoD.mjs","sources":["../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/tabs-field.component.ts"],"sourcesContent":["import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinject,\n\tinput,\n\tsignal,\n\tuntracked,\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@momentumcms/ui';\nimport type { Field, TabConfig } from '@momentumcms/core';\nimport { isNamedTab } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getSubNode } from '../entity-form.types';\nimport { FieldRenderer } from './field-renderer.component';\n\n/**\n * Tabs layout field renderer.\n *\n * Organizes child fields into tabbed sections. This is a layout-only field;\n * it does not store data itself. Child field FieldTree nodes are looked up\n * from the root formTree using flat field names.\n *\n * The selected tab is persisted as a URL query parameter (keyed by field name)\n * so it survives page refreshes.\n */\n@Component({\n\tselector: 'mcms-tabs-field-renderer',\n\timports: [Tabs, TabsList, TabsTrigger, TabsContent, FieldRenderer],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t@if (label()) {\n\t\t\t<h3 class=\"text-sm font-medium text-foreground mb-3\">{{ label() }}</h3>\n\t\t}\n\t\t@if (description()) {\n\t\t\t<p class=\"text-sm text-muted-foreground mb-3\">{{ description() }}</p>\n\t\t}\n\t\t<mcms-tabs>\n\t\t\t<mcms-tabs-list [(selectedTab)]=\"selectedTab\">\n\t\t\t\t@for (tab of tabConfigs(); track tab.label) {\n\t\t\t\t\t<mcms-tabs-trigger [value]=\"tab.label\">{{ tab.label }}</mcms-tabs-trigger>\n\t\t\t\t}\n\t\t\t</mcms-tabs-list>\n\t\t\t@for (tab of tabConfigs(); track tab.label) {\n\t\t\t\t<mcms-tabs-content [value]=\"tab.label\">\n\t\t\t\t\t@if (tab.description) {\n\t\t\t\t\t\t<p class=\"text-sm text-muted-foreground mb-4\">{{ tab.description }}</p>\n\t\t\t\t\t}\n\t\t\t\t\t<div class=\"space-y-4 pt-4\">\n\t\t\t\t\t\t@for (subField of getTabFields(tab); track subField.name) {\n\t\t\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t\t\t\t[formNode]=\"getChildFormNode(tab, subField.name)\"\n\t\t\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t\t[path]=\"getFieldPath(tab, subField.name)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</mcms-tabs-content>\n\t\t\t}\n\t\t</mcms-tabs>\n\t`,\n})\nexport class TabsFieldRenderer {\n\tprivate readonly router = inject(Router);\n\tprivate readonly route = inject(ActivatedRoute);\n\n\t/** Field definition (must be a TabsField) */\n\treadonly field = input.required<Field>();\n\n\t/** Root signal forms FieldTree (for looking up child field nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (unused for layout fields, kept for interface consistency) */\n\treadonly path = input.required<string>();\n\n\t/** Currently selected tab — defaults to first tab or URL query param */\n\treadonly selectedTab = signal('');\n\n\t/** Skips URL sync for the initial tab selection (default or query param restore) */\n\tprivate skipNextSync = true;\n\n\tconstructor() {\n\t\t// Initialize selected tab: prefer query param, then fall back to first tab\n\t\teffect(() => {\n\t\t\tconst configs = this.tabConfigs();\n\t\t\tif (this.selectedTab() === '' && configs.length > 0) {\n\t\t\t\tconst fieldName = untracked(() => this.field().name);\n\t\t\t\tconst queryTab = this.route.snapshot.queryParams[fieldName];\n\t\t\t\tconst tabLabels = new Set(configs.map((t) => t.label));\n\n\t\t\t\tthis.skipNextSync = true;\n\t\t\t\tif (typeof queryTab === 'string' && tabLabels.has(queryTab)) {\n\t\t\t\t\tthis.selectedTab.set(queryTab);\n\t\t\t\t} else {\n\t\t\t\t\tthis.selectedTab.set(configs[0].label);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Sync tab changes to URL query params (skip initial selection)\n\t\teffect(() => {\n\t\t\tconst tab = this.selectedTab();\n\t\t\tconst fieldName = this.field().name;\n\t\t\tif (tab === '') return;\n\n\t\t\tif (this.skipNextSync) {\n\t\t\t\tthis.skipNextSync = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.router.navigate([], {\n\t\t\t\tqueryParams: { [fieldName]: tab },\n\t\t\t\tqueryParamsHandling: 'merge',\n\t\t\t\treplaceUrl: true,\n\t\t\t});\n\t\t});\n\t}\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || '');\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Tab configurations from the field */\n\treadonly tabConfigs = computed((): TabConfig[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'tabs') {\n\t\t\treturn f.tabs;\n\t\t}\n\t\treturn [];\n\t});\n\n\t/** Get visible fields for a tab */\n\tgetTabFields(tab: TabConfig): Field[] {\n\t\treturn tab.fields.filter((f) => !f.admin?.hidden);\n\t}\n\n\t/**\n\t * Get a FieldTree sub-node for a child field.\n\t * Named tabs: look up the tab's nested node, then the field within it.\n\t * Unnamed tabs: flat lookup from root tree (current behavior).\n\t */\n\tgetChildFormNode(tab: TabConfig, fieldName: string): unknown {\n\t\tif (isNamedTab(tab)) {\n\t\t\tconst tabNode = getSubNode(this.formTree(), tab.name);\n\t\t\treturn getSubNode(tabNode, fieldName);\n\t\t}\n\t\treturn getSubNode(this.formTree(), fieldName);\n\t}\n\n\t/**\n\t * Get the field path for a child field within a tab.\n\t * Named tabs: returns nested path (e.g., 'seo.metaTitle').\n\t * Unnamed tabs: returns flat field name (e.g., 'title').\n\t */\n\tgetFieldPath(tab: TabConfig, fieldName: string): string {\n\t\tif (isNamedTab(tab)) {\n\t\t\treturn `${tab.name}.${fieldName}`;\n\t\t}\n\t\treturn fieldName;\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"momentumcms-admin-tabs-field.component-B4X73eCM.mjs","sources":["../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/tabs-field.component.ts"],"sourcesContent":["import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinject,\n\tinput,\n\tsignal,\n\tuntracked,\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@momentumcms/ui';\nimport type { Field, TabConfig } from '@momentumcms/core';\nimport { isNamedTab } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getSubNode } from '../entity-form.types';\nimport { FieldRenderer } from './field-renderer.component';\n\n/**\n * Tabs layout field renderer.\n *\n * Organizes child fields into tabbed sections. This is a layout-only field;\n * it does not store data itself. Child field FieldTree nodes are looked up\n * from the root formTree using flat field names.\n *\n * The selected tab is persisted as a URL query parameter (keyed by field name)\n * so it survives page refreshes.\n */\n@Component({\n\tselector: 'mcms-tabs-field-renderer',\n\timports: [Tabs, TabsList, TabsTrigger, TabsContent, FieldRenderer],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t@if (label()) {\n\t\t\t<h3 class=\"text-sm font-medium text-foreground mb-3\">{{ label() }}</h3>\n\t\t}\n\t\t@if (description()) {\n\t\t\t<p class=\"text-sm text-muted-foreground mb-3\">{{ description() }}</p>\n\t\t}\n\t\t<mcms-tabs>\n\t\t\t<mcms-tabs-list [(selectedTab)]=\"selectedTab\">\n\t\t\t\t@for (tab of tabConfigs(); track tab.label) {\n\t\t\t\t\t<mcms-tabs-trigger [value]=\"tab.label\">{{ tab.label }}</mcms-tabs-trigger>\n\t\t\t\t}\n\t\t\t</mcms-tabs-list>\n\t\t\t@for (tab of tabConfigs(); track tab.label) {\n\t\t\t\t<mcms-tabs-content [value]=\"tab.label\">\n\t\t\t\t\t@if (tab.description) {\n\t\t\t\t\t\t<p class=\"text-sm text-muted-foreground mb-4\">{{ tab.description }}</p>\n\t\t\t\t\t}\n\t\t\t\t\t<div class=\"space-y-4 pt-4\">\n\t\t\t\t\t\t@for (subField of getTabFields(tab); track subField.name) {\n\t\t\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t\t\t\t[formNode]=\"getChildFormNode(tab, subField.name)\"\n\t\t\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t\t[path]=\"getFieldPath(tab, subField.name)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</mcms-tabs-content>\n\t\t\t}\n\t\t</mcms-tabs>\n\t`,\n})\nexport class TabsFieldRenderer {\n\tprivate readonly router = inject(Router);\n\tprivate readonly route = inject(ActivatedRoute);\n\n\t/** Field definition (must be a TabsField) */\n\treadonly field = input.required<Field>();\n\n\t/** Root signal forms FieldTree (for looking up child field nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (unused for layout fields, kept for interface consistency) */\n\treadonly path = input.required<string>();\n\n\t/** Currently selected tab — defaults to first tab or URL query param */\n\treadonly selectedTab = signal('');\n\n\t/** Skips URL sync for the initial tab selection (default or query param restore) */\n\tprivate skipNextSync = true;\n\n\tconstructor() {\n\t\t// Initialize selected tab: prefer query param, then fall back to first tab\n\t\teffect(() => {\n\t\t\tconst configs = this.tabConfigs();\n\t\t\tif (this.selectedTab() === '' && configs.length > 0) {\n\t\t\t\tconst fieldName = untracked(() => this.field().name);\n\t\t\t\tconst queryTab = this.route.snapshot.queryParams[fieldName];\n\t\t\t\tconst tabLabels = new Set(configs.map((t) => t.label));\n\n\t\t\t\tthis.skipNextSync = true;\n\t\t\t\tif (typeof queryTab === 'string' && tabLabels.has(queryTab)) {\n\t\t\t\t\tthis.selectedTab.set(queryTab);\n\t\t\t\t} else {\n\t\t\t\t\tthis.selectedTab.set(configs[0].label);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Sync tab changes to URL query params (skip initial selection)\n\t\teffect(() => {\n\t\t\tconst tab = this.selectedTab();\n\t\t\tconst fieldName = this.field().name;\n\t\t\tif (tab === '') return;\n\n\t\t\tif (this.skipNextSync) {\n\t\t\t\tthis.skipNextSync = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.router.navigate([], {\n\t\t\t\tqueryParams: { [fieldName]: tab },\n\t\t\t\tqueryParamsHandling: 'merge',\n\t\t\t\treplaceUrl: true,\n\t\t\t});\n\t\t});\n\t}\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || '');\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Tab configurations from the field */\n\treadonly tabConfigs = computed((): TabConfig[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'tabs') {\n\t\t\treturn f.tabs;\n\t\t}\n\t\treturn [];\n\t});\n\n\t/** Get visible fields for a tab */\n\tgetTabFields(tab: TabConfig): Field[] {\n\t\treturn tab.fields.filter((f) => !f.admin?.hidden);\n\t}\n\n\t/**\n\t * Get a FieldTree sub-node for a child field.\n\t * Named tabs: look up the tab's nested node, then the field within it.\n\t * Unnamed tabs: flat lookup from root tree (current behavior).\n\t */\n\tgetChildFormNode(tab: TabConfig, fieldName: string): unknown {\n\t\tif (isNamedTab(tab)) {\n\t\t\tconst tabNode = getSubNode(this.formTree(), tab.name);\n\t\t\treturn getSubNode(tabNode, fieldName);\n\t\t}\n\t\treturn getSubNode(this.formTree(), fieldName);\n\t}\n\n\t/**\n\t * Get the field path for a child field within a tab.\n\t * Named tabs: returns nested path (e.g., 'seo.metaTitle').\n\t * Unnamed tabs: returns flat field name (e.g., 'title').\n\t */\n\tgetFieldPath(tab: TabConfig, fieldName: string): string {\n\t\tif (isNamedTab(tab)) {\n\t\t\treturn `${tab.name}.${fieldName}`;\n\t\t}\n\t\treturn fieldName;\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { A as AdminShellComponent, f as AdminSidebarWidget, B as BlockEditDialog, h as BlockInserterComponent, j as BlockWrapperComponent, C as CheckboxFieldRenderer, k as CollectionAccessService, l as CollectionCardWidget, m as CollectionEditPage, o as CollectionListPage, p as CollectionViewPage, D as DashboardPage, q as DateFieldRenderer, E as EntityFormWidget, r as EntityListWidget, d as EntitySheetService, s as EntityViewWidget, t as FeedbackService, F as FieldRenderer, u as FieldRendererRegistry, v as ForgotPasswordFormComponent, w as ForgotPasswordPage, L as LivePreviewComponent, x as LoginPage, M as MOMENTUM_API, y as MOMENTUM_API_CONTEXT, z as McmsThemeService, G as MediaLibraryPage, H as MediaPickerDialog, I as MediaPreviewComponent, J as MomentumApiService, K as MomentumAuthService, N as NumberFieldRenderer, P as PublishControlsWidget, R as ResetPasswordFormComponent, O as ResetPasswordPage, S as SHEET_QUERY_PARAMS, Q as SKIP_AUTO_TOAST, T as SelectFieldRenderer, U as SetupPage, V as TextFieldRenderer, W as UploadFieldRenderer, X as UploadService, Y as VersionHistoryWidget, Z as VersionService, _ as VisualBlockEditorComponent, $ as adminGuard, a0 as authGuard, a1 as collectionAccessGuard, a2 as crudToastInterceptor, a as getFieldNodeState, b as getSubNode, e as getTitleField, a3 as guestGuard, a4 as injectHasAnyRole, a5 as injectHasRole, a6 as injectIsAdmin, a7 as injectIsAuthenticated, a8 as injectMomentumAPI, a9 as injectTypedMomentumAPI, aa as injectUser, ab as injectUserRole, ac as injectVersionService, ad as momentumAdminRoutes, ae as provideFieldRenderer, af as provideMomentumAPI, ag as provideMomentumFieldRenderers, ah as setupGuard, ai as unsavedChangesGuard } from './momentumcms-admin-momentumcms-admin-o0FbJXZN.mjs';
1
+ export { A as AdminShellComponent, f as AdminSidebarWidget, B as BlockEditDialog, h as BlockInserterComponent, j as BlockWrapperComponent, C as CheckboxFieldRenderer, k as CollectionAccessService, l as CollectionCardWidget, m as CollectionEditPage, o as CollectionListPage, p as CollectionViewPage, D as DashboardPage, q as DateFieldRenderer, E as EntityFormWidget, r as EntityListWidget, d as EntitySheetService, s as EntityViewWidget, t as FeedbackService, F as FieldRenderer, u as FieldRendererRegistry, v as ForgotPasswordFormComponent, w as ForgotPasswordPage, L as LivePreviewComponent, x as LoginPage, M as MOMENTUM_API, y as MOMENTUM_API_CONTEXT, z as McmsThemeService, G as MediaLibraryPage, H as MediaPickerDialog, I as MediaPreviewComponent, J as MomentumApiService, K as MomentumAuthService, N as NumberFieldRenderer, P as PublishControlsWidget, R as ResetPasswordFormComponent, O as ResetPasswordPage, S as SHEET_QUERY_PARAMS, Q as SKIP_AUTO_TOAST, T as SelectFieldRenderer, U as SetupPage, V as TextFieldRenderer, W as UploadFieldRenderer, X as UploadService, Y as VersionHistoryWidget, Z as VersionService, _ as VisualBlockEditorComponent, $ as adminGuard, a0 as authGuard, a1 as collectionAccessGuard, a2 as crudToastInterceptor, a as getFieldNodeState, b as getSubNode, e as getTitleField, a3 as guestGuard, a4 as injectHasAnyRole, a5 as injectHasRole, a6 as injectIsAdmin, a7 as injectIsAuthenticated, a8 as injectMomentumAPI, a9 as injectTypedMomentumAPI, aa as injectUser, ab as injectUserRole, ac as injectVersionService, ad as momentumAdminRoutes, ae as provideFieldRenderer, af as provideMomentumAPI, ag as provideMomentumFieldRenderers, ah as setupGuard, ai as unsavedChangesGuard } from './momentumcms-admin-momentumcms-admin-D_47TVaR.mjs';
2
2
  //# sourceMappingURL=momentumcms-admin.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@momentumcms/admin",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Angular admin dashboard UI for Momentum CMS",
5
5
  "license": "MIT",
6
6
  "author": "Momentum CMS Contributors",