ngx-form-designer 0.0.6

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 (110) hide show
  1. package/README.md +269 -0
  2. package/fesm2022/ngx-form-designer.mjs +26762 -0
  3. package/fesm2022/ngx-form-designer.mjs.map +1 -0
  4. package/index.d.ts +5 -0
  5. package/lib/data/data-catalog.d.ts +44 -0
  6. package/lib/data/data-provider.d.ts +58 -0
  7. package/lib/data/data-source-client.d.ts +59 -0
  8. package/lib/data/data-source-parsers.d.ts +5 -0
  9. package/lib/data/file-upload-client.d.ts +19 -0
  10. package/lib/data/http-data-source-client.d.ts +31 -0
  11. package/lib/data/in-memory-data-catalog.service.d.ts +12 -0
  12. package/lib/data/tree-utils.d.ts +28 -0
  13. package/lib/email-renderer/email-renderer.component.d.ts +21 -0
  14. package/lib/form-core/form-engine.d.ts +48 -0
  15. package/lib/form-core/form-event-runner.d.ts +15 -0
  16. package/lib/form-core/models.d.ts +255 -0
  17. package/lib/form-core/plugin-metadata.d.ts +10 -0
  18. package/lib/form-core/rule-evaluation.service.d.ts +18 -0
  19. package/lib/form-core/schema-factory.d.ts +11 -0
  20. package/lib/form-core/schema-guard.d.ts +18 -0
  21. package/lib/form-designer/data-panel/data-panel.component.d.ts +73 -0
  22. package/lib/form-designer/designer-context.service.d.ts +29 -0
  23. package/lib/form-designer/designer-state.service.d.ts +133 -0
  24. package/lib/form-designer/dynamic-properties/dynamic-properties.component.d.ts +89 -0
  25. package/lib/form-designer/events-panel/events-panel.component.d.ts +21 -0
  26. package/lib/form-designer/field-palette.component.d.ts +99 -0
  27. package/lib/form-designer/form-designer-shell.component.d.ts +46 -0
  28. package/lib/form-designer/form-preview.component.d.ts +21 -0
  29. package/lib/form-designer/form-settings-inspector.component.d.ts +14 -0
  30. package/lib/form-designer/global-data-manager.component.d.ts +32 -0
  31. package/lib/form-designer/inspector-sections/inspector-advanced-section.component.d.ts +17 -0
  32. package/lib/form-designer/inspector-sections/inspector-backgrounds-section.component.d.ts +14 -0
  33. package/lib/form-designer/inspector-sections/inspector-borders-section.component.d.ts +45 -0
  34. package/lib/form-designer/inspector-sections/inspector-effects-section.component.d.ts +22 -0
  35. package/lib/form-designer/inspector-sections/inspector-layout-section.component.d.ts +33 -0
  36. package/lib/form-designer/inspector-sections/inspector-position-section.component.d.ts +28 -0
  37. package/lib/form-designer/inspector-sections/inspector-size-section.component.d.ts +18 -0
  38. package/lib/form-designer/inspector-sections/inspector-spacing-section.component.d.ts +12 -0
  39. package/lib/form-designer/inspector-sections/inspector-typography-section.component.d.ts +21 -0
  40. package/lib/form-designer/json-form-designer.component.d.ts +12 -0
  41. package/lib/form-designer/layer-tree/layer-tree.component.d.ts +24 -0
  42. package/lib/form-designer/layout-canvas.component.d.ts +70 -0
  43. package/lib/form-designer/page-style.d.ts +2 -0
  44. package/lib/form-designer/properties-panel.component.d.ts +68 -0
  45. package/lib/form-designer/rules-editor/query-builder/query-builder.component.d.ts +23 -0
  46. package/lib/form-designer/rules-editor/rules-panel/rules-panel.component.d.ts +14 -0
  47. package/lib/form-designer/services/widget-definition-resolver.service.d.ts +38 -0
  48. package/lib/form-designer/template-library.d.ts +9 -0
  49. package/lib/form-designer/widget-inspector.component.d.ts +27 -0
  50. package/lib/form-renderer/json-form-renderer.component.d.ts +50 -0
  51. package/lib/form-renderer/layout-node.component.d.ts +85 -0
  52. package/lib/plugins/core-plugins.d.ts +5 -0
  53. package/lib/plugins/designer-plugin.d.ts +15 -0
  54. package/lib/plugins/plugin-context.d.ts +18 -0
  55. package/lib/plugins/plugin-providers.d.ts +3 -0
  56. package/lib/plugins/section-definition.d.ts +16 -0
  57. package/lib/theme/theme.service.d.ts +15 -0
  58. package/lib/ui/json-schema-editor.component.d.ts +27 -0
  59. package/lib/ui/monaco-editor.component.d.ts +24 -0
  60. package/lib/ui/ui-accordion.component.d.ts +11 -0
  61. package/lib/ui/ui-box-model.component.d.ts +55 -0
  62. package/lib/ui/ui-color-swatch.component.d.ts +12 -0
  63. package/lib/ui/ui-dimension.component.d.ts +21 -0
  64. package/lib/ui/ui-edge-box.component.d.ts +20 -0
  65. package/lib/ui/ui-field-wrapper.component.d.ts +8 -0
  66. package/lib/ui/ui-icon.module.d.ts +7 -0
  67. package/lib/ui/ui-input.component.d.ts +17 -0
  68. package/lib/ui/ui-range-number.component.d.ts +16 -0
  69. package/lib/ui/ui-select-icon.component.d.ts +18 -0
  70. package/lib/ui/ui-tabs.component.d.ts +25 -0
  71. package/lib/website/website-brick-studio.component.d.ts +67 -0
  72. package/lib/website/website-designer-shell.component.d.ts +53 -0
  73. package/lib/website/website-preview-shell.component.d.ts +25 -0
  74. package/lib/website/website-project.models.d.ts +78 -0
  75. package/lib/website/website-project.service.d.ts +50 -0
  76. package/lib/website/website-section-library.d.ts +6 -0
  77. package/lib/widgets/email-widgets/email-button-widget.component.d.ts +15 -0
  78. package/lib/widgets/email-widgets/email-heading-widget.component.d.ts +15 -0
  79. package/lib/widgets/email-widgets/email-text-widget.component.d.ts +13 -0
  80. package/lib/widgets/email-widgets.d.ts +2 -0
  81. package/lib/widgets/field-widgets/checkbox/checkbox-widget.component.d.ts +28 -0
  82. package/lib/widgets/field-widgets/checkbox-group/checkbox-group-widget.component.d.ts +40 -0
  83. package/lib/widgets/field-widgets/file-upload/file-upload-widget.component.d.ts +45 -0
  84. package/lib/widgets/field-widgets/radio/radio-widget.component.d.ts +39 -0
  85. package/lib/widgets/field-widgets/select/select-widget.component.d.ts +36 -0
  86. package/lib/widgets/field-widgets/text-field/text-field.component.d.ts +29 -0
  87. package/lib/widgets/field-widgets/tree-select/tree-select-widget.component.d.ts +47 -0
  88. package/lib/widgets/page-link-context.d.ts +8 -0
  89. package/lib/widgets/page-widgets/brick-settings.component.d.ts +23 -0
  90. package/lib/widgets/page-widgets/brick-widget.component.d.ts +47 -0
  91. package/lib/widgets/page-widgets/button-link-settings.component.d.ts +23 -0
  92. package/lib/widgets/page-widgets/button-widget.component.d.ts +21 -0
  93. package/lib/widgets/page-widgets/heading-widget.component.d.ts +22 -0
  94. package/lib/widgets/page-widgets/inline-quill-editor.component.d.ts +34 -0
  95. package/lib/widgets/page-widgets/table-inspector.component.d.ts +17 -0
  96. package/lib/widgets/page-widgets/table-widget.component.d.ts +35 -0
  97. package/lib/widgets/page-widgets/text-block-widget.component.d.ts +22 -0
  98. package/lib/widgets/page-widgets.d.ts +2 -0
  99. package/lib/widgets/static-widgets/image/image-widget.component.d.ts +18 -0
  100. package/lib/widgets/style-helpers.d.ts +8 -0
  101. package/lib/widgets/style-properties.d.ts +28 -0
  102. package/lib/widgets/style-sections.d.ts +1 -0
  103. package/lib/widgets/table-widget.d.ts +2 -0
  104. package/lib/widgets/widget-definition.d.ts +76 -0
  105. package/lib/widgets/widget-editor-context.d.ts +8 -0
  106. package/lib/widgets/widget-packs.d.ts +4 -0
  107. package/lib/widgets/widgets.d.ts +2 -0
  108. package/package.json +47 -0
  109. package/public-api.d.ts +68 -0
  110. package/tailwind.preset.js +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-form-designer.mjs","sources":["../../../projects/ngx-form-designer/src/lib/form-core/models.ts","../../../projects/ngx-form-designer/src/lib/form-core/rule-evaluation.service.ts","../../../projects/ngx-form-designer/src/lib/form-core/form-engine.ts","../../../projects/ngx-form-designer/src/lib/form-core/schema-factory.ts","../../../projects/ngx-form-designer/src/lib/form-core/schema-guard.ts","../../../projects/ngx-form-designer/src/lib/widgets/widget-definition.ts","../../../projects/ngx-form-designer/src/lib/ui/ui-icon.module.ts","../../../projects/ngx-form-designer/src/lib/widgets/style-helpers.ts","../../../projects/ngx-form-designer/src/lib/widgets/widget-editor-context.ts","../../../projects/ngx-form-designer/src/lib/form-designer/designer-state.service.ts","../../../projects/ngx-form-designer/src/lib/form-renderer/layout-node.component.ts","../../../projects/ngx-form-designer/src/lib/form-core/form-event-runner.ts","../../../projects/ngx-form-designer/src/lib/data/file-upload-client.ts","../../../projects/ngx-form-designer/src/lib/form-renderer/json-form-renderer.component.ts","../../../projects/ngx-form-designer/src/lib/email-renderer/email-renderer.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/layer-tree/layer-tree.component.ts","../../../projects/ngx-form-designer/src/lib/plugins/section-definition.ts","../../../projects/ngx-form-designer/src/lib/form-designer/field-palette.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/page-style.ts","../../../projects/ngx-form-designer/src/lib/form-designer/layout-canvas.component.ts","../../../projects/ngx-form-designer/src/lib/plugins/designer-plugin.ts","../../../projects/ngx-form-designer/src/lib/form-core/plugin-metadata.ts","../../../projects/ngx-form-designer/src/lib/form-designer/designer-context.service.ts","../../../projects/ngx-form-designer/src/lib/ui/ui-field-wrapper.component.ts","../../../projects/ngx-form-designer/src/lib/ui/ui-input.component.ts","../../../projects/ngx-form-designer/src/lib/ui/ui-box-model.component.ts","../../../projects/ngx-form-designer/src/lib/ui/ui-dimension.component.ts","../../../projects/ngx-form-designer/src/lib/ui/ui-edge-box.component.ts","../../../projects/ngx-form-designer/src/lib/ui/ui-color-swatch.component.ts","../../../projects/ngx-form-designer/src/lib/ui/ui-range-number.component.ts","../../../projects/ngx-form-designer/src/lib/ui/ui-select-icon.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/dynamic-properties/dynamic-properties.component.ts","../../../projects/ngx-form-designer/src/lib/data/data-catalog.ts","../../../projects/ngx-form-designer/src/lib/data/data-source-client.ts","../../../projects/ngx-form-designer/src/lib/data/data-source-parsers.ts","../../../projects/ngx-form-designer/src/lib/form-designer/global-data-manager.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/data-panel/data-panel.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/rules-editor/query-builder/query-builder.component.ts","../../../projects/ngx-form-designer/src/lib/ui/ui-accordion.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/rules-editor/rules-panel/rules-panel.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/events-panel/events-panel.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/services/widget-definition-resolver.service.ts","../../../projects/ngx-form-designer/src/lib/form-designer/inspector-sections/inspector-layout-section.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/inspector-sections/inspector-spacing-section.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/inspector-sections/inspector-size-section.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/inspector-sections/inspector-position-section.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/inspector-sections/inspector-typography-section.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/inspector-sections/inspector-borders-section.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/inspector-sections/inspector-backgrounds-section.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/inspector-sections/inspector-effects-section.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/inspector-sections/inspector-advanced-section.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/widget-inspector.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/form-settings-inspector.component.ts","../../../projects/ngx-form-designer/src/lib/ui/ui-tabs.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/properties-panel.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/form-preview.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/json-form-designer.component.ts","../../../projects/ngx-form-designer/src/lib/form-designer/template-library.ts","../../../projects/ngx-form-designer/src/lib/form-designer/form-designer-shell.component.ts","../../../projects/ngx-form-designer/src/lib/website/website-project.models.ts","../../../projects/ngx-form-designer/src/lib/website/website-project.service.ts","../../../projects/ngx-form-designer/src/lib/website/website-section-library.ts","../../../projects/ngx-form-designer/src/lib/widgets/page-link-context.ts","../../../projects/ngx-form-designer/src/lib/website/website-designer-shell.component.ts","../../../projects/ngx-form-designer/src/lib/ui/monaco-editor.component.ts","../../../projects/ngx-form-designer/src/lib/ui/json-schema-editor.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/page-widgets/brick-widget.component.ts","../../../projects/ngx-form-designer/src/lib/website/website-brick-studio.component.ts","../../../projects/ngx-form-designer/src/lib/website/website-preview-shell.component.ts","../../../projects/ngx-form-designer/src/lib/data/data-provider.ts","../../../projects/ngx-form-designer/src/lib/widgets/field-widgets/text-field/text-field.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/field-widgets/file-upload/file-upload-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/field-widgets/select/select-widget.component.ts","../../../projects/ngx-form-designer/src/lib/data/tree-utils.ts","../../../projects/ngx-form-designer/src/lib/widgets/field-widgets/tree-select/tree-select-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/field-widgets/radio/radio-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/field-widgets/checkbox-group/checkbox-group-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/field-widgets/checkbox/checkbox-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/page-widgets/button-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/style-properties.ts","../../../projects/ngx-form-designer/src/lib/widgets/static-widgets/image/image-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/widgets.ts","../../../projects/ngx-form-designer/src/lib/widgets/page-widgets/inline-quill-editor.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/page-widgets/heading-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/page-widgets/text-block-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/page-widgets/button-link-settings.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/page-widgets/brick-settings.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/page-widgets.ts","../../../projects/ngx-form-designer/src/lib/widgets/email-widgets/email-heading-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/email-widgets/email-text-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/email-widgets/email-button-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/email-widgets.ts","../../../projects/ngx-form-designer/src/lib/widgets/widget-packs.ts","../../../projects/ngx-form-designer/src/lib/plugins/plugin-context.ts","../../../projects/ngx-form-designer/src/lib/widgets/page-widgets/table-widget.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/page-widgets/table-inspector.component.ts","../../../projects/ngx-form-designer/src/lib/widgets/table-widget.ts","../../../projects/ngx-form-designer/src/lib/plugins/core-plugins.ts","../../../projects/ngx-form-designer/src/lib/plugins/plugin-providers.ts","../../../projects/ngx-form-designer/src/lib/theme/theme.service.ts","../../../projects/ngx-form-designer/src/lib/data/in-memory-data-catalog.service.ts","../../../projects/ngx-form-designer/src/lib/data/http-data-source-client.ts","../../../projects/ngx-form-designer/src/public-api.ts","../../../projects/ngx-form-designer/src/ngx-form-designer.ts"],"sourcesContent":["export type FieldType =\n | 'text'\n | 'textarea'\n | 'number'\n | 'email'\n | 'password'\n | 'tel'\n | 'date'\n | 'time'\n | 'datetime-local'\n | 'checkbox'\n | 'radio'\n | 'select'\n | 'multiselect'\n | 'file'\n | 'image'\n | 'heading'\n | 'paragraph'\n | 'cta-button'\n | 'table'\n | (string & {}); // allow plugin-defined types without core changes\n\nexport interface Html5ValidationProps {\n required?: boolean;\n min?: number | string;\n max?: number | string;\n step?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n}\n\nexport interface ValidationRule {\n id?: string;\n type: 'builtin' | 'expression';\n name?: string; // e.g. 'email', 'integer'\n expression?: string; // e.g. \"/^[A-Z]+$/.test(value)\"\n message: string;\n when?: string; // expression using form values\n}\n\nexport type LogicOperator = 'AND' | 'OR';\nexport type ConditionOperator = 'eq' | 'neq' | 'gt' | 'lt' | 'gte' | 'lte' | 'contains' | 'startsWith' | 'endsWith' | 'empty' | 'notEmpty' | 'truthy';\nexport type RuleAction = 'visible' | 'hidden' | 'enable' | 'disable' | 'required' | 'optional';\n\nexport interface LogicCondition {\n fieldId: string; // The field to check (name or id)\n operator: ConditionOperator;\n value?: any;\n}\n\nexport interface LogicGroup {\n operator: LogicOperator; // AND / OR\n conditions: (LogicCondition | LogicGroup)[]; // Recursive definition\n}\n\nexport interface FormRule {\n id: string;\n name?: string;\n conditions: LogicGroup; // The \"If\" part\n action: RuleAction; // The \"Then\" part\n}\n\nexport interface WidgetStyleSchema {\n // Layout\n width?: string | number;\n height?: string | number;\n minWidth?: string | number;\n minHeight?: string | number;\n maxWidth?: string | number;\n maxHeight?: string | number;\n\n // Alignment\n alignX?: 'left' | 'center' | 'right' | 'stretch';\n alignY?: 'top' | 'middle' | 'bottom' | 'stretch';\n\n // Spacing - Margin\n margin?: string;\n marginTop?: string | number;\n marginRight?: string | number;\n marginBottom?: string | number;\n marginLeft?: string | number;\n\n // Spacing - Padding\n padding?: string;\n paddingTop?: string | number;\n paddingRight?: string | number;\n paddingBottom?: string | number;\n paddingLeft?: string | number;\n\n // Appearance\n backgroundColor?: string;\n color?: string;\n borderRadius?: string | number;\n borderWidth?: string | number;\n borderColor?: string;\n borderStyle?: 'solid' | 'dashed' | 'dotted' | 'none';\n\n // Typography (for text widgets)\n fontSize?: string | number;\n fontWeight?: string | number;\n lineHeight?: string | number;\n textAlign?: 'left' | 'center' | 'right' | 'justify';\n\n // Transform\n transformX?: number;\n transformY?: number;\n transformZ?: number;\n rotate?: number;\n scale?: number;\n\n // Effects\n opacity?: number;\n boxShadow?: string;\n\n // Custom CSS\n [key: string]: any;\n}\n\nexport interface UploadedFileRef {\n id?: string;\n name?: string;\n size?: number;\n type?: string;\n url?: string;\n}\n\nexport type FileUploadValue = UploadedFileRef | UploadedFileRef[] | null;\n\nexport interface FieldSchema {\n id: string; // internal unique id\n widgetId?: string; // references WidgetDefinition.id (stable plugin ID)\n name: string; // key in response JSON\n type: FieldType;\n groupKey?: string;\n\n label?: string;\n placeholder?: string;\n helpText?: string;\n tooltip?: string;\n defaultValue?: any;\n accept?: string;\n multiple?: boolean;\n uploadUrl?: string;\n uploadFieldName?: string;\n\n // Appearance\n appearance?: 'outline' | 'fill' | 'standard';\n readonly?: boolean;\n disabled?: boolean;\n\n // Icons\n prefixIcon?: string;\n suffixIcon?: string;\n\n html5?: Html5ValidationProps;\n validation?: ValidationRule[];\n dependencies?: DependencyRule[];\n\n // Conditional visibility (Legacy - can be migrated to rules eventually)\n conditionalVisibility?: ConditionalVisibility;\n\n // Enterprise Rules\n rules?: FormRule[];\n\n\n // Unified Data // Data\n dataConfig?: DataSourceConfig;\n\n // Events\n events?: WidgetEventBinding[];\n\n // for select / multiselect (Legacy - prefer dataConfig)\n dataSourceId?: string;\n staticOptions?: OptionSchema[];\n\n // Styling\n style?: WidgetStyleSchema;\n\n // Custom Plugin Metadata\n metadata?: Record<string, unknown>;\n [key: string]: any;\n}\n\nexport interface DataSourceConfig {\n type: 'static' | 'api' | 'context' | 'global' | 'source';\n\n // Static\n staticValue?: any; // For text/image/default values\n staticOptions?: OptionSchema[]; // For lists\n\n // API\n endpoint?: string;\n method?: 'GET' | 'POST';\n headers?: Record<string, string>;\n resultPath?: string; // Path to array in JSON response\n labelKey?: string; // Key for label in result objects\n valueKey?: string; // Key for value in result objects\n\n // Context/Ref\n contextKey?: string;\n\n // Global Source\n sourceId?: string; // points to a global DataSourceDefinition.id\n\n // Dependencies & Filters\n dependsOn?: DataDependencyBinding[];\n filters?: DataFilter[];\n\n // Tree Configuration\n treeIdKey?: string; // Key for node ID (defaults to valueKey or 'id')\n treeParentKey?: string; // Key for parent ID (defaults to 'parentId')\n treeRootValue?: any; // Value indicating root parent (null/undefined)\n\n // Search Configuration\n searchEnabled?: boolean;\n searchColumns?: string[];\n optionsLimit?: number;\n\n // Table/List Configuration\n pageSize?: number;\n sort?: { column: string; dir: 'asc' | 'desc' }[];\n}\n\nexport type DataFilterOperator = 'eq' | 'neq' | 'in' | 'contains' | 'startsWith' | 'endsWith' | 'gt' | 'gte' | 'lt' | 'lte' | 'like';\n\nexport interface DataFilter {\n column: string; // dataset column to filter on\n op: DataFilterOperator; // eq / neq / in\n valueFrom?: 'field' | 'literal'; // where the filter value comes from\n fieldId?: string; // when valueFrom === 'field'\n valueLiteral?: any; // when valueFrom === 'literal'\n}\n\n// --- Events ---\nexport type WidgetEventType = 'focus' | 'blur' | 'change' | 'click' | 'dirty' | 'touched';\n\nexport interface WidgetEventActionSetValue {\n type: 'setValue';\n targetFieldId: string;\n valueFrom: 'literal' | 'field' | 'event';\n valueLiteral?: any;\n sourceFieldId?: string;\n}\n\nexport interface WidgetEventActionLog {\n type: 'log';\n message?: string;\n}\n\nexport type WidgetEventAction = WidgetEventActionSetValue | WidgetEventActionLog;\n\nexport interface WidgetEventBinding {\n id: string;\n on: WidgetEventType;\n enabled?: boolean;\n actions: WidgetEventAction[];\n}\n\nexport interface DataDependencyBinding {\n fieldId: string; // ID of the field this depends on\n paramKey: string; // name to use in data layer (e.g. \"countryCode\")\n}\n\nexport interface ConditionalVisibility {\n fieldName: string;\n operator: 'equals' | 'notEquals' | 'contains' | 'isEmpty' | 'isNotEmpty' | 'greaterThan' | 'lessThan';\n value?: any;\n}\n\nexport interface OptionSchema {\n label: string;\n value: string | number;\n}\n\nexport interface DependencyRule {\n effect: 'show' | 'hide' | 'enable' | 'disable' | 'require' | 'optional';\n when: string; // expression, e.g. \"form['country'] === 'IN'\"\n}\n\nexport type WidgetKind = 'field' | 'image' | 'text' | 'table' | 'button';\n\nexport interface ResponsiveSpan {\n xs?: number; // 1–12\n sm?: number;\n md?: number;\n lg?: number;\n xl?: number;\n '2xl'?: number;\n}\n\nexport type LayoutNode = RowNode | ColumnNode | WidgetNode;\n\nexport interface BaseNode {\n id: string;\n type: 'row' | 'col' | 'widget';\n style?: StyleTokenSet;\n parent?: string; // Optional parent ID reference\n}\n\nexport interface RowNode extends BaseNode {\n type: 'row';\n children: ColumnNode[];\n maxColumns?: number; // preset column layout count (e.g., 3,4,6)\n}\n\nexport interface ColumnNode extends BaseNode {\n type: 'col';\n responsive: ResponsiveSpan;\n children: LayoutNode[];\n}\n\nexport interface WidgetNode extends BaseNode {\n type: 'widget';\n widgetKind: WidgetKind; // 'field' for now\n refId: string; // fieldId etc.\n}\n\nexport type SpacingToken = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface StyleTokenSet {\n fontFamily?: string;\n fontSize?: string;\n fontWeight?: string;\n textAlign?: 'left' | 'center' | 'right';\n padding?: SpacingToken | string;\n margin?: SpacingToken | string;\n borderRadius?: string;\n borderColor?: string;\n backgroundColor?: string;\n minHeight?: string;\n marginBottom?: SpacingToken | string;\n gap?: SpacingToken | string;\n width?: string;\n height?: string;\n [key: string]: any; // Allow other styles\n}\n\nexport interface FormUIConfig {\n themeId?: string;\n baseStyle?: StyleTokenSet;\n}\n\nexport type DesignerFlavor = 'form' | 'web' | 'email' | 'pdf';\n\nexport const CURRENT_SCHEMA_VERSION = '1.0.0';\n\nexport interface FormSchema {\n id: string;\n version: string;\n schemaVersion?: string; // SemVer of the schema structure itself\n flavor?: DesignerFlavor;\n title?: string;\n description?: string;\n metadata?: Record<string, unknown>; // For AI tags, implementation notes, etc.\n\n fields: FieldSchema[];\n layout: LayoutNode; // root layout node\n ui?: FormUIConfig;\n\n // Form Settings\n submitButtonText?: string;\n resetButtonText?: string;\n showResetButton?: boolean;\n}\n","import { Injectable } from '@angular/core';\nimport { FormRule, LogicGroup, LogicCondition, ConditionOperator, LogicOperator } from './models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RuleEvaluationService {\n\n constructor() { }\n\n /**\n * Evaluates a single rule against the current form data.\n * Returns true if the rule's conditions are met.\n */\n evaluateRule(rule: FormRule, formData: any): boolean {\n if (!rule.conditions) return false;\n return this.evaluateGroup(rule.conditions, formData);\n }\n\n /**\n * Recursively evaluates a LogicGroup (AND/OR).\n */\n private evaluateGroup(group: LogicGroup, formData: any): boolean {\n if (!group.conditions || group.conditions.length === 0) return true;\n\n if (group.operator === 'AND') {\n // All conditions must be true\n return group.conditions.every(condition => this.evaluateConditionOrGroup(condition, formData));\n } else {\n // At least one condition must be true\n return group.conditions.some(condition => this.evaluateConditionOrGroup(condition, formData));\n }\n }\n\n private evaluateConditionOrGroup(item: LogicCondition | LogicGroup, formData: any): boolean {\n if ('operator' in item && 'conditions' in item) {\n // It's a group\n return this.evaluateGroup(item as LogicGroup, formData);\n } else {\n // It's a condition\n return this.evaluateCondition(item as LogicCondition, formData);\n }\n }\n\n private evaluateCondition(condition: LogicCondition, formData: any): boolean {\n const value = formData[condition.fieldId]; // Assumes flat data structure for now. If nested, need path resolution.\n const targetValue = condition.value;\n\n switch (condition.operator) {\n case 'eq': return value == targetValue; // Loose equality for numbers/strings\n case 'neq': return value != targetValue;\n case 'gt': return Number(value) > Number(targetValue);\n case 'lt': return Number(value) < Number(targetValue);\n case 'gte': return Number(value) >= Number(targetValue);\n case 'lte': return Number(value) <= Number(targetValue);\n case 'contains':\n return typeof value === 'string' && value.includes(targetValue);\n case 'startsWith':\n return typeof value === 'string' && value.startsWith(targetValue);\n case 'endsWith':\n return typeof value === 'string' && value.endsWith(targetValue);\n case 'empty':\n return value === null || value === undefined || value === '';\n case 'notEmpty':\n return value !== null && value !== undefined && value !== '';\n case 'truthy':\n return !!value;\n default: return false;\n }\n }\n}\n","import { FieldSchema, FormSchema, DependencyRule, FormRule } from './models';\nimport { RuleEvaluationService } from './rule-evaluation.service';\n\n/**\n * A framework-agnostic engine to handle form state, validation, and visibility logic.\n */\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\n\nexport interface UiEvent {\n fieldId: string;\n fieldName?: string;\n type: 'focus' | 'blur' | 'change' | 'click' | 'dirty' | 'touched';\n value?: any;\n ts: number;\n}\n\nexport class FormEngine {\n private values: Record<string, any> = {};\n private errors: Record<string, string[]> = {};\n private ruleEvaluator = new RuleEvaluationService();\n\n // Reactive Streams\n private valueSubject = new BehaviorSubject<Record<string, any>>({});\n public valueChanges$: Observable<Record<string, any>> = this.valueSubject.asObservable();\n\n private eventSubject = new Subject<UiEvent>();\n public events$: Observable<UiEvent> = this.eventSubject.asObservable();\n\n private submitSubject = new Subject<void>();\n public submitted$: Observable<void> = this.submitSubject.asObservable();\n\n // Expose a pseudo-formGroup for compatibility if needed, or just use valueChanges$\n public get formGroup() {\n return {\n value: this.values,\n valueChanges: this.valueChanges$\n };\n }\n\n constructor(private schema: FormSchema, initialValues: Record<string, any> = {}) {\n this.values = { ...initialValues };\n // Initialize default values if missing\n this.schema.fields.forEach(field => {\n if (this.values[field.name] === undefined) {\n if (field.defaultValue !== undefined) {\n this.values[field.name] = field.defaultValue;\n } else {\n this.values[field.name] = null;\n }\n }\n });\n this.valueSubject.next(this.values);\n }\n\n getSchema(): FormSchema {\n return this.schema;\n }\n\n updateSchema(schema: FormSchema) {\n this.schema = schema;\n // Re-initialize any new fields\n this.schema.fields.forEach(field => {\n if (this.values[field.name] === undefined) {\n if (field.defaultValue !== undefined) {\n this.values[field.name] = field.defaultValue;\n } else {\n this.values[field.name] = null;\n }\n }\n });\n // Emit new state to ensure UI syncs if defaults added\n this.valueSubject.next({ ...this.values });\n // Re-validate all\n this.validate();\n }\n\n getValue(fieldName: string): any {\n return this.values[fieldName];\n }\n\n setValue(fieldName: string, value: any): void {\n this.values[fieldName] = value;\n this.valueSubject.next({ ...this.values }); // Emit new state\n // Re-run validation for this field (simple version)\n this.validateField(fieldName);\n }\n\n getValues(): Record<string, any> {\n return { ...this.values };\n }\n\n getErrors(): Record<string, string[]> {\n return { ...this.errors };\n }\n\n getError(fieldName: string): string | null {\n const errs = this.errors[fieldName];\n return errs && errs.length > 0 ? errs[0] : null;\n }\n\n emitUiEvent(event: Omit<UiEvent, 'ts'>): void {\n this.eventSubject.next({ ...event, ts: Date.now() });\n }\n\n submit(): void {\n this.submitSubject.next();\n }\n\n validate(): Record<string, string[]> {\n this.schema.fields.forEach(field => this.validateField(field.name));\n return this.errors;\n }\n\n isFieldVisible(fieldId: string): boolean {\n const field = this.getFieldById(fieldId);\n if (!field) return false;\n\n // 1. Legacy Conditional Visibility\n if (field.conditionalVisibility) {\n const cv = field.conditionalVisibility;\n const val = this.values[cv.fieldName];\n // Simple implementation\n if (cv.operator === 'equals' && val !== cv.value) return false;\n if (cv.operator === 'notEquals' && val === cv.value) return false;\n // ... other operators ignored for brevity in legacy override\n }\n\n // 2. Dependencies (Legacy)\n let visible = this.evaluateDependencyRules(field, 'show', 'hide', true);\n\n // 3. Enterprise Rules\n visible = this.evaluateEnterpriseRules(field, 'visible', 'hidden', visible);\n\n return visible;\n }\n\n isFieldEnabled(fieldId: string): boolean {\n const field = this.getFieldById(fieldId);\n if (!field) return false;\n\n // 1. Dependencies (Legacy)\n let enabled = this.evaluateDependencyRules(field, 'enable', 'disable', true);\n\n // 2. Enterprise Rules\n enabled = this.evaluateEnterpriseRules(field, 'enable', 'disable', enabled);\n\n return enabled;\n }\n\n isFieldRequired(fieldId: string): boolean {\n const field = this.getFieldById(fieldId);\n if (!field) return false;\n\n // Precedence note:\n // 1) Base required comes from html5.required (designer toggle)\n // 2) Legacy dependencies may flip required\n // 3) Enterprise rules may flip required again (highest precedence)\n\n // 1. Static\n let required = !!field.html5?.required;\n\n // 2. Dependencies (Legacy)\n required = this.evaluateDependencyRules(field, 'require', 'optional', required);\n\n // 3. Enterprise Rules\n required = this.evaluateEnterpriseRules(field, 'required', 'optional', required);\n\n return required;\n }\n\n private getFieldById(id: string): FieldSchema | undefined {\n return this.schema.fields.find(f => f.id === id);\n }\n\n private getFieldByName(name: string): FieldSchema | undefined {\n return this.schema.fields.find(f => f.name === name);\n }\n\n private validateField(fieldName: string) {\n const field = this.getFieldByName(fieldName);\n if (!field) return;\n\n const value = this.values[fieldName];\n const fieldErrors: string[] = [];\n\n // Visibility check\n const isVisible = this.isFieldVisible(field.id);\n if (!isVisible) {\n delete this.errors[fieldName];\n return;\n }\n\n const isRequired = this.isFieldRequired(field.id);\n const isEmpty = value === null || value === undefined || value === '';\n\n if (isRequired && isEmpty) {\n fieldErrors.push('This field is required.');\n }\n\n if (!isEmpty) {\n // HTML5 Validation (Simplified)\n if (field.html5) {\n if (field.html5.minLength && String(value).length < field.html5.minLength) {\n fieldErrors.push(`Minimum length is ${field.html5.minLength}.`);\n }\n if (field.html5.maxLength && String(value).length > field.html5.maxLength) {\n fieldErrors.push(`Maximum length is ${field.html5.maxLength}.`);\n }\n if (field.html5.min !== undefined && Number(value) < Number(field.html5.min)) {\n fieldErrors.push(`Minimum value is ${field.html5.min}.`);\n }\n if (field.html5.max !== undefined && Number(value) > Number(field.html5.max)) {\n fieldErrors.push(`Maximum value is ${field.html5.max}.`);\n }\n if (field.html5.pattern) {\n const regex = new RegExp(field.html5.pattern);\n if (!regex.test(String(value))) {\n fieldErrors.push('Invalid format.');\n }\n }\n }\n\n // Custom Validation Rules\n if (field.validation) {\n field.validation.forEach(rule => {\n let isValid = true;\n if (rule.type === 'builtin') {\n if (rule.name === 'email') {\n isValid = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(value));\n }\n } else if (rule.type === 'expression' && rule.expression) {\n try {\n const checkFn = new Function('value', 'form', `return ${rule.expression}`);\n isValid = checkFn(value, this.values);\n } catch (e) {\n console.error('Validation expression error', e);\n isValid = false;\n }\n }\n\n if (!isValid) {\n fieldErrors.push(rule.message || 'Validation failed.');\n }\n });\n }\n }\n\n if (fieldErrors.length > 0) {\n this.errors[fieldName] = fieldErrors;\n } else {\n delete this.errors[fieldName];\n }\n }\n\n // Generic rule evaluator\n private evaluateDependencyRules(\n field: FieldSchema,\n positiveEffect: string,\n negativeEffect: string,\n startValue: boolean\n ): boolean {\n if (!field.dependencies) return startValue;\n\n let currentState = startValue;\n\n field.dependencies.forEach(rule => {\n let conditionMet = false;\n try {\n const checkFn = new Function('form', `return ${rule.when}`);\n conditionMet = checkFn(this.values);\n } catch (e) {\n console.warn(`Dependency check failed for ${field.id}`, e);\n }\n\n if (conditionMet) {\n if (rule.effect === positiveEffect) currentState = true;\n if (rule.effect === negativeEffect) currentState = false;\n }\n });\n\n return currentState;\n }\n\n private evaluateEnterpriseRules(\n field: FieldSchema,\n positiveAction: string,\n negativeAction: string,\n startValue: boolean\n ): boolean {\n if (!field.rules || field.rules.length === 0) return startValue;\n\n // Implement Implicit State Inversion\n // If the field has rules that explicitly set the \"positive\" state (e.g. \"visible\", \"enable\"),\n // and the default state is currently positive (e.g. visible by default),\n // we assume the user wants the field to be hidden/disabled UNLESS the rule matches.\n let currentState = startValue;\n\n // Check if we assume optimistic defaults (Visible/Enabled)\n // and have rules trying to enforce that state conditionally\n const hasPositiveRules = field.rules.some(r => r.action === positiveAction);\n\n // For visibility and enablement (where default is usually true)\n if (hasPositiveRules && startValue === true) {\n currentState = false; // Implicitly hide/disable\n }\n\n field.rules.forEach(rule => {\n if (this.ruleEvaluator.evaluateRule(rule, this.values)) {\n if (rule.action === positiveAction) currentState = true;\n if (rule.action === negativeAction) currentState = false;\n }\n });\n\n return currentState;\n }\n}\n\nexport function createFormEngine(schema: FormSchema, initialValues: Record<string, any> = {}) {\n return new FormEngine(schema, initialValues);\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { FormSchema, DesignerFlavor, CURRENT_SCHEMA_VERSION, LayoutNode } from './models';\n\n/**\n * Metadata field is intended for AI/LLM and project-level information (prompts, generation parameters, tags).\n * SchemaVersion will be used for future migrations as more flavors (audio/video/image editors, tables, etc.) are added.\n */\n\nexport function createEmptySchema(flavor: DesignerFlavor = 'form', opts?: { title?: string; id?: string }): FormSchema {\n return {\n id: opts?.id || uuidv4(),\n version: '1.0',\n schemaVersion: CURRENT_SCHEMA_VERSION,\n flavor,\n title: opts?.title || 'New Form',\n metadata: {},\n fields: [],\n layout: {\n id: uuidv4(),\n type: 'col', // Root is a vertical Page/Column\n responsive: { xs: 12 },\n children: [\n {\n id: uuidv4(),\n type: 'row', // Initial Row\n children: [\n {\n id: uuidv4(),\n type: 'col',\n responsive: { xs: 12 },\n children: []\n }\n ]\n }\n ]\n }\n };\n}\n\nexport function serializeSchema(schema: FormSchema): string {\n return JSON.stringify(schema, null, 2);\n}\n\nexport function parseSchema(json: string): FormSchema {\n let schema: FormSchema;\n try {\n schema = JSON.parse(json);\n } catch (e) {\n throw new Error('Invalid JSON');\n }\n\n if (!schema.id || !schema.layout) {\n throw new Error('Invalid Schema Structure');\n }\n\n // Normalization / Migration Logic\n if (!schema.schemaVersion) {\n schema.schemaVersion = CURRENT_SCHEMA_VERSION;\n }\n\n // Default flavor if missing (legacy support)\n if (!schema.flavor) {\n schema.flavor = 'form';\n }\n\n // TODO: Future migrations based on schemaVersion can go here.\n\n return schema;\n}\n","import { FormSchema, FieldSchema, DataSourceConfig } from './models';\n\nexport interface SchemaGuardIssue {\n level: 'warn' | 'error';\n message: string;\n fieldId?: string;\n fieldName?: string;\n}\n\n/**\n * Checks the schema for violations of the \"API-Only Source\" architecture.\n * This is a read-only check that does not mutate the schema.\n */\nexport function checkSchemaForApiOnlySources(schema: FormSchema): SchemaGuardIssue[] {\n const issues: SchemaGuardIssue[] = [];\n if (!schema || !schema.fields) return issues;\n\n for (const field of schema.fields) {\n checkField(field, issues);\n }\n\n return issues;\n}\n\nfunction checkField(field: FieldSchema, issues: SchemaGuardIssue[]) {\n const cfg = field.dataConfig || {} as DataSourceConfig;\n const isSourceBacked = cfg.type === 'source' || cfg.type === 'global' || (cfg.type === 'api' && !!cfg.sourceId);\n\n if (isSourceBacked) {\n // Rule 1: Source-backed fields should NOT have embedded row data\n const hasEmbeddedRows = Array.isArray((field as any).rows) && (field as any).rows.length > 0;\n const hasStaticOptions = Array.isArray(field.staticOptions) && field.staticOptions.length > 0;\n\n if (hasEmbeddedRows) {\n issues.push({\n level: 'warn',\n message: `Field '${field.name}' is source-backed (type='${cfg.type}') but contains embedded 'rows'. This data may be stale or ignored in favor of the API.`,\n fieldId: field.id,\n fieldName: field.name\n });\n }\n\n if (hasStaticOptions) {\n issues.push({\n level: 'warn',\n message: `Field '${field.name}' is source-backed (type='${cfg.type}') but contains embedded 'staticOptions'. This data may be stale or ignored in favor of the API.`,\n fieldId: field.id,\n fieldName: field.name\n });\n }\n\n // Rule 2: Source-backed fields MUST have a sourceId\n if ((cfg.type === 'source' || cfg.type === 'global') && !cfg.sourceId) {\n issues.push({\n level: 'warn',\n message: `Field '${field.name}' has type='${cfg.type}' but is missing a 'sourceId'. Data loading will likely fail.`,\n fieldId: field.id,\n fieldName: field.name\n });\n }\n } else if (cfg.type !== 'static' && field.widgetId === 'core.form.table') {\n // Special case for tables: If they aren't static but have rows, it's suspicious if they claim to be something else.\n // Actually, let's stick to the simpler check: check if it HAS rows but ISN'T static.\n // If dataConfig is missing, it defaults to static, so we only care if dataConfig.type IS defined and NOT static.\n if (cfg.type && (cfg.type as string) !== 'static') {\n const hasEmbeddedRows = Array.isArray((field as any).rows) && (field as any).rows.length > 0;\n if (hasEmbeddedRows) {\n issues.push({\n level: 'warn',\n message: `Table field '${field.name}' is configured as '${cfg.type}' but contains embedded 'rows'.`,\n fieldId: field.id,\n fieldName: field.name\n });\n }\n }\n }\n}\n\n/**\n * Manually sanitizes a schema by removing embedded data from source-backed fields.\n * Returns a deep copy of the modified schema.\n * use this for debugging only.\n */\nexport function stripEmbeddedSourceData(schema: FormSchema): FormSchema {\n // Deep clone to avoid mutation\n const clone = JSON.parse(JSON.stringify(schema));\n\n if (clone.fields) {\n for (const field of clone.fields) {\n const cfg = field.dataConfig || {};\n const isSourceBacked = cfg.type === 'source' || cfg.type === 'global' || (cfg.type === 'api' && !!cfg.sourceId);\n\n if (isSourceBacked) {\n if (Array.isArray(field.rows)) {\n delete field.rows;\n }\n if (Array.isArray(field.staticOptions)) {\n delete field.staticOptions;\n }\n }\n }\n }\n\n return clone;\n}\n","import { Type, InjectionToken } from '@angular/core';\nimport { WidgetKind, FieldType, DesignerFlavor } from '../form-core/models';\n\nexport interface WidgetConfig {\n label?: string;\n name?: string;\n placeholder?: string;\n required?: boolean;\n // ... dynamic props\n [key: string]: any;\n}\n\nexport type PropertyFieldType =\n | 'text' | 'textarea' | 'number' | 'select' | 'checkbox' | 'slide-toggle'\n | 'color' | 'color-swatch' | 'icon-picker' | 'padding' | 'margin' | 'shadow' | 'border'\n | 'options-editor' | 'validators-editor' | 'conditional-editor'\n | 'custom'\n | 'field-reference'\n // Phase 2: Compound field types\n | 'dimension' // W×H input pair\n | 'edge-box' // Visual 4-sided margin/padding editor\n | 'box-model' // Combined margin/padding/border/size editor\n | 'range-number' // Slider + number input combo\n | 'select-icon'; // Icon-based button group\n\nexport interface PropertyField {\n key: string; // Path to bound property (e.g., 'label', 'style.backgroundColor')\n type: PropertyFieldType;\n label: string;\n\n // Optional configuration\n placeholder?: string;\n helpText?: string; // Tooltip or hint\n hint?: string; // Small hint badge text\n options?: { label: string; value: any; icon?: string }[]; // for 'select' and 'select-icon'\n allowedFieldTypes?: string[]; // for 'field-reference' (using string for FieldType to avoid circular dep if possible, or concrete FieldType)\n includeSelf?: boolean; // for 'field-reference', default false\n min?: number; // For numbers and range-number\n max?: number;\n step?: number;\n\n // Phase 2: Compound field type properties\n icon?: string; // Icon name for select-icon options\n unit?: string; // Unit suffix for dimension, range-number (px, %, rem, etc.)\n linkedByDefault?: boolean; // For dimension - whether W/H are linked by default\n allowedUnits?: string[]; // For edge-box/box-model - which units to allow\n\n // Custom Component Configuration\n customComponent?: Type<any>;\n customInputs?: Record<string, any>;\n\n // Conditional logic\n hiddenIf?: (config: any) => boolean;\n}\n\nexport interface PropertySection {\n label: string;\n expanded?: boolean;\n fields: PropertyField[];\n}\n\nexport const WIDGET_ID_SEPARATOR = ':' as const;\n\n/**\n * Generates a stable widget ID from a plugin ID and widget name/type.\n * @param pluginId Globally unique plugin ID (e.g. 'core.form', 'acme.analytics')\n * @param widgetName Short widget identifier (e.g. 'text', 'line-chart')\n */\nexport function buildWidgetId(pluginId: string, widgetName: string): string {\n return `${pluginId}${WIDGET_ID_SEPARATOR}${widgetName}`;\n}\n\n/**\n * Implementation helper for defining widgets with standard IDs.\n * Plugin authors should use this to ensure ID consistency.\n */\nexport function defineWidget(\n pluginId: string,\n def: Omit<WidgetDefinition, 'id'>\n): WidgetDefinition {\n return {\n ...def,\n id: buildWidgetId(pluginId, def.type)\n };\n}\n\nexport type DataShape = 'scalar' | 'list';\n\nexport interface DataBindingContract {\n shape: DataShape; // 'scalar' for single values, 'list' for collections\n targetPath?: string; // where to inject the resolved data on the widget config\n}\n\nexport interface WidgetDefinition {\n id: string; // e.g. 'core:field.text', 'core:page.table'\n kind: WidgetKind;\n flavor?: DesignerFlavor;\n type: string; // e.g. 'text', 'select'\n icon: string; // material icon name\n label: string; // palette label\n\n // Factory for initial config when dropped\n createConfig: () => any;\n\n renderer: Type<any>;\n\n // Data-driven property schema\n properties?: PropertySection[];\n\n // Generic Data Binding\n dataBinding?: DataBindingContract;\n\n // Data Consumer Strategy (Legacy / UI Hint)\n dataConsumer?: 'value' | 'list' | 'image' | 'none';\n\n // Legacy support (optional, falls back to this if properties not defined)\n inspector?: Type<any>;\n}\n\nexport interface WidgetPack {\n flavor: DesignerFlavor;\n widgets: WidgetDefinition[];\n}\n\nexport const WIDGET_DEFINITIONS = new InjectionToken<WidgetDefinition[]>('WIDGET_DEFINITIONS');\n","import { NgModule } from '@angular/core';\nimport { LucideAngularModule } from 'lucide-angular';\n// We don't need to pick icons here if app.config.ts handles global registration,\n// but if we want to be safe or if library consumers need it:\n// For now, let's just export LucideAngularModule.\n// The app.config.ts does the importProvidersFrom(LucideAngularModule.pick(...))\n// which registers them globally.\n// This module is just a pass-through for convenience.\n\n@NgModule({\n imports: [LucideAngularModule],\n exports: [LucideAngularModule]\n})\nexport class UiIconModule { }\n","/**\n * Shared helpers for normalizing style objects coming from widget configs.\n * - Converts number values to px strings.\n * - Skips null/undefined/empty values.\n */\nexport type StyleRecord = Record<string, any>;\n\nexport function normalizeStyle(style?: StyleRecord): Record<string, any> {\n if (!style) return {};\n const result: Record<string, any> = {};\n\n Object.keys(style).forEach(key => {\n const value = style[key];\n if (value === undefined || value === null || value === '') return;\n\n // 1. Check for Spacing Tokens (padding*, margin*, gap)\n // Only map known tokens to avoid accidental string matching\n const isSpacing = /^(padding|margin|gap)/i.test(key);\n if (isSpacing && typeof value === 'string') {\n const tokenMap: Record<string, string> = {\n none: '0',\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem'\n };\n if (tokenMap[value]) {\n result[key] = tokenMap[value];\n return;\n }\n }\n\n if (typeof value === 'number') {\n result[key] = `${value}px`;\n return;\n }\n // If it's a plain numeric string (e.g. \"12\"), treat as px\n if (typeof value === 'string' && /^-?\\d+(\\.\\d+)?$/.test(value.trim())) {\n result[key] = `${value}px`;\n return;\n }\n result[key] = value;\n });\n return result;\n}\n\nexport function mergeAndNormalize(base?: StyleRecord, override?: StyleRecord): Record<string, any> {\n return normalizeStyle({ ...(base || {}), ...(override || {}) });\n}\n","import { InjectionToken } from '@angular/core';\nimport type { FieldSchema } from '../form-core/models';\n\nexport type WidgetEditorContext = {\n isDesignMode: () => boolean;\n isSelected: () => boolean;\n updateField: (fieldId: string, updates: Partial<FieldSchema>) => void;\n};\n\nexport const WIDGET_EDITOR_CONTEXT = new InjectionToken<WidgetEditorContext>('WIDGET_EDITOR_CONTEXT');\n","import { Injectable, signal, computed } from '@angular/core';\nimport { FormSchema, WidgetKind, LayoutNode, WidgetNode, FieldSchema, ColumnNode, RowNode, DesignerFlavor } from '../form-core/models';\nimport { WidgetDefinition } from '../widgets/widget-definition';\nimport type { DesignerSectionDefinition } from '../plugins/section-definition';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport interface InternalDragData {\n type: 'new-widget' | 'new-section';\n widgetType?: string;\n widgetKind?: WidgetKind;\n section?: DesignerSectionDefinition;\n}\n\ntype LayoutIndexEntry = {\n node: LayoutNode;\n parentId: string | null;\n path: string[];\n index: number;\n};\n\ntype LayoutIndex = Record<string, LayoutIndexEntry>;\n\nfunction buildLayoutIndex(root: LayoutNode): LayoutIndex {\n const index: LayoutIndex = {};\n\n const walk = (node: LayoutNode, parentId: string | null, path: string[], position: number) => {\n const nextPath = [...path, node.id];\n index[node.id] = {\n node,\n parentId,\n path: nextPath,\n index: position\n };\n\n if ('children' in node) {\n const children = (node as any).children as LayoutNode[];\n children.forEach((child, idx) => walk(child, node.id, nextPath, idx));\n }\n };\n\n walk(root, null, [], 0);\n return index;\n}\n\n@Injectable({\n providedIn: 'root' // or provided in Designer component to scope it\n})\nexport class DesignerStateService {\n readonly activeFlavor = signal<DesignerFlavor>('form');\n\n readonly schema = signal<FormSchema>({\n id: uuidv4(),\n version: '1.0',\n flavor: 'form', // Default\n title: 'New Form',\n fields: [],\n layout: {\n id: uuidv4(),\n type: 'col', // Root is a vertical Page/Column\n responsive: { xs: 12 },\n children: [\n {\n id: uuidv4(),\n type: 'row', // Initial Row\n children: [\n {\n id: uuidv4(),\n type: 'col',\n responsive: { xs: 12 },\n children: []\n }\n ]\n }\n ]\n }\n });\n\n readonly selectedNodeId = signal<string | null>(null);\n readonly selectedNodeIds = signal<string[]>([]);\n readonly contextMenu = signal<{ x: number; y: number } | null>(null);\n readonly activeBreakpoint = signal<'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'>('xl');\n readonly isPreviewMode = signal<boolean>(false);\n readonly activeDevice = computed(() => {\n const bp = this.activeBreakpoint();\n return bp === 'xs' ? 'mobile' : 'desktop';\n });\n readonly activeThemeId = signal<string>('default');\n \n // Structure of clipboard data\n readonly clipboard = signal<{ nodes: LayoutNode[]; fields: FieldSchema[] } | null>(null);\n\n private readonly history: string[] = [];\n private readonly historyIndex = signal(-1);\n private readonly historyLength = signal(0);\n private readonly maxHistory = 100;\n\n readonly canUndo = computed(() => this.historyIndex() > 0);\n readonly canRedo = computed(() => {\n const index = this.historyIndex();\n return index >= 0 && index < this.historyLength() - 1;\n });\n\n constructor() {\n this.recordHistory(this.schema());\n }\n\n readonly layoutIndex = computed(() => buildLayoutIndex(this.schema().layout));\n\n readonly selectedNode = computed(() => {\n const id = this.selectedNodeId();\n if (!id) return null;\n const entry = this.layoutIndex()[id];\n return entry?.node ?? null;\n });\n\n readonly selectedField = computed(() => {\n const node = this.selectedNode();\n if (node && node.type === 'widget') {\n const refId = (node as WidgetNode).refId;\n return this.schema().fields.find((f: FieldSchema) => f.id === refId) || null;\n }\n return null;\n });\n\n updateSchema(schema: FormSchema) {\n this.setSchema(schema);\n }\n\n setFlavor(flavor: DesignerFlavor) {\n this.activeFlavor.set(flavor);\n // Update schema flavor if not already matching, but preserve structure\n const current = this.schema();\n if (current.flavor !== flavor) {\n this.setSchema({ ...current, flavor });\n }\n }\n\n undo() {\n if (!this.canUndo()) return;\n const nextIndex = this.historyIndex() - 1;\n this.restoreSnapshot(nextIndex);\n }\n\n redo() {\n if (!this.canRedo()) return;\n const nextIndex = this.historyIndex() + 1;\n this.restoreSnapshot(nextIndex);\n }\n\n selectNode(id: string | null) {\n if (!id) {\n this.selectedNodeId.set(null);\n this.selectedNodeIds.set([]);\n this.closeContextMenu();\n return;\n }\n\n this.selectedNodeId.set(id);\n this.selectedNodeIds.set([id]);\n this.closeContextMenu();\n }\n\n toggleNodeSelection(id: string) {\n const current = this.selectedNodeIds();\n const exists = current.includes(id);\n const next = exists ? current.filter(item => item !== id) : [...current, id];\n\n this.selectedNodeIds.set(next);\n if (!exists) {\n this.selectedNodeId.set(id);\n } else {\n this.selectedNodeId.set(next[next.length - 1] ?? null);\n }\n }\n\n isNodeSelected(nodeId: string): boolean {\n return this.selectedNodeIds().includes(nodeId);\n }\n\n openContextMenu(position: { x: number; y: number }) {\n this.contextMenu.set(position);\n }\n\n closeContextMenu() {\n this.contextMenu.set(null);\n }\n\n private setSchema(schema: FormSchema, options?: { recordHistory?: boolean }) {\n this.schema.set(schema);\n\n if (schema.flavor && schema.flavor !== this.activeFlavor()) {\n this.activeFlavor.set(schema.flavor);\n }\n\n this.ensureSelectionIsValid(schema);\n\n if (options?.recordHistory !== false) {\n this.recordHistory(schema);\n }\n }\n\n // --- Clipboard & Selection Operations ---\n\n copy() {\n const selectedIds = this.selectedNodeIds();\n if (selectedIds.length === 0) return;\n\n const current = this.schema();\n const nodesToCopy: LayoutNode[] = [];\n const fieldsToCopy: FieldSchema[] = [];\n\n const index = this.layoutIndex();\n\n // 1. Gather nodes\n // Sort by index/position if possible to maintain order, but simple iteration is okay for now.\n // We should probably filter out descendants if ancestors are also selected to avoid duplication?\n // For simplicity: just Copy exactly what is selected. If user selects Row + its Child Col, we might duplicate stuff?\n // Better approach: minimal cover. If a parent is selected, don't include its children in the top-level list.\n \n const isDescendantOfSelected = (id: string): boolean => {\n let parentId = index[id]?.parentId;\n while (parentId) {\n if (selectedIds.includes(parentId)) return true;\n parentId = index[parentId]?.parentId;\n }\n return false;\n };\n\n const topLevelSelected = selectedIds.filter(id => !isDescendantOfSelected(id));\n\n for (const id of topLevelSelected) {\n const entry = index[id];\n if (entry && entry.node) {\n nodesToCopy.push(entry.node);\n // 2. Gather fields recursively\n this.collectFields(entry.node, current.fields, fieldsToCopy);\n }\n }\n\n if (nodesToCopy.length > 0) {\n this.clipboard.set({ nodes: JSON.parse(JSON.stringify(nodesToCopy)), fields: JSON.parse(JSON.stringify(fieldsToCopy)) });\n }\n }\n\n cut() {\n this.copy();\n this.deleteSelected();\n }\n\n paste() {\n const data = this.clipboard();\n if (!data || data.nodes.length === 0) return;\n\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n const newFields = [...current.fields];\n\n // Determine Drop Target\n const selectedId = this.selectedNodeId(); // Primary selection for paste target\n const index = this.layoutIndex();\n \n let targetParentId: string | null = null;\n let targetIndex: number = -1;\n let insertMode: 'append' | 'insert' = 'append'; // append to container, or insert after item\n\n if (selectedId) {\n const entry = index[selectedId];\n if (entry) {\n const node = entry.node;\n if ((node.type === 'row' || node.type === 'col') && 'children' in node) {\n // Paste INSIDE the container\n targetParentId = node.id;\n targetIndex = (node as any).children.length; // End of list\n insertMode = 'append';\n } else {\n // Paste AFTER the widget (sibling)\n targetParentId = entry.parentId;\n targetIndex = entry.index + 1;\n insertMode = 'insert';\n }\n }\n }\n\n // Fallback: If no selection or invalid target, paste to Root\n if (!targetParentId) {\n targetParentId = newLayout.id;\n targetIndex = newLayout.children.length;\n insertMode = 'append';\n }\n\n const newSelectedIds: string[] = [];\n\n // Helper to clone node with new IDs\n const processNode = (node: LayoutNode): LayoutNode => {\n const newNode = JSON.parse(JSON.stringify(node));\n newNode.id = uuidv4();\n newSelectedIds.push(newNode.id);\n\n if (newNode.type === 'widget' && newNode.refId) {\n // Find corresponding field in clipboard data\n const originalField = data.fields.find(f => f.id === newNode.refId);\n // Or map via old refId? \n // Wait, processNode receives 'node' which is from clipboard (already has old IDs).\n // We need to map oldFieldId -> newFieldId.\n if (originalField) {\n // Create new field\n const newFieldId = uuidv4();\n const newField = {\n ...originalField,\n id: newFieldId,\n name: `${originalField.name}_${Date.now()}_${Math.floor(Math.random() * 1000)}` \n };\n newFields.push(newField);\n newNode.refId = newFieldId;\n }\n }\n\n if ('children' in newNode) {\n newNode.children = newNode.children.map((child: LayoutNode) => processNode(child));\n }\n return newNode;\n };\n\n const clonedNodes = data.nodes.map(n => processNode(n));\n\n // Insert into Layout\n if (!targetParentId) return; // Should be handled by fallback above, but satisfies TS\n const targetNode = this.findNode(newLayout, targetParentId);\n if (targetNode && 'children' in targetNode) {\n (targetNode as any).children.splice(targetIndex, 0, ...clonedNodes);\n \n this.setSchema({\n ...current,\n fields: newFields,\n layout: newLayout\n });\n\n // Select pasted items\n this.selectedNodeIds.set(newSelectedIds);\n if (newSelectedIds.length > 0) {\n this.selectedNodeId.set(newSelectedIds[0]);\n }\n }\n }\n\n deleteSelected() {\n const idsToDelete = this.selectedNodeIds();\n if (idsToDelete.length === 0) return;\n\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n let fieldsToRemove: string[] = [];\n\n const collectFieldIds = (node: LayoutNode) => {\n if (node.type === 'widget' && (node as WidgetNode).refId) {\n fieldsToRemove.push((node as WidgetNode).refId!);\n }\n if ('children' in node) {\n ((node as any).children as LayoutNode[]).forEach((c: any) => collectFieldIds(c));\n }\n };\n\n const index = this.layoutIndex(); // Use current index to find nodes quickly if needed, \n // but we need to walk the newLayout to mutate it.\n // Actually, simpler to just write a recursive remover that checks against the Set of IDs.\n\n const deleteSet = new Set(idsToDelete);\n\n const removeRecursive = (parent: LayoutNode) => {\n if (!('children' in parent)) return;\n const children = (parent as any).children as LayoutNode[];\n \n // Iterate backwards to safely splice\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n if (deleteSet.has(child.id)) {\n collectFieldIds(child);\n children.splice(i, 1);\n } else {\n removeRecursive(child);\n }\n }\n };\n\n // Handle root children manually? No, root is just a node.\n removeRecursive(newLayout);\n\n const newFields = current.fields.filter(f => !fieldsToRemove.includes(f.id));\n\n this.setSchema({ ...current, fields: newFields, layout: newLayout });\n this.selectNode(null);\n }\n\n // Helper to find parent of a node (simple traversal)\n // Actually our layoutIndex already has parentId! \n // But we are modifying a deep clone 'newLayout', so index isn't valid for that object reference. \n // We rely on ID matching which is preserved.\n\n private collectFields(node: LayoutNode, allFields: FieldSchema[], targetList: FieldSchema[]) {\n if (node.type === 'widget' && (node as WidgetNode).refId) {\n const f = allFields.find(field => field.id === (node as WidgetNode).refId);\n if (f) targetList.push(f);\n }\n if ('children' in node) {\n ((node as any).children as LayoutNode[]).forEach((c: any) => this.collectFields(c, allFields, targetList));\n }\n }\n\n private ensureSelectionIsValid(schema: FormSchema) {\n const selectedId = this.selectedNodeId();\n const index = this.layoutIndex();\n const validIds = this.selectedNodeIds().filter(id => !!index[id]);\n\n if (validIds.length !== this.selectedNodeIds().length) {\n this.selectedNodeIds.set(validIds);\n }\n\n if (selectedId && !index[selectedId]) {\n this.selectedNodeId.set(validIds[0] ?? null);\n }\n }\n\n private recordHistory(schema: FormSchema) {\n const snapshot = JSON.stringify(schema);\n const currentIndex = this.historyIndex();\n const currentSnapshot = currentIndex >= 0 ? this.history[currentIndex] : null;\n\n if (snapshot === currentSnapshot) {\n return;\n }\n\n if (currentIndex < this.history.length - 1) {\n this.history.splice(currentIndex + 1);\n }\n\n this.history.push(snapshot);\n\n let nextIndex = currentIndex + 1;\n if (this.history.length > this.maxHistory) {\n const overflow = this.history.length - this.maxHistory;\n this.history.splice(0, overflow);\n nextIndex = Math.max(0, nextIndex - overflow);\n }\n\n this.historyIndex.set(nextIndex);\n this.historyLength.set(this.history.length);\n }\n\n private restoreSnapshot(index: number) {\n const snapshot = this.history[index];\n if (!snapshot) return;\n\n const schema = JSON.parse(snapshot) as FormSchema;\n this.setSchema(schema, { recordHistory: false });\n this.historyIndex.set(index);\n this.historyLength.set(this.history.length);\n }\n\n findNode(root: LayoutNode, id: string): LayoutNode | null {\n if (root.id === id) return root;\n if (root.type === 'row') {\n for (const child of root.children) {\n const found = this.findNode(child, id);\n if (found) return found;\n }\n } else if (root.type === 'col') {\n for (const child of root.children) {\n const found = this.findNode(child, id);\n if (found) return found;\n }\n }\n return null;\n }\n\n /** Get the path of nodes from root to target (for breadcrumb) */\n getNodePath(nodeId: string): { id: string; label: string; type: string }[] {\n const index = this.layoutIndex();\n const entry = index[nodeId];\n if (!entry) return [];\n const path: { id: string; label: string; type: string }[] = [];\n for (const id of entry.path) {\n const node = index[id]?.node;\n if (!node) continue;\n path.push({ id, label: this.getNodeLabel(node), type: node.type });\n }\n return path;\n }\n\n private getNodeLabel(node: LayoutNode): string {\n if (node.type === 'row') return 'Row';\n if (node.type === 'col') return 'Column';\n if (node.type === 'widget') {\n const field = this.schema().fields.find(f => f.id === (node as WidgetNode).refId);\n return field?.label || field?.type || 'Widget';\n }\n return 'Root';\n }\n\n // Helper to add widget\n addFieldWidget(field: any, widgetNode: WidgetNode, targetColId: string) {\n const current = this.schema();\n const newFields = [...current.fields, field];\n\n // Deep clone layout to mutate\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n this.insertNodeIntoLayout(newLayout, targetColId, widgetNode);\n\n this.setSchema({\n ...current,\n fields: newFields,\n layout: newLayout\n });\n }\n\n private insertNodeIntoLayout(root: LayoutNode, targetId: string, newNode: LayoutNode, index?: number) {\n if (root.type === 'col') {\n if (root.id === targetId) {\n if (typeof index === 'number') {\n root.children.splice(index, 0, newNode);\n } else {\n root.children.push(newNode);\n }\n return true;\n }\n }\n\n if (root.type === 'row' || root.type === 'col') {\n for (const child of (root as any).children) {\n if (this.insertNodeIntoLayout(child, targetId, newNode, index)) return true;\n }\n }\n return false;\n }\n\n handleDrop(event: any, targetColId: string) {\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout)); // Deep clone\n const newFields = [...current.fields];\n\n // helper to find column in newLayout\n const findCol = (root: LayoutNode, id: string): ColumnNode | null => {\n if (root.id === id && root.type === 'col') return root as ColumnNode;\n if ('children' in root) {\n for (const child of (root as any).children) {\n const res = findCol(child, id);\n if (res) return res;\n }\n }\n return null;\n };\n\n const targetCol = findCol(newLayout, targetColId);\n if (!targetCol) return;\n\n if (event.previousContainer === event.container) {\n // Reorder\n if (event.previousIndex === event.currentIndex) return;\n const item = targetCol.children[event.previousIndex];\n targetCol.children.splice(event.previousIndex, 1);\n targetCol.children.splice(event.currentIndex, 0, item);\n } else {\n // Transfer or New\n const data = event.item.data as InternalDragData | LayoutNode | null;\n\n if (data && data.type === 'new-widget') {\n if (!data.widgetKind || !data.widgetType) {\n console.warn('Drag data missing widget info.');\n return;\n }\n // Create new\n let widgetNode: WidgetNode;\n if (data.widgetKind === 'field' || data.widgetKind === 'image') {\n // 1. Create Field (or static element backed by FieldSchema)\n // We need the widget def to create config. \n const fieldId = uuidv4();\n const field: FieldSchema = {\n id: fieldId,\n name: `field_${Date.now()}`,\n type: data.widgetType as any,\n label: 'New Widget',\n };\n newFields.push(field);\n\n widgetNode = {\n id: uuidv4(),\n type: 'widget',\n widgetKind: data.widgetKind,\n refId: fieldId\n };\n } else {\n // other widgets\n widgetNode = {\n id: uuidv4(),\n type: 'widget',\n widgetKind: data.widgetKind,\n refId: uuidv4()\n };\n }\n\n targetCol.children.splice(event.currentIndex, 0, widgetNode);\n } else if (data && data.type === 'new-section' && data.section) {\n const draft = data.section.build();\n targetCol.children.splice(event.currentIndex, 0, draft.layout);\n newFields.push(...draft.fields);\n } else if (this.isLayoutNode(data)) {\n const movedNode = this.detachNode(newLayout, data.id);\n if (!movedNode) return;\n targetCol.children.splice(event.currentIndex, 0, movedNode);\n } else {\n console.warn('Unsupported drag data dropped into layout.');\n }\n }\n\n this.setSchema({\n ...current,\n fields: newFields,\n layout: newLayout\n });\n }\n\n pushField(widgetDef: WidgetDefinition) {\n // Existing logic unchanged\n\n // Simplified Logic: Always append to the last column of the last row for now, \n // or check if there is a selected column.\n\n const current = this.schema();\n const newFields = [...current.fields];\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n\n const fieldId = uuidv4();\n const field: FieldSchema = {\n id: fieldId,\n widgetId: widgetDef.id, // Persist stable ID\n name: `field_${Date.now()}`,\n type: widgetDef.type as any,\n label: widgetDef.label,\n };\n newFields.push(field);\n\n const widgetNode: WidgetNode = {\n id: uuidv4(),\n type: 'widget',\n refId: fieldId,\n widgetKind: widgetDef.kind // Use kind from definition\n };\n\n // Find target container\n let targetCol: ColumnNode | null = null;\n\n // Strategy 1: Use Selected Node if it is a Column\n const selectedId = this.selectedNodeId();\n if (selectedId) {\n const node = this.findNode(newLayout, selectedId);\n if (node && node.type === 'col') {\n targetCol = node as ColumnNode;\n } else if (node && node.type === 'widget') {\n // If selected node is a widget, find its parent column (needs parent pointers or traversal)\n // For now, let's just default to root behavior if widget selected\n // Or we could implement findParent(root, id)\n }\n }\n\n // Strategy 2: Default to first column of first row (or create new)\n if (!targetCol) {\n // Just find the first column we can\n const findFirstCol = (node: LayoutNode): ColumnNode | null => {\n if (node.type === 'col') return node as ColumnNode;\n if ('children' in node) {\n for (const child of (node as any).children) {\n const res = findFirstCol(child);\n if (res) return res;\n }\n }\n return null;\n };\n targetCol = findFirstCol(newLayout);\n }\n\n if (targetCol) {\n targetCol.children.push(widgetNode);\n\n this.setSchema({\n ...current,\n fields: newFields,\n layout: newLayout\n });\n\n // Auto Select new field\n this.selectNode(widgetNode.id);\n }\n }\n\n pushStructure(type: 'row' | '2col') {\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n\n // Create a new Row\n const newRow: RowNode = {\n id: uuidv4(),\n type: 'row',\n children: []\n };\n\n // Create column(s) for the new row\n const col1: LayoutNode = {\n id: uuidv4(),\n type: 'col',\n responsive: { xs: type === '2col' ? 6 : 12 },\n children: []\n };\n newRow.children.push(col1);\n\n if (type === '2col') {\n const col2: LayoutNode = {\n id: uuidv4(),\n type: 'col',\n responsive: { xs: 6 },\n children: []\n };\n newRow.children.push(col2);\n }\n\n // Add the new Row to the Root (Page)\n // Root is 'col', so we push to its children\n if (newLayout.type === 'col') {\n newLayout.children.push(newRow);\n } else {\n // Fallback if root is somehow still 'row' (migration?)\n // We can't put a row in a row effectively without wrapping.\n // For now assume root is fixed to col.\n newLayout.children.push(newRow);\n }\n\n this.setSchema({ ...current, layout: newLayout });\n }\n\n // --- Column Management Methods ---\n\n\n /** Remove a column by its id */\n removeColumn(columnId: string) {\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n // Find parent row and remove column\n const removeFromRow = (node: LayoutNode): boolean => {\n if (node.type === 'row') {\n const idx = node.children.findIndex((c: any) => c.id === columnId && c.type === 'col');\n if (idx !== -1) {\n node.children.splice(idx, 1);\n return true;\n }\n }\n if ('children' in node) {\n for (const child of (node as any).children) {\n if (removeFromRow(child)) return true;\n }\n }\n return false;\n };\n removeFromRow(newLayout);\n this.setSchema({ ...current, layout: newLayout });\n }\n\n /** Set preset column layout (e.g., 3,4,6) on a row */\n setPresetLayout(rowId: string, preset: number) {\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n const rowNode = this.findNode(newLayout, rowId) as any;\n if (!rowNode || rowNode.type !== 'row') return;\n rowNode.maxColumns = preset;\n // Adjust existing columns count\n const existing = rowNode.children.length;\n if (existing < preset) {\n for (let i = existing; i < preset; i++) {\n const col: ColumnNode = {\n id: uuidv4(),\n type: 'col',\n responsive: { xs: Math.floor(12 / preset) },\n children: []\n };\n rowNode.children.push(col);\n }\n } else if (existing > preset) {\n // Remove extra columns (simple truncate)\n rowNode.children = rowNode.children.slice(0, preset);\n }\n // Update each column's responsive based on preset\n rowNode.children.forEach((c: ColumnNode) => {\n c.responsive = { xs: Math.floor(12 / preset) };\n });\n this.setSchema({ ...current, layout: newLayout });\n }\n /** Add one or more columns to a row */\n addColumn(rowId: string, count: number = 1) {\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n const rowNode = this.findNode(newLayout, rowId) as any;\n if (!rowNode || rowNode.type !== 'row') return;\n for (let i = 0; i < count; i++) {\n const col: ColumnNode = {\n id: uuidv4(),\n type: 'col',\n responsive: { xs: 12 },\n children: []\n };\n rowNode.children.push(col);\n }\n this.setSchema({ ...current, layout: newLayout });\n }\n\n // --- Node Manipulation Methods (for floating toolbar) ---\n\n /** Move a node up or down within its parent container */\n moveNode(nodeId: string, direction: 'up' | 'down') {\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n\n // Find parent that contains this node\n const findParentAndIndex = (parent: LayoutNode, id: string): { parent: LayoutNode, index: number } | null => {\n if ('children' in parent) {\n const children = (parent as any).children as LayoutNode[];\n const index = children.findIndex(c => c.id === id);\n if (index !== -1) {\n return { parent, index };\n }\n for (const child of children) {\n const result = findParentAndIndex(child, id);\n if (result) return result;\n }\n }\n return null;\n };\n\n const result = findParentAndIndex(newLayout, nodeId);\n if (!result) return;\n\n const { parent, index } = result;\n const children = (parent as any).children as LayoutNode[];\n\n if (direction === 'up' && index > 0) {\n // Swap with previous\n [children[index], children[index - 1]] = [children[index - 1], children[index]];\n } else if (direction === 'down' && index < children.length - 1) {\n // Swap with next\n [children[index], children[index + 1]] = [children[index + 1], children[index]];\n }\n\n this.setSchema({ ...current, layout: newLayout });\n }\n\n /** Duplicate a node (row, col, or widget) */\n duplicateNode(nodeId: string) {\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n const newFields = [...current.fields];\n\n // Find node and its parent\n const findParentAndNode = (parent: LayoutNode, id: string): { parent: LayoutNode, node: LayoutNode, index: number } | null => {\n if ('children' in parent) {\n const children = (parent as any).children as LayoutNode[];\n const index = children.findIndex(c => c.id === id);\n if (index !== -1) {\n return { parent, node: children[index], index };\n }\n for (const child of children) {\n const result = findParentAndNode(child, id);\n if (result) return result;\n }\n }\n return null;\n };\n\n const result = findParentAndNode(newLayout, nodeId);\n if (!result) return;\n\n const { parent, node, index } = result;\n const children = (parent as any).children as LayoutNode[];\n\n // Deep clone the node and regenerate IDs\n const cloneWithNewIds = (n: LayoutNode): LayoutNode => {\n const cloned = JSON.parse(JSON.stringify(n));\n cloned.id = uuidv4();\n\n // If it's a widget, also duplicate the field\n if (cloned.type === 'widget' && cloned.refId) {\n const originalField = current.fields.find(f => f.id === cloned.refId);\n if (originalField) {\n const newFieldId = uuidv4();\n const newField: FieldSchema = {\n ...JSON.parse(JSON.stringify(originalField)),\n id: newFieldId,\n name: `${originalField.name}_copy_${Date.now()}`,\n label: `${originalField.label || 'Field'} (Copy)`\n };\n newFields.push(newField);\n cloned.refId = newFieldId;\n }\n }\n\n if ('children' in cloned) {\n cloned.children = cloned.children.map((c: any) => cloneWithNewIds(c));\n }\n return cloned;\n };\n\n const duplicatedNode = cloneWithNewIds(node);\n children.splice(index + 1, 0, duplicatedNode);\n\n this.setSchema({ ...current, fields: newFields, layout: newLayout });\n this.selectNode(duplicatedNode.id);\n }\n\n /** Delete a node (row, col, or widget) and associated field if widget */\n deleteNode(nodeId: string) {\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n let fieldsToRemove: string[] = [];\n\n // Collect field IDs to remove (for widgets)\n const collectFieldIds = (node: LayoutNode) => {\n if (node.type === 'widget' && (node as WidgetNode).refId) {\n fieldsToRemove.push((node as WidgetNode).refId!);\n }\n if ('children' in node) {\n ((node as any).children as LayoutNode[]).forEach(c => collectFieldIds(c));\n }\n };\n\n // Find and remove node from parent\n const removeFromParent = (parent: LayoutNode, id: string): boolean => {\n if ('children' in parent) {\n const children = (parent as any).children as LayoutNode[];\n const index = children.findIndex(c => c.id === id);\n if (index !== -1) {\n collectFieldIds(children[index]); // Collect before removing\n children.splice(index, 1);\n return true;\n }\n for (const child of children) {\n if (removeFromParent(child, id)) return true;\n }\n }\n return false;\n };\n\n removeFromParent(newLayout, nodeId);\n\n // Filter out removed fields\n const newFields = current.fields.filter(f => !fieldsToRemove.includes(f.id));\n\n // Clear selection\n if (this.selectedNodeId() === nodeId) {\n this.selectNode(null);\n }\n\n this.setSchema({ ...current, fields: newFields, layout: newLayout });\n }\n\n // Phase 2: Duplicate field\n duplicateField(fieldId: string) {\n const current = this.schema();\n const field = current.fields.find(f => f.id === fieldId);\n if (!field) return;\n\n // Create new field with copied properties\n const newFieldId = uuidv4();\n const newField: FieldSchema = {\n ...JSON.parse(JSON.stringify(field)),\n id: newFieldId,\n name: `${field.name}_copy_${Date.now()}`,\n label: `${field.label || 'Field'} (Copy)`\n };\n\n // Find the widget node that references this field\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n const widgetNode = this.findWidgetByRefId(newLayout, fieldId);\n\n if (widgetNode) {\n // Find parent column and insert duplicate after original\n const parent = this.findParentCol(newLayout, widgetNode.id);\n if (parent) {\n const index = parent.children.findIndex((c: any) => c.id === widgetNode.id);\n const newWidgetNode: WidgetNode = {\n id: uuidv4(),\n type: 'widget',\n widgetKind: 'field',\n refId: newFieldId\n };\n parent.children.splice(index + 1, 0, newWidgetNode);\n }\n }\n\n this.setSchema({\n ...current,\n fields: [...current.fields, newField],\n layout: newLayout\n });\n }\n\n // Phase 2: Remove field\n removeField(fieldId: string) {\n const current = this.schema();\n const newFields = current.fields.filter(f => f.id !== fieldId);\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n\n // Find and remove widget that references this field\n this.removeWidgetByRefId(newLayout, fieldId);\n\n // Clear selection if we removed the selected node\n const selectedNode = this.selectedNode();\n if (selectedNode && selectedNode.type === 'widget' && (selectedNode as WidgetNode).refId === fieldId) {\n this.selectNode(null);\n }\n\n this.setSchema({\n ...current,\n fields: newFields,\n layout: newLayout\n });\n }\n\n updateField(fieldId: string, updates: Partial<FieldSchema>) {\n const current = this.schema();\n const newFields = current.fields.map(f => {\n if (f.id === fieldId) {\n return { ...f, ...updates };\n }\n return f;\n });\n\n this.setSchema({\n ...current,\n fields: newFields\n });\n }\n\n groupSelectedFields(): string | null {\n const selected = this.getSelectedWidgetFields();\n if (selected.length < 2) return null;\n\n const existingKeys = selected.map(field => field.groupKey).filter((key): key is string => !!key);\n const sharedKey = existingKeys.length > 0 && existingKeys.every(key => key === existingKeys[0]) ? existingKeys[0] : null;\n const groupKey = sharedKey ?? `group_${Date.now()}`;\n const selectedIds = new Set(selected.map(field => field.id));\n\n const current = this.schema();\n const newFields = current.fields.map(field => {\n if (!selectedIds.has(field.id)) return field;\n return {\n ...field,\n groupKey\n };\n });\n\n this.setSchema({\n ...current,\n fields: newFields\n });\n\n return groupKey;\n }\n\n ungroupSelectedFields() {\n const selected = this.getSelectedWidgetFields();\n if (selected.length === 0) return;\n const selectedIds = new Set(selected.map(field => field.id));\n const current = this.schema();\n const newFields = current.fields.map(field => {\n if (!selectedIds.has(field.id)) return field;\n return {\n ...field,\n groupKey: undefined\n };\n });\n\n this.setSchema({\n ...current,\n fields: newFields\n });\n }\n\n canGroupSelectedFields(): boolean {\n return this.getSelectedWidgetFields().length >= 2;\n }\n\n canUngroupSelectedFields(): boolean {\n return this.getSelectedWidgetFields().some(field => !!field.groupKey);\n }\n\n private getSelectedWidgetFields(): FieldSchema[] {\n const current = this.schema();\n const index = this.layoutIndex();\n const fieldMap = new Map(current.fields.map(field => [field.id, field]));\n const selectedFields: FieldSchema[] = [];\n const seen = new Set<string>();\n\n for (const nodeId of this.selectedNodeIds()) {\n const node = index[nodeId]?.node;\n if (!node || node.type !== 'widget') continue;\n const refId = (node as WidgetNode).refId;\n if (!refId || seen.has(refId)) continue;\n const field = fieldMap.get(refId);\n if (!field) continue;\n selectedFields.push(field);\n seen.add(refId);\n }\n\n return selectedFields;\n }\n\n /**\n * Update a specific node's style without cloning the entire tree.\n * Only the path from root to the target node gets new references.\n */\n updateNodeStyle(nodeId: string, style: Record<string, any>) {\n const current = this.schema();\n const newLayout = this.updateNodeInTree(current.layout, nodeId, { style });\n if (newLayout !== current.layout) {\n this.setSchema({ ...current, layout: newLayout });\n }\n }\n\n /**\n * Update a specific node's responsive settings.\n */\n updateNodeResponsive(nodeId: string, responsive: Record<string, number | undefined>) {\n const current = this.schema();\n const newLayout = this.updateNodeInTree(current.layout, nodeId, { responsive });\n if (newLayout !== current.layout) {\n this.setSchema({ ...current, layout: newLayout });\n }\n }\n\n /**\n * Immutable tree update - only creates new references along the path to target.\n * Returns the original node if no changes were made (preserves reference equality).\n */\n private updateNodeInTree(\n node: LayoutNode,\n targetId: string,\n updates: Partial<LayoutNode>\n ): LayoutNode {\n if (node.id === targetId) {\n // Found target - return updated copy\n return { ...node, ...updates } as LayoutNode;\n }\n\n if ('children' in node) {\n const children = (node as any).children as LayoutNode[];\n let changed = false;\n const newChildren = children.map(child => {\n const updated = this.updateNodeInTree(child, targetId, updates);\n if (updated !== child) changed = true;\n return updated;\n });\n\n if (changed) {\n return { ...node, children: newChildren } as LayoutNode;\n }\n }\n\n return node; // Unchanged - return original reference\n }\n\n private isLayoutNode(value: unknown): value is LayoutNode {\n if (!value || typeof value !== 'object') return false;\n const node = value as LayoutNode;\n return typeof node.id === 'string' && (node.type === 'row' || node.type === 'col' || node.type === 'widget');\n }\n\n private detachNode(root: LayoutNode, nodeId: string): LayoutNode | null {\n const result = this.findParentAndIndex(root, nodeId);\n if (!result) return null;\n const children = (result.parent as any).children as LayoutNode[];\n const [removed] = children.splice(result.index, 1);\n return removed ?? null;\n }\n\n private findWidgetByRefId(node: LayoutNode, refId: string): WidgetNode | null {\n if (node.type === 'widget' && (node as WidgetNode).refId === refId) {\n return node as WidgetNode;\n }\n if ('children' in node) {\n for (const child of (node as any).children) {\n const found = this.findWidgetByRefId(child, refId);\n if (found) return found;\n }\n }\n return null;\n }\n\n private findParentCol(root: LayoutNode, nodeId: string): ColumnNode | null {\n if (root.type === 'col') {\n const col = root as ColumnNode;\n if (col.children.some((c: any) => c.id === nodeId)) {\n return col;\n }\n }\n if ('children' in root) {\n for (const child of (root as any).children) {\n const found = this.findParentCol(child, nodeId);\n if (found) return found;\n }\n }\n return null;\n }\n\n private removeWidgetByRefId(node: LayoutNode, refId: string): boolean {\n if ('children' in node) {\n const arr = (node as any).children as LayoutNode[];\n const index = arr.findIndex((c: any) => c.type === 'widget' && (c as WidgetNode).refId === refId);\n if (index !== -1) {\n arr.splice(index, 1);\n return true;\n }\n for (const child of arr) {\n if (this.removeWidgetByRefId(child, refId)) return true;\n }\n }\n return false;\n }\n // --- Advanced Layout Actions (Phase 5) ---\n\n /**\n * Insert a new Row (with default column structure) into a specific Column.\n * Useful for creating nested grids.\n */\n insertRowInColumn(columnId: string, colCount: 1 | 2 = 1) {\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n const colNode = this.findNode(newLayout, columnId) as any;\n\n if (!colNode || colNode.type !== 'col') return;\n\n const newRow: RowNode = {\n id: uuidv4(),\n type: 'row',\n children: []\n };\n\n // Add columns to the new row\n for (let i = 0; i < colCount; i++) {\n newRow.children.push({\n id: uuidv4(),\n type: 'col',\n responsive: { xs: colCount === 2 ? 6 : 12 },\n children: []\n });\n }\n\n colNode.children.push(newRow);\n this.setSchema({ ...current, layout: newLayout });\n\n // Select the first column of the new row to aid flow\n this.selectNode(newRow.children[0].id);\n }\n\n /**\n * Wrap an existing widget in a new Row -> Column structure.\n * Replaces the widget's current position with the new Row, \n * and puts the widget inside the new Row's Column.\n */\n wrapWidgetInRow(widgetId: string) {\n const current = this.schema();\n const newLayout = JSON.parse(JSON.stringify(current.layout));\n\n // 1. Find the widget and its parent\n const findResult = this.findParentAndIndex(newLayout, widgetId);\n if (!findResult) return;\n\n const { parent, index } = findResult;\n const widgetNode = (parent as any).children[index]; // Detached logic comes next\n\n // 2. Create wrapper structure\n const newRow: RowNode = {\n id: uuidv4(),\n type: 'row',\n children: [\n {\n id: uuidv4(),\n type: 'col',\n responsive: { xs: 12 },\n children: [widgetNode] // Move widget here\n }\n ]\n };\n\n // 3. Replace widget in parent with new Row\n (parent as any).children.splice(index, 1, newRow);\n\n this.setSchema({ ...current, layout: newLayout });\n\n // Keep selection on widget? Or select the new Row?\n // Let's keep widget selected so context remains\n this.selectNode(widgetId);\n }\n\n // Internal helper which was seemingly missing in previous steps but needed now\n private findParentAndIndex(root: LayoutNode, childId: string): { parent: LayoutNode, index: number } | null {\n if ('children' in root) {\n const children = (root as any).children as LayoutNode[];\n const index = children.findIndex(c => c.id === childId);\n if (index !== -1) {\n return { parent: root, index };\n }\n for (const child of children) {\n const res = this.findParentAndIndex(child, childId);\n if (res) return res;\n }\n }\n return null;\n }\n}\n","import { Component, Input, Inject, ViewChild, ViewContainerRef, OnInit, OnChanges, SimpleChanges, EventEmitter, Output, ChangeDetectorRef, ElementRef, OnDestroy, DestroyRef, inject, ChangeDetectionStrategy, ComponentRef, Injector } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LayoutNode, WidgetNode, ColumnNode, RowNode, ResponsiveSpan, FieldSchema } from '../form-core/models';\nimport { WidgetDefinition, WIDGET_DEFINITIONS } from '../widgets/widget-definition';\nimport { FormEngine } from '../form-core/form-engine';\nimport { FormControl } from '@angular/forms';\nimport { DragDropModule, CdkDragDrop } from '@angular/cdk/drag-drop';\nimport { DesignerStateService } from '../form-designer/designer-state.service';\nimport { UiIconModule } from '../ui/ui-icon.module';\nimport { normalizeStyle } from '../widgets/style-helpers';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { WIDGET_EDITOR_CONTEXT, WidgetEditorContext } from '../widgets/widget-editor-context';\n\n@Component({\n selector: 'app-layout-node',\n standalone: true,\n imports: [CommonModule, DragDropModule, UiIconModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ng-container [ngSwitch]=\"node.type\">\n \n <!-- ROW -->\n <ng-container *ngSwitchCase=\"'row'\">\n <div *ngIf=\"isNodeVisible(node)\"\n class=\"flex flex-wrap transition-all relative group\"\n [style]=\"getStyle(node)\"\n (click)=\"onRowClick($event)\"\n (contextmenu)=\"onRowContextMenu($event)\"\n [class.outline-dashed]=\"designMode\"\n [class.outline-1]=\"designMode\"\n [class.outline-blue-200]=\"designMode && !isSelected\"\n [class.ring-2]=\"designMode && isSelected\"\n [class.ring-blue-500]=\"designMode && isSelected\"\n [class.bg-blue-50]=\"designMode && isSelected\">\n \n <!-- Floating Selection Toolbar -->\n <div *ngIf=\"designMode && isSelected\" \n class=\"absolute -top-9 left-1/2 -translate-x-1/2 bg-gray-900 text-white rounded-lg shadow-xl flex items-center gap-0.5 px-1.5 py-1 text-xs z-50 whitespace-nowrap\"\n (click)=\"$event.stopPropagation()\">\n <button type=\"button\" (click)=\"moveNodeUp()\" class=\"p-1.5 hover:bg-gray-700 rounded transition-colors\" title=\"Move Up\">\n <lucide-icon name=\"chevron-up\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <button type=\"button\" (click)=\"moveNodeDown()\" class=\"p-1.5 hover:bg-gray-700 rounded transition-colors\" title=\"Move Down\">\n <lucide-icon name=\"chevron-down\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <div class=\"w-px h-4 bg-gray-700 mx-0.5\"></div>\n <button type=\"button\" (click)=\"duplicateNode()\" class=\"p-1.5 hover:bg-gray-700 rounded transition-colors\" title=\"Duplicate\">\n <lucide-icon name=\"copy\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <button type=\"button\" (click)=\"deleteNode()\" class=\"p-1.5 hover:bg-red-600 rounded transition-colors\" title=\"Delete\">\n <lucide-icon name=\"trash-2\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <div class=\"w-px h-4 bg-gray-700 mx-0.5\"></div>\n <span class=\"text-gray-400 uppercase font-semibold text-[10px] px-1.5\">Row</span>\n </div>\n \n <!-- Visual Label for Row when hovered (not selected) -->\n <div *ngIf=\"designMode && !isSelected\" class=\"absolute -top-3 left-0 bg-blue-500 text-white text-[10px] px-1 rounded rounded-b-none opacity-0 group-hover:opacity-100 transition-opacity z-10\">\n ROW\n </div>\n\n <app-layout-node *ngFor=\"let child of asRow(node).children; trackBy: trackById\" \n [node]=\"child\" \n [engine]=\"engine\"\n [fields]=\"fields\"\n [designMode]=\"designMode\"\n [device]=\"device\"\n [breakpoint]=\"breakpoint\"\n [connectedDropLists]=\"connectedDropLists\"\n (nodeDrop)=\"onNodeDrop($event)\"\n (nodeSelect)=\"onNodeSelect($event)\"\n class=\"contents\">\n </app-layout-node>\n <div *ngIf=\"designMode && isSelected\" \n class=\"absolute bottom-0 left-0 right-0 h-3 cursor-row-resize bg-transparent hover:bg-blue-400/20 transition-colors z-50 group-hover:bg-blue-100/30\"\n (mousedown)=\"onResizeStart($event, node)\"\n (click)=\"$event.stopPropagation()\">\n </div>\n </div>\n </ng-container>\n\n <!-- COL -->\n <ng-container *ngSwitchCase=\"'col'\">\n <div *ngIf=\"isNodeVisible(node)\"\n [class]=\"getColClasses(node)\"\n class=\"min-h-[50px] relative transition-all cursor-pointer border border-transparent hover:border-blue-200/50\"\n [class.bg-blue-50]=\"isResizing\"\n [style]=\"getStyle(node)\"\n (click)=\"onColumnClick($event)\"\n (contextmenu)=\"onColumnContextMenu($event)\"\n cdkDropList\n [cdkDropListData]=\"node\"\n [id]=\"node.id\"\n [cdkDropListConnectedTo]=\"connectedDropLists\"\n (cdkDropListDropped)=\"onDrop($event)\"\n [class.outline-dashed]=\"designMode\"\n [class.outline-1]=\"designMode\"\n [class.outline-gray-300]=\"designMode && !isSelected\"\n [class.ring-2]=\"designMode && isSelected\"\n [class.ring-blue-500]=\"designMode && isSelected\"\n [class.bg-blue-50]=\"designMode && isSelected && asCol(node).children.length === 0\">\n \n <!-- Floating Selection Toolbar for Column -->\n <div *ngIf=\"designMode && isSelected\" \n class=\"absolute -top-9 left-1/2 -translate-x-1/2 bg-gray-900 text-white rounded-lg shadow-xl flex items-center gap-0.5 px-1.5 py-1 text-xs z-50 whitespace-nowrap\"\n (click)=\"$event.stopPropagation()\">\n <button type=\"button\" (click)=\"moveNodeUp()\" class=\"p-1.5 hover:bg-gray-700 rounded transition-colors\" title=\"Move Up\">\n <lucide-icon name=\"chevron-up\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <button type=\"button\" (click)=\"moveNodeDown()\" class=\"p-1.5 hover:bg-gray-700 rounded transition-colors\" title=\"Move Down\">\n <lucide-icon name=\"chevron-down\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <div class=\"w-px h-4 bg-gray-700 mx-0.5\"></div>\n <button type=\"button\" (click)=\"duplicateNode()\" class=\"p-1.5 hover:bg-gray-700 rounded transition-colors\" title=\"Duplicate\">\n <lucide-icon name=\"copy\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <button type=\"button\" (click)=\"deleteNode()\" class=\"p-1.5 hover:bg-red-600 rounded transition-colors\" title=\"Delete\">\n <lucide-icon name=\"trash-2\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <div class=\"w-px h-4 bg-gray-700 mx-0.5\"></div>\n <!-- Column Specific Actions -->\n <button type=\"button\" (click)=\"insertRowInColumn()\" class=\"p-1.5 hover:bg-gray-700 rounded transition-colors\" title=\"Insert Nested Row\">\n <lucide-icon name=\"layout-list\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <div class=\"w-px h-4 bg-gray-700 mx-0.5\"></div>\n <span class=\"text-gray-400 uppercase font-semibold text-[10px] px-1.5\">Column</span>\n </div>\n \n <div *ngFor=\"let child of asCol(node).children; trackBy: trackById\"\n cdkDrag\n [cdkDragData]=\"child\"\n [cdkDragDisabled]=\"!designMode\"\n class=\"relative group\">\n\n <button *ngIf=\"designMode && isNodeSelected(child.id)\"\n type=\"button\"\n cdkDragHandle\n class=\"absolute -left-3 top-2 z-50 w-6 h-6 rounded-full bg-white border border-gray-200 shadow-sm flex items-center justify-center text-gray-400 hover:text-gray-600 transition-opacity\"\n aria-label=\"Drag item\">\n <lucide-icon name=\"grip-vertical\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n \n <app-layout-node [node]=\"child\" \n [engine]=\"engine\"\n [fields]=\"fields\"\n [designMode]=\"designMode\"\n [device]=\"device\"\n [breakpoint]=\"breakpoint\"\n [connectedDropLists]=\"connectedDropLists\"\n (nodeDrop)=\"nodeDrop.emit($event)\"\n (nodeSelect)=\"nodeSelect.emit($event)\">\n </app-layout-node>\n\n <!-- Preview -->\n <div *cdkDragPlaceholder class=\"min-h-[50px] bg-blue-50 border-2 border-blue-200 border-dashed mb-2 rounded\"></div>\n </div>\n \n <!-- Placeholder for empty col in designer -->\n <div *ngIf=\"asCol(node).children.length === 0 && designMode\" \n class=\"h-full w-full min-h-[4rem] flex flex-col items-center justify-center p-4 border-2 border-dashed border-gray-200 rounded-lg bg-gray-50/50 hover:bg-gray-100 hover:border-blue-300 transition-all text-gray-400 gap-2\">\n <lucide-icon name=\"plus\" class=\"w-5 h-5 opacity-50\"></lucide-icon>\n <span class=\"text-xs font-medium\">Drop Widget Here</span>\n </div>\n\n <!-- Resize Handle - z-50 to stay above widget overlays -->\n <!-- Width Resize (Right) - Only if not last column in row -->\n <div *ngIf=\"designMode && isSelected\"\n class=\"absolute top-0 bottom-2 right-0 w-3 cursor-col-resize bg-transparent hover:bg-blue-400/20 transition-colors z-50 group-hover:bg-blue-100/30\"\n (mousedown)=\"onColResizeStart($event, node)\"\n (click)=\"$event.stopPropagation()\">\n </div>\n </div>\n </ng-container>\n\n <!-- WIDGET -->\n <ng-container *ngSwitchCase=\"'widget'\">\n <div *ngIf=\"isNodeVisible(node)\"\n class=\"relative group w-full\" \n [style]=\"getStyle(node)\"\n (click)=\"onWidgetClick($event)\"\n (contextmenu)=\"onWidgetContextMenu($event)\"\n [class.ring-2]=\"designMode && isSelected\"\n [class.ring-blue-500]=\"designMode && isSelected\">\n \n <!-- Floating Selection Toolbar for Widget -->\n <div *ngIf=\"designMode && isSelected\" \n class=\"absolute -top-9 left-1/2 -translate-x-1/2 bg-gray-900 text-white rounded-lg shadow-xl flex items-center gap-0.5 px-1.5 py-1 text-xs z-50 whitespace-nowrap\"\n (click)=\"$event.stopPropagation()\">\n <button type=\"button\" (click)=\"moveNodeUp()\" class=\"p-1.5 hover:bg-gray-700 rounded transition-colors\" title=\"Move Up\">\n <lucide-icon name=\"chevron-up\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <button type=\"button\" (click)=\"moveNodeDown()\" class=\"p-1.5 hover:bg-gray-700 rounded transition-colors\" title=\"Move Down\">\n <lucide-icon name=\"chevron-down\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <div class=\"w-px h-4 bg-gray-700 mx-0.5\"></div>\n <button type=\"button\" (click)=\"duplicateNode()\" class=\"p-1.5 hover:bg-gray-700 rounded transition-colors\" title=\"Duplicate\">\n <lucide-icon name=\"copy\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <button type=\"button\" (click)=\"deleteNode()\" class=\"p-1.5 hover:bg-red-600 rounded transition-colors\" title=\"Delete\">\n <lucide-icon name=\"trash-2\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <div class=\"w-px h-4 bg-gray-700 mx-0.5\"></div>\n <!-- Widget Specific Actions -->\n <button type=\"button\" (click)=\"wrapWidgetInRow()\" class=\"p-1.5 hover:bg-gray-700 rounded transition-colors\" title=\"Wrap in Row\">\n <lucide-icon name=\"group\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <div class=\"w-px h-4 bg-gray-700 mx-0.5\"></div>\n <span class=\"text-gray-400 uppercase font-semibold text-[10px] px-1.5\">{{ getNodeTypeLabel() }}</span>\n </div>\n \n <ng-container #widgetContainer></ng-container>\n <div *ngIf=\"designMode && isRuleHidden(node)\"\n class=\"absolute inset-0 rounded-md bg-white/60 backdrop-blur-[1px] pointer-events-none\"\n aria-hidden=\"true\"></div>\n <div *ngIf=\"designMode && isRuleHidden(node)\"\n class=\"absolute top-2 right-2 rounded-full bg-gray-900/80 text-white text-[10px] px-2 py-0.5 tracking-wide uppercase pointer-events-none\"\n aria-hidden=\"true\">\n Hidden by rules\n </div>\n \n <!-- Overlay for selection in design mode - only show on unselected widgets to allow interaction with selected ones -->\n <div *ngIf=\"designMode && !isSelected\" class=\"absolute inset-0 cursor-pointer z-10 hover:bg-blue-500/5\" (click)=\"onWidgetClick($event)\"></div>\n <div *ngIf=\"designMode && isSelected\" \n class=\"absolute bottom-0 left-0 right-0 h-3 cursor-row-resize bg-transparent hover:bg-blue-400/20 transition-colors z-50 group-hover:bg-blue-100/30\"\n (mousedown)=\"onResizeStart($event, node)\"\n (click)=\"$event.stopPropagation()\">\n </div>\n </div>\n </ng-container>\n\n </ng-container>\n `\n})\nexport class LayoutNodeComponent implements OnInit, OnChanges, OnDestroy {\n @Input() node!: LayoutNode;\n @Input() engine!: FormEngine;\n @Input() fields: FieldSchema[] = [];\n @Input() designMode = false;\n @Input() device: 'desktop' | 'mobile' = 'desktop';\n @Input() breakpoint: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' = 'xl';\n\n @Output() nodeDrop = new EventEmitter<CdkDragDrop<any>>();\n @Output() nodeSelect = new EventEmitter<string>();\n\n @ViewChild('widgetContainer', { read: ViewContainerRef, static: false }) widgetContainer!: ViewContainerRef;\n\n @Input() connectedDropLists: string[] = [];\n\n private readonly allWidgetDefs: WidgetDefinition[];\n private widgetDefs: WidgetDefinition[];\n private widgetComponentRef?: ComponentRef<any>;\n private widgetDefId?: string;\n private widgetControl?: FormControl;\n private widgetControlName?: string;\n private designEngineProxy?: FormEngine;\n private designEngineSource?: FormEngine;\n\n private resizeStartX = 0;\n private resizeStartSpan = 0;\n private readonly destroyRef = inject(DestroyRef);\n\n constructor(\n @Inject(WIDGET_DEFINITIONS) private _widgetDefs: WidgetDefinition[][],\n private designerState: DesignerStateService,\n private cdr: ChangeDetectorRef,\n private el: ElementRef\n ) {\n this.allWidgetDefs = _widgetDefs.flat();\n this.widgetDefs = this.allWidgetDefs;\n }\n\n get isSelected() {\n return this.designerState.isNodeSelected(this.node.id);\n }\n\n protected isNodeSelected(nodeId: string): boolean {\n return this.designerState.isNodeSelected(nodeId);\n }\n\n onWidgetClick(e: Event) {\n if (!this.designMode) return;\n e.stopPropagation();\n this.designerState.closeContextMenu();\n if (e instanceof MouseEvent && (e.ctrlKey || e.metaKey || e.shiftKey)) {\n this.designerState.toggleNodeSelection(this.node.id);\n } else {\n this.nodeSelect.emit(this.node.id);\n }\n }\n\n onWidgetContextMenu(e: MouseEvent) {\n if (!this.designMode) return;\n e.preventDefault();\n e.stopPropagation();\n if (!this.designerState.isNodeSelected(this.node.id)) {\n this.nodeSelect.emit(this.node.id);\n }\n this.designerState.openContextMenu({ x: e.clientX, y: e.clientY });\n }\n\n onColumnClick(e: Event) {\n if (!this.designMode) return;\n e.stopPropagation();\n this.designerState.closeContextMenu();\n if (e instanceof MouseEvent && (e.ctrlKey || e.metaKey || e.shiftKey)) {\n this.designerState.toggleNodeSelection(this.node.id);\n } else {\n this.nodeSelect.emit(this.node.id);\n }\n }\n\n onRowClick(e: Event) {\n if (!this.designMode) return;\n e.stopPropagation();\n this.designerState.closeContextMenu();\n if (e instanceof MouseEvent && (e.ctrlKey || e.metaKey || e.shiftKey)) {\n this.designerState.toggleNodeSelection(this.node.id);\n } else {\n this.nodeSelect.emit(this.node.id);\n }\n }\n\n onRowContextMenu(e: MouseEvent) {\n if (!this.designMode) return;\n e.preventDefault();\n e.stopPropagation();\n if (!this.designerState.isNodeSelected(this.node.id)) {\n this.nodeSelect.emit(this.node.id);\n }\n this.designerState.openContextMenu({ x: e.clientX, y: e.clientY });\n }\n\n onColumnContextMenu(e: MouseEvent) {\n if (!this.designMode) return;\n e.preventDefault();\n e.stopPropagation();\n if (!this.designerState.isNodeSelected(this.node.id)) {\n this.nodeSelect.emit(this.node.id);\n }\n this.designerState.openContextMenu({ x: e.clientX, y: e.clientY });\n }\n\n onDrop(event: CdkDragDrop<any>) {\n if (this.designMode) {\n this.designerState.handleDrop(event, this.node.id);\n }\n }\n\n // Floating Toolbar Actions\n moveNodeUp() {\n this.designerState.moveNode(this.node.id, 'up');\n }\n\n moveNodeDown() {\n this.designerState.moveNode(this.node.id, 'down');\n }\n\n deleteNode() {\n this.designerState.deleteNode(this.node.id);\n }\n\n duplicateNode() {\n this.designerState.duplicateNode(this.node.id);\n }\n\n // Phase 5 Actions\n insertRowInColumn() {\n // Default to adding a single column row, maybe prompt user in future?\n this.designerState.insertRowInColumn(this.node.id, 1);\n }\n\n wrapWidgetInRow() {\n this.designerState.wrapWidgetInRow(this.node.id);\n }\n getNodeTypeLabel(): string {\n if (this.node.type === 'widget') {\n const widgetNode = this.node as WidgetNode;\n const field = this.engine?.getSchema()?.fields?.find(f => f.id === widgetNode.refId);\n return field?.type || 'Widget';\n }\n return this.node.type === 'row' ? 'Row' : 'Column';\n }\n\n // Resize Logic\n private resizeStartY = 0;\n private resizeStartHeight = 0;\n private resizingNode: LayoutNode | null = null;\n private resizingCol: ColumnNode | null = null; // New for Col Resize\n\n private resizeMoveListener!: (e: MouseEvent) => void;\n private resizeUpListener!: (e: MouseEvent) => void;\n\n get isResizing() {\n return this.resizingNode === this.node;\n }\n\n ngOnInit() {\n this.updateWidgetDefinitions();\n if (this.node.type === 'widget') {\n // Initial render\n setTimeout(() => this.renderWidget(true), 0);\n }\n\n // Subscribe to engine changes to trigger CD for rules (visibility/validation)\n if (this.engine?.valueChanges$) {\n this.engine.valueChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.cdr.markForCheck();\n });\n }\n\n // Global listeners (bind once)\n this.resizeMoveListener = this.onResizeMove.bind(this);\n this.resizeUpListener = this.onResizeEnd.bind(this);\n }\n\n ngOnDestroy() {\n // Cleanup global listeners if any are active (safety)\n document.removeEventListener('mousemove', this.resizeMoveListener);\n document.removeEventListener('mouseup', this.resizeUpListener);\n this.widgetComponentRef?.destroy();\n this.widgetComponentRef = undefined;\n }\n\n // Height Resize\n onResizeStart(e: MouseEvent, node: LayoutNode) {\n if (!this.designMode) return;\n e.preventDefault();\n e.stopPropagation();\n\n this.resizingNode = node;\n this.resizeStartY = e.clientY;\n\n const currentHeight = parseInt(node.style?.minHeight || '0', 10);\n this.resizeStartHeight = isNaN(currentHeight) ? 50 : currentHeight;\n\n document.addEventListener('mousemove', this.resizeMoveListener);\n document.addEventListener('mouseup', this.resizeUpListener);\n\n this.designerState.selectNode(node.id);\n }\n\n // Column Width Resize\n onColResizeStart(e: MouseEvent, node: LayoutNode) {\n if (!this.designMode || node.type !== 'col') return;\n e.preventDefault();\n e.stopPropagation();\n\n this.resizingCol = node as ColumnNode;\n this.resizeStartX = e.clientX;\n\n // Get current span \n // We assume xs for now or active device logic could be added\n // Use effective span for current breakpoint for consistency\n const activeSpan = this.getEffectiveSpan(this.resizingCol.responsive || { xs: 12 });\n this.resizeStartSpan = activeSpan;\n\n document.addEventListener('mousemove', this.resizeMoveListener);\n document.addEventListener('mouseup', this.resizeUpListener);\n\n this.designerState.selectNode(node.id);\n }\n\n onResizeMove(e: MouseEvent) {\n // Handle Height Resize\n if (this.resizingNode) {\n const delta = e.clientY - this.resizeStartY;\n const newHeight = Math.max(50, this.resizeStartHeight + delta);\n\n if (!this.resizingNode.style) this.resizingNode.style = {};\n this.resizingNode.style.minHeight = `${newHeight}px`;\n this.cdr.detectChanges();\n return;\n }\n\n // Handle Column Resize\n if (this.resizingCol) {\n const deltaX = e.clientX - this.resizeStartX;\n\n // Calculate grid jump\n const currentPixelWidth = this.el.nativeElement.firstElementChild?.getBoundingClientRect().width || 100; // The switch div\n const oneSpanInHighlight = currentPixelWidth / this.resizeStartSpan; // pixels per 1/12\n\n // Prevent division by zero and weird states\n if (oneSpanInHighlight <= 0) return;\n\n const spanDelta = Math.round(deltaX / oneSpanInHighlight);\n let newSpan = this.resizeStartSpan + spanDelta;\n\n // Clamp 1-12\n newSpan = Math.max(1, Math.min(12, newSpan));\n\n if (!this.resizingCol.responsive) {\n this.resizingCol.responsive = { xs: 12 };\n }\n\n // Update result for CURRENT breakpoint\n // If current breakpoint is not explicitly in responsive object, we should initialize it?\n // Or updating 'xs' as fallback?\n // Strategy: Update the specific breakpoint Key we are viewing.\n const bp = this.breakpoint;\n (this.resizingCol.responsive as any)[bp] = newSpan;\n\n this.cdr.detectChanges();\n }\n }\n\n onResizeEnd() {\n this.resizingNode = null;\n this.resizingCol = null;\n document.removeEventListener('mousemove', this.resizeMoveListener);\n document.removeEventListener('mouseup', this.resizeUpListener);\n }\n\n onNodeDrop(event: CdkDragDrop<any>) {\n this.nodeDrop.emit(event);\n }\n\n onNodeSelect(id: string) {\n this.nodeSelect.emit(id);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['engine'] && this.engine) {\n this.updateWidgetDefinitions();\n }\n // Only re-render widget if node identity changes (refId)\n // Style changes are handled by template bindings, no re-render needed\n if (this.node.type === 'widget') {\n const nodeChange = changes['node'];\n const engineChange = changes['engine'];\n const fieldsChange = changes['fields'];\n const designModeChange = changes['designMode'];\n let shouldUpdate = false;\n let forceRecreate = false;\n\n if (nodeChange && !nodeChange.firstChange) {\n const prevNode = nodeChange.previousValue as WidgetNode;\n const currNode = nodeChange.currentValue as WidgetNode;\n\n // Only re-render if widget identity changed (different field)\n if (prevNode?.refId !== currNode?.refId) {\n shouldUpdate = true;\n forceRecreate = true;\n }\n // Otherwise, style changes are handled by template [style] binding\n }\n\n if (fieldsChange && !fieldsChange.firstChange) {\n // Fields array changed (field added/removed/updated)\n // Check if *our* field has changed by reference\n const widgetNode = this.node as WidgetNode;\n if (widgetNode.refId) {\n const prevFields = fieldsChange.previousValue as FieldSchema[];\n const currFields = fieldsChange.currentValue as FieldSchema[];\n\n const prevField = prevFields?.find(f => f.id === widgetNode.refId);\n const currField = currFields?.find(f => f.id === widgetNode.refId);\n\n // If reference changed, re-render to pick up new label/props\n if (prevField !== currField) {\n const prevDef = this.resolveWidgetDefinition(widgetNode, prevField);\n const currDef = this.resolveWidgetDefinition(widgetNode, currField);\n shouldUpdate = true;\n forceRecreate = forceRecreate || prevDef?.id !== currDef?.id;\n }\n }\n }\n\n if (engineChange && !engineChange.firstChange) {\n // Engine changed - need to re-render to bind to new engine\n shouldUpdate = true;\n }\n\n if (designModeChange && !designModeChange.firstChange) {\n // Swap engine proxy for design mode visibility overrides\n shouldUpdate = true;\n }\n\n if (shouldUpdate) {\n this.renderWidget(forceRecreate);\n }\n }\n }\n\n renderWidget(forceRecreate: boolean = false) {\n if (!this.widgetContainer) return;\n\n const widgetNode = this.node as WidgetNode;\n const field = widgetNode.refId ? this.engine?.getSchema()?.fields?.find(f => f.id === widgetNode.refId) : undefined;\n const config = field ?? {};\n const def = this.resolveWidgetDefinition(widgetNode, field);\n\n if (!def) {\n if (this.widgetComponentRef) {\n this.widgetContainer.clear();\n this.widgetComponentRef = undefined;\n this.widgetDefId = undefined;\n this.widgetControl = undefined;\n this.widgetControlName = undefined;\n }\n console.warn('No widget definition found for', widgetNode);\n return;\n }\n\n const shouldRecreate = forceRecreate || !this.widgetComponentRef || this.widgetDefId !== def.id;\n if (shouldRecreate) {\n this.widgetContainer.clear();\n const injector = this.createWidgetInjector(widgetNode);\n this.widgetComponentRef = this.widgetContainer.createComponent(def.renderer, { injector });\n this.widgetDefId = def.id;\n this.widgetControl = undefined;\n this.widgetControlName = undefined;\n }\n\n if (!this.widgetComponentRef) return;\n\n this.widgetComponentRef.setInput('config', config);\n this.widgetComponentRef.setInput('engine', this.getEngineForRender());\n\n const control = this.getWidgetControl(field);\n if (control) {\n this.widgetComponentRef.setInput('control', control);\n }\n\n this.widgetComponentRef.changeDetectorRef.markForCheck();\n }\n\n private updateWidgetDefinitions() {\n const flavor = this.engine?.getSchema()?.flavor ?? this.designerState.activeFlavor();\n this.widgetDefs = this.allWidgetDefs.filter(def => !def.flavor || def.flavor === flavor);\n }\n\n private resolveWidgetDefinition(widgetNode: WidgetNode, field?: FieldSchema): WidgetDefinition | undefined {\n if (field?.widgetId) {\n const byId = this.widgetDefs.find(d => d.id === field.widgetId);\n if (byId) return byId;\n }\n\n const fallbackType = field ? field.type : widgetNode.widgetKind === 'field' ? 'text' : widgetNode.widgetKind;\n return this.widgetDefs.find(d => d.type === fallbackType && d.kind === widgetNode.widgetKind);\n }\n\n private createWidgetInjector(widgetNode: WidgetNode): Injector {\n const context: WidgetEditorContext = {\n isDesignMode: () => this.designMode,\n isSelected: () => this.designMode && this.designerState.selectedNodeId() === widgetNode.id,\n updateField: (fieldId, updates) => {\n if (!this.designMode) return;\n this.designerState.updateField(fieldId, updates);\n }\n };\n\n return Injector.create({\n providers: [{ provide: WIDGET_EDITOR_CONTEXT, useValue: context }],\n parent: this.widgetContainer.injector\n });\n }\n\n private getWidgetControl(field?: FieldSchema): FormControl | undefined {\n if (!field?.name || !this.engine) return undefined;\n\n if (!this.widgetControl || this.widgetControlName !== field.name) {\n this.widgetControlName = field.name;\n this.widgetControl = new FormControl(this.engine.getValue(field.name));\n return this.widgetControl;\n }\n\n const currentValue = this.engine.getValue(field.name);\n if (this.widgetControl.value !== currentValue) {\n this.widgetControl.setValue(currentValue, { emitEvent: false });\n }\n\n return this.widgetControl;\n }\n\n /** TrackBy function for *ngFor to prevent unnecessary component destruction */\n trackById(index: number, node: LayoutNode): string {\n return node.id;\n }\n\n asRow(node: LayoutNode): RowNode { return node as RowNode; }\n asCol(node: LayoutNode): ColumnNode { return node as ColumnNode; }\n\n getColClasses(node: LayoutNode): string {\n if (node.type !== 'col') return '';\n\n const col = node as any;\n const responsive: ResponsiveSpan = col.responsive || { xs: 12 };\n\n // Resolve effective span for current simulation breakpoint\n const span = this.getEffectiveSpan(responsive);\n\n const classes = [];\n // Apply static width class for simulation. \n // We skip responsive prefixes (md:) because the simulation is fixed width.\n classes.push(this.getSpanClass('w', span));\n\n return classes.join(' ');\n }\n\n private getEffectiveSpan(responsive: ResponsiveSpan): number {\n // Hierarchy of breakpoints\n const bps = ['xs', 'sm', 'md', 'lg', 'xl', '2xl'];\n\n const currentIdx = bps.indexOf(this.breakpoint);\n if (currentIdx === -1) return responsive.xs || 12;\n\n // Iterate from current breakpoint down to xs to find first defined span\n for (let i = currentIdx; i >= 0; i--) {\n const bpKey = bps[i] as keyof ResponsiveSpan;\n if (responsive[bpKey] !== undefined) {\n return responsive[bpKey]!;\n }\n }\n\n return 12; // Fallback\n }\n\n private getSpanClass(prefix: string, span: number): string {\n if (span === 12) return 'w-full';\n\n const map: { [key: number]: string } = {\n 1: 'w-1/12',\n 2: 'w-2/12',\n 3: 'w-3/12',\n 4: 'w-4/12',\n 5: 'w-5/12',\n 6: 'w-6/12',\n 7: 'w-7/12',\n 8: 'w-8/12',\n 9: 'w-9/12',\n 10: 'w-10/12',\n 11: 'w-11/12'\n };\n\n return map[span] || 'w-full';\n }\n\n getStyle(node: LayoutNode) {\n if (!('style' in node) || !node.style) return {};\n\n // normalizeStyle now handles:\n // 1. Spacing tokens (xs, sm... -> rem)\n // 2. Numbers -> px\n // 3. Numeric strings -> px\n const normalized = normalizeStyle(node.style);\n\n // Defaults for layout nodes\n if (!normalized['width']) normalized['width'] = '100%';\n if (!normalized['height']) normalized['height'] = 'auto';\n\n return normalized;\n }\n\n private getEngineForRender(): FormEngine | undefined {\n if (!this.engine) return undefined;\n if (!this.designMode) return this.engine;\n\n if (this.designEngineProxy && this.designEngineSource === this.engine) {\n return this.designEngineProxy;\n }\n\n const proxy = Object.create(this.engine) as FormEngine;\n proxy.isFieldVisible = () => true;\n this.designEngineProxy = proxy;\n this.designEngineSource = this.engine;\n return proxy;\n }\n\n isNodeVisible(node: LayoutNode): boolean {\n if (this.designMode) return true;\n\n if (node.type === 'widget') {\n const widget = node as WidgetNode;\n if (!widget.refId || !this.engine) return true;\n const field = this.fields.find(f => f.id === widget.refId);\n if (!field) return true;\n return this.engine.isFieldVisible(field.id);\n }\n\n const children = node.type === 'row' ? this.asRow(node).children : this.asCol(node).children;\n if (!children || children.length === 0) return false;\n\n return children.some(child => this.isNodeVisible(child));\n }\n\n isRuleHidden(node: LayoutNode): boolean {\n if (!this.designMode || node.type !== 'widget') return false;\n if (!this.engine) return false;\n\n const widget = node as WidgetNode;\n const field = widget.refId ? this.fields.find(f => f.id === widget.refId) : undefined;\n if (!field) return false;\n\n return !this.engine.isFieldVisible(field.id);\n }\n}\n","\nimport { Subscription } from 'rxjs';\nimport { FormEngine, UiEvent } from './form-engine';\nimport { WidgetEventActionSetValue } from './models';\n\nexport interface FormEventLogger {\n log(message: string, data?: unknown): void;\n warn(message: string, data?: unknown): void;\n}\n\nconst NOOP_LOGGER: FormEventLogger = {\n log: () => undefined,\n warn: () => undefined\n};\n\nexport class FormEventRunner {\n private sub: Subscription;\n private processingDepth = 0;\n\n constructor(private engine: FormEngine, private logger: FormEventLogger = NOOP_LOGGER) {\n this.sub = this.engine.events$.subscribe(evt => this.handleEvent(evt));\n }\n\n dispose() {\n this.sub.unsubscribe();\n }\n\n private handleEvent(evt: UiEvent) {\n // Prevent infinite loops (simple guard)\n this.processingDepth++;\n if (this.processingDepth > 25) {\n this.logger.warn('Runaway event loop detected. Aborting.', { event: evt });\n this.processingDepth--;\n return;\n }\n\n try {\n const schema = this.engine.getSchema();\n const field = schema.fields.find(f => f.id === evt.fieldId);\n if (!field || !field.events) return;\n\n const bindings = field.events.filter(b => b.on === evt.type && b.enabled !== false);\n\n for (const binding of bindings) {\n for (const action of binding.actions) {\n if (action.type === 'log') {\n this.logger.log(action.message || 'Event fired', { event: evt });\n } else if (action.type === 'setValue') {\n this.handleSetValue(action, evt, schema.fields);\n }\n }\n }\n } finally {\n this.processingDepth--;\n }\n }\n\n private handleSetValue(action: WidgetEventActionSetValue, evt: UiEvent, fields: any[]) {\n const target = fields.find(f => f.id === action.targetFieldId);\n if (!target) return;\n\n let val: any;\n\n if (action.valueFrom === 'literal') {\n val = action.valueLiteral;\n } else if (action.valueFrom === 'event') {\n val = evt.value;\n } else if (action.valueFrom === 'field' && action.sourceFieldId) {\n const source = fields.find(f => f.id === action.sourceFieldId);\n if (source) {\n val = this.engine.getValue(source.name);\n }\n }\n\n this.engine.setValue(target.name, val);\n }\n}\n","import { Injectable, InjectionToken } from '@angular/core';\nimport { UploadedFileRef } from '../form-core/models';\n\nexport interface FileUploadRequest {\n endpoint: string;\n fieldId: string;\n fieldName: string;\n fieldKey?: string;\n headers?: Record<string, string>;\n}\n\nexport interface FileUploadClient {\n upload(files: File[], request: FileUploadRequest): Promise<UploadedFileRef[]>;\n}\n\nexport const FILE_UPLOAD_CLIENT = new InjectionToken<FileUploadClient>('FILE_UPLOAD_CLIENT');\n\n@Injectable({ providedIn: 'root' })\nexport class DefaultFileUploadClient implements FileUploadClient {\n async upload(files: File[], request: FileUploadRequest): Promise<UploadedFileRef[]> {\n if (!files.length) return [];\n\n const formData = new FormData();\n const fieldKey = request.fieldKey || 'file';\n\n files.forEach(file => formData.append(fieldKey, file));\n formData.append('fieldId', request.fieldId);\n formData.append('fieldName', request.fieldName);\n\n const response = await fetch(request.endpoint, {\n method: 'POST',\n body: formData,\n headers: request.headers\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed (${response.status})`);\n }\n\n const payload: unknown = await response.json();\n return normalizeUploadPayload(payload, files);\n }\n}\n\nfunction normalizeUploadPayload(payload: unknown, files: File[]): UploadedFileRef[] {\n if (Array.isArray(payload)) {\n return payload.map((item, index) => normalizeUploadedFile(item, files[index] ?? files[0]));\n }\n\n if (isRecord(payload)) {\n const nested = payload['files'];\n if (Array.isArray(nested)) {\n return nested.map((item, index) => normalizeUploadedFile(item, files[index] ?? files[0]));\n }\n return [normalizeUploadedFile(payload, files[0])];\n }\n\n return files.map(file => ({\n id: file.name,\n name: file.name,\n size: file.size,\n type: file.type\n }));\n}\n\nfunction normalizeUploadedFile(value: unknown, fallback: File): UploadedFileRef {\n if (!isRecord(value)) {\n return {\n id: fallback.name,\n name: fallback.name,\n size: fallback.size,\n type: fallback.type\n };\n }\n\n const id = readString(value['id']) || readString(value['fileId']) || fallback.name;\n return {\n id,\n name: readString(value['name']) || fallback.name,\n size: readNumber(value['size']) ?? fallback.size,\n type: readString(value['type']) || fallback.type,\n url: readString(value['url']) || readString(value['href'])\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, Output, EventEmitter, OnDestroy, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormSchema, UploadedFileRef } from '../form-core/models';\nimport { FormEngine, createFormEngine } from '../form-core/form-engine';\nimport { LayoutNodeComponent } from './layout-node.component';\nimport { DesignerStateService } from '../form-designer/designer-state.service';\nimport { FormEventRunner } from '../form-core/form-event-runner';\nimport { checkSchemaForApiOnlySources } from '../form-core/schema-guard';\nimport { DefaultFileUploadClient, FILE_UPLOAD_CLIENT, FileUploadClient } from '../data/file-upload-client';\n\nconst DEFAULT_UPLOAD_ENDPOINT = '/api/uploads';\n\nexport type GroupedFormValues = Record<string, Record<string, unknown>>;\nexport type CombinedFormValues = Record<string, unknown>;\n\nexport interface FormSubmitResult {\n values: Record<string, unknown>;\n groupedValues?: GroupedFormValues;\n combinedValues?: CombinedFormValues;\n uploadedFiles: Record<string, UploadedFileRef[]>;\n}\n\n@Component({\n selector: 'app-json-form-renderer',\n standalone: true,\n imports: [CommonModule, LayoutNodeComponent],\n template: `\n <div class=\"form-renderer-container\"\n [class.is-mobile]=\"device === 'mobile'\"\n [class.is-design]=\"mode === 'design'\">\n <ng-container *ngIf=\"engine; else loading\">\n <form (submit)=\"onSubmit($event)\">\n <app-layout-node *ngIf=\"schema?.layout\" \n [node]=\"schema.layout\" \n [engine]=\"engine\"\n [fields]=\"schema.fields\"\n [designMode]=\"mode === 'design'\"\n [device]=\"device\"\n [breakpoint]=\"breakpoint\"\n (nodeSelect)=\"onNodeSelect($event)\">\n </app-layout-node>\n </form>\n </ng-container>\n <ng-template #loading>Loading form...</ng-template>\n </div>\n `,\n styles: [`\n .form-renderer-container {\n width: 100%;\n height: 100%;\n overflow-y: auto;\n }\n .form-renderer-container.is-design {\n padding-top: 2.25rem;\n height: auto;\n overflow: visible;\n }\n `]\n})\nexport class JsonFormRendererComponent implements OnInit, OnChanges, OnDestroy {\n @Input() schema!: FormSchema;\n @Input() initialValues: Record<string, any> = {};\n @Input() mode: 'live' | 'preview' | 'design' = 'live';\n @Input() device: 'desktop' | 'mobile' = 'desktop';\n @Input() breakpoint: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' = 'xl';\n @Input() eventLogger?: { log: (message: string, data?: unknown) => void; warn: (message: string, data?: unknown) => void; };\n @Input() uploadOnSubmit = true;\n\n @Output() valueChange = new EventEmitter<any>();\n @Output() groupedValueChange = new EventEmitter<GroupedFormValues>();\n @Output() combinedValueChange = new EventEmitter<CombinedFormValues>();\n @Output() formSubmit = new EventEmitter<FormSubmitResult>();\n\n engine!: FormEngine;\n private runner?: FormEventRunner;\n private readonly uploadClient: FileUploadClient = inject(FILE_UPLOAD_CLIENT, { optional: true }) ?? inject(DefaultFileUploadClient);\n\n constructor(private designerState: DesignerStateService) { }\n\n ngOnInit() {\n this.createEngine();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['schema'] && !changes['schema'].firstChange) {\n // Reuse engine if ID matches to prevent full reload\n if (this.engine && this.schema.id === this.engine.getSchema().id) {\n this.engine.updateSchema(this.schema);\n } else {\n this.createEngine();\n }\n }\n }\n\n ngOnDestroy() {\n this.disposeRunner();\n }\n\n\n\n private createEngine() {\n this.disposeRunner();\n\n if (this.schema) {\n // Dev-only guardrail check (Live/Preview modes)\n if (this.mode === 'live' || this.mode === 'preview') {\n const issues = checkSchemaForApiOnlySources(this.schema);\n if (issues.length > 0) {\n console.warn('[ngx-form-designer] API-Only Architecture Warnings:', issues);\n }\n }\n\n this.engine = createFormEngine(this.schema, this.initialValues);\n\n // Create event runner if not in design mode\n if (this.mode !== 'design') {\n this.runner = new FormEventRunner(this.engine, this.eventLogger);\n }\n\n // Subscribe to value changes\n this.engine.formGroup.valueChanges.subscribe(value => {\n const groupedValues = this.buildGroupedValues(value);\n const combinedValues = this.buildCombinedValues(value);\n this.valueChange.emit(value);\n this.groupedValueChange.emit(groupedValues);\n this.combinedValueChange.emit(combinedValues);\n });\n\n // Initial emit\n const initialValues = this.engine.formGroup.value;\n this.valueChange.emit(initialValues);\n this.groupedValueChange.emit(this.buildGroupedValues(initialValues));\n this.combinedValueChange.emit(this.buildCombinedValues(initialValues));\n }\n }\n\n private disposeRunner() {\n if (this.runner) {\n this.runner.dispose();\n this.runner = undefined;\n }\n }\n\n onNodeSelect(nodeId: string) {\n if (this.mode === 'design') {\n this.designerState.selectNode(nodeId);\n }\n }\n\n async onSubmit(event: Event) {\n event.preventDefault();\n if (this.mode === 'design') return;\n\n // Notify all widgets to show errors if any\n this.engine?.submit();\n\n const uploadedFiles = this.uploadOnSubmit ? await this.uploadPendingFiles() : {};\n const values = this.engine?.getValues() ?? {};\n this.formSubmit.emit({\n values,\n groupedValues: this.buildGroupedValues(values),\n combinedValues: this.buildCombinedValues(values),\n uploadedFiles: uploadedFiles\n });\n }\n\n private async uploadPendingFiles(): Promise<Record<string, UploadedFileRef[]>> {\n if (!this.engine) return {};\n\n const uploaded: Record<string, UploadedFileRef[]> = {};\n const schema = this.engine.getSchema();\n\n for (const field of schema.fields) {\n if (field.type !== 'file') continue;\n\n const pendingFiles = this.getPendingFiles(this.engine.getValue(field.name));\n if (pendingFiles.length === 0) continue;\n\n const endpoint = field.uploadUrl?.trim() || DEFAULT_UPLOAD_ENDPOINT;\n\n try {\n const refs = await this.uploadClient.upload(pendingFiles, {\n endpoint,\n fieldId: field.id,\n fieldName: field.name,\n fieldKey: field.uploadFieldName || undefined\n });\n\n if (refs.length > 0) {\n const storedValue = field.multiple ? refs : (refs[0] ?? null);\n field.defaultValue = storedValue;\n this.engine.setValue(field.name, storedValue);\n uploaded[field.id] = refs;\n }\n } catch (error) {\n console.warn('[ngx-form-designer] File upload failed', { fieldId: field.id, error });\n }\n }\n\n return uploaded;\n }\n\n private getPendingFiles(value: unknown): File[] {\n if (this.isFile(value)) return [value];\n if (Array.isArray(value) && value.every(entry => this.isFile(entry))) {\n return value as File[];\n }\n if (this.isFileList(value)) {\n return Array.from(value);\n }\n return [];\n }\n\n private isFile(value: unknown): value is File {\n return typeof File !== 'undefined' && value instanceof File;\n }\n\n private isFileList(value: unknown): value is FileList {\n return typeof FileList !== 'undefined' && value instanceof FileList;\n }\n\n private buildGroupedValues(values: Record<string, unknown>): GroupedFormValues {\n const grouped: GroupedFormValues = {};\n const schema = this.engine?.getSchema();\n if (!schema) return grouped;\n\n for (const field of schema.fields) {\n const groupKey = field.groupKey?.trim();\n if (!groupKey) continue;\n\n if (!grouped[groupKey]) {\n grouped[groupKey] = {};\n }\n grouped[groupKey][field.name] = values[field.name];\n }\n\n return grouped;\n }\n\n private buildCombinedValues(values: Record<string, unknown>): CombinedFormValues {\n const schema = this.engine?.getSchema();\n if (!schema) return values;\n\n const combined: CombinedFormValues = { ...values };\n\n for (const field of schema.fields) {\n const groupKey = field.groupKey?.trim();\n if (!groupKey) continue;\n\n const currentGroup = combined[groupKey];\n const groupValues = this.isGroupValue(currentGroup) ? currentGroup : {};\n groupValues[field.name] = values[field.name];\n combined[groupKey] = groupValues;\n delete combined[field.name];\n }\n\n return combined;\n }\n\n private isGroupValue(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n}\n","import { Component, Input, ViewContainerRef, ViewChild, inject, effect, Inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormSchema, LayoutNode, WidgetNode, RowNode, ColumnNode } from '../form-core/models';\nimport { FormEngine } from '../form-core/form-engine';\nimport { WIDGET_DEFINITIONS, WidgetDefinition } from '../widgets/widget-definition';\n\n@Component({\n selector: 'app-email-renderer',\n standalone: true,\n imports: [CommonModule],\n template: `\n <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"max-width: 600px; margin: 0 auto; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\">\n <ng-container *ngFor=\"let node of layoutNodes\">\n <tr>\n <td style=\"padding: 8px 0;\">\n <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\">\n <tr>\n <ng-container *ngFor=\"let col of getColumns(node)\">\n <td [style.width.%]=\"getColumnWidth(col, getColumns(node).length)\" style=\"padding: 0 8px; vertical-align: top;\">\n <ng-container *ngFor=\"let child of col.children\">\n <ng-container *ngIf=\"isWidgetNode(child)\">\n <div [id]=\"'widget-' + child.id\"></div>\n </ng-container>\n </ng-container>\n </td>\n </ng-container>\n </tr>\n </table>\n </td>\n </tr>\n </ng-container>\n </table>\n `,\n styles: []\n})\nexport class EmailRendererComponent {\n @Input({ required: true }) schema!: FormSchema;\n @Input() engine?: FormEngine;\n\n private widgetDefs: WidgetDefinition[];\n\n constructor(@Inject(WIDGET_DEFINITIONS) _widgetDefs: WidgetDefinition[][]) {\n this.widgetDefs = _widgetDefs.flat();\n\n effect(() => {\n if (this.schema) {\n // Re-render widgets when schema changes\n setTimeout(() => this.renderWidgets(), 0);\n }\n });\n }\n\n isRowNode(node: LayoutNode): node is RowNode {\n return node.type === 'row';\n }\n\n isWidgetNode(node: LayoutNode): node is WidgetNode {\n return node.type === 'widget';\n }\n\n get layoutNodes(): RowNode[] {\n if (!this.schema?.layout) return [];\n const layouts = Array.isArray(this.schema.layout) ? this.schema.layout : [];\n return layouts.filter((node: LayoutNode) => this.isRowNode(node)) as RowNode[];\n }\n\n getColumns(node: RowNode): ColumnNode[] {\n return node.children || [];\n }\n\n getColumnWidth(col: ColumnNode, totalColumns: number): number {\n // Simple equal width distribution for now\n // In a more advanced version, use col.responsive?.xs or similar\n return 100 / totalColumns;\n }\n\n private renderWidgets() {\n if (!this.schema?.layout) return;\n\n for (const row of this.layoutNodes) {\n for (const col of row.children) {\n for (const child of col.children) {\n if (this.isWidgetNode(child)) {\n this.renderWidget(child);\n }\n }\n }\n }\n }\n\n private renderWidget(node: WidgetNode) {\n const field = this.schema.fields.find(f => f.id === node.refId);\n if (!field) return;\n\n // Find widget definition\n let def: WidgetDefinition | undefined;\n if (field.widgetId) {\n def = this.widgetDefs.find(w => w.id === field.widgetId);\n } else {\n def = this.widgetDefs.find(w =>\n w.kind === node.widgetKind &&\n w.type === field.type &&\n (!w.flavor || w.flavor === 'email')\n );\n }\n\n if (!def || !def.renderer) return;\n\n // Find the container in the DOM\n const container = document.getElementById(`widget-${node.id}`);\n if (!container) return;\n\n // Create the component dynamically\n // Note: This is a simplified approach. In production, you'd use ViewContainerRef\n // from @ViewChild for proper Angular component lifecycle management\n const componentHtml = this.renderWidgetToHtml(def, field);\n container.innerHTML = componentHtml;\n }\n\n private renderWidgetToHtml(def: WidgetDefinition, config: any): string {\n // Simple HTML generation for email-safe components\n // This is a fallback - ideally we'd use ViewContainerRef\n\n if (config.type === 'email-heading') {\n const level = config.level || 'h2';\n const text = config.text || config.label || '';\n const styles = this.getHeadingStyles(level);\n return `<${level} style=\"${styles}\">${text}</${level}>`;\n }\n\n if (config.type === 'email-text') {\n const text = config.text || '';\n const isMuted = config.muted === true;\n const color = isMuted ? '#6b7280' : '#374151';\n return `<p style=\"font-size: 14px; line-height: 1.6; margin: 0 0 12px 0; color: ${color}; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\">${text}</p>`;\n }\n\n if (config.type === 'email-button') {\n const label = config.label || 'Click Here';\n const href = config.href || '#';\n const isPrimary = config.variant === 'primary';\n const bgColor = isPrimary ? '#2563eb' : '#ffffff';\n const textColor = isPrimary ? '#ffffff' : '#2563eb';\n const border = isPrimary ? 'none' : '2px solid #2563eb';\n\n return `\n <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n <tr>\n <td style=\"border-radius: 6px; background-color: ${bgColor};\">\n <a href=\"${href}\" style=\"display: inline-block; padding: 12px 24px; font-size: 14px; font-weight: 600; line-height: 1.5; text-decoration: none; border-radius: 6px; color: ${textColor}; background-color: ${bgColor}; border: ${border}; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\">${label}</a>\n </td>\n </tr>\n </table>\n `;\n }\n\n return '';\n }\n\n private getHeadingStyles(level: string): string {\n const styles = {\n h1: 'font-size: 32px; font-weight: 700; line-height: 1.2; margin: 0 0 16px 0; color: #1a1a1a;',\n h2: 'font-size: 24px; font-weight: 600; line-height: 1.3; margin: 0 0 12px 0; color: #1a1a1a;',\n h3: 'font-size: 18px; font-weight: 600; line-height: 1.4; margin: 0 0 8px 0; color: #1a1a1a;'\n };\n const baseStyles = 'font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;';\n return (styles[level as keyof typeof styles] || styles.h2) + baseStyles;\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormSchema, LayoutNode, RowNode, ColumnNode, WidgetNode } from '../../form-core/models';\nimport { DesignerStateService } from '../designer-state.service';\nimport { UiIconModule } from '../../ui/ui-icon.module';\n\n@Component({\n selector: 'app-layer-tree-node',\n standalone: true,\n imports: [CommonModule, UiIconModule],\n template: `\n <div class=\"pl-4 border-l border-gray-100 ml-2\">\n <div \n class=\"flex items-center gap-2 py-1 px-2 rounded cursor-pointer text-xs select-none transition-colors group\"\n [class.bg-blue-100]=\"isSelected\"\n [class.text-blue-700]=\"isSelected\"\n [class.hover:bg-gray-100]=\"!isSelected\"\n (click)=\"selectNode($event)\">\n \n <!-- Type Icon -->\n <lucide-icon [name]=\"getIcon()\" class=\"w-3.5 h-3.5 opacity-60\"></lucide-icon>\n \n <!-- Label -->\n <span class=\"truncate flex-1 font-medium\">{{ getLabel() }}</span>\n \n <!-- ID (Low contrast) -->\n <span class=\"text-[10px] text-gray-400 opacity-0 group-hover:opacity-100 transition-opacity\">#{{ shrinkId(node.id) }}</span>\n </div>\n\n <!-- Children -->\n <div *ngIf=\"hasChildren()\">\n <app-layer-tree-node \n *ngFor=\"let child of getChildren()\" \n [node]=\"child\" \n [schema]=\"schema\">\n </app-layer-tree-node>\n </div>\n </div>\n `\n})\nexport class LayerTreeNodeComponent {\n @Input() node!: LayoutNode;\n @Input() schema!: FormSchema;\n\n constructor(private designerState: DesignerStateService) { }\n\n get isSelected() {\n return this.designerState.selectedNodeId() === this.node.id;\n }\n\n selectNode(e: Event) {\n e.stopPropagation();\n this.designerState.selectNode(this.node.id);\n }\n\n getIcon(): string {\n if (this.node.type === 'row') return 'layout-list';\n if (this.node.type === 'col') return 'columns-2';\n if (this.node.type === 'widget') return 'box';\n return 'circle';\n }\n\n getLabel(): string {\n if (this.node.type === 'row') return 'Row';\n if (this.node.type === 'col') {\n const span = (this.node as ColumnNode).responsive?.xs || 12;\n return `Column (${span}/12)`;\n }\n if (this.node.type === 'widget') {\n const wNode = this.node as WidgetNode;\n const field = this.schema?.fields?.find(f => f.id === wNode.refId);\n return field?.label || field?.name || 'Widget';\n }\n return (this.node as any).type || 'Unknown';\n }\n\n hasChildren(): boolean {\n if (this.node.type === 'widget') return false;\n const children = (this.node as RowNode | ColumnNode).children;\n return !!children && children.length > 0;\n }\n\n getChildren(): LayoutNode[] {\n return (this.node as RowNode | ColumnNode).children || [];\n }\n\n shrinkId(id: string) {\n return id.split('-')[0];\n }\n}\n\n@Component({\n selector: 'app-layer-tree',\n standalone: true,\n imports: [CommonModule, LayerTreeNodeComponent],\n template: `\n <div class=\"h-full overflow-y-auto p-2\">\n <div *ngIf=\"!schema?.layout\" class=\"text-sm text-gray-400 text-center py-8\">\n No elements on canvas\n </div>\n \n <app-layer-tree-node \n *ngFor=\"let node of getRootNodes()\" \n [node]=\"node\" \n [schema]=\"schema\">\n </app-layer-tree-node>\n </div>\n `\n})\nexport class LayerTreeComponent {\n @Input() schema!: FormSchema;\n\n getRootNodes(): LayoutNode[] {\n return this.schema?.layout ? [this.schema.layout] : [];\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport type { DesignerFlavor, FieldSchema, RowNode } from '../form-core/models';\n\nexport interface DesignerSectionDraft {\n fields: FieldSchema[];\n layout: RowNode;\n}\n\nexport interface DesignerSectionDefinition {\n id: string;\n name: string;\n description: string;\n category?: string;\n tags?: string[];\n flavor?: DesignerFlavor;\n build: () => DesignerSectionDraft;\n}\n\nexport const DESIGNER_SECTIONS = new InjectionToken<DesignerSectionDefinition[]>('DESIGNER_SECTIONS');\n","import { Component, Inject, signal, computed, input, output, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../ui/ui-icon.module';\nimport { WIDGET_DEFINITIONS, WidgetDefinition } from '../widgets/widget-definition';\nimport { InternalDragData, DesignerStateService } from './designer-state.service';\nimport { LayerTreeComponent } from './layer-tree/layer-tree.component';\nimport { DESIGNER_SECTIONS, DesignerSectionDefinition } from '../plugins/section-definition';\n\ntype PaletteTab = 'pages' | 'sections' | 'widgets' | 'layers';\ntype SectionsView = 'library' | 'saved' | 'bricks';\n\ntype PalettePage = {\n id: string;\n name: string;\n route: string;\n};\n\ntype PaletteSavedSectionDefinition = {\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n};\n\ntype PaletteBrick = {\n id: string;\n name: string;\n runtime?: 'dom' | 'react';\n defaultProps?: Record<string, unknown>;\n};\n\n@Component({\n selector: 'app-field-palette',\n standalone: true,\n imports: [CommonModule, DragDropModule, FormsModule, UiIconModule, LayerTreeComponent],\n template: `\n <div class=\"flex flex-col h-full bg-white font-sans text-sm border-r border-gray-200\">\n\n <!-- Tabs (Top) -->\n <div class=\"flex items-center border-b border-gray-200 divide-x divide-gray-200\">\n <button *ngFor=\"let tab of tabOptions()\"\n (click)=\"activeTab.set(tab)\"\n class=\"flex-1 py-3 text-xs font-semibold uppercase tracking-wider text-center transition-colors border-b-2\"\n [class.text-blue-600]=\"currentTab() === tab\"\n [class.border-blue-600]=\"currentTab() === tab\"\n [class.text-gray-500]=\"currentTab() !== tab\"\n [class.border-transparent]=\"currentTab() !== tab\"\n [class.hover:bg-gray-50]=\"currentTab() !== tab\">\n {{ tabLabel(tab) }}\n </button>\n </div>\n\n <!-- Content Area -->\n <div class=\"flex-1 overflow-hidden flex flex-col\">\n <!-- Tab: Pages -->\n <ng-container *ngIf=\"currentTab() === 'pages'\">\n <div class=\"flex-1 overflow-hidden flex flex-col\">\n <div class=\"p-4 border-b border-gray-100 flex items-center justify-between\">\n <div>\n <div class=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">Pages</div>\n <div class=\"text-[11px] text-gray-400 mt-1\">Manage routes and titles.</div>\n </div>\n <button type=\"button\"\n class=\"p-1 text-gray-500 hover:text-gray-800\"\n (click)=\"pageAdd.emit()\"\n aria-label=\"Add page\">\n <lucide-icon name=\"plus\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n\n <div class=\"flex-1 overflow-auto p-3 space-y-2\">\n <ng-container *ngIf=\"pagesList().length; else emptyPages\">\n <div *ngFor=\"let page of pagesList()\"\n class=\"flex items-start gap-2\">\n <button type=\"button\"\n class=\"flex-1 text-left rounded-md border px-3 py-2 transition-colors\"\n [class.bg-blue-50]=\"page.id === activePageId()\"\n [class.border-blue-200]=\"page.id === activePageId()\"\n [class.border-gray-200]=\"page.id !== activePageId()\"\n [class.hover:bg-gray-50]=\"page.id !== activePageId()\"\n (click)=\"pageSelect.emit(page.id)\">\n <div class=\"text-sm font-medium text-gray-800\">{{ page.name }}</div>\n <div class=\"text-xs text-gray-500\">{{ page.route }}</div>\n </button>\n <button type=\"button\"\n class=\"p-2 text-gray-400 hover:text-red-600 transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n [disabled]=\"!canRemovePage()\"\n (click)=\"pageRemove.emit(page.id); $event.stopPropagation()\"\n aria-label=\"Remove page\">\n <lucide-icon name=\"trash-2\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n </ng-container>\n <ng-template #emptyPages>\n <div class=\"text-xs text-gray-500\">No pages yet.</div>\n </ng-template>\n </div>\n\n <ng-container *ngIf=\"activePage() as page\">\n <div class=\"border-t border-gray-100 p-4 space-y-3\">\n <div class=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">Page Settings</div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[10px] text-gray-500 uppercase tracking-wide\">Name</label>\n <input\n type=\"text\"\n [ngModel]=\"page.name\"\n (ngModelChange)=\"pageRename.emit({ id: page.id, name: $event })\"\n class=\"h-8 w-full rounded-md border border-gray-300 px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[10px] text-gray-500 uppercase tracking-wide\">Route</label>\n <input\n type=\"text\"\n [ngModel]=\"page.route\"\n (ngModelChange)=\"pageRouteChange.emit({ id: page.id, route: $event })\"\n placeholder=\"/about\"\n class=\"h-8 w-full rounded-md border border-gray-300 px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Tab: Sections -->\n <ng-container *ngIf=\"currentTab() === 'sections'\">\n <div class=\"p-4 border-b border-gray-100 space-y-3\">\n <div>\n <div class=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">Sections</div>\n <div class=\"text-[11px] text-gray-400 mt-1\">Add sections and bricks without clutter.</div>\n </div>\n <div class=\"flex gap-1 rounded-lg border border-gray-200 bg-gray-50 p-1\">\n <button *ngFor=\"let view of sectionViewOptions()\"\n type=\"button\"\n class=\"flex-1 px-2 py-1.5 text-[11px] font-semibold uppercase tracking-wide rounded-md transition-colors flex items-center justify-center gap-2\"\n [class.bg-white]=\"currentSectionView() === view\"\n [class.text-gray-900]=\"currentSectionView() === view\"\n [class.shadow-sm]=\"currentSectionView() === view\"\n [class.text-gray-500]=\"currentSectionView() !== view\"\n [attr.aria-pressed]=\"currentSectionView() === view\"\n (click)=\"sectionsView.set(view)\">\n <span>{{ sectionViewLabel(view) }}</span>\n <span class=\"text-[10px] font-semibold text-gray-400\">{{ sectionViewCount(view) }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"flex-1 overflow-y-auto p-4 custom-scrollbar\">\n <ng-container *ngIf=\"currentSectionView() === 'library'\">\n <div class=\"space-y-3\">\n <div class=\"relative\">\n <lucide-icon name=\"search\" class=\"absolute left-2 top-2 text-gray-400 w-4 h-4\"></lucide-icon>\n <input type=\"text\"\n [ngModel]=\"sectionLibrarySearchQuery()\"\n (ngModelChange)=\"sectionLibrarySearchQuery.set($event)\"\n placeholder=\"Search library sections\"\n class=\"w-full bg-gray-50 border border-gray-200 rounded px-8 py-1.5 text-sm focus:outline-none focus:border-blue-400 focus:ring-1 focus:ring-blue-400 transition-all\">\n </div>\n <ng-container *ngIf=\"filteredSections().length; else emptyLibrarySections\">\n <div class=\"space-y-4\"\n cdkDropList\n [cdkDropListData]=\"filteredSections()\"\n [cdkDropListConnectedTo]=\"[]\">\n <div *ngFor=\"let group of sectionGroups()\">\n <div class=\"text-[11px] font-semibold text-gray-400 uppercase tracking-wide mb-2\">{{ group.label }}</div>\n <div class=\"space-y-2\">\n <button *ngFor=\"let section of group.items\"\n type=\"button\"\n cdkDrag\n [cdkDragData]=\"getSectionDragData(section)\"\n class=\"w-full text-left rounded-md border border-gray-200 px-3 py-2 hover:bg-gray-50 transition-colors\"\n (click)=\"insertSection(section)\">\n <div class=\"text-xs font-semibold text-gray-800\">{{ section.name }}</div>\n <div class=\"text-[11px] text-gray-500\">{{ section.description }}</div>\n <div *ngIf=\"section.tags?.length\" class=\"mt-2 flex flex-wrap gap-1\">\n <span *ngFor=\"let tag of section.tags\"\n class=\"text-[10px] uppercase tracking-wide bg-gray-100 text-gray-500 px-1.5 py-0.5 rounded\">\n {{ tag }}\n </span>\n </div>\n\n <div *cdkDragPreview class=\"bg-white p-2 rounded shadow-lg border border-gray-200 flex items-center gap-2 z-50\">\n <lucide-icon name=\"layout-list\" class=\"w-4 h-4 text-blue-500\"></lucide-icon>\n <span class=\"text-sm font-medium\">{{ section.name }}</span>\n </div>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #emptyLibrarySections>\n <div class=\"text-xs text-gray-500\">\n No library sections available for this flavor.\n </div>\n </ng-template>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentSectionView() === 'saved'\">\n <div class=\"space-y-4\">\n <div class=\"rounded-lg border border-gray-200 bg-gray-50 p-3 space-y-2\">\n <div class=\"text-[11px] font-semibold text-gray-500 uppercase tracking-wide\">Save Selection</div>\n <input type=\"text\"\n [ngModel]=\"savedSectionName()\"\n (ngModelChange)=\"savedSectionName.set($event)\"\n placeholder=\"Section name\"\n class=\"w-full bg-white border border-gray-200 rounded px-3 py-1.5 text-sm focus:outline-none focus:border-blue-400 focus:ring-1 focus:ring-blue-400 transition-all\">\n <button type=\"button\"\n class=\"w-full px-3 py-2 text-xs font-semibold rounded-md border border-gray-200 text-gray-600 hover:text-gray-800 hover:border-gray-300 transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n [disabled]=\"!canSaveSection() || !savedSectionName().trim()\"\n (click)=\"requestSaveSection()\">\n Save selection as section\n </button>\n <div class=\"text-[10px] text-gray-400\" *ngIf=\"!canSaveSection()\">\n Select a row/section on the canvas to enable saving.\n </div>\n </div>\n\n <div class=\"space-y-3\">\n <div class=\"flex items-center justify-between\">\n <div class=\"text-[11px] font-semibold text-gray-400 uppercase tracking-wide\">Saved Sections</div>\n <div class=\"text-[10px] text-gray-400\">{{ savedSectionsList().length }}</div>\n </div>\n <div class=\"relative\">\n <lucide-icon name=\"search\" class=\"absolute left-2 top-2 text-gray-400 w-4 h-4\"></lucide-icon>\n <input type=\"text\"\n [ngModel]=\"savedSectionSearchQuery()\"\n (ngModelChange)=\"savedSectionSearchQuery.set($event)\"\n placeholder=\"Search saved sections\"\n class=\"w-full bg-gray-50 border border-gray-200 rounded px-8 py-1.5 text-sm focus:outline-none focus:border-blue-400 focus:ring-1 focus:ring-blue-400 transition-all\">\n </div>\n <ng-container *ngIf=\"filteredSavedSections().length; else emptySavedSections\">\n <div class=\"space-y-2\">\n <div *ngFor=\"let section of filteredSavedSections()\"\n class=\"flex items-start gap-2 rounded-md border border-gray-200 px-3 py-2 hover:bg-gray-50 transition-colors\">\n <button type=\"button\"\n class=\"flex-1 text-left\"\n (click)=\"savedSectionInsert.emit(section.id)\">\n <div class=\"text-xs font-semibold text-gray-800\">{{ section.name }}</div>\n <div class=\"text-[11px] text-gray-500\">{{ section.description || 'Saved section' }}</div>\n <div *ngIf=\"section.tags?.length\" class=\"mt-2 flex flex-wrap gap-1\">\n <span *ngFor=\"let tag of section.tags\"\n class=\"text-[10px] uppercase tracking-wide bg-gray-100 text-gray-500 px-1.5 py-0.5 rounded\">\n {{ tag }}\n </span>\n </div>\n </button>\n <button type=\"button\"\n class=\"p-2 text-gray-400 hover:text-red-600 transition-colors\"\n (click)=\"savedSectionRemove.emit(section.id)\"\n aria-label=\"Remove section\">\n <lucide-icon name=\"trash-2\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n </div>\n </ng-container>\n <ng-template #emptySavedSections>\n <div class=\"text-xs text-gray-500\">\n No sections saved yet.\n </div>\n </ng-template>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentSectionView() === 'bricks'\">\n <div class=\"space-y-3\">\n <div class=\"relative\">\n <lucide-icon name=\"search\" class=\"absolute left-2 top-2 text-gray-400 w-4 h-4\"></lucide-icon>\n <input type=\"text\"\n [ngModel]=\"brickSearchQuery()\"\n (ngModelChange)=\"brickSearchQuery.set($event)\"\n placeholder=\"Search bricks\"\n class=\"w-full bg-gray-50 border border-gray-200 rounded px-8 py-1.5 text-sm focus:outline-none focus:border-blue-400 focus:ring-1 focus:ring-blue-400 transition-all\">\n </div>\n <ng-container *ngIf=\"filteredBricks().length; else emptyBricks\">\n <div class=\"space-y-4\">\n <div *ngFor=\"let group of brickGroups()\">\n <div class=\"text-[11px] font-semibold text-gray-400 uppercase tracking-wide mb-2\">{{ group.label }}</div>\n <div class=\"space-y-2\">\n <button *ngFor=\"let brick of group.items\"\n type=\"button\"\n class=\"group w-full text-left rounded-md border border-gray-200 px-3 py-2 hover:bg-gray-50 transition-colors\"\n (click)=\"insertBrick(brick)\">\n <div class=\"flex items-center gap-2\">\n <div class=\"text-xs font-semibold text-gray-800 group-hover:text-gray-900\">{{ brick.name }}</div>\n <lucide-icon name=\"plus\" class=\"ml-auto text-gray-300 w-3 h-3 opacity-0 group-hover:opacity-100 transition-opacity\"></lucide-icon>\n </div>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #emptyBricks>\n <div class=\"text-xs text-gray-500\">\n No bricks yet. Create one in Brick Studio to use it here.\n </div>\n </ng-template>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Tab: Widgets -->\n <ng-container *ngIf=\"currentTab() === 'widgets'\">\n <!-- Search -->\n <div class=\"p-4 border-b border-gray-100\">\n <div class=\"relative\">\n <lucide-icon name=\"search\" class=\"absolute left-2 top-2 text-gray-400 w-4 h-4\"></lucide-icon>\n <input type=\"text\"\n [ngModel]=\"widgetSearchQuery()\"\n (ngModelChange)=\"widgetSearchQuery.set($event)\"\n placeholder=\"Search widgets\"\n class=\"w-full bg-gray-50 border border-gray-200 rounded px-8 py-1.5 text-sm focus:outline-none focus:border-blue-400 focus:ring-1 focus:ring-blue-400 transition-all\">\n </div>\n </div>\n\n <!-- Scrollable List -->\n <div class=\"flex-1 overflow-y-auto p-4 custom-scrollbar\">\n\n <!-- Section: Structure -->\n <div class=\"mb-6\" *ngIf=\"!widgetSearchQuery()\">\n <h3 class=\"text-xs font-semibold text-gray-400 mb-3 ml-1 uppercase\">Structure</h3>\n <div class=\"flex flex-col gap-1\">\n <div (click)=\"addStructure('row')\"\n class=\"group flex items-center gap-3 p-2 rounded hover:bg-gray-50 cursor-pointer transition-colors border border-transparent hover:border-gray-200\">\n <lucide-icon name=\"rows\" class=\"text-gray-400 w-4 h-4 group-hover:text-blue-500 transition-colors\"></lucide-icon>\n <span class=\"text-sm text-gray-600 font-medium group-hover:text-gray-900\">Row (1 Col)</span>\n <lucide-icon name=\"plus\" class=\"ml-auto text-gray-300 w-3 h-3 opacity-0 group-hover:opacity-100 transition-opacity\"></lucide-icon>\n </div>\n <div (click)=\"addStructure('2col')\"\n class=\"group flex items-center gap-3 p-2 rounded hover:bg-gray-50 cursor-pointer transition-colors border border-transparent hover:border-gray-200\">\n <lucide-icon name=\"columns\" class=\"text-gray-400 w-4 h-4 group-hover:text-blue-500 transition-colors\"></lucide-icon>\n <span class=\"text-sm text-gray-600 font-medium group-hover:text-gray-900\">2 Columns</span>\n <lucide-icon name=\"plus\" class=\"ml-auto text-gray-300 w-3 h-3 opacity-0 group-hover:opacity-100 transition-opacity\"></lucide-icon>\n </div>\n </div>\n </div>\n\n <!-- Section: Fields -->\n <div class=\"mb-6\" *ngIf=\"filteredFields().length > 0\">\n <h3 class=\"text-xs font-semibold text-gray-400 mb-3 ml-1 uppercase\">Input Fields</h3>\n <div class=\"flex flex-col gap-1\"\n cdkDropList\n [cdkDropListData]=\"filteredFields()\"\n [cdkDropListConnectedTo]=\"[]\">\n <div *ngFor=\"let widget of filteredFields()\"\n cdkDrag\n [cdkDragData]=\"getDragData(widget)\"\n (click)=\"addField(widget)\"\n class=\"group flex items-center gap-3 p-2 rounded hover:bg-gray-50 cursor-pointer transition-colors border border-transparent hover:border-gray-200\">\n <lucide-icon [name]=\"widget.icon\" class=\"text-gray-400 w-4 h-4 group-hover:text-blue-500 transition-colors\"></lucide-icon>\n <span class=\"text-sm text-gray-600 font-medium group-hover:text-gray-900\">{{ widget.label }}</span>\n\n <div *cdkDragPreview class=\"bg-white p-2 rounded shadow-lg border border-gray-200 flex items-center gap-2 z-50\">\n <lucide-icon [name]=\"widget.icon\" class=\"w-4 h-4 text-blue-500\"></lucide-icon>\n <span class=\"text-sm font-medium\">{{ widget.label }}</span>\n </div>\n\n <!-- Add Icon on right -->\n <lucide-icon name=\"plus\" class=\"ml-auto text-gray-300 w-3 h-3 opacity-0 group-hover:opacity-100 transition-opacity\"></lucide-icon>\n </div>\n </div>\n </div>\n\n <!-- Section: Content / Other -->\n <div class=\"mb-6\" *ngIf=\"filteredStatic().length > 0\">\n <h3 class=\"text-xs font-semibold text-gray-400 mb-3 ml-1 uppercase\">Content & Static</h3>\n <div class=\"flex flex-col gap-1\"\n cdkDropList\n [cdkDropListData]=\"filteredStatic()\"\n [cdkDropListConnectedTo]=\"[]\">\n <div *ngFor=\"let widget of filteredStatic()\"\n cdkDrag\n [cdkDragData]=\"getDragData(widget)\"\n (click)=\"addField(widget)\"\n class=\"group flex items-center gap-3 p-2 rounded hover:bg-gray-50 cursor-pointer transition-colors border border-transparent hover:border-gray-200\">\n <lucide-icon [name]=\"widget.icon\" class=\"text-gray-400 w-4 h-4 group-hover:text-blue-500 transition-colors\"></lucide-icon>\n <span class=\"text-sm text-gray-600 font-medium group-hover:text-gray-900\">{{ widget.label }}</span>\n\n <div *cdkDragPreview class=\"bg-white p-2 rounded shadow-lg border border-gray-200 flex items-center gap-2 z-50\">\n <lucide-icon [name]=\"widget.icon\" class=\"w-4 h-4 text-blue-500\"></lucide-icon>\n <span class=\"text-sm font-medium\">{{ widget.label }}</span>\n </div>\n\n <lucide-icon name=\"plus\" class=\"ml-auto text-gray-300 w-3 h-3 opacity-0 group-hover:opacity-100 transition-opacity\"></lucide-icon>\n </div>\n </div>\n </div>\n\n </div>\n </ng-container>\n\n <!-- Tab: Layers -->\n <ng-container *ngIf=\"currentTab() === 'layers'\">\n <app-layer-tree [schema]=\"designerState.schema()\"></app-layer-tree>\n </ng-container>\n\n </div>\n </div>\n `,\n styles: [`\n .custom-scrollbar::-webkit-scrollbar { width: 4px; }\n .custom-scrollbar::-webkit-scrollbar-thumb { background-color: #e5e7eb; border-radius: 4px; }\n `]\n})\nexport class FieldPaletteComponent {\n readonly sectionLibrary = input<DesignerSectionDefinition[] | null>(null);\n readonly sectionInsert = output<DesignerSectionDefinition>();\n readonly pages = input<PalettePage[] | null>(null);\n readonly activePageId = input<string | null>(null);\n readonly canRemovePage = input(false);\n readonly pageAdd = output<void>();\n readonly pageSelect = output<string>();\n readonly pageRemove = output<string>();\n readonly pageRename = output<{ id: string; name: string }>();\n readonly pageRouteChange = output<{ id: string; route: string }>();\n readonly savedSections = input<PaletteSavedSectionDefinition[] | null>(null);\n readonly savedSectionInsert = output<string>();\n readonly savedSectionRemove = output<string>();\n readonly savedSectionCreateRequested = output<{ name: string }>();\n readonly bricks = input<PaletteBrick[] | null>(null);\n activeTab = signal<PaletteTab>('widgets');\n sectionsView = signal<SectionsView>('library');\n widgetSearchQuery = signal('');\n sectionLibrarySearchQuery = signal('');\n savedSectionSearchQuery = signal('');\n savedSectionName = signal('');\n brickSearchQuery = signal('');\n private readonly injectedSections = (inject(DESIGNER_SECTIONS, { optional: true }) as DesignerSectionDefinition[][] | null) ?? [];\n private readonly injectedSectionsFlat = this.injectedSections.flat();\n // Reactive full list based on flavor\n allWidgets = computed(() => {\n const flavor = this.designerState.activeFlavor();\n // Flatten and filter by flavor\n return this._widgets.flat().filter(w => !w.flavor || w.flavor === flavor);\n });\n\n // Categorized\n filteredFields = computed(() => {\n const q = this.widgetSearchQuery().toLowerCase();\n return this.allWidgets().filter(w =>\n (w.kind === 'field') &&\n w.label.toLowerCase().includes(q)\n );\n });\n\n filteredStatic = computed(() => {\n const q = this.widgetSearchQuery().toLowerCase();\n // Include 'image' and any other non-field kinds here\n const excludeBricks = this.showBricks();\n return this.allWidgets().filter(w =>\n (w.kind !== 'field') &&\n w.label.toLowerCase().includes(q) &&\n (!excludeBricks || w.type !== 'brick')\n );\n });\n\n pagesList = computed(() => this.pages() ?? []);\n activePage = computed(() => {\n const list = this.pagesList();\n const id = this.activePageId();\n if (!id) return null;\n return list.find(page => page.id === id) ?? null;\n });\n\n savedSectionsList = computed(() => this.savedSections() ?? []);\n filteredSavedSections = computed(() => {\n const query = this.savedSectionSearchQuery().trim().toLowerCase();\n if (!query) return this.savedSectionsList();\n return this.savedSectionsList().filter(section => {\n const haystack = [\n section.name,\n section.description,\n ...(section.tags ?? [])\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n return haystack.includes(query);\n });\n });\n\n canSaveSection = computed(() => {\n const selected = this.designerState.selectedNode();\n return selected?.type === 'row';\n });\n\n sectionLibraryList = computed(() => {\n const flavor = this.designerState.activeFlavor();\n const inputSections = this.sectionLibrary();\n const base = inputSections && inputSections.length > 0 ? inputSections : this.injectedSectionsFlat;\n return base.filter(section => !section.flavor || section.flavor === flavor);\n });\n\n filteredSections = computed(() => {\n const query = this.sectionLibrarySearchQuery().trim().toLowerCase();\n if (!query) return this.sectionLibraryList();\n return this.sectionLibraryList().filter(section => {\n const haystack = [\n section.name,\n section.description,\n section.category,\n ...(section.tags ?? [])\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n return haystack.includes(query);\n });\n });\n\n sectionGroups = computed(() => {\n const groups = new Map<string, DesignerSectionDefinition[]>();\n for (const section of this.filteredSections()) {\n const label = section.category?.trim() || 'Sections';\n const existing = groups.get(label) ?? [];\n existing.push(section);\n groups.set(label, existing);\n }\n return Array.from(groups.entries()).map(([label, items]) => ({ label, items }));\n });\n\n bricksList = computed(() => this.bricks() ?? []);\n\n showBricks = computed(() => this.designerState.activeFlavor() === 'web' && this.bricks() !== null);\n\n sectionViewOptions = computed(() => {\n const options: SectionsView[] = [];\n if (this.sectionLibraryList().length) {\n options.push('library');\n }\n if (this.savedSections() !== null) {\n options.push('saved');\n }\n if (this.showBricks()) {\n options.push('bricks');\n }\n return options;\n });\n\n currentSectionView = computed(() => {\n const options = this.sectionViewOptions();\n const active = this.sectionsView();\n if (!options.length) return 'library';\n return options.includes(active) ? active : options[0];\n });\n\n filteredBricks = computed(() => {\n const query = this.brickSearchQuery().trim().toLowerCase();\n if (!query) return this.bricksList();\n return this.bricksList().filter(brick => brick.name.toLowerCase().includes(query));\n });\n\n brickGroups = computed(() => {\n const groups = new Map<string, PaletteBrick[]>();\n for (const brick of this.filteredBricks()) {\n const label = brick.runtime === 'react' ? 'React Bricks' : 'DOM Bricks';\n const items = groups.get(label) ?? [];\n items.push(brick);\n groups.set(label, items);\n }\n return Array.from(groups.entries()).map(([label, items]) => ({ label, items }));\n });\n\n tabOptions = computed(() => {\n const tabs: PaletteTab[] = [];\n if (this.pages() !== null) {\n tabs.push('pages');\n }\n if (this.sectionLibraryList().length || this.savedSections() !== null || this.showBricks()) {\n tabs.push('sections');\n }\n tabs.push('widgets', 'layers');\n return tabs;\n });\n\n currentTab = computed(() => {\n const tabs = this.tabOptions();\n const active = this.activeTab();\n return tabs.includes(active) ? active : 'widgets';\n });\n\n constructor(@Inject(WIDGET_DEFINITIONS) private _widgets: WidgetDefinition[][], public designerState: DesignerStateService) {}\n\n tabLabel(tab: PaletteTab): string {\n switch (tab) {\n case 'pages':\n return 'Pages';\n case 'sections':\n return 'Sections';\n case 'widgets':\n return 'Widgets';\n case 'layers':\n return 'Layers';\n default:\n return 'Widgets';\n }\n }\n\n sectionViewLabel(view: SectionsView): string {\n switch (view) {\n case 'library':\n return 'Library';\n case 'saved':\n return 'Saved';\n case 'bricks':\n return 'Bricks';\n default:\n return 'Library';\n }\n }\n\n sectionViewCount(view: SectionsView): number {\n switch (view) {\n case 'library':\n return this.sectionLibraryList().length;\n case 'saved':\n return this.savedSectionsList().length;\n case 'bricks':\n return this.bricksList().length;\n default:\n return 0;\n }\n }\n\n addField(widget: WidgetDefinition) {\n this.designerState.pushField(widget);\n }\n\n addStructure(type: 'row' | '2col') {\n this.designerState.pushStructure(type);\n }\n\n getDragData(widget: WidgetDefinition): InternalDragData {\n return {\n type: 'new-widget',\n widgetType: widget.type,\n widgetKind: widget.kind\n };\n }\n\n getSectionDragData(section: DesignerSectionDefinition): InternalDragData {\n return {\n type: 'new-section',\n section\n };\n }\n\n insertSection(section: DesignerSectionDefinition) {\n this.sectionInsert.emit(section);\n }\n\n insertBrick(brick: PaletteBrick) {\n const brickWidget = this.allWidgets().find(widget => widget.type === 'brick');\n if (!brickWidget) return;\n this.designerState.pushField(brickWidget);\n const selectedField = this.designerState.selectedField();\n if (!selectedField || selectedField.type !== 'brick') return;\n this.designerState.updateField(selectedField.id, {\n brickId: brick.id,\n props: this.cloneBrickProps(brick.defaultProps),\n label: brick.name\n });\n }\n\n requestSaveSection() {\n const name = this.savedSectionName().trim();\n if (!name) return;\n this.savedSectionCreateRequested.emit({ name });\n this.savedSectionName.set('');\n }\n\n private cloneBrickProps(props: Record<string, unknown> | undefined): Record<string, unknown> {\n if (!props || typeof props !== 'object') return {};\n return JSON.parse(JSON.stringify(props)) as Record<string, unknown>;\n }\n\n}\n","import type { StyleTokenSet } from '../form-core/models';\n\nexport const DEFAULT_PAGE_STYLE: StyleTokenSet = {\n paddingTop: 32,\n paddingRight: 32,\n paddingBottom: 64,\n paddingLeft: 32,\n backgroundColor: '#ffffff'\n};\n","import { AfterViewInit, Component, DestroyRef, ElementRef, HostListener, ViewChild, inject, signal, computed, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { JsonFormRendererComponent } from '../form-renderer/json-form-renderer.component';\nimport { DesignerStateService } from './designer-state.service';\nimport { serializeSchema, parseSchema } from '../form-core/schema-factory';\nimport { UiIconModule } from '../ui/ui-icon.module';\nimport { mergeAndNormalize } from '../widgets/style-helpers';\nimport { DEFAULT_PAGE_STYLE } from './page-style';\n\n@Component({\n selector: 'app-layout-canvas',\n standalone: true,\n imports: [CommonModule, JsonFormRendererComponent, UiIconModule],\n template: `\n <div #root class=\"h-full w-full relative font-sans\">\n <!-- Floating Toolbar (fixed to canvas viewport; unaffected by pan/zoom) -->\n <div class=\"absolute top-4 left-1/2 -translate-x-1/2 z-40\">\n <div class=\"flex items-center gap-2 text-gray-500 text-xs bg-white p-1 rounded-lg border border-gray-200 shadow-sm\">\n <span class=\"px-2 py-1 bg-gray-50 rounded border border-gray-100 text-gray-700 font-mono\"\n [title]=\"pageLabel()\">\n {{ pageLabel() }}\n </span>\n \n <div class=\"w-px h-4 bg-gray-200 mx-1\"></div>\n\n <!-- Breakpoint Switcher -->\n <div class=\"flex items-center bg-gray-100 rounded p-0.5\">\n <button *ngFor=\"let bp of breakpoints\" \n (click)=\"setBreakpoint(bp); $event.stopPropagation()\"\n [class.bg-white]=\"breakpoint === bp\"\n [class.text-blue-600]=\"breakpoint === bp\"\n [class.shadow-sm]=\"breakpoint === bp\"\n class=\"px-2 py-1 rounded text-[10px] font-bold uppercase transition-all hover:text-blue-500\">\n {{ bp }}\n </button>\n </div>\n\n <div class=\"w-px h-4 bg-gray-200 mx-1\"></div>\n\n <!-- Undo/Redo -->\n <div class=\"flex items-center bg-gray-100 rounded p-0.5\">\n <button type=\"button\"\n class=\"px-2 py-1 rounded hover:text-blue-500 hover:bg-white/70 transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n [disabled]=\"!state.canUndo()\"\n (click)=\"state.undo(); $event.stopPropagation()\"\n title=\"Undo (Ctrl/Cmd + Z)\"\n aria-label=\"Undo\">\n <lucide-icon name=\"undo-2\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <button type=\"button\"\n class=\"px-2 py-1 rounded hover:text-blue-500 hover:bg-white/70 transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n [disabled]=\"!state.canRedo()\"\n (click)=\"state.redo(); $event.stopPropagation()\"\n title=\"Redo (Ctrl/Cmd + Y / Shift+Z)\"\n aria-label=\"Redo\">\n <lucide-icon name=\"redo-2\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n </div>\n\n <div class=\"w-px h-4 bg-gray-200 mx-1\"></div>\n\n <!-- Zoom Controls -->\n <div class=\"flex items-center bg-gray-100 rounded p-0.5\">\n <button type=\"button\"\n class=\"px-2 py-1 rounded hover:text-blue-500 hover:bg-white/70 transition-colors\"\n (click)=\"zoomOut(); $event.stopPropagation()\"\n title=\"Zoom out (Ctrl/Cmd + -)\">\n <lucide-icon name=\"zoom-out\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <button type=\"button\"\n class=\"px-2 py-1 rounded font-mono text-[10px] text-gray-700 hover:bg-white/70 transition-colors min-w-[52px]\"\n (click)=\"resetZoom(); $event.stopPropagation()\"\n title=\"Reset zoom (Ctrl/Cmd + 0)\">\n {{ zoomLabel() }}\n </button>\n <button type=\"button\"\n class=\"px-2 py-1 rounded hover:text-blue-500 hover:bg-white/70 transition-colors\"\n (click)=\"zoomIn(); $event.stopPropagation()\"\n title=\"Zoom in (Ctrl/Cmd + +)\">\n <lucide-icon name=\"zoom-in\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n </div>\n\n <div class=\"w-px h-4 bg-gray-200 mx-1\"></div>\n\n <button class=\"px-2 py-1 hover:bg-green-50 text-green-600 flex items-center gap-1 transition-colors rounded\"\n (click)=\"preview(); $event.stopPropagation()\" title=\"Preview Form\">\n <lucide-icon name=\"play\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n\n <button class=\"px-2 py-1 hover:bg-gray-50 flex items-center gap-1 transition-colors rounded\"\n (click)=\"exportJson(); $event.stopPropagation()\" title=\"Export JSON\">\n <lucide-icon name=\"download\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n <button class=\"px-2 py-1 hover:bg-gray-50 flex items-center gap-1 transition-colors rounded\"\n (click)=\"importJson(); $event.stopPropagation()\" title=\"Import JSON\">\n <lucide-icon name=\"upload\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n </div>\n </div>\n\n <!-- Scroll/Pan Container -->\n <div #scrollContainer\n class=\"h-full w-full bg-gray-100/50 p-8 pt-24 pb-32 overflow-auto transition-all\"\n [class.canvas-grid]=\"isWebFlavor()\"\n (click)=\"deselect()\"\n (contextmenu)=\"onCanvasContextMenu($event)\">\n <div class=\"w-full\">\n <!-- Scaled sizer so zoom affects scrollbars -->\n <div class=\"relative mx-auto\"\n [style.width.px]=\"scaledPageWidth()\"\n [style.height.px]=\"scaledPageHeight()\">\n <!-- The Page -->\n <div #pageWrapper\n class=\"shadow-lg border border-gray-200 transform origin-top-left relative flex flex-col absolute top-0 left-0\"\n [style]=\"getPageStyle()\"\n [style.transform]=\"pageTransform()\">\n <div class=\"flex-1 min-h-0\">\n <app-json-form-renderer \n [schema]=\"schema()\"\n mode=\"design\"\n [device]=\"device\"\n [breakpoint]=\"breakpoint\">\n </app-json-form-renderer>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Context Menu -->\n <div *ngIf=\"state.contextMenu() as menu\" class=\"fixed inset-0 z-50\" (click)=\"closeContextMenu()\">\n <div class=\"absolute min-w-[180px] rounded-md border border-gray-200 bg-white shadow-lg text-xs\"\n [style.left.px]=\"menu.x\"\n [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n <button type=\"button\"\n class=\"w-full px-3 py-2 text-left hover:bg-gray-50 flex items-center justify-between\"\n (click)=\"cut(); $event.stopPropagation()\">\n <span>Cut</span>\n <span class=\"text-gray-400 text-[10px]\">Cmd+X</span>\n </button>\n <button type=\"button\"\n class=\"w-full px-3 py-2 text-left hover:bg-gray-50 flex items-center justify-between\"\n (click)=\"copy(); $event.stopPropagation()\">\n <span>Copy</span>\n <span class=\"text-gray-400 text-[10px]\">Cmd+C</span>\n </button>\n <button type=\"button\"\n class=\"w-full px-3 py-2 text-left hover:bg-gray-50 flex items-center justify-between disabled:opacity-50 disabled:cursor-not-allowed\"\n [disabled]=\"!state.clipboard()\"\n (click)=\"paste(); $event.stopPropagation()\">\n <span>Paste</span>\n <span class=\"text-gray-400 text-[10px]\">Cmd+V</span>\n </button>\n <button type=\"button\"\n class=\"w-full px-3 py-2 text-left hover:bg-gray-50 flex items-center justify-between text-red-600 hover:text-red-700\"\n (click)=\"deleteSelected(); $event.stopPropagation()\">\n <span>Delete</span>\n <span class=\"text-gray-400 text-[10px]\">Del</span>\n </button>\n <div class=\"h-px bg-gray-100 my-1\"></div>\n <button type=\"button\"\n class=\"w-full px-3 py-2 text-left hover:bg-gray-50 disabled:text-gray-300 disabled:cursor-not-allowed\"\n [disabled]=\"!state.canGroupSelectedFields()\"\n (click)=\"groupSelected()\">\n Group fields\n </button>\n <button type=\"button\"\n class=\"w-full px-3 py-2 text-left hover:bg-gray-50 disabled:text-gray-300 disabled:cursor-not-allowed\"\n [disabled]=\"!state.canUngroupSelectedFields()\"\n (click)=\"ungroupSelected()\">\n Ungroup fields\n </button>\n </div>\n </div>\n </div>\n\n <!-- Breadcrumb Navigation Bar -->\n <div *ngIf=\"state.selectedNodeId()\" \n class=\"fixed bottom-0 left-64 right-80 bg-gray-800 text-white px-4 py-2.5 flex items-center gap-2 text-xs border-t border-gray-700 z-40 shadow-lg\"\n (click)=\"$event.stopPropagation()\">\n <lucide-icon name=\"chevron-right\" class=\"w-3 h-3 text-gray-500\"></lucide-icon>\n <span class=\"text-gray-500 font-medium\">Path:</span>\n <ng-container *ngFor=\"let crumb of getNodePath(); let last = last; let i = index\">\n <button (click)=\"selectCrumb(crumb.id)\" \n class=\"px-2 py-0.5 rounded transition-colors\"\n [class.text-blue-400]=\"last\"\n [class.bg-gray-700]=\"last\"\n [class.text-gray-400]=\"!last\"\n [class.hover:text-white]=\"!last\"\n [class.hover:bg-gray-700]=\"!last\">\n {{ crumb.label }}\n </button>\n <lucide-icon *ngIf=\"!last\" name=\"chevron-right\" class=\"w-3 h-3 text-gray-600\"></lucide-icon>\n </ng-container>\n </div>\n\n <!-- Hidden file input for import -->\n <input type=\"file\" #fileInput accept=\".json\" (change)=\"onFileSelected($event)\" style=\"display: none;\">\n `\n ,\n styles: [`\n .canvas-grid {\n background-image: radial-gradient(rgba(148, 163, 184, 0.35) 1px, transparent 1px);\n background-size: 18px 18px;\n }\n `]\n})\nexport class LayoutCanvasComponent implements AfterViewInit {\n private readonly destroyRef = inject(DestroyRef);\n\n readonly previewMode = input<'overlay' | 'route'>('overlay');\n readonly previewRequested = output<void>();\n\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n @ViewChild('root') root!: ElementRef<HTMLDivElement>;\n @ViewChild('scrollContainer') scrollContainer!: ElementRef<HTMLDivElement>;\n @ViewChild('pageWrapper') pageWrapper!: ElementRef<HTMLDivElement>;\n\n breakpoints = ['xs', 'sm', 'md', 'lg', 'xl', '2xl'] as const;\n\n constructor(public state: DesignerStateService) { }\n\n get schema() { return this.state.schema; }\n get device() { return this.state.activeDevice(); } // 'mobile' | 'desktop' for basic passing\n get breakpoint() { return this.state.activeBreakpoint(); }\n\n readonly zoom = signal(1);\n private readonly pageBaseSize = signal({ width: 0, height: 0 });\n\n private readonly minZoom = 0.25;\n private readonly maxZoom = 3;\n private wheelListener?: (event: WheelEvent) => void;\n private pendingScrollAdjust: number | null = null;\n private resizeObserver?: ResizeObserver;\n readonly pageLabel = computed(() => this.state.schema().title ?? 'Untitled Page');\n readonly isWebFlavor = computed(() => this.state.activeFlavor() === 'web');\n\n ngAfterViewInit() {\n const el = this.scrollContainer.nativeElement;\n\n this.wheelListener = (event: WheelEvent) => {\n // Trackpad pinch and Ctrl/Cmd+wheel should zoom the canvas (not the browser page).\n if (!event.ctrlKey && !event.metaKey) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const current = this.zoom();\n const multiplier = Math.exp(-event.deltaY / 500);\n this.setZoom(current * multiplier, { clientX: event.clientX, clientY: event.clientY });\n };\n\n el.addEventListener('wheel', this.wheelListener, { passive: false });\n\n this.updatePageBaseSize();\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.updatePageBaseSize());\n this.resizeObserver.observe(this.pageWrapper.nativeElement);\n }\n\n this.destroyRef.onDestroy(() => {\n if (this.wheelListener) {\n el.removeEventListener('wheel', this.wheelListener);\n }\n if (this.pendingScrollAdjust !== null) {\n cancelAnimationFrame(this.pendingScrollAdjust);\n }\n this.resizeObserver?.disconnect();\n });\n }\n\n @HostListener('document:keydown.escape')\n onEscape() {\n this.closeContextMenu();\n }\n\n @HostListener('window:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent) {\n if (this.state.isPreviewMode()) return;\n if (event.defaultPrevented) return;\n\n if (this.isEditableTarget(event.target)) return;\n\n const isModifier = event.ctrlKey || event.metaKey;\n if (!isModifier) return;\n\n const key = event.key.toLowerCase();\n const code = event.code;\n\n const isKeyZ = key === 'z' || code === 'KeyZ';\n const isKeyY = key === 'y' || code === 'KeyY';\n\n if (isKeyZ || isKeyY) {\n event.preventDefault();\n event.stopPropagation();\n\n if (isKeyZ && !event.shiftKey) {\n this.state.undo();\n } else {\n this.state.redo();\n }\n return;\n }\n\n const isKeyC = key === 'c' || code === 'KeyC';\n const isKeyV = key === 'v' || code === 'KeyV';\n const isKeyX = key === 'x' || code === 'KeyX';\n\n if (isKeyC || isKeyV || isKeyX) {\n // Let browser handle native copy/paste if we are in an editable element,\n // but we blocked that with isEditableTarget check earlier.\n event.preventDefault();\n event.stopPropagation();\n \n if (isKeyC) {\n this.state.copy();\n } else if (isKeyX) {\n this.state.cut();\n } else if (isKeyV) {\n this.state.paste();\n }\n return;\n }\n \n const isDelete = key === 'delete' || code === 'Delete' || key === 'backspace' || code === 'Backspace';\n if (isDelete) {\n event.preventDefault();\n event.stopPropagation();\n this.state.deleteSelected();\n return;\n }\n\n const isZoomInKey = key === '+' || key === '=' || code === 'NumpadAdd';\n const isZoomOutKey = key === '-' || key === '_' || code === 'NumpadSubtract';\n const isResetKey = key === '0' || code === 'Numpad0';\n\n if (!isZoomInKey && !isZoomOutKey && !isResetKey) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (isResetKey) {\n this.resetZoom();\n } else if (isZoomInKey) {\n this.zoomIn();\n } else if (isZoomOutKey) {\n this.zoomOut();\n }\n }\n\n deselect() {\n this.state.selectNode(null);\n this.closeContextMenu();\n }\n\n closeContextMenu() {\n this.state.closeContextMenu();\n }\n\n groupSelected() {\n this.state.groupSelectedFields();\n this.closeContextMenu();\n }\n\n ungroupSelected() {\n this.state.ungroupSelectedFields();\n this.closeContextMenu();\n }\n\n onCanvasContextMenu(event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n // Determine if we should deselect or keep selection?\n // Standard behavior: clicking empty space usually deselects. \n // But Right click on empty space?\n // Let's deselect to indicate \"Paste here (at root)\" context\n this.deselect();\n this.state.openContextMenu({ x: event.clientX, y: event.clientY });\n }\n\n cut() {\n this.state.cut();\n this.closeContextMenu();\n }\n\n copy() {\n this.state.copy();\n this.closeContextMenu();\n }\n\n paste() {\n this.state.paste();\n this.closeContextMenu();\n }\n\n deleteSelected() {\n this.state.deleteSelected();\n this.closeContextMenu();\n }\n\n setBreakpoint(bp: any) {\n this.state.activeBreakpoint.set(bp);\n }\n\n preview() {\n if (this.previewMode() === 'route') {\n this.previewRequested.emit();\n return;\n }\n this.state.isPreviewMode.set(true);\n }\n\n getCanvasWidth() {\n const bp = this.breakpoint;\n switch (bp) {\n case 'xs': return '375px';\n case 'sm': return '576px';\n case 'md': return '768px';\n case 'lg': return '992px';\n case 'xl': return '1200px';\n case '2xl': return '1400px';\n default: return '100%';\n }\n }\n\n getCanvasHeight() {\n return this.breakpoint === 'xs' ? '667px' : '800px';\n }\n\n getPageStyle() {\n const baseStyle = this.state.schema().ui?.baseStyle;\n const normalized = mergeAndNormalize(DEFAULT_PAGE_STYLE, baseStyle);\n if (normalized['width'] === undefined) {\n normalized['width'] = this.getCanvasWidth();\n }\n if (normalized['minHeight'] === undefined && normalized['height'] === undefined) {\n normalized['minHeight'] = this.getCanvasHeight();\n }\n return normalized;\n }\n\n pageTransform(): string {\n return `scale(${this.zoom()})`;\n }\n\n zoomLabel(): string {\n return `${Math.round(this.zoom() * 100)}%`;\n }\n\n scaledPageWidth(): number {\n const { width } = this.pageBaseSize();\n return Math.max(1, Math.round(width * this.zoom()));\n }\n\n scaledPageHeight(): number {\n const { height } = this.pageBaseSize();\n return Math.max(1, Math.round(height * this.zoom()));\n }\n\n zoomIn() {\n const current = this.zoom();\n this.setZoom(current * 1.1);\n }\n\n zoomOut() {\n const current = this.zoom();\n this.setZoom(current / 1.1);\n }\n\n resetZoom() {\n this.setZoom(1);\n }\n\n private clampZoom(value: number): number {\n const clamped = Math.min(this.maxZoom, Math.max(this.minZoom, value));\n return Math.round(clamped * 100) / 100;\n }\n\n private updatePageBaseSize() {\n const el = this.pageWrapper?.nativeElement;\n if (!el) return;\n\n const width = el.offsetWidth;\n const height = el.offsetHeight;\n if (!width || !height) return;\n\n const prev = this.pageBaseSize();\n if (prev.width !== width || prev.height !== height) {\n this.pageBaseSize.set({ width, height });\n }\n }\n\n private isEditableTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null;\n if (!el) return false;\n if (el.isContentEditable) return true;\n\n const tagName = el.tagName?.toUpperCase();\n return tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT';\n }\n\n private getViewportCenter(): { clientX: number; clientY: number } {\n const rect = this.scrollContainer.nativeElement.getBoundingClientRect();\n return {\n clientX: rect.left + rect.width / 2,\n clientY: rect.top + rect.height / 2\n };\n }\n\n private setZoom(next: number, anchor?: { clientX: number; clientY: number }) {\n const targetZoom = this.clampZoom(next);\n if (targetZoom === this.zoom()) return;\n\n const scrollEl = this.scrollContainer?.nativeElement;\n const pageEl = this.pageWrapper?.nativeElement;\n if (!scrollEl || !pageEl) {\n this.zoom.set(targetZoom);\n return;\n }\n\n const anchorPoint = anchor ?? this.getViewportCenter();\n const before = this.captureAnchor(scrollEl, pageEl, anchorPoint.clientX, anchorPoint.clientY);\n\n this.zoom.set(targetZoom);\n\n if (this.pendingScrollAdjust !== null) {\n cancelAnimationFrame(this.pendingScrollAdjust);\n }\n this.pendingScrollAdjust = requestAnimationFrame(() => {\n this.pendingScrollAdjust = null;\n this.restoreAnchor(scrollEl, pageEl, anchorPoint.clientX, anchorPoint.clientY, before, targetZoom);\n });\n }\n\n private captureAnchor(\n scrollEl: HTMLElement,\n pageEl: HTMLElement,\n clientX: number,\n clientY: number\n ): { pointerX: number; pointerY: number; contentX: number; contentY: number; zoom: number } {\n const scrollRect = scrollEl.getBoundingClientRect();\n const pageRect = pageEl.getBoundingClientRect();\n const zoom = this.getRenderedScale(pageEl);\n\n const pointerX = clientX - scrollRect.left;\n const pointerY = clientY - scrollRect.top;\n\n const pageScrollLeft = scrollEl.scrollLeft + (pageRect.left - scrollRect.left);\n const pageScrollTop = scrollEl.scrollTop + (pageRect.top - scrollRect.top);\n\n const pointerScrollLeft = scrollEl.scrollLeft + pointerX;\n const pointerScrollTop = scrollEl.scrollTop + pointerY;\n\n const dx = pointerScrollLeft - pageScrollLeft;\n const dy = pointerScrollTop - pageScrollTop;\n\n return {\n pointerX,\n pointerY,\n contentX: dx / zoom,\n contentY: dy / zoom,\n zoom\n };\n }\n\n private restoreAnchor(\n scrollEl: HTMLElement,\n pageEl: HTMLElement,\n clientX: number,\n clientY: number,\n anchor: { pointerX: number; pointerY: number; contentX: number; contentY: number; zoom: number },\n targetZoom: number\n ) {\n const scrollRect = scrollEl.getBoundingClientRect();\n const pageRect = pageEl.getBoundingClientRect();\n\n const pointerX = clientX - scrollRect.left;\n const pointerY = clientY - scrollRect.top;\n\n const pageScrollLeft = scrollEl.scrollLeft + (pageRect.left - scrollRect.left);\n const pageScrollTop = scrollEl.scrollTop + (pageRect.top - scrollRect.top);\n\n const desiredPointerScrollLeft = pageScrollLeft + anchor.contentX * targetZoom;\n const desiredPointerScrollTop = pageScrollTop + anchor.contentY * targetZoom;\n\n const nextScrollLeft = desiredPointerScrollLeft - pointerX;\n const nextScrollTop = desiredPointerScrollTop - pointerY;\n\n scrollEl.scrollTo({ left: nextScrollLeft, top: nextScrollTop });\n }\n\n private getRenderedScale(el: HTMLElement): number {\n const transform = getComputedStyle(el).transform;\n if (!transform || transform === 'none') return 1;\n\n const matrixMatch = transform.match(/^matrix\\\\((.+)\\\\)$/);\n if (matrixMatch) {\n const parts = matrixMatch[1].split(',').map(p => Number.parseFloat(p.trim()));\n if (parts.length >= 4 && Number.isFinite(parts[0])) {\n return parts[0];\n }\n }\n\n const matrix3dMatch = transform.match(/^matrix3d\\\\((.+)\\\\)$/);\n if (matrix3dMatch) {\n const parts = matrix3dMatch[1].split(',').map(p => Number.parseFloat(p.trim()));\n if (parts.length >= 16 && Number.isFinite(parts[0])) {\n return parts[0];\n }\n }\n\n return 1;\n }\n\n exportJson() {\n const json = serializeSchema(this.state.schema());\n const blob = new Blob([json], { type: 'application/json' });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `form-${this.state.schema().id}.json`;\n a.click();\n window.URL.revokeObjectURL(url);\n }\n\n importJson() {\n this.fileInput.nativeElement.click();\n }\n\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (e) => {\n const text = e.target?.result as string;\n if (text) {\n try {\n const schema = parseSchema(text);\n this.state.updateSchema(schema);\n this.state.selectNode(null);\n } catch (error) {\n console.error('Invalid JSON file:', error);\n alert('Invalid JSON file. Please select a valid form configuration.');\n }\n }\n };\n reader.readAsText(file);\n\n // Reset input so same file can be imported again\n input.value = '';\n }\n\n // Breadcrumb helpers\n getNodePath() {\n const selectedId = this.state.selectedNodeId();\n if (!selectedId) return [];\n return this.state.getNodePath(selectedId);\n }\n\n selectCrumb(nodeId: string) {\n this.state.selectNode(nodeId);\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { DesignerFlavor } from '../form-core/models';\nimport { WidgetDefinition } from '../widgets/widget-definition';\nimport type { DesignerSectionDefinition } from './section-definition';\n\nexport interface DesignerPlugin {\n id: string; // e.g. 'core-form', 'core-page', 'email-basic'\n label: string; // human friendly name\n description?: string;\n flavors: DesignerFlavor[]; // which flavors this plugin contributes to\n widgets?: WidgetDefinition[]; // widget definitions contributed by this plugin\n sections?: DesignerSectionDefinition[]; // optional section templates (web-focused)\n\n // Reserved for future AI/LLM metadata and JSON schema extensions:\n // Third-party plugins register DesignerPlugins (e.g., audio/video/image editors, table widgets for page+email flavors).\n // metadata is reserved for JSON schema/AI descriptors so LLM tools can generate/edit configs, keeping everything portable and shareable as pure JSON.\n metadata?: Record<string, unknown>;\n version?: string; // plugin version (e.g. '1.0.0')\n}\n\nexport const DESIGNER_PLUGINS = new InjectionToken<DesignerPlugin[]>('DESIGNER_PLUGINS');\n","import { FormSchema, FieldSchema } from './models';\n\n/**\n * Helper methodology for plugins to store JSON data on the schema/fields.\n * pluginId should be the same ID used in DesignerPlugin.id and in defineWidget(pluginId, ...).\n * This keeps everything portable and AI-friendly.\n */\n\n// Schema-level metadata\nexport function getPluginSchemaMeta<T = unknown>(\n schema: FormSchema,\n pluginId: string\n): T | undefined {\n return (schema.metadata?.[pluginId] as T | undefined);\n}\n\nexport function setPluginSchemaMeta<T = unknown>(\n schema: FormSchema,\n pluginId: string,\n value: T\n): FormSchema {\n const metadata = { ...(schema.metadata ?? {}), [pluginId]: value };\n return { ...schema, metadata };\n}\n\n// Field-level metadata\nexport function getPluginFieldMeta<T = unknown>(\n field: FieldSchema,\n pluginId: string\n): T | undefined {\n return (field.metadata?.[pluginId] as T | undefined);\n}\n\nexport function setPluginFieldMeta<T = unknown>(\n field: FieldSchema,\n pluginId: string,\n value: T\n): FieldSchema {\n const metadata = { ...(field.metadata ?? {}), [pluginId]: value };\n return { ...field, metadata };\n}\n","import { Injectable, computed, inject, Signal } from '@angular/core';\nimport { DesignerStateService } from './designer-state.service';\nimport { FormSchema, FieldSchema } from '../form-core/models';\nimport { WidgetDefinition } from '../widgets/widget-definition';\nimport { DESIGNER_PLUGINS, DesignerPlugin } from '../plugins/designer-plugin';\nimport { getPluginSchemaMeta, setPluginSchemaMeta, getPluginFieldMeta, setPluginFieldMeta } from '../form-core/plugin-metadata';\n\n/**\n * Public API for Designer Plugins.\n * Allows plugins to interact with the designer state and discover other plugins.\n */\n@Injectable({ providedIn: 'root' })\nexport class DesignerContext {\n private readonly state = inject(DesignerStateService);\n // Force cast to expected type to handle compiler confusion; default to empty\n private readonly pluginGroups = ((inject(DESIGNER_PLUGINS, { optional: true }) as unknown) as DesignerPlugin[][]) ?? [];\n\n readonly schema: Signal<FormSchema> = this.state.schema;\n\n // Flattened plugin list for discovery\n readonly plugins = computed<DesignerPlugin[]>(() => this.pluginGroups.flat());\n\n // --- Schema helpers ---\n getSchema(): FormSchema {\n return this.state.schema();\n }\n\n updateSchema(mutator: (schema: FormSchema) => FormSchema): void {\n const current = this.state.schema();\n this.state.updateSchema(mutator(current));\n }\n\n // --- Fields ---\n getFields(): FieldSchema[] {\n return this.state.schema().fields;\n }\n\n getFieldById(id: string): FieldSchema | undefined {\n return this.state.schema().fields.find(f => f.id === id);\n }\n\n updateField(id: string, updater: (field: FieldSchema) => FieldSchema): void {\n const current = this.state.schema();\n const fields = current.fields.map(f => f.id === id ? updater(f) : f);\n this.state.updateSchema({ ...current, fields });\n }\n\n // --- Plugin-scoped metadata helpers ---\n getPluginSchemaMeta<T = unknown>(pluginId: string): T | undefined {\n return getPluginSchemaMeta<T>(this.state.schema(), pluginId);\n }\n\n setPluginSchemaMeta<T = unknown>(pluginId: string, value: T): void {\n this.updateSchema(schema => setPluginSchemaMeta(schema, pluginId, value));\n }\n\n getPluginFieldMeta<T = unknown>(fieldId: string, pluginId: string): T | undefined {\n const field = this.getFieldById(fieldId);\n return field ? getPluginFieldMeta<T>(field, pluginId) : undefined;\n }\n\n setPluginFieldMeta<T = unknown>(fieldId: string, pluginId: string, value: T): void {\n this.updateField(fieldId, field => setPluginFieldMeta(field, pluginId, value));\n }\n\n // --- Widget Registry helpers ---\n getWidgetDefinitionById(id: string): WidgetDefinition | undefined {\n for (const group of this.pluginGroups) {\n for (const plugin of group) {\n const found = plugin.widgets?.find(w => w.id === id);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n getWidgetDefinitionForField(field: FieldSchema, kind?: string): WidgetDefinition | undefined {\n if (field.widgetId) {\n const byId = this.getWidgetDefinitionById(field.widgetId);\n if (byId) return byId;\n }\n\n for (const group of this.pluginGroups) {\n for (const plugin of group) {\n const found = plugin.widgets?.find(w =>\n w.type === field.type && (!kind || w.kind === kind)\n );\n if (found) return found;\n }\n }\n return undefined;\n }\n\n getWidgetDefinition(type: string): WidgetDefinition | undefined {\n // Backward-compatible helper: find by type only\n for (const group of this.pluginGroups) {\n for (const plugin of group) {\n const found = plugin.widgets?.find(w => w.type === type);\n if (found) return found;\n }\n }\n return undefined;\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'ui-field-wrapper',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"flex flex-col gap-1 w-full\">\n <div class=\"flex items-center justify-between\">\n <label class=\"text-xs font-semibold text-gray-600 uppercase tracking-wide\" *ngIf=\"label\">{{ label }}</label>\n <span *ngIf=\"hint\" class=\"text-[11px] text-gray-400\">{{ hint }}</span>\n </div>\n <ng-content></ng-content>\n <p *ngIf=\"helpText\" class=\"text-[11px] text-gray-400\">{{ helpText }}</p>\n </div>\n `\n})\nexport class UiFieldWrapperComponent {\n @Input() label = '';\n @Input() hint = '';\n @Input() helpText = '';\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiFieldWrapperComponent } from './ui-field-wrapper.component';\n\n@Component({\n selector: 'ui-input',\n standalone: true,\n imports: [CommonModule, FormsModule, UiFieldWrapperComponent],\n template: `\n <ui-field-wrapper [label]=\"label\" [hint]=\"hint\" [helpText]=\"helpText\">\n <input\n [type]=\"type\"\n class=\"w-full h-9 rounded-md border border-gray-300 px-3 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white transition-all\"\n [placeholder]=\"placeholder\"\n [(ngModel)]=\"model\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (ngModelChange)=\"modelChange.emit($event)\"\n (blur)=\"onBlur.emit()\"\n />\n </ui-field-wrapper>\n `\n})\nexport class UiInputComponent {\n @Input() label = '';\n @Input() hint = '';\n @Input() helpText = '';\n @Input() placeholder = '';\n @Input() type: 'text' | 'number' = 'text';\n @Input() min?: number;\n @Input() max?: number;\n @Input() step?: number;\n\n @Input() model: any;\n @Output() modelChange = new EventEmitter<any>();\n @Output() onBlur = new EventEmitter<void>();\n}\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiFieldWrapperComponent } from './ui-field-wrapper.component';\n\nexport interface BoxModelValues {\n marginTop?: any;\n marginRight?: any;\n marginBottom?: any;\n marginLeft?: any;\n paddingTop?: any;\n paddingRight?: any;\n paddingBottom?: any;\n paddingLeft?: any;\n borderWidth?: any;\n width?: any;\n height?: any;\n}\n\n@Component({\n selector: 'ui-box-model',\n standalone: true,\n imports: [CommonModule, FormsModule, UiFieldWrapperComponent],\n template: `\n <ui-field-wrapper [label]=\"label\" [hint]=\"hint\" [helpText]=\"helpText\">\n <div class=\"space-y-2\">\n <div class=\"relative mx-auto h-40 w-56\">\n <!-- Margin -->\n <div class=\"absolute inset-2 rounded-md border border-slate-200 bg-slate-50\">\n <span class=\"absolute left-1 top-1 text-[9px] uppercase tracking-wide text-ink-400\">Margin</span>\n <input class=\"absolute -top-3 left-1/2 h-6 w-11 -translate-x-1/2 rounded border border-slate-300 bg-white text-center text-[10px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n type=\"text\"\n [ngModel]=\"localMarginTop\"\n (ngModelChange)=\"localMarginTop = $event\"\n (blur)=\"emitChange()\"\n aria-label=\"Margin top\">\n <input class=\"absolute -right-3 top-1/2 h-6 w-11 -translate-y-1/2 rounded border border-slate-300 bg-white text-center text-[10px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n type=\"text\"\n [ngModel]=\"localMarginRight\"\n (ngModelChange)=\"localMarginRight = $event\"\n (blur)=\"emitChange()\"\n aria-label=\"Margin right\">\n <input class=\"absolute -bottom-3 left-1/2 h-6 w-11 -translate-x-1/2 rounded border border-slate-300 bg-white text-center text-[10px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n type=\"text\"\n [ngModel]=\"localMarginBottom\"\n (ngModelChange)=\"localMarginBottom = $event\"\n (blur)=\"emitChange()\"\n aria-label=\"Margin bottom\">\n <input class=\"absolute -left-3 top-1/2 h-6 w-11 -translate-y-1/2 rounded border border-slate-300 bg-white text-center text-[10px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n type=\"text\"\n [ngModel]=\"localMarginLeft\"\n (ngModelChange)=\"localMarginLeft = $event\"\n (blur)=\"emitChange()\"\n aria-label=\"Margin left\">\n\n <!-- Border -->\n <div class=\"absolute inset-3 rounded-md border border-slate-300 bg-white\">\n <span class=\"absolute left-1 top-1 text-[9px] uppercase tracking-wide text-ink-400\">Border</span>\n <input class=\"absolute top-1 left-1/2 h-6 w-11 -translate-x-1/2 rounded border border-slate-300 bg-slate-50 text-center text-[10px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n type=\"text\"\n [ngModel]=\"localBorderWidth\"\n (ngModelChange)=\"localBorderWidth = $event\"\n (blur)=\"emitChange()\"\n aria-label=\"Border width\">\n\n <!-- Padding -->\n <div class=\"absolute inset-3 rounded-md border border-accent-100 bg-accent-50\">\n <span class=\"absolute left-1 top-1 text-[9px] uppercase tracking-wide text-ink-600\">Padding</span>\n <input class=\"absolute -top-3 left-1/2 h-6 w-11 -translate-x-1/2 rounded border border-slate-300 bg-white text-center text-[10px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n type=\"text\"\n [ngModel]=\"localPaddingTop\"\n (ngModelChange)=\"localPaddingTop = $event\"\n (blur)=\"emitChange()\"\n aria-label=\"Padding top\">\n <input class=\"absolute -right-3 top-1/2 h-6 w-11 -translate-y-1/2 rounded border border-slate-300 bg-white text-center text-[10px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n type=\"text\"\n [ngModel]=\"localPaddingRight\"\n (ngModelChange)=\"localPaddingRight = $event\"\n (blur)=\"emitChange()\"\n aria-label=\"Padding right\">\n <input class=\"absolute -bottom-3 left-1/2 h-6 w-11 -translate-x-1/2 rounded border border-slate-300 bg-white text-center text-[10px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n type=\"text\"\n [ngModel]=\"localPaddingBottom\"\n (ngModelChange)=\"localPaddingBottom = $event\"\n (blur)=\"emitChange()\"\n aria-label=\"Padding bottom\">\n <input class=\"absolute -left-3 top-1/2 h-6 w-11 -translate-y-1/2 rounded border border-slate-300 bg-white text-center text-[10px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n type=\"text\"\n [ngModel]=\"localPaddingLeft\"\n (ngModelChange)=\"localPaddingLeft = $event\"\n (blur)=\"emitChange()\"\n aria-label=\"Padding left\">\n\n <!-- Content -->\n <div class=\"absolute inset-3 flex flex-col items-center justify-center gap-1 rounded-md border border-slate-200 bg-white\">\n <span class=\"text-[9px] uppercase tracking-wide text-ink-400\">Size</span>\n <div class=\"flex items-center gap-1\">\n <input class=\"h-6 w-12 rounded border border-slate-300 bg-white text-center text-[10px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n type=\"text\"\n [ngModel]=\"localWidth\"\n (ngModelChange)=\"localWidth = $event\"\n (blur)=\"emitChange()\"\n aria-label=\"Width\">\n <span class=\"text-[10px] text-ink-400\">x</span>\n <input class=\"h-6 w-12 rounded border border-slate-300 bg-white text-center text-[10px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n type=\"text\"\n [ngModel]=\"localHeight\"\n (ngModelChange)=\"localHeight = $event\"\n (blur)=\"emitChange()\"\n aria-label=\"Height\">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between text-[11px] text-ink-500\">\n <span class=\"uppercase tracking-wide\">Unit</span>\n <select class=\"h-7 rounded border border-slate-300 bg-white px-2 text-[11px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-500\"\n [ngModel]=\"unit\"\n (ngModelChange)=\"onUnitChange($event)\">\n <option *ngFor=\"let option of unitOptions\" [value]=\"option\">{{ option }}</option>\n </select>\n </div>\n </div>\n </ui-field-wrapper>\n `\n})\nexport class UiBoxModelComponent implements OnChanges {\n @Input() label = 'Box Model';\n @Input() hint = '';\n @Input() helpText = '';\n\n @Input() marginTop: any;\n @Input() marginRight: any;\n @Input() marginBottom: any;\n @Input() marginLeft: any;\n @Input() paddingTop: any;\n @Input() paddingRight: any;\n @Input() paddingBottom: any;\n @Input() paddingLeft: any;\n @Input() borderWidth: any;\n @Input() width: any;\n @Input() height: any;\n\n @Input() units: string[] = [];\n @Input() defaultUnit = 'px';\n\n @Output() valueChange = new EventEmitter<BoxModelValues>();\n\n localMarginTop: any;\n localMarginRight: any;\n localMarginBottom: any;\n localMarginLeft: any;\n localPaddingTop: any;\n localPaddingRight: any;\n localPaddingBottom: any;\n localPaddingLeft: any;\n localBorderWidth: any;\n localWidth: any;\n localHeight: any;\n\n unit = 'px';\n\n private readonly fallbackUnits = ['px', '%', 'rem', 'em'];\n\n get unitOptions(): string[] {\n return this.units.length > 0 ? this.units : this.fallbackUnits;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['units'] || changes['defaultUnit']) {\n this.unit = this.resolveUnit();\n }\n if (changes['marginTop']) this.localMarginTop = this.marginTop;\n if (changes['marginRight']) this.localMarginRight = this.marginRight;\n if (changes['marginBottom']) this.localMarginBottom = this.marginBottom;\n if (changes['marginLeft']) this.localMarginLeft = this.marginLeft;\n if (changes['paddingTop']) this.localPaddingTop = this.paddingTop;\n if (changes['paddingRight']) this.localPaddingRight = this.paddingRight;\n if (changes['paddingBottom']) this.localPaddingBottom = this.paddingBottom;\n if (changes['paddingLeft']) this.localPaddingLeft = this.paddingLeft;\n if (changes['borderWidth']) this.localBorderWidth = this.borderWidth;\n if (changes['width']) this.localWidth = this.width;\n if (changes['height']) this.localHeight = this.height;\n }\n\n onUnitChange(value: string) {\n this.unit = value;\n }\n\n emitChange() {\n const values: BoxModelValues = {\n marginTop: this.normalizeValue(this.localMarginTop),\n marginRight: this.normalizeValue(this.localMarginRight),\n marginBottom: this.normalizeValue(this.localMarginBottom),\n marginLeft: this.normalizeValue(this.localMarginLeft),\n paddingTop: this.normalizeValue(this.localPaddingTop),\n paddingRight: this.normalizeValue(this.localPaddingRight),\n paddingBottom: this.normalizeValue(this.localPaddingBottom),\n paddingLeft: this.normalizeValue(this.localPaddingLeft),\n borderWidth: this.normalizeValue(this.localBorderWidth),\n width: this.normalizeValue(this.localWidth),\n height: this.normalizeValue(this.localHeight)\n };\n\n this.localMarginTop = values.marginTop;\n this.localMarginRight = values.marginRight;\n this.localMarginBottom = values.marginBottom;\n this.localMarginLeft = values.marginLeft;\n this.localPaddingTop = values.paddingTop;\n this.localPaddingRight = values.paddingRight;\n this.localPaddingBottom = values.paddingBottom;\n this.localPaddingLeft = values.paddingLeft;\n this.localBorderWidth = values.borderWidth;\n this.localWidth = values.width;\n this.localHeight = values.height;\n\n this.valueChange.emit(values);\n }\n\n private resolveUnit(): string {\n if (this.unitOptions.includes(this.unit)) return this.unit;\n if (this.unitOptions.includes(this.defaultUnit)) return this.defaultUnit;\n return this.unitOptions[0] || 'px';\n }\n\n private normalizeValue(value: any): any {\n if (value === null || value === undefined) return value;\n const trimmed = String(value).trim();\n if (!trimmed) return '';\n if (trimmed === 'auto') return 'auto';\n if (/[a-z%]/i.test(trimmed)) return trimmed;\n if (!/^-?\\d+(\\.\\d+)?$/.test(trimmed)) return trimmed;\n if (trimmed === '0') return '0';\n return this.unit ? `${trimmed}${this.unit}` : trimmed;\n }\n}\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiFieldWrapperComponent } from './ui-field-wrapper.component';\n\n@Component({\n selector: 'ui-dimension',\n standalone: true,\n imports: [CommonModule, FormsModule, UiFieldWrapperComponent],\n template: `\n <ui-field-wrapper [label]=\"label\" [hint]=\"hint\" [helpText]=\"helpText\">\n <div class=\"grid grid-cols-2 gap-2\">\n <div class=\"relative\">\n <label class=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-[11px] font-semibold text-gray-500\">W</label>\n <input class=\"w-full h-8 pl-6 pr-2 text-sm bg-white border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-blue-500 text-gray-800\"\n type=\"text\"\n [ngModel]=\"localWidth\"\n (ngModelChange)=\"onWidthChange($event)\"\n (blur)=\"emitChange()\">\n </div>\n <div class=\"relative\">\n <label class=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-[11px] font-semibold text-gray-500\">H</label>\n <input class=\"w-full h-8 pl-6 pr-2 text-sm bg-white border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-blue-500 text-gray-800\"\n type=\"text\"\n [ngModel]=\"localHeight\"\n (ngModelChange)=\"onHeightChange($event)\"\n (blur)=\"emitChange()\">\n </div>\n </div>\n </ui-field-wrapper>\n `\n})\nexport class UiDimensionComponent implements OnChanges {\n @Input() label = 'Size';\n @Input() hint = '';\n @Input() helpText = '';\n @Input() width: any;\n @Input() height: any;\n @Output() valueChange = new EventEmitter<{ width: any; height: any }>();\n\n // Local state to prevent ngModel conflicts with inputs\n localWidth: any;\n localHeight: any;\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['width']) this.localWidth = this.width;\n if (changes['height']) this.localHeight = this.height;\n }\n\n onWidthChange(value: any) {\n this.localWidth = value;\n }\n\n onHeightChange(value: any) {\n this.localHeight = value;\n }\n\n emitChange() {\n this.valueChange.emit({ width: this.localWidth, height: this.localHeight });\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiFieldWrapperComponent } from './ui-field-wrapper.component';\n\n@Component({\n selector: 'ui-edge-box',\n standalone: true,\n imports: [CommonModule, FormsModule, UiFieldWrapperComponent],\n template: `\n <ui-field-wrapper [label]=\"label\" [hint]=\"hint\" [helpText]=\"helpText\">\n <div class=\"relative w-28 h-28 bg-blue-50 rounded-md mx-auto\">\n <input class=\"absolute -top-6 left-1/2 -translate-x-1/2 w-12 h-6 text-center text-[11px] bg-white border border-gray-300 rounded\"\n type=\"number\" [(ngModel)]=\"top\" (ngModelChange)=\"emitChange()\">\n <input class=\"absolute -right-14 top-1/2 -translate-y-1/2 w-12 h-6 text-center text-[11px] bg-white border border-gray-300 rounded\"\n type=\"number\" [(ngModel)]=\"right\" (ngModelChange)=\"emitChange()\">\n <input class=\"absolute -bottom-6 left-1/2 -translate-x-1/2 w-12 h-6 text-center text-[11px] bg-white border border-gray-300 rounded\"\n type=\"number\" [(ngModel)]=\"bottom\" (ngModelChange)=\"emitChange()\">\n <input class=\"absolute -left-14 top-1/2 -translate-y-1/2 w-12 h-6 text-center text-[11px] bg-white border border-gray-300 rounded\"\n type=\"number\" [(ngModel)]=\"left\" (ngModelChange)=\"emitChange()\">\n <div class=\"absolute inset-3 border-2 border-dashed border-blue-300 rounded-sm\"></div>\n </div>\n </ui-field-wrapper>\n `\n})\nexport class UiEdgeBoxComponent {\n @Input() label = 'Spacing';\n @Input() hint = '';\n @Input() helpText = '';\n @Input() top: any;\n @Input() right: any;\n @Input() bottom: any;\n @Input() left: any;\n\n @Output() valueChange = new EventEmitter<{ top: any; right: any; bottom: any; left: any }>();\n\n emitChange() {\n this.valueChange.emit({\n top: this.top,\n right: this.right,\n bottom: this.bottom,\n left: this.left\n });\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiFieldWrapperComponent } from './ui-field-wrapper.component';\nimport { UiIconModule } from './ui-icon.module';\n\n@Component({\n selector: 'ui-color-swatch',\n standalone: true,\n imports: [CommonModule, FormsModule, UiFieldWrapperComponent, UiIconModule],\n template: `\n <ui-field-wrapper [label]=\"label\" [hint]=\"hint\" [helpText]=\"helpText\">\n <div class=\"flex items-center gap-2\">\n <div class=\"w-8 h-8 rounded-full border-2 border-gray-200 shadow-sm\" [style.background]=\"value || '#ffffff'\"></div>\n <div class=\"relative flex-1\">\n <input\n class=\"w-full h-9 pl-3 pr-8 text-sm bg-white border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-blue-500 text-gray-800\"\n type=\"text\"\n [(ngModel)]=\"value\"\n (ngModelChange)=\"valueChange.emit($event)\"\n (blur)=\"blur.emit()\"\n />\n <lucide-icon name=\"paintbrush\" class=\"w-4 h-4 absolute right-2 top-1/2 -translate-y-1/2 text-gray-400\"></lucide-icon>\n </div>\n <input type=\"color\" class=\"w-9 h-9 border border-gray-200 rounded cursor-pointer\"\n [(ngModel)]=\"value\" (ngModelChange)=\"valueChange.emit($event)\">\n </div>\n </ui-field-wrapper>\n `\n})\nexport class UiColorSwatchComponent {\n @Input() label = 'Color';\n @Input() hint = '';\n @Input() helpText = '';\n @Input() value: string = '#ffffff';\n @Output() valueChange = new EventEmitter<string>();\n @Output() blur = new EventEmitter<void>();\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiFieldWrapperComponent } from './ui-field-wrapper.component';\n\n@Component({\n selector: 'ui-range-number',\n standalone: true,\n imports: [CommonModule, FormsModule, UiFieldWrapperComponent],\n template: `\n <ui-field-wrapper [label]=\"label\" [hint]=\"hint\" [helpText]=\"helpText\">\n <div class=\"flex items-center gap-2\">\n <label class=\"w-4 text-xs text-gray-500\">{{ prefix }}</label>\n <input class=\"flex-1 h-1 accent-blue-500\" type=\"range\"\n [min]=\"min\" [max]=\"max\" [step]=\"step\"\n [(ngModel)]=\"value\"\n (ngModelChange)=\"emitChange()\">\n <input class=\"w-14 h-8 px-2 text-sm text-center bg-white border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-blue-500\"\n type=\"number\"\n [(ngModel)]=\"value\"\n (ngModelChange)=\"emitChange()\">\n </div>\n </ui-field-wrapper>\n `\n})\nexport class UiRangeNumberComponent {\n @Input() label = '';\n @Input() hint = '';\n @Input() helpText = '';\n @Input() prefix = '';\n @Input() min = -100;\n @Input() max = 100;\n @Input() step = 1;\n @Input() value: number = 0;\n @Output() valueChange = new EventEmitter<number>();\n\n emitChange() {\n this.valueChange.emit(this.value);\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UiFieldWrapperComponent } from './ui-field-wrapper.component';\nimport { UiIconModule } from './ui-icon.module';\n\nexport interface IconOption {\n label: string;\n value: any;\n icon?: string;\n}\n\n@Component({\n selector: 'ui-select-icon',\n standalone: true,\n imports: [CommonModule, UiFieldWrapperComponent, UiIconModule],\n template: `\n <ui-field-wrapper [label]=\"label\" [hint]=\"hint\" [helpText]=\"helpText\">\n <div class=\"flex items-center gap-2\">\n <button\n *ngFor=\"let opt of options\"\n type=\"button\"\n (click)=\"select(opt.value)\"\n class=\"flex items-center justify-center flex-1 h-8 rounded-md border text-gray-500 hover:text-gray-800 transition-colors\"\n [class.bg-blue-50]=\"value === opt.value\"\n [class.border-blue-400]=\"value === opt.value\"\n [class.border-gray-300]=\"value !== opt.value\"\n >\n <ng-container *ngIf=\"opt.icon; else textLabel\">\n <lucide-icon [name]=\"opt.icon!\" class=\"w-4 h-4\"></lucide-icon>\n </ng-container>\n <ng-template #textLabel>\n <span class=\"text-xs font-medium\">{{ opt.label }}</span>\n </ng-template>\n </button>\n </div>\n </ui-field-wrapper>\n `\n})\nexport class UiSelectIconComponent {\n @Input() label = '';\n @Input() hint = '';\n @Input() helpText = '';\n @Input() options: IconOption[] = [];\n @Input() value: any;\n @Output() valueChange = new EventEmitter<any>();\n\n select(val: any) {\n this.value = val;\n this.valueChange.emit(val);\n }\n}\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { PropertySection, PropertyField, PropertyFieldType } from '../../widgets/widget-definition';\nimport { DesignerContext } from '../designer-context.service';\nimport { FieldSchema } from '../../form-core/models';\nimport { UiFieldWrapperComponent } from '../../ui/ui-field-wrapper.component';\nimport { UiInputComponent } from '../../ui/ui-input.component';\nimport { UiBoxModelComponent } from '../../ui/ui-box-model.component';\nimport { UiDimensionComponent } from '../../ui/ui-dimension.component';\nimport { UiEdgeBoxComponent } from '../../ui/ui-edge-box.component';\nimport { UiColorSwatchComponent } from '../../ui/ui-color-swatch.component';\nimport { UiRangeNumberComponent } from '../../ui/ui-range-number.component';\nimport { UiSelectIconComponent } from '../../ui/ui-select-icon.component';\n\n@Component({\n selector: 'app-dynamic-properties',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n UiIconModule,\n UiFieldWrapperComponent,\n UiInputComponent,\n UiBoxModelComponent,\n UiDimensionComponent,\n UiEdgeBoxComponent,\n UiColorSwatchComponent,\n UiRangeNumberComponent,\n UiSelectIconComponent\n ],\n template: `\n <div class=\"dynamic-properties flex flex-col font-sans text-sm\">\n <ng-container *ngFor=\"let section of properties; let idx = index\">\n <div class=\"border-b border-gray-200 last:border-0\">\n <button type=\"button\" class=\"w-full flex items-center justify-between px-4 py-3 text-left\"\n (click)=\"toggleSection(section.label, idx)\">\n <span class=\"text-gray-800 text-sm font-semibold tracking-wide\">{{ section.label }}</span>\n <lucide-icon name=\"chevron-down\"\n class=\"w-4 h-4 text-gray-400 transition-transform duration-150\"\n [class.rotate-180]=\"isSectionOpen(section, idx)\"></lucide-icon>\n </button>\n <div *ngIf=\"isSectionOpen(section, idx)\" class=\"px-4 pb-4\">\n <div class=\"flex flex-col gap-3\">\n <ng-container *ngFor=\"let field of section.fields\">\n <ng-container *ngIf=\"!field.hiddenIf || !field.hiddenIf(config)\">\n\n <!-- Field Key (Name) -->\n <ui-field-wrapper *ngIf=\"isNameField(field)\" [label]=\"field.label || ''\" [helpText]=\"field.helpText || ''\">\n <input\n [ngModel]=\"nameDraft\"\n (ngModelChange)=\"onNameDraftChange($event)\"\n (blur)=\"commitNameField()\"\n [placeholder]=\"field.placeholder || ''\"\n class=\"w-full h-9 rounded-md border border-gray-300 px-3 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white transition-all\"\n [class.border-red-500]=\"!!nameError\"\n [class.ring-1]=\"!!nameError\"\n [class.ring-red-500]=\"!!nameError\">\n <p *ngIf=\"nameError\" class=\"text-[11px] text-red-600\">{{ nameError }}</p>\n </ui-field-wrapper>\n\n <!-- Group Key (Search Existing) -->\n <ui-field-wrapper *ngIf=\"isGroupKeyField(field)\" [label]=\"field.label || ''\" [helpText]=\"field.helpText || ''\">\n <input\n [ngModel]=\"getValue(field.key)\"\n (ngModelChange)=\"setValue(field.key, $event)\"\n (blur)=\"handleFieldChange()\"\n [placeholder]=\"field.placeholder || ''\"\n [attr.list]=\"getGroupKeyListId(field)\"\n class=\"w-full h-9 rounded-md border border-gray-300 px-3 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white transition-all\">\n <datalist [id]=\"getGroupKeyListId(field)\">\n <option *ngFor=\"let key of getGroupKeyOptions()\" [value]=\"key\"></option>\n </datalist>\n </ui-field-wrapper>\n\n <!-- Text / Number / Basic Inputs -->\n <ui-input\n *ngIf=\"isBasicInput(field.type) && !isNameField(field) && !isGroupKeyField(field)\"\n [label]=\"field.label || ''\"\n [placeholder]=\"field.placeholder || ''\"\n [type]=\"field.type === 'number' ? 'number' : 'text'\"\n [model]=\"getValue(field.key)\"\n (modelChange)=\"setValue(field.key, $event)\"\n (onBlur)=\"handleFieldChange()\"\n [min]=\"field.min\"\n [max]=\"field.max\"\n [step]=\"field.step\">\n </ui-input>\n\n <!-- Textarea -->\n <ui-field-wrapper *ngIf=\"field.type === 'textarea'\" [label]=\"field.label || ''\" [helpText]=\"field.helpText || ''\">\n <textarea [ngModel]=\"getValue(field.key)\"\n (ngModelChange)=\"setValue(field.key, $event)\"\n (blur)=\"handleFieldChange()\"\n [placeholder]=\"field.placeholder || ''\"\n rows=\"3\"\n class=\"w-full rounded-md border border-gray-300 bg-white p-3 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none transition-all\"></textarea>\n </ui-field-wrapper>\n\n <!-- Select -->\n <ui-field-wrapper *ngIf=\"field.type === 'select'\" [label]=\"field.label || ''\" [helpText]=\"field.helpText || ''\">\n <div class=\"relative\">\n <select [ngModel]=\"getValue(field.key)\"\n (ngModelChange)=\"setValue(field.key, $event); handleFieldChange()\"\n class=\"h-10 w-full rounded-md border border-gray-300 bg-white pl-3 pr-8 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none appearance-none transition-all\">\n <option *ngFor=\"let opt of field.options || []\" [value]=\"opt.value\">{{opt.label}}</option>\n </select>\n <lucide-icon name=\"chevron-down\" class=\"absolute right-2 top-3 w-4 h-4 text-gray-400 pointer-events-none\"></lucide-icon>\n </div>\n </ui-field-wrapper>\n\n <!-- Checkbox -->\n <div *ngIf=\"field.type === 'checkbox'\" class=\"w-full flex items-center gap-2\">\n <input type=\"checkbox\"\n [id]=\"field.key\"\n [ngModel]=\"getValue(field.key)\"\n (ngModelChange)=\"setValue(field.key, $event); handleFieldChange()\"\n class=\"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500\">\n <label [for]=\"field.key\" class=\"text-sm text-gray-700 select-none cursor-pointer\">{{field.label}}</label>\n </div>\n\n <!-- Toggle -->\n <div *ngIf=\"field.type === 'slide-toggle'\" class=\"w-full flex items-center justify-between\">\n <span class=\"text-sm text-gray-700 font-medium\">{{field.label}}</span>\n <label class=\"relative inline-flex items-center cursor-pointer\">\n <input type=\"checkbox\" [ngModel]=\"getValue(field.key)\" (ngModelChange)=\"setValue(field.key, $event); handleFieldChange()\" class=\"sr-only peer\">\n <div class=\"w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-blue-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-blue-600\"></div>\n </label>\n </div>\n\n <!-- Color / Color Swatch -->\n <ui-color-swatch\n *ngIf=\"field.type === 'color' || field.type === 'color-swatch'\"\n [label]=\"field.label || ''\"\n [helpText]=\"field.helpText || ''\"\n [value]=\"getValue(field.key) || '#ffffff'\"\n (valueChange)=\"setValue(field.key, $event); handleFieldChange()\"\n (blur)=\"handleFieldChange()\">\n </ui-color-swatch>\n\n <!-- Options Editor -->\n <ui-field-wrapper *ngIf=\"field.type === 'options-editor'\" [label]=\"field.label || ''\" [helpText]=\"field.helpText || ''\">\n <div class=\"w-full border border-gray-200 rounded-lg p-3 bg-gray-50\">\n <div class=\"flex items-center justify-between mb-3\">\n <span class=\"text-xs font-semibold text-gray-600 uppercase\">{{field.label}}</span>\n <button type=\"button\"\n (click)=\"addOption(field.key)\"\n class=\"text-xs px-2 py-1 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\">\n + Add\n </button>\n </div>\n <div class=\"space-y-2\">\n <div *ngFor=\"let opt of getValue(field.key) || []; let i = index\" class=\"flex items-center gap-2\">\n <input type=\"text\"\n [(ngModel)]=\"opt.label\"\n (blur)=\"handleFieldChange()\"\n placeholder=\"Label\"\n class=\"flex-1 h-8 px-2 text-sm rounded border border-gray-300 bg-white focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <input type=\"text\"\n [(ngModel)]=\"opt.value\"\n (blur)=\"handleFieldChange()\"\n placeholder=\"Value\"\n class=\"flex-1 h-8 px-2 text-sm rounded border border-gray-300 bg-white focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <button type=\"button\"\n (click)=\"removeOption(field.key, i)\"\n class=\"w-8 h-8 flex items-center justify-center text-red-600 hover:bg-red-50 rounded transition-colors\">\n <lucide-icon name=\"x\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n </div>\n </div>\n </ui-field-wrapper>\n\n <!-- Validators Editor -->\n <ui-field-wrapper *ngIf=\"field.type === 'validators-editor'\" [label]=\"field.label || ''\" [helpText]=\"field.helpText || ''\">\n <div class=\"w-full border border-gray-200 rounded-lg p-3 bg-gray-50\">\n <div class=\"flex items-center justify-between mb-3\">\n <span class=\"text-xs font-semibold text-gray-600 uppercase\">{{field.label}}</span>\n <button type=\"button\"\n (click)=\"addValidator(field.key)\"\n class=\"text-xs px-2 py-1 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\">\n + Add Rule\n </button>\n </div>\n <div class=\"space-y-2\">\n <div *ngFor=\"let val of getValue(field.key) || []; let i = index\" class=\"flex items-center gap-2 p-2 bg-white rounded border border-gray-200\">\n <select [(ngModel)]=\"val.type\"\n (ngModelChange)=\"handleFieldChange()\"\n class=\"flex-1 h-8 px-2 text-sm rounded border border-gray-300 bg-white focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <option value=\"required\">Required</option>\n <option value=\"email\">Email</option>\n <option value=\"min\">Min Value</option>\n <option value=\"max\">Max Value</option>\n <option value=\"minLength\">Min Length</option>\n <option value=\"maxLength\">Max Length</option>\n <option value=\"pattern\">Pattern</option>\n </select>\n <input *ngIf=\"val.type !== 'required' && val.type !== 'email'\"\n type=\"text\"\n [(ngModel)]=\"val.value\"\n (blur)=\"handleFieldChange()\"\n placeholder=\"Value\"\n class=\"flex-1 h-8 px-2 text-sm rounded border border-gray-300 bg-white focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <button type=\"button\"\n (click)=\"removeValidator(field.key, i)\"\n class=\"w-8 h-8 flex items-center justify-center text-red-600 hover:bg-red-50 rounded transition-colors\">\n <lucide-icon name=\"x\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n </div>\n </div>\n </ui-field-wrapper>\n\n <!-- Conditional Editor -->\n <ui-field-wrapper *ngIf=\"field.type === 'conditional-editor'\" [label]=\"field.label || ''\" [helpText]=\"field.helpText || ''\">\n <div class=\"w-full border border-gray-200 rounded-lg p-3 bg-gray-50\">\n <div class=\"flex flex-col gap-2\">\n <select [ngModel]=\"getValue(field.key + '.type')\"\n (ngModelChange)=\"setValue(field.key + '.type', $event); handleFieldChange()\"\n class=\"h-8 px-2 text-sm rounded border border-gray-300 bg-white focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <option value=\"always\">Always Visible</option>\n <option value=\"equals\">Field Equals</option>\n <option value=\"notEquals\">Field Not Equals</option>\n </select>\n <div *ngIf=\"getValue(field.key + '.type') !== 'always'\" class=\"flex gap-2\">\n <input type=\"text\"\n [ngModel]=\"getValue(field.key + '.field')\"\n (ngModelChange)=\"setValue(field.key + '.field', $event)\"\n (blur)=\"handleFieldChange()\"\n placeholder=\"Field Name\"\n class=\"flex-1 h-8 px-2 text-sm rounded border border-gray-300 bg-white focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <input type=\"text\"\n [ngModel]=\"getValue(field.key + '.value')\"\n (ngModelChange)=\"setValue(field.key + '.value', $event)\"\n (blur)=\"handleFieldChange()\"\n placeholder=\"Value\"\n class=\"flex-1 h-8 px-2 text-sm rounded border border-gray-300 bg-white focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n </div>\n </div>\n <div *ngIf=\"getValue(field.key + '.type') === 'always'\" class=\"text-xs text-gray-400 mt-2\">\n Field always visible.\n </div>\n </div>\n </ui-field-wrapper>\n\n <!-- Field Reference -->\n <ui-field-wrapper *ngIf=\"field.type === 'field-reference'\" [label]=\"field.label || ''\" [helpText]=\"field.helpText || ''\">\n <select\n class=\"h-9 w-full rounded-md border border-gray-300 pl-3 pr-8 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\"\n [ngModel]=\"getValue(field.key) || ''\"\n (ngModelChange)=\"setValue(field.key, $event); handleFieldChange()\">\n <option value=\"\">None</option>\n <option *ngFor=\"let f of getFieldReferenceCandidates(field)\" [ngValue]=\"f.id\">\n {{ f.label || f.name }} ({{ f.type }})\n </option>\n </select>\n </ui-field-wrapper>\n\n <!-- Dimension Field (W×H pair) -->\n <ui-dimension\n *ngIf=\"field.type === 'dimension'\"\n [label]=\"field.label || ''\"\n [hint]=\"field.hint || ''\"\n [helpText]=\"field.helpText || ''\"\n [width]=\"getValue(getDimensionPaths(field)[0])\"\n [height]=\"getValue(getDimensionPaths(field)[1])\"\n (valueChange)=\"onDimensionChange(field, $event)\">\n </ui-dimension>\n\n <!-- Range-Number Field (Slider + Input) -->\n <ui-range-number\n *ngIf=\"field.type === 'range-number'\"\n [label]=\"field.label || ''\"\n [hint]=\"field.hint || ''\"\n [helpText]=\"field.helpText || ''\"\n [min]=\"field.min ?? 0\"\n [max]=\"field.max ?? 100\"\n [step]=\"field.step ?? 1\"\n [value]=\"getValue(field.key) || 0\"\n (valueChange)=\"setValue(field.key, $event); handleFieldChange()\">\n </ui-range-number>\n\n <!-- Select-Icon Field (Icon-based button group) -->\n <ui-select-icon\n *ngIf=\"field.type === 'select-icon'\"\n [label]=\"field.label || ''\"\n [hint]=\"field.hint || ''\"\n [helpText]=\"field.helpText || ''\"\n [options]=\"field.options || []\"\n [value]=\"getValue(field.key)\"\n (valueChange)=\"setValue(field.key, $event); handleFieldChange()\">\n </ui-select-icon>\n\n <!-- Edge-Box Field (Visual 4-sided spacing editor) -->\n <ui-edge-box\n *ngIf=\"field.type === 'edge-box'\"\n [label]=\"field.label || ''\"\n [hint]=\"field.hint || ''\"\n [helpText]=\"field.helpText || ''\"\n [top]=\"getValue(getEdgePaths(field).top)\"\n [right]=\"getValue(getEdgePaths(field).right)\"\n [bottom]=\"getValue(getEdgePaths(field).bottom)\"\n [left]=\"getValue(getEdgePaths(field).left)\"\n (valueChange)=\"onEdgeChange(field, $event)\">\n </ui-edge-box>\n\n <!-- Box Model Field (Margin/Padding/Border/Size) -->\n <ui-box-model\n *ngIf=\"field.type === 'box-model'\"\n [label]=\"field.label || ''\"\n [hint]=\"field.hint || ''\"\n [helpText]=\"field.helpText || ''\"\n [marginTop]=\"getValue(getBoxModelPath(field, 'marginTop'))\"\n [marginRight]=\"getValue(getBoxModelPath(field, 'marginRight'))\"\n [marginBottom]=\"getValue(getBoxModelPath(field, 'marginBottom'))\"\n [marginLeft]=\"getValue(getBoxModelPath(field, 'marginLeft'))\"\n [paddingTop]=\"getValue(getBoxModelPath(field, 'paddingTop'))\"\n [paddingRight]=\"getValue(getBoxModelPath(field, 'paddingRight'))\"\n [paddingBottom]=\"getValue(getBoxModelPath(field, 'paddingBottom'))\"\n [paddingLeft]=\"getValue(getBoxModelPath(field, 'paddingLeft'))\"\n [borderWidth]=\"getValue(getBoxModelPath(field, 'borderWidth'))\"\n [width]=\"getValue(getBoxModelPath(field, 'width'))\"\n [height]=\"getValue(getBoxModelPath(field, 'height'))\"\n [units]=\"field.allowedUnits || []\"\n (valueChange)=\"onBoxModelChange(field, $event)\">\n </ui-box-model>\n\n <!-- Custom Component Field -->\n <div *ngIf=\"field.type === 'custom' && field.customComponent\" class=\"w-full\">\n <ng-container *ngComponentOutlet=\"field.customComponent; inputs: buildCustomInputs(field)\">\n </ng-container>\n </div>\n\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n `,\n styles: []\n})\nexport class DynamicPropertiesComponent implements OnChanges {\n @Input() onPropertyChange?: () => void;\n\n private readonly designerCtx = inject(DesignerContext);\n\n get properties(): PropertySection[] {\n if (!this.config) return [];\n // Prefer widgetId when available to disambiguate plugin widgets\n const def = this.config.widgetId\n ? this.designerCtx.getWidgetDefinitionById(this.config.widgetId)\n : this.designerCtx.getWidgetDefinition(this.config.type);\n let sections = def?.properties || [];\n if (this.includeSections?.length) {\n sections = sections.filter(section => this.includeSections?.includes(section.label));\n }\n if (this.excludeSections?.length) {\n sections = sections.filter(section => !this.excludeSections?.includes(section.label));\n }\n return sections;\n }\n\n getFieldReferenceCandidates(field: PropertyField): FieldSchema[] {\n const all = this.designerCtx.getFields();\n const allowed = field.allowedFieldTypes;\n const includeSelf = field.includeSelf === true;\n const currentId = this.config?.id;\n\n return all.filter(f => {\n if (!includeSelf && currentId && f.id === currentId) return false;\n if (allowed && allowed.length > 0 && !allowed.includes(f.type)) return false;\n return true;\n });\n }\n\n @Input() config: any;\n @Input() includeSections: string[] | null = null;\n @Input() excludeSections: string[] | null = null;\n // @Input() properties: PropertySection[] = []; // Replaced by getter\n @Input() allFields: FieldSchema[] = []; // List of all fields for conditional logic\n @Output() configChange = new EventEmitter<any>();\n\n openSections: { [key: string]: boolean } = {};\n nameDraft = '';\n nameError = '';\n private nameDraftDirty = false;\n private lastConfigId: string | null = null;\n private lastConfigName = '';\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config']) {\n const nextId = this.config?.id ?? null;\n const nextName = this.config?.name ?? '';\n const idChanged = nextId !== this.lastConfigId;\n const nameChanged = nextName !== this.lastConfigName;\n\n if (idChanged || nameChanged || !this.nameDraftDirty) {\n this.nameDraft = nextName;\n this.nameDraftDirty = false;\n this.nameError = this.getNameError(nextName);\n }\n\n this.lastConfigId = nextId;\n this.lastConfigName = nextName;\n }\n\n if (changes['config'] || changes['includeSections'] || changes['excludeSections'] || !this.openSections) {\n this.openSections = {};\n // Default open first section (or ones explicitly flagged as expanded)\n if (this.properties.length > 0 && Object.keys(this.openSections).length === 0) {\n this.properties.forEach((section, index) => {\n this.openSections[section.label] = section.expanded ?? index === 0;\n });\n }\n }\n }\n\n isSectionOpen(section: PropertySection, index: number): boolean {\n const current = this.openSections[section.label];\n if (typeof current === 'boolean') return current;\n return section.expanded ?? index === 0;\n }\n\n toggleSection(label: string, index: number) {\n const current = this.openSections[label];\n if (typeof current === 'boolean') {\n this.openSections[label] = !current;\n } else {\n this.openSections[label] = !(index === 0);\n }\n }\n\n // Helper to get deep value (e.g. style.width)\n getValue(key: string): any {\n // simple path accessor\n return key.split('.').reduce((o, i) => o ? o[i] : undefined, this.config);\n }\n\n // Helper to set deep value\n setValue(key: string, value: any) {\n // simple path setter\n const parts = key.split('.');\n let obj = { ...this.config };\n let ptr = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n ptr[parts[i]] = { ...ptr[parts[i]] }; // shallow copy path\n ptr = ptr[parts[i]];\n }\n ptr[parts[parts.length - 1]] = value;\n\n // Update local reference so getValue reads the new values\n this.config = obj;\n this.configChange.emit(obj);\n }\n\n isBasicInput(type: PropertyFieldType): boolean {\n return ['text', 'number', 'password', 'email', 'url'].includes(type as string);\n }\n\n isNameField(field: PropertyField): boolean {\n return field.key === 'name' && this.isBasicInput(field.type);\n }\n\n isGroupKeyField(field: PropertyField): boolean {\n return field.key === 'groupKey' && field.type === 'text';\n }\n\n onNameDraftChange(value: string) {\n this.nameDraft = value;\n this.nameDraftDirty = true;\n this.nameError = this.getNameError(value);\n }\n\n commitNameField() {\n const next = this.nameDraft.trim();\n const error = this.getNameError(next);\n this.nameError = error;\n if (error) return;\n this.nameDraftDirty = false;\n this.setValue('name', next);\n this.handleFieldChange();\n }\n\n getGroupKeyOptions(): string[] {\n const keys = new Set<string>();\n this.getAllFields().forEach(field => {\n const key = field.groupKey?.trim();\n if (key) keys.add(key);\n });\n return Array.from(keys).sort();\n }\n\n getGroupKeyListId(field: PropertyField): string {\n const id = this.config?.id ?? 'global';\n return `${field.key}-options-${id}`;\n }\n\n private getNameError(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return '';\n const currentId = this.config?.id;\n const duplicate = this.getAllFields().some(field => field.id !== currentId && field.name === trimmed);\n if (duplicate) {\n return `Field key \"${trimmed}\" is already in use.`;\n }\n return '';\n }\n\n private getAllFields(): FieldSchema[] {\n return this.allFields?.length ? this.allFields : this.designerCtx.getFields();\n }\n\n private getSafeOptionValue(field: PropertyField, index: number): string | undefined {\n return field.options && field.options[index] ? field.options[index].value : undefined;\n }\n\n getDimensionPaths(field: PropertyField): [string, string] {\n const widthPath = this.getSafeOptionValue(field, 0)\n || (field.key.includes('width') ? field.key : `${field.key}.width`);\n const heightPath = this.getSafeOptionValue(field, 1)\n || (field.key.includes('height') ? field.key.replace('width', 'height') : `${field.key}.height`);\n return [widthPath, heightPath];\n }\n\n onDimensionChange(field: PropertyField, value: { width: any; height: any }) {\n const [wPath, hPath] = this.getDimensionPaths(field);\n\n // Batch update: set both values at once to avoid double emission\n const parts = wPath.split('.');\n let obj = { ...this.config };\n let ptr = obj;\n\n // Navigate to parent object\n for (let i = 0; i < parts.length - 1; i++) {\n ptr[parts[i]] = { ...ptr[parts[i]] };\n ptr = ptr[parts[i]];\n }\n\n // Set both values\n const wKey = wPath.split('.').pop()!;\n const hKey = hPath.split('.').pop()!;\n\n ptr[wKey] = value.width;\n ptr[hKey] = value.height;\n\n // Single emission\n this.config = obj;\n this.configChange.emit(obj);\n this.handleFieldChange();\n }\n\n getBoxModelPath(field: PropertyField, key: string): string {\n const base = field.key || 'style';\n return `${base}.${key}`;\n }\n\n onBoxModelChange(field: PropertyField, value: {\n marginTop?: any;\n marginRight?: any;\n marginBottom?: any;\n marginLeft?: any;\n paddingTop?: any;\n paddingRight?: any;\n paddingBottom?: any;\n paddingLeft?: any;\n borderWidth?: any;\n width?: any;\n height?: any;\n }) {\n const updates: Record<string, any> = {\n [this.getBoxModelPath(field, 'marginTop')]: value.marginTop,\n [this.getBoxModelPath(field, 'marginRight')]: value.marginRight,\n [this.getBoxModelPath(field, 'marginBottom')]: value.marginBottom,\n [this.getBoxModelPath(field, 'marginLeft')]: value.marginLeft,\n [this.getBoxModelPath(field, 'paddingTop')]: value.paddingTop,\n [this.getBoxModelPath(field, 'paddingRight')]: value.paddingRight,\n [this.getBoxModelPath(field, 'paddingBottom')]: value.paddingBottom,\n [this.getBoxModelPath(field, 'paddingLeft')]: value.paddingLeft,\n [this.getBoxModelPath(field, 'borderWidth')]: value.borderWidth,\n [this.getBoxModelPath(field, 'width')]: value.width,\n [this.getBoxModelPath(field, 'height')]: value.height\n };\n\n this.setValues(updates);\n this.handleFieldChange();\n }\n\n getEdgePaths(field: PropertyField): { top: string; right: string; bottom: string; left: string } {\n return {\n top: this.getSafeOptionValue(field, 0) || `${field.key}Top`,\n right: this.getSafeOptionValue(field, 1) || `${field.key}Right`,\n bottom: this.getSafeOptionValue(field, 2) || `${field.key}Bottom`,\n left: this.getSafeOptionValue(field, 3) || `${field.key}Left`\n };\n }\n\n onEdgeChange(field: PropertyField, value: { top: any; right: any; bottom: any; left: any }) {\n const paths = this.getEdgePaths(field);\n this.setValue(paths.top, value.top);\n this.setValue(paths.right, value.right);\n this.setValue(paths.bottom, value.bottom);\n this.setValue(paths.left, value.left);\n this.handleFieldChange();\n }\n\n // Internal method called when a field changes\n // Note: setValue() already emits configChange, so we just call onPropertyChange here\n handleFieldChange() {\n if (this.onPropertyChange) {\n this.onPropertyChange();\n }\n }\n\n buildCustomInputs(field: PropertyField) {\n return {\n config: this.config,\n getValue: (path: string) => this.getValue(path),\n setValue: (path: string, value: any) => {\n this.setValue(path, value);\n this.handleFieldChange(); // Trigger change detection\n },\n onChange: () => this.handleFieldChange(),\n ...(field.customInputs || {})\n };\n }\n\n private setValues(values: Record<string, any>) {\n let obj = { ...this.config };\n Object.entries(values).forEach(([path, value]) => {\n if (!path) return;\n const parts = path.split('.');\n let ptr = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n ptr[parts[i]] = { ...ptr[parts[i]] };\n ptr = ptr[parts[i]];\n }\n ptr[parts[parts.length - 1]] = value;\n });\n\n this.config = obj;\n this.configChange.emit(obj);\n }\n\n // Options editor methods\n addOption(path: string) {\n const options = this.getValue(path) || [];\n options.push({\n label: `Option ${options.length + 1}`,\n value: `option${options.length + 1}`\n });\n this.setValue(path, options);\n this.handleFieldChange();\n }\n\n removeOption(path: string, index: number) {\n const options = this.getValue(path) || [];\n options.splice(index, 1);\n this.setValue(path, options);\n this.handleFieldChange();\n }\n\n updateOption(path: string, index: number, field: string, value: any) {\n const options = this.getValue(path) || [];\n if (options[index]) {\n options[index][field] = value;\n this.setValue(path, options);\n }\n }\n\n // Validators editor methods\n addValidator(path: string) {\n const validators = this.getValue(path) || [];\n validators.push({\n name: 'required',\n message: 'This field is required'\n });\n this.setValue(path, validators);\n this.handleFieldChange();\n }\n\n removeValidator(path: string, index: number) {\n const validators = this.getValue(path) || [];\n validators.splice(index, 1);\n this.setValue(path, validators);\n this.handleFieldChange();\n }\n\n updateValidator(path: string, index: number, field: string, value: any) {\n const validators = this.getValue(path) || [];\n if (validators[index]) {\n validators[index][field] = value;\n // Set default message if name changes\n if (field === 'name') {\n const messages: any = {\n required: 'This field is required',\n min: 'Value is too small',\n max: 'Value is too large',\n minLength: 'Too short',\n maxLength: 'Too long',\n pattern: 'Invalid format',\n email: 'Invalid email'\n };\n validators[index].message = messages[value] || 'Invalid value';\n }\n this.setValue(path, validators);\n }\n }\n\n getValidatorLabel(name: string): string {\n const labels: any = {\n required: 'Required',\n min: 'Minimum Value',\n max: 'Maximum Value',\n minLength: 'Min Length',\n maxLength: 'Max Length',\n pattern: 'Regex Pattern',\n email: 'Email Address'\n };\n return labels[name] || name;\n }\n\n // Conditional Logic Methods\n enableConditional(path: string) {\n this.setValue(path, {\n action: 'visible',\n operator: 'eq'\n });\n }\n\n disableConditional(path: string) {\n this.setValue(path, null);\n }\n\n updateConditional(path: string, field: string, value: any) {\n const condition = this.getValue(path) || {};\n condition[field] = value;\n this.setValue(path, condition);\n }\n}\n","\n/**\n * Defines a global data source available in the application.\n */\nexport interface DataSourceDefinition {\n id: string; // e.g. \"countries\", \"geo.country_state_city\"\n label: string; // Display name in UI\n type: 'csv' | 'excel' | 'json' | 'api'; // Storage / connector type\n version?: string; // Optional version for backend tracking\n description?: string;\n tags?: string[];\n\n // Shape of the data (optional, can be inferred later)\n schema?: Record<string, 'string' | 'number' | 'boolean' | 'date' | 'any'>;\n\n // Connection details (only one of these may be used depending on type)\n url?: string; // For hosted CSV/JSON/API\n fileId?: string; // For uploaded files handled by host app\n resultPath?: string; // For JSON/API (e.g. \"data.items\")\n\n // Default label/value mapping for list consumers\n labelKey?: string;\n valueKey?: string;\n}\n\n/**\n * Abstract contract for a global data catalog.\n * Implementation will live in the host app or a future adapter.\n */\nexport abstract class DataCatalog {\n /**\n * Return all registered data sources available to the designer/runtime.\n */\n abstract listSources(): DataSourceDefinition[];\n\n /**\n * Look up a single data source by its ID.\n */\n abstract getSourceById(id: string): DataSourceDefinition | undefined;\n\n /**\n * Return all rows for a given source ID.\n * Implementation can fetch from memory, storage, or a backend in the host app.\n */\n abstract getRows(id: string): any[];\n\n /**\n * Optional: Add or update a data source.\n */\n abstract upsert?(def: DataSourceDefinition, rows: any[]): void;\n\n /**\n * Optional: Remove a data source.\n */\n abstract remove?(id: string): void;\n}\n","\nimport { Injectable, InjectionToken, inject } from '@angular/core';\nimport { DataCatalog, DataSourceDefinition } from './data-catalog';\n\nexport interface DataSourceColumn {\n name: string;\n type?: string;\n}\n\nexport interface DataSourceQueryFilter {\n column: string;\n op: 'eq' | 'neq' | 'in' | 'contains' | 'startsWith' | 'endsWith' | 'gt' | 'gte' | 'lt' | 'lte' | 'like';\n value: any;\n}\n\nexport interface DataSourceQuery {\n select?: string[];\n filters?: DataSourceQueryFilter[];\n search?: {\n term: string;\n columns?: string[];\n };\n sort?: {\n column: string;\n dir: 'asc' | 'desc';\n }[];\n page?: {\n limit?: number;\n offset?: number;\n };\n}\n\nexport interface DataSourceQueryResult {\n rows: any[];\n total: number;\n}\n\nexport type UploadSourceType = 'json' | 'csv';\n\nexport interface CreateSourceRequest {\n id?: string;\n label?: string;\n type: UploadSourceType;\n rawData: string;\n}\n\nexport interface DataSourceClient {\n listSources(): Promise<DataSourceDefinition[]>;\n getSourceById(id: string): Promise<DataSourceDefinition | undefined>;\n getColumns(id: string): Promise<DataSourceColumn[]>;\n query(id: string, q?: DataSourceQuery): Promise<DataSourceQueryResult>;\n\n // Admin API (Optional)\n createSource?(req: CreateSourceRequest): Promise<DataSourceDefinition>;\n deleteSource?(sourceId: string): Promise<void>;\n}\n\nexport const DATA_SOURCE_CLIENT = new InjectionToken<DataSourceClient>('DATA_SOURCE_CLIENT');\n\n@Injectable({ providedIn: 'root' })\nexport class DefaultDataSourceClient implements DataSourceClient {\n private catalog = inject(DataCatalog, { optional: true });\n\n async listSources(): Promise<DataSourceDefinition[]> {\n return this.catalog ? this.catalog.listSources() : [];\n }\n\n async getSourceById(id: string): Promise<DataSourceDefinition | undefined> {\n return this.catalog ? this.catalog.getSourceById(id) : undefined;\n }\n\n async getColumns(id: string): Promise<DataSourceColumn[]> {\n const source = await this.getSourceById(id);\n if (!source || !this.catalog) return [];\n\n // Prefer schema if available\n if (source.schema) {\n return Object.keys(source.schema).map(key => ({\n name: key,\n type: source.schema![key]\n }));\n }\n\n // Infer from first 50 rows\n const rows = this.catalog.getRows(id).slice(0, 50);\n const keys = new Set<string>();\n rows.forEach(r => Object.keys(r).forEach(k => keys.add(k)));\n\n return Array.from(keys).map(k => ({ name: k }));\n }\n\n async query(id: string, q?: DataSourceQuery): Promise<DataSourceQueryResult> {\n if (!this.catalog) return { rows: [], total: 0 };\n\n let rows = [...this.catalog.getRows(id)];\n\n // Filters\n if (q?.filters?.length) {\n rows = rows.filter(row => {\n return q.filters!.every(f => {\n const actual = row[f.column];\n const val = f.value;\n\n switch (f.op) {\n case 'eq': return actual === val;\n case 'neq': return actual !== val;\n case 'in': return Array.isArray(val) ? val.includes(actual) : actual === val;\n\n // String Ops (Case Insensitive)\n case 'contains':\n case 'like':\n return String(actual ?? '').toLowerCase().includes(String(val ?? '').toLowerCase());\n case 'startsWith':\n return String(actual ?? '').toLowerCase().startsWith(String(val ?? '').toLowerCase());\n case 'endsWith':\n return String(actual ?? '').toLowerCase().endsWith(String(val ?? '').toLowerCase());\n\n // Comparison Ops (Numeric preferred, string fallback)\n case 'gt': return (actual ?? 0) > (val ?? 0);\n case 'gte': return (actual ?? 0) >= (val ?? 0);\n case 'lt': return (actual ?? 0) < (val ?? 0);\n case 'lte': return (actual ?? 0) <= (val ?? 0);\n\n default: return true;\n }\n });\n });\n }\n\n // Search\n if (q?.search?.term) {\n const term = q.search.term.toLowerCase();\n const cols = q.search.columns || (rows.length > 0 ? Object.keys(rows[0]) : []);\n rows = rows.filter(row => {\n return cols.some(c => String(row[c] ?? '').toLowerCase().includes(term));\n });\n }\n\n const total = rows.length;\n\n // Sort\n if (q?.sort?.length) {\n rows.sort((a, b) => {\n for (const s of q.sort!) {\n const valA = a[s.column];\n const valB = b[s.column];\n if (valA === valB) continue;\n const result = valA < valB ? -1 : 1;\n return s.dir === 'asc' ? result : -result;\n }\n return 0;\n });\n }\n\n // Paging\n if (q?.page) {\n const offset = q.page.offset || 0;\n const limit = q.page.limit || rows.length;\n rows = rows.slice(offset, offset + limit);\n }\n\n // Select\n if (q?.select?.length) {\n rows = rows.map(r => {\n const newRow: any = {};\n q.select!.forEach(k => newRow[k] = r[k]);\n return newRow;\n });\n }\n\n return { rows, total };\n }\n\n async createSource(req: CreateSourceRequest): Promise<DataSourceDefinition> {\n if (!this.catalog) {\n throw new Error('No DataCatalog available for in-memory creation.');\n }\n if (!this.catalog.upsert) {\n throw new Error('DataCatalog does not support updates.');\n }\n\n const { parseJsonArray, parseCsv, inferSchema, slugifyId } = await import('./data-source-parsers');\n\n let rows: any[] = [];\n if (req.type === 'json') {\n rows = parseJsonArray(req.rawData);\n } else {\n rows = parseCsv(req.rawData);\n }\n\n const id = req.id || slugifyId(req.label || 'source');\n const schema = inferSchema(rows);\n\n const def: DataSourceDefinition = {\n id,\n label: req.label || id,\n type: req.type,\n schema\n };\n\n this.catalog.upsert(def, rows);\n return def;\n }\n\n async deleteSource(sourceId: string): Promise<void> {\n if (!this.catalog) {\n throw new Error('No DataCatalog available.');\n }\n if (!this.catalog.remove) {\n throw new Error('DataCatalog does not support removal.');\n }\n this.catalog.remove(sourceId);\n }\n}\n","import { DataSourceDefinition } from './data-catalog';\n\nexport function parseJsonArray(raw: string): any[] {\n let parsed: any;\n try {\n parsed = JSON.parse(raw);\n } catch (e) {\n throw new Error('Invalid JSON format.');\n }\n\n if (!Array.isArray(parsed)) {\n throw new Error('JSON data must be an array of objects.');\n }\n return parsed;\n}\n\nexport function parseCsv(raw: string): any[] {\n const lines = raw.split(/\\r?\\n/).map(l => l.trim()).filter(Boolean);\n if (lines.length < 2) {\n throw new Error('CSV must have a header row and at least one data row.');\n }\n\n // Basic CSV splitting that handles simple quoted values (e.g. \"Values, with, commas\")\n // Note: This is not a full RFC 4180 parser but sufficient for basic needs.\n const splitLine = (line: string): string[] => {\n const result: string[] = [];\n let current = '';\n let inQuote = false;\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n if (char === '\"') {\n inQuote = !inQuote;\n } else if (char === ',' && !inQuote) {\n result.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n result.push(current.trim());\n return result.map(v => v.replace(/^\"|\"$/g, '')); // Strip surrounding quotes\n };\n\n const headers = splitLine(lines[0]);\n const rows: any[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const cols = splitLine(lines[i]);\n if (cols.length === headers.length || (cols.length === 1 && cols[0] === '')) {\n // Basic row validation\n const row: any = {};\n headers.forEach((h, idx) => {\n row[h] = cols[idx];\n });\n rows.push(row);\n }\n }\n return rows;\n}\n\nexport function inferSchema(rows: any[]): DataSourceDefinition['schema'] {\n if (!rows.length) return {};\n\n const schema: Record<string, 'string' | 'number' | 'boolean'> = {};\n const sample = rows.slice(0, 10); // Check first 10 rows\n const keys = Object.keys(rows[0]);\n\n keys.forEach(key => {\n // Detect type based on consensus\n let isNumber = true;\n let isBoolean = true;\n\n for (const row of sample) {\n const val = row[key];\n if (val === undefined || val === null || val === '') continue;\n\n if (isBoolean && typeof val !== 'boolean' && val !== 'true' && val !== 'false') {\n isBoolean = false;\n }\n\n if (isNumber) {\n if (typeof val === 'number') continue;\n if (typeof val === 'string' && !isNaN(parseFloat(val)) && isFinite(Number(val))) continue;\n isNumber = false;\n }\n }\n\n if (isBoolean) {\n schema[key] = 'boolean';\n } else if (isNumber) {\n schema[key] = 'number';\n } else {\n schema[key] = 'string';\n }\n });\n\n return schema;\n}\n\nexport function slugifyId(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '');\n}\n","import { Component, EventEmitter, Output, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DataSourceDefinition } from '../data/data-catalog';\nimport { DATA_SOURCE_CLIENT, UploadSourceType, DefaultDataSourceClient } from '../data/data-source-client';\nimport { inferSchema, parseJsonArray, parseCsv, slugifyId } from '../data/data-source-parsers';\n\n@Component({\n selector: 'app-global-data-manager',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"w-[480px] max-w-full bg-white border border-gray-200 rounded-lg shadow-xl flex flex-col h-full\">\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 py-3 border-b border-gray-100\">\n <div class=\"flex flex-col\">\n <h2 class=\"text-sm font-semibold text-gray-900\">Data Sources</h2>\n <p class=\"text-xs text-gray-500\">Datasets available to all forms/web pages.</p>\n </div>\n <button type=\"button\" class=\"text-xs text-gray-500 hover:text-gray-900\" (click)=\"close.emit()\">\n Close\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"flex-1 overflow-auto p-4 space-y-4\">\n <!-- New dataset form -->\n <div class=\"border border-gray-200 rounded-lg p-3 bg-gray-50 space-y-3\">\n <p class=\"text-xs font-semibold text-gray-600 uppercase tracking-wide\">New Dataset</p>\n\n <!-- File Upload -->\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs text-gray-500\">Upload JSON or CSV</label>\n <input type=\"file\" accept=\".json,.csv\" (change)=\"onFileSelected($event)\" \n class=\"block w-full text-xs text-gray-500 file:mr-2 file:py-1 file:px-2 file:rounded file:border-0 file:text-xs file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100\" />\n <p class=\"text-[10px] text-gray-400\">Or paste content below.</p>\n </div>\n\n <div class=\"grid grid-cols-2 gap-2\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs text-gray-500\">ID</label>\n <input [(ngModel)]=\"newId\" placeholder=\"countries\"\n class=\"h-8 px-2 text-sm border border-gray-300 rounded focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\" />\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs text-gray-500\">Label</label>\n <input [(ngModel)]=\"newLabel\" placeholder=\"Countries\" (blur)=\"onLabelBlur()\"\n class=\"h-8 px-2 text-sm border border-gray-300 rounded focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\" />\n </div>\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs text-gray-500\">Type</label>\n <select [(ngModel)]=\"newType\"\n class=\"h-8 px-2 text-sm border border-gray-300 rounded focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <option value=\"json\">JSON</option>\n <option value=\"csv\">CSV</option>\n </select>\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs text-gray-500\">Data Content</label>\n <textarea [(ngModel)]=\"newRawData\" rows=\"4\" (blur)=\"refreshPreview()\"\n class=\"w-full text-xs border border-gray-300 rounded p-2 font-mono focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\"\n placeholder='[{\"code\":\"US\",\"name\":\"United States\"}, …] or CSV with header row'></textarea>\n </div>\n\n <!-- Parsed Preview -->\n <div *ngIf=\"parsedColumns.length\" class=\"bg-white border border-gray-200 rounded p-2\">\n <p class=\"text-[10px] font-semibold text-gray-500 mb-1\">Detected Columns</p>\n <div class=\"flex flex-wrap gap-1\">\n <span *ngFor=\"let col of parsedColumns\" class=\"px-1.5 py-0.5 rounded bg-gray-100 text-[10px] text-gray-600 border border-gray-200\">\n {{ col.name }} <span class=\"text-gray-400\">: {{ col.type }}</span>\n </span>\n </div>\n <p class=\"text-[10px] text-gray-400 mt-1\">{{ parsedCount }} rows found.</p>\n </div>\n\n <div class=\"flex justify-between items-center pt-2\">\n <span class=\"text-xs text-red-500 flex-1 pr-2 leading-tight\" *ngIf=\"error\">{{ error }}</span>\n <button type=\"button\"\n [disabled]=\"isSaving\"\n class=\"px-3 h-8 rounded-md text-xs font-medium bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50 ml-auto\"\n (click)=\"createDataset()\">\n {{ isSaving ? 'Saving...' : 'Save Dataset' }}\n </button>\n </div>\n </div>\n\n <div *ngIf=\"listError\" class=\"text-xs text-red-500\">\n {{ listError }}\n </div>\n\n <!-- Existing datasets -->\n <div *ngIf=\"sources.length\" class=\"space-y-2\">\n <p class=\"text-xs font-semibold text-gray-600 uppercase tracking-wide\">Existing Datasets</p>\n <div *ngFor=\"let s of sources\" class=\"border border-gray-200 rounded-lg p-3 bg-white\">\n <div class=\"flex items-center justify-between mb-2\">\n <div>\n <p class=\"text-sm font-medium text-gray-900\">{{ s.label }}</p>\n <p class=\"text-xs text-gray-500\">{{ s.id }} • {{ s.type | uppercase }}</p>\n </div>\n <button type=\"button\" *ngIf=\"canDelete\"\n class=\"text-xs text-red-500 hover:text-red-700\"\n (click)=\"remove(s.id)\">\n Remove\n </button>\n </div>\n <!-- Preview omitted for brevity/perf, or could keep basic count -->\n <div class=\"text-[10px] text-gray-400\" *ngIf=\"s.schema\">\n {{ objectKeys(s.schema).length }} columns: {{ objectKeys(s.schema).join(', ') }}\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!sources.length\" class=\"text-xs text-gray-400\">\n No datasets yet. Upload a file above to get started.\n </div>\n </div>\n </div>\n `\n})\nexport class GlobalDataManagerComponent {\n @Output() close = new EventEmitter<void>();\n\n // Ensure we always have a client (default to in-memory if not provided)\n private client = inject(DATA_SOURCE_CLIENT, { optional: true }) || inject(DefaultDataSourceClient);\n // private catalog = inject(DataCatalog); // Removed to enforce API-only access\n\n sources: DataSourceDefinition[] = [];\n\n newId = '';\n newLabel = '';\n newType: UploadSourceType = 'json';\n newRawData = '';\n\n parsedColumns: { name: string, type: string }[] = [];\n parsedCount = 0;\n\n error = '';\n listError = '';\n isSaving = false;\n\n constructor() {\n this.refreshList();\n }\n\n get canDelete() {\n return !!this.client.deleteSource;\n }\n\n async refreshList() {\n this.listError = '';\n try {\n this.sources = await this.client.listSources();\n } catch (e) {\n this.sources = [];\n this.listError = 'Failed to load data sources.';\n }\n }\n\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n if (!input.files?.length) return;\n const file = input.files[0];\n\n // Auto-detect type\n if (file.name.endsWith('.csv')) {\n this.newType = 'csv';\n } else {\n this.newType = 'json';\n }\n\n // Auto-fill label if empty\n if (!this.newLabel) {\n this.newLabel = file.name.replace(/\\.(json|csv)$/i, '');\n this.onLabelBlur(); // Trigger ID gen\n }\n\n const reader = new FileReader();\n reader.onload = (e) => {\n this.newRawData = e.target?.result as string;\n this.refreshPreview();\n };\n reader.readAsText(file);\n }\n\n onLabelBlur() {\n if (this.newLabel && !this.newId) {\n this.newId = slugifyId(this.newLabel);\n }\n }\n\n refreshPreview() {\n this.parsedColumns = [];\n this.parsedCount = 0;\n this.error = '';\n\n if (!this.newRawData.trim()) return;\n\n try {\n let rows: any[];\n if (this.newType === 'json') {\n rows = parseJsonArray(this.newRawData);\n } else {\n rows = parseCsv(this.newRawData);\n }\n this.parsedCount = rows.length;\n const schema = inferSchema(rows);\n\n if (schema) {\n this.parsedColumns = Object.entries(schema).map(([name, type]) => ({ name, type }));\n }\n } catch (e: any) {\n // Silent parsing error until save/preview explicit check\n // possibly just clear preview\n }\n }\n\n async createDataset() {\n this.error = '';\n if (!this.newId.trim() || !this.newLabel.trim() || !this.newRawData.trim()) {\n this.error = 'ID, label, and data are required.';\n return;\n }\n\n this.isSaving = true;\n try {\n // Validate parsing first\n let rows: any[];\n if (this.newType === 'json') {\n rows = parseJsonArray(this.newRawData);\n } else {\n rows = parseCsv(this.newRawData);\n }\n\n const req = {\n id: this.newId.trim(),\n label: this.newLabel.trim(),\n type: this.newType,\n rawData: this.newRawData\n };\n\n if (this.client.createSource) {\n await this.client.createSource(req);\n } else {\n throw new Error('Data Source Client does not support creation.');\n }\n\n await this.refreshList();\n\n // Reset\n this.newId = '';\n this.newLabel = '';\n this.newType = 'json';\n this.newRawData = '';\n this.parsedColumns = [];\n this.parsedCount = 0;\n } catch (e: any) {\n this.error = e?.message || 'Failed to parse/save data';\n } finally {\n this.isSaving = false;\n }\n }\n\n async remove(id: string) {\n if (!confirm('Are you sure you want to remove this data source?')) return;\n\n try {\n if (this.client.deleteSource) {\n await this.client.deleteSource(id);\n } else {\n throw new Error('Delete not supported');\n }\n await this.refreshList();\n } catch (e: any) {\n alert('Failed to remove: ' + e.message);\n }\n }\n\n objectKeys(obj: any): string[] {\n return obj ? Object.keys(obj) : [];\n }\n}\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { DataSourceConfig, FieldSchema, OptionSchema, DataDependencyBinding, DataFilter } from '../../form-core/models';\nimport { DataSourceDefinition } from '../../data/data-catalog';\nimport { DATA_SOURCE_CLIENT, DefaultDataSourceClient, DataSourceColumn } from '../../data/data-source-client';\nimport { GlobalDataManagerComponent } from '../global-data-manager.component';\n\n@Component({\n selector: 'app-data-panel',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n UiIconModule,\n GlobalDataManagerComponent\n ],\n template: `\n <div class=\"flex flex-col gap-4 font-sans text-sm relative\">\n \n <!-- Manage Sources Overlay -->\n <div *ngIf=\"showSourceManager\" class=\"fixed inset-0 z-[100] bg-black/50 flex items-center justify-center p-8 animate-in fade-in duration-200\">\n <div class=\"bg-white rounded-lg shadow-2xl w-full max-w-4xl h-full max-h-[80vh] flex flex-col overflow-hidden relative\" (click)=\"$event.stopPropagation()\">\n <div class=\"flex items-center justify-between p-4 border-b border-gray-100 bg-gray-50\">\n <h3 class=\"font-semibold text-gray-700\">Manage Data Sources</h3>\n <button (click)=\"closeSourceManager()\" class=\"p-1 hover:bg-gray-200 rounded-full transition-colors\">\n <lucide-icon name=\"x\" class=\"w-5 h-5 text-gray-500\"></lucide-icon>\n </button>\n </div>\n <div class=\"flex-1 overflow-hidden p-0\">\n <app-global-data-manager (close)=\"closeSourceManager()\"></app-global-data-manager>\n </div>\n </div>\n </div>\n\n <ng-container *ngIf=\"bindingShape\">\n <!-- Source Type Selector (Universal) -->\n <div class=\"flex rounded-lg bg-gray-100 p-1 w-full gap-1\">\n <button (click)=\"setSourceType('static')\"\n [class.bg-white]=\"sourceType === 'static'\" [class.shadow-sm]=\"sourceType === 'static'\" [class.text-gray-900]=\"sourceType === 'static'\"\n class=\"flex-1 rounded-md px-3 py-1.5 text-xs font-medium text-gray-500 transition-all hover:bg-gray-200 focus:outline-none\">\n Static\n </button>\n <button (click)=\"setSourceType('source')\"\n [class.bg-white]=\"sourceType === 'source'\" [class.shadow-sm]=\"sourceType === 'source'\" [class.text-gray-900]=\"sourceType === 'source'\"\n class=\"flex-1 rounded-md px-3 py-1.5 text-xs font-medium text-gray-500 transition-all hover:bg-gray-200 focus:outline-none\">\n Source\n </button>\n <button (click)=\"setSourceType('context')\"\n [class.bg-white]=\"sourceType === 'context'\" [class.shadow-sm]=\"sourceType === 'context'\" [class.text-gray-900]=\"sourceType === 'context'\"\n class=\"flex-1 rounded-md px-3 py-1.5 text-xs font-medium text-gray-500 transition-all hover:bg-gray-200 focus:outline-none\">\n Context\n </button>\n </div>\n\n <div class=\"p-1\">\n \n <!-- STATIC MODE -->\n <ng-container *ngIf=\"sourceType === 'static'\">\n \n <!-- LIST SHAPE: Options Editor (except Table which has its own editor) -->\n <div *ngIf=\"bindingShape === 'list' && widgetType !== 'table'\">\n <div class=\"flex items-center justify-between mb-3\">\n <span class=\"text-xs font-bold text-gray-500 uppercase tracking-wide\">Options</span>\n <button (click)=\"addOption()\" class=\"p-1 text-blue-600 hover:bg-blue-50 rounded transition-colors\" title=\"Add Option\">\n <lucide-icon name=\"plus\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n\n <div *ngIf=\"!staticOptions?.length\" class=\"text-center p-6 bg-gray-50 rounded-lg border border-dashed border-gray-200 text-gray-400 text-xs mb-4\">\n No options defined. Click + to add.\n </div>\n\n <div class=\"flex flex-col gap-2 mb-6\">\n <div *ngFor=\"let opt of staticOptions; let i = index\" class=\"flex gap-2 items-center bg-white p-2 rounded-md border border-gray-200 shadow-sm relative group\">\n <div class=\"flex-1 grid grid-cols-2 gap-2\">\n <input type=\"text\" [(ngModel)]=\"opt.label\" (blur)=\"emitChange()\" placeholder=\"Label\" class=\"w-full text-sm bg-transparent border-b border-gray-200 focus:border-blue-500 outline-none px-1 py-1\">\n <input type=\"text\" [(ngModel)]=\"opt.value\" (blur)=\"emitChange()\" placeholder=\"Value\" class=\"w-full text-sm bg-transparent border-b border-gray-200 focus:border-blue-500 outline-none px-1 py-1\">\n </div>\n <button (click)=\"removeOption(i)\" class=\"p-1 text-gray-400 hover:text-red-500 hover:bg-red-50 rounded transition-colors\" title=\"Remove\">\n <lucide-icon name=\"trash-2\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n </div>\n </div>\n\n\n\n <!-- SCALAR SHAPE: Value/Image -->\n <div *ngIf=\"bindingShape === 'scalar'\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs font-medium text-gray-500\">\n {{ dataConsumer === 'image' ? 'Image URL' : 'Default Value' }}\n </label>\n \n <div class=\"relative\">\n <input [(ngModel)]=\"staticValue\" (blur)=\"emitChange()\" \n [placeholder]=\"dataConsumer === 'image' ? 'https://example.com/image.png' : ''\" \n class=\"h-9 w-full rounded-md border border-gray-300 px-3 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\"\n [class.pl-3]=\"dataConsumer !== 'image'\" [class.pr-8]=\"dataConsumer === 'image'\">\n <div *ngIf=\"dataConsumer === 'image'\" class=\"absolute right-2 top-2.5 text-gray-400 pointer-events-none\">\n <lucide-icon name=\"link\" class=\"w-4 h-4\"></lucide-icon>\n </div>\n </div>\n </div>\n \n <!-- Image Preview -->\n <div *ngIf=\"dataConsumer === 'image' && staticValue\" class=\"mt-3 rounded-lg overflow-hidden border border-gray-200 bg-gray-50 flex items-center justify-center p-2 relative h-32\">\n <img [src]=\"staticValue\" class=\"max-h-full max-w-full object-contain\">\n </div>\n </div>\n\n </ng-container>\n\n <!-- Source / Context Modes -->\n <ng-container *ngIf=\"sourceType === 'source' || sourceType === 'context'\">\n <div class=\"flex flex-col gap-4\">\n <!-- Source Selection -->\n <ng-container *ngIf=\"sourceType === 'source'\">\n <div class=\"flex flex-col gap-1\">\n <div class=\"flex items-center justify-between\">\n <label class=\"text-xs font-medium text-gray-500\">Data Source</label>\n <button type=\"button\" (click)=\"openSourceManager()\" class=\"text-xs text-blue-600 hover:text-blue-700 font-medium\">\n Manage\n </button>\n </div>\n <select [(ngModel)]=\"selectedSourceId\" (ngModelChange)=\"onSourceChange()\" class=\"h-9 w-full rounded-md border border-gray-300 px-3 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option [ngValue]=\"null\">Select Source</option>\n <option *ngFor=\"let src of availableSources\" [value]=\"src.id\">{{ src.label }}</option>\n </select>\n </div>\n </ng-container>\n\n <!-- Columns & Preview (Source Info) -->\n <div *ngIf=\"sourceType === 'source' && selectedSourceId\" class=\"border border-gray-200 rounded p-2 bg-gray-50 text-xs\">\n \n <!-- Preview / Stats Header -->\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"font-semibold text-gray-500\">\n Live Preview\n <span *ngIf=\"previewTotal\" class=\"font-normal text-gray-400\">({{ previewTotal }} rows)</span>\n </span>\n <button *ngIf=\"previewLoading\" class=\"text-blue-500 animate-spin\">\n <lucide-icon name=\"loader-2\" class=\"w-3.5 h-3.5\"></lucide-icon>\n </button>\n </div>\n\n <!-- Error Message -->\n <div *ngIf=\"previewError\" class=\"text-red-500 mb-2 bg-red-50 p-1.5 rounded border border-red-100 italic\">\n {{ previewError }}\n </div>\n\n <!-- List Preview -->\n <ng-container *ngIf=\"bindingShape === 'list' && !previewLoading && !previewError\">\n <div *ngIf=\"previewRows.length\" class=\"bg-white border border-gray-200 rounded overflow-hidden\">\n <div class=\"bg-gray-100 px-2 py-1 text-[10px] text-gray-500 font-medium flex justify-between\">\n <span>Mapped Options (first 10)</span>\n <span class=\"italic font-normal\">Using current keys</span>\n </div>\n <div class=\"max-h-32 overflow-y-auto divide-y divide-gray-100\">\n <div *ngFor=\"let row of previewRows\" class=\"px-2 py-1 text-[11px] truncate flex items-center gap-2\">\n <span class=\"font-medium text-gray-700 min-w-[20px]\">{{ getPreviewLabel(row) }}</span>\n <span class=\"text-gray-400 font-mono text-[10px]\">{{ getPreviewValue(row) }}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!previewRows.length\" class=\"text-gray-400 italic mb-2\">\n No data found matching your filters.\n </div>\n </ng-container>\n\n <!-- JSON Preview (Table/Scalar/Fallback) -->\n <ng-container *ngIf=\"bindingShape !== 'list' && !previewLoading && !previewError\">\n <pre class=\"bg-white border border-gray-200 p-1.5 rounded overflow-auto max-h-32 text-[10px]\">{{ previewRows | json }}</pre>\n </ng-container>\n \n <!-- Preview Filters Info -->\n <div *ngIf=\"hasFieldFilters\" class=\"mt-2 flex items-center gap-1.5 text-[10px] text-blue-600 bg-blue-50 px-2 py-1 rounded\">\n <lucide-icon name=\"info\" class=\"w-3 h-3\"></lucide-icon>\n Filters using \"Field\" values are ignored in preview.\n </div>\n </div>\n \n\n \n <!-- Mapping Keys (List Only) -->\n <div class=\"flex flex-col gap-2\" *ngIf=\"bindingShape === 'list' && widgetType !== 'table'\">\n <div class=\"flex items-center justify-between\">\n <span class=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">Column Mapping</span>\n <button (click)=\"autoMapKeys()\" class=\"text-blue-600 hover:text-blue-700 text-xs font-medium flex items-center gap-1\" title=\"Guess columns based on names\">\n <lucide-icon name=\"wand-2\" class=\"w-3 h-3\"></lucide-icon> Auto-Map\n </button>\n </div>\n\n <div class=\"grid grid-cols-2 gap-3\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs font-medium text-gray-500\">Label Key</label>\n <input [attr.list]=\"'label-cols-' + config?.id\" [(ngModel)]=\"labelKey\" (blur)=\"onKeyBlur()\" placeholder=\"e.g. name\" class=\"h-8 w-full rounded-md border border-gray-300 px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <datalist [id]=\"'label-cols-' + config?.id\">\n <option *ngFor=\"let col of sourceColumns\" [value]=\"col.name\"></option>\n </datalist>\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs font-medium text-gray-500\">Value Key</label>\n <input [attr.list]=\"'value-cols-' + config?.id\" [(ngModel)]=\"valueKey\" (blur)=\"onKeyBlur()\" placeholder=\"e.g. id\" class=\"h-8 w-full rounded-md border border-gray-300 px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <datalist [id]=\"'value-cols-' + config?.id\">\n <option *ngFor=\"let col of sourceColumns\" [value]=\"col.name\"></option>\n </datalist>\n </div>\n </div>\n </div>\n\n <!-- Search Settings -->\n <div class=\"border-t border-gray-200 pt-3 mt-3\" *ngIf=\"widgetType === 'select' || widgetType === 'tree-select' || widgetType === 'table'\">\n <h5 class=\"text-xs font-medium text-gray-700 mb-2\">Search Settings</h5>\n \n <div class=\"flex items-center gap-2 mb-2\">\n <input type=\"checkbox\" \n [id]=\"'search-enabled-' + config?.id\"\n [(ngModel)]=\"searchEnabled\"\n (ngModelChange)=\"emitChange()\"\n class=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\">\n <label [for]=\"'search-enabled-' + config?.id\" class=\"text-xs text-gray-700\">Enable Search Input</label>\n </div>\n\n <div *ngIf=\"searchEnabled\" class=\"grid grid-cols-2 gap-2\">\n <div *ngIf=\"widgetType !== 'table'\">\n <label class=\"block text-xs text-gray-500 mb-1\">Max Options</label>\n <input type=\"number\" \n [(ngModel)]=\"optionsLimit\" \n (ngModelChange)=\"emitChange()\"\n min=\"1\" max=\"500\"\n class=\"w-full text-xs border-gray-300 rounded px-2 py-1\">\n </div>\n <div [class.col-span-2]=\"widgetType === 'table'\">\n <label class=\"block text-xs text-gray-500 mb-1\">Search Columns</label>\n <input type=\"text\" \n [ngModel]=\"searchColumns.join(', ')\" \n (ngModelChange)=\"updateSearchColumns($event)\"\n placeholder=\"col1, col2 (optional)\"\n class=\"w-full text-xs border-gray-300 rounded px-2 py-1\">\n </div>\n </div>\n </div>\n\n\n <!-- Tree Settings -->\n <div *ngIf=\"widgetType === 'tree-select'\" class=\"border-t border-gray-200 pt-3 mt-3\">\n <h5 class=\"text-xs font-medium text-gray-700 mb-2\">Tree Structure</h5>\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs text-gray-500\">Node ID Key</label>\n <div class=\"relative\">\n <input [attr.list]=\"'tree-id-cols-' + config?.id\" [(ngModel)]=\"treeIdKey\" (blur)=\"emitChange()\" placeholder=\"e.g. id\" class=\"w-full text-xs h-7 rounded border border-gray-300 px-2 focus:border-blue-500 outline-none\">\n <datalist [id]=\"'tree-id-cols-' + config?.id\">\n <option *ngFor=\"let col of sourceColumns\" [value]=\"col.name\"></option>\n </datalist>\n </div>\n <p class=\"text-[10px] text-gray-400\">Defaults to Value Key</p>\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs text-gray-500\">Parent Key</label>\n <div class=\"relative\">\n <input [attr.list]=\"'tree-parent-cols-' + config?.id\" [(ngModel)]=\"treeParentKey\" (blur)=\"emitChange()\" placeholder=\"e.g. parentId\" class=\"w-full text-xs h-7 rounded border border-gray-300 px-2 focus:border-blue-500 outline-none\">\n <datalist [id]=\"'tree-parent-cols-' + config?.id\">\n <option *ngFor=\"let col of sourceColumns\" [value]=\"col.name\"></option>\n </datalist>\n </div>\n <p class=\"text-[10px] text-gray-400\">Defaults to 'parentId'</p>\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs text-gray-500\">Root Value</label>\n <input type=\"text\" [(ngModel)]=\"treeRootValue\" (blur)=\"emitChange()\" placeholder=\"(optional)\" class=\"w-full text-xs h-7 rounded border border-gray-300 px-2 focus:border-blue-500 outline-none\">\n <p class=\"text-[10px] text-gray-400\">Value for root nodes</p>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- TABLE CONFIGURATION (Columns, Sort, PageSize) -->\n <div class=\"flex flex-col gap-4 mt-4\" *ngIf=\"widgetType === 'table'\">\n \n <!-- Columns Manager -->\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex items-center justify-between\">\n <span class=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">Columns</span>\n <div class=\"flex items-center gap-2\">\n <button *ngIf=\"sourceType === 'source' && selectedSourceId\" (click)=\"generateTableColumns()\" class=\"text-purple-600 hover:text-purple-700 text-xs font-medium flex items-center gap-1\" title=\"Generate from Source\">\n <lucide-icon name=\"sparkles\" class=\"w-3 h-3\"></lucide-icon> Generate\n </button>\n <button (click)=\"addTableColumn()\" class=\"text-blue-600 hover:text-blue-700 text-xs font-medium flex items-center gap-1\">\n <lucide-icon name=\"plus\" class=\"w-3 h-3\"></lucide-icon> Add\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <div *ngFor=\"let col of tableColumns; let i = index\" class=\"flex gap-2\">\n <input [(ngModel)]=\"col.key\" (blur)=\"emitChange()\" \n placeholder=\"Key\" class=\"w-1/3 text-xs border border-gray-300 rounded px-1 h-7\">\n <input [(ngModel)]=\"col.label\" (blur)=\"emitChange()\" \n placeholder=\"Label\" class=\"flex-1 text-xs border border-gray-300 rounded px-1 h-7\">\n <button (click)=\"removeTableColumn(i)\" class=\"text-red-500 hover:bg-red-50 p-1 rounded\">\n <lucide-icon name=\"trash-2\" class=\"w-3 h-3\"></lucide-icon>\n </button>\n </div>\n <p *ngIf=\"tableColumns.length === 0\" class=\"text-xs text-gray-400 italic\">No columns defined.</p>\n </div>\n </div>\n\n <!-- Sort & Page Size (Source Only) -->\n <div *ngIf=\"sourceType !== 'static'\" class=\"grid grid-cols-2 gap-3 border-t border-gray-200 pt-3\">\n <div>\n <label class=\"block text-xs text-gray-500 mb-1\">Page Size</label>\n <input type=\"number\" [(ngModel)]=\"pageSize\" (ngModelChange)=\"emitChange()\" min=\"1\" max=\"1000\" class=\"w-full text-xs border-gray-300 rounded px-2 h-7 bg-white\">\n </div>\n <!-- Simple Sort (Single Column for now) -->\n <div>\n <label class=\"block text-xs text-gray-500 mb-1\">Default Sort</label>\n <div class=\"flex gap-1\">\n <input [attr.list]=\"'sort-cols-' + config?.id\" [(ngModel)]=\"sortColumn\" (blur)=\"emitChange()\" placeholder=\"Col\" class=\"w-full text-xs h-7 border border-gray-300 rounded px-2\">\n <datalist [id]=\"'sort-cols-' + config?.id\">\n <option *ngFor=\"let col of sourceColumns\" [value]=\"col.name\"></option>\n </datalist>\n <button (click)=\"toggleSortDir()\" class=\"w-7 h-7 flex items-center justify-center border border-gray-300 rounded bg-gray-50 text-xs font-bold text-gray-600\" [title]=\"sortDir\">\n {{ sortDir === 'asc' ? 'A-Z' : 'Z-A' }}\n </button>\n </div>\n </div>\n </div>\n \n <!-- Static Rows Editor (Only in Static Mode) -->\n <div *ngIf=\"sourceType === 'static'\">\n <div class=\"h-px bg-gray-200 w-full my-2\"></div>\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">Data Rows</span>\n <button (click)=\"addTableRow()\" class=\"text-blue-600 hover:text-blue-700 text-xs font-medium flex items-center gap-1\">\n <lucide-icon name=\"plus\" class=\"w-3 h-3\"></lucide-icon> Add Row\n </button>\n </div>\n \n <div class=\"bg-white border border-gray-200 rounded max-h-40 overflow-auto\">\n <table class=\"w-full text-xs\">\n <thead class=\"bg-gray-100 text-gray-500\">\n <tr>\n <th *ngFor=\"let col of tableColumns\" class=\"p-1 text-left font-medium\">{{col.label}}</th>\n <th class=\"w-6\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of tableRows; let i = index\" class=\"border-t border-gray-100\">\n <td *ngFor=\"let col of tableColumns\" class=\"p-1\">\n <input [(ngModel)]=\"row[col.key]\" (blur)=\"emitChange()\" \n class=\"w-full border-none p-0 text-xs focus:ring-0\">\n </td>\n <td class=\"p-1 text-center\">\n <button (click)=\"removeTableRow(i)\" class=\"text-red-400 hover:text-red-600\">\n <lucide-icon name=\"x\" class=\"w-3 h-3\"></lucide-icon>\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n <p *ngIf=\"tableRows.length === 0\" class=\"p-2 text-center text-gray-400 italic\">No data rows.</p>\n </div>\n </div>\n </div>\n\n <!-- DEPENDENCIES & FILTERS SECTION (Universal if binding exists) -->\n <div class=\"border-t border-gray-200 my-4 pt-4\">\n \n <!-- DEPENDENCIES (Universal) -->\n <div class=\"mb-6\">\n <div class=\"flex items-center justify-between mb-3\">\n <span class=\"text-xs font-bold text-gray-500 uppercase tracking-wide\">Depends On</span>\n <button (click)=\"addDependency()\" class=\"p-1 text-blue-600 hover:bg-blue-50 rounded transition-colors\" title=\"Add Dependency\">\n <lucide-icon name=\"plus\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n \n <div *ngIf=\"!dependencyBindings.length\" class=\"text-xs text-gray-400 italic mb-2\">\n No field dependencies configured.\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <div *ngFor=\"let dep of dependencyBindings; let i = index\" class=\"flex gap-2 items-center bg-white p-2 rounded-md border border-gray-200 shadow-sm\">\n <div class=\"flex-1 flex flex-col gap-2\">\n <!-- Field Selection -->\n <select [(ngModel)]=\"dep.fieldId\" (ngModelChange)=\"emitChange()\" class=\"w-full text-xs h-7 rounded border border-gray-200 bg-gray-50\">\n <option value=\"\" disabled>Select Field</option>\n <option *ngFor=\"let f of availableFields\" [value]=\"f.id\">{{ f.label || f.name }}</option>\n </select>\n <!-- Param Key -->\n <input [(ngModel)]=\"dep.paramKey\" (blur)=\"emitChange()\" placeholder=\"Param Name (e.g. country)\" class=\"w-full text-xs h-7 px-2 rounded border border-gray-200\">\n </div>\n <button (click)=\"removeDependency(i)\" class=\"text-gray-400 hover:text-red-500\">\n <lucide-icon name=\"trash-2\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n </div>\n </div>\n\n <!-- FILTERS (List/Table Only) -->\n <div *ngIf=\"bindingShape === 'list' || widgetType === 'table'\">\n <div class=\"flex items-center justify-between mb-3\">\n <span class=\"text-xs font-bold text-gray-500 uppercase tracking-wide\">Row Filters</span>\n <button (click)=\"addFilter()\" class=\"p-1 text-blue-600 hover:bg-blue-50 rounded transition-colors\" title=\"Add Filter\">\n <lucide-icon name=\"plus\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n\n <div *ngIf=\"!dataFilters.length\" class=\"text-xs text-gray-400 italic\">\n No filters configured.\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <div *ngFor=\"let filter of dataFilters; let i = index\" class=\"flex flex-col gap-2 bg-white p-2 rounded-md border border-gray-200 shadow-sm relative\">\n <div class=\"flex gap-2\">\n <input [attr.list]=\"'filter-cols-' + config?.id + '-' + i\" [(ngModel)]=\"filter.column\" (blur)=\"emitChange(); refreshPreview()\" placeholder=\"Column\" class=\"flex-1 text-xs h-7 px-2 rounded border border-gray-200\">\n <datalist [id]=\"'filter-cols-' + config?.id + '-' + i\">\n <option *ngFor=\"let col of sourceColumns\" [value]=\"col.name\"></option>\n </datalist>\n\n <select [(ngModel)]=\"filter.op\" (ngModelChange)=\"emitChange(); refreshPreview()\" class=\"w-16 text-xs h-7 rounded border border-gray-200 bg-gray-50\">\n <option value=\"eq\">=</option>\n <option value=\"neq\">!=</option>\n <option value=\"in\">In</option>\n <option value=\"contains\">Contains</option>\n <option value=\"startsWith\">Starts With</option>\n <option value=\"endsWith\">Ends With</option>\n <option value=\"gt\">&gt;</option>\n <option value=\"gte\">&ge;</option>\n <option value=\"lt\">&lt;</option>\n <option value=\"lte\">&le;</option>\n </select>\n <button (click)=\"removeFilter(i)\" class=\"text-gray-400 hover:text-red-500\">\n <lucide-icon name=\"trash-2\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n \n\n \n <div class=\"flex gap-2 items-center\">\n <!-- Source Toggle -->\n <div class=\"flex bg-gray-100 rounded p-0.5\">\n <button (click)=\"filter.valueFrom = 'literal'; emitChange()\" [class.bg-white]=\"filter.valueFrom !== 'field'\" [class.shadow-sm]=\"filter.valueFrom !== 'field'\" class=\"px-1.5 py-0.5 text-[10px] rounded transition-all\">Txt</button>\n <button (click)=\"filter.valueFrom = 'field'; emitChange()\" [class.bg-white]=\"filter.valueFrom === 'field'\" [class.shadow-sm]=\"filter.valueFrom === 'field'\" class=\"px-1.5 py-0.5 text-[10px] rounded transition-all\">Field</button>\n </div>\n\n <div class=\"flex-1\">\n <ng-container *ngIf=\"filter.valueFrom === 'field'\">\n <select [(ngModel)]=\"filter.fieldId\" (ngModelChange)=\"emitChange()\" class=\"w-full text-xs h-7 rounded border border-gray-200 bg-gray-50\">\n <option value=\"\" disabled>Select Field</option>\n <option *ngFor=\"let f of availableFields\" [value]=\"f.id\">{{ f.label || f.name }}</option>\n </select>\n </ng-container>\n <ng-container *ngIf=\"filter.valueFrom !== 'field'\">\n <input [(ngModel)]=\"filter.valueLiteral\" (blur)=\"emitChange()\" placeholder=\"Value\" class=\"w-full text-xs h-7 px-2 rounded border border-gray-200\">\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <div *ngIf=\"!bindingShape\" class=\"flex flex-col items-center justify-center h-48 text-gray-400 text-center p-4 border border-dashed border-gray-200 rounded-lg bg-gray-50\">\n <lucide-icon name=\"database-off\" class=\"w-8 h-8 mb-2 opacity-50\"></lucide-icon>\n <span class=\"text-xs font-medium\">This widget doesn’t use data sources.</span>\n </div>\n </div>\n `,\n styles: []\n})\nexport class DataPanelComponent implements OnChanges {\n @Input() config!: FieldSchema;\n @Input() dataConsumer: 'value' | 'list' | 'image' | 'none' = 'none'; // kept for ui hints\n @Input() bindingShape: 'scalar' | 'list' | null = null;\n @Input() widgetType: string = '';\n @Input() allFields: FieldSchema[] = [];\n @Output() configChange = new EventEmitter<FieldSchema>();\n\n // State\n sourceType: 'static' | 'source' | 'context' = 'static';\n selectedSourceId?: string;\n\n // Manager Overlay\n showSourceManager = false;\n\n // List Config\n staticOptions: OptionSchema[] = [];\n labelKey?: string;\n valueKey?: string;\n\n // Value/Image Config\n staticValue?: any;\n\n // Table Config (Root level props, not in dataConfig)\n tableColumns: any[] = [];\n tableRows: any[] = [];\n\n // Cascading & Filters\n dependencyBindings: DataDependencyBinding[] = [];\n dataFilters: DataFilter[] = [];\n\n availableSources: DataSourceDefinition[] = [];\n sourceColumns: DataSourceColumn[] = [];\n\n // Preview Logic\n previewLoading = false;\n previewError: string | null = null;\n previewRows: unknown[] = [];\n previewTotal = 0;\n private previewReqId = 0;\n\n private client = inject(DATA_SOURCE_CLIENT, { optional: true }) || inject(DefaultDataSourceClient);\n\n\n constructor() { }\n\n // Search Config\n searchEnabled = false;\n optionsLimit?: number;\n searchColumns: string[] = [];\n\n // Tree Config\n treeIdKey?: string;\n treeParentKey?: string;\n treeRootValue?: string;\n\n\n\n async ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] || changes['widgetType'] || changes['bindingShape']) {\n this.loadFromField();\n }\n await this.refreshSources();\n }\n\n async refreshSources() {\n this.availableSources = await this.client.listSources();\n }\n\n openSourceManager() {\n this.showSourceManager = true;\n }\n\n closeSourceManager() {\n this.showSourceManager = false;\n this.refreshSources();\n }\n\n get availableFields() {\n if (!this.config || !this.allFields) return [];\n return this.config ? this.allFields.filter(f => f.id !== this.config.id) : this.allFields;\n }\n\n setSourceType(type: 'static' | 'source' | 'context') {\n this.sourceType = type;\n this.emitChange();\n }\n\n addOption() {\n this.staticOptions.push({ label: 'New Option', value: 'value' });\n this.emitChange();\n }\n\n removeOption(index: number) {\n this.staticOptions.splice(index, 1);\n this.emitChange();\n }\n\n onSourceChange() {\n this.loadSourceInfo();\n this.emitChange();\n }\n\n onKeyBlur() {\n this.emitChange();\n }\n\n async loadSourceInfo() {\n this.sourceColumns = [];\n this.previewRows = [];\n this.previewLoading = true;\n this.previewError = null;\n\n if (!this.selectedSourceId) {\n this.previewLoading = false;\n return;\n }\n\n try {\n this.sourceColumns = await this.client.getColumns(this.selectedSourceId);\n } catch {\n this.sourceColumns = [];\n }\n\n this.refreshPreview();\n }\n\n async refreshPreview() {\n if (!this.selectedSourceId) return;\n\n const reqId = ++this.previewReqId;\n this.previewLoading = true;\n this.previewError = null;\n\n try {\n const validFilters = this.dataFilters.filter(f => f.column && f.valueFrom === 'literal' && f.valueLiteral !== undefined && f.valueLiteral !== '');\n const q = {\n page: { limit: 10, offset: 0 },\n filters: validFilters.map(f => ({ column: f.column, op: f.op, value: f.valueLiteral }))\n };\n const res = await this.client.query(this.selectedSourceId, q);\n\n if (this.previewReqId === reqId) {\n this.previewRows = res.rows;\n this.previewTotal = res.total;\n }\n } catch (e: any) {\n if (this.previewReqId === reqId) {\n this.previewError = e.message || 'Failed to load data';\n this.previewRows = [];\n }\n } finally {\n if (this.previewReqId === reqId) {\n this.previewLoading = false;\n }\n }\n }\n\n autoMapKeys() {\n if (!this.sourceColumns.length) return;\n const findCol = (candidates: string[]) => {\n for (const cand of candidates) {\n const match = this.sourceColumns.find(c => c.name.toLowerCase() === cand.toLowerCase());\n if (match) return match.name;\n const loose = this.sourceColumns.find(c => c.name.toLowerCase().includes(cand.toLowerCase()));\n if (loose) return loose.name;\n }\n return null;\n };\n const newLabel = findCol(['name', 'label', 'title', 'displayName', 'text', 'description']);\n const newValue = findCol(['id', 'value', 'code', 'key', 'uuid', 'uid']);\n if (newLabel) this.labelKey = newLabel;\n if (newValue) this.valueKey = newValue;\n this.emitChange();\n }\n\n hasFieldFilters(): boolean {\n return this.config?.dataConfig?.filters?.some(f => f.valueFrom === 'field') ?? false;\n }\n\n updateSearchColumns(value: string) {\n if (!value) {\n this.searchColumns = [];\n } else {\n this.searchColumns = value.split(',').map(s => s.trim()).filter(s => !!s);\n }\n this.emitChange();\n }\n\n getPreviewLabel(row: any): string {\n const k = this.labelKey || 'label';\n return row[k] ?? '(no label)';\n }\n\n getPreviewValue(row: any): string {\n const k = this.valueKey || 'value';\n return row[k] ?? '';\n }\n\n addTableColumn() {\n this.tableColumns.push({ key: `col${this.tableColumns.length + 1}`, label: 'New Column' });\n this.emitChange();\n }\n\n removeTableColumn(index: number) {\n this.tableColumns.splice(index, 1);\n this.emitChange();\n }\n\n addTableRow() {\n const newRow: any = {};\n this.tableColumns.forEach(c => newRow[c.key] = '-');\n this.tableRows.push(newRow);\n this.emitChange();\n }\n\n removeTableRow(index: number) {\n this.tableRows.splice(index, 1);\n this.emitChange();\n }\n\n addDependency() {\n this.dependencyBindings.push({ fieldId: '', paramKey: '' });\n this.emitChange();\n }\n\n removeDependency(index: number) {\n this.dependencyBindings.splice(index, 1);\n this.emitChange();\n }\n\n addFilter() {\n this.dataFilters.push({ column: '', op: 'eq', valueFrom: 'literal', valueLiteral: '' });\n this.emitChange();\n }\n\n removeFilter(index: number) {\n this.dataFilters.splice(index, 1);\n this.emitChange();\n }\n\n loadFromField() {\n if (!this.config) return;\n\n if (!this.bindingShape) {\n this.sourceType = 'static';\n return;\n }\n\n // Load Table Props\n if (this.widgetType === 'table') {\n const anyConfig = this.config as any;\n this.tableColumns = anyConfig.columns ? [...anyConfig.columns] : [];\n this.tableRows = anyConfig.rows ? [...anyConfig.rows] : [];\n }\n\n const d = this.config.dataConfig;\n if (!d) {\n this.sourceType = 'static';\n this.staticOptions = this.config.staticOptions || [];\n this.staticValue = this.config.defaultValue;\n // Reset search\n this.searchEnabled = false;\n this.optionsLimit = undefined;\n this.searchColumns = [];\n this.treeIdKey = undefined;\n this.treeParentKey = undefined;\n this.treeRootValue = undefined;\n return;\n }\n\n if (d.type === 'global' || d.type === 'api') {\n this.sourceType = 'source';\n } else {\n this.sourceType = d.type;\n }\n\n this.staticOptions = d.staticOptions || [];\n this.staticValue = d.staticValue;\n this.selectedSourceId = d.sourceId;\n this.labelKey = d.labelKey;\n this.valueKey = d.valueKey;\n\n // Search\n this.searchEnabled = !!d.searchEnabled;\n this.optionsLimit = d.optionsLimit;\n this.searchColumns = d.searchColumns ? [...d.searchColumns] : [];\n\n // Tree\n this.treeIdKey = d.treeIdKey;\n this.treeParentKey = d.treeParentKey;\n this.treeRootValue = d.treeRootValue;\n\n // Cascading\n this.dependencyBindings = d.dependsOn ? [...d.dependsOn] : [];\n this.dataFilters = d.filters ? [...d.filters] : [];\n\n // Table Config\n this.pageSize = d.pageSize;\n if (d.sort && d.sort.length > 0) {\n this.sortColumn = d.sort[0].column;\n this.sortDir = d.sort[0].dir;\n } else {\n this.sortColumn = undefined;\n this.sortDir = 'asc';\n }\n\n // Load preview\n this.loadSourceInfo();\n }\n\n emitChange() {\n if (!this.bindingShape) {\n return;\n }\n\n const removeUndefined = (obj: any) => JSON.parse(JSON.stringify(obj));\n const newConfig: any = { ...this.config };\n\n const dConfig: DataSourceConfig = {\n type: this.sourceType,\n staticOptions: this.sourceType === 'static' && this.bindingShape === 'list' ? this.staticOptions : undefined,\n staticValue: this.sourceType === 'static' && this.bindingShape === 'scalar' ? this.staticValue : undefined,\n sourceId: this.sourceType === 'source' ? this.selectedSourceId : undefined,\n labelKey: this.sourceType === 'source' ? this.labelKey : undefined,\n valueKey: this.sourceType === 'source' ? this.valueKey : undefined,\n\n // Search\n searchEnabled: this.searchEnabled,\n optionsLimit: this.optionsLimit,\n searchColumns: this.searchColumns.length > 0 ? this.searchColumns : undefined,\n\n // Tree\n treeIdKey: this.treeIdKey,\n treeParentKey: this.treeParentKey,\n treeRootValue: this.treeRootValue,\n\n // Cascading\n dependsOn: this.dependencyBindings.length > 0 ? this.dependencyBindings : undefined,\n filters: this.dataFilters.length > 0 ? this.dataFilters : undefined\n };\n\n // If static value/options, also sync to legacy props for safety/backward compat\n if (this.sourceType === 'static') {\n if (this.bindingShape === 'list') {\n newConfig.staticOptions = this.staticOptions;\n } else {\n newConfig.defaultValue = this.staticValue;\n }\n }\n\n // Sync Table Props\n if (this.widgetType === 'table') {\n newConfig.columns = this.tableColumns;\n newConfig.rows = this.tableRows;\n // Add sort settings to dataConfig\n dConfig.pageSize = this.pageSize;\n if (this.sortColumn) {\n dConfig.sort = [{ column: this.sortColumn, dir: this.sortDir }];\n }\n newConfig.dataConfig = removeUndefined(dConfig);\n } else {\n newConfig.dataConfig = removeUndefined(dConfig);\n }\n\n this.configChange.emit(newConfig);\n }\n\n async generateTableColumns() {\n if (!this.selectedSourceId) return;\n try {\n const cols = await this.client.getColumns(this.selectedSourceId);\n this.tableColumns = cols.map(c => ({\n key: c.name,\n label: (c as any).label || c.name.charAt(0).toUpperCase() + c.name.slice(1)\n }));\n this.emitChange();\n } catch {\n // Ignore column generation failures to keep the panel responsive.\n }\n }\n\n pageSize?: number;\n sortColumn?: string;\n sortDir: 'asc' | 'desc' = 'asc';\n\n toggleSortDir() {\n this.sortDir = this.sortDir === 'asc' ? 'desc' : 'asc';\n this.emitChange();\n }\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../../ui/ui-icon.module';\nimport { LogicGroup, LogicCondition } from '../../../form-core/models';\n\n@Component({\n selector: 'app-query-builder',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n UiIconModule\n ],\n template: `\n <div class=\"query-builder flex flex-col gap-2 font-sans text-sm\">\n <!-- Group Header -->\n <div class=\"flex items-center gap-2 bg-gray-50 p-2 rounded-md border border-gray-200\" [ngClass]=\"{'border-l-4': level > 0, 'border-l-blue-400': level > 0}\">\n <span class=\"text-xs font-bold text-gray-500 uppercase w-8\" *ngIf=\"level > 0\">Group</span>\n \n <div class=\"flex items-center gap-1 bg-white border border-gray-300 rounded px-1 shado-sm\">\n <button class=\"px-2 py-1 text-xs font-bold rounded hover:bg-gray-100 transition-colors\" \n [class.bg-blue-100]=\"group.operator === 'AND'\" \n [class.text-blue-700]=\"group.operator === 'AND'\"\n (click)=\"setOperator('AND')\">AND</button>\n <div class=\"w-px h-3 bg-gray-200\"></div>\n <button class=\"px-2 py-1 text-xs font-bold rounded hover:bg-gray-100 transition-colors\"\n [class.bg-blue-100]=\"group.operator === 'OR'\" \n [class.text-blue-700]=\"group.operator === 'OR'\"\n (click)=\"setOperator('OR')\">OR</button>\n </div>\n\n <div class=\"flex-1\"></div>\n\n <button (click)=\"addCondition()\" class=\"p-1 items-center justify-center text-gray-500 hover:text-blue-600 hover:bg-blue-50 rounded transition-colors\" title=\"Add Condition\">\n <lucide-icon name=\"plus\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n <button (click)=\"addGroup()\" class=\"p-1 items-center justify-center text-gray-500 hover:text-purple-600 hover:bg-purple-50 rounded transition-colors\" title=\"Add Nested Group\">\n <lucide-icon name=\"grip-horizontal\" class=\"w-4 h-4 transform rotate-90\"></lucide-icon>\n </button>\n <button *ngIf=\"level > 0\" (click)=\"removeSelf()\" class=\"p-1 items-center justify-center text-gray-500 hover:text-red-600 hover:bg-red-50 rounded transition-colors\" title=\"Remove Group\">\n <lucide-icon name=\"trash-2\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n\n <!-- Children -->\n <div class=\"flex flex-col gap-2 pl-4 border-l-2 border-gray-100 ml-2\">\n <ng-container *ngFor=\"let item of group.conditions; let i = index\">\n \n <!-- Condition Row -->\n <div *ngIf=\"isCondition(item)\" class=\"flex items-center gap-2\">\n <div class=\"w-4 h-px bg-gray-300\"></div> <!-- Connector -->\n \n <div class=\"flex-1 grid grid-cols-[1.5fr_1fr_1fr_auto] gap-2 items-center\">\n <!-- Field -->\n <select [ngModel]=\"getAsCondition(item).fieldId\" \n (ngModelChange)=\"updateCondition(i, 'fieldId', $event)\" \n class=\"h-8 w-full rounded-md border border-gray-300 px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option value=\"\" disabled selected>Field</option>\n <option *ngFor=\"let f of allFields\" [value]=\"f.name\">{{f.label || f.name}}</option>\n </select>\n\n <!-- Operator -->\n <select [ngModel]=\"getAsCondition(item).operator\"\n (ngModelChange)=\"updateCondition(i, 'operator', $event)\"\n class=\"h-8 w-full rounded-md border border-gray-300 px-2 text-xs focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option value=\"eq\">Equals</option>\n <option value=\"neq\">Not Equals</option>\n <option value=\"gt\">&gt;</option>\n <option value=\"lt\">&lt;</option>\n <option value=\"gte\">&gt;=</option>\n <option value=\"lte\">&lt;=</option>\n <option value=\"contains\">Contains</option>\n <option value=\"empty\">Is Empty</option>\n <option value=\"notEmpty\">Not Empty</option>\n <option value=\"truthy\">Is Truthy</option>\n </select>\n\n <!-- Value -->\n <ng-container *ngIf=\"!['empty', 'notEmpty', 'truthy'].includes(getAsCondition(item).operator)\">\n <input [ngModel]=\"getAsCondition(item).value\" \n (ngModelChange)=\"updateCondition(i, 'value', $event)\" placeholder=\"Value\"\n class=\"h-8 w-full rounded-md border border-gray-300 px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n </ng-container>\n <div *ngIf=\"['empty', 'notEmpty', 'truthy'].includes(getAsCondition(item).operator)\" class=\"w-full\"></div>\n\n <!-- Remove -->\n <button (click)=\"removeItem(i)\" class=\"p-1 text-gray-400 hover:text-red-500 hover:bg-red-50 rounded transition-colors\" title=\"Remove Condition\">\n <lucide-icon name=\"x\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n </div>\n\n <!-- Nested Group -->\n <app-query-builder *ngIf=\"!isCondition(item)\"\n [group]=\"getAsGroup(item)\"\n [allFields]=\"allFields\"\n [level]=\"level + 1\"\n (remove)=\"removeItem(i)\"\n (groupChange)=\"onChildGroupChange()\">\n </app-query-builder>\n\n </ng-container>\n\n <div *ngIf=\"group.conditions.length === 0\" class=\"text-xs text-gray-400 italic py-1 pl-4\">\n No conditions.\n </div>\n </div>\n </div>\n `,\n styles: []\n})\nexport class QueryBuilderComponent {\n @Input() group!: LogicGroup;\n @Input() allFields: any[] = [];\n @Input() level = 0;\n\n @Output() groupChange = new EventEmitter<LogicGroup>();\n @Output() remove = new EventEmitter<void>();\n\n isCondition(item: any): boolean {\n return 'fieldId' in item; // Simple check\n }\n\n getAsCondition(item: any): LogicCondition {\n return item as LogicCondition;\n }\n\n getAsGroup(item: any): LogicGroup {\n return item as LogicGroup;\n }\n\n setOperator(op: 'AND' | 'OR') {\n this.group.operator = op;\n this.emitChange();\n }\n\n addCondition() {\n this.group.conditions.push({\n fieldId: '',\n operator: 'eq',\n value: ''\n });\n this.emitChange();\n }\n\n addGroup() {\n this.group.conditions.push({\n operator: 'AND',\n conditions: []\n });\n this.emitChange();\n }\n\n removeItem(index: number) {\n this.group.conditions.splice(index, 1);\n this.emitChange();\n }\n\n removeSelf() {\n this.remove.emit();\n }\n\n updateCondition(index: number, field: string, value: any) {\n const item = this.group.conditions[index] as any;\n item[field] = value;\n this.emitChange();\n }\n\n onChildGroupChange() {\n this.emitChange();\n }\n\n emitChange() {\n this.groupChange.emit(this.group);\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'ui-accordion',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"border-b border-border-dark\">\n <button type=\"button\"\n class=\"w-full flex items-center justify-between px-3 py-2 text-left hover:bg-gray-50 transition-colors group\"\n (click)=\"toggle()\">\n <div class=\"flex items-center gap-1\">\n <svg class=\"w-3 h-3 text-gray-500 transition-transform\" \n [class.rotate-90]=\"isOpen\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M9 18l6-6-6-6\"/>\n </svg>\n <span class=\"text-[11px] font-bold text-gray-800\">{{ title }}</span>\n </div>\n <svg *ngIf=\"showAdd\" \n class=\"w-4 h-4 text-gray-400 opacity-0 group-hover:opacity-100 transition-opacity cursor-pointer hover:text-gray-700\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M12 5v14M5 12h14\"/>\n </svg>\n </button>\n <div *ngIf=\"isOpen\" class=\"px-3 pb-3\">\n <ng-content></ng-content>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; }\n `]\n})\nexport class UiAccordionComponent {\n @Input() title = '';\n @Input() subtitle?: string;\n @Input() expanded = true;\n @Input() showAdd = false;\n\n get isOpen() {\n return this.expanded;\n }\n\n toggle() {\n this.expanded = !this.expanded;\n }\n}\n","import { Component, Input, Output, EventEmitter, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../../ui/ui-icon.module';\nimport { FormRule, FieldSchema } from '../../../form-core/models';\nimport { QueryBuilderComponent } from '../query-builder/query-builder.component';\nimport { UiAccordionComponent } from '../../../ui/ui-accordion.component';\nimport { v4 as uuidv4 } from 'uuid';\n\n@Component({\n selector: 'app-rules-panel',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n UiIconModule,\n QueryBuilderComponent,\n UiAccordionComponent\n ],\n template: `\n <div class=\"flex flex-col gap-4 font-sans text-sm p-1\">\n <div class=\"flex items-center justify-between mb-2\">\n <div class=\"flex flex-col\">\n <span class=\"font-semibold text-gray-700\">Rules</span>\n <span class=\"text-xs text-gray-500\">Rules can override visibility, enabled, and required set elsewhere.</span>\n </div>\n <button (click)=\"addRule()\" class=\"h-8 px-3 flex items-center gap-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 active:bg-blue-800 transition-colors shadow-sm text-xs font-medium\">\n <lucide-icon name=\"plus\" class=\"w-3.5 h-3.5\"></lucide-icon> Add Rule\n </button>\n </div>\n\n <div *ngIf=\"!rules || rules.length === 0\" class=\"text-center text-gray-400 py-10 text-sm bg-gray-50 rounded-lg border border-dashed border-gray-200\">\n <div class=\"flex flex-col items-center gap-2\">\n <lucide-icon name=\"settings\" class=\"w-8 h-8 text-gray-300\"></lucide-icon>\n <p>No rules defined yet.</p>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-3\" *ngIf=\"rules && rules.length > 0\">\n \n <div *ngFor=\"let rule of rules; let i = index\" class=\"border border-gray-200 rounded-lg bg-white shadow-sm overflow-hidden\">\n <!-- Use UiAccordion for correct toggle behavior -->\n <ui-accordion [title]=\"rule.action | titlecase\">\n <!-- Accordion Content -->\n <div class=\"flex flex-col gap-4 px-1\">\n \n <!-- Logic Setup -->\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex items-center gap-2 bg-gray-50 p-2 rounded-md border border-gray-100\">\n <span class=\"text-xs font-semibold text-gray-500 uppercase\">IF</span>\n <span class=\"text-xs text-gray-600 italic\">conditions match...</span>\n </div>\n \n <!-- Query Builder -->\n <app-query-builder \n [group]=\"rule.conditions\" \n [allFields]=\"allFields\"\n (groupChange)=\"onChange()\">\n </app-query-builder>\n </div>\n\n <div class=\"h-px bg-gray-100 w-full my-1\"></div>\n\n <!-- Action Selector -->\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex items-center gap-2 bg-blue-50 p-2 rounded-md border border-blue-100\">\n <span class=\"text-xs font-semibold text-blue-600 uppercase\">THEN</span>\n <span class=\"text-xs text-blue-800 italic\">set this field to...</span>\n </div>\n \n <div class=\"flex items-center gap-2\">\n <select [(ngModel)]=\"rule.action\" (change)=\"onChange()\" class=\"flex-1 h-9 rounded-md border border-gray-300 px-3 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option value=\"visible\">Visible</option>\n <option value=\"hidden\">Hidden</option>\n <option value=\"enable\">Enabled</option>\n <option value=\"disable\">Disabled</option>\n <option value=\"required\">Required</option>\n <option value=\"optional\">Optional</option>\n </select>\n </div>\n </div>\n\n <div class=\"flex justify-end pt-3 border-t border-gray-100 mt-2\">\n <button (click)=\"removeRule(i)\" class=\"text-red-500 hover:text-red-700 text-xs font-medium flex items-center gap-1 transition-colors px-2 py-1 hover:bg-red-50 rounded\">\n <lucide-icon name=\"trash-2\" class=\"w-3.5 h-3.5\"></lucide-icon> Remove Rule\n </button>\n </div>\n </div>\n </ui-accordion>\n </div>\n\n </div>\n </div>\n `,\n styles: [`\n /* No custom styles needed, utility classes sufficient */\n `]\n})\nexport class RulesPanelComponent {\n @Input() rules: FormRule[] = [];\n @Input() allFields: any[] = [];\n @Output() rulesChange = new EventEmitter<FormRule[]>();\n\n addRule() {\n if (!this.rules) this.rules = [];\n this.rules.push({\n id: uuidv4(),\n action: 'visible',\n conditions: {\n operator: 'AND',\n conditions: []\n }\n });\n this.onChange();\n }\n\n removeRule(index: number) {\n this.rules.splice(index, 1);\n this.onChange();\n }\n\n onChange() {\n this.rulesChange.emit(this.rules);\n }\n\n getActionColor(action: string): string {\n switch (action) {\n case 'visible': return 'bg-green-50 text-green-600 border-green-200';\n case 'hidden': return 'bg-gray-100 text-gray-500 border-gray-300';\n case 'enable': return 'bg-blue-50 text-blue-600 border-blue-200';\n case 'disable': return 'bg-amber-50 text-amber-600 border-amber-200';\n case 'required': return 'bg-red-50 text-red-600 border-red-200';\n case 'optional': return 'bg-teal-50 text-teal-600 border-teal-200';\n default: return 'bg-gray-50 text-gray-600';\n }\n }\n}\n","\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { FieldSchema, WidgetEventBinding, WidgetEventType, WidgetEventAction } from '../../form-core/models';\nimport { v4 as uuidv4 } from 'uuid';\n\n@Component({\n selector: 'app-events-panel',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-4 font-sans text-sm\">\n \n <div class=\"flex items-center justify-between\">\n <span class=\"text-xs font-bold text-gray-500 uppercase tracking-wide\">Event Bindings</span>\n <button (click)=\"addEvent()\" class=\"p-1 text-blue-600 hover:bg-blue-50 rounded transition-colors\" title=\"Add Event\">\n <lucide-icon name=\"plus\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n\n <div *ngIf=\"!bindings.length\" class=\"text-center p-6 bg-gray-50 rounded-lg border border-dashed border-gray-200 text-gray-400 text-xs\">\n No events configured.\n </div>\n\n <div class=\"flex flex-col gap-3\">\n <div *ngFor=\"let binding of bindings; let i = index\" class=\"border border-gray-200 rounded-lg bg-white overflow-hidden\">\n <!-- Header -->\n <div class=\"bg-gray-50 px-3 py-2 flex items-center gap-2 border-b border-gray-200\">\n <input type=\"checkbox\" [(ngModel)]=\"binding.enabled\" (change)=\"emitChange()\" class=\"rounded text-blue-600 focus:ring-blue-500\">\n <select [(ngModel)]=\"binding.on\" (ngModelChange)=\"emitChange()\" class=\"flex-1 bg-transparent border-none text-xs font-medium focus:ring-0 p-0\">\n <option *ngFor=\"let type of eventTypes\" [value]=\"type\">{{ type }}</option>\n </select>\n <button (click)=\"removeEvent(i)\" class=\"text-gray-400 hover:text-red-500\">\n <lucide-icon name=\"trash-2\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n \n <!-- Actions -->\n <div class=\"p-2 flex flex-col gap-2\">\n <div *ngFor=\"let action of binding.actions; let j = index\" class=\"flex flex-col gap-2 bg-gray-50 p-2 rounded border border-gray-100 relative\">\n <div class=\"flex gap-2 items-center\">\n <span class=\"text-[10px] text-gray-400 font-mono\">THEN</span>\n <select [(ngModel)]=\"action.type\" (ngModelChange)=\"emitChange()\" class=\"flex-1 text-xs h-6 rounded border-gray-200 bg-white\">\n <option value=\"setValue\">Set Value</option>\n <option value=\"log\">Log</option>\n </select>\n <button (click)=\"removeAction(binding, j)\" class=\"text-gray-400 hover:text-red-500\">\n <lucide-icon name=\"x\" class=\"w-3 h-3\"></lucide-icon>\n </button>\n </div>\n\n <!-- Action Config -->\n <div class=\"pl-8 flex flex-col gap-2\">\n <!-- Set Value Config -->\n <ng-container *ngIf=\"action.type === 'setValue'\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[10px] text-gray-400\">Target Field</label>\n <select [(ngModel)]=\"asSetValue(action).targetFieldId\" (ngModelChange)=\"emitChange()\" class=\"w-full text-xs h-7 rounded border border-gray-200\">\n <option *ngFor=\"let f of availableFields\" [value]=\"f.id\">{{ f.label || f.name }}</option>\n </select>\n </div>\n \n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[10px] text-gray-400\">Value From</label>\n <div class=\"flex bg-white border border-gray-200 rounded p-0.5\">\n <button (click)=\"asSetValue(action).valueFrom = 'literal'; emitChange()\" [class.bg-gray-100]=\"asSetValue(action).valueFrom === 'literal'\" class=\"flex-1 text-[10px] rounded py-0.5 transition-colors\">Literal</button>\n <button (click)=\"asSetValue(action).valueFrom = 'field'; emitChange()\" [class.bg-gray-100]=\"asSetValue(action).valueFrom === 'field'\" class=\"flex-1 text-[10px] rounded transition-colors\">Field</button>\n <button (click)=\"asSetValue(action).valueFrom = 'event'; emitChange()\" [class.bg-gray-100]=\"asSetValue(action).valueFrom === 'event'\" class=\"flex-1 text-[10px] rounded transition-colors\">Event</button>\n </div>\n </div>\n\n <div *ngIf=\"asSetValue(action).valueFrom === 'literal'\">\n <input [(ngModel)]=\"asSetValue(action).valueLiteral\" (blur)=\"emitChange()\" placeholder=\"Value\" class=\"w-full text-xs h-7 px-2 rounded border border-gray-200\">\n </div>\n <div *ngIf=\"asSetValue(action).valueFrom === 'field'\">\n <select [(ngModel)]=\"asSetValue(action).sourceFieldId\" (ngModelChange)=\"emitChange()\" class=\"w-full text-xs h-7 rounded border border-gray-200\">\n <option value=\"\">Select Source</option>\n <option *ngFor=\"let f of availableFields\" [value]=\"f.id\">{{ f.label || f.name }}</option>\n </select>\n </div>\n </ng-container>\n\n <!-- Log Config -->\n <ng-container *ngIf=\"action.type === 'log'\">\n <input [(ngModel)]=\"asLog(action).message\" (blur)=\"emitChange()\" placeholder=\"Message...\" class=\"w-full text-xs h-7 px-2 rounded border border-gray-200\">\n </ng-container>\n </div>\n </div>\n\n <button (click)=\"addAction(binding)\" class=\"text-xs text-blue-600 hover:text-blue-700 font-medium flex items-center gap-1 mt-1 pl-1\">\n <lucide-icon name=\"plus\" class=\"w-3 h-3\"></lucide-icon> Add Action\n </button>\n </div>\n </div>\n </div>\n </div>\n `\n})\nexport class EventsPanelComponent {\n @Input() config!: FieldSchema;\n @Input() allFields: FieldSchema[] = [];\n @Output() configChange = new EventEmitter<FieldSchema>();\n\n eventTypes: WidgetEventType[] = ['focus', 'blur', 'change', 'click', 'dirty', 'touched'];\n\n get bindings(): WidgetEventBinding[] {\n return this.config?.events || [];\n }\n\n get availableFields() {\n return this.allFields.filter(f => f.id !== this.config.id);\n }\n\n addEvent() {\n const newBinding: WidgetEventBinding = {\n id: uuidv4(),\n on: 'change',\n enabled: true,\n actions: [{ type: 'log', message: 'Event fired' }]\n };\n const events = [...(this.config.events || []), newBinding];\n this.emitUpdate(events);\n }\n\n removeEvent(index: number) {\n const events = [...(this.config.events || [])];\n events.splice(index, 1);\n this.emitUpdate(events);\n }\n\n addAction(binding: WidgetEventBinding) {\n binding.actions.push({ type: 'log' });\n this.emitChange();\n }\n\n removeAction(binding: WidgetEventBinding, index: number) {\n binding.actions.splice(index, 1);\n this.emitChange();\n }\n\n asSetValue(action: WidgetEventAction): any {\n return action;\n }\n\n asLog(action: WidgetEventAction): any {\n return action;\n }\n\n emitChange() {\n this.emitUpdate(this.config.events || []);\n }\n\n private emitUpdate(events: WidgetEventBinding[]) {\n this.configChange.emit({\n ...this.config,\n events\n });\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { WIDGET_DEFINITIONS, WidgetDefinition, DataBindingContract } from '../../widgets/widget-definition';\nimport { FieldSchema, WidgetKind } from '../../form-core/models';\n\n/**\n * Service responsible for resolving widget definitions.\n * Handles lookup by widgetId (preferred) or by kind/type fallback for backward compatibility.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class WidgetDefinitionResolverService {\n private readonly widgetDefs: WidgetDefinition[];\n\n constructor(@Inject(WIDGET_DEFINITIONS) widgetDefs: WidgetDefinition[][]) {\n this.widgetDefs = widgetDefs.flat();\n }\n\n /**\n * Finds a widget definition for the given field and widget kind.\n * Prefers widgetId when present, falls back to kind/type matching.\n * \n * @param field - The field schema to find a definition for\n * @param kind - The widget kind\n * @returns The matching widget definition, or null if not found\n */\n findDefinition(field: FieldSchema, kind: WidgetKind): WidgetDefinition | null {\n if (field.widgetId) {\n const byId = this.widgetDefs.find(w => w.id === field.widgetId);\n if (byId) return byId;\n }\n return this.widgetDefs.find(w => w.kind === kind && w.type === field.type) || null;\n }\n\n /**\n * Gets the data consumer type for a field.\n * \n * @param field - The field schema\n * @param kind - The widget kind\n * @returns The data consumer type, or 'none' if not found\n */\n getDataConsumer(field: FieldSchema, kind: WidgetKind): string {\n const def = this.findDefinition(field, kind);\n return def?.dataConsumer || 'none';\n }\n\n /**\n * Gets the data binding contract for a field.\n * \n * @param field - The field schema\n * @param kind - The widget kind\n * @returns The data binding contract, or null if not found\n */\n getDataBinding(field: FieldSchema, kind: WidgetKind): DataBindingContract | null {\n const def = this.findDefinition(field, kind);\n return def?.dataBinding || null;\n }\n}\n","import { Component, input, output, computed, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { StyleTokenSet } from '../../form-core/models';\n\n/**\n * Light theme Layout section with segmented controls.\n */\n@Component({\n selector: 'inspector-layout-section',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-3\">\n <!-- Display Row -->\n <div class=\"inspector-row\">\n <span class=\"inspector-label\">Display</span>\n <div class=\"flex-1 flex bg-input-dark rounded p-0.5 border border-border-dark\">\n @for (opt of displayOptions; track opt.value) {\n <button\n type=\"button\"\n (click)=\"setDisplay(opt.value)\"\n [class]=\"currentDisplay() === opt.value \n ? 'flex-1 py-1 text-[11px] bg-gray-600 text-white rounded shadow-sm' \n : 'flex-1 py-1 text-[11px] text-gray-500 hover:text-gray-700'\">\n {{ opt.label }}\n </button>\n }\n </div>\n </div>\n \n <!-- Flex Controls -->\n @if (currentDisplay() === 'flex') {\n <!-- Direction Row -->\n <div class=\"inspector-row\">\n <span class=\"inspector-label text-primary-blue\">Direction</span>\n <div class=\"flex-1 flex bg-input-dark rounded p-0.5 gap-0.5 border border-border-dark\">\n @for (dir of flexDirections; track dir.value) {\n <button\n type=\"button\"\n (click)=\"updateStyle('flexDirection', dir.value)\"\n [class]=\"style()['flexDirection'] === dir.value \n ? 'flex-1 py-1 flex justify-center bg-gray-600 rounded' \n : 'flex-1 py-1 flex justify-center hover:bg-gray-100 rounded'\"\n [title]=\"dir.label\">\n <lucide-icon [name]=\"dir.icon\" \n [class]=\"style()['flexDirection'] === dir.value ? 'w-4 h-4 text-white' : 'w-4 h-4 text-gray-500'\">\n </lucide-icon>\n </button>\n }\n </div>\n </div>\n \n <!-- Align Row (3x3 Grid + X/Y Selectors) -->\n <div class=\"inspector-row items-start\">\n <span class=\"inspector-label text-primary-blue pt-1\">Align</span>\n <div class=\"flex-1 flex gap-2\">\n <!-- 3x3 Alignment Grid -->\n <div class=\"w-16 h-16 bg-input-dark border border-border-dark rounded grid grid-cols-3 grid-rows-3 p-1 gap-1\">\n @for (pos of alignmentGrid; track pos.id) {\n <button\n type=\"button\"\n (click)=\"setAlignment(pos.align, pos.justify)\"\n class=\"rounded-sm flex items-center justify-center hover:bg-gray-200\">\n @if (isAlignmentActive(pos.align, pos.justify)) {\n <div class=\"w-1 h-2 bg-gray-700 rounded-sm\"></div>\n }\n </button>\n }\n </div>\n \n <!-- X/Y Dropdowns -->\n <div class=\"flex-1 flex flex-col gap-2\">\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[11px] text-gray-500 mr-2\">X</span>\n <select\n [ngModel]=\"style()['justifyContent'] || 'flex-start'\"\n (ngModelChange)=\"updateStyle('justifyContent', $event)\"\n class=\"inspector-select flex-1\">\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"space-between\">Between</option>\n <option value=\"space-around\">Around</option>\n </select>\n </div>\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[11px] text-gray-500 mr-2\">Y</span>\n <select\n [ngModel]=\"style()['alignItems'] || 'flex-start'\"\n (ngModelChange)=\"updateStyle('alignItems', $event)\"\n class=\"inspector-select flex-1\">\n <option value=\"flex-start\">Top</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">Bottom</option>\n <option value=\"stretch\">Stretch</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n \n <!-- Gap Row -->\n <div class=\"inspector-row\">\n <span class=\"inspector-label\">Gap</span>\n <div class=\"flex-1 flex items-center gap-2\">\n <!-- Slider -->\n <div class=\"relative flex-1 h-4 flex items-center\">\n <input\n type=\"range\"\n [ngModel]=\"parseValue(style()['gap'])\"\n (ngModelChange)=\"updateStyle('gap', $event + 'px')\"\n min=\"0\"\n max=\"64\"\n class=\"w-full h-0.5 bg-gray-300 rounded appearance-none cursor-pointer accent-primary-blue\">\n </div>\n <!-- Value + Unit -->\n <div class=\"inspector-input-with-unit\">\n <input\n type=\"number\"\n [ngModel]=\"parseValue(style()['gap'])\"\n (ngModelChange)=\"updateStyle('gap', $event + 'px')\"\n min=\"0\"\n class=\"inspector-number-input\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n <lucide-icon name=\"lock\" class=\"w-3 h-3 text-gray-400\"></lucide-icon>\n </div>\n </div>\n \n <!-- Wrap Toggle -->\n <div class=\"inspector-row\">\n <span class=\"inspector-label\">Wrap</span>\n <button\n type=\"button\"\n (click)=\"toggleWrap()\"\n [class]=\"style()['flexWrap'] === 'wrap' \n ? 'inspector-toggle-active' \n : 'inspector-toggle'\">\n <lucide-icon name=\"wrap-text\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n \n <!-- More alignment options -->\n <button \n type=\"button\" \n (click)=\"showMoreAlign.set(!showMoreAlign())\"\n class=\"w-full py-1 bg-input-dark hover:bg-gray-100 rounded text-[11px] flex items-center justify-center gap-1 border border-border-dark text-gray-500\">\n <lucide-icon name=\"chevron-right\" \n class=\"w-3 h-3 transition-transform\"\n [class.rotate-90]=\"showMoreAlign()\"></lucide-icon>\n More alignment options\n </button>\n \n @if (showMoreAlign()) {\n <div class=\"flex flex-col gap-2 bg-input-dark p-2 rounded border border-border-dark\">\n <div class=\"inspector-row\">\n <span class=\"inspector-label\">Align Self</span>\n <select\n [ngModel]=\"style()['alignSelf'] || 'auto'\"\n (ngModelChange)=\"updateStyle('alignSelf', $event)\"\n class=\"inspector-select flex-1\">\n <option value=\"auto\">Auto</option>\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"stretch\">Stretch</option>\n </select>\n </div>\n <div class=\"inspector-row\">\n <span class=\"inspector-label\">Order</span>\n <input\n type=\"number\"\n [ngModel]=\"style()['order'] || 0\"\n (ngModelChange)=\"updateStyle('order', $event)\"\n class=\"inspector-input w-16\">\n </div>\n </div>\n }\n }\n \n <!-- Grid Controls -->\n @if (currentDisplay() === 'grid') {\n <div class=\"inspector-row\">\n <span class=\"inspector-label\">Columns</span>\n <input\n type=\"text\"\n [ngModel]=\"style()['gridTemplateColumns'] || '1fr 1fr'\"\n (ngModelChange)=\"updateStyle('gridTemplateColumns', $event)\"\n placeholder=\"1fr 1fr 1fr\"\n class=\"inspector-input flex-1\">\n </div>\n \n <div class=\"inspector-row\">\n <span class=\"inspector-label\">Rows</span>\n <input\n type=\"text\"\n [ngModel]=\"style()['gridTemplateRows'] || 'auto'\"\n (ngModelChange)=\"updateStyle('gridTemplateRows', $event)\"\n placeholder=\"auto\"\n class=\"inspector-input flex-1\">\n </div>\n \n <div class=\"inspector-row\">\n <span class=\"inspector-label\">Gap</span>\n <div class=\"inspector-input-with-unit flex-1\">\n <input\n type=\"number\"\n [ngModel]=\"parseValue(style()['gap'])\"\n (ngModelChange)=\"updateStyle('gap', $event + 'px')\"\n min=\"0\"\n class=\"inspector-number-input flex-1\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .inspector-row {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n .inspector-label {\n font-size: 11px;\n color: var(--color-slate-500, #6b7280);\n width: 4rem;\n flex-shrink: 0;\n }\n .inspector-input {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n line-height: 1rem;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n color: var(--color-ink-700);\n }\n .inspector-input:focus {\n outline: none;\n border-color: var(--color-primary-blue);\n }\n .inspector-select {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n line-height: 1rem;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n color: var(--color-ink-700);\n appearance: none;\n cursor: pointer;\n }\n .inspector-select:focus {\n outline: none;\n border-color: var(--color-primary-blue);\n }\n .inspector-toggle {\n height: 1.75rem;\n width: 1.75rem;\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-slate-500, #6b7280);\n background-color: var(--color-input-dark);\n transition-property: color, background-color, border-color;\n transition-duration: 150ms;\n }\n .inspector-toggle:hover {\n background-color: #f3f4f6;\n }\n .inspector-toggle-active {\n height: 1.75rem;\n width: 1.75rem;\n border: 1px solid var(--color-primary-blue);\n border-radius: var(--radius-md);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-primary-blue);\n background-color: #eff6ff;\n }\n .inspector-input-with-unit {\n display: flex;\n align-items: center;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n }\n .inspector-input-with-unit:hover {\n border-color: #9ca3af;\n }\n .inspector-number-input {\n width: 2.5rem;\n background-color: transparent;\n border: none;\n padding: 0;\n text-align: right;\n font-size: 0.75rem;\n line-height: 1rem;\n color: var(--color-ink-700);\n }\n .inspector-number-input:focus {\n outline: none;\n }\n .inspector-unit {\n font-size: 10px;\n color: var(--color-ink-400);\n margin-left: 0.25rem;\n }\n input[type=number]::-webkit-inner-spin-button,\n input[type=number]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n `]\n})\nexport class InspectorLayoutSectionComponent {\n readonly style = input<Partial<StyleTokenSet>>({});\n readonly styleChange = output<Partial<StyleTokenSet>>();\n \n showMoreAlign = signal(false);\n \n readonly displayOptions = [\n { value: 'block', label: 'Block' },\n { value: 'flex', label: 'Flex' },\n { value: 'grid', label: 'Grid' },\n { value: 'none', label: 'None' }\n ];\n \n readonly flexDirections = [\n { value: 'row', label: 'Row', icon: 'arrow-right' },\n { value: 'column', label: 'Column', icon: 'arrow-down' },\n { value: 'row-reverse', label: 'Row Reverse', icon: 'shuffle' }\n ];\n \n readonly alignmentGrid = [\n { id: 'tl', align: 'flex-start', justify: 'flex-start' },\n { id: 'tc', align: 'flex-start', justify: 'center' },\n { id: 'tr', align: 'flex-start', justify: 'flex-end' },\n { id: 'ml', align: 'center', justify: 'flex-start' },\n { id: 'mc', align: 'center', justify: 'center' },\n { id: 'mr', align: 'center', justify: 'flex-end' },\n { id: 'bl', align: 'flex-end', justify: 'flex-start' },\n { id: 'bc', align: 'flex-end', justify: 'center' },\n { id: 'br', align: 'flex-end', justify: 'flex-end' }\n ];\n \n currentDisplay = computed(() => this.style()['display'] || 'block');\n \n setDisplay(value: string) {\n if (value === 'flex' && this.currentDisplay() !== 'flex') {\n this.styleChange.emit({\n ...this.style(),\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'flex-start',\n justifyContent: 'flex-start',\n gap: '16px'\n });\n } else if (value === 'grid' && this.currentDisplay() !== 'grid') {\n this.styleChange.emit({\n ...this.style(),\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '16px'\n });\n } else {\n this.updateStyle('display', value);\n }\n }\n \n setAlignment(align: string, justify: string) {\n this.styleChange.emit({\n ...this.style(),\n alignItems: align,\n justifyContent: justify\n });\n }\n \n isAlignmentActive(align: string, justify: string): boolean {\n const currentAlign = this.style()['alignItems'] || 'flex-start';\n const currentJustify = this.style()['justifyContent'] || 'flex-start';\n return currentAlign === align && currentJustify === justify;\n }\n \n toggleWrap() {\n const current = this.style()['flexWrap'];\n this.updateStyle('flexWrap', current === 'wrap' ? 'nowrap' : 'wrap');\n }\n \n parseValue(val: string | number | undefined): number {\n if (val === undefined || val === null) return 0;\n const num = parseFloat(String(val));\n return isNaN(num) ? 0 : num;\n }\n \n updateStyle(key: string, value: any) {\n this.styleChange.emit({ ...this.style(), [key]: value });\n }\n}\n","import { Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { StyleTokenSet } from '../../form-core/models';\n\n/**\n * Light theme Spacing section with visual box model.\n */\n@Component({\n selector: 'inspector-spacing-section',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-3\">\n <!-- Visual Box Model -->\n <div class=\"relative\">\n <!-- Margin Box (Outer) -->\n <div class=\"bg-gray-200 p-1 rounded relative h-28 flex items-center justify-center\">\n <!-- Margin Label -->\n <span class=\"absolute top-1 left-2 text-[9px] text-gray-500 font-bold uppercase tracking-wide\">Margin</span>\n \n <!-- Top Margin -->\n <input\n type=\"text\"\n [ngModel]=\"style()['marginTop'] || '0'\"\n (ngModelChange)=\"updateStyle('marginTop', $event)\"\n placeholder=\"0\"\n class=\"absolute top-1 left-1/2 transform -translate-x-1/2 w-8 h-5 text-center text-xs bg-transparent text-gray-600 border-0 focus:outline-none focus:ring-0\">\n \n <!-- Bottom Margin -->\n <input\n type=\"text\"\n [ngModel]=\"style()['marginBottom'] || '0'\"\n (ngModelChange)=\"updateStyle('marginBottom', $event)\"\n placeholder=\"0\"\n class=\"absolute bottom-1 left-1/2 transform -translate-x-1/2 w-8 h-5 text-center text-xs bg-transparent text-gray-600 border-0 focus:outline-none focus:ring-0\">\n \n <!-- Left Margin (with Auto button) -->\n <button \n type=\"button\" \n (click)=\"updateStyle('marginLeft', 'auto')\"\n [class]=\"style()['marginLeft'] === 'auto' ? 'absolute left-2 top-1/2 transform -translate-y-1/2 text-xs text-primary-blue cursor-pointer' : 'absolute left-2 top-1/2 transform -translate-y-1/2 text-xs text-gray-500 hover:text-primary-blue cursor-pointer'\">\n {{ style()['marginLeft'] === 'auto' ? 'Auto' : (style()['marginLeft'] || '0') }}\n </button>\n \n <!-- Right Margin (with Auto button) -->\n <button \n type=\"button\" \n (click)=\"updateStyle('marginRight', 'auto')\"\n [class]=\"style()['marginRight'] === 'auto' ? 'absolute right-2 top-1/2 transform -translate-y-1/2 text-xs text-primary-blue cursor-pointer' : 'absolute right-2 top-1/2 transform -translate-y-1/2 text-xs text-gray-500 hover:text-primary-blue cursor-pointer'\">\n {{ style()['marginRight'] === 'auto' ? 'Auto' : (style()['marginRight'] || '0') }}\n </button>\n \n <!-- Padding Box (Inner) -->\n <div class=\"bg-gray-300 w-3/5 h-3/5 border border-gray-400 flex items-center justify-center relative shadow-inner\">\n <!-- Padding Label -->\n <span class=\"absolute top-1 left-2 text-[8px] text-gray-500 font-bold uppercase tracking-wide\">Padding</span>\n \n <!-- Top Padding -->\n <input\n type=\"text\"\n [ngModel]=\"style()['paddingTop'] || '0'\"\n (ngModelChange)=\"updateStyle('paddingTop', $event)\"\n placeholder=\"0\"\n class=\"absolute top-1 left-1/2 transform -translate-x-1/2 w-6 h-4 text-center text-[10px] bg-transparent text-gray-600 border-0 focus:outline-none focus:ring-0\">\n \n <!-- Bottom Padding -->\n <input\n type=\"text\"\n [ngModel]=\"style()['paddingBottom'] || '0'\"\n (ngModelChange)=\"updateStyle('paddingBottom', $event)\"\n placeholder=\"0\"\n class=\"absolute bottom-1 left-1/2 transform -translate-x-1/2 w-6 h-4 text-center text-[10px] bg-transparent text-gray-600 border-0 focus:outline-none focus:ring-0\">\n \n <!-- Left Padding -->\n <input\n type=\"text\"\n [ngModel]=\"style()['paddingLeft'] || '0'\"\n (ngModelChange)=\"updateStyle('paddingLeft', $event)\"\n placeholder=\"0\"\n class=\"absolute left-2 top-1/2 transform -translate-y-1/2 w-6 h-4 text-center text-[10px] bg-transparent text-gray-600 border-0 focus:outline-none focus:ring-0\">\n \n <!-- Right Padding -->\n <input\n type=\"text\"\n [ngModel]=\"style()['paddingRight'] || '0'\"\n (ngModelChange)=\"updateStyle('paddingRight', $event)\"\n placeholder=\"0\"\n class=\"absolute right-2 top-1/2 transform -translate-y-1/2 w-6 h-4 text-center text-[10px] bg-transparent text-gray-600 border-0 focus:outline-none focus:ring-0\">\n \n <!-- Center Content Indicator -->\n <div class=\"w-12 h-4 bg-gray-400 rounded-sm\"></div>\n </div>\n </div>\n </div>\n \n <!-- Info Box -->\n <div class=\"bg-input-dark p-2 rounded text-[11px] text-gray-500 leading-tight border border-border-dark\">\n Centering doesn't affect elements without a fixed width.\n </div>\n </div>\n `,\n styles: [`\n input[type=text]:focus {\n background: rgba(0,0,0,0.03);\n border-radius: 2px;\n }\n `]\n})\nexport class InspectorSpacingSectionComponent {\n readonly style = input<Partial<StyleTokenSet>>({});\n readonly styleChange = output<Partial<StyleTokenSet>>();\n \n updateStyle(key: string, value: any) {\n this.styleChange.emit({ ...this.style(), [key]: value });\n }\n}\n","import { Component, input, output, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { StyleTokenSet } from '../../form-core/models';\n\n/**\n * Light theme Size section with grid layout.\n */\n@Component({\n selector: 'inspector-size-section',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-3\">\n <!-- Width / Height Row -->\n <div class=\"grid grid-cols-[50px_1fr_50px_1fr] gap-2 items-center text-[11px]\">\n <label class=\"text-gray-500\">Width</label>\n <input\n type=\"text\"\n [ngModel]=\"style()['width'] || 'Auto'\"\n (ngModelChange)=\"updateStyle('width', $event)\"\n class=\"inspector-input\">\n \n <label class=\"text-gray-500\">Height</label>\n <input\n type=\"text\"\n [ngModel]=\"style()['height'] || 'Auto'\"\n (ngModelChange)=\"updateStyle('height', $event)\"\n class=\"inspector-input\">\n \n <!-- Min W / Min H -->\n <label class=\"text-gray-500\">Min W</label>\n <div class=\"inspector-input-with-unit\">\n <input\n type=\"text\"\n [ngModel]=\"style()['minWidth'] || '0'\"\n (ngModelChange)=\"updateStyle('minWidth', $event)\"\n class=\"inspector-number-input flex-1\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n \n <label class=\"text-gray-500\">Min H</label>\n <div class=\"inspector-input-with-unit\">\n <input\n type=\"text\"\n [ngModel]=\"style()['minHeight'] || '0'\"\n (ngModelChange)=\"updateStyle('minHeight', $event)\"\n class=\"inspector-number-input flex-1\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n \n <!-- Max W / Max H -->\n <label class=\"text-gray-500\">Max W</label>\n <input\n type=\"text\"\n [ngModel]=\"style()['maxWidth'] || 'None'\"\n (ngModelChange)=\"updateStyle('maxWidth', $event)\"\n class=\"inspector-input\">\n \n <label class=\"text-gray-500\">Max H</label>\n <input\n type=\"text\"\n [ngModel]=\"style()['maxHeight'] || 'None'\"\n (ngModelChange)=\"updateStyle('maxHeight', $event)\"\n class=\"inspector-input\">\n </div>\n \n <!-- Overflow Row -->\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Overflow</label>\n <div class=\"flex bg-input-dark border border-border-dark rounded\">\n @for (opt of overflowOptions; track opt.value) {\n <button\n type=\"button\"\n (click)=\"updateStyle('overflow', opt.value)\"\n [class]=\"style()['overflow'] === opt.value \n ? 'flex-1 py-1 flex justify-center items-center bg-gray-200 rounded' \n : 'flex-1 py-1 flex justify-center items-center hover:bg-gray-100 border-l border-border-dark first:border-l-0'\">\n @if (opt.icon) {\n <lucide-icon [name]=\"opt.icon\" \n [class]=\"style()['overflow'] === opt.value ? 'w-4 h-4 text-gray-700' : 'w-4 h-4 text-gray-400'\">\n </lucide-icon>\n } @else {\n <span class=\"text-[10px]\" [class]=\"style()['overflow'] === opt.value ? 'text-gray-700' : 'text-gray-400'\">\n {{ opt.label }}\n </span>\n }\n </button>\n }\n </div>\n </div>\n \n <!-- More size options -->\n <button \n type=\"button\" \n (click)=\"showMore.set(!showMore())\"\n class=\"w-full flex justify-center items-center gap-1 py-1 text-gray-500 border border-transparent hover:border-border-dark rounded transition-colors text-[11px]\">\n <lucide-icon name=\"chevron-right\" \n class=\"w-3 h-3 transition-transform\"\n [class.rotate-90]=\"showMore()\"></lucide-icon>\n More size options\n </button>\n \n @if (showMore()) {\n <div class=\"flex flex-col gap-2 bg-input-dark p-2 rounded border border-border-dark\">\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Aspect</label>\n <input\n type=\"text\"\n [ngModel]=\"style()['aspectRatio']\"\n (ngModelChange)=\"updateStyle('aspectRatio', $event)\"\n placeholder=\"e.g., 16/9\"\n class=\"inspector-input\">\n </div>\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Object Fit</label>\n <select\n [ngModel]=\"style()['objectFit']\"\n (ngModelChange)=\"updateStyle('objectFit', $event)\"\n class=\"inspector-select\">\n <option value=\"\">None</option>\n <option value=\"contain\">Contain</option>\n <option value=\"cover\">Cover</option>\n <option value=\"fill\">Fill</option>\n <option value=\"scale-down\">Scale Down</option>\n </select>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .inspector-input {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n line-height: 1rem;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n color: var(--color-ink-700);\n }\n .inspector-input:focus {\n outline: none;\n border-color: var(--color-primary-blue);\n }\n .inspector-select {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n line-height: 1rem;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n color: var(--color-ink-700);\n appearance: none;\n cursor: pointer;\n }\n .inspector-select:focus {\n outline: none;\n border-color: var(--color-primary-blue);\n }\n .inspector-input-with-unit {\n display: flex;\n align-items: center;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n overflow: hidden;\n }\n .inspector-number-input {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n background-color: transparent;\n border: none;\n font-size: 0.75rem;\n line-height: 1rem;\n color: var(--color-ink-700);\n }\n .inspector-number-input:focus {\n outline: none;\n }\n .inspector-unit {\n font-size: 10px;\n color: var(--color-ink-400);\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n background-color: var(--color-input-dark);\n height: 1.75rem;\n display: flex;\n align-items: center;\n border-left: 1px solid var(--color-border-dark);\n }\n `]\n})\nexport class InspectorSizeSectionComponent {\n readonly style = input<Partial<StyleTokenSet>>({});\n readonly styleChange = output<Partial<StyleTokenSet>>();\n \n showMore = signal(false);\n \n readonly overflowOptions = [\n { value: 'visible', label: '', icon: 'eye' },\n { value: 'hidden', label: '', icon: 'eye-off' },\n { value: 'scroll', label: '', icon: 'move-vertical' },\n { value: 'auto', label: 'Auto', icon: '' }\n ];\n \n updateStyle(key: string, value: any) {\n this.styleChange.emit({ ...this.style(), [key]: value });\n }\n}\n","import { Component, input, output, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { StyleTokenSet } from '../../form-core/models';\n\n/**\n * Light theme Position section.\n */\n@Component({\n selector: 'inspector-position-section',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-3\">\n <!-- Position Type -->\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Position</label>\n <button\n type=\"button\"\n (click)=\"showPositionDropdown.set(!showPositionDropdown())\"\n class=\"w-full flex items-center justify-between bg-input-dark border border-border-dark rounded px-2 py-1.5 text-xs text-gray-700 hover:border-gray-400\">\n <div class=\"flex items-center gap-2\">\n <lucide-icon name=\"x\" class=\"w-4 h-4 text-gray-400\"></lucide-icon>\n <span>{{ style()['position'] || 'Static' }}</span>\n </div>\n <lucide-icon name=\"chevron-down\" class=\"w-3 h-3 text-gray-400\"></lucide-icon>\n </button>\n </div>\n \n @if (showPositionDropdown()) {\n <div class=\"bg-input-dark border border-border-dark rounded overflow-hidden shadow-lg\">\n @for (opt of positionOptions; track opt.value) {\n <button\n type=\"button\"\n (click)=\"setPosition(opt.value)\"\n class=\"w-full flex items-center gap-2 px-3 py-2 text-xs text-left hover:bg-gray-100\"\n [class.bg-gray-100]=\"style()['position'] === opt.value\">\n <lucide-icon [name]=\"opt.icon\" class=\"w-4 h-4 text-gray-400\"></lucide-icon>\n <span class=\"text-gray-700\">{{ opt.label }}</span>\n </button>\n }\n </div>\n }\n \n <!-- Position Values (shown for non-static) -->\n @if (style()['position'] && style()['position'] !== 'static') {\n <div class=\"grid grid-cols-2 gap-2\">\n <div class=\"grid grid-cols-[40px_1fr] gap-1 items-center\">\n <label class=\"text-[11px] text-gray-500\">Top</label>\n <div class=\"inspector-input-with-unit\">\n <input\n type=\"text\"\n [ngModel]=\"style()['top'] || 'auto'\"\n (ngModelChange)=\"updateStyle('top', $event)\"\n class=\"inspector-number-input flex-1\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n </div>\n \n <div class=\"grid grid-cols-[40px_1fr] gap-1 items-center\">\n <label class=\"text-[11px] text-gray-500\">Right</label>\n <div class=\"inspector-input-with-unit\">\n <input\n type=\"text\"\n [ngModel]=\"style()['right'] || 'auto'\"\n (ngModelChange)=\"updateStyle('right', $event)\"\n class=\"inspector-number-input flex-1\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n </div>\n \n <div class=\"grid grid-cols-[40px_1fr] gap-1 items-center\">\n <label class=\"text-[11px] text-gray-500\">Bottom</label>\n <div class=\"inspector-input-with-unit\">\n <input\n type=\"text\"\n [ngModel]=\"style()['bottom'] || 'auto'\"\n (ngModelChange)=\"updateStyle('bottom', $event)\"\n class=\"inspector-number-input flex-1\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n </div>\n \n <div class=\"grid grid-cols-[40px_1fr] gap-1 items-center\">\n <label class=\"text-[11px] text-gray-500\">Left</label>\n <div class=\"inspector-input-with-unit\">\n <input\n type=\"text\"\n [ngModel]=\"style()['left'] || 'auto'\"\n (ngModelChange)=\"updateStyle('left', $event)\"\n class=\"inspector-number-input flex-1\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n </div>\n </div>\n \n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Z-Index</label>\n <input\n type=\"number\"\n [ngModel]=\"style()['zIndex'] || 'auto'\"\n (ngModelChange)=\"updateStyle('zIndex', $event)\"\n class=\"inspector-input w-20\">\n </div>\n }\n \n <!-- Float and Clear button -->\n <button \n type=\"button\" \n (click)=\"showFloatClear.set(!showFloatClear())\"\n class=\"w-full flex justify-center items-center gap-1 py-1.5 text-gray-500 bg-input-dark border border-border-dark rounded transition-colors text-[11px] hover:bg-gray-100\">\n <lucide-icon name=\"chevron-right\" \n class=\"w-3 h-3 transition-transform\"\n [class.rotate-90]=\"showFloatClear()\"></lucide-icon>\n Float and clear\n </button>\n \n @if (showFloatClear()) {\n <div class=\"flex flex-col gap-2 bg-input-dark p-2 rounded border border-border-dark\">\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Float</label>\n <div class=\"flex bg-white border border-border-dark rounded\">\n @for (opt of floatOptions; track opt.value) {\n <button\n type=\"button\"\n (click)=\"updateStyle('float', opt.value)\"\n [class]=\"style()['float'] === opt.value \n ? 'flex-1 py-1 text-[10px] bg-gray-200 rounded text-gray-700' \n : 'flex-1 py-1 text-[10px] text-gray-500 hover:text-gray-700'\">\n {{ opt.label }}\n </button>\n }\n </div>\n </div>\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Clear</label>\n <div class=\"flex bg-white border border-border-dark rounded\">\n @for (opt of clearOptions; track opt.value) {\n <button\n type=\"button\"\n (click)=\"updateStyle('clear', opt.value)\"\n [class]=\"style()['clear'] === opt.value \n ? 'flex-1 py-1 text-[10px] bg-gray-200 rounded text-gray-700' \n : 'flex-1 py-1 text-[10px] text-gray-500 hover:text-gray-700'\">\n {{ opt.label }}\n </button>\n }\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .inspector-input {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n line-height: 1rem;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n color: var(--color-ink-700);\n }\n .inspector-input:focus {\n outline: none;\n border-color: var(--color-primary-blue);\n }\n .inspector-input-with-unit {\n display: flex;\n align-items: center;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n overflow: hidden;\n }\n .inspector-number-input {\n height: 1.5rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n background-color: transparent;\n border: none;\n font-size: 0.75rem;\n line-height: 1rem;\n color: var(--color-ink-700);\n }\n .inspector-number-input:focus {\n outline: none;\n }\n .inspector-unit {\n font-size: 10px;\n color: var(--color-ink-400);\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n background-color: var(--color-input-dark);\n height: 1.5rem;\n display: flex;\n align-items: center;\n border-left: 1px solid var(--color-border-dark);\n }\n `]\n})\nexport class InspectorPositionSectionComponent {\n readonly style = input<Partial<StyleTokenSet>>({});\n readonly styleChange = output<Partial<StyleTokenSet>>();\n \n showPositionDropdown = signal(false);\n showFloatClear = signal(false);\n \n readonly positionOptions = [\n { value: 'static', label: 'Static', icon: 'x' },\n { value: 'relative', label: 'Relative', icon: 'move' },\n { value: 'absolute', label: 'Absolute', icon: 'maximize' },\n { value: 'fixed', label: 'Fixed', icon: 'pin' },\n { value: 'sticky', label: 'Sticky', icon: 'paperclip' }\n ];\n \n readonly floatOptions = [\n { value: 'none', label: 'None' },\n { value: 'left', label: 'Left' },\n { value: 'right', label: 'Right' }\n ];\n \n readonly clearOptions = [\n { value: 'none', label: 'None' },\n { value: 'left', label: 'Left' },\n { value: 'right', label: 'Right' },\n { value: 'both', label: 'Both' }\n ];\n \n setPosition(value: string) {\n this.updateStyle('position', value);\n this.showPositionDropdown.set(false);\n }\n \n updateStyle(key: string, value: any) {\n this.styleChange.emit({ ...this.style(), [key]: value });\n }\n}\n","import { Component, input, output, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { StyleTokenSet } from '../../form-core/models';\n\n/**\n * Light theme Typography section.\n */\n@Component({\n selector: 'inspector-typography-section',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-3\">\n <!-- Font Family -->\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-highlight-orange\">Font</label>\n <button\n type=\"button\"\n class=\"w-full flex items-center justify-between bg-input-dark border border-border-dark rounded px-2 py-1 text-xs text-gray-700\">\n <span>{{ style()['fontFamily'] || 'Montserrat' }}</span>\n <lucide-icon name=\"chevron-down\" class=\"w-3 h-3 text-gray-400\"></lucide-icon>\n </button>\n </div>\n \n <!-- Weight -->\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-highlight-orange\">Weight</label>\n <select\n [ngModel]=\"style()['fontWeight'] || '400'\"\n (ngModelChange)=\"updateStyle('fontWeight', $event)\"\n class=\"inspector-select\">\n <option value=\"300\">300 - Light</option>\n <option value=\"400\">400 - Normal</option>\n <option value=\"500\">500 - Medium</option>\n <option value=\"600\">600 - Semi Bold</option>\n <option value=\"700\">700 - Bold</option>\n </select>\n </div>\n \n <!-- Size / Height Row -->\n <div class=\"grid grid-cols-[60px_1fr_60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-highlight-orange\">Size</label>\n <div class=\"inspector-input-with-unit\">\n <input\n type=\"text\"\n [ngModel]=\"style()['fontSize'] || '16'\"\n (ngModelChange)=\"updateStyle('fontSize', $event)\"\n class=\"inspector-number-input flex-1\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n \n <label class=\"text-[11px] text-highlight-orange\">Height</label>\n <div class=\"inspector-input-with-unit\">\n <input\n type=\"text\"\n [ngModel]=\"style()['lineHeight'] || '28'\"\n (ngModelChange)=\"updateStyle('lineHeight', $event)\"\n class=\"inspector-number-input flex-1\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n </div>\n \n <!-- Color -->\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-highlight-orange\">Color</label>\n <div class=\"flex items-center bg-input-dark border border-border-dark rounded px-2 py-1\">\n <input\n type=\"color\"\n [ngModel]=\"style()['color'] || '#1a1b1f'\"\n (ngModelChange)=\"updateStyle('color', $event)\"\n class=\"w-4 h-4 border border-gray-300 rounded-sm mr-2 cursor-pointer\">\n <input\n type=\"text\"\n [ngModel]=\"style()['color'] || '#1a1b1f'\"\n (ngModelChange)=\"updateStyle('color', $event)\"\n class=\"bg-transparent border-none p-0 text-xs text-gray-700 focus:ring-0 w-full\">\n </div>\n </div>\n \n <!-- Align -->\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Align</label>\n <div class=\"flex bg-input-dark border border-border-dark rounded\">\n @for (opt of alignOptions; track opt.value) {\n <button\n type=\"button\"\n (click)=\"updateStyle('textAlign', opt.value)\"\n [class]=\"style()['textAlign'] === opt.value \n ? 'flex-1 py-1 flex justify-center items-center bg-gray-200 rounded' \n : 'flex-1 py-1 flex justify-center items-center hover:bg-gray-100 border-l border-border-dark first:border-l-0'\">\n <lucide-icon [name]=\"opt.icon\" \n [class]=\"style()['textAlign'] === opt.value ? 'w-4 h-4 text-gray-700' : 'w-4 h-4 text-gray-400'\">\n </lucide-icon>\n </button>\n }\n </div>\n </div>\n \n <!-- Decoration -->\n <div class=\"grid grid-cols-[60px_1fr_30px] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Decor</label>\n <div class=\"flex bg-input-dark border border-border-dark rounded\">\n @for (opt of decorOptions; track opt.value) {\n <button\n type=\"button\"\n (click)=\"updateStyle('textDecoration', opt.value)\"\n [class]=\"style()['textDecoration'] === opt.value \n ? 'flex-1 py-1 flex justify-center items-center bg-gray-200 rounded' \n : 'flex-1 py-1 flex justify-center items-center hover:bg-gray-100 border-l border-border-dark first:border-l-0'\">\n <lucide-icon [name]=\"opt.icon\" \n [class]=\"style()['textDecoration'] === opt.value ? 'w-4 h-4 text-gray-700' : 'w-4 h-4 text-gray-400'\">\n </lucide-icon>\n </button>\n }\n </div>\n <button class=\"flex justify-center items-center text-gray-400 hover:text-gray-700\">\n <lucide-icon name=\"more-horizontal\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n \n <!-- More type options -->\n <button \n type=\"button\" \n (click)=\"showMore.set(!showMore())\"\n class=\"w-full flex justify-center items-center gap-1 py-1 text-gray-500 border border-transparent hover:border-border-dark rounded transition-colors text-[11px]\">\n <lucide-icon name=\"chevron-right\" \n class=\"w-3 h-3 transition-transform\"\n [class.rotate-90]=\"showMore()\"></lucide-icon>\n More type options\n </button>\n \n @if (showMore()) {\n <div class=\"flex flex-col gap-2 bg-input-dark p-2 rounded border border-border-dark\">\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Letter</label>\n <input\n type=\"text\"\n [ngModel]=\"style()['letterSpacing']\"\n (ngModelChange)=\"updateStyle('letterSpacing', $event)\"\n placeholder=\"normal\"\n class=\"inspector-input\">\n </div>\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Transform</label>\n <select\n [ngModel]=\"style()['textTransform']\"\n (ngModelChange)=\"updateStyle('textTransform', $event)\"\n class=\"inspector-select\">\n <option value=\"\">None</option>\n <option value=\"uppercase\">Uppercase</option>\n <option value=\"lowercase\">Lowercase</option>\n <option value=\"capitalize\">Capitalize</option>\n </select>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .inspector-input {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n line-height: 1rem;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n color: var(--color-ink-700);\n }\n .inspector-input:focus {\n outline: none;\n border-color: var(--color-primary-blue);\n }\n .inspector-select {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n line-height: 1rem;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n color: var(--color-ink-700);\n appearance: none;\n cursor: pointer;\n }\n .inspector-select:focus {\n outline: none;\n border-color: var(--color-primary-blue);\n }\n .inspector-input-with-unit {\n display: flex;\n align-items: center;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n overflow: hidden;\n }\n .inspector-number-input {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n background-color: transparent;\n border: none;\n font-size: 0.75rem;\n line-height: 1rem;\n color: var(--color-ink-700);\n }\n .inspector-number-input:focus {\n outline: none;\n }\n .inspector-unit {\n font-size: 10px;\n color: var(--color-ink-400);\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n background-color: var(--color-input-dark);\n height: 1.75rem;\n display: flex;\n align-items: center;\n border-left: 1px solid var(--color-border-dark);\n }\n `]\n})\nexport class InspectorTypographySectionComponent {\n readonly style = input<Partial<StyleTokenSet>>({});\n readonly styleChange = output<Partial<StyleTokenSet>>();\n \n showMore = signal(false);\n \n readonly alignOptions = [\n { value: 'left', icon: 'align-left' },\n { value: 'center', icon: 'align-center' },\n { value: 'right', icon: 'align-right' },\n { value: 'justify', icon: 'align-justify' }\n ];\n \n readonly decorOptions = [\n { value: 'none', icon: 'x' },\n { value: 'line-through', icon: 'strikethrough' },\n { value: 'underline', icon: 'underline' },\n { value: 'overline', icon: 'type' }\n ];\n \n updateStyle(key: string, value: any) {\n this.styleChange.emit({ ...this.style(), [key]: value });\n }\n}\n","import { Component, input, output, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { StyleTokenSet } from '../../form-core/models';\n\n/**\n * Light theme Borders section.\n */\n@Component({\n selector: 'inspector-borders-section',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-3\">\n <!-- Radius Row -->\n <div class=\"flex items-center gap-2\">\n <span class=\"text-[11px] text-gray-500 w-14\">Radius</span>\n <div class=\"flex-1 flex items-center gap-2\">\n <!-- Corner selector -->\n <div class=\"flex gap-1\">\n @for (opt of radiusCorners; track opt.corner) {\n <button\n type=\"button\"\n (click)=\"selectCorner(opt.corner)\"\n [class]=\"selectedCorner() === opt.corner \n ? 'w-6 h-6 flex items-center justify-center bg-gray-200 rounded text-gray-700 border border-gray-400' \n : 'w-6 h-6 flex items-center justify-center bg-input-dark rounded text-gray-500 border border-transparent hover:border-gray-300'\"\n [title]=\"opt.label\">\n <lucide-icon [name]=\"opt.icon\" class=\"w-3 h-3\"></lucide-icon>\n </button>\n }\n </div>\n \n <!-- Slider -->\n <input\n type=\"range\"\n [ngModel]=\"parseValue(getRadiusValue())\"\n (ngModelChange)=\"setRadiusValue($event + 'px')\"\n min=\"0\"\n max=\"50\"\n class=\"flex-1 h-0.5 bg-gray-300 rounded appearance-none cursor-pointer accent-primary-blue\">\n \n <!-- Value -->\n <div class=\"inspector-input-with-unit w-14\">\n <input\n type=\"text\"\n [ngModel]=\"getRadiusValue()\"\n (ngModelChange)=\"setRadiusValue($event)\"\n class=\"inspector-number-input\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n </div>\n </div>\n \n <!-- Borders Section -->\n <div class=\"text-[11px] text-gray-500 mb-1\">Borders</div>\n \n <div class=\"grid grid-cols-[auto_1fr] gap-4\">\n <!-- Side Selector Grid -->\n <div class=\"grid grid-cols-3 gap-1 w-fit place-items-center\">\n <!-- Top -->\n <div class=\"col-start-2 w-5 h-5 flex items-center justify-center border border-border-dark rounded hover:bg-gray-100 cursor-pointer\"\n (click)=\"selectSide('top')\"\n [class.bg-gray-200]=\"selectedSide() === 'top'\">\n <div class=\"w-3 h-[1px] bg-gray-500\"></div>\n </div>\n <!-- Left -->\n <div class=\"col-start-1 row-start-2 w-5 h-5 flex items-center justify-center border border-border-dark rounded hover:bg-gray-100 cursor-pointer\"\n (click)=\"selectSide('left')\"\n [class.bg-gray-200]=\"selectedSide() === 'left'\">\n <div class=\"w-[1px] h-3 bg-gray-500\"></div>\n </div>\n <!-- All -->\n <div class=\"col-start-2 row-start-2 w-6 h-6 flex items-center justify-center bg-gray-200 border border-gray-400 rounded cursor-pointer\"\n (click)=\"selectSide('all')\"\n [class.border-gray-600]=\"selectedSide() === 'all'\">\n <div class=\"w-3 h-3 border border-gray-600\"></div>\n </div>\n <!-- Right -->\n <div class=\"col-start-3 row-start-2 w-5 h-5 flex items-center justify-center border border-border-dark rounded hover:bg-gray-100 cursor-pointer\"\n (click)=\"selectSide('right')\"\n [class.bg-gray-200]=\"selectedSide() === 'right'\">\n <div class=\"w-[1px] h-3 bg-gray-500\"></div>\n </div>\n <!-- Bottom -->\n <div class=\"col-start-2 row-start-3 w-5 h-5 flex items-center justify-center border border-border-dark rounded hover:bg-gray-100 cursor-pointer\"\n (click)=\"selectSide('bottom')\"\n [class.bg-gray-200]=\"selectedSide() === 'bottom'\">\n <div class=\"w-3 h-[1px] bg-gray-500\"></div>\n </div>\n </div>\n \n <!-- Border Controls -->\n <div class=\"flex flex-col gap-2 w-full\">\n <!-- Style -->\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[11px] text-gray-500 w-10\">Style</span>\n <div class=\"flex bg-input-dark rounded border border-border-dark p-[1px]\">\n @for (st of borderStyles; track st.value) {\n <button\n type=\"button\"\n (click)=\"updateStyle('borderStyle', st.value)\"\n [class]=\"style()['borderStyle'] === st.value \n ? 'p-1 px-2 bg-gray-200 rounded' \n : 'p-1 px-2 hover:bg-gray-100 rounded'\">\n <lucide-icon [name]=\"st.icon\" \n [class]=\"style()['borderStyle'] === st.value ? 'w-3 h-3 text-gray-700' : 'w-3 h-3 text-gray-400'\">\n </lucide-icon>\n </button>\n }\n </div>\n </div>\n \n <!-- Width -->\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[11px] text-gray-500 w-10\">Width</span>\n <div class=\"inspector-input-with-unit w-24\">\n <input\n type=\"text\"\n [ngModel]=\"style()['borderWidth'] || '0'\"\n (ngModelChange)=\"updateStyle('borderWidth', $event)\"\n class=\"inspector-number-input flex-1 text-left\">\n <span class=\"inspector-unit\">PX</span>\n </div>\n </div>\n \n <!-- Color -->\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[11px] text-gray-500 w-10\">Color</span>\n <div class=\"flex items-center w-24 bg-input-dark border border-border-dark rounded px-1 py-0.5 cursor-pointer\">\n <input\n type=\"color\"\n [ngModel]=\"style()['borderColor'] || '#000000'\"\n (ngModelChange)=\"updateStyle('borderColor', $event)\"\n class=\"w-3 h-3 border border-gray-300 mr-2 cursor-pointer\">\n <span class=\"text-xs text-gray-700\">{{ getColorName(style()['borderColor']) }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .inspector-input-with-unit {\n display: flex;\n align-items: center;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n overflow: hidden;\n }\n .inspector-number-input {\n height: 1.5rem;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n background-color: transparent;\n border: none;\n text-align: right;\n font-size: 0.75rem;\n line-height: 1rem;\n color: var(--color-ink-700);\n width: 100%;\n }\n .inspector-number-input:focus {\n outline: none;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n }\n .inspector-unit {\n font-size: 9px;\n color: var(--color-ink-400);\n margin-left: 0.25rem;\n }\n `]\n})\nexport class InspectorBordersSectionComponent {\n readonly style = input<Partial<StyleTokenSet>>({});\n readonly styleChange = output<Partial<StyleTokenSet>>();\n \n selectedCorner = signal<'all' | 'tl' | 'tr' | 'br' | 'bl'>('all');\n selectedSide = signal<'all' | 'top' | 'right' | 'bottom' | 'left'>('all');\n \n readonly radiusCorners = [\n { corner: 'all' as const, label: 'All Corners', icon: 'square' },\n { corner: 'tl' as const, label: 'Top Left', icon: 'corner-up-left' },\n { corner: 'tr' as const, label: 'Top Right', icon: 'corner-up-right' },\n { corner: 'bl' as const, label: 'Bottom Left', icon: 'corner-down-left' },\n { corner: 'br' as const, label: 'Bottom Right', icon: 'corner-down-right' }\n ];\n \n readonly borderStyles = [\n { value: 'none', icon: 'x' },\n { value: 'solid', icon: 'minus' },\n { value: 'dashed', icon: 'more-horizontal' },\n { value: 'dotted', icon: 'grip-horizontal' }\n ];\n \n selectCorner(corner: 'all' | 'tl' | 'tr' | 'br' | 'bl') {\n this.selectedCorner.set(corner);\n }\n \n selectSide(side: 'all' | 'top' | 'right' | 'bottom' | 'left') {\n this.selectedSide.set(side);\n }\n \n getRadiusValue(): string {\n const corner = this.selectedCorner();\n if (corner === 'all') return String(this.style()['borderRadius'] || '0');\n const map: Record<string, string> = {\n tl: 'borderTopLeftRadius',\n tr: 'borderTopRightRadius',\n br: 'borderBottomRightRadius',\n bl: 'borderBottomLeftRadius'\n };\n return String((this.style() as any)[map[corner]] || '0');\n }\n \n setRadiusValue(value: string) {\n const corner = this.selectedCorner();\n if (corner === 'all') {\n this.updateStyle('borderRadius', value);\n } else {\n const map: Record<string, string> = {\n tl: 'borderTopLeftRadius',\n tr: 'borderTopRightRadius',\n br: 'borderBottomRightRadius',\n bl: 'borderBottomLeftRadius'\n };\n this.updateStyle(map[corner], value);\n }\n }\n \n parseValue(val: string | number | undefined): number {\n if (val === undefined || val === null) return 0;\n const num = parseFloat(String(val));\n return isNaN(num) ? 0 : num;\n }\n \n getColorName(color: string | undefined): string {\n if (!color) return 'black';\n if (color === '#000000' || color === 'black') return 'black';\n if (color === '#ffffff' || color === 'white') return 'white';\n return color;\n }\n \n updateStyle(key: string, value: any) {\n this.styleChange.emit({ ...this.style(), [key]: value });\n }\n}\n","import { Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { StyleTokenSet } from '../../form-core/models';\n\n/**\n * Light theme Backgrounds section.\n */\n@Component({\n selector: 'inspector-backgrounds-section',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-3\">\n <!-- Image & Gradient -->\n <div class=\"flex justify-between items-center group cursor-pointer py-1\">\n <span class=\"text-[11px] text-gray-500\">Image & gradient</span>\n <lucide-icon name=\"plus\" class=\"w-4 h-4 text-gray-400 group-hover:text-gray-700\"></lucide-icon>\n </div>\n \n <!-- Background Color -->\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Color</label>\n <div class=\"flex items-center bg-input-dark border border-border-dark rounded px-2 py-1\">\n <div class=\"w-4 h-4 rounded-sm mr-2 border border-gray-300 overflow-hidden\"\n [style.background]=\"getBackgroundPreview()\">\n </div>\n <input\n type=\"text\"\n [ngModel]=\"style()['backgroundColor'] || 'transparent'\"\n (ngModelChange)=\"updateStyle('backgroundColor', $event)\"\n class=\"bg-transparent border-none p-0 text-xs text-gray-700 focus:ring-0 w-full\">\n </div>\n </div>\n \n @if (showImageUrl) {\n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Image</label>\n <input\n type=\"text\"\n [ngModel]=\"style()['backgroundImage']\"\n (ngModelChange)=\"updateStyle('backgroundImage', $event)\"\n placeholder=\"url(...)\"\n class=\"inspector-input\">\n </div>\n \n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Size</label>\n <select\n [ngModel]=\"style()['backgroundSize']\"\n (ngModelChange)=\"updateStyle('backgroundSize', $event)\"\n class=\"inspector-select\">\n <option value=\"auto\">Auto</option>\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n </select>\n </div>\n \n <div class=\"grid grid-cols-[60px_1fr] gap-2 items-center\">\n <label class=\"text-[11px] text-gray-500\">Position</label>\n <select\n [ngModel]=\"style()['backgroundPosition']\"\n (ngModelChange)=\"updateStyle('backgroundPosition', $event)\"\n class=\"inspector-select\">\n <option value=\"center\">Center</option>\n <option value=\"top\">Top</option>\n <option value=\"bottom\">Bottom</option>\n <option value=\"left\">Left</option>\n <option value=\"right\">Right</option>\n </select>\n </div>\n }\n </div>\n `,\n styles: [`\n .inspector-input {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n line-height: 1rem;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n color: var(--color-ink-700);\n }\n .inspector-input:focus {\n outline: none;\n border-color: var(--color-primary-blue);\n }\n .inspector-select {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n line-height: 1rem;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n color: var(--color-ink-700);\n appearance: none;\n cursor: pointer;\n }\n .inspector-select:focus {\n outline: none;\n border-color: var(--color-primary-blue);\n }\n `]\n})\nexport class InspectorBackgroundsSectionComponent {\n readonly style = input<Partial<StyleTokenSet>>({});\n readonly styleChange = output<Partial<StyleTokenSet>>();\n \n showImageUrl = false;\n \n getBackgroundPreview(): string {\n const bg = this.style()['backgroundColor'];\n if (!bg || bg === 'transparent') {\n return `linear-gradient(45deg, #ccc 25%, transparent 25%), \n linear-gradient(-45deg, #ccc 25%, transparent 25%), \n linear-gradient(45deg, transparent 75%, #ccc 75%), \n linear-gradient(-45deg, transparent 75%, #ccc 75%)`;\n }\n return bg;\n }\n \n updateStyle(key: string, value: any) {\n this.styleChange.emit({ ...this.style(), [key]: value });\n }\n}\n","import { Component, input, output, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { StyleTokenSet } from '../../form-core/models';\n\n/**\n * Light theme Effects section.\n */\n@Component({\n selector: 'inspector-effects-section',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-3\">\n <!-- Blending -->\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[11px] text-gray-500 w-16\">Blending</span>\n <select\n [ngModel]=\"style()['mixBlendMode'] || 'normal'\"\n (ngModelChange)=\"updateStyle('mixBlendMode', $event)\"\n class=\"inspector-select flex-1\">\n <option value=\"normal\">Normal</option>\n <option value=\"multiply\">Multiply</option>\n <option value=\"screen\">Screen</option>\n <option value=\"overlay\">Overlay</option>\n <option value=\"darken\">Darken</option>\n <option value=\"lighten\">Lighten</option>\n </select>\n </div>\n \n <!-- Opacity -->\n <div class=\"flex items-center gap-2\">\n <span class=\"text-[11px] text-gray-500 w-16\">Opacity</span>\n <div class=\"flex-1 flex items-center gap-2\">\n <input\n type=\"range\"\n [ngModel]=\"parseOpacity()\"\n (ngModelChange)=\"setOpacity($event)\"\n min=\"0\"\n max=\"100\"\n class=\"flex-1 h-0.5 bg-gray-300 rounded appearance-none cursor-pointer accent-primary-blue\">\n <div class=\"inspector-input-with-unit w-14\">\n <input\n type=\"number\"\n [ngModel]=\"parseOpacity()\"\n (ngModelChange)=\"setOpacity($event)\"\n min=\"0\"\n max=\"100\"\n class=\"inspector-number-input\">\n <span class=\"inspector-unit\">%</span>\n </div>\n </div>\n </div>\n \n <!-- Outline -->\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[11px] text-gray-500 w-16\">Outline</span>\n <div class=\"flex-1 flex bg-input-dark rounded border border-border-dark p-[1px]\">\n @for (opt of outlineOptions; track opt.value) {\n <button\n type=\"button\"\n (click)=\"updateStyle('outlineStyle', opt.value)\"\n [class]=\"style()['outlineStyle'] === opt.value \n ? 'flex-1 p-1 bg-gray-200 rounded' \n : 'flex-1 p-1 hover:bg-gray-100 rounded'\">\n <lucide-icon [name]=\"opt.icon\" \n [class]=\"style()['outlineStyle'] === opt.value ? 'w-3 h-3 text-gray-700 mx-auto' : 'w-3 h-3 text-gray-400 mx-auto'\">\n </lucide-icon>\n </button>\n }\n </div>\n </div>\n \n <!-- Effect List Items -->\n <div class=\"flex flex-col\">\n @for (item of effectItems; track item.label) {\n <div class=\"py-1.5 flex justify-between items-center hover:bg-gray-50 cursor-pointer group px-1 -mx-1 rounded\">\n <span class=\"text-[11px] text-gray-500 flex items-center gap-1\">\n {{ item.label }}\n @if (item.hasMore) {\n <lucide-icon name=\"more-horizontal\" class=\"w-3 h-3\"></lucide-icon>\n }\n </span>\n <lucide-icon name=\"plus\" class=\"w-4 h-4 text-gray-400 opacity-0 group-hover:opacity-100\"></lucide-icon>\n </div>\n }\n </div>\n \n <!-- Cursor -->\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[11px] text-gray-500 w-16\">Cursor</span>\n <div class=\"flex-1 relative\">\n <select\n [ngModel]=\"style()['cursor'] || 'auto'\"\n (ngModelChange)=\"updateStyle('cursor', $event)\"\n class=\"inspector-select w-full pl-8\">\n <option value=\"auto\">auto</option>\n <option value=\"pointer\">pointer</option>\n <option value=\"grab\">grab</option>\n <option value=\"text\">text</option>\n <option value=\"move\">move</option>\n <option value=\"not-allowed\">not-allowed</option>\n </select>\n <lucide-icon name=\"mouse-pointer\" class=\"w-3 h-3 absolute left-2 top-2 text-gray-400\"></lucide-icon>\n </div>\n </div>\n \n <!-- Pointer Events -->\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[11px] text-gray-500 w-16\">Events</span>\n <div class=\"flex-1 flex bg-input-dark rounded border border-border-dark p-[1px]\">\n <button\n type=\"button\"\n (click)=\"updateStyle('pointerEvents', 'auto')\"\n [class]=\"(style()['pointerEvents'] || 'auto') === 'auto' \n ? 'flex-1 py-1 px-2 bg-white border border-gray-300 rounded shadow-sm text-gray-700 text-xs font-medium' \n : 'flex-1 py-1 px-2 text-gray-500 hover:text-gray-700 text-xs'\">\n Auto\n </button>\n <button\n type=\"button\"\n (click)=\"updateStyle('pointerEvents', 'none')\"\n [class]=\"style()['pointerEvents'] === 'none' \n ? 'flex-1 py-1 px-2 bg-white border border-gray-300 rounded shadow-sm text-gray-700 text-xs font-medium' \n : 'flex-1 py-1 px-2 text-gray-500 hover:text-gray-700 text-xs'\">\n None\n </button>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .inspector-select {\n height: 1.75rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n line-height: 1rem;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n color: var(--color-ink-700);\n appearance: none;\n cursor: pointer;\n }\n .inspector-select:focus {\n outline: none;\n border-color: var(--color-primary-blue);\n }\n .inspector-input-with-unit {\n display: flex;\n align-items: center;\n background-color: var(--color-input-dark);\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n overflow: hidden;\n }\n .inspector-number-input {\n height: 1.5rem;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n background-color: transparent;\n border: none;\n text-align: right;\n font-size: 0.75rem;\n line-height: 1rem;\n color: var(--color-ink-700);\n width: 100%;\n }\n .inspector-number-input:focus {\n outline: none;\n }\n .inspector-unit {\n font-size: 9px;\n color: var(--color-ink-400);\n margin-left: 0.25rem;\n }\n `]\n})\nexport class InspectorEffectsSectionComponent {\n readonly style = input<Partial<StyleTokenSet>>({});\n readonly styleChange = output<Partial<StyleTokenSet>>();\n \n readonly outlineOptions = [\n { value: 'none', icon: 'x' },\n { value: 'solid', icon: 'minus' },\n { value: 'dashed', icon: 'more-horizontal' },\n { value: 'dotted', icon: 'grip-horizontal' }\n ];\n \n readonly effectItems = [\n { label: 'Box shadows', hasMore: false },\n { label: '2D & 3D transforms', hasMore: true },\n { label: 'Transitions', hasMore: false },\n { label: 'Filters', hasMore: false },\n { label: 'Backdrop filters', hasMore: false }\n ];\n \n parseOpacity(): number {\n const val = this.style()['opacity'];\n if (val === undefined || val === null) return 100;\n const num = parseFloat(String(val));\n if (isNaN(num)) return 100;\n return num <= 1 ? Math.round(num * 100) : num;\n }\n \n setOpacity(val: number) {\n this.updateStyle('opacity', val / 100);\n }\n \n updateStyle(key: string, value: any) {\n this.styleChange.emit({ ...this.style(), [key]: value });\n }\n}\n","import { Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\nimport { StyleTokenSet } from '../../form-core/models';\n\n/**\n * Light theme Advanced/Custom Properties section.\n */\n@Component({\n selector: 'inspector-advanced-section',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-3\">\n <!-- Custom CSS property input -->\n <button\n type=\"button\"\n class=\"w-full flex items-center gap-2 border border-border-dark rounded px-3 py-1.5 text-gray-500 hover:bg-gray-50 hover:text-gray-700 transition-colors group\">\n <lucide-icon name=\"plus\" class=\"w-4 h-4\"></lucide-icon>\n <span class=\"text-[11px]\">Add custom property</span>\n </button>\n \n @if (hasCustomProperties()) {\n <div class=\"flex flex-col gap-2 bg-input-dark p-2 rounded border border-border-dark\">\n @for (prop of getCustomProperties(); track prop.key) {\n <div class=\"flex items-center gap-2\">\n <input\n type=\"text\"\n [value]=\"prop.key\"\n class=\"inspector-input flex-1\"\n placeholder=\"property\">\n <input\n type=\"text\"\n [value]=\"prop.value\"\n class=\"inspector-input flex-1\"\n placeholder=\"value\">\n <button\n type=\"button\"\n class=\"text-gray-400 hover:text-red-500 p-1\">\n <lucide-icon name=\"trash-2\" class=\"w-3 h-3\"></lucide-icon>\n </button>\n </div>\n }\n </div>\n }\n \n <!-- Info -->\n <div class=\"text-[10px] text-gray-500 leading-relaxed\">\n Add custom CSS properties for advanced styling that isn't covered by the panels above.\n </div>\n </div>\n `,\n styles: [`\n .inspector-input {\n height: 1.5rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n line-height: 1rem;\n background-color: #ffffff;\n border: 1px solid var(--color-border-dark);\n border-radius: var(--radius-md);\n color: var(--color-ink-700);\n }\n .inspector-input:focus {\n outline: none;\n border-color: var(--color-primary-blue);\n }\n `]\n})\nexport class InspectorAdvancedSectionComponent {\n readonly style = input<Partial<StyleTokenSet>>({});\n readonly styleChange = output<Partial<StyleTokenSet>>();\n \n hasCustomProperties(): boolean {\n return false;\n }\n \n getCustomProperties(): Array<{key: string; value: string}> {\n return [];\n }\n \n updateStyle(key: string, value: any) {\n this.styleChange.emit({ ...this.style(), [key]: value });\n }\n}\n","import { Component, input, output, signal, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WidgetNode, FieldSchema, StyleTokenSet, FormRule } from '../form-core/models';\nimport { UiIconModule } from '../ui/ui-icon.module';\nimport { UiAccordionComponent } from '../ui/ui-accordion.component';\nimport { WidgetDefinitionResolverService } from './services/widget-definition-resolver.service';\n\n// Inspector sections (Style Tab)\nimport { InspectorLayoutSectionComponent } from './inspector-sections/inspector-layout-section.component';\nimport { InspectorSpacingSectionComponent } from './inspector-sections/inspector-spacing-section.component';\nimport { InspectorSizeSectionComponent } from './inspector-sections/inspector-size-section.component';\nimport { InspectorPositionSectionComponent } from './inspector-sections/inspector-position-section.component';\nimport { InspectorTypographySectionComponent } from './inspector-sections/inspector-typography-section.component';\nimport { InspectorBordersSectionComponent } from './inspector-sections/inspector-borders-section.component';\nimport { InspectorBackgroundsSectionComponent } from './inspector-sections/inspector-backgrounds-section.component';\nimport { InspectorEffectsSectionComponent } from './inspector-sections/inspector-effects-section.component';\nimport { InspectorAdvancedSectionComponent } from './inspector-sections/inspector-advanced-section.component';\n\n// Functional Panels (All restored)\nimport { DynamicPropertiesComponent } from './dynamic-properties/dynamic-properties.component';\nimport { DataPanelComponent } from './data-panel/data-panel.component';\nimport { RulesPanelComponent } from './rules-editor/rules-panel/rules-panel.component';\nimport { EventsPanelComponent } from './events-panel/events-panel.component';\n\n// Services\nimport { DesignerStateService } from './designer-state.service';\n\n@Component({\n selector: 'widget-inspector',\n standalone: true,\n imports: [\n CommonModule,\n UiIconModule,\n UiAccordionComponent,\n \n // Style Sections\n InspectorLayoutSectionComponent,\n InspectorSpacingSectionComponent,\n InspectorSizeSectionComponent,\n InspectorPositionSectionComponent,\n InspectorTypographySectionComponent,\n InspectorBordersSectionComponent,\n InspectorBackgroundsSectionComponent,\n InspectorEffectsSectionComponent,\n InspectorAdvancedSectionComponent,\n \n // Functional Panels (All restored)\n DynamicPropertiesComponent,\n DataPanelComponent,\n RulesPanelComponent,\n EventsPanelComponent\n ],\n template: `\n <div class=\"widget-inspector h-full flex flex-col bg-panel-dark font-sans text-[11px] text-gray-700 border-l border-border-dark\">\n \n <!-- Header with Widget Name -->\n <div class=\"flex items-center justify-between px-3 py-2 border-b border-border-dark bg-gray-50\">\n <div class=\"flex items-center gap-2 font-medium text-xs text-gray-800\">\n <lucide-icon [name]=\"getWidgetIcon()\" class=\"w-4 h-4 text-gray-500\"></lucide-icon>\n <span>{{ field().label || 'Widget' }}</span>\n </div>\n <div class=\"flex items-center gap-1 text-gray-400\">\n <button type=\"button\" (click)=\"duplicate.emit()\" class=\"p-1 hover:text-gray-700\" title=\"Duplicate\">\n <lucide-icon name=\"copy\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n <button type=\"button\" (click)=\"delete.emit()\" class=\"p-1 hover:text-red-500\" title=\"Delete\">\n <lucide-icon name=\"trash-2\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"flex items-center px-2 pt-2 border-b border-border-dark bg-panel-dark\">\n @for (tab of tabs; track tab) {\n <button\n type=\"button\"\n (click)=\"activeTab.set(tab)\"\n [class]=\"activeTab() === tab \n ? 'px-2 pb-2 font-semibold text-gray-800 border-b-2 border-gray-800' \n : 'px-2 pb-2 text-gray-500 hover:text-gray-700 border-b-2 border-transparent'\">\n {{ tab }}\n </button>\n }\n </div>\n\n <!-- Scrollable Content -->\n <div class=\"flex-1 overflow-y-auto custom-scrollbar bg-panel-dark\">\n \n <!-- ===================== STYLE TAB ===================== -->\n @if (activeTab() === 'Style') {\n <div class=\"flex flex-col\">\n \n <!-- Style Selector -->\n <div class=\"px-3 py-3 border-b border-border-dark space-y-2\">\n <div class=\"flex justify-between items-center text-gray-500\">\n <span>Style selector</span>\n <span class=\"text-highlight-orange text-xs\">Inheriting 1 selector</span>\n </div>\n <div class=\"flex items-center bg-primary-blue rounded border border-transparent px-2 py-1 justify-between cursor-pointer hover:bg-blue-600 transition-colors\">\n <div class=\"flex items-center gap-2 text-white\">\n <lucide-icon name=\"monitor\" class=\"w-3 h-3\"></lucide-icon>\n <span class=\"font-medium text-xs\">{{ field().label || 'Widget' }}</span>\n </div>\n <lucide-icon name=\"chevron-down\" class=\"w-4 h-4 text-white\"></lucide-icon>\n </div>\n <div class=\"text-[10px] text-gray-500\">\n 1 on this page, 2 on other pages.\n </div>\n </div>\n\n <!-- Accordion Sections -->\n <ui-accordion title=\"Layout\" [expanded]=\"true\">\n <inspector-layout-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-layout-section>\n </ui-accordion>\n\n <ui-accordion title=\"Spacing\" [expanded]=\"true\">\n <inspector-spacing-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-spacing-section>\n </ui-accordion>\n\n <ui-accordion title=\"Size\" [expanded]=\"false\">\n <inspector-size-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-size-section>\n </ui-accordion>\n\n <ui-accordion title=\"Position\" [expanded]=\"false\">\n <inspector-position-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-position-section>\n </ui-accordion>\n\n <ui-accordion title=\"Typography\" [expanded]=\"false\">\n <inspector-typography-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-typography-section>\n </ui-accordion>\n\n <ui-accordion title=\"Borders\" [expanded]=\"false\">\n <inspector-borders-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-borders-section>\n </ui-accordion>\n\n <ui-accordion title=\"Backgrounds\" [expanded]=\"false\">\n <inspector-backgrounds-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-backgrounds-section>\n </ui-accordion>\n\n <ui-accordion title=\"Effects\" [expanded]=\"false\">\n <inspector-effects-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-effects-section>\n </ui-accordion>\n \n <ui-accordion title=\"Custom properties\" [expanded]=\"false\">\n <inspector-advanced-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-advanced-section>\n </ui-accordion>\n \n <!-- Bottom spacer -->\n <div class=\"h-10\"></div>\n </div>\n }\n\n <!-- ===================== SETTINGS TAB ===================== -->\n <!-- Widget-specific settings only (excludes Layout, Spacing, Size, Typography, Appearance sections) -->\n @if (activeTab() === 'Settings') {\n <div class=\"flex flex-col min-h-0 bg-white\">\n <app-dynamic-properties \n [config]=\"field()\"\n [allFields]=\"stateService.schema().fields\"\n [excludeSections]=\"['Layout', 'Spacing', 'Size', 'Typography', 'Appearance', 'Box Model', 'Position']\"\n (configChange)=\"fieldChange.emit($event)\">\n </app-dynamic-properties>\n </div>\n }\n\n <!-- ===================== DATA TAB ===================== -->\n @if (activeTab() === 'Data') {\n <div class=\"flex flex-col min-h-0 bg-white p-1\">\n <app-data-panel\n [config]=\"field()\"\n [allFields]=\"stateService.schema().fields\"\n [dataConsumer]=\"dataConsumer()\"\n [bindingShape]=\"bindingShape()\"\n [widgetType]=\"field().type\"\n (configChange)=\"fieldChange.emit($event)\">\n </app-data-panel>\n </div>\n }\n\n <!-- ===================== RULES TAB ===================== -->\n @if (activeTab() === 'Rules') {\n <div class=\"flex flex-col min-h-0 bg-white\">\n <app-rules-panel\n [rules]=\"field().rules || []\"\n [allFields]=\"stateService.schema().fields\"\n (rulesChange)=\"rulesChange.emit($event)\">\n </app-rules-panel>\n </div>\n }\n\n <!-- ===================== EVENTS TAB ===================== -->\n @if (activeTab() === 'Events') {\n <div class=\"flex flex-col min-h-0 bg-white\">\n <app-events-panel\n [config]=\"field()\"\n [allFields]=\"stateService.schema().fields\"\n (configChange)=\"fieldChange.emit($event)\">\n </app-events-panel>\n </div>\n }\n\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; height: 100%; }\n .custom-scrollbar::-webkit-scrollbar { width: 8px; }\n .custom-scrollbar::-webkit-scrollbar-track { background: transparent; }\n .custom-scrollbar::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; }\n .custom-scrollbar::-webkit-scrollbar-thumb:hover { background: #94a3b8; }\n `]\n})\nexport class WidgetInspectorComponent {\n readonly node = input.required<WidgetNode>();\n readonly field = input.required<FieldSchema>();\n\n readonly fieldChange = output<FieldSchema>();\n readonly styleChange = output<{ target: 'container' | 'widget'; style: Partial<StyleTokenSet> }>();\n readonly rulesChange = output<FormRule[]>();\n readonly duplicate = output<void>();\n readonly delete = output<void>();\n\n protected readonly stateService = inject(DesignerStateService);\n private readonly widgetResolver = inject(WidgetDefinitionResolverService);\n\n // All 5 tabs restored: Style, Settings, Data, Rules, Events\n readonly tabs = ['Style', 'Settings', 'Data', 'Rules', 'Events'];\n activeTab = signal<string>('Style');\n currentTarget = signal<'container' | 'widget'>('container');\n\n currentStyle = computed(() => {\n return this.node().style || {};\n });\n\n // Computed properties for DataPanelComponent\n dataConsumer = computed(() => {\n return this.widgetResolver.getDataConsumer(this.field(), this.node().widgetKind) as 'value' | 'list' | 'image' | 'none';\n });\n\n bindingShape = computed(() => {\n const binding = this.widgetResolver.getDataBinding(this.field(), this.node().widgetKind);\n return binding?.shape || null;\n });\n\n getWidgetIcon(): string {\n const type = this.field().type;\n switch(type) {\n case 'text': return 'type';\n case 'number': return 'hash';\n case 'checkbox': return 'check-square';\n case 'textarea': return 'align-left';\n case 'select': return 'list';\n case 'date': return 'calendar';\n case 'button': return 'mouse-pointer-2';\n default: return 'box';\n }\n }\n\n onStyleChange(style: Partial<StyleTokenSet>) {\n this.styleChange.emit({\n target: this.currentTarget(),\n style\n });\n }\n}\n","import { Component, input, output, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { FormSchema, StyleTokenSet } from '../form-core/models';\nimport { UiIconModule } from '../ui/ui-icon.module';\nimport { UiAccordionComponent } from '../ui/ui-accordion.component';\n\n// Inspector Sections\nimport { InspectorLayoutSectionComponent } from './inspector-sections/inspector-layout-section.component';\nimport { InspectorBackgroundsSectionComponent } from './inspector-sections/inspector-backgrounds-section.component';\nimport { InspectorBordersSectionComponent } from './inspector-sections/inspector-borders-section.component';\nimport { InspectorEffectsSectionComponent } from './inspector-sections/inspector-effects-section.component';\nimport { InspectorTypographySectionComponent } from './inspector-sections/inspector-typography-section.component';\n\n@Component({\n selector: 'form-settings-inspector',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n UiIconModule,\n UiAccordionComponent,\n InspectorLayoutSectionComponent,\n InspectorBackgroundsSectionComponent,\n InspectorBordersSectionComponent,\n InspectorEffectsSectionComponent,\n InspectorTypographySectionComponent\n ],\n template: `\n <div class=\"h-full flex flex-col bg-panel-dark font-sans text-[11px] text-gray-700\">\n \n <!-- Header -->\n <div class=\"flex items-center justify-between px-3 py-2 border-b border-border-dark bg-gray-50\">\n <div class=\"flex items-center gap-2 font-medium text-xs text-gray-800\">\n <lucide-icon name=\"settings\" class=\"w-4 h-4 text-gray-500\"></lucide-icon>\n <span>Form Settings</span>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"flex items-center px-2 pt-2 border-b border-border-dark bg-panel-dark\">\n @for (tab of tabs; track tab) {\n <button\n type=\"button\"\n (click)=\"activeTab.set(tab)\"\n [class]=\"activeTab() === tab \n ? 'px-2 pb-2 font-semibold text-gray-800 border-b-2 border-gray-800' \n : 'px-2 pb-2 text-gray-500 hover:text-gray-700 border-b-2 border-transparent'\">\n {{ tab }}\n </button>\n }\n </div>\n\n <!-- Scrollable Content -->\n <div class=\"flex-1 overflow-y-auto custom-scrollbar bg-panel-dark\">\n \n <!-- ===================== SETTINGS TAB ===================== -->\n @if (activeTab() === 'Settings') {\n <div class=\"p-4 flex flex-col gap-4\">\n \n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[10px] text-gray-500 uppercase font-semibold\">Form Title</label>\n <input \n [ngModel]=\"schema().title\" \n (ngModelChange)=\"updateSettings('title', $event)\"\n class=\"h-8 w-full rounded border border-gray-300 px-2 text-xs focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[10px] text-gray-500 uppercase font-semibold\">Description</label>\n <textarea \n [ngModel]=\"schema().description\" \n (ngModelChange)=\"updateSettings('description', $event)\" \n rows=\"3\" \n class=\"w-full rounded border border-gray-300 p-2 text-xs focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\"></textarea>\n </div>\n\n <div class=\"h-px bg-gray-200 my-1\"></div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[10px] text-gray-500 uppercase font-semibold\">Submit Button</label>\n <input \n [ngModel]=\"schema().submitButtonText\"\n (ngModelChange)=\"updateSettings('submitButtonText', $event)\"\n placeholder=\"Submit\"\n class=\"h-8 w-full rounded border border-gray-300 px-2 text-xs focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[10px] text-gray-500 uppercase font-semibold\">Reset Button</label>\n <div class=\"flex items-center gap-2 mb-1\">\n <input \n type=\"checkbox\" \n [ngModel]=\"schema().showResetButton !== false\"\n (ngModelChange)=\"updateSettings('showResetButton', $event)\"\n id=\"showReset\" \n class=\"h-3.5 w-3.5 rounded border-gray-300 text-blue-600 focus:ring-blue-500\">\n <label for=\"showReset\" class=\"text-xs text-gray-700\">Show Reset Button</label>\n </div>\n \n @if (schema().showResetButton !== false) {\n <input \n [ngModel]=\"schema().resetButtonText\"\n (ngModelChange)=\"updateSettings('resetButtonText', $event)\"\n placeholder=\"Reset\"\n class=\"h-8 w-full rounded border border-gray-300 px-2 text-xs focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n }\n </div>\n </div>\n }\n\n <!-- ===================== STYLE TAB ===================== -->\n @if (activeTab() === 'Style') {\n <div class=\"flex flex-col\">\n \n <div class=\"px-4 py-3 text-xs text-gray-500 bg-gray-50 border-b border-gray-200\">\n Global styles applied to the form container.\n </div>\n\n <ui-accordion title=\"Layout\" [expanded]=\"true\">\n <inspector-layout-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-layout-section>\n </ui-accordion>\n\n <ui-accordion title=\"Backgrounds\" [expanded]=\"false\">\n <inspector-backgrounds-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-backgrounds-section>\n </ui-accordion>\n\n <ui-accordion title=\"Borders\" [expanded]=\"false\">\n <inspector-borders-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-borders-section>\n </ui-accordion>\n\n <ui-accordion title=\"Effects\" [expanded]=\"false\">\n <inspector-effects-section \n [style]=\"currentStyle()\" \n (styleChange)=\"onStyleChange($event)\">\n </inspector-effects-section>\n </ui-accordion>\n \n <!-- Bottom spacer -->\n <div class=\"h-10\"></div>\n </div>\n }\n\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; height: 100%; }\n .custom-scrollbar::-webkit-scrollbar { width: 8px; }\n .custom-scrollbar::-webkit-scrollbar-track { background: transparent; }\n .custom-scrollbar::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; }\n .custom-scrollbar::-webkit-scrollbar-thumb:hover { background: #94a3b8; }\n `]\n})\nexport class FormSettingsInspectorComponent {\n readonly schema = input.required<FormSchema>();\n \n readonly settingsChange = output<Record<string, any>>();\n readonly styleChange = output<Partial<StyleTokenSet>>();\n\n readonly tabs = ['Settings', 'Style'];\n activeTab = signal<string>('Settings');\n\n currentStyle = computed(() => {\n return this.schema().ui?.baseStyle || {};\n });\n\n updateSettings(key: string, value: any) {\n this.settingsChange.emit({ [key]: value });\n }\n\n onStyleChange(style: Partial<StyleTokenSet>) {\n this.styleChange.emit(style);\n }\n}\n","import { Component, ContentChildren, Input, QueryList, AfterContentInit, Output, EventEmitter, TemplateRef, ViewChild, computed, signal, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'ui-tab',\n standalone: true,\n imports: [CommonModule],\n template: `<ng-template #tpl><ng-content></ng-content></ng-template>`\n})\nexport class UiTabComponent {\n @Input() label = '';\n @Input() name = ''; // Unique key for controlled mode\n @Input() disabled = false;\n @Input() badge?: string;\n @Input() badgeTone: 'neutral' | 'accent' = 'neutral';\n \n @ViewChild('tpl', { static: true }) template!: TemplateRef<unknown>;\n}\n\n@Component({\n selector: 'ui-tabs',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"flex flex-col min-h-0 h-full\">\n <div class=\"flex items-center gap-1 px-3 border-b border-slate-200 bg-white shrink-0\">\n <button\n *ngFor=\"let tab of tabs; let i = index\"\n (click)=\"activate(tab)\"\n class=\"relative h-10 px-3 text-xs font-semibold transition-colors rounded-t-md border-b-2\"\n [class.text-accent-600]=\"isActive(tab)\"\n [class.border-accent-600]=\"isActive(tab)\"\n [class.text-ink-500]=\"!isActive(tab)\"\n [class.border-transparent]=\"!isActive(tab)\"\n [class.hover:text-ink-700]=\"!isActive(tab)\"\n [disabled]=\"tab.disabled\"\n >\n <span class=\"flex items-center gap-2\">\n {{ tab.label }}\n <span *ngIf=\"tab.badge\" class=\"text-[10px] px-1.5 py-0.5 rounded-full border\"\n [class.bg-accent-50]=\"tab.badgeTone === 'accent'\"\n [class.border-accent-200]=\"tab.badgeTone === 'accent'\"\n [class.text-accent-700]=\"tab.badgeTone === 'accent'\"\n [class.bg-slate-100]=\"tab.badgeTone === 'neutral'\"\n [class.border-slate-200]=\"tab.badgeTone === 'neutral'\"\n [class.text-slate-600]=\"tab.badgeTone === 'neutral'\">\n {{ tab.badge }}\n </span>\n </span>\n </button>\n </div>\n\n <div class=\"flex-1 min-h-0 overflow-hidden bg-slate-50/30\">\n <ng-container *ngIf=\"activeTemplate\">\n <ng-container *ngTemplateOutlet=\"activeTemplate\"></ng-container>\n </ng-container>\n </div>\n </div>\n `,\n styles: [`:host { display: block; height: 100%; }`]\n})\nexport class UiTabsComponent implements AfterContentInit {\n @ContentChildren(UiTabComponent) tabQuery!: QueryList<UiTabComponent>;\n \n @Input() activeTab?: string;\n @Output() activeTabChange = new EventEmitter<string>();\n\n // Internal state if uncontrolled\n private _internalIndex = 0;\n\n tabs: UiTabComponent[] = [];\n\n ngAfterContentInit(): void {\n this.tabs = this.tabQuery.toArray();\n }\n\n isActive(tab: UiTabComponent): boolean {\n if (this.activeTab !== undefined) {\n return this.activeTab === (tab.name || tab.label);\n }\n return this.tabs.indexOf(tab) === this._internalIndex;\n }\n\n activate(tab: UiTabComponent) {\n if (tab.disabled) return;\n \n const key = tab.name || tab.label;\n if (this.activeTab !== undefined) {\n this.activeTabChange.emit(key);\n } else {\n this._internalIndex = this.tabs.indexOf(tab);\n }\n }\n\n get activeTemplate(): TemplateRef<unknown> | null {\n if (this.tabs.length === 0) return null;\n \n let activeTab: UiTabComponent | undefined;\n if (this.activeTab !== undefined) {\n activeTab = this.tabs.find(t => (t.name || t.label) === this.activeTab);\n } else {\n activeTab = this.tabs[this._internalIndex];\n }\n \n return activeTab?.template || null;\n }\n}\n","import { Component, Inject, Injector, ViewChild, ViewContainerRef, OnChanges, SimpleChanges, EffectRef, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DesignerStateService } from './designer-state.service';\nimport { WIDGET_DEFINITIONS, WidgetDefinition, DataBindingContract } from '../widgets/widget-definition';\nimport { FormsModule } from '@angular/forms';\nimport { WidgetNode, ColumnNode, WidgetKind, FieldSchema, FormRule, StyleTokenSet } from '../form-core/models';\n\nimport { DynamicPropertiesComponent } from './dynamic-properties/dynamic-properties.component';\nimport { DataPanelComponent } from './data-panel/data-panel.component';\nimport { RulesPanelComponent } from './rules-editor/rules-panel/rules-panel.component';\nimport { EventsPanelComponent } from './events-panel/events-panel.component';\nimport { FieldPaletteComponent } from './field-palette.component';\nimport { WidgetInspectorComponent } from './widget-inspector.component';\nimport { FormSettingsInspectorComponent } from './form-settings-inspector.component'; // New Import\nimport { UiTabsComponent, UiTabComponent } from '../ui/ui-tabs.component';\nimport { UiIconModule } from '../ui/ui-icon.module';\nimport { UiBoxModelComponent } from '../ui/ui-box-model.component';\nimport { UiColorSwatchComponent } from '../ui/ui-color-swatch.component';\nimport { DEFAULT_PAGE_STYLE } from './page-style';\n\n@Component({\n selector: 'app-properties-panel',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule, UiTabsComponent, UiTabComponent, DataPanelComponent, DynamicPropertiesComponent, RulesPanelComponent, EventsPanelComponent, UiBoxModelComponent, UiColorSwatchComponent, WidgetInspectorComponent, FormSettingsInspectorComponent],\n template: `\n <div class=\"properties-shell h-full border-l border-gray-200 bg-gray-50 flex flex-col font-sans text-sm\">\n\n <div *ngIf=\"state.selectedNode() as node; else noSelection\" class=\"flex flex-col h-full\">\n <!-- Widget Inspector (New Unified Component) -->\n <ng-container *ngIf=\"node.type === 'widget' && state.selectedField() as field\">\n <widget-inspector\n [node]=\"node\"\n [field]=\"field\"\n (styleChange)=\"onWidgetInspectorStyleChange($event)\"\n (fieldChange)=\"updateFieldConfig($event)\"\n (rulesChange)=\"updateRules($event)\"\n (duplicate)=\"duplicateField()\"\n (delete)=\"deleteField()\">\n </widget-inspector>\n </ng-container>\n\n <!-- Row/Column Inspectors (Keep existing) -->\n <ng-container *ngIf=\"node.type !== 'widget'\">\n <!-- Title with Actions -->\n <div class=\"inspector-header p-4 pb-3 border-b border-gray-200 flex items-center justify-between bg-white\">\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"panel-title font-semibold text-gray-900\">{{ getWidgetLabel(node) }}</span>\n </div>\n </div>\n\n <!-- Tabs -->\n <ui-tabs class=\"flex-1 flex flex-col min-h-0 bg-white\">\n <ui-tab label=\"Style\">\n <div class=\"panel-body p-4 pt-3 flex flex-col gap-4 overflow-y-auto h-full custom-scrollbar\">\n\n <!-- ROW Specific -->\n <!-- Binds to LayoutNode.style (Row Container Styles) -->\n <ng-container *ngIf=\"node.type === 'row'\">\n <div class=\"inspector-stack space-y-4\">\n <div class=\"inspector-card bg-white border border-gray-200 rounded-lg p-4 shadow-sm\">\n <div class=\"section-title text-xs font-semibold text-gray-500 uppercase tracking-wide mb-3\">Column Structure</div>\n\n <!-- Presets -->\n <div class=\"grid grid-cols-3 gap-2 mb-3\">\n <button (click)=\"applyPreset(node.id, 1)\" class=\"h-9 border border-gray-200 rounded hover:bg-gray-50 flex items-center justify-center p-1\" title=\"1 Column\">\n <div class=\"flex gap-1 w-full h-4 justify-center px-1\">\n <div class=\"w-full bg-gray-300 rounded-sm\"></div>\n </div>\n </button>\n <button (click)=\"applyPreset(node.id, 2)\" class=\"h-9 border border-gray-200 rounded hover:bg-gray-50 flex items-center justify-center p-1\" title=\"2 Columns\">\n <div class=\"flex gap-0.5 w-full h-4 px-1\">\n <div class=\"w-1/2 bg-gray-300 rounded-sm\"></div>\n <div class=\"w-1/2 bg-gray-300 rounded-sm\"></div>\n </div>\n </button>\n <button (click)=\"applyPreset(node.id, 3)\" class=\"h-9 border border-gray-200 rounded hover:bg-gray-50 flex items-center justify-center p-1\" title=\"3 Columns\">\n <div class=\"flex gap-0.5 w-full h-4 px-1\">\n <div class=\"w-1/3 bg-gray-300 rounded-sm\"></div>\n <div class=\"w-1/3 bg-gray-300 rounded-sm\"></div>\n <div class=\"w-1/3 bg-gray-300 rounded-sm\"></div>\n </div>\n </button>\n <button (click)=\"applyPreset(node.id, 4)\" class=\"h-9 border border-gray-200 rounded hover:bg-gray-50 flex items-center justify-center p-1\" title=\"4 Columns\">\n <div class=\"flex gap-0.5 w-full h-4 px-1\">\n <div class=\"w-1/4 bg-gray-300 rounded-sm\"></div>\n <div class=\"w-1/4 bg-gray-300 rounded-sm\"></div>\n <div class=\"w-1/4 bg-gray-300 rounded-sm\"></div>\n <div class=\"w-1/4 bg-gray-300 rounded-sm\"></div>\n </div>\n </button>\n <button (click)=\"applyPreset(node.id, 6)\" class=\"h-9 border border-gray-200 rounded hover:bg-gray-50 flex items-center justify-center p-1\" title=\"6 Columns\">\n <span class=\"text-xs text-gray-600 font-medium\">6 Col</span>\n </button>\n <button (click)=\"applyPreset(node.id, 12)\" class=\"h-9 border border-gray-200 rounded hover:bg-gray-50 flex items-center justify-center p-1\" title=\"12 Columns\">\n <span class=\"text-xs text-gray-600 font-medium\">12 Col</span>\n </button>\n </div>\n\n <!-- Manual Actions -->\n <div class=\"flex flex-col gap-2\">\n <button (click)=\"addColumn(node.id)\" class=\"w-full h-9 bg-blue-600 text-white rounded-md hover:bg-blue-700 flex items-center justify-center gap-2 text-sm font-medium transition-colors\">\n <lucide-icon name=\"plus\" class=\"w-4 h-4\"></lucide-icon> Add Column\n </button>\n </div>\n </div>\n\n <div class=\"inspector-card bg-white border border-gray-200 rounded-lg p-4 shadow-sm\">\n <div class=\"section-title text-xs font-semibold text-gray-500 uppercase tracking-wide mb-3\">Row Spacing</div>\n <div class=\"grid grid-cols-2 gap-3\">\n <!-- Padding -->\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-[10px] text-gray-400 uppercase tracking-wide\">Padding</span>\n <select [ngModel]=\"node.style?.padding\" (ngModelChange)=\"onStyleChange(node.id, 'padding', $event)\" class=\"h-8 w-full rounded-md border border-gray-300 text-sm px-2 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option value=\"none\">None</option>\n <option value=\"xs\">XS</option>\n <option value=\"sm\">SM</option>\n <option value=\"md\">MD</option>\n <option value=\"lg\">Large</option>\n <option value=\"xl\">XL</option>\n </select>\n </div>\n\n <!-- Margin Bottom -->\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-[10px] text-gray-400 uppercase tracking-wide\">Margin Bottom</span>\n <select [ngModel]=\"node.style?.marginBottom\" (ngModelChange)=\"onStyleChange(node.id, 'marginBottom', $event)\" class=\"h-8 w-full rounded-md border border-gray-300 text-sm px-2 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option value=\"none\">None</option>\n <option value=\"xs\">XS</option>\n <option value=\"sm\">SM</option>\n <option value=\"md\">MD</option>\n <option value=\"lg\">Large</option>\n <option value=\"xl\">XL</option>\n </select>\n </div>\n </div>\n\n <!-- Gap -->\n <div class=\"mt-3\">\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-[10px] text-gray-400 uppercase tracking-wide\">Gap (Between Columns)</span>\n <select [ngModel]=\"node.style?.gap\" (ngModelChange)=\"onStyleChange(node.id, 'gap', $event)\" class=\"h-8 w-full rounded-md border border-gray-300 text-sm px-2 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option value=\"none\">None</option>\n <option value=\"xs\">XS</option>\n <option value=\"sm\">SM</option>\n <option value=\"md\">MD</option>\n <option value=\"lg\">Large</option>\n <option value=\"xl\">XL</option>\n </select>\n </div>\n </div>\n\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"node.type === 'col'\">\n <div class=\"inspector-stack space-y-4\">\n <div class=\"inspector-card bg-white border border-gray-200 rounded-lg p-4 shadow-sm\">\n <div class=\"section-title text-xs font-semibold text-gray-500 uppercase tracking-wide mb-3\">Responsive Width (1-12)</div>\n\n <!-- XS (Mobile) -->\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"text-xs w-8 text-gray-500 font-medium\">XS</span>\n <select [ngModel]=\"node.responsive?.xs\" (ngModelChange)=\"onResponsiveChange(node.id, 'xs', $event)\" class=\"h-8 w-full rounded-md border border-gray-300 text-sm px-2 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option *ngFor=\"let i of [1,2,3,4,5,6,7,8,9,10,11,12]\" [value]=\"i\">{{i}}/12</option>\n </select>\n </div>\n\n <!-- SM (Large Phones) -->\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"text-xs w-8 text-gray-500 font-medium\">SM</span>\n <select [ngModel]=\"node.responsive?.sm\" (ngModelChange)=\"onResponsiveChange(node.id, 'sm', $event)\" class=\"h-8 w-full rounded-md border border-gray-300 text-sm px-2 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option [value]=\"undefined\">Inherit</option>\n <option *ngFor=\"let i of [1,2,3,4,5,6,7,8,9,10,11,12]\" [value]=\"i\">{{i}}/12</option>\n </select>\n </div>\n\n <!-- MD (Tablet) -->\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"text-xs w-8 text-gray-500 font-medium\">MD</span>\n <select [ngModel]=\"node.responsive?.md\" (ngModelChange)=\"onResponsiveChange(node.id, 'md', $event)\" class=\"h-8 w-full rounded-md border border-gray-300 text-sm px-2 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option [value]=\"undefined\">Inherit</option>\n <option *ngFor=\"let i of [1,2,3,4,5,6,7,8,9,10,11,12]\" [value]=\"i\">{{i}}/12</option>\n </select>\n </div>\n\n <!-- LG (Desktop) -->\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"text-xs w-8 text-gray-500 font-medium\">LG</span>\n <select [ngModel]=\"node.responsive?.lg\" (ngModelChange)=\"onResponsiveChange(node.id, 'lg', $event)\" class=\"h-8 w-full rounded-md border border-gray-300 text-sm px-2 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option [value]=\"undefined\">Inherit</option>\n <option *ngFor=\"let i of [1,2,3,4,5,6,7,8,9,10,11,12]\" [value]=\"i\">{{i}}/12</option>\n </select>\n </div>\n\n <!-- XL (Large Desktop) -->\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"text-xs w-8 text-gray-500 font-medium\">XL</span>\n <select [ngModel]=\"node.responsive?.xl\" (ngModelChange)=\"onResponsiveChange(node.id, 'xl', $event)\" class=\"h-8 w-full rounded-md border border-gray-300 text-sm px-2 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option [value]=\"undefined\">Inherit</option>\n <option *ngFor=\"let i of [1,2,3,4,5,6,7,8,9,10,11,12]\" [value]=\"i\">{{i}}/12</option>\n </select>\n </div>\n\n <!-- 2XL (Extra Large) -->\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"text-xs w-8 text-gray-500 font-medium\">2XL</span>\n <select [ngModel]=\"node.responsive ? node.responsive['2xl'] : undefined\" (ngModelChange)=\"onResponsiveChange(node.id, '2xl', $event)\" class=\"h-8 w-full rounded-md border border-gray-300 text-sm px-2 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n <option [value]=\"undefined\">Inherit</option>\n <option *ngFor=\"let i of [1,2,3,4,5,6,7,8,9,10,11,12]\" [value]=\"i\">{{i}}/12</option>\n </select>\n </div>\n </div>\n\n <div class=\"inspector-card bg-red-50 border border-red-100 rounded-lg p-3\">\n <button (click)=\"removeColumn(node.id)\" class=\"w-full h-8 text-red-600 hover:text-red-700 flex items-center justify-center gap-2 text-sm font-medium transition-colors\">\n <lucide-icon name=\"trash-2\" class=\"w-4 h-4\"></lucide-icon> Remove Column\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </ui-tab>\n </ui-tabs>\n </ng-container>\n </div>\n\n <ng-template #noSelection>\n <form-settings-inspector\n [schema]=\"state.schema()\"\n (settingsChange)=\"updateInspectorSettings($event)\"\n (styleChange)=\"updateInspectorStyle($event)\">\n </form-settings-inspector>\n </ng-template>\n </div>\n `,\n styles: [\n /* Custom scrollbar if needed, but Tailwind utilities on elements handle most now */\n `.custom-scrollbar::-webkit-scrollbar { width: 6px; }\n .custom-scrollbar::-webkit-scrollbar-thumb { background-color: #d1d5db; border-radius: 99px; }\n .custom-scrollbar::-webkit-scrollbar-track { background: transparent; }`\n ]\n})\nexport class PropertiesPanelComponent {\n\n @ViewChild('inspectorContainer', { read: ViewContainerRef }) inspectorContainer!: ViewContainerRef;\n\n private widgetDefs: WidgetDefinition[];\n \n // Removed individual form setting properties as they're now handled by FormSettingsInspectorComponent via schema\n\n constructor(public state: DesignerStateService,\n @Inject(WIDGET_DEFINITIONS) _widgetDefs: WidgetDefinition[][],\n private injector: Injector) {\n this.widgetDefs = _widgetDefs.flat();\n\n // No need to initialize form settings manually anymore, component inputs handle it\n\n // Track the previous widget to avoid unnecessary re-renders\n let previousWidgetId: string | null = null;\n\n effect(() => {\n const node = this.state.selectedNode();\n const currentWidgetId = (node && node.type === 'widget') ? node.id : null;\n\n // Only re-render if the widget actually changed\n if (currentWidgetId !== previousWidgetId) {\n previousWidgetId = currentWidgetId;\n\n if (node && node.type === 'widget') {\n // Defer to next tick to ensure container exists when tab is rendered\n setTimeout(() => this.renderInspector(node as WidgetNode), 100);\n } else {\n if (this.inspectorContainer) this.inspectorContainer.clear();\n }\n }\n });\n }\n\n\n updateInspectorSettings(values: Record<string, any>) {\n const current = this.state.schema();\n this.state.updateSchema({\n ...current,\n ...values\n });\n }\n \n updateInspectorStyle(values: Partial<StyleTokenSet>) {\n this.updatePageStyle(values);\n }\n \n // Legacy updateFormSettings removed in favor of updateInspectorSettings\n\n getWidgetLabel(node: any) {\n if (node.type === 'col') return 'Column';\n if (node.type === 'row') return 'Row';\n if (node.type === 'widget') {\n const field = this.state.selectedField();\n if (field) {\n return field.label || 'Widget';\n }\n return 'Widget';\n }\n return 'Element';\n }\n\n /**\n * Accesses the style object of the LayoutNode itself.\n * This affects the CONTAINER of the row/column/widget in the grid system.\n * For widgets, this controls outer dimensions/positioning (flex item props).\n */\n nodeStyle(node: any) {\n if (!node.style) node.style = {};\n return node.style;\n }\n\n colResponsive(node: any) {\n if (!node.responsive) node.responsive = {};\n return node.responsive;\n }\n\n /**\n * Targeted style update - only updates the specific node in the tree.\n * Preserves object references for unchanged nodes to avoid re-renders.\n */\n onStyleChange(nodeId: string, key: string, value: any) {\n const node = this.state.selectedNode();\n if (!node) return;\n const currentStyle = { ...(node.style || {}) };\n currentStyle[key] = value;\n this.state.updateNodeStyle(nodeId, currentStyle);\n }\n\n /**\n * Handle style changes from the widget inspector.\n * The widget inspector emits { target: 'container' | 'widget', style: StyleTokenSet }\n */\n onWidgetInspectorStyleChange(event: { target: 'container' | 'widget'; style: Partial<StyleTokenSet> }) {\n const node = this.state.selectedNode();\n if (!node || node.type !== 'widget') return;\n \n // For now, we only support container styling (node.style)\n // Widget-specific styling would require extending the FieldSchema\n if (event.target === 'container') {\n this.state.updateNodeStyle(node.id, event.style);\n }\n }\n\n /**\n * Targeted responsive update - only updates the specific node in the tree.\n */\n onResponsiveChange(nodeId: string, breakpoint: string, value: any) {\n const node = this.state.selectedNode();\n if (!node || node.type !== 'col') return;\n const col = node as ColumnNode;\n const currentResponsive = { ...(col.responsive || {}) };\n // Handle numeric conversion for select values\n if (value === 'undefined' || value === '' || value === undefined) {\n delete (currentResponsive as any)[breakpoint];\n } else {\n (currentResponsive as any)[breakpoint] = Number(value);\n }\n this.state.updateNodeResponsive(nodeId, currentResponsive);\n }\n\n /**\n * Legacy method for backward compatibility with dynamic properties.\n * TODO: Migrate dynamic properties to use targeted updates.\n */\n refreshSchema() {\n const s = this.state.schema();\n this.state.updateSchema({ ...s });\n }\n\n get pageStyle(): StyleTokenSet {\n return { ...DEFAULT_PAGE_STYLE, ...(this.state.schema().ui?.baseStyle ?? {}) };\n }\n\n updatePageBoxModel(values: Partial<StyleTokenSet>) {\n this.updatePageStyle(values);\n }\n\n updatePageStyleValue(key: keyof StyleTokenSet, value: any) {\n this.updatePageStyle({ [key]: value });\n }\n\n private updatePageStyle(values: Partial<StyleTokenSet>) {\n const current = this.state.schema();\n const ui = current.ui ?? {};\n const baseStyle = { ...(ui.baseStyle ?? {}), ...values };\n this.state.updateSchema({ ...current, ui: { ...ui, baseStyle } });\n }\n\n hasDynamicProperties(node: WidgetNode): boolean {\n if (node.type === 'widget') {\n const field = this.state.selectedField();\n if (!field) return false;\n const def = this.findDefinition(field, node.widgetKind);\n\n if (def?.inspector) return false;\n return !!def?.properties;\n }\n return false;\n }\n\n hasDynamicDataProperties(node: WidgetNode): boolean {\n return false; // For now, we don't have a mechanism to tag properties as 'data-only' yet, but placeholder for future\n }\n\n renderInspector(node: WidgetNode) {\n if (!this.inspectorContainer) return;\n this.inspectorContainer.clear();\n\n if (node.type === 'widget') {\n const field = this.state.selectedField();\n if (!field) return;\n\n const def = this.findDefinition(field, node.widgetKind);\n\n if (def) {\n // If custom inspector is provided, it takes precedence (gives full control to plugin)\n if (def.inspector) {\n const ref = this.inspectorContainer.createComponent(def.inspector);\n ref.setInput('config', field);\n // listen to changes\n if ((ref.instance as any).configChange) {\n (ref.instance as any).configChange.subscribe((updatedField: any) => {\n this.updateFieldConfig(updatedField);\n });\n }\n } else if (def.properties) {\n // Fallback to Data-Driven Properties\n const ref = this.inspectorContainer.createComponent(DynamicPropertiesComponent);\n ref.setInput('config', field);\n ref.setInput('allFields', this.state.schema().fields);\n if (this.isBrickWidget(node)) {\n ref.setInput('excludeSections', ['Brick']);\n }\n if ((ref.instance as any).configChange) {\n (ref.instance as any).configChange.subscribe((updatedField: any) => {\n this.updateFieldConfig(updatedField);\n });\n }\n }\n }\n }\n }\n\n isBrickWidget(node: WidgetNode): boolean {\n const field = this.state.selectedField();\n return !!field && node.type === 'widget' && field.type === 'brick';\n }\n\n duplicateField() {\n const field = this.state.selectedField();\n if (field) {\n this.state.duplicateField(field.id);\n }\n }\n\n /**\n * Resolve a widget definition for the current field, preferring widgetId when present,\n * otherwise falling back to kind/type for backward compatibility.\n */\n private findDefinition(field: FieldSchema, kind: any): any {\n if (field.widgetId) {\n const byId = this.widgetDefs.find(w => w.id === field.widgetId);\n if (byId) return byId;\n }\n return this.widgetDefs.find(w => w.kind === kind && w.type === field.type);\n }\n\n deleteField() {\n const field = this.state.selectedField();\n if (field) {\n this.state.removeField(field.id);\n }\n }\n\n updateRules(rules: FormRule[]) {\n const field = this.state.selectedField();\n if (field) {\n this.state.updateField(field.id, { ...field, rules });\n }\n }\n\n updateFieldConfig(field: FieldSchema) {\n this.state.updateField(field.id, field);\n }\n\n getDataConsumer(node: WidgetNode): any {\n const field = this.state.selectedField();\n if (!field) return 'none';\n const def = this.findDefinition(field, node.widgetKind);\n return def?.dataConsumer || 'none';\n }\n\n getDataBinding(node: WidgetNode): DataBindingContract | null {\n const field = this.state.selectedField();\n if (!field) return null;\n const def = this.findDefinition(field, node.widgetKind);\n return def?.dataBinding || null;\n }\n\n applyPreset(rowId: string, preset: number) {\n this.state.setPresetLayout(rowId, preset);\n }\n\n addColumn(rowId: string) {\n this.state.addColumn(rowId);\n }\n\n removeColumn(colId: string) {\n this.state.removeColumn(colId);\n // Deselect because it's gone\n this.state.selectNode(null);\n }\n}\n","import { Component, computed, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UiIconModule } from '../ui/ui-icon.module';\nimport { JsonFormRendererComponent } from '../form-renderer/json-form-renderer.component';\nimport { DesignerStateService } from './designer-state.service';\nimport { mergeAndNormalize } from '../widgets/style-helpers';\nimport { DEFAULT_PAGE_STYLE } from './page-style';\n\n@Component({\n selector: 'app-form-preview',\n standalone: true,\n imports: [CommonModule, UiIconModule, JsonFormRendererComponent],\n template: `\n <div class=\"fixed inset-0 bg-white z-[100] flex flex-col animate-in fade-in duration-200\">\n <!-- Toolbar -->\n <div class=\"h-14 border-b border-gray-200 flex items-center justify-between px-4 bg-white shadow-sm shrink-0\">\n <div class=\"flex items-center gap-4\">\n <h2 class=\"text-lg font-semibold text-gray-800 flex items-center gap-2\">\n <lucide-icon name=\"play\" class=\"w-5 h-5 text-green-600 fill-current\"></lucide-icon>\n Preview Mode\n </h2>\n <div class=\"h-6 w-px bg-gray-200\"></div>\n \n <!-- Breakpoint Switcher (Reuse Logic) -->\n <div class=\"flex items-center bg-gray-100 rounded p-1\">\n <button *ngFor=\"let bp of breakpoints\" \n (click)=\"setBreakpoint(bp)\"\n [class.bg-white]=\"breakpoint() === bp\"\n [class.text-blue-600]=\"breakpoint() === bp\"\n [class.shadow-sm]=\"breakpoint() === bp\"\n class=\"px-3 py-1 rounded text-xs font-medium uppercase transition-all hover:text-blue-500\">\n {{ bp }}\n </button>\n </div>\n </div>\n\n <button (click)=\"close()\" class=\"px-4 py-2 bg-gray-100 hover:bg-gray-200 text-gray-700 rounded-md font-medium transition-colors flex items-center gap-2\">\n <lucide-icon name=\"x\" class=\"w-4 h-4\"></lucide-icon> Exit Preview\n </button>\n </div>\n\n <!-- Content Area -->\n <div class=\"flex-1 flex overflow-hidden bg-gray-50\">\n \n <!-- LEFT: Form Render Area -->\n <div class=\"flex-1 overflow-auto flex justify-center items-start p-8 relative\">\n <!-- Responsive Container -->\n <div class=\"shadow-xl border border-gray-200 transition-all duration-300 flex flex-col\"\n [style]=\"getPageStyle()\">\n \n <!-- Emulated Mobile Header -->\n <div *ngIf=\"breakpoint() === 'xs' || breakpoint() === 'sm'\" \n class=\"h-12 bg-gray-900 flex items-center justify-center rounded-t-lg text-white/50 text-xs\">\n Mobile View\n </div>\n\n <div class=\"flex-1 min-h-0\">\n <app-json-form-renderer \n [schema]=\"state.schema()\"\n mode=\"live\"\n [device]=\"activeDevice()\"\n [breakpoint]=\"breakpoint()\"\n (valueChange)=\"updateData($event)\"\n (combinedValueChange)=\"updateCombinedData($event)\">\n </app-json-form-renderer>\n </div>\n </div>\n </div>\n\n <!-- RIGHT: Real-time Data -->\n <div class=\"w-96 bg-gray-900 text-gray-300 flex flex-col border-l border-gray-800 shadow-2xl shrink-0\">\n <div class=\"px-4 py-3 border-b border-gray-800 flex items-center justify-between bg-gray-950\">\n <span class=\"font-mono text-sm font-semibold text-green-400\">Current Form Data</span>\n <button (click)=\"copyData()\" class=\"text-xs hover:text-white transition-colors\" title=\"Copy JSON\">\n <lucide-icon name=\"copy\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n <div class=\"flex-1 overflow-auto p-4 font-mono text-xs\">\n <pre class=\"whitespace-pre-wrap break-all\">{{ previewData() | json }}</pre>\n </div>\n <div class=\"border-t border-gray-800 p-3 bg-gray-950 text-[10px] text-gray-500 text-center\">\n Real-time synchronization active\n </div>\n </div>\n </div>\n </div>\n `\n})\nexport class FormPreviewComponent {\n breakpoints = ['xs', 'sm', 'md', 'lg', 'xl', '2xl'] as const;\n breakpoint = signal<'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'>('xl');\n\n // Derived device type for renderer compatibility\n activeDevice = computed(() => this.breakpoint() === 'xs' ? 'mobile' : 'desktop');\n\n formData: any = {};\n combinedFormData: any = null;\n\n constructor(public state: DesignerStateService) {\n // Sync initial breakpoint from state potentially? \n // Or standalone. Let's start with XL.\n }\n\n setBreakpoint(bp: any) {\n this.breakpoint.set(bp);\n }\n\n getContainerWidth() {\n const bp = this.breakpoint();\n switch (bp) {\n case 'xs': return '375px';\n case 'sm': return '576px';\n case 'md': return '768px';\n case 'lg': return '992px';\n case 'xl': return '1200px';\n case '2xl': return '1400px';\n default: return '100%';\n }\n }\n\n getPageStyle() {\n const baseStyle = this.state.schema().ui?.baseStyle;\n const normalized = mergeAndNormalize(DEFAULT_PAGE_STYLE, baseStyle);\n if (normalized['width'] === undefined) {\n normalized['width'] = this.getContainerWidth();\n }\n if (normalized['minHeight'] === undefined && normalized['height'] === undefined) {\n normalized['minHeight'] = this.breakpoint() === 'xs' ? '667px' : '800px';\n }\n return normalized;\n }\n\n close() {\n this.state.isPreviewMode.set(false);\n }\n\n updateData(data: any) {\n this.formData = data;\n }\n\n updateCombinedData(data: any) {\n this.combinedFormData = data;\n }\n\n previewData() {\n return this.combinedFormData ?? this.formData;\n }\n\n copyData() {\n navigator.clipboard.writeText(JSON.stringify(this.previewData(), null, 2));\n }\n}\n","import { Component, inject, Input, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { FieldPaletteComponent } from './field-palette.component';\nimport { LayoutCanvasComponent } from './layout-canvas.component';\nimport { PropertiesPanelComponent } from './properties-panel.component';\nimport { FormPreviewComponent } from './form-preview.component';\nimport { DesignerStateService } from './designer-state.service';\nimport { DesignerFlavor } from '../form-core/models';\nimport { checkSchemaForApiOnlySources } from '../form-core/schema-guard';\n\n@Component({\n selector: 'app-json-form-designer',\n standalone: true,\n imports: [CommonModule, DragDropModule, FieldPaletteComponent, LayoutCanvasComponent, PropertiesPanelComponent, FormPreviewComponent],\n template: `\n <div class=\"flex h-full w-full overflow-hidden relative\" cdkDropListGroup>\n <!-- LEFT: Palette -->\n <div class=\"w-64 flex-shrink-0 bg-white border-r border-gray-200 overflow-y-auto\">\n <app-field-palette></app-field-palette>\n </div>\n\n <!-- CENTER: Canvas -->\n <div class=\"flex-1 overflow-hidden relative\">\n <app-layout-canvas></app-layout-canvas>\n </div>\n\n <!-- RIGHT: Properties -->\n <div class=\"w-80 flex-shrink-0 bg-white border-l border-gray-200 overflow-y-auto\">\n <app-properties-panel></app-properties-panel>\n </div>\n\n <!-- PREVIEW OVERLAY -->\n <app-form-preview *ngIf=\"state.isPreviewMode()\"></app-form-preview>\n </div>\n `\n})\nexport class JsonFormDesignerComponent implements OnInit, OnChanges {\n @Input() flavor: DesignerFlavor = 'form';\n state = inject(DesignerStateService);\n\n ngOnInit() {\n this.state.setFlavor(this.flavor);\n\n // Dev-only guardrail check\n const issues = checkSchemaForApiOnlySources(this.state.schema());\n if (issues.length > 0) {\n console.warn('[ngx-form-designer] API-Only Architecture Warnings:', issues);\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['flavor'] && !changes['flavor'].firstChange) {\n this.state.setFlavor(this.flavor);\n }\n }\n}\n","import { FormSchema } from '../form-core/models';\nimport { parseSchema } from '../form-core/schema-factory';\n\nexport interface DesignerTemplateDefinition {\n id: string;\n name: string;\n description: string;\n tags: readonly string[];\n schema: FormSchema;\n}\n\nconst parseTemplateSchema = (schema: Record<string, unknown>): FormSchema => {\n return parseSchema(JSON.stringify(schema));\n};\n\nconst BASIC_CONTACT_TEMPLATE: Record<string, unknown> = {\n \"id\": \"example-contact-basic\",\n \"version\": \"1.0\",\n \"schemaVersion\": \"1.0.0\",\n \"flavor\": \"form\",\n \"title\": \"Contact Us\",\n \"description\": \"Basic fields + 2-column layout + validation + static dropdown.\",\n \"metadata\": {\n \"example\": true,\n \"scenario\": \"basic-contact\"\n },\n \"fields\": [\n {\n \"id\": \"img_logo\",\n \"widgetId\": \"core.static:image\",\n \"name\": \"logo\",\n \"type\": \"image\",\n \"label\": \"Logo\",\n \"alt\": \"Company logo\",\n \"dataConfig\": {\n \"type\": \"static\",\n \"staticValue\": \"https://via.placeholder.com/640x160?text=Your+Logo\"\n },\n \"style\": {\n \"width\": \"100%\",\n \"height\": \"auto\",\n \"borderRadius\": 12,\n \"marginBottom\": 8\n }\n },\n {\n \"id\": \"fld_firstName\",\n \"widgetId\": \"core.form:text\",\n \"name\": \"firstName\",\n \"type\": \"text\",\n \"label\": \"First name\",\n \"placeholder\": \"Ada\",\n \"helpText\": \"As shown on your ID.\",\n \"html5\": {\n \"required\": true,\n \"minLength\": 2\n }\n },\n {\n \"id\": \"fld_lastName\",\n \"widgetId\": \"core.form:text\",\n \"name\": \"lastName\",\n \"type\": \"text\",\n \"label\": \"Last name\",\n \"placeholder\": \"Lovelace\",\n \"html5\": {\n \"required\": true,\n \"minLength\": 2\n }\n },\n {\n \"id\": \"fld_email\",\n \"widgetId\": \"core.form:email\",\n \"name\": \"email\",\n \"type\": \"email\",\n \"label\": \"Email\",\n \"placeholder\": \"ada@example.com\",\n \"html5\": {\n \"required\": true\n },\n \"validation\": [\n {\n \"type\": \"builtin\",\n \"name\": \"email\",\n \"message\": \"Enter a valid email address.\"\n }\n ]\n },\n {\n \"id\": \"fld_phone\",\n \"widgetId\": \"core.form:tel\",\n \"name\": \"phone\",\n \"type\": \"tel\",\n \"label\": \"Phone (optional)\",\n \"placeholder\": \"+1 555 0100\"\n },\n {\n \"id\": \"fld_topic\",\n \"widgetId\": \"core.form:select\",\n \"name\": \"topic\",\n \"type\": \"select\",\n \"label\": \"Topic\",\n \"placeholder\": \"Select a topic\",\n \"helpText\": \"Helps us route your message.\",\n \"html5\": {\n \"required\": true\n },\n \"dataConfig\": {\n \"type\": \"static\",\n \"staticOptions\": [\n { \"label\": \"Support\", \"value\": \"support\" },\n { \"label\": \"Sales\", \"value\": \"sales\" },\n { \"label\": \"Feedback\", \"value\": \"feedback\" }\n ]\n }\n },\n {\n \"id\": \"fld_preferredDate\",\n \"widgetId\": \"core.form:date\",\n \"name\": \"preferredDate\",\n \"type\": \"date\",\n \"label\": \"Preferred callback date (optional)\"\n },\n {\n \"id\": \"btn_submit\",\n \"widgetId\": \"core.form:submit-button\",\n \"name\": \"submit\",\n \"type\": \"submit-button\",\n \"label\": \"Send message\",\n \"variant\": \"primary\",\n \"buttonType\": \"submit\",\n \"events\": [\n {\n \"id\": \"evt_submit_log\",\n \"on\": \"click\",\n \"enabled\": true,\n \"actions\": [\n { \"type\": \"log\", \"message\": \"Submit clicked (demo event).\" }\n ]\n }\n ]\n },\n {\n \"id\": \"btn_reset\",\n \"widgetId\": \"core.form:reset-button\",\n \"name\": \"reset\",\n \"type\": \"reset-button\",\n \"label\": \"Reset\",\n \"variant\": \"secondary\",\n \"buttonType\": \"reset\"\n }\n ],\n \"layout\": {\n \"id\": \"root\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12 },\n \"children\": [\n {\n \"id\": \"row_logo\",\n \"type\": \"row\",\n \"style\": { \"marginBottom\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_logo\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12 },\n \"children\": [\n { \"id\": \"w_logo\", \"type\": \"widget\", \"widgetKind\": \"image\", \"refId\": \"img_logo\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_name\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_firstName\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_firstName\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_firstName\" }\n ]\n },\n {\n \"id\": \"col_lastName\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_lastName\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_lastName\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_contact\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_email\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 8 },\n \"children\": [\n { \"id\": \"w_email\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_email\" }\n ]\n },\n {\n \"id\": \"col_phone\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 4 },\n \"children\": [\n { \"id\": \"w_phone\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_phone\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_details\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_topic\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_topic\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_topic\" }\n ]\n },\n {\n \"id\": \"col_preferredDate\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_preferredDate\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_preferredDate\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_actions\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"sm\", \"marginTop\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_submit\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_submit\", \"type\": \"widget\", \"widgetKind\": \"button\", \"refId\": \"btn_submit\" }\n ]\n },\n {\n \"id\": \"col_reset\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_reset\", \"type\": \"widget\", \"widgetKind\": \"button\", \"refId\": \"btn_reset\" }\n ]\n }\n ]\n }\n ]\n },\n \"ui\": {\n \"baseStyle\": {\n \"backgroundColor\": \"#ffffff\",\n \"paddingTop\": 24,\n \"paddingRight\": 24,\n \"paddingBottom\": 32,\n \"paddingLeft\": 24\n }\n }\n};\n\nconst BASIC_CONTACT_SCHEMA = parseTemplateSchema(BASIC_CONTACT_TEMPLATE);\n\nconst RULES_SHIPPING_TEMPLATE: Record<string, unknown> = {\n \"id\": \"example-rules-shipping\",\n \"version\": \"1.0\",\n \"schemaVersion\": \"1.0.0\",\n \"flavor\": \"form\",\n \"title\": \"Checkout (Rules + Events)\",\n \"description\": \"Shows enterprise rules (visible/required/enable) and event bindings (setValue/log).\",\n \"metadata\": {\n \"example\": true,\n \"scenario\": \"rules-events\"\n },\n \"fields\": [\n {\n \"id\": \"fld_deliveryMethod\",\n \"widgetId\": \"core.form:select\",\n \"name\": \"deliveryMethod\",\n \"type\": \"select\",\n \"label\": \"Delivery method\",\n \"placeholder\": \"Choose...\",\n \"helpText\": \"Changing this clears the irrelevant section (demo event).\",\n \"html5\": { \"required\": true },\n \"dataConfig\": {\n \"type\": \"static\",\n \"staticOptions\": [\n { \"label\": \"Ship to me\", \"value\": \"ship\" },\n { \"label\": \"Pick up\", \"value\": \"pickup\" }\n ]\n },\n \"events\": [\n {\n \"id\": \"evt_delivery_clear\",\n \"on\": \"change\",\n \"enabled\": true,\n \"actions\": [\n { \"type\": \"setValue\", \"targetFieldId\": \"fld_shippingAddress1\", \"valueFrom\": \"literal\", \"valueLiteral\": \"\" },\n { \"type\": \"setValue\", \"targetFieldId\": \"fld_shippingCity\", \"valueFrom\": \"literal\", \"valueLiteral\": \"\" },\n { \"type\": \"setValue\", \"targetFieldId\": \"fld_shippingPostal\", \"valueFrom\": \"literal\", \"valueLiteral\": \"\" },\n { \"type\": \"setValue\", \"targetFieldId\": \"fld_shippingCountry\", \"valueFrom\": \"literal\", \"valueLiteral\": \"\" },\n { \"type\": \"setValue\", \"targetFieldId\": \"fld_pickupLocation\", \"valueFrom\": \"literal\", \"valueLiteral\": \"\" }\n ]\n }\n ]\n },\n {\n \"id\": \"fld_shippingCountry\",\n \"widgetId\": \"core.form:select\",\n \"name\": \"shippingCountry\",\n \"type\": \"select\",\n \"label\": \"Shipping country\",\n \"placeholder\": \"Select a country\",\n \"dataConfig\": {\n \"type\": \"source\",\n \"sourceId\": \"countries\",\n \"labelKey\": \"name\",\n \"valueKey\": \"code\",\n \"searchEnabled\": true,\n \"optionsLimit\": 20,\n \"searchColumns\": [\"name\", \"code\"]\n },\n \"rules\": [\n {\n \"id\": \"rule_ship_country_visible\",\n \"name\": \"Show when shipping\",\n \"action\": \"visible\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"deliveryMethod\", \"operator\": \"eq\", \"value\": \"ship\" }]\n }\n },\n {\n \"id\": \"rule_ship_country_required\",\n \"name\": \"Required when shipping\",\n \"action\": \"required\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"deliveryMethod\", \"operator\": \"eq\", \"value\": \"ship\" }]\n }\n }\n ]\n },\n {\n \"id\": \"fld_shippingAddress1\",\n \"widgetId\": \"core.form:text\",\n \"name\": \"shippingAddress1\",\n \"type\": \"text\",\n \"label\": \"Address line 1\",\n \"placeholder\": \"123 Main St\",\n \"rules\": [\n {\n \"id\": \"rule_ship_addr1_visible\",\n \"action\": \"visible\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"deliveryMethod\", \"operator\": \"eq\", \"value\": \"ship\" }]\n }\n },\n {\n \"id\": \"rule_ship_addr1_required\",\n \"action\": \"required\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"deliveryMethod\", \"operator\": \"eq\", \"value\": \"ship\" }]\n }\n }\n ]\n },\n {\n \"id\": \"fld_shippingCity\",\n \"widgetId\": \"core.form:text\",\n \"name\": \"shippingCity\",\n \"type\": \"text\",\n \"label\": \"City\",\n \"placeholder\": \"San Francisco\",\n \"rules\": [\n {\n \"id\": \"rule_ship_city_visible\",\n \"action\": \"visible\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"deliveryMethod\", \"operator\": \"eq\", \"value\": \"ship\" }]\n }\n },\n {\n \"id\": \"rule_ship_city_required\",\n \"action\": \"required\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"deliveryMethod\", \"operator\": \"eq\", \"value\": \"ship\" }]\n }\n }\n ]\n },\n {\n \"id\": \"fld_shippingPostal\",\n \"widgetId\": \"core.form:text\",\n \"name\": \"shippingPostal\",\n \"type\": \"text\",\n \"label\": \"Postal code\",\n \"placeholder\": \"94105\",\n \"html5\": { \"pattern\": \"^\\\\d{5}$\" },\n \"validation\": [\n {\n \"type\": \"expression\",\n \"expression\": \"/^\\\\d{5}$/.test(String(value))\",\n \"message\": \"Postal code must be 5 digits.\"\n }\n ],\n \"rules\": [\n {\n \"id\": \"rule_ship_postal_visible\",\n \"action\": \"visible\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"deliveryMethod\", \"operator\": \"eq\", \"value\": \"ship\" }]\n }\n },\n {\n \"id\": \"rule_ship_postal_required\",\n \"action\": \"required\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"deliveryMethod\", \"operator\": \"eq\", \"value\": \"ship\" }]\n }\n }\n ]\n },\n {\n \"id\": \"fld_pickupLocation\",\n \"widgetId\": \"core.form:select\",\n \"name\": \"pickupLocation\",\n \"type\": \"select\",\n \"label\": \"Pickup location\",\n \"placeholder\": \"Select a location\",\n \"dataConfig\": {\n \"type\": \"static\",\n \"staticOptions\": [\n { \"label\": \"Downtown (HQ)\", \"value\": \"hq\" },\n { \"label\": \"Warehouse\", \"value\": \"wh\" }\n ]\n },\n \"rules\": [\n {\n \"id\": \"rule_pickup_visible\",\n \"action\": \"visible\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"deliveryMethod\", \"operator\": \"eq\", \"value\": \"pickup\" }]\n }\n },\n {\n \"id\": \"rule_pickup_required\",\n \"action\": \"required\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"deliveryMethod\", \"operator\": \"eq\", \"value\": \"pickup\" }]\n }\n }\n ]\n },\n {\n \"id\": \"fld_hasPromo\",\n \"widgetId\": \"core.form:select\",\n \"name\": \"hasPromo\",\n \"type\": \"select\",\n \"label\": \"Have a promo code?\",\n \"placeholder\": \"Select...\",\n \"dataConfig\": {\n \"type\": \"static\",\n \"staticOptions\": [\n { \"label\": \"No\", \"value\": \"no\" },\n { \"label\": \"Yes\", \"value\": \"yes\" }\n ]\n },\n \"events\": [\n {\n \"id\": \"evt_promo_clear\",\n \"on\": \"change\",\n \"enabled\": true,\n \"actions\": [\n { \"type\": \"setValue\", \"targetFieldId\": \"fld_promoCode\", \"valueFrom\": \"literal\", \"valueLiteral\": \"\" }\n ]\n }\n ]\n },\n {\n \"id\": \"fld_promoCode\",\n \"widgetId\": \"core.form:text\",\n \"name\": \"promoCode\",\n \"type\": \"text\",\n \"label\": \"Promo code\",\n \"placeholder\": \"SAVE10\",\n \"helpText\": \"Enabled + required only when you pick \\\"Yes\\\" above.\",\n \"rules\": [\n {\n \"id\": \"rule_promo_visible\",\n \"action\": \"visible\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"hasPromo\", \"operator\": \"eq\", \"value\": \"yes\" }]\n }\n },\n {\n \"id\": \"rule_promo_enable\",\n \"action\": \"enable\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"hasPromo\", \"operator\": \"eq\", \"value\": \"yes\" }]\n }\n },\n {\n \"id\": \"rule_promo_required\",\n \"action\": \"required\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"hasPromo\", \"operator\": \"eq\", \"value\": \"yes\" }]\n }\n }\n ]\n },\n {\n \"id\": \"btn_submit\",\n \"widgetId\": \"core.form:submit-button\",\n \"name\": \"submit\",\n \"type\": \"submit-button\",\n \"label\": \"Place order\",\n \"variant\": \"primary\",\n \"buttonType\": \"submit\",\n \"events\": [\n {\n \"id\": \"evt_submit_log\",\n \"on\": \"click\",\n \"enabled\": true,\n \"actions\": [{ \"type\": \"log\", \"message\": \"Order submit clicked (demo event).\" }]\n }\n ]\n },\n {\n \"id\": \"btn_reset\",\n \"widgetId\": \"core.form:reset-button\",\n \"name\": \"reset\",\n \"type\": \"reset-button\",\n \"label\": \"Reset\",\n \"variant\": \"secondary\",\n \"buttonType\": \"reset\"\n }\n ],\n \"layout\": {\n \"id\": \"root\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12 },\n \"children\": [\n {\n \"id\": \"row_delivery\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_delivery\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12 },\n \"children\": [\n { \"id\": \"w_delivery\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_deliveryMethod\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_shipping\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_shipCountry\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_shipCountry\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_shippingCountry\" }\n ]\n },\n {\n \"id\": \"col_shipPostal\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_shipPostal\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_shippingPostal\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_shipping2\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_shipAddr1\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_shipAddr1\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_shippingAddress1\" }\n ]\n },\n {\n \"id\": \"col_shipCity\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_shipCity\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_shippingCity\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_pickup\",\n \"type\": \"row\",\n \"children\": [\n {\n \"id\": \"col_pickup\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12 },\n \"children\": [\n { \"id\": \"w_pickup\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_pickupLocation\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_promo\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_hasPromo\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 4 },\n \"children\": [\n { \"id\": \"w_hasPromo\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_hasPromo\" }\n ]\n },\n {\n \"id\": \"col_promoCode\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 8 },\n \"children\": [\n { \"id\": \"w_promoCode\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_promoCode\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_actions\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"sm\", \"marginTop\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_submit\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_submit\", \"type\": \"widget\", \"widgetKind\": \"button\", \"refId\": \"btn_submit\" }\n ]\n },\n {\n \"id\": \"col_reset\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_reset\", \"type\": \"widget\", \"widgetKind\": \"button\", \"refId\": \"btn_reset\" }\n ]\n }\n ]\n }\n ]\n }\n};\n\nconst RULES_SHIPPING_SCHEMA = parseTemplateSchema(RULES_SHIPPING_TEMPLATE);\n\nconst DATA_SOURCES_TEMPLATE: Record<string, unknown> = {\n \"id\": \"example-data-sources\",\n \"version\": \"1.0\",\n \"schemaVersion\": \"1.0.0\",\n \"flavor\": \"form\",\n \"title\": \"Onboarding (Data Sources + Tree Select)\",\n \"description\": \"Source-backed dropdown (countries) + filter + tree-select + rules + events.\",\n \"metadata\": {\n \"example\": true,\n \"scenario\": \"data-sources-tree\"\n },\n \"fields\": [\n {\n \"id\": \"fld_countryStatus\",\n \"widgetId\": \"core.form:select\",\n \"name\": \"countryStatus\",\n \"type\": \"select\",\n \"label\": \"Country status filter\",\n \"placeholder\": \"Select status\",\n \"helpText\": \"Filters the Countries dropdown via dataConfig.filters (uses the demo global data source).\",\n \"html5\": { \"required\": true },\n \"dataConfig\": {\n \"type\": \"static\",\n \"staticOptions\": [\n { \"label\": \"Active\", \"value\": \"Active\" },\n { \"label\": \"Pending\", \"value\": \"Pending\" },\n { \"label\": \"Inactive\", \"value\": \"Inactive\" }\n ]\n }\n },\n {\n \"id\": \"fld_country\",\n \"widgetId\": \"core.form:select\",\n \"name\": \"country\",\n \"type\": \"select\",\n \"label\": \"Country\",\n \"placeholder\": \"Select a country\",\n \"html5\": { \"required\": true },\n \"dataConfig\": {\n \"type\": \"source\",\n \"sourceId\": \"countries\",\n \"labelKey\": \"name\",\n \"valueKey\": \"code\",\n \"searchEnabled\": true,\n \"optionsLimit\": 20,\n \"searchColumns\": [\"name\", \"code\"],\n \"dependsOn\": [\n { \"fieldId\": \"fld_countryStatus\", \"paramKey\": \"status\" }\n ],\n \"filters\": [\n {\n \"column\": \"status\",\n \"op\": \"eq\",\n \"valueFrom\": \"field\",\n \"fieldId\": \"fld_countryStatus\"\n }\n ]\n },\n \"events\": [\n {\n \"id\": \"evt_country_to_code\",\n \"on\": \"change\",\n \"enabled\": true,\n \"actions\": [\n {\n \"type\": \"setValue\",\n \"targetFieldId\": \"fld_countryCode\",\n \"valueFrom\": \"event\"\n }\n ]\n }\n ]\n },\n {\n \"id\": \"fld_countryCode\",\n \"widgetId\": \"core.form:text\",\n \"name\": \"countryCode\",\n \"type\": \"text\",\n \"label\": \"Selected country code\",\n \"placeholder\": \"Auto-filled\",\n \"readonly\": true,\n \"helpText\": \"Updated by an event binding on the Country field.\"\n },\n {\n \"id\": \"fld_department\",\n \"widgetId\": \"core.form:tree-select\",\n \"name\": \"department\",\n \"type\": \"tree-select\",\n \"label\": \"Department\",\n \"placeholder\": \"Select...\",\n \"html5\": { \"required\": true },\n \"dataConfig\": {\n \"type\": \"static\",\n \"labelKey\": \"label\",\n \"valueKey\": \"value\",\n \"treeIdKey\": \"id\",\n \"treeParentKey\": \"parentId\",\n \"treeRootValue\": null,\n \"searchEnabled\": true,\n \"staticOptions\": [\n { \"id\": \"dept-eng\", \"parentId\": null, \"label\": \"Engineering\", \"value\": \"eng\" },\n { \"id\": \"dept-eng-fe\", \"parentId\": \"dept-eng\", \"label\": \"Frontend\", \"value\": \"eng_frontend\" },\n { \"id\": \"dept-eng-be\", \"parentId\": \"dept-eng\", \"label\": \"Backend\", \"value\": \"eng_backend\" },\n { \"id\": \"dept-design\", \"parentId\": null, \"label\": \"Design\", \"value\": \"design\" },\n { \"id\": \"dept-sales\", \"parentId\": null, \"label\": \"Sales\", \"value\": \"sales\" }\n ]\n }\n },\n {\n \"id\": \"fld_github\",\n \"widgetId\": \"core.form:text\",\n \"name\": \"github\",\n \"type\": \"text\",\n \"label\": \"GitHub username\",\n \"placeholder\": \"octocat\",\n \"helpText\": \"Only required for Engineering (rules use startsWith).\",\n \"rules\": [\n {\n \"id\": \"rule_github_visible\",\n \"action\": \"visible\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"department\", \"operator\": \"startsWith\", \"value\": \"eng\" }]\n }\n },\n {\n \"id\": \"rule_github_required\",\n \"action\": \"required\",\n \"conditions\": {\n \"operator\": \"AND\",\n \"conditions\": [{ \"fieldId\": \"department\", \"operator\": \"startsWith\", \"value\": \"eng\" }]\n }\n }\n ]\n },\n {\n \"id\": \"fld_favoriteColor\",\n \"widgetId\": \"core.form:color\",\n \"name\": \"favoriteColor\",\n \"type\": \"color\",\n \"label\": \"Favorite color\",\n \"defaultValue\": \"#3B82F6\"\n },\n {\n \"id\": \"fld_experience\",\n \"widgetId\": \"core.form:range\",\n \"name\": \"experience\",\n \"type\": \"range\",\n \"label\": \"Experience (0-10)\",\n \"html5\": { \"min\": 0, \"max\": 10, \"step\": 1 },\n \"defaultValue\": 5\n },\n {\n \"id\": \"btn_submit\",\n \"widgetId\": \"core.form:submit-button\",\n \"name\": \"submit\",\n \"type\": \"submit-button\",\n \"label\": \"Create profile\",\n \"variant\": \"primary\",\n \"buttonType\": \"submit\"\n }\n ],\n \"layout\": {\n \"id\": \"root\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12 },\n \"children\": [\n {\n \"id\": \"row_filter\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_countryStatus\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 4 },\n \"children\": [\n { \"id\": \"w_countryStatus\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_countryStatus\" }\n ]\n },\n {\n \"id\": \"col_country\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 8 },\n \"children\": [\n { \"id\": \"w_country\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_country\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_countryCode\",\n \"type\": \"row\",\n \"children\": [\n {\n \"id\": \"col_countryCode\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12 },\n \"children\": [\n { \"id\": \"w_countryCode\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_countryCode\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_dept\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_dept\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_dept\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_department\" }\n ]\n },\n {\n \"id\": \"col_github\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_github\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_github\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_fun\",\n \"type\": \"row\",\n \"style\": { \"gap\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_color\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_color\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_favoriteColor\" }\n ]\n },\n {\n \"id\": \"col_experience\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12, \"md\": 6 },\n \"children\": [\n { \"id\": \"w_experience\", \"type\": \"widget\", \"widgetKind\": \"field\", \"refId\": \"fld_experience\" }\n ]\n }\n ]\n },\n {\n \"id\": \"row_actions\",\n \"type\": \"row\",\n \"style\": { \"marginTop\": \"md\" },\n \"children\": [\n {\n \"id\": \"col_submit\",\n \"type\": \"col\",\n \"responsive\": { \"xs\": 12 },\n \"children\": [\n { \"id\": \"w_submit\", \"type\": \"widget\", \"widgetKind\": \"button\", \"refId\": \"btn_submit\" }\n ]\n }\n ]\n }\n ]\n }\n};\n\nconst DATA_SOURCES_SCHEMA = parseTemplateSchema(DATA_SOURCES_TEMPLATE);\n\nexport const DEFAULT_TEMPLATE_LIBRARY: DesignerTemplateDefinition[] = [\n {\n id: 'basic-contact',\n name: 'Contact Us',\n description: 'Basic fields + 2-column layout + validation + static dropdown.',\n tags: ['basic', 'contact', 'layout'],\n schema: BASIC_CONTACT_SCHEMA\n },\n {\n id: 'rules-shipping',\n name: 'Checkout (Rules + Events)',\n description: 'Conditional shipping/pickup, promo rules, and event bindings.',\n tags: ['rules', 'events', 'checkout'],\n schema: RULES_SHIPPING_SCHEMA\n },\n {\n id: 'data-sources',\n name: 'Onboarding (Data Sources)',\n description: 'Source-backed select + filters + tree-select + rules.',\n tags: ['data', 'trees', 'filters'],\n schema: DATA_SOURCES_SCHEMA\n }\n];\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, SimpleChanges, OnChanges, inject, ViewEncapsulation } from '@angular/core';\nimport { EmailRendererComponent } from '../email-renderer/email-renderer.component';\nimport { JsonFormRendererComponent } from '../form-renderer/json-form-renderer.component';\nimport { FormEngine } from '../form-core/form-engine';\nimport { FormSchema, DesignerFlavor } from '../form-core/models';\nimport { parseSchema } from '../form-core/schema-factory';\nimport { GlobalDataManagerComponent } from './global-data-manager.component';\nimport { JsonFormDesignerComponent } from './json-form-designer.component';\nimport { DesignerStateService } from './designer-state.service';\nimport { DesignerTemplateDefinition, DEFAULT_TEMPLATE_LIBRARY } from './template-library';\n\n@Component({\n selector: 'app-form-designer-shell',\n standalone: true,\n imports: [\n CommonModule,\n JsonFormDesignerComponent,\n JsonFormRendererComponent,\n EmailRendererComponent,\n GlobalDataManagerComponent\n ],\n template: `\n <div class=\"flex flex-col h-screen bg-white font-sans\">\n <!-- Top Header -->\n <div class=\"h-14 border-b border-gray-200 flex items-center px-4 justify-between bg-white z-20 shadow-sm\">\n <div class=\"flex items-center gap-2\">\n <button *ngIf=\"enableTemplateLibrary\"\n class=\"px-3 py-2 text-sm rounded-md transition-colors\"\n [class.text-blue-600]=\"showTemplateLibrary\"\n [class.bg-blue-50]=\"showTemplateLibrary\"\n [class.text-gray-600]=\"!showTemplateLibrary\"\n [class.hover:text-gray-900]=\"!showTemplateLibrary\"\n [class.hover:bg-gray-50]=\"!showTemplateLibrary\"\n (click)=\"openLibrary()\">\n Library\n </button>\n </div>\n\n <div class=\"absolute left-1/2 transform -translate-x-1/2 flex items-center gap-2\">\n <span class=\"text-sm font-semibold text-gray-700\">\n {{ headerLabel || (flavor | titlecase) + ' Designer [Draft]' }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4\">\n <button *ngIf=\"enableGlobalDataManager\"\n class=\"px-3 py-1.5 text-xs font-medium rounded-md bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 hover:text-gray-900 transition-colors shadow-sm\"\n (click)=\"showGlobalData = true\">\n Global Data\n </button>\n\n <div class=\"h-6 w-px bg-gray-200\"></div>\n\n <div class=\"flex items-center bg-gray-100 p-1 rounded-lg\">\n <button *ngFor=\"let f of flavors; trackBy: trackByFlavor\"\n (click)=\"switchFlavor(f)\"\n [class.bg-white]=\"flavor === f\"\n [class.text-blue-600]=\"flavor === f\"\n [class.shadow-sm]=\"flavor === f\"\n [class.text-gray-500]=\"flavor !== f\"\n class=\"px-3 py-1 text-xs font-medium rounded-md transition-all\">\n {{ f | titlecase }}\n </button>\n </div>\n\n <div class=\"h-6 w-px bg-gray-200\"></div>\n\n <div class=\"flex items-center gap-2\">\n <button *ngIf=\"showSaveButton\"\n class=\"px-4 py-2 text-sm font-medium text-blue-600 border border-blue-200 rounded-md hover:bg-blue-50 transition-colors\"\n (click)=\"onSave()\">\n Save\n </button>\n <button *ngIf=\"showPublishButton\"\n class=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 shadow-sm transition-colors\"\n (click)=\"onPublish()\">\n Publish\n </button>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"flex-1 overflow-hidden relative bg-gray-50\">\n <app-json-form-designer [flavor]=\"flavor\"></app-json-form-designer>\n\n <!-- Template Library Overlay -->\n <div *ngIf=\"showTemplateLibrary\"\n class=\"absolute inset-0 bg-black/40 backdrop-blur-sm flex items-center justify-center z-50\"\n (click)=\"closeLibrary()\">\n <div class=\"w-full max-w-6xl h-5/6 bg-white rounded-lg shadow-popover overflow-hidden flex relative\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"w-96 border-r border-gray-200 flex flex-col\">\n <div class=\"p-4 border-b border-gray-200 flex items-start justify-between gap-4\">\n <div>\n <h2 class=\"text-sm font-semibold text-gray-800\">Template Library</h2>\n <p class=\"text-xs text-gray-500\">Pick a starting point for {{ flavor | titlecase }}</p>\n </div>\n <button class=\"text-xs text-gray-500 hover:text-gray-800\" (click)=\"closeLibrary()\">Close</button>\n </div>\n <div class=\"p-4 overflow-auto grid grid-cols-1 gap-3\">\n <ng-container *ngIf=\"filteredTemplates.length; else emptyLibrary\">\n <button *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplateId\"\n type=\"button\"\n class=\"text-left rounded-lg border border-gray-200 bg-white p-3 shadow-card transition hover:border-blue-200 hover:shadow-sm\"\n [class.ring-2]=\"selectedTemplateId === template.id\"\n [class.ring-blue-500]=\"selectedTemplateId === template.id\"\n (click)=\"selectTemplate(template)\">\n <div class=\"h-24 rounded-md bg-gray-50 border border-gray-100 overflow-hidden\">\n <div class=\"origin-top-left scale-50 pointer-events-none\">\n <app-json-form-renderer\n [schema]=\"template.schema\"\n mode=\"preview\"\n [device]=\"'desktop'\"\n [breakpoint]=\"'xl'\">\n </app-json-form-renderer>\n </div>\n </div>\n <div class=\"mt-2 text-xs font-semibold text-gray-800\">{{ template.name }}</div>\n <div class=\"mt-1 text-xs text-gray-500\">{{ template.description }}</div>\n </button>\n </ng-container>\n <ng-template #emptyLibrary>\n <div class=\"text-xs text-gray-500\">\n No templates available for {{ flavor | titlecase }} yet.\n </div>\n </ng-template>\n </div>\n </div>\n <div class=\"flex-1 flex flex-col\">\n <div class=\"p-4 border-b border-gray-200 flex items-start justify-between gap-4\">\n <div>\n <h3 class=\"text-sm font-semibold text-gray-800\">\n {{ selectedTemplate?.name || 'Select a template' }}\n </h3>\n <p class=\"text-xs text-gray-500\">\n {{ selectedTemplate?.description || 'Choose a template to preview it here.' }}\n </p>\n </div>\n <button class=\"px-3 py-2 text-xs font-semibold text-white bg-blue-600 rounded-md hover:bg-blue-700 shadow-sm transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n [disabled]=\"!selectedTemplate\"\n (click)=\"requestApplyTemplate(selectedTemplate)\">\n Use template\n </button>\n </div>\n <div class=\"flex-1 overflow-auto bg-gray-50 p-4\">\n <ng-container *ngIf=\"selectedTemplate; else emptyPreview\">\n <div class=\"min-h-full bg-white border border-gray-200 rounded-lg shadow-card p-4\">\n <app-json-form-renderer\n [schema]=\"selectedTemplate.schema\"\n mode=\"preview\"\n [device]=\"'desktop'\"\n [breakpoint]=\"'xl'\">\n </app-json-form-renderer>\n </div>\n </ng-container>\n <ng-template #emptyPreview>\n <div class=\"h-full flex items-center justify-center text-xs text-gray-500\">\n Select a template to see the full preview.\n </div>\n </ng-template>\n </div>\n </div>\n <div *ngIf=\"pendingTemplate\"\n class=\"absolute inset-0 bg-black/40 flex items-center justify-center\">\n <div class=\"bg-white rounded-lg shadow-popover p-5 w-full max-w-md\">\n <h3 class=\"text-sm font-semibold text-gray-800\">Replace current form?</h3>\n <p class=\"text-xs text-gray-600 mt-2\">\n This will replace the current form with \"{{ pendingTemplate.name }}\". You can undo after.\n </p>\n <div class=\"mt-4 flex items-center justify-end gap-2\">\n <button class=\"px-3 py-1.5 text-xs font-medium text-gray-700 border border-gray-200 rounded-md hover:bg-gray-50 transition-colors\"\n (click)=\"cancelApplyTemplate()\">Cancel</button>\n <button class=\"px-3 py-1.5 text-xs font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 transition-colors\"\n (click)=\"confirmApplyTemplate()\">Replace</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Global Data Manager Overlay -->\n <div *ngIf=\"showGlobalData\"\n class=\"absolute inset-0 bg-black/40 backdrop-blur-sm flex justify-end z-[100] transition-opacity\"\n (click)=\"showGlobalData = false\">\n <div class=\"h-full animate-slide-in-right\" (click)=\"$event.stopPropagation()\">\n <app-global-data-manager (close)=\"showGlobalData = false\"></app-global-data-manager>\n </div>\n </div>\n </div>\n\n <!-- Email Preview Section -->\n <section *ngIf=\"showEmailPreview && flavor === 'email'\" class=\"border-t border-gray-200 bg-white p-4\">\n <h3 class=\"text-sm font-semibold mb-2 text-gray-700\">Email Preview</h3>\n <div class=\"bg-gray-50 p-4 rounded border border-gray-200 max-h-96 overflow-auto\">\n <app-email-renderer [schema]=\"state.schema()\" [engine]=\"engine\"></app-email-renderer>\n </div>\n </section>\n </div>\n `,\n styles: [`\n @keyframes slideInRight {\n from { transform: translateX(100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n }\n .animate-slide-in-right {\n animation: slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n }\n `]\n})\nexport class FormDesignerShellComponent implements OnChanges {\n protected readonly state = inject(DesignerStateService);\n\n @Input() flavor: DesignerFlavor = 'form';\n @Input() flavors: DesignerFlavor[] = ['form', 'email'];\n @Input() templates: DesignerTemplateDefinition[] = DEFAULT_TEMPLATE_LIBRARY;\n @Input() headerLabel?: string;\n @Input() enableTemplateLibrary = true;\n @Input() enableGlobalDataManager = true;\n @Input() showSaveButton = true;\n @Input() showPublishButton = true;\n @Input() showEmailPreview = true;\n\n @Output() flavorChange = new EventEmitter<DesignerFlavor>();\n @Output() save = new EventEmitter<FormSchema>();\n @Output() publish = new EventEmitter<FormSchema>();\n\n showGlobalData = false;\n showTemplateLibrary = false;\n selectedTemplateId: string | null = null;\n pendingTemplate: DesignerTemplateDefinition | null = null;\n\n get engine() {\n return new FormEngine(this.state.schema());\n }\n\n get filteredTemplates(): DesignerTemplateDefinition[] {\n return (this.templates || []).filter(template => (template.schema.flavor ?? 'form') === this.flavor);\n }\n\n get selectedTemplate(): DesignerTemplateDefinition | null {\n return this.filteredTemplates.find(template => template.id === this.selectedTemplateId) ?? null;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['flavor'] || changes['templates']) {\n this.syncTemplateSelection();\n }\n }\n\n switchFlavor(next: DesignerFlavor) {\n if (this.flavor === next) return;\n this.flavor = next;\n this.flavorChange.emit(next);\n if (this.showTemplateLibrary) {\n this.syncTemplateSelection();\n }\n }\n\n openLibrary() {\n if (!this.enableTemplateLibrary) return;\n if (this.showTemplateLibrary) {\n this.closeLibrary();\n return;\n }\n this.showTemplateLibrary = true;\n this.showGlobalData = false;\n this.syncTemplateSelection();\n }\n\n closeLibrary() {\n this.showTemplateLibrary = false;\n this.pendingTemplate = null;\n }\n\n selectTemplate(template: DesignerTemplateDefinition) {\n this.selectedTemplateId = template.id;\n }\n\n requestApplyTemplate(template: DesignerTemplateDefinition | null) {\n if (!template) return;\n if (this.shouldConfirmReplace()) {\n this.pendingTemplate = template;\n return;\n }\n this.applyTemplate(template);\n }\n\n confirmApplyTemplate() {\n if (!this.pendingTemplate) return;\n this.applyTemplate(this.pendingTemplate);\n }\n\n cancelApplyTemplate() {\n this.pendingTemplate = null;\n }\n\n onSave() {\n this.save.emit(this.state.schema());\n }\n\n onPublish() {\n this.publish.emit(this.state.schema());\n }\n\n trackByTemplateId(_index: number, template: DesignerTemplateDefinition) {\n return template.id;\n }\n\n trackByFlavor(_index: number, flavor: DesignerFlavor) {\n return flavor;\n }\n\n private shouldConfirmReplace(): boolean {\n return this.state.canUndo();\n }\n\n private applyTemplate(template: DesignerTemplateDefinition) {\n const schema = parseSchema(JSON.stringify(template.schema));\n schema.id = this.createSchemaId();\n schema.flavor = schema.flavor ?? this.flavor;\n this.state.updateSchema(schema);\n this.selectedTemplateId = template.id;\n this.closeLibrary();\n if (schema.flavor && schema.flavor !== this.flavor) {\n this.switchFlavor(schema.flavor);\n }\n }\n\n private syncTemplateSelection() {\n const templates = this.filteredTemplates;\n if (!templates.length) {\n this.selectedTemplateId = null;\n return;\n }\n if (!this.selectedTemplateId || !templates.some(template => template.id === this.selectedTemplateId)) {\n this.selectedTemplateId = templates[0].id;\n }\n }\n\n private createSchemaId(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n return `schema-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { createEmptySchema } from '../form-core/schema-factory';\nimport type { DesignerFlavor, FormSchema } from '../form-core/models';\n\nexport interface WebsiteProject {\n id: string;\n name: string;\n pages: WebsitePage[];\n sections?: WebsiteSection[];\n bricks?: WebsiteBrick[];\n themes?: WebsiteTheme[];\n activeThemeId?: string;\n tokens?: WebsiteTokens;\n metadata?: Record<string, unknown>;\n}\n\nexport interface WebsitePage {\n id: string;\n name: string;\n route: string;\n schema: FormSchema;\n}\n\nexport interface WebsiteSection {\n id: string;\n name: string;\n schema: FormSchema;\n}\n\nexport interface WebsiteTokens {\n colors?: Record<string, string>;\n spacing?: Record<string, string>;\n typography?: Record<string, string>;\n radii?: Record<string, string>;\n shadows?: Record<string, string>;\n}\n\nexport interface BrickUiHints {\n title?: string;\n groups?: Array<{ id: string; label: string; fields: string[] }>;\n order?: string[];\n}\n\nexport interface WebsiteBrick {\n id: string;\n name: string;\n runtime?: 'dom' | 'react';\n templateHtml: string;\n scriptJs?: string;\n reactComponentJs?: string;\n propsSchema?: Record<string, unknown>;\n ui?: BrickUiHints;\n defaultProps?: Record<string, unknown>;\n}\n\nexport interface WebsiteTheme {\n id: string;\n vars: Record<string, string>;\n}\n\nexport function createWebsiteProject(opts?: {\n id?: string;\n name?: string;\n pages?: WebsitePage[];\n}): WebsiteProject {\n const pages = opts?.pages?.length ? opts.pages : [createWebsitePage({ name: 'Home', route: '/' })];\n const defaultBricks = createDefaultWebsiteBricks();\n const defaultTheme = createDefaultWebsiteTheme();\n\n return {\n id: opts?.id ?? uuidv4(),\n name: opts?.name ?? 'New Website',\n pages,\n sections: [],\n bricks: defaultBricks,\n themes: [defaultTheme],\n activeThemeId: defaultTheme.id,\n tokens: {},\n metadata: {}\n };\n}\n\nexport function createWebsitePage(opts?: {\n id?: string;\n name?: string;\n route?: string;\n schema?: FormSchema;\n}): WebsitePage {\n const name = opts?.name ?? 'New Page';\n const schema = opts?.schema ?? createEmptySchema('web', { title: name });\n const flavor: DesignerFlavor = 'web';\n\n return {\n id: opts?.id ?? uuidv4(),\n name,\n route: opts?.route ?? '/',\n schema: { ...schema, flavor, title: schema.title ?? name }\n };\n}\n\nexport function createDefaultWebsiteTheme(): WebsiteTheme {\n return {\n id: 'default',\n vars: {}\n };\n}\n\nexport function createDefaultWebsiteBrick(): WebsiteBrick {\n return {\n id: uuidv4(),\n name: 'Hero',\n runtime: 'dom',\n templateHtml: `\n<section class=\"bg-slate-50 py-16\">\n <div class=\"mx-auto max-w-4xl px-6 text-center\">\n <h1 class=\"text-4xl font-bold text-ink-900\"\n data-fd-bind=\"headline\"\n data-fd-type=\"richtext\">Launch your next site faster</h1>\n <p class=\"mt-4 text-lg text-ink-600\"\n data-fd-bind=\"subhead\"\n data-fd-type=\"text\">Design, edit, and ship without leaving the editor.</p>\n <a class=\"mt-8 inline-flex items-center rounded-lg bg-accent-600 px-6 py-3 text-white\"\n data-fd-bind=\"cta.href\"\n data-fd-type=\"href\"\n href=\"/get-started\">\n <span data-fd-bind=\"cta.label\" data-fd-type=\"text\">Get started</span>\n </a>\n </div>\n</section>\n `.trim(),\n scriptJs: '',\n propsSchema: {\n type: 'object',\n properties: {\n headline: { type: 'string' },\n subhead: { type: 'string' },\n cta: {\n type: 'object',\n properties: {\n label: { type: 'string' },\n href: { type: 'string' }\n }\n }\n }\n },\n defaultProps: {\n headline: 'Launch your next site faster',\n subhead: 'Design, edit, and ship without leaving the editor.',\n cta: {\n label: 'Get started',\n href: '/get-started'\n }\n }\n };\n}\n\nexport function createDefaultWebsiteBricks(): WebsiteBrick[] {\n return [\n createDefaultWebsiteBrick(),\n createCarouselBrick(),\n createVideoFeatureBrick(),\n createCalendarBrick(),\n createStockTickerBrick(),\n createWeatherBrick(),\n createReactCarouselBrick(),\n createReactPricingBrick(),\n createReactVideoPlayerBrick(),\n createReactStockTickerBrick(),\n createReactCalendarBrick()\n ];\n}\n\nfunction createCarouselBrick(): WebsiteBrick {\n return {\n id: uuidv4(),\n name: 'Carousel Spotlight',\n runtime: 'dom',\n templateHtml: `\n<section class=\"relative overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-card\">\n <div class=\"px-6 pt-6\">\n <div class=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Featured</div>\n <h2 class=\"mt-2 text-2xl font-semibold text-ink-900\" data-fd-bind=\"heading\" data-fd-type=\"text\">Product stories</h2>\n <p class=\"mt-2 text-sm text-slate-500\" data-fd-bind=\"subhead\" data-fd-type=\"text\">Highlights from teams shipping faster with the new designer.</p>\n </div>\n <div class=\"relative mt-4\">\n <div data-fd-carousel-slides class=\"relative h-80 overflow-hidden\">\n <template data-fd-carousel-slide-template>\n <div class=\"absolute inset-0 flex h-full w-full items-center justify-between gap-6 px-6 py-6 opacity-0 scale-95 transition duration-500 ease-out\">\n <div class=\"flex-1 space-y-4\">\n <div class=\"text-xs font-semibold uppercase tracking-wide text-slate-400\" data-field=\"tag\">Spotlight</div>\n <h3 class=\"text-2xl font-semibold text-ink-900\" data-field=\"title\">Launch landing in days</h3>\n <p class=\"text-sm text-slate-500\" data-field=\"body\">Explore how teams craft conversion-focused pages with reusable bricks.</p>\n <a class=\"inline-flex items-center rounded-md bg-accent-600 px-4 py-2 text-xs font-semibold text-white shadow-sm\" data-field=\"cta\" href=\"/stories\">Read story</a>\n </div>\n <div class=\"flex-1\">\n <img class=\"h-64 w-full rounded-xl object-cover shadow-card\" data-field=\"image\" src=\"https://images.unsplash.com/photo-1487014679447-9f8336841d58?auto=format&fit=crop&w=1200&q=80\" alt=\"\">\n </div>\n </div>\n </template>\n </div>\n <button type=\"button\" data-fd-carousel-prev class=\"absolute left-4 top-1/2 -translate-y-1/2 rounded-full border border-white/60 bg-white/80 p-2 text-ink-700 shadow-sm backdrop-blur hover:bg-white\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M15 18l-6-6 6-6\"></path>\n </svg>\n </button>\n <button type=\"button\" data-fd-carousel-next class=\"absolute right-4 top-1/2 -translate-y-1/2 rounded-full border border-white/60 bg-white/80 p-2 text-ink-700 shadow-sm backdrop-blur hover:bg-white\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M9 6l6 6-6 6\"></path>\n </svg>\n </button>\n <div data-fd-carousel-dots class=\"absolute bottom-4 left-1/2 flex -translate-x-1/2 items-center gap-2\">\n <template data-fd-carousel-dot-template>\n <button type=\"button\" class=\"h-2 w-2 rounded-full bg-slate-300 transition\"></button>\n </template>\n </div>\n </div>\n <div class=\"hidden opacity-0 opacity-100 scale-95 scale-100 pointer-events-none pointer-events-auto bg-accent-600 bg-slate-300\"></div>\n</section>\n `.trim(),\n scriptJs: `\nconst root = ctx.root;\nconst slidesContainer = root.querySelector('[data-fd-carousel-slides]');\nconst slideTemplate = root.querySelector('template[data-fd-carousel-slide-template]');\nconst dotsContainer = root.querySelector('[data-fd-carousel-dots]');\nconst dotTemplate = root.querySelector('template[data-fd-carousel-dot-template]');\nconst prevButton = root.querySelector('[data-fd-carousel-prev]');\nconst nextButton = root.querySelector('[data-fd-carousel-next]');\n\nif (!slidesContainer || !slideTemplate || !dotsContainer || !dotTemplate) {\n return;\n}\n\nlet slideNodes = [];\nlet dotNodes = [];\nlet index = 0;\nlet timerId = 0;\n\nconst setActive = (node, active) => {\n node.classList.toggle('opacity-0', !active);\n node.classList.toggle('opacity-100', active);\n node.classList.toggle('scale-95', !active);\n node.classList.toggle('scale-100', active);\n node.classList.toggle('pointer-events-none', !active);\n node.classList.toggle('pointer-events-auto', active);\n};\n\nconst applyActive = () => {\n slideNodes.forEach((node, idx) => setActive(node, idx === index));\n dotNodes.forEach((dot, idx) => {\n dot.classList.toggle('bg-accent-600', idx === index);\n dot.classList.toggle('bg-slate-300', idx !== index);\n });\n};\n\nconst normalizeSlides = (props) => Array.isArray(props.slides) ? props.slides : [];\n\nconst buildSlides = (props) => {\n const baseSlide = slideTemplate.content.firstElementChild;\n const baseDot = dotTemplate.content.firstElementChild;\n if (!baseSlide || !baseDot) return;\n\n slidesContainer.innerHTML = '';\n dotsContainer.innerHTML = '';\n slideNodes = [];\n dotNodes = [];\n\n const slides = normalizeSlides(props);\n slides.forEach((slide, idx) => {\n const node = baseSlide.cloneNode(true);\n const tag = node.querySelector('[data-field=\"tag\"]');\n const title = node.querySelector('[data-field=\"title\"]');\n const body = node.querySelector('[data-field=\"body\"]');\n const cta = node.querySelector('[data-field=\"cta\"]');\n const image = node.querySelector('[data-field=\"image\"]');\n\n if (tag && slide.tag) tag.textContent = slide.tag;\n if (title && slide.title) title.textContent = slide.title;\n if (body && slide.body) body.textContent = slide.body;\n if (cta && slide.ctaLabel) cta.textContent = slide.ctaLabel;\n if (cta && slide.ctaHref) cta.setAttribute('href', slide.ctaHref);\n if (image && slide.imageUrl) image.setAttribute('src', slide.imageUrl);\n if (image && slide.title) image.setAttribute('alt', slide.title);\n\n slidesContainer.appendChild(node);\n slideNodes.push(node);\n\n const dot = baseDot.cloneNode(true);\n dot.addEventListener('click', () => {\n index = idx;\n applyActive();\n startTimer(ctx.getProps());\n });\n dotsContainer.appendChild(dot);\n dotNodes.push(dot);\n });\n\n if (index >= slideNodes.length) index = 0;\n applyActive();\n};\n\nconst go = (nextIndex) => {\n if (!slideNodes.length) return;\n const total = slideNodes.length;\n index = (nextIndex + total) % total;\n applyActive();\n};\n\nconst clearTimer = () => {\n if (timerId) {\n clearInterval(timerId);\n timerId = 0;\n }\n};\n\nconst startTimer = (props) => {\n clearTimer();\n if (!props.autoPlay) return;\n const interval = Number(props.intervalMs) || 5000;\n timerId = setInterval(() => go(index + 1), interval);\n};\n\nconst onPrev = () => {\n go(index - 1);\n startTimer(ctx.getProps());\n};\nconst onNext = () => {\n go(index + 1);\n startTimer(ctx.getProps());\n};\n\nif (prevButton) prevButton.addEventListener('click', onPrev);\nif (nextButton) nextButton.addEventListener('click', onNext);\n\nbuildSlides(ctx.getProps());\nstartTimer(ctx.getProps());\n\nreturn {\n update: (nextProps) => {\n buildSlides(nextProps);\n startTimer(nextProps);\n },\n destroy: () => {\n if (prevButton) prevButton.removeEventListener('click', onPrev);\n if (nextButton) nextButton.removeEventListener('click', onNext);\n clearTimer();\n }\n};\n `.trim(),\n propsSchema: {\n type: 'object',\n properties: {\n heading: { type: 'string' },\n subhead: { type: 'string' },\n autoPlay: { type: 'boolean' },\n intervalMs: { type: 'number' },\n slides: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n tag: { type: 'string' },\n title: { type: 'string' },\n body: { type: 'string' },\n ctaLabel: { type: 'string' },\n ctaHref: { type: 'string' },\n imageUrl: { type: 'string' }\n }\n }\n }\n }\n },\n defaultProps: {\n heading: 'Product stories',\n subhead: 'Highlights from teams shipping faster with the new designer.',\n autoPlay: true,\n intervalMs: 5000,\n slides: [\n {\n tag: 'Launch',\n title: 'Design a landing page in a morning',\n body: 'Bring visual polish to every section with reusable bricks.',\n ctaLabel: 'Read story',\n ctaHref: '/stories/launch',\n imageUrl: 'https://images.unsplash.com/photo-1522542550221-31fd19575a2d?auto=format&fit=crop&w=1200&q=80'\n },\n {\n tag: 'Growth',\n title: 'Ship experiments without a dev queue',\n body: 'Swap layouts, update content, and publish with confidence.',\n ctaLabel: 'See results',\n ctaHref: '/stories/growth',\n imageUrl: 'https://images.unsplash.com/photo-1454165804606-c3d57bc86b40?auto=format&fit=crop&w=1200&q=80'\n },\n {\n tag: 'Brand',\n title: 'Create a consistent design system',\n body: 'Align teams around shared tokens and on-brand components.',\n ctaLabel: 'View system',\n ctaHref: '/stories/brand',\n imageUrl: 'https://images.unsplash.com/photo-1498050108023-c5249f4df085?auto=format&fit=crop&w=1200&q=80'\n }\n ]\n }\n };\n}\n\nfunction createVideoFeatureBrick(): WebsiteBrick {\n return {\n id: uuidv4(),\n name: 'Video Feature',\n runtime: 'dom',\n templateHtml: `\n<section class=\"rounded-2xl border border-slate-200 bg-white shadow-card\">\n <div class=\"grid gap-6 lg:grid-cols-2\">\n <div class=\"px-6 pt-6 pb-2\">\n <div class=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Studio Reel</div>\n <h2 class=\"mt-2 text-2xl font-semibold text-ink-900\" data-fd-bind=\"title\" data-fd-type=\"text\">See the designer in action</h2>\n <p class=\"mt-3 text-sm text-slate-500\" data-fd-bind=\"description\" data-fd-type=\"text\">A quick walkthrough of crafting sections, editing content, and publishing fast.</p>\n <div class=\"mt-4 flex items-center gap-3\">\n <a class=\"inline-flex items-center rounded-md bg-accent-600 px-4 py-2 text-xs font-semibold text-white shadow-sm\" data-fd-bind=\"cta.href\" data-fd-type=\"href\" href=\"/demo\">\n <span data-fd-bind=\"cta.label\" data-fd-type=\"text\">Watch full demo</span>\n </a>\n <span class=\"text-xs text-slate-400\" data-fd-bind=\"duration\" data-fd-type=\"text\">2:45</span>\n </div>\n </div>\n <div class=\"relative px-6 pb-6 lg:px-0 lg:pr-6\">\n <div class=\"relative overflow-hidden rounded-xl bg-slate-900\">\n <img class=\"absolute inset-0 h-full w-full object-cover transition-opacity duration-300\" data-fd-video-poster data-fd-bind=\"posterUrl\" data-fd-type=\"image\" src=\"https://images.unsplash.com/photo-1519389950473-47ba0277781c?auto=format&fit=crop&w=1400&q=80\" alt=\"\">\n <div class=\"absolute inset-0 bg-gradient-to-tr from-slate-900/40 via-slate-900/10 to-transparent\"></div>\n <video class=\"relative z-10 h-full w-full\" data-fd-bind=\"videoUrl\" data-fd-type=\"src\" playsinline></video>\n <button type=\"button\" data-fd-video-toggle class=\"absolute bottom-4 left-4 inline-flex items-center gap-2 rounded-full bg-white/90 px-4 py-2 text-xs font-semibold text-ink-900 shadow-sm backdrop-blur\">Play video</button>\n </div>\n </div>\n </div>\n <div class=\"hidden opacity-0 opacity-100\"></div>\n</section>\n `.trim(),\n scriptJs: `\nconst root = ctx.root;\nconst video = root.querySelector('video');\nconst poster = root.querySelector('[data-fd-video-poster]');\nconst toggle = root.querySelector('[data-fd-video-toggle]');\n\nif (!video || !toggle) {\n return;\n}\n\nconst syncState = () => {\n if (video.paused) {\n if (poster) poster.classList.remove('opacity-0');\n toggle.textContent = 'Play video';\n } else {\n if (poster) poster.classList.add('opacity-0');\n toggle.textContent = 'Pause video';\n }\n};\n\nconst handleToggle = () => {\n if (video.paused) {\n video.play();\n } else {\n video.pause();\n }\n};\n\ntoggle.addEventListener('click', handleToggle);\nvideo.addEventListener('play', syncState);\nvideo.addEventListener('pause', syncState);\n\nconst applyProps = (props) => {\n if (props.muted !== undefined) video.muted = !!props.muted;\n if (props.loop !== undefined) video.loop = !!props.loop;\n if (props.autoplay) {\n video.play().catch(() => {});\n }\n video.load();\n};\n\napplyProps(ctx.getProps());\nsyncState();\n\nreturn {\n update: (nextProps) => {\n applyProps(nextProps);\n syncState();\n },\n destroy: () => {\n toggle.removeEventListener('click', handleToggle);\n video.removeEventListener('play', syncState);\n video.removeEventListener('pause', syncState);\n }\n};\n `.trim(),\n propsSchema: {\n type: 'object',\n properties: {\n title: { type: 'string' },\n description: { type: 'string' },\n duration: { type: 'string' },\n videoUrl: { type: 'string' },\n posterUrl: { type: 'string' },\n autoplay: { type: 'boolean' },\n muted: { type: 'boolean' },\n loop: { type: 'boolean' },\n cta: {\n type: 'object',\n properties: {\n label: { type: 'string' },\n href: { type: 'string' }\n }\n }\n }\n },\n defaultProps: {\n title: 'See the designer in action',\n description: 'A quick walkthrough of crafting sections, editing content, and publishing fast.',\n duration: '2:45',\n videoUrl: 'https://www.w3schools.com/html/mov_bbb.mp4',\n posterUrl: 'https://images.unsplash.com/photo-1519389950473-47ba0277781c?auto=format&fit=crop&w=1400&q=80',\n autoplay: false,\n muted: true,\n loop: false,\n cta: {\n label: 'Watch full demo',\n href: '/demo'\n }\n }\n };\n}\n\nfunction createCalendarBrick(): WebsiteBrick {\n return {\n id: uuidv4(),\n name: 'Calendar Planner',\n runtime: 'dom',\n templateHtml: `\n<section class=\"rounded-2xl border border-slate-200 bg-white p-6 shadow-card\">\n <div class=\"flex items-start justify-between gap-4\">\n <div>\n <div class=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Calendar</div>\n <div class=\"mt-1 text-xl font-semibold text-ink-900\" data-fd-bind=\"monthLabel\" data-fd-type=\"text\">October</div>\n <div class=\"text-xs text-slate-500\" data-fd-bind=\"year\" data-fd-type=\"text\">2025</div>\n </div>\n <div class=\"rounded-full bg-slate-100 px-3 py-1 text-xs text-slate-500\" data-fd-bind=\"timezone\" data-fd-type=\"text\">PST</div>\n </div>\n <div class=\"mt-5 grid grid-cols-7 gap-2 text-[10px] font-semibold uppercase tracking-wide text-slate-400\">\n <div>Sun</div>\n <div>Mon</div>\n <div>Tue</div>\n <div>Wed</div>\n <div>Thu</div>\n <div>Fri</div>\n <div>Sat</div>\n </div>\n <div class=\"mt-3 grid grid-cols-7 gap-2\" data-fd-calendar-grid>\n <template data-fd-calendar-day-template>\n <div class=\"flex h-9 w-9 items-center justify-center rounded-full text-xs font-medium\"></div>\n </template>\n </div>\n <div class=\"mt-6 border-t border-slate-100 pt-4\">\n <div class=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Upcoming</div>\n <div class=\"mt-3 space-y-3\" data-fd-calendar-events>\n <template data-fd-calendar-event-template>\n <div class=\"flex items-start gap-3\">\n <div class=\"mt-1 h-2.5 w-2.5 rounded-full bg-accent-500\"></div>\n <div>\n <div class=\"text-sm font-medium text-ink-900\" data-field=\"title\">Design sync</div>\n <div class=\"text-xs text-slate-500\" data-field=\"time\">10:00 AM</div>\n <div class=\"text-[11px] text-slate-400\" data-field=\"date\">Oct 12</div>\n </div>\n </div>\n </template>\n </div>\n </div>\n <div class=\"hidden text-ink-700 text-slate-300 bg-accent-100 text-accent-700 ring-1 ring-accent-200\"></div>\n</section>\n `.trim(),\n scriptJs: `\nconst root = ctx.root;\nconst grid = root.querySelector('[data-fd-calendar-grid]');\nconst dayTemplate = root.querySelector('template[data-fd-calendar-day-template]');\nconst eventsContainer = root.querySelector('[data-fd-calendar-events]');\nconst eventTemplate = root.querySelector('template[data-fd-calendar-event-template]');\n\nif (!grid || !dayTemplate || !eventsContainer || !eventTemplate) {\n return;\n}\n\nconst buildDays = (props) => {\n const today = new Date();\n const month = Number(props.month) || (today.getMonth() + 1);\n const year = Number(props.year) || today.getFullYear();\n const firstDay = new Date(year, month - 1, 1).getDay();\n const daysInMonth = new Date(year, month, 0).getDate();\n const highlight = Array.isArray(props.highlightedDays)\n ? new Set(props.highlightedDays.map((value) => Number(value)))\n : new Set();\n\n grid.innerHTML = '';\n const base = dayTemplate.content.firstElementChild;\n if (!base) return;\n\n for (let i = 0; i < firstDay; i += 1) {\n const spacer = base.cloneNode(true);\n spacer.classList.add('text-slate-300');\n grid.appendChild(spacer);\n }\n\n for (let day = 1; day <= daysInMonth; day += 1) {\n const node = base.cloneNode(true);\n node.textContent = String(day);\n node.classList.add('text-ink-700');\n\n if (highlight.has(day)) {\n node.classList.add('bg-accent-100', 'text-accent-700');\n }\n\n if (props.showToday !== false &&\n day === today.getDate() &&\n month === (today.getMonth() + 1) &&\n year === today.getFullYear()) {\n node.classList.add('ring-1', 'ring-accent-200');\n }\n\n grid.appendChild(node);\n }\n};\n\nconst buildEvents = (props) => {\n const events = Array.isArray(props.events) ? props.events : [];\n eventsContainer.innerHTML = '';\n const base = eventTemplate.content.firstElementChild;\n if (!base) return;\n\n if (!events.length) {\n const empty = document.createElement('div');\n empty.className = 'text-xs text-slate-400';\n empty.textContent = 'No upcoming events.';\n eventsContainer.appendChild(empty);\n return;\n }\n\n events.forEach((event) => {\n const node = base.cloneNode(true);\n const title = node.querySelector('[data-field=\"title\"]');\n const time = node.querySelector('[data-field=\"time\"]');\n const date = node.querySelector('[data-field=\"date\"]');\n\n if (title && event.title) title.textContent = event.title;\n if (time && event.time) time.textContent = event.time;\n if (date && event.date) date.textContent = event.date;\n\n eventsContainer.appendChild(node);\n });\n};\n\nconst render = (props) => {\n buildDays(props);\n buildEvents(props);\n};\n\nrender(ctx.getProps());\n\nreturn {\n update: (nextProps) => render(nextProps)\n};\n `.trim(),\n propsSchema: {\n type: 'object',\n properties: {\n monthLabel: { type: 'string' },\n month: { type: 'number' },\n year: { type: 'number' },\n timezone: { type: 'string' },\n showToday: { type: 'boolean' },\n highlightedDays: {\n type: 'array',\n items: { type: 'number' }\n },\n events: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n title: { type: 'string' },\n time: { type: 'string' },\n date: { type: 'string' }\n }\n }\n }\n }\n },\n defaultProps: {\n monthLabel: 'October',\n month: 10,\n year: 2025,\n timezone: 'PST',\n showToday: true,\n highlightedDays: [3, 8, 15, 22],\n events: [\n { title: 'Design sync', time: '10:00 AM', date: 'Oct 3' },\n { title: 'Marketing review', time: '1:00 PM', date: 'Oct 8' },\n { title: 'Launch prep', time: '4:00 PM', date: 'Oct 15' }\n ]\n }\n };\n}\n\nfunction createStockTickerBrick(): WebsiteBrick {\n return {\n id: uuidv4(),\n name: 'Stock Ticker',\n runtime: 'dom',\n templateHtml: `\n<section class=\"rounded-2xl border border-slate-200 bg-white p-6 shadow-card\">\n <div class=\"flex items-start justify-between gap-4\">\n <div>\n <div class=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Market Pulse</div>\n <div class=\"mt-1 text-xl font-semibold text-ink-900\" data-fd-bind=\"title\" data-fd-type=\"text\">Realtime watchlist</div>\n </div>\n <div class=\"rounded-full bg-slate-100 px-3 py-1 text-xs text-slate-500\" data-fd-bind=\"asOf\" data-fd-type=\"text\">Updated 09:30 AM</div>\n </div>\n <div class=\"mt-4 space-y-2\" data-fd-ticker-list>\n <template data-fd-ticker-item-template>\n <div class=\"flex items-center justify-between rounded-lg border border-slate-100 bg-slate-50 px-3 py-2\">\n <div>\n <div class=\"text-sm font-semibold text-ink-900\" data-field=\"symbol\">AAPL</div>\n <div class=\"text-xs text-slate-500\" data-field=\"name\">Apple Inc.</div>\n </div>\n <div class=\"text-right\">\n <div class=\"text-sm font-semibold text-ink-900\" data-field=\"price\">$178.11</div>\n <div class=\"text-xs font-medium\" data-field=\"change\">+1.20%</div>\n </div>\n </div>\n </template>\n </div>\n <div class=\"hidden text-emerald-600 text-rose-600\"></div>\n</section>\n `.trim(),\n scriptJs: `\nconst root = ctx.root;\nconst list = root.querySelector('[data-fd-ticker-list]');\nconst template = root.querySelector('template[data-fd-ticker-item-template]');\n\nif (!list || !template) {\n return;\n}\n\nlet entries = [];\nlet timerId = 0;\n\nconst normalizeStocks = (props) => Array.isArray(props.stocks) ? props.stocks : [];\n\nconst formatPrice = (value) => {\n if (typeof value === 'number') return value.toFixed(2);\n return value || '0.00';\n};\n\nconst formatChange = (value) => {\n if (typeof value !== 'number') return '0.00%';\n const sign = value >= 0 ? '+' : '';\n return sign + value.toFixed(2) + '%';\n};\n\nconst applyChangeStyle = (node, value) => {\n node.classList.toggle('text-emerald-600', value >= 0);\n node.classList.toggle('text-rose-600', value < 0);\n};\n\nconst render = (props) => {\n const base = template.content.firstElementChild;\n if (!base) return;\n\n list.innerHTML = '';\n entries = [];\n\n normalizeStocks(props).forEach((stock) => {\n const node = base.cloneNode(true);\n const symbol = node.querySelector('[data-field=\"symbol\"]');\n const name = node.querySelector('[data-field=\"name\"]');\n const price = node.querySelector('[data-field=\"price\"]');\n const change = node.querySelector('[data-field=\"change\"]');\n\n const priceValue = Number(stock.price) || 0;\n const changeValue = Number(stock.change) || 0;\n\n if (symbol) symbol.textContent = stock.symbol || '';\n if (name) name.textContent = stock.name || '';\n if (price) price.textContent = '$' + formatPrice(priceValue);\n if (change) {\n change.textContent = formatChange(changeValue);\n applyChangeStyle(change, changeValue);\n }\n\n list.appendChild(node);\n entries.push({ price, change, priceValue, changeValue });\n });\n};\n\nconst tick = () => {\n entries.forEach((entry) => {\n const delta = (Math.random() - 0.5) * 0.8;\n entry.priceValue = Math.max(0, entry.priceValue + delta);\n entry.changeValue = entry.changeValue + delta;\n if (entry.price) entry.price.textContent = '$' + formatPrice(entry.priceValue);\n if (entry.change) {\n entry.change.textContent = formatChange(entry.changeValue);\n applyChangeStyle(entry.change, entry.changeValue);\n }\n });\n};\n\nconst clearTimer = () => {\n if (timerId) {\n clearInterval(timerId);\n timerId = 0;\n }\n};\n\nconst startTimer = (props) => {\n clearTimer();\n if (!props.simulate) return;\n const interval = Number(props.refreshMs) || 3000;\n timerId = setInterval(tick, interval);\n};\n\nrender(ctx.getProps());\nstartTimer(ctx.getProps());\n\nreturn {\n update: (nextProps) => {\n render(nextProps);\n startTimer(nextProps);\n },\n destroy: () => clearTimer()\n};\n `.trim(),\n propsSchema: {\n type: 'object',\n properties: {\n title: { type: 'string' },\n asOf: { type: 'string' },\n simulate: { type: 'boolean' },\n refreshMs: { type: 'number' },\n stocks: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n symbol: { type: 'string' },\n name: { type: 'string' },\n price: { type: 'number' },\n change: { type: 'number' }\n }\n }\n }\n }\n },\n defaultProps: {\n title: 'Realtime watchlist',\n asOf: 'Updated 09:30 AM',\n simulate: true,\n refreshMs: 3000,\n stocks: [\n { symbol: 'AAPL', name: 'Apple Inc.', price: 189.32, change: 1.2 },\n { symbol: 'TSLA', name: 'Tesla', price: 248.11, change: -0.6 },\n { symbol: 'NVDA', name: 'NVIDIA', price: 901.44, change: 2.1 }\n ]\n }\n };\n}\n\nfunction createWeatherBrick(): WebsiteBrick {\n return {\n id: uuidv4(),\n name: 'Weather Brief',\n runtime: 'dom',\n templateHtml: `\n<section class=\"rounded-2xl border border-slate-200 bg-white p-6 shadow-card\">\n <div class=\"flex items-start justify-between gap-4\">\n <div>\n <div class=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Weather</div>\n <div class=\"mt-1 text-xl font-semibold text-ink-900\" data-fd-bind=\"location\" data-fd-type=\"text\">San Francisco, CA</div>\n <div class=\"text-xs text-slate-500\" data-fd-bind=\"updatedAt\" data-fd-type=\"text\">Updated 10:45 AM</div>\n </div>\n <div class=\"rounded-full bg-slate-100 px-3 py-1 text-xs text-slate-500\" data-fd-bind=\"condition\" data-fd-type=\"text\">Partly Cloudy</div>\n </div>\n <div class=\"mt-5 flex items-center justify-between\">\n <div>\n <div class=\"text-4xl font-semibold text-ink-900\">\n <span data-fd-bind=\"temperature\" data-fd-type=\"text\">18</span>\n <span class=\"text-sm font-semibold text-slate-400\" data-fd-bind=\"unit\" data-fd-type=\"text\">C</span>\n </div>\n <div class=\"text-xs text-slate-500\">Temperature</div>\n </div>\n <div class=\"text-right\">\n <div class=\"text-sm text-slate-500\">High <span class=\"font-semibold text-ink-900\" data-fd-bind=\"high\" data-fd-type=\"text\">21</span></div>\n <div class=\"text-sm text-slate-500\">Low <span class=\"font-semibold text-ink-900\" data-fd-bind=\"low\" data-fd-type=\"text\">14</span></div>\n <div class=\"text-sm text-slate-500\">Feels <span class=\"font-semibold text-ink-900\" data-fd-bind=\"feelsLike\" data-fd-type=\"text\">17</span></div>\n </div>\n </div>\n <div class=\"mt-5 grid grid-cols-2 gap-4\">\n <div class=\"rounded-lg border border-slate-100 bg-slate-50 p-3\">\n <div class=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Humidity</div>\n <div class=\"mt-1 text-sm font-semibold text-ink-900\" data-fd-bind=\"humidity\" data-fd-type=\"text\">68%</div>\n </div>\n <div class=\"rounded-lg border border-slate-100 bg-slate-50 p-3\">\n <div class=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Wind</div>\n <div class=\"mt-1 text-sm font-semibold text-ink-900\" data-fd-bind=\"wind\" data-fd-type=\"text\">12 mph</div>\n </div>\n </div>\n</section>\n `.trim(),\n scriptJs: '',\n propsSchema: {\n type: 'object',\n properties: {\n location: { type: 'string' },\n updatedAt: { type: 'string' },\n condition: { type: 'string' },\n temperature: { type: 'string' },\n unit: { type: 'string' },\n high: { type: 'string' },\n low: { type: 'string' },\n feelsLike: { type: 'string' },\n humidity: { type: 'string' },\n wind: { type: 'string' }\n }\n },\n defaultProps: {\n location: 'San Francisco, CA',\n updatedAt: 'Updated 10:45 AM',\n condition: 'Partly Cloudy',\n temperature: '18',\n unit: 'C',\n high: '21',\n low: '14',\n feelsLike: '17',\n humidity: '68%',\n wind: '12 mph'\n }\n };\n}\n\nfunction createReactCarouselBrick(): WebsiteBrick {\n return {\n id: uuidv4(),\n name: 'Carousel Spotlight (React)',\n runtime: 'react',\n templateHtml: `\n<section class=\"rounded-2xl border border-dashed border-slate-200 bg-white p-6 text-sm text-slate-500\">\n This is a React brick. Edit it in the Component tab.\n</section>\n `.trim(),\n reactComponentJs: `\nconst { useEffect, useMemo, useState } = React;\n\nfunction Brick(props) {\n const heading = typeof props.heading === 'string' ? props.heading : 'Product stories';\n const subhead = typeof props.subhead === 'string' ? props.subhead : 'Highlights from teams shipping faster with the new designer.';\n const slides = Array.isArray(props.slides) ? props.slides : [];\n\n const autoPlay = props.autoPlay !== false;\n const intervalMs = Math.max(1200, Number(props.intervalMs) || 5000);\n const [activeIndex, setActiveIndex] = useState(0);\n const safeIndex = useMemo(() => {\n if (!slides.length) return 0;\n return Math.min(activeIndex, slides.length - 1);\n }, [activeIndex, slides.length]);\n\n useEffect(() => {\n if (!autoPlay || slides.length < 2) return;\n const handle = setInterval(() => {\n setActiveIndex(current => (current + 1) % slides.length);\n }, intervalMs);\n return () => clearInterval(handle);\n }, [autoPlay, intervalMs, slides.length]);\n\n useEffect(() => {\n if (!slides.length) return;\n if (activeIndex >= slides.length) setActiveIndex(0);\n }, [activeIndex, slides.length]);\n\n const goPrev = () => {\n if (!slides.length) return;\n setActiveIndex(current => (current - 1 + slides.length) % slides.length);\n };\n\n const goNext = () => {\n if (!slides.length) return;\n setActiveIndex(current => (current + 1) % slides.length);\n };\n\n const handleKeyDown = (event) => {\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n goPrev();\n }\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n goNext();\n }\n };\n\n return (\n <section\n className=\"relative overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-card\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n <div className=\"px-6 pt-6\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Featured</div>\n <h2 className=\"mt-2 text-2xl font-semibold text-ink-900\" data-fd-bind=\"heading\" data-fd-type=\"text\">\n {heading}\n </h2>\n <p className=\"mt-2 text-sm text-slate-500\" data-fd-bind=\"subhead\" data-fd-type=\"text\">\n {subhead}\n </p>\n </div>\n\n <div className=\"relative mt-4 overflow-hidden\">\n {slides.length ? (\n <>\n <div\n className=\"flex transition-transform duration-500 ease-out\"\n style={{ transform: 'translateX(-' + safeIndex * 100 + '%)' }}\n >\n {slides.map((slide, index) => (\n <div key={index} className=\"w-full shrink-0 px-6 pb-6\">\n <div className=\"grid items-center gap-6 lg:grid-cols-2\">\n <div className=\"space-y-4\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">\n {slide?.tag || 'Spotlight'}\n </div>\n <h3 className=\"text-2xl font-semibold text-ink-900\">{slide?.title || 'Launch landing in days'}</h3>\n <p className=\"text-sm text-slate-500\">{slide?.body || 'Explore how teams craft conversion-focused pages with reusable bricks.'}</p>\n <a\n className=\"inline-flex items-center rounded-md bg-accent-600 px-4 py-2 text-xs font-semibold text-white shadow-sm hover:bg-accent-700\"\n href={slide?.ctaHref || '/stories'}\n onMouseDown={event => event.stopPropagation()}\n >\n {slide?.ctaLabel || 'Read story'}\n </a>\n </div>\n <div className=\"relative\">\n <div className=\"absolute -inset-4 -z-10 rounded-3xl bg-gradient-to-tr from-accent-200/40 via-white to-slate-100 blur-2xl\"></div>\n <img\n className=\"h-64 w-full rounded-xl object-cover shadow-card\"\n src={slide?.imageUrl || 'https://images.unsplash.com/photo-1487014679447-9f8336841d58?auto=format&fit=crop&w=1200&q=80'}\n alt={slide?.title || 'Slide image'}\n draggable={false}\n />\n </div>\n </div>\n </div>\n ))}\n </div>\n\n <button\n type=\"button\"\n className=\"absolute left-4 top-1/2 -translate-y-1/2 rounded-full border border-white/60 bg-white/90 p-2 text-ink-700 shadow-sm backdrop-blur hover:bg-white\"\n onClick={goPrev}\n onMouseDown={event => event.stopPropagation()}\n aria-label=\"Previous slide\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"absolute right-4 top-1/2 -translate-y-1/2 rounded-full border border-white/60 bg-white/90 p-2 text-ink-700 shadow-sm backdrop-blur hover:bg-white\"\n onClick={goNext}\n onMouseDown={event => event.stopPropagation()}\n aria-label=\"Next slide\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M9 6l6 6-6 6\" />\n </svg>\n </button>\n\n <div className=\"absolute bottom-4 left-1/2 flex -translate-x-1/2 items-center gap-2\">\n {slides.map((_, dotIndex) => (\n <button\n key={dotIndex}\n type=\"button\"\n className={\n 'h-2.5 w-2.5 rounded-full transition ' +\n (dotIndex === safeIndex ? 'bg-accent-600' : 'bg-slate-300 hover:bg-slate-400')\n }\n onClick={() => setActiveIndex(dotIndex)}\n onMouseDown={event => event.stopPropagation()}\n aria-label={'Go to slide ' + (dotIndex + 1)}\n />\n ))}\n </div>\n </>\n ) : (\n <div className=\"px-6 pb-6 text-sm text-slate-500\">Add slides in the inspector to see the carousel.</div>\n )}\n </div>\n\n <div className=\"hidden bg-accent-600 bg-accent-700 bg-slate-300 bg-slate-400 text-ink-700\"></div>\n </section>\n );\n}\n\nreturn Brick;\n `.trim(),\n propsSchema: {\n type: 'object',\n properties: {\n heading: { type: 'string' },\n subhead: { type: 'string' },\n autoPlay: { type: 'boolean' },\n intervalMs: { type: 'number' },\n slides: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n tag: { type: 'string' },\n title: { type: 'string' },\n body: { type: 'string' },\n ctaLabel: { type: 'string' },\n ctaHref: { type: 'string' },\n imageUrl: { type: 'string' }\n }\n }\n }\n }\n },\n defaultProps: {\n heading: 'Product stories',\n subhead: 'Highlights from teams shipping faster with the new designer.',\n autoPlay: true,\n intervalMs: 5000,\n slides: [\n {\n tag: 'Launch',\n title: 'Design a landing page in a morning',\n body: 'Bring visual polish to every section with reusable bricks.',\n ctaLabel: 'Read story',\n ctaHref: '/stories/launch',\n imageUrl: 'https://images.unsplash.com/photo-1522542550221-31fd19575a2d?auto=format&fit=crop&w=1200&q=80'\n },\n {\n tag: 'Growth',\n title: 'Ship experiments without a dev queue',\n body: 'Swap layouts, update content, and publish with confidence.',\n ctaLabel: 'See results',\n ctaHref: '/stories/growth',\n imageUrl: 'https://images.unsplash.com/photo-1454165804606-c3d57bc86b40?auto=format&fit=crop&w=1200&q=80'\n },\n {\n tag: 'Brand',\n title: 'Create a consistent design system',\n body: 'Align teams around shared tokens and on-brand components.',\n ctaLabel: 'View system',\n ctaHref: '/stories/brand',\n imageUrl: 'https://images.unsplash.com/photo-1498050108023-c5249f4df085?auto=format&fit=crop&w=1200&q=80'\n }\n ]\n }\n };\n}\n\nfunction createReactPricingBrick(): WebsiteBrick {\n return {\n id: uuidv4(),\n name: 'Pricing Plans (React)',\n runtime: 'react',\n templateHtml: `\n<section class=\"rounded-2xl border border-dashed border-slate-200 bg-white p-6 text-sm text-slate-500\">\n This is a React brick. Edit it in the Component tab.\n</section>\n `.trim(),\n reactComponentJs: `\nconst { useMemo, useState } = React;\n\nfunction formatMoney(value) {\n const numberValue = Number(value);\n if (!Number.isFinite(numberValue)) return '$0';\n return '$' + Math.round(numberValue).toLocaleString();\n}\n\nfunction normalizePlans(raw) {\n if (!Array.isArray(raw)) return [];\n return raw.map(plan => ({\n name: plan?.name || '',\n description: plan?.description || '',\n priceMonthly: Number(plan?.priceMonthly) || 0,\n priceAnnual: Number(plan?.priceAnnual) || 0,\n highlight: plan?.highlight === true,\n ctaLabel: plan?.ctaLabel || 'Get started',\n ctaHref: plan?.ctaHref || '/signup',\n features: Array.isArray(plan?.features) ? plan.features.filter(Boolean) : []\n }));\n}\n\nfunction Brick(props) {\n const heading = typeof props.heading === 'string' ? props.heading : 'Pricing that scales with your team';\n const subhead = typeof props.subhead === 'string' ? props.subhead : 'Start simple. Upgrade when you need more power.';\n\n const initial = props.defaultBilling === 'annual' ? 'annual' : 'monthly';\n const [billing, setBilling] = useState(initial);\n\n const plans = useMemo(() => normalizePlans(props.plans), [props.plans]);\n const isAnnual = billing === 'annual';\n\n return (\n <section className=\"rounded-2xl border border-slate-200 bg-white shadow-card\">\n <div className=\"px-6 pt-6\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Pricing</div>\n <h2 className=\"mt-2 text-2xl font-semibold text-ink-900\" data-fd-bind=\"heading\" data-fd-type=\"text\">\n {heading}\n </h2>\n <p className=\"mt-2 text-sm text-slate-500\" data-fd-bind=\"subhead\" data-fd-type=\"text\">\n {subhead}\n </p>\n\n <div className=\"mt-5 inline-flex items-center gap-1 rounded-full border border-slate-200 bg-slate-50 p-1 text-xs font-semibold text-slate-600\">\n <button\n type=\"button\"\n className={'rounded-full px-3 py-1 transition ' + (!isAnnual ? 'bg-white text-ink-900 shadow-sm' : 'text-slate-600 hover:text-ink-900')}\n onClick={(event) => {\n event.stopPropagation();\n setBilling('monthly');\n }}\n onMouseDown={(event) => event.stopPropagation()}\n >\n Monthly\n </button>\n <button\n type=\"button\"\n className={'rounded-full px-3 py-1 transition ' + (isAnnual ? 'bg-white text-ink-900 shadow-sm' : 'text-slate-600 hover:text-ink-900')}\n onClick={(event) => {\n event.stopPropagation();\n setBilling('annual');\n }}\n onMouseDown={(event) => event.stopPropagation()}\n >\n Annual\n </button>\n {isAnnual ? (\n <span className=\"ml-2 rounded-full bg-accent-100 px-2 py-0.5 text-[10px] font-semibold text-accent-700\">\n Save 20%\n </span>\n ) : null}\n </div>\n </div>\n\n <div className=\"grid gap-4 px-6 pb-6 pt-6 md:grid-cols-3\">\n {plans.length ? (\n plans.map((plan, index) => {\n const price = isAnnual ? plan.priceAnnual : plan.priceMonthly;\n const suffix = isAnnual ? '/yr' : '/mo';\n const cardClass =\n 'relative rounded-2xl border bg-white p-5 transition ' +\n (plan.highlight ? 'border-accent-200 shadow-popover' : 'border-slate-200 shadow-sm');\n const ctaClass =\n 'mt-5 inline-flex w-full items-center justify-center rounded-lg px-4 py-2 text-xs font-semibold shadow-sm transition ' +\n (plan.highlight ? 'bg-accent-600 text-white hover:bg-accent-700' : 'bg-slate-900 text-white hover:bg-slate-800');\n\n return (\n <div key={plan.name + index} className={cardClass}>\n {plan.highlight ? (\n <div className=\"absolute right-4 top-4 rounded-full bg-accent-100 px-2 py-0.5 text-[10px] font-semibold text-accent-700\">\n Most popular\n </div>\n ) : null}\n\n <div className=\"text-sm font-semibold text-ink-900\">{plan.name || 'Plan'}</div>\n <div className=\"mt-1 text-xs text-slate-500\">{plan.description}</div>\n\n <div className=\"mt-4 flex items-end gap-2\">\n <div className=\"text-3xl font-semibold text-ink-900\">{formatMoney(price)}</div>\n <div className=\"pb-1 text-xs font-semibold text-slate-400\">{suffix}</div>\n </div>\n\n <div className=\"mt-4 space-y-2\">\n {plan.features.map((feature, featureIndex) => (\n <div key={featureIndex} className=\"flex items-start gap-2 text-xs text-slate-600\">\n <svg viewBox=\"0 0 24 24\" className=\"mt-0.5 h-4 w-4 text-emerald-600\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n <span>{feature}</span>\n </div>\n ))}\n </div>\n\n <a\n className={ctaClass}\n href={plan.ctaHref}\n onMouseDown={(event) => event.stopPropagation()}\n >\n {plan.ctaLabel}\n </a>\n </div>\n );\n })\n ) : (\n <div className=\"text-sm text-slate-500\">Add plans in the inspector to render pricing cards.</div>\n )}\n </div>\n\n <div className=\"hidden bg-accent-100 bg-accent-600 bg-accent-700 border-accent-200 text-accent-700 shadow-popover bg-slate-50 bg-slate-800 bg-slate-900 text-emerald-600\"></div>\n </section>\n );\n}\n\nreturn Brick;\n `.trim(),\n propsSchema: {\n type: 'object',\n properties: {\n heading: { type: 'string' },\n subhead: { type: 'string' },\n defaultBilling: { type: 'string' },\n plans: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n description: { type: 'string' },\n priceMonthly: { type: 'number' },\n priceAnnual: { type: 'number' },\n highlight: { type: 'boolean' },\n ctaLabel: { type: 'string' },\n ctaHref: { type: 'string' },\n features: { type: 'array', items: { type: 'string' } }\n }\n }\n }\n }\n },\n defaultProps: {\n heading: 'Pricing that scales with your team',\n subhead: 'Start simple. Upgrade when you need more power.',\n defaultBilling: 'monthly',\n plans: [\n {\n name: 'Starter',\n description: 'Launch your first site.',\n priceMonthly: 0,\n priceAnnual: 0,\n highlight: false,\n ctaLabel: 'Get started',\n ctaHref: '/signup',\n features: ['Unlimited pages', 'Core bricks', 'Community support']\n },\n {\n name: 'Pro',\n description: 'For teams shipping weekly.',\n priceMonthly: 29,\n priceAnnual: 279,\n highlight: true,\n ctaLabel: 'Upgrade to Pro',\n ctaHref: '/upgrade',\n features: ['Project themes', 'Advanced bricks', 'Preview routing', 'Priority support']\n },\n {\n name: 'Business',\n description: 'For larger orgs & governance.',\n priceMonthly: 79,\n priceAnnual: 759,\n highlight: false,\n ctaLabel: 'Talk to sales',\n ctaHref: '/contact',\n features: ['SSO ready', 'Permissions', 'Audit trail', 'Dedicated success']\n }\n ]\n }\n };\n}\n\nfunction createReactVideoPlayerBrick(): WebsiteBrick {\n return {\n id: uuidv4(),\n name: 'Video Feature (React)',\n runtime: 'react',\n templateHtml: `\n<section class=\"rounded-2xl border border-dashed border-slate-200 bg-white p-6 text-sm text-slate-500\">\n This is a React brick. Edit it in the Component tab.\n</section>\n `.trim(),\n reactComponentJs: `\nconst { useEffect, useMemo, useRef, useState } = React;\n\nfunction formatTime(seconds) {\n const value = Number(seconds) || 0;\n const mins = Math.floor(value / 60);\n const secs = Math.floor(value % 60);\n return mins + ':' + String(secs).padStart(2, '0');\n}\n\nfunction Brick(props) {\n const title = typeof props.title === 'string' ? props.title : 'See the designer in action';\n const description = typeof props.description === 'string' ? props.description : 'A quick walkthrough of crafting sections, editing content, and publishing fast.';\n const durationLabel = typeof props.duration === 'string' ? props.duration : '';\n const posterUrl = typeof props.posterUrl === 'string' ? props.posterUrl : '';\n const videoUrl = typeof props.videoUrl === 'string' ? props.videoUrl : '';\n const muted = props.muted !== false;\n const loop = props.loop === true;\n\n const videoRef = useRef(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [hasError, setHasError] = useState(false);\n const [metrics, setMetrics] = useState({ current: 0, duration: 0 });\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n video.muted = muted;\n video.loop = loop;\n }, [muted, loop]);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const sync = () => {\n setMetrics({ current: Number(video.currentTime) || 0, duration: Number(video.duration) || 0 });\n };\n const onPlay = () => setIsPlaying(true);\n const onPause = () => setIsPlaying(false);\n const onError = () => setHasError(true);\n\n video.addEventListener('timeupdate', sync);\n video.addEventListener('loadedmetadata', sync);\n video.addEventListener('play', onPlay);\n video.addEventListener('pause', onPause);\n video.addEventListener('error', onError);\n\n sync();\n\n return () => {\n video.removeEventListener('timeupdate', sync);\n video.removeEventListener('loadedmetadata', sync);\n video.removeEventListener('play', onPlay);\n video.removeEventListener('pause', onPause);\n video.removeEventListener('error', onError);\n };\n }, []);\n\n const percent = useMemo(() => {\n if (!metrics.duration) return 0;\n return Math.min(100, Math.max(0, (metrics.current / metrics.duration) * 100));\n }, [metrics.current, metrics.duration]);\n\n const togglePlay = async (event) => {\n if (event) event.stopPropagation();\n const video = videoRef.current;\n if (!video) return;\n try {\n if (video.paused) {\n await video.play();\n } else {\n video.pause();\n }\n } catch {\n setHasError(true);\n }\n };\n\n const seek = (event) => {\n event.stopPropagation();\n const video = videoRef.current;\n if (!video) return;\n const next = Number(event.target.value) || 0;\n video.currentTime = next;\n };\n\n return (\n <section className=\"rounded-2xl border border-slate-200 bg-white shadow-card\">\n <div className=\"grid gap-6 lg:grid-cols-2\">\n <div className=\"px-6 pt-6 pb-2\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Studio Reel</div>\n <h2 className=\"mt-2 text-2xl font-semibold text-ink-900\" data-fd-bind=\"title\" data-fd-type=\"text\">\n {title}\n </h2>\n <p className=\"mt-3 text-sm text-slate-500\" data-fd-bind=\"description\" data-fd-type=\"text\">\n {description}\n </p>\n <div className=\"mt-4 flex items-center gap-3\">\n <a\n className=\"inline-flex items-center rounded-md bg-accent-600 px-4 py-2 text-xs font-semibold text-white shadow-sm hover:bg-accent-700\"\n href={(props.cta && props.cta.href) || '/demo'}\n onMouseDown={event => event.stopPropagation()}\n >\n {(props.cta && props.cta.label) || 'Watch full demo'}\n </a>\n {durationLabel ? <span className=\"text-xs text-slate-400\">{durationLabel}</span> : null}\n </div>\n </div>\n\n <div className=\"relative px-6 pb-6 lg:px-0 lg:pr-6\">\n <div className=\"relative overflow-hidden rounded-xl bg-slate-900\">\n {posterUrl ? (\n <img\n className={'absolute inset-0 h-full w-full object-cover transition-opacity duration-300 ' + (isPlaying ? 'opacity-0' : 'opacity-100')}\n src={posterUrl}\n alt=\"Video poster\"\n draggable={false}\n />\n ) : null}\n <div className=\"absolute inset-0 bg-gradient-to-tr from-slate-900/40 via-slate-900/10 to-transparent\"></div>\n\n <video ref={videoRef} className=\"relative z-10 h-full w-full\" src={videoUrl} playsInline />\n\n <div className=\"absolute bottom-3 left-3 right-3 z-20 rounded-xl border border-white/10 bg-slate-950/50 p-3 text-white backdrop-blur\">\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full bg-white/10 hover:bg-white/20\"\n onClick={togglePlay}\n onMouseDown={event => event.stopPropagation()}\n aria-label={isPlaying ? 'Pause video' : 'Play video'}\n >\n {isPlaying ? (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"currentColor\">\n <path d=\"M6 5h4v14H6zM14 5h4v14h-4z\" />\n </svg>\n ) : (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"currentColor\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n )}\n </button>\n <div className=\"flex-1\">\n <input\n type=\"range\"\n min={0}\n max={metrics.duration || 0}\n step=\"0.1\"\n value={metrics.current}\n onChange={seek}\n onMouseDown={event => event.stopPropagation()}\n className=\"w-full accent-accent-500\"\n />\n <div className=\"mt-1 flex items-center justify-between text-[11px] text-white/70\">\n <span>{formatTime(metrics.current)}</span>\n <span>{formatTime(metrics.duration)}</span>\n </div>\n </div>\n </div>\n\n <div className=\"pointer-events-none mt-2 h-1 w-full overflow-hidden rounded-full bg-white/10\">\n <div className=\"h-full rounded-full bg-accent-500\" style={{ width: percent + '%' }}></div>\n </div>\n\n {hasError ? (\n <div className=\"mt-2 text-[11px] text-rose-200\">Video failed to play. Check the URL.</div>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"hidden bg-accent-600 bg-accent-700 opacity-0 opacity-100 bg-slate-950\"></div>\n </section>\n );\n}\n\nreturn Brick;\n `.trim(),\n propsSchema: {\n type: 'object',\n properties: {\n title: { type: 'string' },\n description: { type: 'string' },\n duration: { type: 'string' },\n videoUrl: { type: 'string' },\n posterUrl: { type: 'string' },\n muted: { type: 'boolean' },\n loop: { type: 'boolean' },\n cta: {\n type: 'object',\n properties: {\n label: { type: 'string' },\n href: { type: 'string' }\n }\n }\n }\n },\n defaultProps: {\n title: 'See the designer in action',\n description: 'A quick walkthrough of crafting sections, editing content, and publishing fast.',\n duration: '2:45',\n videoUrl: 'https://www.w3schools.com/html/mov_bbb.mp4',\n posterUrl: 'https://images.unsplash.com/photo-1519389950473-47ba0277781c?auto=format&fit=crop&w=1400&q=80',\n muted: true,\n loop: false,\n cta: {\n label: 'Watch full demo',\n href: '/demo'\n }\n }\n };\n}\n\nfunction createReactStockTickerBrick(): WebsiteBrick {\n return {\n id: uuidv4(),\n name: 'Stock Ticker (React)',\n runtime: 'react',\n templateHtml: `\n<section class=\"rounded-2xl border border-dashed border-slate-200 bg-white p-6 text-sm text-slate-500\">\n This is a React brick. Edit it in the Component tab.\n</section>\n `.trim(),\n reactComponentJs: `\nconst { useEffect, useMemo, useState } = React;\n\nfunction formatPrice(value) {\n const numberValue = Number(value) || 0;\n return numberValue.toFixed(2);\n}\n\nfunction formatChange(value) {\n const numberValue = Number(value) || 0;\n const sign = numberValue >= 0 ? '+' : '';\n return sign + numberValue.toFixed(2) + '%';\n}\n\nfunction sparklinePoints(series, width, height, padding) {\n const points = Array.isArray(series) ? series.map(Number).filter(Number.isFinite) : [];\n if (points.length < 2) return '';\n const min = Math.min.apply(null, points);\n const max = Math.max.apply(null, points);\n const range = max - min || 1;\n return points\n .map((value, index) => {\n const x = padding + (index * (width - padding * 2)) / (points.length - 1);\n const y = padding + ((max - value) * (height - padding * 2)) / range;\n return x.toFixed(1) + ',' + y.toFixed(1);\n })\n .join(' ');\n}\n\nfunction normalizeStocks(raw) {\n if (!Array.isArray(raw)) return [];\n return raw.map(stock => ({\n symbol: stock?.symbol || '',\n name: stock?.name || '',\n price: Number(stock?.price) || 0,\n change: Number(stock?.change) || 0,\n series: Array.isArray(stock?.series) ? stock.series : []\n }));\n}\n\nfunction Brick(props) {\n const title = typeof props.title === 'string' ? props.title : 'Realtime watchlist';\n const asOf = typeof props.asOf === 'string' ? props.asOf : 'Updated just now';\n const simulate = props.simulate !== false;\n const refreshMs = Math.max(800, Number(props.refreshMs) || 2500);\n\n const baseStocks = useMemo(() => normalizeStocks(props.stocks), [props.stocks]);\n const [stocks, setStocks] = useState(() => baseStocks);\n\n useEffect(() => setStocks(baseStocks), [baseStocks]);\n\n useEffect(() => {\n if (!simulate || !stocks.length) return;\n const handle = setInterval(() => {\n setStocks(current =>\n current.map(item => {\n const delta = (Math.random() - 0.5) * 0.8;\n const nextPrice = Math.max(0, item.price + delta);\n const nextChange = item.change + delta;\n const nextSeries = Array.isArray(item.series) && item.series.length\n ? item.series.slice(1).concat([nextPrice])\n : [item.price, nextPrice];\n return { ...item, price: nextPrice, change: nextChange, series: nextSeries };\n })\n );\n }, refreshMs);\n return () => clearInterval(handle);\n }, [simulate, refreshMs, stocks.length]);\n\n return (\n <section className=\"rounded-2xl border border-slate-200 bg-white p-6 shadow-card\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <div className=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Markets</div>\n <div className=\"mt-1 text-xl font-semibold text-ink-900\" data-fd-bind=\"title\" data-fd-type=\"text\">\n {title}\n </div>\n <div className=\"text-xs text-slate-500\" data-fd-bind=\"asOf\" data-fd-type=\"text\">\n {asOf}\n </div>\n </div>\n <div className=\"rounded-full bg-slate-100 px-3 py-1 text-xs text-slate-500\">\n {simulate ? 'Simulated' : 'Static'}\n </div>\n </div>\n\n <div className=\"mt-5 space-y-3\">\n {stocks.map((stock, index) => {\n const positive = stock.change >= 0;\n const stroke = positive ? '#10b981' : '#f43f5e';\n const points = sparklinePoints(stock.series, 92, 26, 2);\n return (\n <div key={stock.symbol + index} className=\"flex items-center justify-between gap-4 rounded-xl border border-slate-100 bg-slate-50 px-4 py-3\">\n <div>\n <div className=\"text-sm font-semibold text-ink-900\">{stock.symbol}</div>\n <div className=\"text-[11px] text-slate-500\">{stock.name}</div>\n </div>\n <div className=\"flex items-center gap-4\">\n <svg width=\"92\" height=\"26\" viewBox=\"0 0 92 26\" className=\"hidden sm:block\">\n <polyline fill=\"none\" stroke={stroke} strokeWidth=\"2\" strokeLinejoin=\"round\" strokeLinecap=\"round\" points={points} />\n </svg>\n <div className=\"text-right\">\n <div className=\"text-sm font-semibold text-ink-900\">$ {formatPrice(stock.price)}</div>\n <div className={'text-xs font-semibold ' + (positive ? 'text-emerald-600' : 'text-rose-600')}>\n {formatChange(stock.change)}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n <div className=\"hidden text-emerald-600 text-rose-600 bg-slate-50\"></div>\n </section>\n );\n}\n\nreturn Brick;\n `.trim(),\n propsSchema: {\n type: 'object',\n properties: {\n title: { type: 'string' },\n asOf: { type: 'string' },\n simulate: { type: 'boolean' },\n refreshMs: { type: 'number' },\n stocks: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n symbol: { type: 'string' },\n name: { type: 'string' },\n price: { type: 'number' },\n change: { type: 'number' },\n series: { type: 'array', items: { type: 'number' } }\n }\n }\n }\n }\n },\n defaultProps: {\n title: 'Realtime watchlist',\n asOf: 'Updated 09:30 AM',\n simulate: true,\n refreshMs: 2500,\n stocks: [\n { symbol: 'AAPL', name: 'Apple Inc.', price: 189.32, change: 1.2, series: [186.5, 187.9, 188.4, 188.9, 189.32] },\n { symbol: 'TSLA', name: 'Tesla', price: 248.11, change: -0.6, series: [252.4, 251.2, 250.1, 248.9, 248.11] },\n { symbol: 'NVDA', name: 'NVIDIA', price: 901.44, change: 2.1, series: [880.2, 887.5, 892.1, 898.3, 901.44] }\n ]\n }\n };\n}\n\nfunction createReactCalendarBrick(): WebsiteBrick {\n return {\n id: uuidv4(),\n name: 'Calendar Planner (React)',\n runtime: 'react',\n templateHtml: `\n<section class=\"rounded-2xl border border-dashed border-slate-200 bg-white p-6 text-sm text-slate-500\">\n This is a React brick. Edit it in the Component tab.\n</section>\n `.trim(),\n reactComponentJs: `\nconst { useMemo, useState } = React;\n\nfunction monthName(month) {\n const names = ['January','February','March','April','May','June','July','August','September','October','November','December'];\n const index = Number(month) - 1;\n return names[index] || 'Month';\n}\n\nfunction normalizeEvents(raw) {\n if (!Array.isArray(raw)) return [];\n return raw\n .map(item => ({\n day: Number(item?.day) || 0,\n title: item?.title || '',\n time: item?.time || '',\n note: item?.note || ''\n }))\n .filter(item => item.day > 0);\n}\n\nfunction Brick(props) {\n const today = new Date();\n const month = Number(props.month) || today.getMonth() + 1;\n const year = Number(props.year) || today.getFullYear();\n const label = typeof props.monthLabel === 'string' ? props.monthLabel : monthName(month);\n const timezone = typeof props.timezone === 'string' ? props.timezone : 'Local';\n const showToday = props.showToday !== false;\n const highlightSet = useMemo(() => {\n const values = Array.isArray(props.highlightedDays) ? props.highlightedDays : [];\n return new Set(values.map(value => Number(value)));\n }, [props.highlightedDays]);\n\n const firstDay = useMemo(() => new Date(year, month - 1, 1).getDay(), [year, month]);\n const daysInMonth = useMemo(() => new Date(year, month, 0).getDate(), [year, month]);\n const events = useMemo(() => normalizeEvents(props.events), [props.events]);\n const [selectedDay, setSelectedDay] = useState(() => {\n const initial = Number(props.selectedDay) || today.getDate();\n return Math.min(Math.max(1, initial), daysInMonth);\n });\n\n const days = useMemo(() => {\n const items = [];\n for (let i = 0; i < firstDay; i += 1) items.push(null);\n for (let day = 1; day <= daysInMonth; day += 1) items.push(day);\n return items;\n }, [firstDay, daysInMonth]);\n\n const selectedEvents = useMemo(\n () => events.filter(item => item.day === selectedDay),\n [events, selectedDay]\n );\n\n const isToday = (day) => {\n return (\n showToday &&\n day === today.getDate() &&\n month === today.getMonth() + 1 &&\n year === today.getFullYear()\n );\n };\n\n return (\n <section className=\"rounded-2xl border border-slate-200 bg-white p-6 shadow-card\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <div className=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Calendar</div>\n <div className=\"mt-1 text-xl font-semibold text-ink-900\" data-fd-bind=\"monthLabel\" data-fd-type=\"text\">\n {label}\n </div>\n <div className=\"text-xs text-slate-500\" data-fd-bind=\"year\" data-fd-type=\"text\">\n {String(year)}\n </div>\n </div>\n <div className=\"rounded-full bg-slate-100 px-3 py-1 text-xs text-slate-500\" data-fd-bind=\"timezone\" data-fd-type=\"text\">\n {timezone}\n </div>\n </div>\n\n <div className=\"mt-5 grid grid-cols-7 gap-2 text-[10px] font-semibold uppercase tracking-wide text-slate-400\">\n <div>Sun</div><div>Mon</div><div>Tue</div><div>Wed</div><div>Thu</div><div>Fri</div><div>Sat</div>\n </div>\n\n <div className=\"mt-3 grid grid-cols-7 gap-2\">\n {days.map((day, index) => {\n if (!day) return <div key={'spacer-' + index} />;\n\n const isSelected = day === selectedDay;\n const isHighlighted = highlightSet.has(day);\n\n const base =\n 'flex h-9 w-9 items-center justify-center rounded-full text-xs font-medium transition ' +\n (isSelected ? 'bg-accent-600 text-white shadow-sm' : 'text-ink-700 hover:bg-slate-100') +\n (isHighlighted && !isSelected ? ' bg-accent-100 text-accent-700' : '') +\n (isToday(day) && !isSelected ? ' ring-1 ring-accent-200' : '');\n\n return (\n <button\n key={day}\n type=\"button\"\n className={base}\n onClick={(event) => {\n event.stopPropagation();\n setSelectedDay(day);\n }}\n onMouseDown={event => event.stopPropagation()}\n aria-label={'Select day ' + day}\n >\n {day}\n </button>\n );\n })}\n </div>\n\n <div className=\"mt-6 border-t border-slate-100 pt-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-slate-400\">Agenda</div>\n <div className=\"text-[11px] text-slate-400\">Day {selectedDay}</div>\n </div>\n <div className=\"mt-3 space-y-3\">\n {selectedEvents.length ? (\n selectedEvents.map((eventItem, index) => (\n <div key={index} className=\"flex items-start gap-3\">\n <div className=\"mt-1 h-2.5 w-2.5 rounded-full bg-accent-500\"></div>\n <div>\n <div className=\"text-sm font-medium text-ink-900\">{eventItem.title}</div>\n <div className=\"text-xs text-slate-500\">{eventItem.time}</div>\n {eventItem.note ? <div className=\"text-[11px] text-slate-400\">{eventItem.note}</div> : null}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-xs text-slate-400\">No events for this day.</div>\n )}\n </div>\n </div>\n\n <div className=\"hidden bg-accent-600 bg-accent-100 text-accent-700 ring-1 ring-accent-200\"></div>\n </section>\n );\n}\n\nreturn Brick;\n `.trim(),\n propsSchema: {\n type: 'object',\n properties: {\n monthLabel: { type: 'string' },\n month: { type: 'number' },\n year: { type: 'number' },\n timezone: { type: 'string' },\n showToday: { type: 'boolean' },\n selectedDay: { type: 'number' },\n highlightedDays: { type: 'array', items: { type: 'number' } },\n events: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n day: { type: 'number' },\n title: { type: 'string' },\n time: { type: 'string' },\n note: { type: 'string' }\n }\n }\n }\n }\n },\n defaultProps: {\n monthLabel: 'October',\n month: 10,\n year: 2025,\n timezone: 'PST',\n showToday: true,\n selectedDay: 12,\n highlightedDays: [3, 7, 12, 21],\n events: [\n { day: 12, title: 'Design sync', time: '10:00 AM', note: 'Review new bricks & spacing scale.' },\n { day: 12, title: 'Ship preview', time: '2:00 PM', note: 'Walk through the router-based site preview.' },\n { day: 21, title: 'Content refresh', time: '11:30 AM', note: 'Update hero copy and pricing cards.' }\n ]\n }\n };\n}\n\nexport function createWebsiteBrick(opts?: {\n id?: string;\n name?: string;\n runtime?: 'dom' | 'react';\n templateHtml?: string;\n scriptJs?: string;\n reactComponentJs?: string;\n propsSchema?: Record<string, unknown>;\n defaultProps?: Record<string, unknown>;\n}): WebsiteBrick {\n const runtime = opts?.runtime ?? 'dom';\n return {\n id: opts?.id ?? uuidv4(),\n name: opts?.name ?? 'New Brick',\n runtime,\n templateHtml: opts?.templateHtml ?? `\n<section class=\"rounded-lg border border-dashed border-slate-200 bg-white p-6 text-left\">\n <h2 class=\"text-xl font-semibold text-ink-900\"\n data-fd-bind=\"title\"\n data-fd-type=\"text\">New Brick</h2>\n <p class=\"mt-2 text-sm text-ink-600\"\n data-fd-bind=\"body\"\n data-fd-type=\"text\">Edit this brick in the inspector.</p>\n</section>\n `.trim(),\n scriptJs: opts?.scriptJs ?? '',\n reactComponentJs: opts?.reactComponentJs ?? (runtime === 'react'\n ? `\nfunction Brick(props) {\n return (\n <section className=\"rounded-lg border border-dashed border-slate-200 bg-white p-6 text-left\">\n <h2 className=\"text-xl font-semibold text-ink-900\">{props.title || 'React Brick'}</h2>\n <p className=\"mt-2 text-sm text-ink-600\">{props.body || 'Edit this brick in Brick Studio.'}</p>\n </section>\n );\n}\n\nreturn Brick;\n `.trim()\n : undefined),\n propsSchema: opts?.propsSchema ?? {\n type: 'object',\n properties: {\n title: { type: 'string' },\n body: { type: 'string' }\n }\n },\n defaultProps: opts?.defaultProps ?? {\n title: 'New Brick',\n body: 'Edit this brick in the inspector.'\n }\n };\n}\n","import { Injectable, computed, signal, effect } from '@angular/core';\nimport { createEmptySchema } from '../form-core/schema-factory';\nimport type { DesignerFlavor, FormSchema } from '../form-core/models';\nimport { createDefaultWebsiteBricks, createDefaultWebsiteTheme, createWebsitePage, createWebsiteProject } from './website-project.models';\nimport type {\n WebsitePage,\n WebsiteProject,\n WebsiteSection,\n WebsiteTokens,\n WebsiteBrick,\n WebsiteTheme\n} from './website-project.models';\n\n@Injectable({ providedIn: 'root' })\nexport class WebsiteProjectService {\n private static readonly STORAGE_KEY = 'ngx-form-designer:website-project';\n\n private readonly projectSignal = signal<WebsiteProject>(createWebsiteProject());\n readonly project = computed(() => this.projectSignal());\n readonly pages = computed(() => this.projectSignal().pages);\n readonly sections = computed(() => this.projectSignal().sections ?? []);\n readonly bricks = computed(() => this.projectSignal().bricks ?? []);\n readonly themes = computed(() => this.projectSignal().themes ?? []);\n readonly activeThemeId = computed(() => this.projectSignal().activeThemeId ?? this.themes()[0]?.id ?? 'default');\n readonly tokens = computed(() => this.projectSignal().tokens ?? {});\n readonly activePageId = signal<string>(this.projectSignal().pages[0]?.id ?? '');\n readonly activePage = computed(() => this.pages().find(page => page.id === this.activePageId()) ?? null);\n readonly canRemovePage = computed(() => this.pages().length > 1);\n\n constructor() {\n const stored = this.loadFromStorage();\n if (stored) {\n const normalized = this.normalizeProject(stored);\n this.projectSignal.set(normalized);\n this.activePageId.set(normalized.pages[0]?.id ?? '');\n }\n\n effect(() => {\n if (!this.canUseStorage()) return;\n try {\n localStorage.setItem(\n WebsiteProjectService.STORAGE_KEY,\n JSON.stringify(this.projectSignal())\n );\n } catch (error) {\n console.warn('[ngx-form-designer] Unable to persist website project', error);\n }\n });\n }\n\n setProject(project: WebsiteProject) {\n const normalized = this.normalizeProject(project);\n this.projectSignal.set(normalized);\n this.activePageId.set(normalized.pages[0]?.id ?? '');\n }\n\n getPageById(id: string): WebsitePage | undefined {\n return this.projectSignal().pages.find(page => page.id === id);\n }\n\n setActivePage(id: string) {\n if (this.projectSignal().pages.some(page => page.id === id)) {\n this.activePageId.set(id);\n }\n }\n\n addPage(): WebsitePage {\n const name = this.nextPageName();\n const route = this.ensureUniqueRoute(this.buildRouteFromName(name));\n const page = createWebsitePage({\n name,\n route,\n schema: createEmptySchema('web', { title: name })\n });\n\n this.projectSignal.set({\n ...this.projectSignal(),\n pages: [...this.projectSignal().pages, page]\n });\n\n return page;\n }\n\n removePage(id: string) {\n if (!this.canRemovePage()) return;\n\n const project = this.projectSignal();\n const pages = project.pages.filter(page => page.id !== id);\n if (pages.length === project.pages.length) return;\n\n this.projectSignal.set({ ...project, pages });\n\n if (this.activePageId() === id) {\n this.activePageId.set(pages[0]?.id ?? '');\n }\n }\n\n renamePage(id: string, name: string) {\n const project = this.projectSignal();\n const pages = project.pages.map(page => {\n if (page.id !== id) return page;\n return {\n ...page,\n name,\n schema: { ...page.schema, title: name }\n };\n });\n this.projectSignal.set({ ...project, pages });\n }\n\n updateRoute(id: string, route: string) {\n const project = this.projectSignal();\n const normalized = this.ensureUniqueRoute(this.normalizeRoute(route), id);\n const pages = project.pages.map(page => {\n const nextPage = page.id === id ? { ...page, route: normalized } : page;\n const nextSchema = this.updateSchemaLinkRoutes(nextPage.schema, id, normalized);\n return nextSchema === nextPage.schema ? nextPage : { ...nextPage, schema: nextSchema };\n });\n this.projectSignal.set({ ...project, pages });\n }\n\n updateActivePageSchema(schema: FormSchema) {\n const activeId = this.activePageId();\n if (!activeId) return;\n this.updatePageSchema(activeId, schema);\n }\n\n updatePageSchema(id: string, schema: FormSchema) {\n const normalizedSchema = this.normalizeSchema(schema);\n const project = this.projectSignal();\n const pages = project.pages.map(page => page.id === id ? { ...page, schema: normalizedSchema } : page);\n this.projectSignal.set({ ...project, pages });\n }\n\n addSection(section: WebsiteSection) {\n const project = this.projectSignal();\n const sections = [...(project.sections ?? []), section];\n this.projectSignal.set({ ...project, sections });\n }\n\n removeSection(id: string) {\n const project = this.projectSignal();\n const sections = (project.sections ?? []).filter(section => section.id !== id);\n this.projectSignal.set({ ...project, sections });\n }\n\n updateSection(section: WebsiteSection) {\n const project = this.projectSignal();\n const sections = (project.sections ?? []).map(existing =>\n existing.id === section.id ? section : existing\n );\n this.projectSignal.set({ ...project, sections });\n }\n\n updateTokens(tokens: WebsiteTokens) {\n const project = this.projectSignal();\n this.projectSignal.set({ ...project, tokens });\n }\n\n addBrick(brick: WebsiteBrick) {\n const project = this.projectSignal();\n const bricks = [...(project.bricks ?? []), brick];\n this.projectSignal.set({ ...project, bricks });\n }\n\n updateBrick(brick: WebsiteBrick) {\n const project = this.projectSignal();\n const bricks = (project.bricks ?? []).map(existing => existing.id === brick.id ? brick : existing);\n this.projectSignal.set({ ...project, bricks });\n }\n\n removeBrick(id: string) {\n const project = this.projectSignal();\n const bricks = (project.bricks ?? []).filter(brick => brick.id !== id);\n this.projectSignal.set({ ...project, bricks });\n }\n\n setActiveTheme(id: string) {\n const project = this.projectSignal();\n if (!(project.themes ?? []).some(theme => theme.id === id)) return;\n this.projectSignal.set({ ...project, activeThemeId: id });\n }\n\n updateTheme(theme: WebsiteTheme) {\n const project = this.projectSignal();\n const themes = (project.themes ?? []).map(existing => existing.id === theme.id ? theme : existing);\n this.projectSignal.set({ ...project, themes });\n }\n\n setThemes(themes: WebsiteTheme[]) {\n const nextThemes = themes.length ? themes : [createDefaultWebsiteTheme()];\n const project = this.projectSignal();\n const activeThemeId = nextThemes.some(theme => theme.id === project.activeThemeId)\n ? project.activeThemeId\n : nextThemes[0]?.id ?? 'default';\n this.projectSignal.set({ ...project, themes: nextThemes, activeThemeId });\n }\n\n persistNow() {\n if (!this.canUseStorage()) return;\n try {\n localStorage.setItem(\n WebsiteProjectService.STORAGE_KEY,\n JSON.stringify(this.projectSignal())\n );\n } catch (error) {\n console.warn('[ngx-form-designer] Unable to persist website project', error);\n }\n }\n\n private normalizeProject(project: WebsiteProject): WebsiteProject {\n const pages = project.pages?.length ? project.pages : [createWebsitePage({ name: 'Home', route: '/' })];\n const legacySections = (project as { components?: WebsiteSection[] }).components ?? [];\n\n const themes = project.themes?.length ? project.themes : [createDefaultWebsiteTheme()];\n const activeThemeId = themes.some(theme => theme.id === project.activeThemeId)\n ? project.activeThemeId\n : themes[0]?.id ?? 'default';\n\n const existingBricks = project.bricks ?? [];\n const defaultBricks = createDefaultWebsiteBricks();\n const bricks = existingBricks.length\n ? [\n ...existingBricks,\n ...defaultBricks.filter(brick => !existingBricks.some(existing => existing.name === brick.name))\n ]\n : defaultBricks;\n\n return {\n id: project.id || createWebsiteProject().id,\n name: project.name || 'New Website',\n pages: pages.map(page => {\n const rawName = typeof page.name === 'string' ? page.name.trim() : '';\n const name = rawName || 'Page';\n const rawRoute = typeof page.route === 'string' ? page.route : this.buildRouteFromName(name);\n const route = this.normalizeRoute(rawRoute);\n const schema = page.schema && typeof page.schema === 'object' && 'layout' in page.schema\n ? page.schema\n : createEmptySchema('web', { title: name });\n const normalizedPage = createWebsitePage({\n id: page.id,\n name,\n route,\n schema\n });\n\n return {\n ...normalizedPage,\n schema: this.normalizeSchema(normalizedPage.schema, normalizedPage.name)\n };\n }),\n sections: project.sections ?? legacySections,\n bricks,\n themes,\n activeThemeId,\n tokens: project.tokens ?? {},\n metadata: project.metadata ?? {}\n };\n }\n\n private nextPageName(): string {\n const base = 'Page';\n const existing = new Set(this.pages().map(page => page.name));\n if (!existing.has('Home')) return 'Home';\n\n let index = 2;\n while (existing.has(`${base} ${index}`)) {\n index += 1;\n }\n return `${base} ${index}`;\n }\n\n private buildRouteFromName(name: string): string {\n const slug = this.slugify(name);\n if (!slug || slug === 'home') return '/';\n return `/${slug}`;\n }\n\n private ensureUniqueRoute(route: string, excludeId?: string): string {\n const normalized = route === '/' ? '/home' : route;\n const existing = new Set(\n this.projectSignal()\n .pages\n .filter(page => page.id !== excludeId)\n .map(page => page.route === '/' ? '/home' : page.route)\n );\n\n if (!existing.has(normalized)) {\n return route === '/' ? '/' : normalized;\n }\n\n let counter = 2;\n let candidate = `${normalized}-${counter}`;\n while (existing.has(candidate)) {\n counter += 1;\n candidate = `${normalized}-${counter}`;\n }\n return candidate;\n }\n\n private normalizeRoute(route: string): string {\n const trimmed = route.trim().toLowerCase();\n if (!trimmed) return '/';\n const cleaned = trimmed.replace(/[^a-z0-9/_-]+/g, '-').replace(/-+/g, '-');\n const withSlash = cleaned.startsWith('/') ? cleaned : `/${cleaned}`;\n const normalized = withSlash.replace(/\\/+/g, '/');\n if (normalized === '/') return '/';\n return normalized.replace(/\\/$/, '');\n }\n\n private updateSchemaLinkRoutes(schema: FormSchema, pageId: string, route: string): FormSchema {\n let updated = false;\n const fields = schema.fields.map(field => {\n if (field.type !== 'cta-button') return field;\n const linkType = (field as { linkType?: string; pageId?: string; href?: string }).linkType\n ?? ((field as { pageId?: string }).pageId ? 'page' : ((field as { href?: string }).href ? 'url' : 'none'));\n if (linkType !== 'page') return field;\n if ((field as { pageId?: string }).pageId !== pageId) return field;\n if ((field as { href?: string }).href === route) return field;\n updated = true;\n return { ...field, href: route };\n });\n\n return updated ? { ...schema, fields } : schema;\n }\n\n private slugify(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n }\n\n private normalizeSchema(schema: FormSchema, title?: string): FormSchema {\n const flavor: DesignerFlavor = 'web';\n return {\n ...schema,\n flavor,\n title: schema.title ?? title\n };\n }\n\n private canUseStorage(): boolean {\n return typeof window !== 'undefined' && typeof localStorage !== 'undefined';\n }\n\n private loadFromStorage(): WebsiteProject | null {\n if (!this.canUseStorage()) return null;\n try {\n const raw = localStorage.getItem(WebsiteProjectService.STORAGE_KEY);\n if (!raw) return null;\n return JSON.parse(raw) as WebsiteProject;\n } catch (error) {\n console.warn('[ngx-form-designer] Failed to read website project from storage', error);\n return null;\n }\n }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport type { ColumnNode, FieldSchema, FormSchema, RowNode, WidgetKind, WidgetNode } from '../form-core/models';\nimport { buildWidgetId } from '../widgets/widget-definition';\nimport type { DesignerSectionDefinition, DesignerSectionDraft } from '../plugins/section-definition';\n\nexport type WebsiteSectionDefinition = DesignerSectionDefinition;\nexport type WebsiteSectionDraft = DesignerSectionDraft;\n\nconst CORE_WEB_PLUGIN_ID = 'core.web';\n\nexport const DEFAULT_WEBSITE_SECTIONS: WebsiteSectionDefinition[] = [\n {\n id: 'hero-centered',\n name: 'Hero (Centered)',\n description: 'Headline, supporting text, and a primary CTA.',\n category: 'Hero',\n tags: ['hero', 'cta', 'intro'],\n flavor: 'web',\n build: () => {\n const heading = createHeading('Build beautiful websites faster', 'h1');\n const paragraph = createParagraph('Launch a crisp, responsive site in minutes. Let AI handle the heavy lifting, then tweak with precision.');\n const button = createButton('Get started', 'primary');\n\n const col = createColumn({ xs: 12 }, [heading.node, paragraph.node, button.node], { textAlign: 'center' });\n const row = createRow([col], { padding: 'lg', marginBottom: 'lg' });\n\n return {\n fields: [heading.field, paragraph.field, button.field],\n layout: row\n };\n }\n },\n {\n id: 'feature-grid-3',\n name: 'Features (3-up)',\n description: 'Three-column feature grid with headings and copy.',\n category: 'Features',\n tags: ['features', 'grid', 'marketing'],\n flavor: 'web',\n build: () => {\n const feature1 = createFeatureBlock('Lightning fast', 'Ship production-ready layouts in minutes.');\n const feature2 = createFeatureBlock('Precise control', 'Tweak every detail without fighting the layout.');\n const feature3 = createFeatureBlock('AI-native', 'Generate, edit, and refine with smart assistance.');\n\n const row = createRow(\n [\n createColumn({ xs: 12, md: 4 }, [feature1.heading.node, feature1.paragraph.node]),\n createColumn({ xs: 12, md: 4 }, [feature2.heading.node, feature2.paragraph.node]),\n createColumn({ xs: 12, md: 4 }, [feature3.heading.node, feature3.paragraph.node])\n ],\n { gap: 'lg', marginBottom: 'lg' }\n );\n\n return {\n fields: [\n feature1.heading.field,\n feature1.paragraph.field,\n feature2.heading.field,\n feature2.paragraph.field,\n feature3.heading.field,\n feature3.paragraph.field\n ],\n layout: row\n };\n }\n }\n];\n\nexport function appendSectionToSchema(schema: FormSchema, section: WebsiteSectionDefinition): FormSchema {\n const draft = section.build();\n const layout = JSON.parse(JSON.stringify(schema.layout));\n\n if (layout.type === 'col') {\n layout.children.push(draft.layout);\n } else {\n layout.children = [...(layout.children || []), draft.layout];\n }\n\n return {\n ...schema,\n fields: [...schema.fields, ...draft.fields],\n layout\n };\n}\n\nfunction createHeading(text: string, level: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6') {\n return createWidget('text', 'heading', {\n label: text,\n level\n });\n}\n\nfunction createParagraph(text: string) {\n return createWidget('text', 'paragraph', {\n text\n });\n}\n\nfunction createButton(label: string, variant: 'primary' | 'secondary') {\n return createWidget('button', 'cta-button', {\n label,\n variant\n });\n}\n\nfunction createFeatureBlock(title: string, description: string) {\n return {\n heading: createHeading(title, 'h3'),\n paragraph: createParagraph(description)\n };\n}\n\nfunction createRow(children: ColumnNode[], style?: RowNode['style']): RowNode {\n return {\n id: uuidv4(),\n type: 'row',\n style,\n children\n };\n}\n\nfunction createColumn(responsive: ColumnNode['responsive'], children: ColumnNode['children'], style?: ColumnNode['style']): ColumnNode {\n return {\n id: uuidv4(),\n type: 'col',\n responsive,\n style,\n children\n };\n}\n\nfunction createWidget(kind: WidgetKind, type: string, extra: Record<string, unknown>) {\n const fieldId = uuidv4();\n const widgetId = buildWidgetId(CORE_WEB_PLUGIN_ID, type);\n const name = createFieldName(type, fieldId);\n\n const field: FieldSchema = {\n id: fieldId,\n widgetId,\n name,\n type: type as FieldSchema['type'],\n ...(extra as Record<string, unknown>)\n };\n\n const node: WidgetNode = {\n id: uuidv4(),\n type: 'widget',\n widgetKind: kind,\n refId: fieldId\n };\n\n return { field, node };\n}\n\nfunction createFieldName(base: string, id: string): string {\n const suffix = id.replace(/-/g, '').slice(0, 8);\n return `${base}_${suffix}`;\n}\n","import { InjectionToken } from '@angular/core';\n\nexport type WidgetPageLink = {\n id: string;\n name: string;\n route: string;\n};\n\nexport type WidgetPageLinkProvider = () => WidgetPageLink[];\n\nexport const WIDGET_PAGE_LINKS = new InjectionToken<WidgetPageLinkProvider>('WIDGET_PAGE_LINKS');\n","import { ChangeDetectionStrategy, Component, OnInit, computed, input, inject, ElementRef, ViewChild, effect, signal, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { Router } from '@angular/router';\nimport { DesignerContext } from '../form-designer/designer-context.service';\nimport { DesignerStateService } from '../form-designer/designer-state.service';\nimport { FieldPaletteComponent } from '../form-designer/field-palette.component';\nimport { LayoutCanvasComponent } from '../form-designer/layout-canvas.component';\nimport { PropertiesPanelComponent } from '../form-designer/properties-panel.component';\nimport { FormPreviewComponent } from '../form-designer/form-preview.component';\nimport { UiIconModule } from '../ui/ui-icon.module';\nimport type { FormSchema } from '../form-core/models';\nimport type { WebsiteProject } from './website-project.models';\nimport { WebsiteProjectService } from './website-project.service';\nimport { DEFAULT_WEBSITE_SECTIONS, appendSectionToSchema } from './website-section-library';\nimport { DESIGNER_SECTIONS, DesignerSectionDefinition } from '../plugins/section-definition';\nimport { WIDGET_PAGE_LINKS } from '../widgets/page-link-context';\n\n@Component({\n selector: 'app-website-designer-shell',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DragDropModule,\n UiIconModule,\n FieldPaletteComponent,\n LayoutCanvasComponent,\n PropertiesPanelComponent,\n FormPreviewComponent\n ],\n providers: [\n DesignerStateService,\n DesignerContext,\n {\n provide: WIDGET_PAGE_LINKS,\n useFactory: (projectService: WebsiteProjectService) => () =>\n projectService.pages().map(page => ({ id: page.id, name: page.name, route: page.route })),\n deps: [WebsiteProjectService]\n }\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"flex flex-col h-screen bg-white font-sans\">\n <header class=\"h-14 border-b border-gray-200 flex items-center px-4 justify-between bg-white z-20 shadow-sm\">\n <div class=\"flex items-center gap-2\">\n <span class=\"text-sm font-semibold text-gray-800\">Website Designer</span>\n <span class=\"text-xs text-gray-500\">{{ project().name }}</span>\n </div>\n <div class=\"flex items-center gap-2\">\n <button type=\"button\"\n class=\"px-3 py-2 text-xs font-semibold rounded-md border border-gray-200 text-gray-600 hover:text-gray-800 hover:border-gray-300 transition-colors\"\n (click)=\"openBrickStudio()\">\n Bricks Studio\n </button>\n <button type=\"button\"\n class=\"px-3 py-2 text-xs font-semibold rounded-md border border-gray-200 text-gray-600 hover:text-gray-800 hover:border-gray-300 transition-colors\"\n (click)=\"openPreview(true)\">\n Preview\n </button>\n <button type=\"button\"\n class=\"px-3 py-2 text-xs font-semibold rounded-md border border-gray-200 text-gray-600 hover:text-gray-800 hover:border-gray-300 transition-colors\"\n (click)=\"exportProject()\">\n Export\n </button>\n <button type=\"button\"\n class=\"px-3 py-2 text-xs font-semibold rounded-md border border-gray-200 text-gray-600 hover:text-gray-800 hover:border-gray-300 transition-colors\"\n (click)=\"importProject()\">\n Import\n </button>\n <button type=\"button\"\n class=\"px-3 py-2 text-xs font-semibold rounded-md bg-blue-600 text-white hover:bg-blue-700 transition-colors\"\n (click)=\"addPage()\">\n Add Page\n </button>\n </div>\n </header>\n\n <div class=\"flex-1 flex overflow-hidden\" cdkDropListGroup>\n <aside class=\"w-72 bg-white border-r border-gray-200 flex flex-col\">\n <div class=\"flex-1 min-h-0\">\n <app-field-palette\n class=\"h-full\"\n [sectionLibrary]=\"sectionLibraryList()\"\n [savedSections]=\"savedSectionsList()\"\n [bricks]=\"bricks()\"\n [pages]=\"pages()\"\n [activePageId]=\"activePageId()\"\n [canRemovePage]=\"canRemovePage()\"\n (pageAdd)=\"addPage()\"\n (pageSelect)=\"selectPage($event)\"\n (pageRemove)=\"removePage($event)\"\n (pageRename)=\"renamePage($event.id, $event.name)\"\n (pageRouteChange)=\"updateRoute($event.id, $event.route)\"\n (savedSectionCreateRequested)=\"saveSection($event.name)\"\n (savedSectionInsert)=\"insertSavedSection($event)\"\n (savedSectionRemove)=\"removeSavedSection($event)\"\n (sectionInsert)=\"insertSection($event)\">\n </app-field-palette>\n </div>\n </aside>\n\n <main class=\"flex-1 flex overflow-hidden bg-gray-50\">\n <div class=\"flex-1 overflow-hidden relative\">\n <app-layout-canvas\n [previewMode]=\"'route'\"\n (previewRequested)=\"openPreview(true)\">\n </app-layout-canvas>\n </div>\n <div class=\"w-80 flex-shrink-0 bg-white border-l border-gray-200 overflow-y-auto\">\n <app-properties-panel></app-properties-panel>\n </div>\n </main>\n </div>\n\n @if (designerState.isPreviewMode()) {\n <app-form-preview></app-form-preview>\n }\n\n <input type=\"file\" #projectFileInput accept=\".json\" (change)=\"onProjectFileSelected($event)\" class=\"hidden\">\n </div>\n `\n})\nexport class WebsiteDesignerShellComponent implements OnInit {\n readonly initialProject = input<WebsiteProject | null>(null);\n readonly sections = input<DesignerSectionDefinition[] | null>(null);\n\n @ViewChild('projectFileInput') projectFileInput!: ElementRef<HTMLInputElement>;\n\n private readonly projectService = inject(WebsiteProjectService);\n private readonly router = inject(Router);\n protected readonly designerState = inject(DesignerStateService);\n private readonly pluginSections = (inject(DESIGNER_SECTIONS, { optional: true }) as DesignerSectionDefinition[][] | null) ?? [];\n private readonly pluginSectionsFlat = this.pluginSections.flat();\n\n readonly project = this.projectService.project;\n readonly pages = this.projectService.pages;\n readonly savedSections = this.projectService.sections;\n readonly bricks = this.projectService.bricks;\n readonly activePage = this.projectService.activePage;\n readonly activePageId = this.projectService.activePageId;\n readonly canRemovePage = this.projectService.canRemovePage;\n readonly sectionLibraryList = computed(() => {\n const input = this.sections();\n const base = input && input.length > 0\n ? input\n : (this.pluginSectionsFlat.length ? this.pluginSectionsFlat : DEFAULT_WEBSITE_SECTIONS);\n return base.filter(section => !section.flavor || section.flavor === 'web');\n });\n readonly savedSectionsList = computed(() => {\n return this.savedSections().map(section => ({\n id: section.id,\n name: section.name,\n description: 'Saved section'\n }));\n });\n\n private readonly syncEnabled = signal(false);\n private readonly schemaSync = effect(() => {\n if (!this.syncEnabled()) return;\n const schema = this.designerState.schema();\n untracked(() => this.projectService.updateActivePageSchema(schema));\n });\n\n ngOnInit() {\n this.designerState.setFlavor('web');\n const initial = this.initialProject();\n if (initial) {\n this.projectService.setProject(initial);\n }\n this.loadActivePage();\n this.syncEnabled.set(true);\n }\n\n addPage() {\n this.persistActivePage();\n const page = this.projectService.addPage();\n this.projectService.setActivePage(page.id);\n this.loadActivePage();\n }\n\n selectPage(id: string) {\n if (this.activePageId() === id) return;\n this.persistActivePage();\n this.projectService.setActivePage(id);\n this.loadActivePage();\n }\n\n removePage(id: string) {\n if (!this.canRemovePage()) return;\n const target = this.projectService.getPageById(id);\n if (!target) return;\n if (!confirm(`Delete \"${target.name}\"? This cannot be undone.`)) return;\n\n this.persistActivePage();\n this.projectService.removePage(id);\n this.loadActivePage();\n }\n\n renamePage(id: string, name: string) {\n this.projectService.renamePage(id, name);\n\n if (this.activePageId() === id) {\n const current = this.designerState.schema();\n if (current.title !== name) {\n this.designerState.updateSchema({ ...current, title: name });\n }\n }\n }\n\n updateRoute(id: string, route: string) {\n this.projectService.updateRoute(id, route);\n }\n\n openBrickStudio() {\n this.persistActivePage();\n this.router.navigateByUrl('/editor/bricks');\n }\n\n insertSection(section: DesignerSectionDefinition) {\n const nextSchema = appendSectionToSchema(this.designerState.schema(), section);\n this.designerState.updateSchema(nextSchema);\n this.projectService.updateActivePageSchema(nextSchema);\n }\n\n saveSection(name: string) {\n const selection = this.getSelectedRow();\n if (!selection) {\n alert('Select a row/section on the canvas to save as a section.');\n return;\n }\n\n const currentSchema = this.designerState.schema();\n const { fields, layout, sectionId } = this.extractSectionDraft(currentSchema, selection);\n if (fields.length === 0) {\n alert('Selected row has no widgets to save.');\n return;\n }\n\n const sectionSchema: FormSchema = {\n ...currentSchema,\n id: layout.id,\n title: name,\n fields,\n layout\n };\n\n this.projectService.addSection({\n id: sectionId,\n name,\n schema: sectionSchema\n });\n }\n\n insertSavedSection(sectionId: string) {\n const section = this.savedSections().find(item => item.id === sectionId);\n if (!section) return;\n\n const draft = this.materializeSection(section);\n const nextSchema = appendSectionToSchema(this.designerState.schema(), {\n id: section.id,\n name: section.name,\n description: 'Saved section',\n flavor: 'web',\n build: () => draft\n });\n this.designerState.updateSchema(nextSchema);\n this.projectService.updateActivePageSchema(nextSchema);\n }\n\n removeSavedSection(sectionId: string) {\n if (!confirm('Delete this section? This will not remove instances already placed.')) {\n return;\n }\n this.projectService.removeSection(sectionId);\n }\n\n openPreview(openInNewTab = true) {\n this.persistActivePage();\n const route = this.activePage()?.route ?? '/';\n const normalized = route.startsWith('/') ? route : `/${route}`;\n const url = normalized === '/' ? '/' : normalized;\n if (openInNewTab) {\n this.projectService.persistNow();\n window.open(url, '_blank', 'noopener');\n return;\n }\n this.router.navigateByUrl(url);\n }\n\n exportProject() {\n const project = this.projectService.project();\n const json = JSON.stringify(project, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `website-${project.id}.json`;\n a.click();\n window.URL.revokeObjectURL(url);\n }\n\n importProject() {\n this.projectFileInput?.nativeElement.click();\n }\n\n onProjectFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (e) => {\n const text = e.target?.result as string;\n if (!text) return;\n try {\n const parsed = JSON.parse(text) as WebsiteProject;\n if (!confirm('Replace the current project with the imported file?')) {\n return;\n }\n this.projectService.setProject(parsed);\n this.loadActivePage();\n } catch (error) {\n console.error('Invalid project file:', error);\n alert('Invalid project file. Please select a valid website project JSON.');\n }\n };\n reader.readAsText(file);\n input.value = '';\n }\n\n private loadActivePage() {\n const page = this.activePage();\n if (!page) return;\n this.designerState.updateSchema(page.schema);\n }\n\n private persistActivePage() {\n const page = this.activePage();\n if (!page) return;\n this.projectService.updateActivePageSchema(this.designerState.schema());\n }\n\n private getSelectedRow() {\n const selected = this.designerState.selectedNode();\n if (!selected) return null;\n if (selected.type === 'row') return selected;\n\n const index = this.designerState.layoutIndex();\n const entry = index[selected.id];\n if (!entry) return null;\n const path = entry.path.slice().reverse();\n for (const id of path) {\n const node = index[id]?.node;\n if (node?.type === 'row') return node;\n }\n return null;\n }\n\n private extractSectionDraft(schema: FormSchema, root: any) {\n const fieldIds = new Set<string>();\n\n const collectFields = (node: any) => {\n if (node.type === 'widget' && node.refId) {\n fieldIds.add(node.refId);\n }\n if (node.children) {\n node.children.forEach((child: any) => collectFields(child));\n }\n };\n\n collectFields(root);\n\n const fields = schema.fields\n .filter(field => fieldIds.has(field.id))\n .map(field => ({ ...field }));\n\n return {\n fields,\n layout: JSON.parse(JSON.stringify(root)),\n sectionId: crypto.randomUUID ? crypto.randomUUID() : root.id\n };\n }\n\n private materializeSection(section: { schema: FormSchema }) {\n const fieldIdMap = new Map<string, string>();\n const fields = section.schema.fields.map(field => {\n const nextId = this.generateId();\n fieldIdMap.set(field.id, nextId);\n return {\n ...JSON.parse(JSON.stringify(field)),\n id: nextId,\n name: `${field.name}_${Date.now()}`\n };\n });\n\n const cloneNode = (node: any): any => {\n const cloned = { ...JSON.parse(JSON.stringify(node)), id: this.generateId() };\n if (cloned.type === 'widget' && cloned.refId) {\n const nextId = fieldIdMap.get(cloned.refId);\n if (nextId) {\n cloned.refId = nextId;\n }\n }\n if (cloned.children) {\n cloned.children = cloned.children.map((child: any) => cloneNode(child));\n }\n return cloned;\n };\n\n return {\n fields,\n layout: cloneNode(section.schema.layout)\n };\n }\n\n private generateId(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n return Math.random().toString(36).slice(2);\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewChild,\n effect,\n input,\n output,\n signal\n} from '@angular/core';\nimport loader from '@monaco-editor/loader';\n\ntype MonacoDisposable = { dispose: () => void };\ntype MonacoModel = { uri?: unknown };\ntype MonacoEditorInstance = {\n getValue: () => string;\n setValue: (value: string) => void;\n getModel: () => MonacoModel | null;\n onDidChangeModelContent: (listener: () => void) => MonacoDisposable;\n updateOptions: (options: Record<string, unknown>) => void;\n layout: () => void;\n dispose: () => void;\n};\ntype MonacoModule = {\n editor: {\n create: (element: HTMLElement, options: Record<string, unknown>) => MonacoEditorInstance;\n setModelLanguage: (model: MonacoModel, language: string) => void;\n setTheme: (theme: string) => void;\n };\n};\n\n@Component({\n selector: 'app-monaco-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<div class=\"h-full w-full\" #container></div>`,\n host: { class: 'block h-full w-full' }\n})\nexport class MonacoEditorComponent implements AfterViewInit, OnDestroy {\n readonly value = input('');\n readonly language = input('html');\n readonly theme = input('vs');\n readonly readOnly = input(false);\n readonly minimap = input(false);\n readonly options = input<Record<string, unknown> | null>(null);\n\n readonly valueChange = output<string>();\n\n @ViewChild('container', { static: true }) private readonly containerRef!: ElementRef<HTMLDivElement>;\n\n private static configured = false;\n private monaco?: MonacoModule;\n private editor?: MonacoEditorInstance;\n private suppressChange = false;\n private subscriptions: MonacoDisposable[] = [];\n private resizeObserver?: ResizeObserver;\n private readonly editorReady = signal(false);\n\n private readonly syncInputs = effect(() => {\n if (!this.editorReady()) return;\n if (!this.editor || !this.monaco) return;\n\n const nextValue = this.value();\n if (this.editor.getValue() !== nextValue) {\n this.suppressChange = true;\n this.editor.setValue(nextValue ?? '');\n this.suppressChange = false;\n }\n\n const model = this.editor.getModel();\n if (model) {\n this.monaco.editor.setModelLanguage(model, this.language());\n }\n\n this.monaco.editor.setTheme(this.theme());\n\n const options = this.options() ?? {};\n this.editor.updateOptions({\n ...options,\n readOnly: this.readOnly(),\n minimap: { enabled: this.minimap() }\n });\n });\n\n async ngAfterViewInit(): Promise<void> {\n if (!MonacoEditorComponent.configured) {\n loader.config({\n paths: { vs: 'https://cdn.jsdelivr.net/npm/monaco-editor@0.45.0/min/vs' }\n });\n MonacoEditorComponent.configured = true;\n }\n\n this.monaco = (await loader.init()) as MonacoModule;\n this.editor = this.monaco.editor.create(this.containerRef.nativeElement, {\n value: this.value() ?? '',\n language: this.language(),\n theme: this.theme(),\n readOnly: this.readOnly(),\n minimap: { enabled: this.minimap() },\n automaticLayout: false,\n ...(this.options() ?? {})\n });\n\n const model = this.editor.getModel();\n if (model && this.language()) {\n this.monaco.editor.setModelLanguage(model, this.language());\n }\n\n this.subscriptions.push(\n this.editor.onDidChangeModelContent(() => {\n if (this.suppressChange) return;\n this.valueChange.emit(this.editor?.getValue() ?? '');\n })\n );\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.editor?.layout());\n this.resizeObserver.observe(this.containerRef.nativeElement);\n }\n\n this.editorReady.set(true);\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n this.subscriptions.forEach(subscription => subscription.dispose());\n this.subscriptions = [];\n this.editor?.dispose();\n this.editor = undefined;\n }\n}\n","/// <reference path=\"../../json-editor.d.ts\" />\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewChild,\n effect,\n input,\n output,\n signal\n} from '@angular/core';\n\ntype JsonEditorModule = { JSONEditor?: unknown; default?: unknown };\n\ntype JsonEditorInstance = {\n destroy?: () => void;\n getValue?: () => unknown;\n setValue?: (value: unknown) => void;\n on?: (event: string, handler: () => void) => void;\n promise?: Promise<unknown>;\n ready?: boolean;\n};\n\nconst FD_JSON_EDITOR_ICONLIB = 'fdlucide';\n\nfunction ensureFdIconLib(jsonEditorCtor: unknown): void {\n const defaults = (jsonEditorCtor as { defaults?: { iconlibs?: Record<string, unknown> } }).defaults;\n if (!defaults?.iconlibs) return;\n if (defaults.iconlibs[FD_JSON_EDITOR_ICONLIB]) return;\n if (typeof document === 'undefined') return;\n\n defaults.iconlibs[FD_JSON_EDITOR_ICONLIB] = class {\n getIcon(key: string): Element | null {\n const paths = getIconPaths(key);\n if (!paths.length) return null;\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', '2');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n svg.setAttribute('aria-hidden', 'true');\n\n for (const d of paths) {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttribute('d', d);\n svg.appendChild(path);\n }\n\n return svg;\n }\n };\n}\n\nfunction getIconPaths(key: string): readonly string[] {\n switch (key) {\n case 'collapse':\n return ['M6 9l6 6 6-6'];\n case 'expand':\n return ['M9 18l6-6-6-6'];\n case 'add':\n return ['M12 5v14', 'M5 12h14'];\n case 'delete':\n return ['M3 6h18', 'M8 6v14', 'M16 6v14', 'M10 6V4h4v2', 'M5 6l1 16h12l1-16'];\n case 'copy':\n return ['M9 9h10v10H9z', 'M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1'];\n case 'edit':\n return ['M12 20h9', 'M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z'];\n case 'save':\n return ['M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2Z', 'M17 21v-8H7v8', 'M7 3v5h8'];\n case 'cancel':\n return ['M18 6 6 18', 'M6 6l12 12'];\n case 'moveup':\n return ['M12 19V5', 'M5 12l7-7 7 7'];\n case 'movedown':\n return ['M12 5v14', 'M19 12l-7 7-7-7'];\n case 'moveleft':\n return ['M19 12H5', 'M12 19l-7-7 7-7'];\n case 'moveright':\n return ['M5 12h14', 'M12 5l7 7-7 7'];\n default:\n return [];\n }\n}\n\n@Component({\n selector: 'app-json-schema-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"relative h-full w-full\">\n <div #container class=\"h-full w-full overflow-auto fd-json-schema-editor\"></div>\n @if (!error() && loading()) {\n <div class=\"absolute inset-0 flex items-center justify-center bg-white/80 p-4 text-xs font-semibold text-gray-500\">\n Loading schema form…\n </div>\n }\n @if (error()) {\n <div class=\"absolute inset-0 flex items-center justify-center bg-white/80 p-4 text-xs font-semibold text-red-600\">\n {{ error() }}\n </div>\n }\n </div>\n `,\n host: { class: 'block h-full w-full' }\n})\nexport class JsonSchemaEditorComponent implements AfterViewInit, OnDestroy {\n readonly schema = input<Record<string, unknown> | null>(null);\n readonly value = input<Record<string, unknown> | null>(null);\n readonly readOnly = input(false);\n\n readonly valueChange = output<Record<string, unknown>>();\n\n @ViewChild('container', { static: true }) private readonly containerRef!: ElementRef<HTMLDivElement>;\n\n readonly error = signal('');\n readonly loading = signal(false);\n\n private editor?: JsonEditorInstance;\n private editorReady = false;\n private suppressChange = false;\n private schemaKey = '';\n private valueKey = '';\n private readonly viewReady = signal(false);\n private initToken = 0;\n private static modulePromise: Promise<JsonEditorModule> | null = null;\n\n private readonly syncInputs = effect(() => {\n if (!this.viewReady()) return;\n\n const schema = this.schema();\n const nextSchemaKey = schema ? JSON.stringify(schema) : '';\n if (nextSchemaKey !== this.schemaKey) {\n this.schemaKey = nextSchemaKey;\n void this.initializeEditor(schema);\n return;\n }\n\n const value = this.value();\n if (this.editor && this.editorReady && value) {\n const nextKey = JSON.stringify(value);\n if (nextKey === this.valueKey) {\n return;\n }\n this.suppressChange = true;\n try {\n this.valueKey = nextKey;\n this.editor.setValue?.(value);\n } catch {\n // Ignore invalid intermediate values while typing.\n } finally {\n this.suppressChange = false;\n }\n }\n });\n\n ngAfterViewInit(): void {\n this.viewReady.set(true);\n }\n\n ngOnDestroy(): void {\n this.destroyEditor();\n }\n\n private destroyEditor() {\n this.editor?.destroy?.();\n this.editor = undefined;\n this.editorReady = false;\n this.valueKey = '';\n this.loading.set(false);\n this.containerRef.nativeElement.innerHTML = '';\n }\n\n private static async loadModule(): Promise<JsonEditorModule> {\n if (!this.modulePromise) {\n this.modulePromise = import('@json-editor/json-editor') as Promise<JsonEditorModule>;\n }\n return this.modulePromise;\n }\n\n private async initializeEditor(schema: Record<string, unknown> | null): Promise<void> {\n const token = (this.initToken += 1);\n this.destroyEditor();\n this.error.set('');\n\n if (!schema) {\n this.loading.set(false);\n return;\n }\n\n this.loading.set(true);\n\n let module: JsonEditorModule;\n try {\n module = await JsonSchemaEditorComponent.loadModule();\n } catch (error) {\n console.warn('[ngx-form-designer] Unable to load JSON editor runtime', error);\n this.error.set('Unable to load JSON editor.');\n this.loading.set(false);\n return;\n }\n\n if (token !== this.initToken) return;\n\n const JSONEditorCtor = (module.JSONEditor ?? module.default ?? module) as unknown;\n if (typeof JSONEditorCtor !== 'function') {\n this.error.set('JSON editor runtime is not available.');\n return;\n }\n\n ensureFdIconLib(JSONEditorCtor);\n\n try {\n const startValue = this.value() ?? {};\n this.valueKey = JSON.stringify(startValue);\n\n const editor = new (JSONEditorCtor as new (element: HTMLElement, options: Record<string, unknown>) => JsonEditorInstance)(\n this.containerRef.nativeElement,\n {\n schema,\n startval: startValue,\n theme: 'spectre',\n iconlib: FD_JSON_EDITOR_ICONLIB,\n remove_button_labels: true,\n ajax: false,\n disable_properties: true,\n disable_edit_json: true,\n disable_collapse: false,\n array_controls_top: true,\n show_errors: 'interaction'\n }\n );\n\n this.editor = editor;\n this.editorReady = false;\n\n editor.on?.('change', () => {\n if (!this.editorReady) return;\n if (token !== this.initToken) return;\n if (this.suppressChange) return;\n try {\n const raw = editor.getValue?.();\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return;\n const next = raw as Record<string, unknown>;\n this.valueKey = JSON.stringify(next);\n this.valueChange.emit(next);\n } catch {\n // Ignore change events fired before the editor is fully ready.\n }\n });\n\n const editorPromise = editor.promise;\n if (editorPromise && typeof (editorPromise as unknown as { then?: unknown }).then === 'function') {\n await editorPromise;\n }\n\n if (token !== this.initToken) {\n editor.destroy?.();\n return;\n }\n\n this.editorReady = true;\n this.loading.set(false);\n\n const nextValue = this.value() ?? {};\n const nextKey = JSON.stringify(nextValue);\n if (nextKey !== this.valueKey) {\n this.valueKey = nextKey;\n this.suppressChange = true;\n try {\n editor.setValue?.(nextValue);\n } catch (error) {\n console.warn('[ngx-form-designer] Unable to apply JSON editor value', error);\n } finally {\n this.suppressChange = false;\n }\n }\n\n if (this.readOnly()) {\n // JSON Editor doesn't have a global readonly option across all editor types.\n // We leave this as a hook for future enhancement.\n }\n } catch (error) {\n console.warn('[ngx-form-designer] Unable to initialize JSON editor', error);\n this.error.set('Unable to render schema form.');\n this.loading.set(false);\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewChild,\n effect,\n inject\n} from '@angular/core';\nimport { WebsiteProjectService } from '../../website/website-project.service';\nimport type { WebsiteBrick } from '../../website/website-project.models';\nimport { WIDGET_EDITOR_CONTEXT } from '../widget-editor-context';\n\ntype BrickRuntimeInstance = {\n update?: (nextProps: Record<string, unknown>) => void;\n destroy?: () => void;\n};\n\ntype BrickRuntimeContext = {\n root: HTMLElement;\n getProps: () => Record<string, unknown>;\n setProps: (next: Record<string, unknown>) => void;\n on: (event: string, handler: (payload: unknown) => void) => () => void;\n emit: (event: string, payload: unknown) => void;\n};\n\ntype BrickRuntimeMode = 'dom' | 'react';\n\ntype ReactGlobals = {\n React: { createElement: (...args: unknown[]) => unknown };\n ReactDOM: {\n render?: (element: unknown, container: Element) => void;\n unmountComponentAtNode?: (container: Element) => void;\n createRoot?: (container: Element) => { render: (element: unknown) => void; unmount?: () => void };\n };\n};\n\ntype BabelGlobals = {\n Babel: {\n transform: (\n code: string,\n options: Record<string, unknown>\n ) => { code?: string };\n };\n};\n\n@Component({\n selector: 'app-brick-widget',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"relative w-full\">\n <div #brickRoot></div>\n @if (showMissing()) {\n <div class=\"absolute inset-0 flex items-center justify-center rounded-md border border-dashed border-gray-300 bg-white/80 text-xs text-gray-500\">\n {{ missingMessage() }}\n </div>\n }\n </div>\n `\n})\nexport class BrickWidgetComponent implements AfterViewInit, OnChanges, OnDestroy {\n @Input() config: any;\n @Input() engine?: any;\n @Input() control?: any;\n @Input() brickOverride?: WebsiteBrick;\n @Input() onPropsChange?: (nextProps: Record<string, unknown>) => void;\n\n @ViewChild('brickRoot', { static: true }) private readonly brickRoot!: ElementRef<HTMLDivElement>;\n\n private readonly projectService = inject(WebsiteProjectService);\n private readonly editor = inject(WIDGET_EDITOR_CONTEXT, { optional: true });\n\n private runtimeInstance?: BrickRuntimeInstance;\n private cleanupFns: Array<() => void> = [];\n private reactUnmount?: () => void;\n private viewReady = false;\n private renderSequence = 0;\n private static reactGlobalsPromise: Promise<ReactGlobals> | null = null;\n private static babelGlobalsPromise: Promise<BabelGlobals> | null = null;\n\n constructor() {\n effect(() => {\n this.projectService.bricks();\n if (this.viewReady) {\n this.renderBrick();\n }\n });\n }\n\n ngAfterViewInit() {\n this.viewReady = true;\n this.renderBrick();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.viewReady) return;\n if (changes['config'] || changes['brickOverride']) {\n this.renderBrick();\n }\n }\n\n ngOnDestroy() {\n this.cleanupRuntime();\n }\n\n showMissing(): boolean {\n const brick = this.resolveBrick();\n if (!this.isDesignMode()) return false;\n if (!brick) return true;\n return this.getRuntime(brick) === 'react' && !brick.reactComponentJs?.trim();\n }\n\n missingMessage(): string {\n if (!this.config?.brickId) return 'Select a brick to render';\n const brick = this.resolveBrick();\n if (!brick) return 'Missing brick definition';\n if (this.getRuntime(brick) === 'react' && !brick.reactComponentJs?.trim()) {\n return 'Missing React component code';\n }\n return 'Missing brick definition';\n }\n\n private renderBrick() {\n const sequence = (this.renderSequence += 1);\n const root = this.brickRoot.nativeElement;\n const brick = this.resolveBrick();\n\n this.cleanupRuntime();\n root.innerHTML = '';\n\n if (!brick) {\n return;\n }\n\n const runtime = this.getRuntime(brick);\n if (runtime === 'react') {\n if (!brick.reactComponentJs?.trim()) {\n return;\n }\n void this.renderReactBrick(root, brick, sequence);\n return;\n }\n\n root.innerHTML = brick.templateHtml ?? '';\n this.applyBindings(root, brick);\n this.setupInlineEditing(root);\n this.initRuntime(root, brick);\n }\n\n private resolveBrick(): WebsiteBrick | undefined {\n if (this.brickOverride) return this.brickOverride;\n const brickId = this.config?.brickId;\n if (!brickId) return undefined;\n return this.projectService.bricks().find(brick => brick.id === brickId);\n }\n\n private getProps(brick?: WebsiteBrick): Record<string, unknown> {\n const props = this.config?.props;\n if (props && typeof props === 'object') {\n return props as Record<string, unknown>;\n }\n return (brick?.defaultProps ?? {}) as Record<string, unknown>;\n }\n\n private getRuntime(brick: WebsiteBrick): BrickRuntimeMode {\n return (brick.runtime ?? 'dom') === 'react' ? 'react' : 'dom';\n }\n\n private applyBindings(root: HTMLElement, brick: WebsiteBrick) {\n const props = this.getProps(brick);\n const nodes = Array.from(root.querySelectorAll<HTMLElement>('[data-fd-bind]'));\n nodes.forEach(node => {\n const path = node.getAttribute('data-fd-bind')?.trim();\n if (!path) return;\n const type = node.getAttribute('data-fd-type')?.trim() ?? 'text';\n const value = this.readProp(props, path);\n if (value === undefined || value === null) return;\n switch (type) {\n case 'href':\n node.setAttribute('href', String(value));\n break;\n case 'src':\n case 'image':\n node.setAttribute('src', String(value));\n break;\n case 'richtext':\n node.innerHTML = String(value);\n break;\n case 'text':\n default:\n node.textContent = String(value);\n break;\n }\n });\n }\n\n private setupInlineEditing(root: HTMLElement) {\n if (!this.isDesignMode()) return;\n const nodes = Array.from(root.querySelectorAll<HTMLElement>('[data-fd-bind]'));\n nodes.forEach(node => {\n const path = node.getAttribute('data-fd-bind')?.trim();\n if (!path) return;\n const type = node.getAttribute('data-fd-type')?.trim() ?? 'text';\n if (type !== 'text' && type !== 'richtext') return;\n\n node.setAttribute('contenteditable', 'true');\n node.setAttribute('spellcheck', 'false');\n\n const stopPropagation = (event: Event) => event.stopPropagation();\n const commit = () => {\n const nextValue = type === 'richtext' ? node.innerHTML : node.textContent ?? '';\n this.updateProp(path, nextValue);\n };\n\n node.addEventListener('mousedown', stopPropagation);\n node.addEventListener('focus', stopPropagation);\n node.addEventListener('blur', commit);\n\n this.cleanupFns.push(() => {\n node.removeAttribute('contenteditable');\n node.removeAttribute('spellcheck');\n node.removeEventListener('mousedown', stopPropagation);\n node.removeEventListener('focus', stopPropagation);\n node.removeEventListener('blur', commit);\n });\n });\n }\n\n private initRuntime(root: HTMLElement, brick: WebsiteBrick) {\n const script = brick.scriptJs?.trim();\n if (!script) return;\n\n const events = new Map<string, Array<(payload: unknown) => void>>();\n const ctx: BrickRuntimeContext = {\n root,\n getProps: () => this.getProps(brick),\n setProps: (next) => this.updateProps(next),\n on: (event, handler) => {\n const handlers = events.get(event) ?? [];\n handlers.push(handler);\n events.set(event, handlers);\n return () => {\n const current = events.get(event) ?? [];\n events.set(event, current.filter(entry => entry !== handler));\n };\n },\n emit: (event, payload) => {\n (events.get(event) ?? []).forEach(handler => handler(payload));\n }\n };\n\n try {\n const runtimeScript = this.ensureRootBinding(script);\n const factory = new Function('ctx', runtimeScript) as (ctx: BrickRuntimeContext) => BrickRuntimeInstance | void;\n const instance = factory(ctx);\n if (instance && typeof instance === 'object') {\n this.runtimeInstance = instance;\n this.runtimeInstance.update?.(this.getProps(brick));\n }\n } catch (error) {\n console.warn('[ngx-form-designer] Brick script error', error);\n }\n }\n\n private async renderReactBrick(root: HTMLElement, brick: WebsiteBrick, sequence: number): Promise<void> {\n root.innerHTML = `<div class=\"p-4 text-xs text-gray-500\">Loading React...</div>`;\n\n let globals: ReactGlobals;\n let babel: BabelGlobals;\n try {\n globals = await BrickWidgetComponent.loadReactGlobals();\n babel = await BrickWidgetComponent.loadBabelGlobals();\n } catch (error) {\n if (sequence !== this.renderSequence) return;\n console.warn('[ngx-form-designer] React/JSX runtime not available', error);\n root.innerHTML = `<div class=\"p-4 text-xs text-red-500\">React/JSX runtime not available.</div>`;\n return;\n }\n\n if (sequence !== this.renderSequence) return;\n root.innerHTML = '';\n\n const script = brick.reactComponentJs?.trim();\n if (!script) return;\n\n const events = new Map<string, Array<(payload: unknown) => void>>();\n const ctx: BrickRuntimeContext = {\n root,\n getProps: () => this.getProps(brick),\n setProps: (next) => this.updateProps(next),\n on: (event, handler) => {\n const handlers = events.get(event) ?? [];\n handlers.push(handler);\n events.set(event, handlers);\n return () => {\n const current = events.get(event) ?? [];\n events.set(event, current.filter(entry => entry !== handler));\n };\n },\n emit: (event, payload) => {\n (events.get(event) ?? []).forEach(handler => handler(payload));\n }\n };\n\n try {\n const compiled = BrickWidgetComponent.compileReactComponent(script, babel.Babel);\n const runtimeScript = this.ensureRootBinding(compiled);\n const factory = new Function('ctx', 'React', 'ReactDOM', runtimeScript) as (\n ctx: BrickRuntimeContext,\n React: ReactGlobals['React'],\n ReactDOM: ReactGlobals['ReactDOM']\n ) => unknown;\n const result = factory(ctx, globals.React, globals.ReactDOM);\n const component = this.resolveReactComponent(result);\n if (!component) {\n throw new Error('React brick must return a component function or { Component }.');\n }\n\n const props = { ...this.getProps(brick), fdCtx: ctx } as Record<string, unknown>;\n const element = globals.React.createElement(component, props);\n\n if (typeof globals.ReactDOM.createRoot === 'function') {\n const reactRoot = globals.ReactDOM.createRoot(root);\n reactRoot.render(element);\n this.reactUnmount = () => reactRoot.unmount?.();\n } else if (typeof globals.ReactDOM.render === 'function') {\n globals.ReactDOM.render(element, root);\n this.reactUnmount = () => globals.ReactDOM.unmountComponentAtNode?.(root);\n } else {\n throw new Error('ReactDOM render API not found.');\n }\n\n this.setupInlineEditing(root);\n } catch (error) {\n console.warn('[ngx-form-designer] Brick script error', error);\n root.innerHTML = `<div class=\"p-4 text-xs text-red-500\">React brick error. Check console.</div>`;\n }\n }\n\n private resolveReactComponent(result: unknown): ((props: unknown) => unknown) | null {\n if (typeof result === 'function') {\n return result as (props: unknown) => unknown;\n }\n\n if (result && typeof result === 'object') {\n const candidate = (result as { Component?: unknown }).Component;\n if (typeof candidate === 'function') {\n return candidate as (props: unknown) => unknown;\n }\n }\n\n return null;\n }\n\n private updateProps(next: Record<string, unknown>) {\n if (this.onPropsChange) {\n this.onPropsChange(next);\n return;\n }\n if (!this.isDesignMode()) return;\n if (!this.config?.id || !this.editor?.updateField) return;\n this.editor.updateField(this.config.id, { props: next });\n }\n\n private ensureRootBinding(script: string): string {\n const declaresRoot =\n /\\b(const|let|var)\\s+root\\b/.test(script) ||\n /\\b(const|let|var)\\s+\\{[^}]*\\broot\\b/.test(script);\n if (declaresRoot) return script;\n return `const root = ctx.root;\\n${script}`;\n }\n\n private updateProp(path: string, value: unknown) {\n const base = this.getProps(this.resolveBrick());\n const nextProps = this.setPropValue(base, path, value);\n if (this.onPropsChange) {\n this.onPropsChange(nextProps);\n return;\n }\n if (!this.isDesignMode()) return;\n if (!this.config?.id || !this.editor?.updateField) return;\n this.editor.updateField(this.config.id, { props: nextProps });\n }\n\n private readProp(source: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((acc, key) => {\n if (acc && typeof acc === 'object' && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, source as unknown);\n }\n\n private setPropValue(source: Record<string, unknown>, path: string, value: unknown): Record<string, unknown> {\n const parts = path.split('.');\n const clone = { ...source };\n let cursor: Record<string, unknown> = clone;\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i];\n const next = cursor[key];\n cursor[key] = next && typeof next === 'object' ? { ...(next as Record<string, unknown>) } : {};\n cursor = cursor[key] as Record<string, unknown>;\n }\n cursor[parts[parts.length - 1]] = value;\n return clone;\n }\n\n private isDesignMode(): boolean {\n return Boolean(this.editor?.isDesignMode() || this.onPropsChange);\n }\n\n private cleanupRuntime() {\n this.runtimeInstance?.destroy?.();\n this.runtimeInstance = undefined;\n this.reactUnmount?.();\n this.reactUnmount = undefined;\n this.cleanupFns.forEach(cleanup => cleanup());\n this.cleanupFns = [];\n }\n\n private static async loadReactGlobals(): Promise<ReactGlobals> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n throw new Error('React runtime requires a browser environment.');\n }\n\n if (!this.reactGlobalsPromise) {\n this.reactGlobalsPromise = (async () => {\n const reactModule = (await import('react')) as unknown as {\n createElement?: ReactGlobals['React']['createElement'];\n default?: unknown;\n };\n const React = (reactModule.createElement ? reactModule : reactModule.default) as ReactGlobals['React'] | undefined;\n if (!React?.createElement) {\n throw new Error('React module does not expose createElement.');\n }\n\n const reactDomClientModule = (await import('react-dom/client')) as unknown as {\n createRoot?: ReactGlobals['ReactDOM']['createRoot'];\n default?: unknown;\n };\n const createRoot = (reactDomClientModule.createRoot ??\n (reactDomClientModule.default as { createRoot?: ReactGlobals['ReactDOM']['createRoot'] } | undefined)\n ?.createRoot) as ReactGlobals['ReactDOM']['createRoot'] | undefined;\n if (typeof createRoot !== 'function') {\n throw new Error('react-dom/client module does not expose createRoot.');\n }\n\n return {\n React,\n ReactDOM: { createRoot }\n };\n })();\n }\n\n return this.reactGlobalsPromise;\n }\n\n private static async loadBabelGlobals(): Promise<BabelGlobals> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n throw new Error('JSX compiler requires a browser environment.');\n }\n\n if (!this.babelGlobalsPromise) {\n this.babelGlobalsPromise = (async () => {\n const babelModule = (await import('@babel/standalone')) as unknown as {\n transform?: BabelGlobals['Babel']['transform'];\n default?: unknown;\n };\n\n const Babel = (babelModule.transform ? babelModule : babelModule.default) as BabelGlobals['Babel'] | undefined;\n if (!Babel?.transform) {\n throw new Error('Babel module does not expose transform.');\n }\n\n return { Babel: Babel as BabelGlobals['Babel'] };\n })();\n }\n\n return this.babelGlobalsPromise;\n }\n\n private static compileReactComponent(source: string, babel: BabelGlobals['Babel']): string {\n const wrapped = `\nfunction __fdReactFactory(ctx, React, ReactDOM) {\n${source}\n}\n`.trim();\n\n const result = babel.transform(wrapped, {\n filename: 'brick.jsx',\n sourceType: 'script',\n presets: [['react', { runtime: 'classic' }]]\n }) as { code?: string };\n\n const compiled = result.code ?? '';\n if (!compiled.trim()) {\n throw new Error('JSX compilation produced empty output.');\n }\n\n return `${compiled}\\nreturn __fdReactFactory(ctx, React, ReactDOM);`;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewChild,\n computed,\n effect,\n inject,\n signal\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { UiIconModule } from '../ui/ui-icon.module';\nimport { MonacoEditorComponent } from '../ui/monaco-editor.component';\nimport { JsonSchemaEditorComponent } from '../ui/json-schema-editor.component';\nimport { BrickWidgetComponent } from '../widgets/page-widgets/brick-widget.component';\nimport { createWebsiteBrick } from './website-project.models';\nimport type { WebsiteBrick } from './website-project.models';\nimport { WebsiteProjectService } from './website-project.service';\n\ntype BrickEditorTab = 'template' | 'script' | 'schema' | 'defaults';\ntype BrickRuntimeMode = 'dom' | 'react';\n\n@Component({\n selector: 'app-website-brick-studio',\n standalone: true,\n imports: [FormsModule, UiIconModule, MonacoEditorComponent, JsonSchemaEditorComponent, BrickWidgetComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"flex flex-col h-screen bg-gray-50 font-sans\">\n <header class=\"h-14 border-b border-gray-200 flex items-center justify-between px-4 bg-white\">\n <div class=\"flex items-center gap-3\">\n <button type=\"button\"\n class=\"p-2 rounded-md border border-gray-200 text-gray-500 hover:text-gray-800 hover:border-gray-300 transition-colors\"\n (click)=\"backToEditor()\"\n aria-label=\"Back to editor\">\n <lucide-icon name=\"arrow-left\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n <div>\n <div class=\"text-sm font-semibold text-gray-900\">Brick Studio</div>\n <div class=\"text-[11px] text-gray-500\">Build project-local bricks with Tailwind.</div>\n </div>\n </div>\n <div class=\"flex items-center gap-2\">\n <select class=\"h-9 rounded-md border border-gray-200 bg-white px-2 text-xs font-semibold text-gray-600 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\"\n [ngModel]=\"newBrickRuntime()\"\n (ngModelChange)=\"newBrickRuntime.set($event)\">\n <option value=\"dom\">DOM Brick</option>\n <option value=\"react\">React Brick</option>\n </select>\n <button type=\"button\"\n class=\"px-3 py-2 text-xs font-semibold rounded-md border border-gray-200 text-gray-600 hover:text-gray-800 hover:border-gray-300 transition-colors\"\n (click)=\"createBrick()\">\n New Brick\n </button>\n <button type=\"button\"\n class=\"px-3 py-2 text-xs font-semibold rounded-md bg-blue-600 text-white hover:bg-blue-700 transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n [disabled]=\"!selectedBrick()\"\n (click)=\"saveBrick()\">\n Save\n </button>\n <button type=\"button\"\n class=\"h-9 inline-flex items-center gap-2 rounded-md border border-gray-200 bg-white px-3 text-xs font-semibold text-gray-600 hover:bg-gray-50 transition-colors\"\n [attr.aria-pressed]=\"inspectorOpen()\"\n (click)=\"inspectorOpen.set(!inspectorOpen())\">\n <lucide-icon name=\"sliders-horizontal\" class=\"w-4 h-4\"></lucide-icon>\n Props\n </button>\n </div>\n </header>\n\n <div class=\"flex-1 flex overflow-hidden\">\n <aside class=\"w-64 border-r border-gray-200 bg-white flex flex-col\">\n <div class=\"p-3 border-b border-gray-100\">\n <div class=\"relative\">\n <lucide-icon name=\"search\" class=\"absolute left-2 top-2 text-gray-400 w-4 h-4\"></lucide-icon>\n <input type=\"text\"\n [ngModel]=\"searchQuery()\"\n (ngModelChange)=\"searchQuery.set($event)\"\n placeholder=\"Search bricks\"\n class=\"w-full bg-gray-50 border border-gray-200 rounded px-8 py-1.5 text-sm focus:outline-none focus:border-blue-400 focus:ring-1 focus:ring-blue-400 transition-all\">\n </div>\n </div>\n <div class=\"flex-1 overflow-y-auto p-3 space-y-4\">\n @if (brickGroups().length) {\n @for (group of brickGroups(); track group.id) {\n <div class=\"space-y-2\">\n <div class=\"flex items-center justify-between px-1\">\n <div class=\"text-[11px] font-semibold uppercase tracking-wide text-gray-400\">\n {{ group.label }}\n </div>\n <div class=\"text-[11px] font-semibold text-gray-400\">{{ group.bricks.length }}</div>\n </div>\n\n <div class=\"space-y-2\">\n @for (brick of group.bricks; track brick.id) {\n <div class=\"flex items-start gap-2\">\n <button type=\"button\"\n class=\"flex-1 text-left rounded-md border px-3 py-2 transition-colors\"\n [class.bg-blue-50]=\"brick.id === selectedBrickId()\"\n [class.border-blue-200]=\"brick.id === selectedBrickId()\"\n [class.border-gray-200]=\"brick.id !== selectedBrickId()\"\n [class.hover:bg-gray-50]=\"brick.id !== selectedBrickId()\"\n (click)=\"selectBrick(brick.id)\">\n <div class=\"flex items-center justify-between gap-2\">\n <div class=\"text-sm font-medium text-gray-800\">{{ brick.name }}</div>\n <span class=\"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-semibold\"\n [class.bg-indigo-50]=\"group.runtime === 'react'\"\n [class.text-indigo-700]=\"group.runtime === 'react'\"\n [class.bg-slate-100]=\"group.runtime === 'dom'\"\n [class.text-slate-700]=\"group.runtime === 'dom'\">\n {{ group.runtime === 'react' ? 'React' : 'DOM' }}\n </span>\n </div>\n <div class=\"mt-0.5 text-[11px] text-gray-500\">\n ID: <span class=\"font-mono\">{{ brick.id }}</span>\n </div>\n </button>\n <button type=\"button\"\n class=\"p-2 text-gray-400 hover:text-red-600 transition-colors\"\n (click)=\"removeBrick(brick.id)\"\n aria-label=\"Remove brick\">\n <lucide-icon name=\"trash-2\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n }\n </div>\n </div>\n }\n } @else {\n <div class=\"text-xs text-gray-500\">\n @if (bricks().length) {\n No matching bricks.\n } @else {\n No bricks yet. Add one to start.\n }\n </div>\n }\n </div>\n </aside>\n\n <div #workspace class=\"flex-1 flex flex-col overflow-hidden\">\n <main class=\"flex-1 min-h-0 flex flex-col overflow-hidden\">\n <div class=\"flex items-center justify-between px-4 py-2 border-b border-gray-200 bg-white\">\n <div class=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">Preview</div>\n @if (selectedBrick()) {\n <div class=\"text-[11px] text-gray-400\">Editing {{ selectedBrick()?.name }}</div>\n }\n </div>\n <div class=\"flex-1 overflow-auto p-6\">\n @if (previewBrick() && previewConfig()) {\n <div class=\"mx-auto w-full max-w-5xl rounded-xl border border-gray-200 bg-white p-6 shadow-sm\" data-fd-runtime>\n <app-brick-widget\n [config]=\"previewConfig()\"\n [brickOverride]=\"previewBrick()\"\n [onPropsChange]=\"handlePropsChange\">\n </app-brick-widget>\n </div>\n } @else {\n <div class=\"h-full flex items-center justify-center text-sm text-gray-400\">\n Select or create a brick to start editing.\n </div>\n }\n </div>\n </main>\n\n <div class=\"h-3 border-t border-b border-gray-200 bg-gray-50 flex items-center justify-center cursor-row-resize select-none\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n tabindex=\"0\"\n aria-label=\"Resize editor\"\n (pointerdown)=\"startEditorResize($event)\"\n (keydown)=\"handleResizeKeydown($event)\">\n <lucide-icon name=\"grip-horizontal\" class=\"w-4 h-4 text-gray-400\"></lucide-icon>\n </div>\n\n <section class=\"border-t border-gray-200 bg-white flex flex-col min-h-0\"\n [style.height.px]=\"editorHeight()\">\n <div class=\"px-4 py-3 border-b border-gray-100 flex flex-wrap items-end gap-3\">\n <div class=\"flex flex-col gap-1 min-w-0 flex-1\">\n <label class=\"text-[10px] text-gray-500 uppercase tracking-wide\">Name</label>\n <input type=\"text\"\n [ngModel]=\"draftName()\"\n (ngModelChange)=\"draftName.set($event)\"\n class=\"h-9 w-full rounded-md border border-gray-300 px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none bg-white\">\n </div>\n\n <div class=\"flex flex-col gap-1 w-56\">\n <label class=\"text-[10px] text-gray-500 uppercase tracking-wide\">Runtime</label>\n <select class=\"h-9 w-full rounded-md border border-gray-300 bg-white px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\"\n [ngModel]=\"draftRuntime()\"\n (ngModelChange)=\"setRuntime($event)\">\n <option value=\"dom\">DOM (HTML + JS)</option>\n <option value=\"react\">React (Component)</option>\n </select>\n </div>\n\n <div class=\"flex-1\"></div>\n\n <div class=\"flex items-center gap-1 rounded-md border border-gray-200 bg-gray-50 p-1 text-xs font-semibold text-gray-600\">\n <button type=\"button\"\n class=\"flex-1 px-2 py-1 rounded transition-colors\"\n [class.bg-white]=\"editorTab() === 'template'\"\n [class.text-gray-900]=\"editorTab() === 'template'\"\n [class.text-gray-500]=\"editorTab() !== 'template'\"\n (click)=\"editorTab.set('template')\">\n {{ draftRuntime() === 'react' ? 'Component' : 'Template' }}\n </button>\n @if (draftRuntime() === 'dom') {\n <button type=\"button\"\n class=\"flex-1 px-2 py-1 rounded transition-colors\"\n [class.bg-white]=\"editorTab() === 'script'\"\n [class.text-gray-900]=\"editorTab() === 'script'\"\n [class.text-gray-500]=\"editorTab() !== 'script'\"\n (click)=\"editorTab.set('script')\">\n Script\n </button>\n }\n <button type=\"button\"\n class=\"flex-1 px-2 py-1 rounded transition-colors\"\n [class.bg-white]=\"editorTab() === 'schema'\"\n [class.text-gray-900]=\"editorTab() === 'schema'\"\n [class.text-gray-500]=\"editorTab() !== 'schema'\"\n (click)=\"editorTab.set('schema')\">\n Schema\n </button>\n <button type=\"button\"\n class=\"flex-1 px-2 py-1 rounded transition-colors\"\n [class.bg-white]=\"editorTab() === 'defaults'\"\n [class.text-gray-900]=\"editorTab() === 'defaults'\"\n [class.text-gray-500]=\"editorTab() !== 'defaults'\"\n (click)=\"editorTab.set('defaults')\">\n Defaults\n </button>\n </div>\n\n @if (draftRuntime() === 'react') {\n <div class=\"w-full text-[11px] text-gray-400\">\n React/JSX runtime is bundled locally and lazy-loaded (MVP).\n </div>\n }\n </div>\n\n <div class=\"flex-1 min-h-0\">\n @if (editorTab() === 'template') {\n <app-monaco-editor\n class=\"h-full\"\n [language]=\"draftRuntime() === 'react' ? 'javascript' : 'html'\"\n [value]=\"draftRuntime() === 'react' ? draftReactComponent() : draftTemplate()\"\n [options]=\"editorOptions\"\n (valueChange)=\"draftRuntime() === 'react' ? draftReactComponent.set($event) : draftTemplate.set($event)\">\n </app-monaco-editor>\n } @else if (editorTab() === 'script') {\n <app-monaco-editor\n class=\"h-full\"\n [language]=\"'javascript'\"\n [value]=\"draftScript()\"\n [options]=\"editorOptions\"\n (valueChange)=\"draftScript.set($event)\">\n </app-monaco-editor>\n } @else if (editorTab() === 'schema') {\n <app-monaco-editor\n class=\"h-full\"\n [language]=\"'json'\"\n [value]=\"draftSchemaJson()\"\n [options]=\"editorOptions\"\n (valueChange)=\"draftSchemaJson.set($event)\">\n </app-monaco-editor>\n } @else {\n <app-monaco-editor\n class=\"h-full\"\n [language]=\"'json'\"\n [value]=\"draftDefaultsJson()\"\n [options]=\"editorOptions\"\n (valueChange)=\"updateDefaultsJson($event)\">\n </app-monaco-editor>\n }\n </div>\n\n <div class=\"px-4 py-3 border-t border-gray-100 flex flex-wrap items-center justify-between gap-3\">\n <div class=\"text-[11px] text-gray-400\">\n @if (draftRuntime() === 'react') {\n Tailwind-only: avoid generating dynamic class names at runtime.\n } @else {\n Tailwind-only: all classes must exist in template HTML at compile time.\n }\n </div>\n\n <div class=\"flex items-center gap-3\">\n @if (parseError()) {\n <div class=\"text-[11px] font-semibold text-red-500\">{{ parseError() }}</div>\n }\n <button type=\"button\"\n class=\"px-3 py-2 text-xs font-semibold rounded-md bg-blue-600 text-white hover:bg-blue-700 transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n [disabled]=\"!selectedBrick()\"\n (click)=\"saveBrick()\">\n Save Brick\n </button>\n </div>\n </div>\n </section>\n </div>\n\n @if (inspectorOpen()) {\n <aside class=\"w-[420px] border-l border-gray-200 bg-white flex flex-col min-h-0\">\n <div class=\"flex items-center justify-between gap-3 border-b border-gray-100 px-3 py-2\">\n <div>\n <div class=\"text-[11px] font-semibold uppercase tracking-wide text-gray-500\">Props</div>\n <div class=\"text-[11px] text-gray-400\">Generated from schema</div>\n </div>\n <button type=\"button\"\n class=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-gray-200 text-gray-500 hover:text-gray-800 hover:border-gray-300 hover:bg-gray-50 transition-colors\"\n aria-label=\"Collapse props panel\"\n (click)=\"inspectorOpen.set(false)\">\n <lucide-icon name=\"x\" class=\"w-4 h-4\"></lucide-icon>\n </button>\n </div>\n\n <div class=\"flex-1 min-h-0 overflow-auto p-3\">\n @if (!selectedBrick()) {\n <div class=\"text-xs text-gray-500\">Select or create a brick to edit its props.</div>\n } @else if (!inspectorSchema()) {\n <div class=\"space-y-1 text-xs text-gray-500\">\n <div>Invalid schema JSON.</div>\n <div class=\"text-[11px] text-gray-400\">Fix the Schema tab to enable the props form.</div>\n </div>\n } @else {\n <app-json-schema-editor\n class=\"h-full\"\n [schema]=\"inspectorSchema()\"\n [value]=\"draftDefaultsValue()\"\n (valueChange)=\"handlePropsChange($event)\">\n </app-json-schema-editor>\n }\n </div>\n </aside>\n }\n </div>\n </div>\n `\n})\nexport class WebsiteBrickStudioComponent implements OnDestroy {\n private readonly projectService = inject(WebsiteProjectService);\n private readonly router = inject(Router);\n\n @ViewChild('workspace', { static: true }) private readonly workspaceRef!: ElementRef<HTMLDivElement>;\n\n readonly searchQuery = signal('');\n readonly newBrickRuntime = signal<BrickRuntimeMode>('dom');\n readonly bricks = this.projectService.bricks;\n readonly selectedBrickId = signal('');\n readonly selectedBrick = computed(() =>\n this.bricks().find(brick => brick.id === this.selectedBrickId()) ?? null\n );\n readonly brickGroups = computed(() => {\n const query = this.searchQuery().trim().toLowerCase();\n const all = this.bricks();\n const filtered = query\n ? all.filter(brick => `${brick.name} ${brick.id}`.toLowerCase().includes(query))\n : all;\n\n const dom = filtered.filter(brick => brick.runtime !== 'react');\n const react = filtered.filter(brick => brick.runtime === 'react');\n\n return [\n { id: 'react', label: 'React Bricks', runtime: 'react' as const, bricks: react },\n { id: 'dom', label: 'DOM Bricks', runtime: 'dom' as const, bricks: dom }\n ].filter(group => group.bricks.length);\n });\n\n readonly editorTab = signal<BrickEditorTab>('template');\n readonly draftName = signal('');\n readonly draftRuntime = signal<BrickRuntimeMode>('dom');\n readonly draftTemplate = signal('');\n readonly draftScript = signal('');\n readonly draftReactComponent = signal('');\n readonly draftSchemaJson = signal('');\n readonly draftDefaultsJson = signal('');\n readonly draftDefaultsValue = signal<Record<string, unknown>>({});\n readonly parseError = signal('');\n readonly editorHeight = signal(360);\n readonly inspectorOpen = signal(true);\n readonly editorOptions: Record<string, unknown> = {\n wordWrap: 'on',\n fontSize: 12,\n lineNumbersMinChars: 3\n };\n\n private resizeCleanup?: () => void;\n\n readonly previewConfig = computed(() => {\n const brick = this.selectedBrick();\n if (!brick) return undefined;\n return {\n id: 'brick-preview',\n brickId: brick.id,\n props: this.draftDefaultsValue()\n };\n });\n\n readonly previewBrick = computed(() => {\n const brick = this.selectedBrick();\n if (!brick) return undefined;\n return {\n ...brick,\n name: this.draftName().trim() || brick.name,\n runtime: this.draftRuntime(),\n templateHtml: this.draftTemplate(),\n scriptJs: this.draftScript(),\n reactComponentJs: this.draftReactComponent(),\n defaultProps: this.draftDefaultsValue()\n } as WebsiteBrick;\n });\n\n readonly inspectorSchema = computed(() => {\n const raw = this.draftSchemaJson().trim();\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return null;\n const schema = parsed as Record<string, unknown>;\n if (schema['type']) return schema;\n const properties = schema['properties'];\n if (properties && typeof properties === 'object' && !Array.isArray(properties)) {\n return { type: 'object', ...schema } as Record<string, unknown>;\n }\n return schema;\n } catch {\n return null;\n }\n });\n\n readonly handlePropsChange = (nextProps: Record<string, unknown>) => {\n this.draftDefaultsValue.set(nextProps);\n this.draftDefaultsJson.set(JSON.stringify(nextProps, null, 2));\n this.parseError.set('');\n };\n\n private readonly selectionSync = effect(() => {\n const list = this.bricks();\n const selected = this.selectedBrickId();\n if (!selected || !list.some(brick => brick.id === selected)) {\n this.selectedBrickId.set(list[0]?.id ?? '');\n }\n });\n\n private readonly draftSync = effect(() => {\n const brick = this.selectedBrick();\n if (!brick) {\n this.draftName.set('');\n this.draftRuntime.set('dom');\n this.draftTemplate.set('');\n this.draftScript.set('');\n this.draftReactComponent.set('');\n this.draftSchemaJson.set('');\n this.draftDefaultsJson.set('');\n this.draftDefaultsValue.set({});\n this.parseError.set('');\n return;\n }\n\n this.draftName.set(brick.name);\n this.draftRuntime.set(brick.runtime === 'react' ? 'react' : 'dom');\n this.draftTemplate.set(brick.templateHtml);\n this.draftScript.set(brick.scriptJs ?? '');\n this.draftReactComponent.set(brick.reactComponentJs ?? createWebsiteBrick({ runtime: 'react' }).reactComponentJs ?? '');\n this.draftSchemaJson.set(JSON.stringify(brick.propsSchema ?? {}, null, 2));\n const defaults = (brick.defaultProps ?? {}) as Record<string, unknown>;\n this.draftDefaultsValue.set(JSON.parse(JSON.stringify(defaults)) as Record<string, unknown>);\n this.draftDefaultsJson.set(JSON.stringify(defaults, null, 2));\n this.editorTab.set('template');\n this.parseError.set('');\n });\n\n backToEditor() {\n this.router.navigateByUrl('/editor');\n }\n\n selectBrick(id: string) {\n this.selectedBrickId.set(id);\n }\n\n createBrick() {\n const brick = createWebsiteBrick({ runtime: this.newBrickRuntime() });\n this.projectService.addBrick(brick);\n this.selectedBrickId.set(brick.id);\n this.editorTab.set('template');\n }\n\n removeBrick(id: string) {\n const target = this.bricks().find(item => item.id === id);\n if (!target) return;\n if (!confirm(`Delete \"${target.name}\"? This cannot be undone.`)) return;\n this.projectService.removeBrick(id);\n }\n\n updateDefaultsJson(value: string) {\n this.draftDefaultsJson.set(value);\n const parsed = this.parseJsonObject(value, 'default props');\n if (parsed) {\n this.draftDefaultsValue.set(parsed);\n }\n }\n\n saveBrick() {\n const brick = this.selectedBrick();\n if (!brick) return;\n\n const schema = this.parseJsonObject(this.draftSchemaJson(), 'props schema');\n if (!schema) return;\n const defaults = this.parseJsonObject(this.draftDefaultsJson(), 'default props');\n if (!defaults) return;\n\n this.draftDefaultsValue.set(defaults);\n this.draftDefaultsJson.set(JSON.stringify(defaults, null, 2));\n\n const updated: WebsiteBrick = {\n ...brick,\n name: this.draftName().trim() || brick.name,\n runtime: this.draftRuntime(),\n templateHtml: this.draftTemplate(),\n scriptJs: this.draftScript(),\n reactComponentJs: this.draftReactComponent(),\n propsSchema: schema,\n defaultProps: defaults\n };\n\n this.projectService.updateBrick(updated);\n this.parseError.set('');\n }\n\n setRuntime(mode: BrickRuntimeMode) {\n const normalized: BrickRuntimeMode = mode === 'react' ? 'react' : 'dom';\n this.draftRuntime.set(normalized);\n if (normalized === 'react' && this.editorTab() === 'script') {\n this.editorTab.set('template');\n }\n }\n\n handleResizeKeydown(event: KeyboardEvent) {\n const step = event.shiftKey ? 80 : 32;\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.editorHeight.set(this.clampEditorHeight(this.editorHeight() + step));\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.editorHeight.set(this.clampEditorHeight(this.editorHeight() - step));\n }\n }\n\n startEditorResize(event: PointerEvent) {\n if (typeof window === 'undefined') return;\n if (event.button !== 0) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const workspace = this.workspaceRef.nativeElement;\n const rect = workspace.getBoundingClientRect();\n\n const maxEditor = this.computeMaxEditorHeight(rect.height);\n\n const startY = event.clientY;\n const startHeight = this.editorHeight();\n\n const previousUserSelect = document.body.style.userSelect;\n const previousCursor = document.body.style.cursor;\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'row-resize';\n\n const onMove = (moveEvent: PointerEvent) => {\n const delta = moveEvent.clientY - startY;\n const next = startHeight - delta;\n this.editorHeight.set(Math.max(WebsiteBrickStudioComponent.MIN_EDITOR_HEIGHT, Math.min(maxEditor, next)));\n };\n\n const onUp = () => {\n this.resizeCleanup?.();\n this.resizeCleanup = undefined;\n };\n\n this.resizeCleanup?.();\n this.resizeCleanup = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n document.body.style.userSelect = previousUserSelect;\n document.body.style.cursor = previousCursor;\n };\n\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n }\n\n ngOnDestroy(): void {\n this.resizeCleanup?.();\n this.resizeCleanup = undefined;\n }\n\n private static readonly MIN_EDITOR_HEIGHT = 260;\n\n private clampEditorHeight(next: number): number {\n const workspaceHeight = this.workspaceRef.nativeElement.getBoundingClientRect().height;\n const maxEditor = this.computeMaxEditorHeight(workspaceHeight);\n return Math.max(WebsiteBrickStudioComponent.MIN_EDITOR_HEIGHT, Math.min(maxEditor, next));\n }\n\n private computeMaxEditorHeight(workspaceHeight: number): number {\n const minPreview = 220;\n const resizerHeight = 12;\n return Math.max(WebsiteBrickStudioComponent.MIN_EDITOR_HEIGHT, workspaceHeight - minPreview - resizerHeight);\n }\n\n private parseJsonObject(raw: string, label: string): Record<string, unknown> | null {\n const trimmed = raw.trim();\n if (!trimmed) {\n this.parseError.set('');\n return {};\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n this.parseError.set(`${label} must be a JSON object.`);\n return null;\n }\n this.parseError.set('');\n return parsed as Record<string, unknown>;\n } catch {\n this.parseError.set(`Invalid JSON in ${label}.`);\n return null;\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, signal } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter, map, merge, of } from 'rxjs';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { JsonFormRendererComponent } from '../form-renderer/json-form-renderer.component';\nimport { mergeAndNormalize } from '../widgets/style-helpers';\nimport { DEFAULT_PAGE_STYLE } from '../form-designer/page-style';\nimport { WebsiteProjectService } from './website-project.service';\nimport { WIDGET_PAGE_LINKS } from '../widgets/page-link-context';\n\n@Component({\n selector: 'app-website-preview-shell',\n standalone: true,\n imports: [CommonModule, JsonFormRendererComponent],\n providers: [\n {\n provide: WIDGET_PAGE_LINKS,\n useFactory: (projectService: WebsiteProjectService) => () =>\n projectService.pages().map(page => ({ id: page.id, name: page.name, route: page.route })),\n deps: [WebsiteProjectService]\n }\n ],\n template: `\n <div class=\"min-h-screen flex flex-col bg-white font-sans\">\n <header class=\"h-12 border-b border-gray-200 flex items-center justify-between px-4 bg-white shadow-sm\">\n <div class=\"flex items-center gap-3\">\n <button type=\"button\"\n class=\"px-2 py-1 text-xs font-semibold rounded-md border border-gray-200 text-gray-600 hover:text-gray-800 hover:border-gray-300 transition-colors\"\n (click)=\"backToEditor()\">\n Back to editor\n </button>\n <div class=\"text-xs text-gray-500\">\n Preview · {{ project().name }}\n </div>\n </div>\n\n <div class=\"hidden md:flex items-center gap-2 text-xs\">\n @for (page of pages(); track page.id) {\n <button type=\"button\"\n class=\"px-2 py-1 rounded-md transition-colors border\"\n [class.border-blue-200]=\"page.id === activePage()?.id\"\n [class.bg-blue-50]=\"page.id === activePage()?.id\"\n [class.text-blue-700]=\"page.id === activePage()?.id\"\n [class.border-gray-200]=\"page.id !== activePage()?.id\"\n [class.text-gray-600]=\"page.id !== activePage()?.id\"\n [class.hover:border-gray-300]=\"page.id !== activePage()?.id\"\n (click)=\"navigateTo(page.route)\">\n {{ page.name }}\n </button>\n }\n </div>\n\n <div class=\"flex items-center gap-2\">\n <div class=\"flex items-center bg-gray-100 rounded p-0.5\">\n <button type=\"button\"\n *ngFor=\"let bp of breakpoints\"\n (click)=\"setBreakpoint(bp)\"\n [class.bg-white]=\"breakpoint() === bp\"\n [class.text-blue-600]=\"breakpoint() === bp\"\n [class.shadow-sm]=\"breakpoint() === bp\"\n class=\"px-2 py-1 rounded text-[10px] font-bold uppercase transition-all hover:text-blue-500\">\n {{ bp }}\n </button>\n </div>\n </div>\n </header>\n\n <main class=\"flex-1 overflow-auto bg-gray-50 p-8\">\n @if (activePage(); as page) {\n <div class=\"mx-auto flex justify-center\">\n <div class=\"shadow-xl border border-gray-200 bg-white\"\n [style]=\"getPageStyle(page.schema)\">\n @if (page.schema.fields.length === 0) {\n <div class=\"min-h-[300px] flex items-center justify-center text-sm text-gray-400\">\n This page is empty. Add sections in the editor.\n </div>\n } @else {\n <app-json-form-renderer\n [schema]=\"page.schema\"\n mode=\"preview\"\n [device]=\"activeDevice()\"\n [breakpoint]=\"breakpoint()\">\n </app-json-form-renderer>\n }\n </div>\n </div>\n } @else {\n <div class=\"max-w-xl mx-auto text-center text-gray-500 text-sm\">\n <div class=\"text-lg font-semibold text-gray-700\">Page not found</div>\n <div class=\"mt-2\">Select a page to preview from the top navigation.</div>\n </div>\n }\n </main>\n </div>\n `\n})\nexport class WebsitePreviewShellComponent {\n private readonly router = inject(Router);\n private readonly projectService = inject(WebsiteProjectService);\n\n readonly project = this.projectService.project;\n readonly pages = this.projectService.pages;\n\n readonly breakpoints = ['xs', 'sm', 'md', 'lg', 'xl', '2xl'] as const;\n readonly breakpoint = signal<'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'>('xl');\n readonly activeDevice = computed(() => this.breakpoint() === 'xs' ? 'mobile' : 'desktop');\n\n private readonly url = toSignal(\n merge(\n of(this.router.url),\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n map(event => event.urlAfterRedirects)\n )\n ),\n { initialValue: this.router.url }\n );\n\n readonly activePage = computed(() => {\n const path = this.extractPath(this.url());\n const pages = this.pages();\n const normalized = pages.map(page => ({ page, route: this.normalizeRoute(page.route) }));\n\n const match = normalized.find(entry => entry.route === path);\n if (match) return match.page;\n\n if (!normalized.length) return null;\n\n const home = normalized.find(entry => entry.route === '/');\n return home?.page ?? normalized[0].page;\n });\n\n setBreakpoint(bp: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl') {\n this.breakpoint.set(bp);\n }\n\n getPageStyle(schema: { ui?: { baseStyle?: Record<string, unknown> } }) {\n const baseStyle = schema.ui?.baseStyle;\n const normalized = mergeAndNormalize(DEFAULT_PAGE_STYLE, baseStyle);\n if (normalized['width'] === undefined) {\n normalized['width'] = this.getContainerWidth();\n }\n if (normalized['minHeight'] === undefined && normalized['height'] === undefined) {\n normalized['minHeight'] = this.breakpoint() === 'xs' ? '667px' : '800px';\n }\n return normalized;\n }\n\n navigateTo(route: string) {\n const normalized = this.normalizeRoute(route);\n this.router.navigateByUrl(normalized);\n }\n\n backToEditor() {\n this.router.navigateByUrl('/editor');\n }\n\n private getContainerWidth() {\n const bp = this.breakpoint();\n switch (bp) {\n case 'xs': return '375px';\n case 'sm': return '576px';\n case 'md': return '768px';\n case 'lg': return '992px';\n case 'xl': return '1200px';\n case '2xl': return '1400px';\n default: return '100%';\n }\n }\n\n private extractPath(url: string): string {\n const pathOnly = url.split('?')[0].split('#')[0];\n if (!pathOnly) return '/';\n const normalized = this.normalizeRoute(pathOnly);\n if (!normalized.startsWith('/preview')) return normalized;\n const trimmed = normalized.replace(/^\\/preview/, '') || '/';\n return this.normalizeRoute(trimmed);\n }\n\n private normalizeRoute(route: string): string {\n const trimmed = route.trim().toLowerCase();\n if (!trimmed) return '/';\n const cleaned = trimmed.replace(/[^a-z0-9/_-]+/g, '-').replace(/-+/g, '-');\n const withSlash = cleaned.startsWith('/') ? cleaned : `/${cleaned}`;\n const normalized = withSlash.replace(/\\/+/g, '/');\n if (normalized === '/') return '/';\n return normalized.replace(/\\/$/, '');\n }\n}\n","import { Injectable, InjectionToken, inject } from '@angular/core';\nimport { FieldSchema, DataSourceConfig, OptionSchema, DataFilter } from '../form-core/models';\nimport { FormEngine } from '../form-core/form-engine';\nimport { DataSourceClient, DATA_SOURCE_CLIENT, DefaultDataSourceClient, DataSourceQuery } from './data-source-client';\n\n/**\n * Central abstraction for resolving data for widgets.\n * Implementations can be overridden by host apps if needed.\n */\n\nexport interface OptionsQuery {\n term?: string;\n limit?: number;\n columns?: string[];\n}\n\nexport abstract class DataProvider {\n abstract getOptions(field: FieldSchema, engine?: FormEngine): Promise<OptionSchema[]>;\n abstract getList(field: FieldSchema, engine?: FormEngine): Promise<any[]>;\n abstract getValue(field: FieldSchema, engine?: FormEngine): Promise<any>;\n abstract resolveValue(field: FieldSchema, value: any): Promise<string>;\n\n // Non-abstract with default implementation for backward compatibility\n async queryOptions(field: FieldSchema, query: { term: string; limit?: number }, engine?: FormEngine): Promise<any[]> {\n const options = await this.getOptions(field, engine || ({} as any));\n if (!query.term) return options;\n const term = query.term.toLowerCase();\n // naive filtering if not overridden\n return options.filter(o => JSON.stringify(o).toLowerCase().includes(term)).slice(0, query.limit || 50);\n }\n\n // New API-style list query for tables\n async queryList(field: FieldSchema, query: ListQuery, engine?: FormEngine): Promise<ListResult> {\n // Default implementation: get all rows and filter/sort/page in memory\n let rows = await this.getList(field, engine || ({} as any));\n\n // 1. Filter by term (global search)\n if (query.term) {\n const term = query.term.toLowerCase();\n rows = rows.filter(row => JSON.stringify(row).toLowerCase().includes(term));\n }\n\n // 2. Sort\n if (query.sort && query.sort.length > 0) {\n rows = [...rows].sort((a, b) => {\n for (const s of query.sort!) {\n const valA = a[s.column];\n const valB = b[s.column];\n if (valA === valB) continue;\n const result = valA < valB ? -1 : 1;\n return s.dir === 'asc' ? result : -result;\n }\n return 0;\n });\n }\n\n const total = rows.length;\n\n // 3. Page\n const offset = query.offset || 0;\n const limit = query.limit || rows.length;\n rows = rows.slice(offset, offset + limit);\n\n return { rows, total };\n }\n}\n\nexport interface ListQuery {\n term?: string;\n limit?: number;\n offset?: number;\n sort?: { column: string; dir: 'asc' | 'desc' }[];\n}\n\nexport interface ListResult {\n rows: any[];\n total: number;\n}\n\n/**\n * Helper to safely get the effective DataSourceConfig for a field.\n */\nexport function getEffectiveDataConfig(field: FieldSchema): DataSourceConfig {\n return field.dataConfig || { type: 'static' } as DataSourceConfig;\n}\n\nexport const DATA_PROVIDER = new InjectionToken<DataProvider>('DATA_PROVIDER');\n\n@Injectable({ providedIn: 'root' })\nexport class DefaultDataProvider extends DataProvider {\n private client = inject(DATA_SOURCE_CLIENT, { optional: true }) || inject(DefaultDataSourceClient);\n\n async getOptions(field: FieldSchema, engine?: FormEngine): Promise<OptionSchema[]> {\n const cfg = getEffectiveDataConfig(field);\n\n // 1. Resolve Rows\n let rows = await this.getRawRows(cfg, field, engine);\n\n // 2. Apply Filters\n rows = this.applyRowFilters(rows, cfg.filters, engine);\n\n // 3. Map to Options\n if (cfg.type === 'static') {\n return rows as OptionSchema[];\n }\n\n const labelKey = cfg.labelKey || 'label';\n const valueKey = cfg.valueKey || 'value';\n\n return rows.map(row => ({\n label: String((row as any)[labelKey] ?? ''),\n value: (row as any)[valueKey]\n }));\n }\n\n override async queryOptions(field: FieldSchema, query: OptionsQuery, engine?: FormEngine): Promise<OptionSchema[]> {\n const cfg = field.dataConfig;\n if (!cfg) return super.queryOptions(field, { ...query, term: query.term || '' }, engine);\n\n if (cfg.type === 'source' || cfg.type === 'global' || cfg.type === 'api') {\n if (!cfg.sourceId) return [];\n\n const filters = this.resolveFilters(cfg, engine);\n\n // Build Source Query\n const q: any = {\n filters,\n search: query.term ? {\n term: query.term,\n columns: query.columns ?? cfg.searchColumns ?? (cfg.labelKey ? [cfg.labelKey] : undefined)\n } : undefined,\n page: {\n limit: query.limit ?? cfg.optionsLimit ?? 50,\n offset: 0\n }\n };\n\n try {\n const res = await this.client.query(cfg.sourceId, q);\n const labelKey = cfg.labelKey || 'label';\n const valueKey = cfg.valueKey || 'value';\n return res.rows.map(r => ({\n label: String((r as any)[labelKey] ?? ''),\n value: (r as any)[valueKey]\n }));\n } catch (err) {\n return [];\n }\n }\n\n return super.queryOptions(field, { ...query, term: query.term || '' }, engine);\n }\n\n async getList(field: FieldSchema, engine?: FormEngine): Promise<any[]> {\n const cfg = field.dataConfig;\n if (!cfg) return [];\n\n let rows = await this.getRawRows(cfg, field, engine);\n\n // Filter rows locally if it's a static list or we fell back\n // (For source-backed, ideally we filter at source, but getRawRows currently returns all for source too, \n // UNLESS we use the new queryList flow below. This existing method is kept for list/dropdown backward compat)\n if (cfg.filters && cfg.filters.length > 0) {\n rows = this.applyRowFilters(rows, cfg.filters, engine);\n }\n\n return rows;\n }\n\n override async queryList(field: FieldSchema, query: ListQuery, engine?: FormEngine): Promise<ListResult> {\n const cfg = field.dataConfig;\n if (!cfg) return super.queryList(field, query, engine);\n\n // Determine if source-backed\n const isSource = cfg.type === 'source' || cfg.type === 'global' || (cfg.type === 'api' && !!cfg.sourceId);\n\n if (isSource && cfg.sourceId) {\n // Build DataSourceQuery\n const term = query.term ?? '';\n const search = term ? { term, columns: cfg.searchColumns } : undefined;\n const dsQuery: DataSourceQuery = {\n page: {\n limit: query.limit ?? cfg.pageSize ?? 10,\n offset: query.offset ?? 0\n },\n sort: query.sort ?? cfg.sort,\n search,\n filters: []\n };\n\n // Map filters\n if (cfg.filters) {\n for (const f of cfg.filters) {\n const val = this.resolveFilterValue(f, engine);\n if (val !== undefined) {\n dsQuery.filters!.push({\n column: f.column,\n op: f.op,\n value: val\n });\n }\n }\n }\n\n const result = await this.client.query(cfg.sourceId, dsQuery);\n return {\n rows: result.rows,\n total: result.total\n };\n }\n\n // Fallback to client-side\n return super.queryList(field, query, engine);\n }\n\n async getValue(field: FieldSchema, engine?: FormEngine): Promise<any> {\n const cfg = getEffectiveDataConfig(field);\n\n if (cfg.type === 'static') {\n if (cfg.staticValue !== undefined) return cfg.staticValue;\n return field.defaultValue;\n }\n\n let rows = await this.getRawRows(cfg, field, engine);\n rows = this.applyRowFilters(rows, cfg.filters, engine);\n\n if (!rows || rows.length === 0) {\n return field.defaultValue;\n }\n\n const row = rows[0];\n\n if (cfg.valueKey && (row as any)[cfg.valueKey] !== undefined) {\n return (row as any)[cfg.valueKey];\n }\n if ((row as any).value !== undefined) {\n return (row as any).value;\n }\n return row;\n }\n\n async resolveValue(field: FieldSchema, value: any): Promise<string> {\n // Simple implementation for now - just returns stringified value\n return String(value);\n }\n\n // --- Helpers ---\n\n private async getRawRows(cfg: DataSourceConfig, field: FieldSchema, engine?: FormEngine): Promise<any[]> {\n switch (cfg.type) {\n case 'static':\n if (Array.isArray(cfg.staticOptions)) return cfg.staticOptions;\n if (Array.isArray(field.staticOptions)) return field.staticOptions;\n if (Array.isArray((field as any).rows)) return (field as any).rows;\n return [];\n\n case 'source':\n case 'global':\n case 'api': // Aliasing API to source if sourceId present\n if (cfg.sourceId) {\n return this.getGlobalRows(cfg);\n }\n return [];\n\n case 'context':\n // Not implemented\n return [];\n\n default:\n return [];\n }\n }\n\n private async getGlobalRows(cfg: DataSourceConfig): Promise<any[]> {\n if (!cfg.sourceId) return [];\n const result = await this.client.query(cfg.sourceId);\n return result.rows;\n }\n\n private applyRowFilters(rows: any[], filters: DataFilter[] | undefined, engine?: FormEngine): any[] {\n if (!filters || filters.length === 0) return rows;\n\n return rows.filter(row => {\n return filters.every(filter => {\n const expected = this.resolveFilterValue(filter, engine);\n if (expected === undefined) return true; // Ignore if dependency missing\n\n const actual = (row as any)[filter.column];\n const val = expected;\n\n switch (filter.op) {\n case 'eq': return actual === val;\n case 'neq': return actual !== val;\n case 'in': return Array.isArray(val) ? val.includes(actual) : actual === val;\n\n // String Ops\n case 'contains':\n case 'like':\n return String(actual ?? '').toLowerCase().includes(String(val ?? '').toLowerCase());\n case 'startsWith':\n return String(actual ?? '').toLowerCase().startsWith(String(val ?? '').toLowerCase());\n case 'endsWith':\n return String(actual ?? '').toLowerCase().endsWith(String(val ?? '').toLowerCase());\n\n // Comparison Ops\n case 'gt': return (actual ?? 0) > (val ?? 0);\n case 'gte': return (actual ?? 0) >= (val ?? 0);\n case 'lt': return (actual ?? 0) < (val ?? 0);\n case 'lte': return (actual ?? 0) <= (val ?? 0);\n\n default: return true;\n }\n });\n });\n }\n\n private resolveFilters(cfg: DataSourceConfig, engine?: FormEngine): any[] {\n if (!cfg.filters) return [];\n\n return cfg.filters.map(f => {\n if (f.valueFrom === 'field') {\n if (!f.fieldId) return null;\n\n // We need to find the field NAME to get value from engine\n // Engine works on names usually? Or IDs? \n // FormEngine.getValue(fieldName) based on interface.\n\n let val: any;\n if (engine) {\n // Try to find field by ID in schema to get name\n const schema = engine.getSchema();\n const field = schema.fields.find(fi => fi.id === f.fieldId);\n if (field) {\n val = engine.getValue(field.name);\n }\n }\n\n if (val === undefined || val === null) return null; // Skip filter if value not ready\n return { column: f.column, op: f.op, value: val };\n } else {\n return { column: f.column, op: f.op, value: f.valueLiteral };\n }\n }).filter(f => f !== null);\n }\n\n private resolveFilterValue(filter: DataFilter, engine?: FormEngine): any {\n if (filter.valueFrom === 'literal') return filter.valueLiteral;\n if (filter.valueFrom === 'field' && filter.fieldId && engine) {\n // This method is used for client-side filtering, where the value is resolved from the engine\n // based on the field ID. The resolveFilters method above is for building query parameters\n // for the data source client, which needs the field name.\n // For client-side filtering, we can directly use the fieldId to get the value if the engine supports it,\n // or resolve the name first if the engine only takes names.\n // Assuming engine.getValue can take fieldId or fieldName based on context/implementation.\n // For now, let's assume it takes the field name, so we need to resolve it here too.\n const schema = engine.getSchema();\n const field = schema.fields.find(fi => fi.id === filter.fieldId);\n if (field) {\n return engine.getValue(field.name);\n }\n }\n return undefined;\n }\n}\n","import { Component, Input, inject, OnInit, OnDestroy, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { FieldSchema } from '../../../form-core/models';\nimport { FormEngine } from '../../../form-core/form-engine';\nimport { DATA_PROVIDER } from '../../../data/data-provider';\nimport { mergeAndNormalize } from '../../style-helpers';\n\n@Component({\n selector: 'app-text-field-widget',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n template: `\n <div class=\"w-full pb-4 font-sans\" [class.hidden]=\"!visible\" [ngStyle]=\"getWrapperStyles()\">\n <label [for]=\"fieldId\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n {{ config.label }} <span *ngIf=\"required\" class=\"text-red-500\" aria-label=\"required\">*</span>\n </label>\n <div class=\"relative\">\n <input \n [id]=\"fieldId\"\n [type]=\"config.type\"\n [placeholder]=\"config.placeholder || ''\"\n [formControl]=\"control\"\n (click)=\"onClick()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n [readonly]=\"config.readonly\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"!!error\"\n [attr.aria-describedby]=\"getAriaDescribedBy()\"\n class=\"appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 sm:text-sm transition-colors h-10\"\n [class.border-red-300]=\"error\"\n [class.text-red-900]=\"error\"\n [class.placeholder-red-300]=\"error\"\n [class.focus:ring-red-500]=\"error\"\n [class.focus:border-red-500]=\"error\"\n [attr.min]=\"config.html5?.min\"\n [attr.max]=\"config.html5?.max\"\n [attr.step]=\"config.html5?.step\"\n [attr.minlength]=\"config.html5?.minLength\"\n [attr.maxlength]=\"config.html5?.maxLength\"\n [pattern]=\"config.html5?.pattern || ''\"\n >\n </div>\n <p *ngIf=\"error\" [id]=\"errorId\" class=\"mt-1 text-sm text-red-600\" role=\"alert\" aria-live=\"assertive\">{{ error }}</p>\n <p *ngIf=\"config.helpText && !error\" [id]=\"helpTextId\" class=\"mt-1 text-xs text-gray-500\">{{ config.helpText }}</p>\n </div>\n `\n})\nexport class TextFieldWidgetComponent implements OnInit, OnDestroy {\n @Input() config!: FieldSchema;\n @Input() engine?: FormEngine;\n\n @Input() control = new FormControl();\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly dataProvider = inject(DATA_PROVIDER, { optional: true });\n\n get fieldId(): string {\n return `field-${this.config.id}`;\n }\n\n get errorId(): string {\n return `error-${this.config.id}`;\n }\n\n get helpTextId(): string {\n return `help-${this.config.id}`;\n }\n\n getAriaDescribedBy(): string {\n const ids: string[] = [];\n if (this.error) {\n ids.push(this.errorId);\n } else if (this.config.helpText) {\n ids.push(this.helpTextId);\n }\n return ids.join(' ');\n }\n\n ngOnInit() {\n // 1. Resolve initial value from DataProvider (Static, Global, etc.)\n if (this.dataProvider && this.config.dataConfig) {\n this.dataProvider.getValue(this.config, this.engine).then(val => {\n if (val !== undefined && val !== null) {\n this.control.setValue(val, { emitEvent: false });\n }\n }).catch(() => {\n // Ignore failed prefill attempts; keep field editable.\n });\n }\n\n // Sync enabled state based on config + rules\n this.syncEnabledState();\n\n if (this.engine) {\n this.engine.valueChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.syncEnabledState();\n });\n\n // Listen for submit attempts to show validation errors\n this.engine.submitted$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.control.markAsTouched();\n this.control.updateValueAndValidity(); // Ensure UI reflects state\n // If we have errors but were untouched, this ensures they show up now.\n });\n }\n\n this.control.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(val => {\n if (this.engine) {\n this.engine.setValue(this.config.name, val);\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'change', value: val });\n\n if (this.control.dirty) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'dirty' });\n }\n }\n });\n }\n\n onFocus() {\n if (this.engine) this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'focus' });\n }\n\n onClick() {\n if (this.engine) this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'click' });\n }\n\n onBlur() {\n if (this.engine) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'blur' });\n if (this.control.touched) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'touched' });\n }\n }\n }\n\n ngOnDestroy() {\n // Cleanup handled by takeUntilDestroyed\n }\n\n getWrapperStyles(): Record<string, any> {\n if (!this.config?.style) return {};\n return mergeAndNormalize(\n {\n width: '100%'\n },\n this.config.style\n );\n }\n\n get visible(): boolean {\n return this.engine ? this.engine.isFieldVisible(this.config.id) : true;\n }\n\n get enabled(): boolean {\n if (this.config?.disabled) return false;\n return this.engine ? this.engine.isFieldEnabled(this.config.id) : true;\n }\n\n get required(): boolean {\n return this.engine ? this.engine.isFieldRequired(this.config.id) : !!this.config?.html5?.required;\n }\n\n get error(): string | null {\n if (!this.engine) return null;\n \n // Only show error if touched or dirty\n if (this.control.untouched && this.control.pristine) {\n return null;\n }\n\n const errors = this.engine.getErrors()[this.config.name];\n return errors && errors.length > 0 ? errors[0] : null;\n }\n\n private syncEnabledState() {\n const shouldEnable = this.enabled;\n if (shouldEnable && this.control.disabled) {\n this.control.enable({ emitEvent: false });\n }\n if (!shouldEnable && this.control.enabled) {\n this.control.disable({ emitEvent: false });\n }\n }\n}\n","import { Component, ElementRef, Input, ViewChild, OnInit, OnChanges, SimpleChanges, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl } from '@angular/forms';\nimport { Subscription } from 'rxjs';\n\nimport { FieldSchema, UploadedFileRef } from '../../../form-core/models';\nimport { FormEngine } from '../../../form-core/form-engine';\nimport { mergeAndNormalize } from '../../style-helpers';\n\n@Component({\n selector: 'app-file-upload-widget',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"w-full pb-4 font-sans\" [class.hidden]=\"!visible\" [ngStyle]=\"getWrapperStyles()\">\n <label [for]=\"fieldId\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n {{ config.label || 'File Upload' }}\n @if (required) {\n <span class=\"text-red-500\" aria-label=\"required\">*</span>\n }\n </label>\n <div class=\"flex flex-col gap-2\">\n <input\n #fileInput\n [id]=\"fieldId\"\n type=\"file\"\n [attr.accept]=\"config.accept || null\"\n [attr.multiple]=\"config.multiple ? '' : null\"\n [disabled]=\"isDisabled\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"!!error\"\n [attr.aria-describedby]=\"getAriaDescribedBy()\"\n class=\"block w-full text-sm text-gray-500 border border-gray-300 rounded-md p-2 file:mr-2 file:py-1 file:px-2 file:rounded file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-1 transition-colors\"\n [class.border-red-300]=\"error\"\n [class.text-red-900]=\"error\"\n [class.focus-visible:ring-red-500]=\"error\"\n (click)=\"onClick()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (change)=\"onFileChange($event)\">\n @if (selectedFiles.length) {\n <div class=\"flex flex-col gap-1 rounded-md border border-gray-200 bg-gray-50 p-2 text-xs text-gray-600\">\n <span class=\"text-[10px] font-semibold uppercase tracking-wide text-gray-400\">Pending upload</span>\n @for (file of selectedFiles; track file.name + '-' + file.size + '-' + file.lastModified) {\n <div class=\"flex items-center justify-between gap-2\">\n <span class=\"truncate\">{{ file.name }}</span>\n <span class=\"text-gray-400\">{{ formatFileSize(file.size) }}</span>\n </div>\n }\n <span class=\"text-[10px] text-gray-400\">Files upload when the form is submitted.</span>\n <button type=\"button\"\n (click)=\"clearSelection()\"\n class=\"self-start text-xs text-gray-500 hover:text-gray-700 transition-colors\">\n Clear selection\n </button>\n </div>\n }\n @if (uploadedFiles.length) {\n <div class=\"flex flex-col gap-1 rounded-md border border-gray-200 bg-white p-2 text-xs text-gray-600\">\n <span class=\"text-[10px] font-semibold uppercase tracking-wide text-gray-400\">Uploaded files</span>\n @for (file of uploadedFiles; track (file.id || file.name || '') + '-' + (file.size || 0)) {\n <div class=\"flex items-center justify-between gap-2\">\n @if (file.url) {\n <a [href]=\"file.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"truncate text-blue-600 hover:text-blue-700 underline\">\n {{ file.name || file.id || 'Uploaded file' }}\n </a>\n } @else {\n <span class=\"truncate\">{{ file.name || file.id || 'Uploaded file' }}</span>\n }\n <span class=\"text-gray-400\">{{ formatUploadedSize(file.size) }}</span>\n </div>\n }\n </div>\n }\n </div>\n @if (error) {\n <p [id]=\"errorId\" class=\"mt-1 text-sm text-red-600\" role=\"alert\" aria-live=\"assertive\">{{ error }}</p>\n } @else if (config.helpText) {\n <p [id]=\"helpTextId\" class=\"mt-1 text-xs text-gray-500\">{{ config.helpText }}</p>\n }\n </div>\n `\n})\nexport class FileUploadWidgetComponent implements OnInit, OnChanges, OnDestroy {\n @Input() readonly config!: FieldSchema;\n @Input() readonly engine?: FormEngine;\n @Input() readonly control = new FormControl();\n\n @ViewChild('fileInput') private readonly fileInput?: ElementRef<HTMLInputElement>;\n\n protected selectedFiles: File[] = [];\n protected uploadedFiles: UploadedFileRef[] = [];\n private engineSub?: Subscription;\n\n ngOnInit() {\n this.uploadedFiles = this.normalizeUploadedRefs(this.config?.defaultValue);\n this.syncFromEngineValue();\n this.bindEngineChanges();\n\n if (this.engine) {\n // Listen for submit attempts to show validation errors\n // (No need to unsubscribe explicitly as engine.submitted$ completes when engine does? \n // Actually engine is persistent. We should track subscription or use takeUntil/destroyRef)\n // But this component uses explicit subscribe/unsubscribe for engine values. \n // Let's add it to bindEngineChanges or just use a one-off subscription that we track?\n // Actually, let's just add it here and let strict mode be happy if we can import DestroyRef or use engineSub approach.\n // FileUploadWidgetComponent does NOT use DestroyRef currently. It subscribes manually.\n // I will add it to bindEngineChanges instead to be cleaner.\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['engine']) {\n this.unbindEngineChanges();\n this.bindEngineChanges();\n }\n if (changes['config']) {\n this.uploadedFiles = this.normalizeUploadedRefs(this.config?.defaultValue);\n this.syncFromEngineValue();\n }\n }\n\n ngOnDestroy() {\n this.unbindEngineChanges();\n }\n\n protected get fieldId(): string {\n return `field-${this.config.id}`;\n }\n\n protected get errorId(): string {\n return `error-${this.config.id}`;\n }\n\n protected get helpTextId(): string {\n return `help-${this.config.id}`;\n }\n\n protected getAriaDescribedBy(): string {\n const ids: string[] = [];\n if (this.error) {\n ids.push(this.errorId);\n } else if (this.config.helpText) {\n ids.push(this.helpTextId);\n }\n return ids.join(' ');\n }\n\n protected getWrapperStyles(): Record<string, any> {\n if (!this.config?.style) return {};\n return mergeAndNormalize({ width: '100%' }, this.config.style);\n }\n\n protected get visible(): boolean {\n return this.engine ? this.engine.isFieldVisible(this.config.id) : true;\n }\n\n protected get enabled(): boolean {\n if (this.config?.disabled) return false;\n return this.engine ? this.engine.isFieldEnabled(this.config.id) : true;\n }\n\n protected get isDisabled(): boolean {\n return !this.enabled || !!this.config?.readonly;\n }\n\n protected get required(): boolean {\n return this.engine ? this.engine.isFieldRequired(this.config.id) : !!this.config?.html5?.required;\n }\n\n protected get error(): string | null {\n if (!this.engine || !this.config.name) return null;\n \n // Only show error if touched or dirty\n // Note: control is public so we can access it\n if (this.control.untouched && this.control.pristine) {\n return null;\n }\n \n return this.engine.getError(this.config.name);\n }\n\n protected onFileChange(event: Event) {\n const input = event.target as HTMLInputElement;\n const files = Array.from(input.files ?? []);\n if (!files.length) {\n this.selectedFiles = [];\n this.updateValue(null);\n return;\n }\n\n const normalized = this.config.multiple ? files : [files[0]];\n this.selectedFiles = normalized;\n this.updateValue(this.config.multiple ? normalized : normalized[0]);\n }\n\n protected clearSelection() {\n if (this.fileInput) {\n this.fileInput.nativeElement.value = '';\n }\n this.selectedFiles = [];\n this.updateValue(this.getUploadedValue());\n }\n\n protected onFocus() {\n if (this.engine) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'focus' });\n }\n }\n\n protected onClick() {\n if (this.engine) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'click' });\n }\n }\n\n protected onBlur() {\n if (this.engine) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'blur' });\n this.control.markAsTouched();\n if (this.control.touched) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'touched' });\n }\n }\n }\n\n protected formatFileSize(size: number): string {\n if (size >= 1024 * 1024) {\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n }\n if (size >= 1024) {\n return `${(size / 1024).toFixed(1)} KB`;\n }\n return `${size} B`;\n }\n\n protected formatUploadedSize(size: number | undefined): string {\n if (typeof size !== 'number' || !Number.isFinite(size)) return '-';\n return this.formatFileSize(size);\n }\n\n private bindEngineChanges() {\n if (!this.engine?.valueChanges$) return;\n this.engineSub = this.engine.valueChanges$.subscribe(() => this.syncFromEngineValue());\n }\n\n private unbindEngineChanges() {\n this.engineSub?.unsubscribe();\n this.engineSub = undefined;\n }\n\n private syncFromEngineValue() {\n if (!this.engine || !this.config?.name) return;\n const value = this.engine.getValue(this.config.name);\n const files = this.extractFiles(value);\n if (files.length > 0) {\n this.selectedFiles = files;\n return;\n }\n\n this.selectedFiles = [];\n const refs = this.normalizeUploadedRefs(value);\n if (refs.length > 0) {\n this.uploadedFiles = refs;\n return;\n }\n\n this.uploadedFiles = this.normalizeUploadedRefs(this.config?.defaultValue);\n }\n\n private extractFiles(value: unknown): File[] {\n if (this.isFile(value)) return [value];\n if (Array.isArray(value) && value.every(entry => this.isFile(entry))) {\n return value as File[];\n }\n return [];\n }\n\n private normalizeUploadedRefs(value: unknown): UploadedFileRef[] {\n if (this.isUploadedRef(value)) return [value];\n if (Array.isArray(value) && value.every(entry => this.isUploadedRef(entry))) {\n return value as UploadedFileRef[];\n }\n return [];\n }\n\n private isFile(value: unknown): value is File {\n return typeof File !== 'undefined' && value instanceof File;\n }\n\n private isUploadedRef(value: unknown): value is UploadedFileRef {\n if (!value || typeof value !== 'object') return false;\n const record = value as Record<string, unknown>;\n return typeof record['id'] === 'string' || typeof record['name'] === 'string' || typeof record['url'] === 'string';\n }\n\n private getUploadedValue(): UploadedFileRef | UploadedFileRef[] | null {\n if (!this.uploadedFiles.length) return null;\n return this.config.multiple ? this.uploadedFiles : (this.uploadedFiles[0] ?? null);\n }\n\n private updateValue(value: File | File[] | UploadedFileRef | UploadedFileRef[] | null) {\n this.control.setValue(value, { emitEvent: false });\n if (this.engine && this.config?.name) {\n this.engine.setValue(this.config.name, value);\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'change', value });\n this.control.markAsDirty();\n if (this.control.dirty) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'dirty' });\n }\n }\n }\n}\n","\nimport { Component, Input, OnInit, OnDestroy, inject, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { FieldSchema, OptionSchema } from '../../../form-core/models';\nimport { FormEngine } from '../../../form-core/form-engine';\nimport { mergeAndNormalize } from '../../style-helpers';\nimport { DataProvider, DATA_PROVIDER, DefaultDataProvider } from '../../../data/data-provider';\nimport { UiIconModule } from '../../../ui/ui-icon.module';\n\n@Component({\n selector: 'app-select-widget',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, UiIconModule],\n template: `\n <div class=\"w-full pb-4 font-sans\" [class.hidden]=\"!visible\" [ngStyle]=\"getWrapperStyles()\">\n <label [for]=\"fieldId\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n {{ config.label }} <span *ngIf=\"required\" class=\"text-red-500\" aria-label=\"required\">*</span>\n </label>\n \n <!-- Search Input -->\n <div *ngIf=\"config.dataConfig?.searchEnabled\" class=\"relative mb-2\">\n <input [formControl]=\"searchControl\" \n type=\"text\" \n [placeholder]=\"'Search ' + (config.label || 'options') + '...'\"\n [attr.aria-label]=\"'Search ' + (config.label || 'options')\"\n class=\"w-full h-8 px-2 pl-8 text-sm border border-gray-300 rounded focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <div class=\"absolute left-2 top-2 text-gray-400\" aria-hidden=\"true\">\n <lucide-icon name=\"search\" class=\"w-4 h-4\"></lucide-icon>\n </div>\n <div *ngIf=\"loading\" class=\"absolute right-2 top-2 text-blue-500 animate-spin\" role=\"status\" aria-live=\"polite\">\n <lucide-icon name=\"loader-2\" class=\"w-4 h-4\"></lucide-icon>\n <span class=\"sr-only\">Loading options...</span>\n </div>\n </div>\n\n <div class=\"relative\">\n <select \n [id]=\"fieldId\"\n [formControl]=\"control\" \n (click)=\"onClick()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"!!error\"\n [attr.aria-describedby]=\"getAriaDescribedBy()\"\n class=\"appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 sm:text-sm transition-colors h-10\"\n [class.border-red-300]=\"error\"\n [class.text-red-900]=\"error\"\n [class.focus:ring-red-500]=\"error\"\n [class.focus:border-red-500]=\"error\">\n <option value=\"\" disabled selected *ngIf=\"config.placeholder\">{{ config.placeholder }}</option>\n <option *ngFor=\"let opt of options\" [value]=\"opt.value\">\n {{ opt.label }}\n </option>\n </select>\n <!-- Custom Chevron -->\n <div class=\"pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-500\" aria-hidden=\"true\">\n <svg class=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n <p *ngIf=\"error\" [id]=\"errorId\" class=\"mt-1 text-sm text-red-600\" role=\"alert\" aria-live=\"assertive\">{{ error }}</p>\n <p *ngIf=\"loadError && !error\" [id]=\"errorId\" class=\"mt-1 text-xs text-red-500\" role=\"alert\" aria-live=\"assertive\">{{ loadError }}</p>\n <p *ngIf=\"config.helpText && !error && !loadError\" [id]=\"helpTextId\" class=\"mt-1 text-xs text-gray-500\">{{ config.helpText }}</p>\n </div>\n `,\n styles: [`.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border-width: 0; }`]\n})\nexport class SelectWidgetComponent implements OnInit, OnDestroy {\n @Input() config!: FieldSchema;\n @Input() engine?: FormEngine;\n @Input() control = new FormControl();\n\n // Search\n searchControl = new FormControl('');\n loading = false;\n loadError: string | null = null;\n private requestId = 0;\n private readonly destroyRef = inject(DestroyRef);\n\n options: OptionSchema[] = [];\n\n private readonly dataProvider = inject<DataProvider>(DATA_PROVIDER, { optional: true }) || inject(DefaultDataProvider);\n\n get fieldId(): string {\n return `field-${this.config.id}`;\n }\n\n get errorId(): string {\n return `error-${this.config.id}`;\n }\n\n get helpTextId(): string {\n return `help-${this.config.id}`;\n }\n\n getAriaDescribedBy(): string {\n const ids: string[] = [];\n if (this.error || this.loadError) {\n ids.push(this.errorId);\n } else if (this.config.helpText) {\n ids.push(this.helpTextId);\n }\n return ids.join(' ');\n }\n\n async ngOnInit() {\n if (this.engine) {\n // Listen for submit attempts to show validation errors\n this.engine.submitted$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.control.markAsTouched();\n this.control.updateValueAndValidity();\n });\n }\n\n this.control.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(val => {\n if (this.engine) {\n this.engine.setValue(this.config.name, val);\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'change', value: val });\n if (this.control.dirty) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'dirty' });\n }\n }\n });\n\n this.syncEnabledState();\n await this.loadOptions();\n\n // Dependencies\n const dependencyIds = this.getDependencyFieldIds();\n if (this.engine) {\n this.engine.valueChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(values => {\n this.syncEnabledState();\n\n if (dependencyIds.length > 0) {\n const schema = this.engine!.getSchema();\n const depNames = schema.fields\n .filter(f => dependencyIds.includes(f.id))\n .map(f => f.name);\n\n const touched = depNames.some(name => name in values);\n if (touched) {\n if (this.searchControl.value) {\n this.searchControl.setValue('', { emitEvent: false });\n }\n this.loadOptions();\n }\n }\n });\n }\n\n // Search Listener\n if (this.config.dataConfig?.searchEnabled) {\n this.searchControl.valueChanges.pipe(\n debounceTime(250),\n distinctUntilChanged(),\n tap(() => this.loading = true),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => {\n this.loadOptions(true); // Search trigger\n });\n }\n }\n\n ngOnDestroy() {\n // Cleanup handled by takeUntilDestroyed\n }\n\n private getDependencyFieldIds(): string[] {\n const cfg = this.config.dataConfig;\n if (!cfg || !cfg.dependsOn || cfg.dependsOn.length === 0) return [];\n return cfg.dependsOn.map(d => d.fieldId).filter((id): id is string => !!id);\n }\n\n private async loadOptions(isSearch = false) {\n if (!this.config) return;\n\n const reqId = ++this.requestId;\n const term = this.searchControl.value || '';\n this.loadError = null;\n\n try {\n let opts: OptionSchema[] = [];\n\n if (this.config.dataConfig?.searchEnabled) {\n opts = await this.dataProvider.queryOptions(this.config, {\n term,\n limit: this.config.dataConfig.optionsLimit\n }, this.engine);\n } else {\n opts = await this.dataProvider.getOptions(this.config, this.engine);\n }\n\n if (this.requestId === reqId) {\n this.options = opts;\n this.loading = false;\n this.loadError = null;\n }\n } catch (e) {\n if (this.requestId === reqId) {\n this.loading = false;\n this.loadError = 'Failed to load options.';\n if (!isSearch) this.options = this.config.staticOptions || [];\n }\n }\n }\n\n getWrapperStyles(): Record<string, any> {\n if (!this.config?.style) return {};\n return mergeAndNormalize({ width: '100%' }, this.config.style);\n }\n\n get visible(): boolean {\n return this.engine ? this.engine.isFieldVisible(this.config.id) : true;\n }\n\n get enabled(): boolean {\n if (this.config?.disabled) return false;\n return this.engine ? this.engine.isFieldEnabled(this.config.id) : true;\n }\n\n get required(): boolean {\n return this.engine ? this.engine.isFieldRequired(this.config.id) : !!this.config?.html5?.required;\n }\n\n get error(): string | null {\n if (!this.engine || !this.config.name) return null;\n\n // Only show error if touched or dirty\n if (this.control.untouched && this.control.pristine) {\n return null;\n }\n\n return this.engine.getError(this.config.name);\n }\n\n onFocus() {\n if (this.engine) this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'focus' });\n }\n\n onClick() {\n if (this.engine) this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'click' });\n }\n\n onBlur() {\n if (this.engine) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'blur' });\n if (this.control.touched) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'touched' });\n }\n }\n }\n\n private syncEnabledState() {\n const shouldEnable = this.enabled;\n if (shouldEnable && this.control.disabled) {\n this.control.enable({ emitEvent: false });\n }\n if (!shouldEnable && this.control.enabled) {\n this.control.disable({ emitEvent: false });\n }\n }\n}\n","/**\n * Utilities for handling tree data structures.\n */\n\nexport interface TreeNode {\n id: string;\n label: string;\n value: any;\n data: any;\n children?: TreeNode[];\n parent?: TreeNode; // Runtime reference, usually circular, beware json stringify\n expanded?: boolean;\n}\n\nexport interface TreeConfig {\n idKey: string;\n parentKey: string;\n labelKey: string;\n valueKey: string;\n rootValue?: any;\n}\n\n/**\n * Builds a hierarchical tree from a flat list of rows.\n */\nexport function buildTree(rows: any[], config: TreeConfig): TreeNode[] {\n const { idKey, parentKey, labelKey, valueKey, rootValue } = config;\n const nodeMap = new Map<any, TreeNode>();\n const roots: TreeNode[] = [];\n\n // 1. Create all nodes\n rows.forEach(row => {\n const id = row[idKey];\n // Skip rows without ID\n if (id === undefined || id === null) return;\n\n const node: TreeNode = {\n id: String(id),\n label: String(row[labelKey] ?? ''),\n value: row[valueKey],\n data: row,\n children: [],\n expanded: false\n };\n nodeMap.set(id, node);\n });\n\n // 2. Link children\n rows.forEach(row => {\n const parentId = row[parentKey];\n const node = nodeMap.get(row[idKey]);\n if (!node) return;\n\n // Check if root\n const isRoot = parentId === undefined || parentId === null || parentId === rootValue || String(parentId) === String(rootValue);\n\n if (isRoot) {\n roots.push(node);\n } else {\n const parent = nodeMap.get(parentId);\n if (parent) {\n if (!parent.children) parent.children = [];\n parent.children.push(node);\n node.parent = parent;\n } else {\n // Orphan, maybe allow as root or discard? \n // Let's treat as root for resilience, or push to roots if strict?\n // Standard behavior: if parent missing, it's a root or orphan.\n // Let's treat as root.\n roots.push(node);\n }\n }\n });\n\n return roots;\n}\n\n/**\n * Filters a tree structure, returning a new tree with only matching nodes and their ancestors.\n * Expand matching paths.\n */\nexport function filterTree(nodes: TreeNode[], term: string): TreeNode[] {\n if (!term) return nodes; // Return as is (or clone?) - pure ref ok\n const lowerTerm = term.toLowerCase();\n\n const filterNode = (node: TreeNode): TreeNode | null => {\n const match = node.label.toLowerCase().includes(lowerTerm);\n\n let filteredChildren: TreeNode[] = [];\n if (node.children) {\n filteredChildren = node.children\n .map(child => filterNode(child))\n .filter((n): n is TreeNode => n !== null);\n }\n\n if (match || filteredChildren.length > 0) {\n return {\n ...node,\n expanded: filteredChildren.length > 0 ? true : node.expanded, // Expand if children matched\n children: filteredChildren\n };\n }\n\n return null;\n };\n\n return nodes\n .map(node => filterNode(node))\n .filter((n): n is TreeNode => n !== null);\n}\n","\nimport { Component, Input, OnInit, OnDestroy, inject, ChangeDetectorRef, ViewChild, ElementRef, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { FieldSchema } from '../../../form-core/models';\nimport { FormEngine } from '../../../form-core/form-engine';\nimport { UiIconModule } from '../../../ui/ui-icon.module';\nimport { DATA_PROVIDER, DefaultDataProvider } from '../../../data/data-provider';\nimport { debounceTime } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { buildTree, filterTree, TreeNode } from '../../../data/tree-utils';\n\n@Component({\n selector: 'app-tree-select',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-1 w-full relative\" [style.width]=\"config.style?.width\" [style.marginBottom.px]=\"config.style?.marginBottom\">\n <!-- Label -->\n <label *ngIf=\"config.label\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n {{ config.label }}\n <span *ngIf=\"isRequired\" class=\"text-red-500\">*</span>\n </label>\n\n <!-- Dropdown Trigger -->\n <div class=\"relative group\" (click)=\"toggleDropdown($event)\">\n <div class=\"flex items-center justify-between w-full rounded-md border text-sm px-3 py-2 cursor-pointer transition-colors\"\n [class.bg-gray-50]=\"config.disabled\"\n [class.cursor-not-allowed]=\"config.disabled\"\n [class.border-gray-300]=\"!isInvalid && !isOpen\"\n [class.border-blue-500]=\"isOpen\"\n [class.ring-2]=\"isOpen\"\n [class.ring-blue-100]=\"isOpen\"\n [class.border-red-500]=\"isInvalid\">\n \n <span *ngIf=\"selectedLabel; else placeholder\" class=\"truncate text-gray-900\">\n {{ selectedLabel }}\n </span>\n <ng-template #placeholder>\n <span class=\"text-gray-400 truncate\">{{ config.placeholder || 'Select...' }}</span>\n </ng-template>\n\n <lucide-icon name=\"chevron-down\" class=\"w-4 h-4 text-gray-400 transition-transform duration-200\" [class.rotate-180]=\"isOpen\"></lucide-icon>\n </div>\n \n <!-- Error State -->\n <div *ngIf=\"isInvalid\" class=\"absolute right-8 top-1/2 -translate-y-1/2 text-red-500 pointer-events-none\">\n <lucide-icon name=\"alert-circle\" class=\"w-4 h-4\"></lucide-icon>\n </div>\n </div>\n \n <!-- Error Message -->\n <p *ngIf=\"errorMessage\" class=\"text-xs text-red-500 min-h-[16px]\">{{ errorMessage }}</p>\n <p *ngIf=\"loadError && !errorMessage\" class=\"text-xs text-red-500 min-h-[16px]\">{{ loadError }}</p>\n <p *ngIf=\"config.helpText && !errorMessage && !loadError\" class=\"text-xs text-gray-500 min-h-[16px]\">{{ config.helpText }}</p>\n\n <!-- Dropdown Panel -->\n <div *ngIf=\"isOpen\" class=\"absolute z-50 top-[calc(100%+8px)] left-0 w-full min-w-[200px] bg-white rounded-lg shadow-xl border border-gray-100 overflow-hidden flex flex-col animate-in fade-in zoom-in-95 duration-100 origin-top\">\n \n <!-- Search -->\n <div *ngIf=\"searchEnabled\" class=\"p-2 border-b border-gray-100 bg-gray-50/50 sticky top-0\" (click)=\"$event.stopPropagation()\">\n <div class=\"relative\">\n <lucide-icon name=\"search\" class=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-gray-400\"></lucide-icon>\n <input #inputSearch type=\"text\" \n [formControl]=\"searchControl\"\n placeholder=\"Search...\" \n class=\"w-full pl-8 pr-3 py-1.5 text-sm border border-gray-200 rounded bg-white focus:outline-none focus:border-blue-400 focus:ring-1 focus:ring-blue-100 transition-all placeholder:text-gray-400\">\n </div>\n </div>\n\n <!-- Tree List -->\n <div class=\"max-h-[250px] overflow-y-auto overflow-x-hidden p-1 custom-scrollbar\">\n <div *ngIf=\"loadError\" class=\"p-4 text-center text-red-500 text-xs italic\">\n {{ loadError }}\n </div>\n <div *ngIf=\"!loadError && tree.length === 0\" class=\"p-4 text-center text-gray-400 text-xs italic\">\n {{ isLoading ? 'Loading...' : (searchControl.value ? 'No matches found.' : 'No options available.') }}\n </div>\n\n <ng-container *ngFor=\"let node of displayTree\">\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: node, level: 0 }\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <!-- Recursive Node Template -->\n <ng-template #nodeTpl let-node let-level=\"level\">\n <div class=\"select-none\">\n <div class=\"flex items-center gap-1 px-2 py-1.5 rounded text-sm cursor-pointer transition-colors\"\n [class.bg-blue-50]=\"node.id === selectedId\"\n [class.text-blue-700]=\"node.id === selectedId\"\n [class.hover:bg-gray-100]=\"node.id !== selectedId\"\n [style.paddingLeft.px]=\"level * 16 + 8\"\n (click)=\"selectNode(node, $event)\">\n \n <!-- Expander -->\n <button type=\"button\" \n class=\"p-0.5 rounded hover:bg-black/5 text-gray-400 flex items-center justify-center w-5 h-5 shrink-0 transition-transform\"\n [class.invisible]=\"!node.children?.length\"\n (click)=\"toggleExpand(node, $event)\">\n <lucide-icon name=\"chevron-right\" class=\"w-3.5 h-3.5 transition-transform duration-200\" [class.rotate-90]=\"isExpanded(node)\"></lucide-icon>\n </button>\n\n <span class=\"truncate\">{{ node.label }}</span>\n \n <lucide-icon *ngIf=\"node.id === selectedId\" name=\"check\" class=\"ml-auto w-3.5 h-3.5 text-blue-600 shrink-0\"></lucide-icon>\n </div>\n\n <!-- Children -->\n <div *ngIf=\"node.children?.length && isExpanded(node)\" class=\"animate-in slide-in-from-top-1 duration-100\">\n <ng-container *ngFor=\"let child of node.children\">\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: child, level: level + 1 }\"></ng-container>\n </ng-container>\n </div>\n </div>\n </ng-template>\n `\n})\nexport class TreeSelectWidgetComponent implements OnInit, OnDestroy {\n @Input() config!: FieldSchema;\n @Input() engine?: FormEngine;\n @Input() control = new FormControl();\n\n @ViewChild('inputSearch') searchInput?: ElementRef<HTMLInputElement>;\n\n private dataProvider = inject(DATA_PROVIDER, { optional: true }) || inject(DefaultDataProvider);\n private cdr = inject(ChangeDetectorRef);\n private readonly destroyRef = inject(DestroyRef);\n private rawList: any[] = []; // Full flat list from provider\n\n tree: TreeNode[] = [];\n displayTree: TreeNode[] = []; // Filtered tree for display\n isLoading = false;\n isOpen = false;\n\n selectedId: string | null = null;\n selectedLabel: string | null = null;\n expandedIds = new Set<string>();\n\n searchControl = new FormControl('');\n loadError: string | null = null;\n private hasFocus = false;\n\n constructor(private el: ElementRef) {\n // Close on click outside - handled in ngOnDestroy\n }\n\n ngOnInit() {\n document.addEventListener('click', this.onDocumentClick);\n \n if (this.engine) {\n // Listen for submit attempts to show validation errors\n this.engine.submitted$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.control.markAsTouched();\n this.control.updateValueAndValidity();\n });\n }\n\n // Load data initially\n this.loadData();\n\n // Listen for form value changes (external updates)\n this.control.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(val => {\n this.updateSelectionFromValue(val);\n });\n\n // Listen for dependencies\n if (this.engine) {\n this.engine.valueChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((vals) => {\n const dependsOn = this.config.dataConfig?.dependsOn;\n if (dependsOn?.length) {\n const shouldReload = dependsOn.some(dep => {\n return true;\n });\n if (shouldReload) this.loadData();\n }\n });\n }\n\n // Search logic\n if (this.searchEnabled) {\n this.searchControl.valueChanges\n .pipe(\n debounceTime(200),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(term => {\n this.filter(term || '');\n });\n }\n }\n\n ngOnDestroy() {\n // Cleanup handled by takeUntilDestroyed\n document.removeEventListener('click', this.onDocumentClick);\n }\n\n private onDocumentClick = (event: MouseEvent) => {\n if (!this.el.nativeElement.contains(event.target)) {\n this.closeDropdown();\n this.cdr.markForCheck();\n }\n };\n\n async loadData() {\n this.isLoading = true;\n this.loadError = null;\n\n try {\n this.rawList = await this.dataProvider.getList(this.config, this.engine);\n this.build(this.rawList);\n this.updateSelectionFromValue(this.control.value);\n this.loadError = null;\n } catch (e) {\n this.tree = [];\n this.displayTree = [];\n this.loadError = 'Failed to load options.';\n } finally {\n this.isLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private build(rows: any[]) {\n const cfg = this.config.dataConfig || { type: 'static' };\n\n const opts = {\n idKey: cfg.treeIdKey || cfg.valueKey || 'id',\n parentKey: cfg.treeParentKey || 'parentId',\n labelKey: cfg.labelKey || 'label',\n valueKey: cfg.valueKey || 'value',\n rootValue: cfg.treeRootValue\n };\n\n this.tree = buildTree(rows, opts);\n\n // Initial Display = Full Tree\n // If we want to restore expanded state, we could, but rebuilding usually resets or we need to map IDs.\n // For now, reset display.\n this.displayTree = this.tree;\n }\n\n private filter(term: string) {\n if (!term) {\n this.displayTree = this.tree;\n return;\n }\n\n const filtered = filterTree(this.tree, term);\n this.displayTree = filtered;\n\n // Auto-expand all nodes in filtered result\n const expandRecursive = (nodes: TreeNode[]) => {\n for (const n of nodes) {\n this.expandedIds.add(n.id);\n if (n.children) expandRecursive(n.children);\n }\n };\n expandRecursive(filtered);\n }\n\n toggleDropdown(e: Event) {\n if (this.config.disabled || this.config.readonly) return;\n this.engine?.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'click' });\n if (this.isOpen) {\n this.closeDropdown();\n } else {\n this.openDropdown();\n }\n }\n\n isExpanded(node: TreeNode): boolean {\n return this.expandedIds.has(node.id);\n }\n\n toggleExpand(node: TreeNode, e: Event) {\n e.stopPropagation();\n if (this.expandedIds.has(node.id)) {\n this.expandedIds.delete(node.id);\n } else {\n this.expandedIds.add(node.id);\n }\n }\n\n selectNode(node: TreeNode, e: Event) {\n e.stopPropagation();\n this.selectedId = node.id;\n this.selectedLabel = node.label;\n this.closeDropdown();\n\n this.control.setValue(node.value);\n this.control.markAsDirty();\n this.engine?.setValue(this.config.name, node.value);\n\n this.engine?.emitUiEvent({\n fieldId: this.config.id,\n fieldName: this.config.name,\n type: 'change',\n value: node.value\n });\n if (this.control.dirty) {\n this.engine?.emitUiEvent({\n fieldId: this.config.id,\n fieldName: this.config.name,\n type: 'dirty'\n });\n }\n }\n\n private updateSelectionFromValue(val: any) {\n // Find node in raw list or tree to get label\n // We need a flat map for quick lookup usually, but iterating rawList is fine for small sets\n if (val === null || val === undefined || val === '') {\n this.selectedId = null;\n this.selectedLabel = null;\n return;\n }\n\n const cfg: any = this.config.dataConfig || {};\n const valueKey = cfg.valueKey || 'value';\n const labelKey = cfg.labelKey || 'label';\n const idKey = cfg.treeIdKey || valueKey || 'id';\n\n const match = this.rawList.find(r => r[valueKey] == val); // loose equality\n if (match) {\n this.selectedId = String(match[idKey]);\n this.selectedLabel = String(match[labelKey]);\n // Also ensure all parents are expanded?\n // To do that we need parent pointers or search the tree structure.\n // Skipping auto-expand on value set for V1.\n }\n }\n\n get isInvalid() {\n return this.control.invalid && this.control.touched;\n }\n\n get isRequired() {\n return this.engine?.isFieldRequired(this.config.id) ?? this.config.html5?.required;\n }\n\n get errorMessage() {\n if (!this.engine?.getError(this.config.name)) return null;\n // Only show error if touched or dirty\n if (this.control.untouched && this.control.pristine) {\n return null;\n }\n return this.engine.getError(this.config.name);\n }\n\n get searchEnabled() {\n return !!this.config?.dataConfig?.searchEnabled;\n }\n\n private openDropdown() {\n this.isOpen = true;\n if (!this.hasFocus) {\n this.engine?.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'focus' });\n this.hasFocus = true;\n }\n if (this.searchEnabled) {\n setTimeout(() => this.searchInput?.nativeElement.focus(), 100);\n }\n }\n\n private closeDropdown() {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.control.markAsTouched();\n if (this.hasFocus) {\n this.engine?.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'blur' });\n if (this.control.touched) {\n this.engine?.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'touched' });\n }\n this.hasFocus = false;\n }\n }\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, OnDestroy, inject, DestroyRef, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { FieldSchema, OptionSchema } from '../../../form-core/models';\nimport { FormEngine } from '../../../form-core/form-engine';\nimport { mergeAndNormalize } from '../../style-helpers';\nimport { DataProvider, DATA_PROVIDER, DefaultDataProvider } from '../../../data/data-provider';\n\n@Component({\n selector: 'app-radio-widget',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n template: `\n <div class=\"w-full pb-4 font-sans\" [class.hidden]=\"!visible\" [ngStyle]=\"getWrapperStyles()\">\n <label [id]=\"labelId\" class=\"block text-sm font-medium text-gray-700 mb-2\">\n {{ config.label }} <span *ngIf=\"required\" class=\"text-red-500\" aria-label=\"required\">*</span>\n </label>\n \n <div class=\"space-y-2\" role=\"radiogroup\" [attr.aria-labelledby]=\"labelId\" [attr.aria-describedby]=\"getAriaDescribedBy()\">\n <div *ngFor=\"let opt of options; let i = index\" class=\"flex items-center\">\n <input \n [id]=\"getFieldId(i)\"\n type=\"radio\"\n [formControl]=\"control\"\n [value]=\"opt.value\"\n [name]=\"config.name || fieldId\"\n (click)=\"onClick()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"!!error\"\n class=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\">\n <label [for]=\"getFieldId(i)\" class=\"ml-2 block text-sm text-gray-700 cursor-pointer select-none\">\n {{ opt.label }}\n </label>\n </div>\n <div *ngIf=\"options.length === 0\" class=\"text-xs text-gray-400 italic\">No options available</div>\n </div>\n\n <p *ngIf=\"error\" [id]=\"errorId\" class=\"mt-1 text-sm text-red-600\" role=\"alert\" aria-live=\"assertive\">{{ error }}</p>\n <p *ngIf=\"loadError && !error\" [id]=\"errorId\" class=\"mt-1 text-xs text-red-500\" role=\"alert\" aria-live=\"assertive\">{{ loadError }}</p>\n <p *ngIf=\"config.helpText && !error && !loadError\" [id]=\"helpTextId\" class=\"mt-1 text-xs text-gray-500\">{{ config.helpText }}</p>\n </div>\n `\n})\nexport class RadioWidgetComponent implements OnInit, OnChanges, OnDestroy {\n @Input() config!: FieldSchema;\n @Input() engine?: FormEngine;\n @Input() control = new FormControl();\n\n loading = false;\n loadError: string | null = null;\n private requestId = 0;\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n options: OptionSchema[] = [];\n\n private readonly dataProvider = inject<DataProvider>(DATA_PROVIDER, { optional: true }) || inject(DefaultDataProvider);\n\n get fieldId(): string {\n return `field-${this.config.id}`;\n }\n\n getFieldId(index: number): string {\n return `${this.fieldId}-${index}`;\n }\n\n get labelId(): string {\n return `label-${this.config.id}`;\n }\n\n get errorId(): string {\n return `error-${this.config.id}`;\n }\n\n get helpTextId(): string {\n return `help-${this.config.id}`;\n }\n\n getAriaDescribedBy(): string {\n const ids: string[] = [];\n if (this.error || this.loadError) {\n ids.push(this.errorId);\n } else if (this.config.helpText) {\n ids.push(this.helpTextId);\n }\n return ids.join(' ');\n }\n\n async ngOnInit() {\n this.control.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(val => {\n if (this.engine) {\n this.engine.setValue(this.config.name, val);\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'change', value: val });\n if (this.control.dirty) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'dirty' });\n }\n }\n });\n\n this.syncEnabledState();\n await this.loadOptions();\n\n // Dependencies\n const dependencyIds = this.getDependencyFieldIds();\n if (this.engine) {\n this.engine.valueChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(values => {\n this.syncEnabledState();\n\n if (dependencyIds.length > 0) {\n const schema = this.engine!.getSchema();\n const depNames = schema.fields\n .filter(f => dependencyIds.includes(f.id))\n .map(f => f.name);\n\n const touched = depNames.some(name => name in values);\n if (touched) {\n this.loadOptions();\n }\n }\n });\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadOptions();\n }\n }\n\n ngOnDestroy() {\n // Cleanup handled by takeUntilDestroyed\n }\n\n private getDependencyFieldIds(): string[] {\n const cfg = this.config.dataConfig;\n if (!cfg || !cfg.dependsOn || cfg.dependsOn.length === 0) return [];\n return cfg.dependsOn.map(d => d.fieldId).filter((id): id is string => !!id);\n }\n\n private async loadOptions() {\n if (!this.config) return;\n\n const reqId = ++this.requestId;\n this.loadError = null;\n\n try {\n let opts: OptionSchema[] = [];\n \n // Radio doesn't typically support search, so just get options\n opts = await this.dataProvider.getOptions(this.config, this.engine);\n\n if (this.requestId === reqId) {\n this.options = opts;\n this.loading = false;\n this.loadError = null;\n this.cdr.markForCheck();\n }\n } catch (e) {\n if (this.requestId === reqId) {\n this.loading = false;\n this.loadError = 'Failed to load options.';\n this.options = this.config.staticOptions || [];\n this.cdr.markForCheck();\n }\n }\n }\n\n getWrapperStyles(): Record<string, any> {\n if (!this.config?.style) return {};\n return mergeAndNormalize({ width: '100%' }, this.config.style);\n }\n\n get visible(): boolean {\n return this.engine ? this.engine.isFieldVisible(this.config.id) : true;\n }\n\n get enabled(): boolean {\n if (this.config?.disabled) return false;\n return this.engine ? this.engine.isFieldEnabled(this.config.id) : true;\n }\n\n get required(): boolean {\n return this.engine ? this.engine.isFieldRequired(this.config.id) : !!this.config?.html5?.required;\n }\n\n get error(): string | null {\n if (!this.engine || !this.config.name) return null;\n return this.engine.getError(this.config.name);\n }\n\n onFocus() {\n if (this.engine) this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'focus' });\n }\n\n onClick() {\n if (this.engine) this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'click' });\n }\n\n onBlur() {\n if (this.engine) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'blur' });\n if (this.control.touched) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'touched' });\n }\n }\n }\n\n private syncEnabledState() {\n const shouldEnable = this.enabled;\n if (shouldEnable && this.control.disabled) {\n this.control.enable({ emitEvent: false });\n }\n if (!shouldEnable && this.control.enabled) {\n this.control.disable({ emitEvent: false });\n }\n }\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, OnDestroy, inject, DestroyRef, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { FieldSchema, OptionSchema } from '../../../form-core/models';\nimport { FormEngine } from '../../../form-core/form-engine';\nimport { mergeAndNormalize } from '../../style-helpers';\nimport { DataProvider, DATA_PROVIDER, DefaultDataProvider } from '../../../data/data-provider';\n\n@Component({\n selector: 'app-checkbox-group-widget',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n template: `\n <div class=\"w-full pb-4 font-sans\" [class.hidden]=\"!visible\" [ngStyle]=\"getWrapperStyles()\">\n <label [id]=\"labelId\" class=\"block text-sm font-medium text-gray-700 mb-2\">\n {{ config.label }} <span *ngIf=\"required\" class=\"text-red-500\" aria-label=\"required\">*</span>\n </label>\n \n <div class=\"space-y-2\" role=\"group\" [attr.aria-labelledby]=\"labelId\" [attr.aria-describedby]=\"getAriaDescribedBy()\">\n <div *ngFor=\"let opt of options; let i = index\" class=\"flex items-center\">\n <input \n [id]=\"getFieldId(i)\"\n type=\"checkbox\"\n [value]=\"opt.value\"\n [checked]=\"isChecked(opt.value)\"\n (change)=\"onCheckChange($event, opt.value)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n [disabled]=\"!enabled\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"!!error\"\n class=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\">\n <label [for]=\"getFieldId(i)\" class=\"ml-2 block text-sm text-gray-700 cursor-pointer select-none\">\n {{ opt.label }}\n </label>\n </div>\n <div *ngIf=\"options.length === 0\" class=\"text-xs text-gray-400 italic\">No options available</div>\n </div>\n\n <p *ngIf=\"error\" [id]=\"errorId\" class=\"mt-1 text-sm text-red-600\" role=\"alert\" aria-live=\"assertive\">{{ error }}</p>\n <p *ngIf=\"loadError && !error\" [id]=\"errorId\" class=\"mt-1 text-xs text-red-500\" role=\"alert\" aria-live=\"assertive\">{{ loadError }}</p>\n <p *ngIf=\"config.helpText && !error && !loadError\" [id]=\"helpTextId\" class=\"mt-1 text-xs text-gray-500\">{{ config.helpText }}</p>\n </div>\n `\n})\nexport class CheckboxGroupWidgetComponent implements OnInit, OnChanges, OnDestroy {\n @Input() config!: FieldSchema;\n @Input() engine?: FormEngine;\n @Input() control = new FormControl<any[]>([]); // Array for multi-select\n\n loading = false;\n loadError: string | null = null;\n private requestId = 0;\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n options: OptionSchema[] = [];\n\n private readonly dataProvider = inject<DataProvider>(DATA_PROVIDER, { optional: true }) || inject(DefaultDataProvider);\n\n get fieldId(): string {\n return `field-${this.config.id}`;\n }\n\n getFieldId(index: number): string {\n return `${this.fieldId}-${index}`;\n }\n\n get labelId(): string {\n return `label-${this.config.id}`;\n }\n\n get errorId(): string {\n return `error-${this.config.id}`;\n }\n\n get helpTextId(): string {\n return `help-${this.config.id}`;\n }\n\n getAriaDescribedBy(): string {\n const ids: string[] = [];\n if (this.error || this.loadError) {\n ids.push(this.errorId);\n } else if (this.config.helpText) {\n ids.push(this.helpTextId);\n }\n return ids.join(' ');\n }\n\n async ngOnInit() {\n this.control.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(val => {\n if (this.engine) {\n this.engine.setValue(this.config.name, val);\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'change', value: val });\n if (this.control.dirty) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'dirty' });\n }\n }\n });\n\n // this.syncEnabledState(); // Checkboxes individually disabled via [disabled] binding\n await this.loadOptions();\n\n // Dependencies\n const dependencyIds = this.getDependencyFieldIds();\n if (this.engine) {\n this.engine.valueChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(values => {\n // this.syncEnabledState();\n\n if (dependencyIds.length > 0) {\n const schema = this.engine!.getSchema();\n const depNames = schema.fields\n .filter(f => dependencyIds.includes(f.id))\n .map(f => f.name);\n\n const touched = depNames.some(name => name in values);\n if (touched) {\n this.loadOptions();\n }\n }\n });\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadOptions();\n }\n }\n\n ngOnDestroy() {\n // Cleanup handled by takeUntilDestroyed\n }\n\n private getDependencyFieldIds(): string[] {\n const cfg = this.config.dataConfig;\n if (!cfg || !cfg.dependsOn || cfg.dependsOn.length === 0) return [];\n return cfg.dependsOn.map(d => d.fieldId).filter((id): id is string => !!id);\n }\n\n private async loadOptions() {\n if (!this.config) return;\n\n const reqId = ++this.requestId;\n this.loadError = null;\n\n try {\n let opts: OptionSchema[] = [];\n opts = await this.dataProvider.getOptions(this.config, this.engine);\n\n if (this.requestId === reqId) {\n this.options = opts;\n this.loading = false;\n this.loadError = null;\n this.cdr.markForCheck();\n }\n } catch (e) {\n if (this.requestId === reqId) {\n this.loading = false;\n this.loadError = 'Failed to load options.';\n this.options = this.config.staticOptions || [];\n this.cdr.markForCheck();\n }\n }\n }\n\n isChecked(value: any): boolean {\n const current = this.control.value;\n if (Array.isArray(current)) {\n return current.includes(value);\n }\n return false;\n }\n\n onCheckChange(event: any, value: any) {\n const checked = event.target.checked;\n const current = Array.isArray(this.control.value) ? [...this.control.value] : [];\n \n if (checked) {\n if (!current.includes(value)) {\n current.push(value);\n }\n } else {\n const index = current.indexOf(value);\n if (index > -1) {\n current.splice(index, 1);\n }\n }\n \n this.control.setValue(current);\n this.control.markAsDirty();\n this.control.markAsTouched();\n }\n\n getWrapperStyles(): Record<string, any> {\n if (!this.config?.style) return {};\n return mergeAndNormalize({ width: '100%' }, this.config.style);\n }\n\n get visible(): boolean {\n return this.engine ? this.engine.isFieldVisible(this.config.id) : true;\n }\n\n get enabled(): boolean {\n if (this.config?.disabled) return false;\n return this.engine ? this.engine.isFieldEnabled(this.config.id) : true;\n }\n\n get required(): boolean {\n return this.engine ? this.engine.isFieldRequired(this.config.id) : !!this.config?.html5?.required;\n }\n\n get error(): string | null {\n if (!this.engine || !this.config.name) return null;\n return this.engine.getError(this.config.name);\n }\n\n onFocus() {\n if (this.engine) this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'focus' });\n }\n\n onClick() {\n if (this.engine) this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'click' });\n }\n\n onBlur() {\n if (this.engine) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'blur' });\n if (this.control.touched) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'touched' });\n }\n }\n }\n}\n","import { Component, Input, OnInit, OnDestroy, inject, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { FieldSchema } from '../../../form-core/models';\nimport { FormEngine } from '../../../form-core/form-engine';\nimport { mergeAndNormalize } from '../../style-helpers';\n\n@Component({\n selector: 'app-checkbox-widget',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n template: `\n <div class=\"w-full pb-4 font-sans\" [class.hidden]=\"!visible\" [ngStyle]=\"getWrapperStyles()\">\n <div class=\"flex items-start\">\n <div class=\"flex items-center h-5\">\n <input\n [id]=\"fieldId\"\n type=\"checkbox\"\n [formControl]=\"control\"\n (click)=\"onClick()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"!!error\"\n [attr.aria-describedby]=\"getAriaDescribedBy()\"\n class=\"focus:ring-blue-500 h-4 w-4 text-blue-600 border-gray-300 rounded\"\n [class.border-red-300]=\"error\"\n [class.focus:ring-red-500]=\"error\">\n </div>\n <div class=\"ml-2 text-sm\">\n <label [for]=\"fieldId\" class=\"font-medium text-gray-700 select-none cursor-pointer\">\n {{ config.label }} <span *ngIf=\"required\" class=\"text-red-500\" aria-label=\"required\">*</span>\n </label>\n </div>\n </div>\n\n <p *ngIf=\"error\" [id]=\"errorId\" class=\"mt-1 text-sm text-red-600\" role=\"alert\" aria-live=\"assertive\">{{ error }}</p>\n <p *ngIf=\"config.helpText && !error\" [id]=\"helpTextId\" class=\"mt-1 text-xs text-gray-500\">{{ config.helpText }}</p>\n </div>\n `\n})\nexport class CheckboxWidgetComponent implements OnInit, OnDestroy {\n @Input() config!: FieldSchema;\n @Input() engine?: FormEngine;\n @Input() control = new FormControl(false);\n\n private readonly destroyRef = inject(DestroyRef);\n\n get fieldId(): string {\n return `field-${this.config.id}`;\n }\n\n get errorId(): string {\n return `error-${this.config.id}`;\n }\n\n get helpTextId(): string {\n return `help-${this.config.id}`;\n }\n\n getAriaDescribedBy(): string {\n const ids: string[] = [];\n if (this.error) {\n ids.push(this.errorId);\n } else if (this.config.helpText) {\n ids.push(this.helpTextId);\n }\n return ids.join(' ');\n }\n\n ngOnInit() {\n this.control.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(val => {\n if (this.engine) {\n this.engine.setValue(this.config.name, val);\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'change', value: val });\n if (this.control.dirty) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'dirty' });\n }\n }\n });\n\n this.syncEnabledState();\n\n if (this.engine) {\n this.engine.valueChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.syncEnabledState();\n });\n }\n }\n\n ngOnDestroy() {\n // Cleanup handled by takeUntilDestroyed\n }\n\n getWrapperStyles(): Record<string, any> {\n if (!this.config?.style) return {};\n return mergeAndNormalize({ width: '100%' }, this.config.style);\n }\n\n get visible(): boolean {\n return this.engine ? this.engine.isFieldVisible(this.config.id) : true;\n }\n\n get enabled(): boolean {\n if (this.config?.disabled) return false;\n return this.engine ? this.engine.isFieldEnabled(this.config.id) : true;\n }\n\n get required(): boolean {\n return this.engine ? this.engine.isFieldRequired(this.config.id) : !!this.config?.html5?.required;\n }\n\n get error(): string | null {\n if (!this.engine || !this.config.name) return null;\n return this.engine.getError(this.config.name);\n }\n\n onFocus() {\n if (this.engine) this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'focus' });\n }\n\n onClick() {\n if (this.engine) this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'click' });\n }\n\n onBlur() {\n if (this.engine) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'blur' });\n if (this.control.touched) {\n this.engine.emitUiEvent({ fieldId: this.config.id, fieldName: this.config.name, type: 'touched' });\n }\n }\n }\n\n private syncEnabledState() {\n const shouldEnable = this.enabled;\n if (shouldEnable && this.control.disabled) {\n this.control.enable({ emitEvent: false });\n }\n if (!shouldEnable && this.control.enabled) {\n this.control.disable({ emitEvent: false });\n }\n }\n}\n","import { Component, Input, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { mergeAndNormalize } from '../style-helpers';\nimport { WIDGET_PAGE_LINKS } from '../page-link-context';\n\n@Component({\n selector: 'app-button-widget',\n standalone: true,\n imports: [CommonModule],\n template: `\n <ng-container *ngIf=\"linkHref(); else btn\">\n <a [href]=\"linkHref()\"\n [attr.target]=\"linkTarget()\"\n [attr.rel]=\"linkRel()\"\n (click)=\"onLinkClick($event)\"\n [ngClass]=\"getClasses()\"\n [ngStyle]=\"getStyles()\">\n {{ config?.label }}\n </a>\n </ng-container>\n <ng-template #btn>\n <button [attr.type]=\"getButtonType()\" \n (click)=\"onClick()\"\n [ngClass]=\"getClasses()\"\n [ngStyle]=\"getStyles()\">\n <ng-container *ngIf=\"config?.buttonType === 'image' && config?.imageSrc; else labelTpl\">\n <img [src]=\"config.imageSrc\" [alt]=\"config.alt || config.label || 'Button image'\" class=\"max-h-10 object-contain\">\n </ng-container>\n <ng-template #labelTpl>{{ config?.label }}</ng-template>\n </button>\n </ng-template>\n `\n})\nexport class ButtonWidgetComponent {\n private readonly router = inject(Router, { optional: true });\n private readonly pageLinks = inject(WIDGET_PAGE_LINKS, { optional: true });\n\n @Input() config: any;\n @Input() engine?: any;\n @Input() control?: any;\n\n getClasses() {\n const variant = this.config?.variant || 'primary';\n const base = 'inline-flex items-center px-4 py-2 border text-sm font-medium rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors';\n\n if (variant === 'secondary') {\n return `${base} border-gray-300 text-gray-700 bg-white hover:bg-gray-50 focus:ring-blue-500`;\n }\n // primary\n return `${base} border-transparent text-white bg-blue-600 hover:bg-blue-700 focus:ring-blue-500`;\n }\n\n getStyles() {\n return mergeAndNormalize(\n {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center'\n },\n this.config?.style\n );\n }\n\n getButtonType(): 'button' | 'submit' | 'reset' {\n if (this.config?.buttonType === 'submit') return 'submit';\n if (this.config?.buttonType === 'reset') return 'reset';\n return 'button';\n }\n\n linkHref(): string {\n const type = this.getLinkType();\n if (type === 'none') return '';\n\n if (type === 'page') {\n const pageId = this.config?.pageId;\n if (!pageId) return '';\n if (pageId && this.pageLinks) {\n const match = this.pageLinks().find(page => page.id === pageId);\n if (match?.route) return match.route;\n }\n }\n\n return this.config?.href ?? '';\n }\n\n linkTarget(): string | null {\n return this.openInNewTab() ? '_blank' : null;\n }\n\n linkRel(): string | null {\n return this.openInNewTab() ? 'noopener noreferrer' : null;\n }\n\n onLinkClick(event: MouseEvent) {\n this.onClick();\n const href = this.linkHref();\n if (!href) return;\n if (this.openInNewTab()) return;\n if (!this.router) return;\n if (!this.isInternalLink(href)) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0) return;\n\n event.preventDefault();\n this.router.navigateByUrl(href);\n }\n\n onClick() {\n if (this.engine) {\n this.engine.emitUiEvent({\n fieldId: this.config?.id,\n fieldName: this.config?.name,\n type: 'click',\n value: this.config?.name || this.config?.id\n });\n }\n }\n\n private openInNewTab(): boolean {\n return this.config?.openInNewTab === true;\n }\n\n private getLinkType(): 'none' | 'page' | 'url' {\n const explicit = this.config?.linkType as 'none' | 'page' | 'url' | undefined;\n if (explicit) return explicit;\n if (this.config?.pageId) return 'page';\n return this.config?.href ? 'url' : 'none';\n }\n\n private isInternalLink(href: string): boolean {\n return href.startsWith('/') && !href.startsWith('//');\n }\n}\n","import { PropertyField, PropertySection } from './widget-definition';\n\n// ============================================================================\n// LAYOUT FIELDS (Figma-like: size + alignment)\n// ============================================================================\n\nexport const LAYOUT_FIELDS: PropertyField[] = [\n {\n key: 'style.size',\n label: 'Size',\n type: 'dimension',\n placeholder: 'Auto',\n options: [\n { label: 'Width', value: 'style.width' },\n { label: 'Height', value: 'style.height' }\n ]\n },\n {\n key: 'style.minWidth',\n label: 'Min Width',\n type: 'text',\n placeholder: '0'\n },\n {\n key: 'style.minHeight',\n label: 'Min Height',\n type: 'text',\n placeholder: '0'\n },\n {\n key: 'style.alignX',\n label: 'Horizontal Align',\n type: 'select-icon',\n options: [\n { label: 'Left', value: 'left', icon: 'align-horizontal-justify-start' },\n { label: 'Center', value: 'center', icon: 'align-horizontal-justify-center' },\n { label: 'Right', value: 'right', icon: 'align-horizontal-justify-end' },\n { label: 'Stretch', value: 'stretch', icon: 'align-horizontal-space-between' }\n ]\n },\n {\n key: 'style.alignY',\n label: 'Vertical Align',\n type: 'select-icon',\n options: [\n { label: 'Top', value: 'top', icon: 'align-vertical-justify-start' },\n { label: 'Middle', value: 'middle', icon: 'align-vertical-justify-center' },\n { label: 'Bottom', value: 'bottom', icon: 'align-vertical-justify-end' },\n { label: 'Stretch', value: 'stretch', icon: 'align-vertical-space-between' }\n ]\n }\n];\n\n// ============================================================================\n// SPACING (Margin / Padding / Border / Size)\n// ============================================================================\n\nexport const SPACING_MARGIN_FIELDS: PropertyField[] = [\n {\n key: 'style.margin',\n label: 'Margin',\n type: 'edge-box',\n options: [\n { label: 'Top', value: 'style.marginTop' },\n { label: 'Right', value: 'style.marginRight' },\n { label: 'Bottom', value: 'style.marginBottom' },\n { label: 'Left', value: 'style.marginLeft' }\n ]\n }\n];\n\nexport const SPACING_PADDING_FIELDS: PropertyField[] = [\n {\n key: 'style.padding',\n label: 'Padding',\n type: 'edge-box',\n options: [\n { label: 'Top', value: 'style.paddingTop' },\n { label: 'Right', value: 'style.paddingRight' },\n { label: 'Bottom', value: 'style.paddingBottom' },\n { label: 'Left', value: 'style.paddingLeft' }\n ]\n }\n];\n\nexport const SPACING_BOX_MODEL_FIELD: PropertyField = {\n key: 'style',\n label: 'Box Model',\n type: 'box-model',\n allowedUnits: ['px', '%', 'rem', 'em']\n};\n\n// ============================================================================\n// APPEARANCE FIELDS (Fill, stroke, radius)\n// ============================================================================\n\nexport const APPEARANCE_FIELDS: PropertyField[] = [\n {\n key: 'style.backgroundColor',\n label: 'Fill Color',\n type: 'color-swatch',\n placeholder: '#FFFFFF'\n },\n {\n key: 'style.color',\n label: 'Text Color',\n type: 'color-swatch',\n placeholder: '#0F172A'\n },\n {\n key: 'style.borderColor',\n label: 'Border Color',\n type: 'color-swatch',\n placeholder: '#CBD5E1'\n },\n {\n key: 'style.borderWidth',\n label: 'Border Width',\n type: 'number',\n min: 0,\n placeholder: '0'\n },\n {\n key: 'style.borderRadius',\n label: 'Radius',\n type: 'number',\n min: 0,\n placeholder: '0'\n },\n {\n key: 'style.borderStyle',\n label: 'Border Style',\n type: 'select',\n options: [\n { label: 'None', value: 'none' },\n { label: 'Solid', value: 'solid' },\n { label: 'Dashed', value: 'dashed' },\n { label: 'Dotted', value: 'dotted' }\n ]\n }\n];\n\n// ============================================================================\n// TYPOGRAPHY FIELDS\n// ============================================================================\n\nexport const TYPOGRAPHY_FIELDS: PropertyField[] = [\n {\n key: 'style.fontSize',\n label: 'Font Size',\n type: 'number',\n placeholder: '16'\n },\n {\n key: 'style.fontWeight',\n label: 'Font Weight',\n type: 'select',\n options: [\n { label: 'Normal (400)', value: '400' },\n { label: 'Medium (500)', value: '500' },\n { label: 'Semi Bold (600)', value: '600' },\n { label: 'Bold (700)', value: '700' }\n ]\n },\n {\n key: 'style.lineHeight',\n label: 'Line Height',\n type: 'text',\n placeholder: '1.5'\n },\n {\n key: 'style.textAlign',\n label: 'Text Align',\n type: 'select',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Center', value: 'center' },\n { label: 'Right', value: 'right' },\n { label: 'Justify', value: 'justify' }\n ]\n }\n];\n\n// ============================================================================\n// TRANSFORM FIELDS\n// ============================================================================\n\nexport const TRANSFORM_FIELDS: PropertyField[] = [\n {\n key: 'style.transformX',\n label: 'Transform X',\n type: 'range-number',\n min: -100,\n max: 100,\n step: 1\n },\n {\n key: 'style.transformY',\n label: 'Transform Y',\n type: 'range-number',\n min: -100,\n max: 100,\n step: 1\n },\n {\n key: 'style.transformZ',\n label: 'Transform Z',\n type: 'range-number',\n min: -100,\n max: 100,\n step: 1\n },\n {\n key: 'style.rotate',\n label: 'Rotate (deg)',\n type: 'number',\n placeholder: '0'\n },\n {\n key: 'style.scale',\n label: 'Scale',\n type: 'number',\n step: 0.1,\n placeholder: '1'\n }\n];\n\n// ============================================================================\n// EFFECTS FIELDS\n// ============================================================================\n\nexport const EFFECTS_FIELDS: PropertyField[] = [\n {\n key: 'style.opacity',\n label: 'Opacity',\n type: 'range-number',\n step: 0.05,\n min: 0,\n max: 1\n },\n {\n key: 'style.boxShadow',\n label: 'Box Shadow',\n type: 'text',\n placeholder: '0 2px 4px rgba(0,0,0,0.1)'\n }\n];\n\n// ============================================================================\n// CONVENIENCE PROPERTY SECTIONS\n// ============================================================================\n\nexport const STYLE_LAYOUT_SECTION: PropertySection = {\n label: 'Layout',\n expanded: true,\n fields: LAYOUT_FIELDS\n};\n\nexport const STYLE_SPACING_SECTION: PropertySection = {\n label: 'Spacing',\n fields: [SPACING_BOX_MODEL_FIELD]\n};\n\nexport const STYLE_APPEARANCE_SECTION: PropertySection = {\n label: 'Appearance',\n fields: APPEARANCE_FIELDS\n};\n\nexport const STYLE_TYPOGRAPHY_SECTION: PropertySection = {\n label: 'Typography',\n fields: TYPOGRAPHY_FIELDS\n};\n\nexport const STYLE_TRANSFORM_SECTION: PropertySection = {\n label: 'Transform',\n fields: TRANSFORM_FIELDS\n};\n\nexport const STYLE_EFFECTS_SECTION: PropertySection = {\n label: 'Effects',\n fields: EFFECTS_FIELDS\n};\n\nexport const STYLE_SECTIONS: PropertySection[] = [\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TYPOGRAPHY_SECTION,\n STYLE_TRANSFORM_SECTION,\n STYLE_EFFECTS_SECTION\n];\n\n// ============================================================================\n// COMBINED SECTIONS FOR COMMON USE CASES\n// ============================================================================\n\n/**\n * Standard style sections for form widgets (no transforms)\n */\nexport const STANDARD_FORM_STYLE_SECTIONS: PropertySection[] = [\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TYPOGRAPHY_SECTION\n];\n\n/**\n * Full style sections for web widgets (includes transforms)\n */\nexport const FULL_WEB_STYLE_SECTIONS: PropertySection[] = [\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TYPOGRAPHY_SECTION,\n STYLE_TRANSFORM_SECTION,\n STYLE_EFFECTS_SECTION\n];\n\n/**\n * Email-safe style sections (no transforms or advanced effects)\n */\nexport const EMAIL_SAFE_STYLE_SECTIONS: PropertySection[] = [\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TYPOGRAPHY_SECTION\n];\n","import { Component, Input, inject, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl } from '@angular/forms';\nimport { FormEngine } from '../../../form-core/form-engine';\nimport { DATA_PROVIDER } from '../../../data/data-provider';\nimport { mergeAndNormalize } from '../../style-helpers';\n\n@Component({\n selector: 'app-image-widget',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"image-widget-container w-full h-full flex\" \n [style.justify-content]=\"config?.style?.textAlign || 'center'\"\n [ngStyle]=\"getContainerStyles()\">\n \n <ng-container *ngIf=\"displaySrc; else placeholder\">\n <img [src]=\"displaySrc\" \n [alt]=\"config.alt || 'Image'\"\n [style.width]=\"config?.style?.width || '100%'\"\n [style.height]=\"config?.style?.height || 'auto'\"\n [style.object-fit]=\"config?.style?.objectFit || 'cover'\"\n [style.border-radius]=\"config?.style?.borderRadius || '0'\"\n class=\"max-w-full\">\n </ng-container>\n\n <ng-template #placeholder>\n <div class=\"w-full h-32 bg-gray-100 border-2 border-dashed border-gray-300 rounded flex flex-col items-center justify-center text-gray-400 p-4\">\n <span class=\"material-icons text-4xl mb-2\">image</span>\n <span class=\"text-sm\">No image source selected</span>\n </div>\n </ng-template>\n </div>\n `,\n styles: []\n})\nexport class ImageWidgetComponent implements OnInit, OnChanges {\n @Input() config: any;\n @Input() engine?: FormEngine;\n @Input() control?: FormControl;\n\n displaySrc: string | null = null;\n private readonly dataProvider = inject(DATA_PROVIDER, { optional: true });\n\n ngOnInit() {\n this.updateSrc();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] || changes['engine']) {\n this.updateSrc();\n }\n }\n\n private async updateSrc() {\n // Default from config\n this.displaySrc = this.config?.src || null;\n\n if (this.dataProvider && this.config?.dataConfig) {\n try {\n const val = await this.dataProvider.getValue(this.config, this.engine);\n if (typeof val === 'string' && val) {\n this.displaySrc = val;\n }\n } catch (err) {\n console.warn('ImageWidget: Error resolving src', err);\n }\n }\n }\n\n getContainerStyles() {\n const normalized = mergeAndNormalize({}, this.config?.style);\n return normalized;\n }\n\n getSpacing(token: string): string {\n const map: any = { 'none': '0', 'xs': '4px', 'sm': '8px', 'md': '16px', 'lg': '24px', 'xl': '32px' };\n return map[token] || token;\n }\n}\n","import { WidgetDefinition, PropertySection, PropertyField, defineWidget } from './widget-definition';\nimport { TextFieldWidgetComponent } from './field-widgets/text-field/text-field.component';\nimport { FileUploadWidgetComponent } from './field-widgets/file-upload/file-upload-widget.component';\nimport { SelectWidgetComponent } from './field-widgets/select/select-widget.component';\nimport { TreeSelectWidgetComponent } from './field-widgets/tree-select/tree-select-widget.component';\nimport { RadioWidgetComponent } from './field-widgets/radio/radio-widget.component';\nimport { CheckboxGroupWidgetComponent } from './field-widgets/checkbox-group/checkbox-group-widget.component';\nimport { CheckboxWidgetComponent } from './field-widgets/checkbox/checkbox-widget.component';\nimport { ButtonWidgetComponent } from './page-widgets/button-widget.component';\n\n// ... (existing imports)\n\n\nimport {\n STYLE_APPEARANCE_SECTION,\n STYLE_EFFECTS_SECTION,\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_TRANSFORM_SECTION,\n STYLE_TYPOGRAPHY_SECTION\n} from './style-properties';\n\nfunction generateId() {\n return 'field_' + Math.random().toString(36).substr(2, 9);\n}\n\nconst COMMON_GROUP_FIELDS: PropertyField[] = [\n { key: 'groupKey', type: 'text', label: 'Group Key', placeholder: 'documents', helpText: 'Group fields into one object on submit/preview (uses the field key inside the group).' }\n];\n\nconst COMMON_BASIC_FIELDS: PropertyField[] = [\n { key: 'name', type: 'text', label: 'Field Key (Name)' },\n { key: 'label', type: 'text', label: 'Label' },\n { key: 'placeholder', type: 'text', label: 'Placeholder' },\n { key: 'helpText', type: 'text', label: 'Help Text' }, // Hint\n { key: 'tooltip', type: 'text', label: 'Tooltip' },\n ...COMMON_GROUP_FIELDS\n];\n\nconst FILE_BASIC_FIELDS: PropertyField[] = [\n { key: 'name', type: 'text', label: 'Field Key (Name)' },\n { key: 'label', type: 'text', label: 'Label' },\n { key: 'helpText', type: 'text', label: 'Help Text' },\n { key: 'tooltip', type: 'text', label: 'Tooltip' },\n ...COMMON_GROUP_FIELDS\n];\n\nconst COMMON_ICON_FIELDS: PropertyField[] = [\n { key: 'prefixIcon', type: 'text', label: 'Prefix Icon (Material Name)' },\n { key: 'suffixIcon', type: 'text', label: 'Suffix Icon (Material Name)' }\n];\n\nconst COMMON_APPEARANCE_FIELDS: PropertyField[] = [\n {\n key: 'appearance',\n type: 'select',\n label: 'Style',\n options: [\n { label: 'Outline', value: 'outline' },\n { label: 'Fill', value: 'fill' },\n { label: 'Standard', value: 'standard' }\n ]\n },\n { key: 'className', type: 'text', label: 'Custom Class' },\n {\n key: 'layout',\n type: 'select',\n label: 'Field Width',\n options: [\n { label: 'Full Width (100%)', value: '100%' },\n { label: 'Half Width (50%)', value: '50%' },\n { label: 'Third Width (33%)', value: '33.33%' },\n { label: 'Quarter Width (25%)', value: '25%' }\n ]\n },\n { key: 'readonly', type: 'checkbox', label: 'Read Only' },\n { key: 'disabled', type: 'checkbox', label: 'Disabled' }\n];\n\nconst COMMON_STYLE_SECTIONS: PropertySection[] = [\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TYPOGRAPHY_SECTION,\n STYLE_TRANSFORM_SECTION,\n STYLE_EFFECTS_SECTION\n];\n\nconst COMMON_VALIDATION_SECTION: PropertySection = {\n label: 'Validation',\n fields: [\n { key: 'validators', type: 'validators-editor', label: 'Validation Rules' }\n ]\n\n};\n\nconst COMMON_CONDITIONAL_SECTION: PropertySection = {\n label: 'Conditional',\n fields: [\n { key: 'conditional', type: 'conditional-editor', label: 'Conditional Logic' }\n ]\n};\n\n// Start with standard sections for Text Field\nconst BASE_REQUIRED_FIELD: PropertyField = {\n key: 'html5.required',\n type: 'checkbox',\n label: 'Required',\n helpText: 'Base required state; Rules can override this dynamically.'\n};\n\nconst TEXT_VALIDATION_SECTION: PropertySection = {\n label: 'Validation',\n fields: [\n BASE_REQUIRED_FIELD,\n { key: 'html5.minLength', type: 'number', label: 'Min Length' },\n { key: 'html5.maxLength', type: 'number', label: 'Max Length' },\n { key: 'html5.pattern', type: 'text', label: 'Pattern (regex)' },\n { key: 'validators', type: 'validators-editor', label: 'Advanced Rules' }\n ]\n};\n\nconst NUMBER_VALIDATION_SECTION: PropertySection = {\n label: 'Validation',\n fields: [\n BASE_REQUIRED_FIELD,\n { key: 'html5.min', type: 'number', label: 'Minimum Value' },\n { key: 'html5.max', type: 'number', label: 'Maximum Value' },\n { key: 'html5.step', type: 'number', label: 'Step (Increment)' },\n { key: 'validators', type: 'validators-editor', label: 'Advanced Rules' }\n ]\n};\n\nconst DATE_VALIDATION_SECTION: PropertySection = {\n label: 'Validation',\n fields: [\n BASE_REQUIRED_FIELD,\n { key: 'html5.min', type: 'text', label: 'Earliest Date (YYYY-MM-DD)' },\n { key: 'html5.max', type: 'text', label: 'Latest Date (YYYY-MM-DD)' },\n { key: 'validators', type: 'validators-editor', label: 'Advanced Rules' }\n ]\n};\n\nconst TIME_VALIDATION_SECTION: PropertySection = {\n label: 'Validation',\n fields: [\n BASE_REQUIRED_FIELD,\n { key: 'html5.min', type: 'text', label: 'Earliest Time (HH:MM)' },\n { key: 'html5.max', type: 'text', label: 'Latest Time (HH:MM)' },\n { key: 'validators', type: 'validators-editor', label: 'Advanced Rules' }\n ]\n};\n\nconst DATETIME_VALIDATION_SECTION: PropertySection = {\n label: 'Validation',\n fields: [\n BASE_REQUIRED_FIELD,\n { key: 'html5.min', type: 'text', label: 'Earliest (YYYY-MM-DDTHH:MM)' },\n { key: 'html5.max', type: 'text', label: 'Latest (YYYY-MM-DDTHH:MM)' },\n { key: 'validators', type: 'validators-editor', label: 'Advanced Rules' }\n ]\n};\n\nconst SELECT_VALIDATION_SECTION: PropertySection = {\n label: 'Validation',\n fields: [\n BASE_REQUIRED_FIELD,\n { key: 'validators', type: 'validators-editor', label: 'Advanced Rules' }\n ]\n};\n\nconst FILE_VALIDATION_SECTION: PropertySection = {\n label: 'Validation',\n fields: [\n BASE_REQUIRED_FIELD,\n { key: 'validators', type: 'validators-editor', label: 'Advanced Rules' }\n ]\n};\n\nconst BUTTON_VARIANT_OPTIONS = [\n { label: 'Primary (Blue)', value: 'primary' },\n { label: 'Secondary (Outline)', value: 'secondary' }\n];\n\nconst BUTTON_PROPERTIES: PropertySection[] = [\n {\n label: 'Basic',\n fields: [\n { key: 'label', type: 'text', label: 'Label' }\n ]\n },\n {\n label: 'Style',\n fields: [\n { key: 'variant', type: 'select', label: 'Variant', options: BUTTON_VARIANT_OPTIONS },\n ...COMMON_APPEARANCE_FIELDS\n ]\n },\n ...COMMON_STYLE_SECTIONS\n];\n\nconst IMAGE_BUTTON_PROPERTIES: PropertySection[] = [\n {\n label: 'Basic',\n fields: [\n { key: 'label', type: 'text', label: 'Label' },\n { key: 'imageSrc', type: 'text', label: 'Image URL' },\n { key: 'alt', type: 'text', label: 'Alt Text' }\n ]\n },\n {\n label: 'Style',\n fields: [\n { key: 'variant', type: 'select', label: 'Variant', options: BUTTON_VARIANT_OPTIONS },\n ...COMMON_APPEARANCE_FIELDS\n ]\n },\n ...COMMON_STYLE_SECTIONS\n];\n\nconst TEXT_WIDGET_PROPERTIES: PropertySection[] = [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n { label: 'Icons', fields: COMMON_ICON_FIELDS },\n TEXT_VALIDATION_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n];\n\nconst FILE_WIDGET_PROPERTIES: PropertySection[] = [\n { label: 'Basic', fields: FILE_BASIC_FIELDS },\n {\n label: 'File',\n fields: [\n { key: 'accept', type: 'text', label: 'Accepted Types', placeholder: 'image/*,video/*,audio/*' },\n { key: 'multiple', type: 'checkbox', label: 'Allow Multiple Files' },\n { key: 'uploadUrl', type: 'text', label: 'Upload Endpoint', placeholder: '/api/uploads' },\n { key: 'uploadFieldName', type: 'text', label: 'Upload Field Name', placeholder: 'file' }\n ]\n },\n FILE_VALIDATION_SECTION,\n COMMON_CONDITIONAL_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n];\n\nimport { ImageWidgetComponent } from './static-widgets/image/image-widget.component';\n\nconst pluginId = 'core.form';\n\nexport const FIELD_WIDGETS: WidgetDefinition[] = [\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'text',\n icon: 'type',\n label: 'Text Input',\n createConfig: () => ({\n id: generateId(),\n name: 'text_' + Date.now(),\n type: 'text',\n label: 'Text Field',\n placeholder: '',\n appearance: 'outline',\n html5: { required: false },\n style: {\n width: '100%',\n paddingTop: 12,\n paddingBottom: 12\n }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: TEXT_WIDGET_PROPERTIES\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'number',\n icon: 'hash',\n label: 'Number Input',\n createConfig: () => ({\n id: generateId(),\n name: 'number_' + Date.now(),\n type: 'number',\n label: 'Number Field',\n placeholder: '',\n appearance: 'outline',\n html5: { required: false },\n style: {\n width: '100%'\n }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: [\n {\n label: 'Basic', fields: [\n ...COMMON_BASIC_FIELDS\n ]\n },\n { label: 'Icons', fields: COMMON_ICON_FIELDS },\n NUMBER_VALIDATION_SECTION,\n COMMON_CONDITIONAL_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'date',\n icon: 'calendar',\n label: 'Date Picker',\n createConfig: () => ({\n id: generateId(),\n name: 'date_' + Date.now(),\n type: 'date',\n label: 'Date Field',\n placeholder: '',\n appearance: 'outline',\n html5: { required: false },\n style: {\n width: '100%'\n }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n { label: 'Icons', fields: COMMON_ICON_FIELDS },\n DATE_VALIDATION_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'time',\n icon: 'clock',\n label: 'Time Picker',\n createConfig: () => ({\n id: generateId(),\n name: 'time_' + Date.now(),\n type: 'time',\n label: 'Time Field',\n placeholder: '',\n appearance: 'outline',\n html5: { required: false },\n style: {\n width: '100%'\n }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n { label: 'Icons', fields: COMMON_ICON_FIELDS },\n TIME_VALIDATION_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'datetime-local',\n icon: 'calendar-clock',\n label: 'Date & Time',\n createConfig: () => ({\n id: generateId(),\n name: 'datetime_' + Date.now(),\n type: 'datetime-local',\n label: 'Date & Time',\n placeholder: '',\n appearance: 'outline',\n html5: { required: false },\n style: { width: '100%' }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n { label: 'Icons', fields: COMMON_ICON_FIELDS },\n DATETIME_VALIDATION_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'month',\n icon: 'calendar-range',\n label: 'Month Picker',\n createConfig: () => ({\n id: generateId(),\n name: 'month_' + Date.now(),\n type: 'month',\n label: 'Month',\n placeholder: '',\n appearance: 'outline',\n html5: { required: false },\n style: { width: '100%' }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n { label: 'Icons', fields: COMMON_ICON_FIELDS },\n DATE_VALIDATION_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'week',\n icon: 'calendar-range',\n label: 'Week Picker',\n createConfig: () => ({\n id: generateId(),\n name: 'week_' + Date.now(),\n type: 'week',\n label: 'Week',\n placeholder: '',\n appearance: 'outline',\n html5: { required: false },\n style: { width: '100%' }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n { label: 'Icons', fields: COMMON_ICON_FIELDS },\n DATE_VALIDATION_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'password',\n icon: 'key',\n label: 'Password',\n createConfig: () => ({\n id: generateId(),\n name: 'password_' + Date.now(),\n type: 'password',\n label: 'Password',\n placeholder: '••••••••',\n appearance: 'outline',\n html5: { required: false },\n style: { width: '100%' }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: TEXT_WIDGET_PROPERTIES\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'email',\n icon: 'mail',\n label: 'Email',\n createConfig: () => ({\n id: generateId(),\n name: 'email_' + Date.now(),\n type: 'email',\n label: 'Email',\n placeholder: 'name@example.com',\n appearance: 'outline',\n html5: { required: false, pattern: undefined },\n style: { width: '100%' }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: TEXT_WIDGET_PROPERTIES\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'url',\n icon: 'link',\n label: 'URL',\n createConfig: () => ({\n id: generateId(),\n name: 'url_' + Date.now(),\n type: 'url',\n label: 'URL',\n placeholder: 'https://example.com',\n appearance: 'outline',\n html5: { required: false, pattern: undefined },\n style: { width: '100%' }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: TEXT_WIDGET_PROPERTIES\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'tel',\n icon: 'phone',\n label: 'Telephone',\n createConfig: () => ({\n id: generateId(),\n name: 'tel_' + Date.now(),\n type: 'tel',\n label: 'Phone',\n placeholder: '+1 555 0100',\n appearance: 'outline',\n html5: { required: false },\n style: { width: '100%' }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: TEXT_WIDGET_PROPERTIES\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'file',\n icon: 'upload',\n label: 'File Upload',\n createConfig: () => ({\n id: generateId(),\n name: 'file_' + Date.now(),\n type: 'file',\n label: 'File Upload',\n accept: '',\n multiple: false,\n uploadUrl: '/api/uploads',\n uploadFieldName: 'file',\n html5: { required: false },\n style: { width: '100%' }\n }),\n renderer: FileUploadWidgetComponent,\n dataConsumer: 'none',\n properties: FILE_WIDGET_PROPERTIES\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'search',\n icon: 'search',\n label: 'Search',\n createConfig: () => ({\n id: generateId(),\n name: 'search_' + Date.now(),\n type: 'search',\n label: 'Search',\n placeholder: 'Search...',\n appearance: 'outline',\n html5: { required: false },\n style: { width: '100%' }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: TEXT_WIDGET_PROPERTIES\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'range',\n icon: 'sliders-horizontal',\n label: 'Range',\n createConfig: () => ({\n id: generateId(),\n name: 'range_' + Date.now(),\n type: 'range',\n label: 'Range',\n placeholder: '',\n appearance: 'outline',\n html5: { required: false, min: 0, max: 100, step: 1 },\n style: { width: '100%' }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n { label: 'Icons', fields: COMMON_ICON_FIELDS },\n NUMBER_VALIDATION_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'color',\n icon: 'droplet',\n label: 'Color Picker',\n createConfig: () => ({\n id: generateId(),\n name: 'color_' + Date.now(),\n type: 'color',\n label: 'Color',\n placeholder: '',\n appearance: 'outline',\n html5: { required: false },\n defaultValue: '#000000',\n style: { width: '100%' }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'hidden',\n icon: 'eye-off',\n label: 'Hidden',\n createConfig: () => ({\n id: generateId(),\n name: 'hidden_' + Date.now(),\n type: 'hidden',\n label: 'Hidden Field',\n defaultValue: '',\n style: { width: '100%' }\n }),\n renderer: TextFieldWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'button',\n flavor: 'form',\n type: 'form-button',\n icon: 'circle-dot',\n label: 'Button',\n createConfig: () => ({\n id: generateId(),\n name: 'btn_' + Date.now(),\n type: 'form-button',\n label: 'Button',\n variant: 'primary',\n buttonType: 'button',\n style: { width: 'auto' }\n }),\n renderer: ButtonWidgetComponent,\n dataConsumer: 'none',\n properties: BUTTON_PROPERTIES\n }),\n defineWidget(pluginId, {\n kind: 'button',\n flavor: 'form',\n type: 'submit-button',\n icon: 'send',\n label: 'Submit Button',\n createConfig: () => ({\n id: generateId(),\n name: 'submit_' + Date.now(),\n type: 'submit-button',\n label: 'Submit',\n variant: 'primary',\n buttonType: 'submit',\n style: { width: 'auto' }\n }),\n renderer: ButtonWidgetComponent,\n dataConsumer: 'none',\n properties: BUTTON_PROPERTIES\n }),\n defineWidget(pluginId, {\n kind: 'button',\n flavor: 'form',\n type: 'reset-button',\n icon: 'rotate-ccw',\n label: 'Reset Button',\n createConfig: () => ({\n id: generateId(),\n name: 'reset_' + Date.now(),\n type: 'reset-button',\n label: 'Reset',\n variant: 'secondary',\n buttonType: 'reset',\n style: { width: 'auto' }\n }),\n renderer: ButtonWidgetComponent,\n dataConsumer: 'none',\n properties: BUTTON_PROPERTIES\n }),\n defineWidget(pluginId, {\n kind: 'button',\n flavor: 'form',\n type: 'image-button',\n icon: 'image',\n label: 'Image Button',\n createConfig: () => ({\n id: generateId(),\n name: 'imgbtn_' + Date.now(),\n type: 'image-button',\n label: 'Image Button',\n variant: 'primary',\n buttonType: 'submit',\n imageSrc: 'https://via.placeholder.com/120x40',\n alt: 'Submit',\n style: { width: 'auto' }\n }),\n renderer: ButtonWidgetComponent,\n dataConsumer: 'none',\n properties: IMAGE_BUTTON_PROPERTIES\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'select',\n icon: 'list',\n label: 'Dropdown',\n createConfig: () => ({\n id: generateId(),\n name: 'select_' + Date.now(),\n type: 'select',\n label: 'Dropdown Field',\n placeholder: 'Select an option',\n appearance: 'outline',\n html5: { required: false },\n staticOptions: [\n { label: 'Option 1', value: 'opt1' },\n { label: 'Option 2', value: 'opt2' },\n { label: 'Option 3', value: 'opt3' }\n ],\n style: {\n width: '100%'\n }\n }),\n renderer: SelectWidgetComponent,\n dataConsumer: 'list',\n dataBinding: { shape: 'list', targetPath: 'staticOptions' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n // Options are now handled in Data Tab\n SELECT_VALIDATION_SECTION,\n COMMON_CONDITIONAL_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'radio',\n icon: 'circle-dot',\n label: 'Radio Group',\n createConfig: () => ({\n id: generateId(),\n name: 'radio_' + Date.now(),\n type: 'radio',\n label: 'Radio Options',\n html5: { required: false },\n staticOptions: [\n { label: 'Option 1', value: 'opt1' },\n { label: 'Option 2', value: 'opt2' }\n ],\n style: { width: '100%' }\n }),\n renderer: RadioWidgetComponent,\n dataConsumer: 'list',\n dataBinding: { shape: 'list', targetPath: 'staticOptions' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n // Options handled in Data Tab\n SELECT_VALIDATION_SECTION,\n COMMON_CONDITIONAL_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'checkbox-group',\n icon: 'check-square',\n label: 'Checkbox Group',\n createConfig: () => ({\n id: generateId(),\n name: 'checklist_' + Date.now(),\n type: 'checkbox-group',\n label: 'Checklist',\n html5: { required: false },\n staticOptions: [\n { label: 'Choice A', value: 'a' },\n { label: 'Choice B', value: 'b' }\n ],\n style: { width: '100%' }\n }),\n renderer: CheckboxGroupWidgetComponent,\n dataConsumer: 'list',\n dataBinding: { shape: 'list', targetPath: 'staticOptions' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n // Options handled in Data Tab\n SELECT_VALIDATION_SECTION,\n COMMON_CONDITIONAL_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'checkbox',\n icon: 'check',\n label: 'Checkbox (Boolean)',\n createConfig: () => ({\n id: generateId(),\n name: 'check_' + Date.now(),\n type: 'checkbox',\n label: 'I agree',\n html5: { required: false },\n style: { width: '100%' }\n }),\n renderer: CheckboxWidgetComponent,\n dataConsumer: 'value',\n dataBinding: { shape: 'scalar', targetPath: 'defaultValue' },\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n // Boolean specific validation or standard\n {\n label: 'Validation',\n fields: [\n BASE_REQUIRED_FIELD,\n { key: 'validators', type: 'validators-editor', label: 'Advanced Rules' }\n ]\n },\n COMMON_CONDITIONAL_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget(pluginId, {\n kind: 'field',\n flavor: 'form',\n type: 'tree-select',\n icon: 'list', // Using list as generic safe icon\n label: 'Tree Dropdown',\n createConfig: () => ({\n id: generateId(),\n name: 'tree_' + Date.now(),\n type: 'tree-select',\n label: 'Tree Selection',\n placeholder: 'Select...',\n appearance: 'outline',\n html5: { required: false },\n style: { width: '100%' }\n }),\n // @ts-ignore\n renderer: TreeSelectWidgetComponent,\n dataConsumer: 'list',\n dataBinding: { shape: 'list', targetPath: 'staticOptions' }, // Reusing list binding shape\n properties: [\n { label: 'Basic', fields: COMMON_BASIC_FIELDS },\n SELECT_VALIDATION_SECTION,\n COMMON_CONDITIONAL_SECTION,\n { label: 'Appearance', fields: COMMON_APPEARANCE_FIELDS },\n ...COMMON_STYLE_SECTIONS\n ]\n }),\n defineWidget('core.static', {\n kind: 'image',\n flavor: 'form',\n type: 'image',\n icon: 'image',\n label: 'Image',\n createConfig: () => ({\n id: generateId(),\n name: 'image_' + Date.now(),\n type: 'image',\n label: 'Image',\n src: 'https://via.placeholder.com/300x200',\n alt: 'Placeholder Image',\n style: {\n width: '100%',\n height: 'auto',\n objectFit: 'cover',\n borderRadius: '4px',\n textAlign: 'center'\n }\n }),\n renderer: ImageWidgetComponent,\n dataConsumer: 'image',\n dataBinding: { shape: 'scalar', targetPath: 'src' },\n properties: [\n {\n label: 'Basic',\n fields: [\n { key: 'label', type: 'text', label: 'Label (Internal)' },\n { key: 'alt', type: 'text', label: 'Alt Text' }\n // Source moved to Data Tab\n ]\n },\n {\n label: 'Style',\n fields: [\n {\n key: 'style.objectFit',\n type: 'select',\n label: 'Object Fit',\n options: [\n { label: 'Cover', value: 'cover' },\n { label: 'Contain', value: 'contain' },\n { label: 'Fill', value: 'fill' }\n ]\n },\n {\n key: 'style.textAlign',\n type: 'select',\n label: 'Alignment',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Center', value: 'center' },\n { label: 'Right', value: 'right' }\n ]\n }\n ]\n },\n ...COMMON_STYLE_SECTIONS,\n COMMON_CONDITIONAL_SECTION\n ]\n })\n];\n","import { CommonModule } from '@angular/common';\nimport { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChanges, ViewChild } from '@angular/core';\nimport Quill from 'quill';\n\ntype QuillInstance = Quill;\n\n@Component({\n selector: 'app-inline-quill-editor',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"inline-quill\"\n [ngClass]=\"containerClass\"\n (mousedown)=\"onEditorMouseDown($event)\"\n (pointerdown)=\"onEditorPointerDown($event)\"\n (touchstart)=\"onEditorTouchStart($event)\"\n (dragstart)=\"onEditorDragStart($event)\">\n <div #editor></div>\n </div>\n `,\n styles: [`\n :host ::ng-deep .inline-quill .ql-container {\n border: none;\n font-family: inherit;\n }\n :host ::ng-deep .inline-quill .ql-editor {\n padding: 0;\n line-height: inherit;\n font-size: inherit;\n }\n :host ::ng-deep .inline-quill .ql-editor p {\n margin: 0;\n }\n `]\n})\nexport class InlineQuillEditorComponent implements AfterViewInit, OnChanges, OnDestroy {\n @Input() html = '';\n @Input() placeholder = '';\n @Input() readOnly = false;\n @Input() autoFocus = false;\n @Input() containerClass = '';\n @Input() editorClass = '';\n @Input() editorStyle: Record<string, string | number> | null = null;\n\n @Output() htmlChange = new EventEmitter<string>();\n @Output() editorBlur = new EventEmitter<void>();\n @Output() editorFocus = new EventEmitter<void>();\n\n @ViewChild('editor', { static: true }) editorRef!: ElementRef<HTMLDivElement>;\n\n private quill?: QuillInstance;\n private lastHtml = '';\n private hasFocus = false;\n private updating = false;\n private appliedClasses = new Set<string>();\n\n ngAfterViewInit() {\n this.initQuill();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.quill) return;\n\n if (changes['readOnly'] && !changes['readOnly'].firstChange) {\n this.quill.enable(!this.readOnly);\n if (!this.readOnly && this.autoFocus) {\n this.focusToEnd();\n }\n }\n\n if (changes['autoFocus'] && !changes['autoFocus'].firstChange && this.autoFocus && !this.readOnly) {\n this.focusToEnd();\n }\n\n if (changes['editorClass'] || changes['editorStyle']) {\n this.applyEditorAppearance();\n }\n\n if (changes['html'] && !changes['html'].firstChange) {\n this.setHtml(this.html ?? '');\n }\n }\n\n ngOnDestroy() {\n this.quill = undefined;\n }\n\n private initQuill() {\n const container = this.editorRef.nativeElement;\n this.quill = new Quill(container, {\n theme: 'bubble',\n placeholder: this.placeholder,\n readOnly: this.readOnly,\n modules: {\n toolbar: [\n ['bold', 'italic', 'underline', 'link']\n ]\n }\n });\n\n this.applyEditorAppearance();\n this.setHtml(this.html ?? '');\n if (this.autoFocus && !this.readOnly) {\n this.focusToEnd();\n }\n\n this.quill.on('text-change', () => {\n if (!this.quill || this.readOnly) return;\n if (this.updating) return;\n const html = this.quill.root.innerHTML;\n if (html === this.lastHtml) return;\n this.lastHtml = html;\n this.htmlChange.emit(html);\n });\n\n this.quill.on('selection-change', range => {\n if (range) {\n if (!this.hasFocus) {\n this.hasFocus = true;\n this.editorFocus.emit();\n }\n return;\n }\n if (this.hasFocus) {\n this.hasFocus = false;\n this.editorBlur.emit();\n }\n });\n }\n\n private setHtml(nextHtml: string) {\n if (!this.quill) return;\n if (this.quill.hasFocus()) return;\n const normalized = nextHtml ?? '';\n if (normalized === this.lastHtml) return;\n this.updating = true;\n this.quill.clipboard.dangerouslyPasteHTML(normalized, 'silent');\n this.lastHtml = this.quill.root.innerHTML;\n this.updating = false;\n }\n\n private applyEditorAppearance() {\n if (!this.quill) return;\n const classNames = this.editorClass\n .split(' ')\n .map(name => name.trim())\n .filter(Boolean);\n const root = this.quill.root;\n for (const name of this.appliedClasses) {\n root.classList.remove(name);\n }\n this.appliedClasses.clear();\n for (const name of classNames) {\n root.classList.add(name);\n this.appliedClasses.add(name);\n }\n if (this.editorStyle) {\n Object.entries(this.editorStyle).forEach(([key, value]) => {\n (this.quill?.root.style as CSSStyleDeclaration & Record<string, string>)[key] = String(value);\n });\n }\n }\n\n private focusToEnd() {\n if (!this.quill) return;\n if (this.readOnly) return;\n const length = this.quill.getLength();\n this.quill.setSelection(length, 0, 'api');\n this.quill.focus();\n }\n\n onEditorMouseDown(event: MouseEvent) {\n this.stopInteractionEvent(event);\n }\n\n onEditorPointerDown(event: PointerEvent) {\n this.stopInteractionEvent(event);\n }\n\n onEditorTouchStart(event: TouchEvent) {\n this.stopInteractionEvent(event);\n }\n\n onEditorDragStart(event: DragEvent) {\n if (this.readOnly) return;\n event.preventDefault();\n }\n\n private stopInteractionEvent(event: Event) {\n if (this.readOnly) return;\n event.stopPropagation();\n }\n}\n","import { Component, Input, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { mergeAndNormalize } from '../style-helpers';\nimport { WIDGET_EDITOR_CONTEXT } from '../widget-editor-context';\nimport { InlineQuillEditorComponent } from './inline-quill-editor.component';\n\n@Component({\n selector: 'app-heading-widget',\n standalone: true,\n imports: [CommonModule, InlineQuillEditorComponent],\n template: `\n <ng-container *ngIf=\"isDesignMode(); else staticHeading\">\n <app-inline-quill-editor\n [html]=\"quillHtml()\"\n [readOnly]=\"!isEditing()\"\n [autoFocus]=\"isEditing()\"\n [containerClass]=\"headingContainerClass()\"\n [editorClass]=\"headingEditorClass()\"\n [editorStyle]=\"getStyles()\"\n (htmlChange)=\"onHtmlChange($event)\">\n </app-inline-quill-editor>\n </ng-container>\n <ng-template #staticHeading>\n <ng-container [ngSwitch]=\"config?.level\">\n <h1 *ngSwitchCase=\"'h1'\"\n [ngStyle]=\"getStyles()\"\n class=\"font-bold text-3xl mb-4 text-gray-900\"\n [innerHTML]=\"labelHtml()\"\n (click)=\"onLinkClick($event)\"></h1>\n <h2 *ngSwitchCase=\"'h2'\"\n [ngStyle]=\"getStyles()\"\n class=\"font-bold text-2xl mb-3 text-gray-800\"\n [innerHTML]=\"labelHtml()\"\n (click)=\"onLinkClick($event)\"></h2>\n <h3 *ngSwitchCase=\"'h3'\"\n [ngStyle]=\"getStyles()\"\n class=\"font-bold text-xl mb-2 text-gray-800\"\n [innerHTML]=\"labelHtml()\"\n (click)=\"onLinkClick($event)\"></h3>\n <h4 *ngSwitchCase=\"'h4'\"\n [ngStyle]=\"getStyles()\"\n class=\"font-bold text-lg mb-2 text-gray-700\"\n [innerHTML]=\"labelHtml()\"\n (click)=\"onLinkClick($event)\"></h4>\n <h5 *ngSwitchCase=\"'h5'\"\n [ngStyle]=\"getStyles()\"\n class=\"font-bold text-base mb-1 text-gray-700\"\n [innerHTML]=\"labelHtml()\"\n (click)=\"onLinkClick($event)\"></h5>\n <h6 *ngSwitchDefault\n [ngStyle]=\"getStyles()\"\n class=\"font-bold text-sm mb-1 text-gray-600\"\n [innerHTML]=\"labelHtml()\"\n (click)=\"onLinkClick($event)\"></h6>\n </ng-container>\n </ng-template>\n `\n})\nexport class HeadingWidgetComponent {\n private readonly editor = inject(WIDGET_EDITOR_CONTEXT, { optional: true });\n private readonly router = inject(Router, { optional: true });\n\n @Input() config: any;\n @Input() engine?: any;\n @Input() control?: any;\n\n getStyles() {\n return mergeAndNormalize({}, this.config?.style);\n }\n\n isDesignMode(): boolean {\n return Boolean(this.editor?.isDesignMode());\n }\n\n isEditing(): boolean {\n return Boolean(this.editor?.isDesignMode() && this.editor?.isSelected());\n }\n\n headingEditorClass(): string {\n switch (this.config?.level) {\n case 'h1':\n return 'font-bold text-3xl text-gray-900';\n case 'h2':\n return 'font-bold text-2xl text-gray-800';\n case 'h3':\n return 'font-bold text-xl text-gray-800';\n case 'h4':\n return 'font-bold text-lg text-gray-700';\n case 'h5':\n return 'font-bold text-base text-gray-700';\n default:\n return 'font-bold text-sm text-gray-600';\n }\n }\n\n headingContainerClass(): string {\n switch (this.config?.level) {\n case 'h1':\n return 'mb-4';\n case 'h2':\n return 'mb-3';\n case 'h3':\n return 'mb-2';\n case 'h4':\n return 'mb-2';\n case 'h5':\n return 'mb-1';\n default:\n return 'mb-1';\n }\n }\n\n labelHtml(): string {\n return this.normalizeInlineHtml(this.config?.label ?? '');\n }\n\n quillHtml(): string {\n return this.wrapHtmlForQuill(this.labelHtml());\n }\n\n onHtmlChange(html: string) {\n if (!this.isEditing()) return;\n if (!this.config?.id || !this.editor?.updateField) return;\n const normalized = this.normalizeInlineHtml(html);\n if (normalized === (this.config?.label ?? '')) return;\n this.editor.updateField(this.config.id, { label: normalized });\n }\n\n onLinkClick(event: MouseEvent) {\n if (this.isDesignMode()) {\n event.preventDefault();\n return;\n }\n const target = event.target;\n if (!(target instanceof Element)) return;\n const anchor = target.closest('a');\n if (!anchor) return;\n if (anchor.target === '_blank') return;\n if (!this.router) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0) return;\n const href = anchor.getAttribute('href') ?? '';\n const internal = this.normalizeInternalHref(href);\n if (!internal) return;\n event.preventDefault();\n this.router.navigateByUrl(internal);\n }\n\n private wrapHtmlForQuill(html: string): string {\n const trimmed = html.trim();\n if (!trimmed) return '';\n if (trimmed.startsWith('<p')) return trimmed;\n return `<p>${trimmed}</p>`;\n }\n\n private normalizeInlineHtml(html: string): string {\n const trimmed = html.trim();\n if (!trimmed || trimmed === '<p><br></p>') return '';\n return trimmed\n .replace(/<\\/p>\\s*<p>/g, '<br>')\n .replace(/^<p>/, '')\n .replace(/<\\/p>$/, '');\n }\n\n private normalizeInternalHref(href: string): string | null {\n const trimmed = href.trim();\n if (!trimmed || trimmed.startsWith('#')) return null;\n const lower = trimmed.toLowerCase();\n if (lower.startsWith('http://') || lower.startsWith('https://')) return null;\n if (lower.startsWith('mailto:') || lower.startsWith('tel:')) return null;\n if (lower.startsWith('javascript:') || lower.startsWith('data:')) return null;\n if (lower.startsWith('//')) return null;\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n }\n}\n","import { Component, Input, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { mergeAndNormalize } from '../style-helpers';\nimport { WIDGET_EDITOR_CONTEXT } from '../widget-editor-context';\nimport { InlineQuillEditorComponent } from './inline-quill-editor.component';\n\n@Component({\n selector: 'app-text-block-widget',\n standalone: true,\n imports: [CommonModule, InlineQuillEditorComponent],\n template: `\n <ng-container *ngIf=\"isDesignMode(); else staticText\">\n <app-inline-quill-editor\n [html]=\"quillHtml()\"\n [readOnly]=\"!isEditing()\"\n [autoFocus]=\"isEditing()\"\n [containerClass]=\"textContainerClass()\"\n [editorClass]=\"textEditorClass()\"\n [editorStyle]=\"getStyles()\"\n (htmlChange)=\"onHtmlChange($event)\">\n </app-inline-quill-editor>\n </ng-container>\n <ng-template #staticText>\n <p [class.text-gray-500]=\"config?.muted\"\n [class.text-sm]=\"config?.muted\"\n [ngStyle]=\"getStyles()\"\n class=\"mb-4 leading-relaxed text-gray-700\"\n [innerHTML]=\"textHtml()\"\n (click)=\"onLinkClick($event)\"></p>\n </ng-template>\n `\n})\nexport class TextBlockWidgetComponent {\n private readonly editor = inject(WIDGET_EDITOR_CONTEXT, { optional: true });\n private readonly router = inject(Router, { optional: true });\n\n @Input() config: any;\n @Input() engine?: any;\n @Input() control?: any;\n\n getStyles() {\n return mergeAndNormalize({}, this.config?.style);\n }\n\n isDesignMode(): boolean {\n return Boolean(this.editor?.isDesignMode());\n }\n\n isEditing(): boolean {\n return Boolean(this.editor?.isDesignMode() && this.editor?.isSelected());\n }\n\n textEditorClass(): string {\n return `leading-relaxed ${this.config?.muted ? 'text-gray-500 text-sm' : 'text-gray-700'}`;\n }\n\n textContainerClass(): string {\n return 'mb-4';\n }\n\n textHtml(): string {\n return this.normalizeInlineHtml(this.config?.text ?? '');\n }\n\n quillHtml(): string {\n return this.wrapHtmlForQuill(this.textHtml());\n }\n\n onHtmlChange(html: string) {\n if (!this.isEditing()) return;\n if (!this.config?.id || !this.editor?.updateField) return;\n const normalized = this.normalizeInlineHtml(html);\n if (normalized === (this.config?.text ?? '')) return;\n this.editor.updateField(this.config.id, { text: normalized });\n }\n\n onLinkClick(event: MouseEvent) {\n if (this.isDesignMode()) {\n event.preventDefault();\n return;\n }\n const target = event.target;\n if (!(target instanceof Element)) return;\n const anchor = target.closest('a');\n if (!anchor) return;\n if (anchor.target === '_blank') return;\n if (!this.router) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0) return;\n const href = anchor.getAttribute('href') ?? '';\n const internal = this.normalizeInternalHref(href);\n if (!internal) return;\n event.preventDefault();\n this.router.navigateByUrl(internal);\n }\n\n private wrapHtmlForQuill(html: string): string {\n const trimmed = html.trim();\n if (!trimmed) return '';\n if (trimmed.startsWith('<p')) return trimmed;\n return `<p>${trimmed}</p>`;\n }\n\n private normalizeInlineHtml(html: string): string {\n const trimmed = html.trim();\n if (!trimmed || trimmed === '<p><br></p>') return '';\n return trimmed\n .replace(/<\\/p>\\s*<p>/g, '<br>')\n .replace(/^<p>/, '')\n .replace(/<\\/p>$/, '');\n }\n\n private normalizeInternalHref(href: string): string | null {\n const trimmed = href.trim();\n if (!trimmed || trimmed.startsWith('#')) return null;\n const lower = trimmed.toLowerCase();\n if (lower.startsWith('http://') || lower.startsWith('https://')) return null;\n if (lower.startsWith('mailto:') || lower.startsWith('tel:')) return null;\n if (lower.startsWith('javascript:') || lower.startsWith('data:')) return null;\n if (lower.startsWith('//')) return null;\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { WIDGET_PAGE_LINKS, WidgetPageLink } from '../page-link-context';\n\ntype LinkType = 'none' | 'page' | 'url';\n\n@Component({\n selector: 'app-button-link-settings',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"space-y-3\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[10px] text-gray-500 uppercase tracking-wide\">Link Type</label>\n <select\n [ngModel]=\"linkType()\"\n (ngModelChange)=\"setLinkType($event)\"\n class=\"h-9 w-full rounded-md border border-gray-300 bg-white px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <option value=\"none\">No link</option>\n <option value=\"page\">Page</option>\n <option value=\"url\">URL</option>\n </select>\n </div>\n\n @if (linkType() === 'page') {\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[10px] text-gray-500 uppercase tracking-wide\">Page</label>\n <select\n [ngModel]=\"selectedPageId()\"\n (ngModelChange)=\"setPageId($event)\"\n class=\"h-9 w-full rounded-md border border-gray-300 bg-white px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n <option value=\"\">Select a page</option>\n @for (page of pages(); track page.id) {\n <option [value]=\"page.id\">{{ page.name }} ({{ page.route }})</option>\n }\n </select>\n @if (!pages().length) {\n <div class=\"text-[10px] text-gray-400\">No pages available.</div>\n }\n @if (selectedPageRoute()) {\n <div class=\"text-[10px] text-gray-400\">Route: {{ selectedPageRoute() }}</div>\n }\n </div>\n }\n\n @if (linkType() === 'url') {\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[10px] text-gray-500 uppercase tracking-wide\">URL</label>\n <input\n type=\"text\"\n [ngModel]=\"linkHref()\"\n (ngModelChange)=\"setUrl($event)\"\n placeholder=\"https://example.com or /about\"\n class=\"h-9 w-full rounded-md border border-gray-300 bg-white px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\">\n </div>\n }\n\n @if (linkType() !== 'none') {\n <div class=\"flex items-center justify-between\">\n <span class=\"text-sm text-gray-700 font-medium\">Open in new tab</span>\n <label class=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n [ngModel]=\"openInNewTab()\"\n (ngModelChange)=\"setOpenInNewTab($event)\"\n class=\"sr-only peer\">\n <div class=\"w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-blue-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-blue-600\"></div>\n </label>\n </div>\n }\n </div>\n `\n})\nexport class ButtonLinkSettingsComponent {\n @Input() config: any;\n @Input() getValue?: (path: string) => any;\n @Input() setValue?: (path: string, value: any) => void;\n @Input() onChange?: () => void;\n\n private readonly pageLinks = inject(WIDGET_PAGE_LINKS, { optional: true });\n\n linkType(): LinkType {\n const explicit = (this.getValue ? this.getValue('linkType') : this.config?.linkType) as LinkType | undefined;\n if (explicit) return explicit;\n if (this.selectedPageId()) return 'page';\n return this.linkHref() ? 'url' : 'none';\n }\n\n pages(): WidgetPageLink[] {\n return this.pageLinks ? this.pageLinks() : [];\n }\n\n selectedPageId(): string {\n return (this.getValue ? this.getValue('pageId') : this.config?.pageId) ?? '';\n }\n\n selectedPageRoute(): string {\n const id = this.selectedPageId();\n if (!id) return '';\n const match = this.pages().find(page => page.id === id);\n return match?.route ?? '';\n }\n\n linkHref(): string {\n return (this.getValue ? this.getValue('href') : this.config?.href) ?? '';\n }\n\n openInNewTab(): boolean {\n return Boolean(this.getValue ? this.getValue('openInNewTab') : this.config?.openInNewTab);\n }\n\n setLinkType(type: LinkType) {\n this.setValue?.('linkType', type);\n }\n\n setPageId(pageId: string) {\n this.setValue?.('pageId', pageId);\n if (!pageId) {\n this.setValue?.('linkType', 'none');\n this.setValue?.('href', '');\n return;\n }\n this.setValue?.('linkType', 'page');\n const match = this.pages().find(page => page.id === pageId);\n if (match?.route) {\n this.setValue?.('href', match.route);\n }\n }\n\n setUrl(value: string) {\n this.setValue?.('href', value);\n this.setValue?.('linkType', 'url');\n }\n\n setOpenInNewTab(value: boolean) {\n this.setValue?.('openInNewTab', value);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnChanges, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { WebsiteProjectService } from '../../website/website-project.service';\nimport { JsonSchemaEditorComponent } from '../../ui/json-schema-editor.component';\n\n@Component({\n selector: 'app-brick-settings',\n standalone: true,\n imports: [CommonModule, FormsModule, JsonSchemaEditorComponent],\n template: `\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-[11px] uppercase tracking-wide text-gray-500\">Brick</label>\n <select class=\"h-9 w-full rounded-md border border-gray-300 bg-white px-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none\"\n [ngModel]=\"selectedBrickId()\"\n (ngModelChange)=\"onBrickChange($event)\">\n <option value=\"\">Select a brick</option>\n @for (brick of bricks(); track brick.id) {\n <option [value]=\"brick.id\">{{ brick.name }}</option>\n }\n </select>\n @if (bricks().length === 0) {\n <div class=\"text-[11px] text-gray-400\">No bricks yet. Create one in Brick Studio to use it here.</div>\n }\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex items-center justify-between\">\n <label class=\"text-[11px] uppercase tracking-wide text-gray-500\">Props</label>\n @if (selectedBrickId()) {\n <span class=\"text-[10px] text-gray-400\">Schema driven</span>\n }\n </div>\n\n @if (!selectedBrickId()) {\n <div class=\"text-[11px] text-gray-400\">Select a brick to edit its props.</div>\n } @else if (!propsSchema) {\n <div class=\"text-[11px] text-gray-400\">This brick has no props schema. Define one in Brick Studio.</div>\n } @else {\n <div class=\"min-h-56 rounded-md border border-gray-200 bg-white p-2\">\n <app-json-schema-editor\n [schema]=\"propsSchema\"\n [value]=\"propsValue\"\n (valueChange)=\"onPropsChange($event)\">\n </app-json-schema-editor>\n </div>\n }\n </div>\n </div>\n `\n})\nexport class BrickSettingsComponent implements OnChanges {\n @Input() config: any;\n @Input() getValue!: (path: string) => unknown;\n @Input() setValue!: (path: string, value: unknown) => void;\n @Input() onChange!: () => void;\n\n private readonly projectService = inject(WebsiteProjectService);\n protected readonly bricks = this.projectService.bricks;\n protected propsValue: Record<string, unknown> = {};\n protected propsSchema: Record<string, unknown> | null = null;\n private lastBrickId = '';\n\n ngOnChanges(): void {\n this.syncPropsState();\n }\n\n selectedBrickId(): string {\n return (this.getValue?.('brickId') as string) ?? '';\n }\n\n onBrickChange(id: string) {\n this.setValue?.('brickId', id);\n this.lastBrickId = id;\n const brick = this.bricks().find(item => item.id === id);\n this.propsSchema = this.normalizeSchema(brick?.propsSchema);\n this.applyDefaultsForBrick(id);\n this.onChange?.();\n }\n\n onPropsChange(nextProps: Record<string, unknown>) {\n const next = this.cloneProps(nextProps);\n this.propsValue = next;\n this.setValue?.('props', next);\n this.onChange?.();\n }\n\n private syncPropsState() {\n const brickId = this.selectedBrickId();\n const brick = this.bricks().find(item => item.id === brickId);\n this.propsSchema = this.normalizeSchema(brick?.propsSchema);\n\n if (brickId !== this.lastBrickId) {\n this.lastBrickId = brickId;\n this.applyDefaultsForBrick(brickId);\n return;\n }\n\n const props = (this.getValue?.('props') ?? {}) as Record<string, unknown>;\n this.propsValue = this.cloneProps(props);\n }\n\n private applyDefaultsForBrick(brickId: string) {\n if (!brickId) {\n this.propsValue = {};\n this.setValue?.('props', {});\n return;\n }\n const brick = this.bricks().find(item => item.id === brickId);\n const defaults = brick?.defaultProps ? this.cloneProps(brick.defaultProps) : {};\n this.propsValue = defaults;\n this.setValue?.('props', defaults);\n }\n\n private normalizeSchema(schema?: Record<string, unknown> | null): Record<string, unknown> | null {\n if (!schema || typeof schema !== 'object' || Array.isArray(schema)) return null;\n if (schema['type']) return schema;\n const properties = schema['properties'];\n if (properties && typeof properties === 'object' && !Array.isArray(properties)) {\n return { type: 'object', ...schema };\n }\n return schema;\n }\n\n private cloneProps(props: Record<string, unknown>): Record<string, unknown> {\n return JSON.parse(JSON.stringify(props)) as Record<string, unknown>;\n }\n}\n","import { WidgetDefinition, PropertySection, defineWidget } from './widget-definition';\nimport { HeadingWidgetComponent } from './page-widgets/heading-widget.component';\nimport { TextBlockWidgetComponent } from './page-widgets/text-block-widget.component';\nimport { ButtonWidgetComponent } from './page-widgets/button-widget.component';\nimport { ButtonLinkSettingsComponent } from './page-widgets/button-link-settings.component';\nimport { BrickWidgetComponent } from './page-widgets/brick-widget.component';\nimport { BrickSettingsComponent } from './page-widgets/brick-settings.component';\nimport {\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TYPOGRAPHY_SECTION,\n STYLE_TRANSFORM_SECTION\n} from './style-properties';\n\nfunction generateId() {\n return 'field_' + Math.random().toString(36).substr(2, 9);\n}\n\nconst pluginId = 'core.web';\n\nexport const PAGE_WIDGETS: WidgetDefinition[] = [\n // 1. Heading\n defineWidget(pluginId, {\n kind: 'text',\n flavor: 'web',\n type: 'heading',\n icon: 'type',\n label: 'Heading',\n createConfig: () => ({\n id: generateId(),\n name: 'heading_' + Date.now(),\n type: 'heading',\n label: 'Page Heading',\n level: 'h2',\n style: {\n marginBottom: 16,\n fontWeight: 600\n }\n }),\n renderer: HeadingWidgetComponent,\n properties: [\n {\n label: 'Content',\n fields: [\n { key: 'label', type: 'text', label: 'Heading Text' },\n {\n key: 'level',\n type: 'select',\n label: 'Level',\n options: [\n { label: 'H1 (Hero)', value: 'h1' },\n { label: 'H2 (Section)', value: 'h2' },\n { label: 'H3 (Subsection)', value: 'h3' },\n { label: 'H4', value: 'h4' },\n { label: 'H5', value: 'h5' },\n { label: 'H6', value: 'h6' }\n ]\n }\n ]\n },\n STYLE_TYPOGRAPHY_SECTION,\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TRANSFORM_SECTION\n ]\n }),\n\n // 2. Text Block\n defineWidget(pluginId, {\n kind: 'text',\n flavor: 'web', // Explicitly web flavor\n type: 'paragraph',\n icon: 'align-left',\n label: 'Text Block',\n createConfig: () => ({\n id: generateId(),\n name: 'text_block_' + Date.now(),\n type: 'paragraph',\n text: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',\n muted: false,\n style: {}\n }),\n renderer: TextBlockWidgetComponent,\n properties: [\n {\n label: 'Content',\n fields: [\n { key: 'text', type: 'textarea', label: 'Text Content' },\n { key: 'muted', type: 'checkbox', label: 'Muted Text' }\n ]\n },\n STYLE_TYPOGRAPHY_SECTION,\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TRANSFORM_SECTION\n ]\n }),\n\n // 3. CTA Button\n defineWidget(pluginId, {\n kind: 'button',\n flavor: 'web',\n type: 'cta-button',\n icon: 'square-arrow-out-up-right', // lucide-icon name\n label: 'Primary Button',\n createConfig: () => ({\n id: generateId(),\n name: 'btn_' + Date.now(),\n type: 'cta-button',\n label: 'Call to Action',\n variant: 'primary',\n href: '',\n linkType: 'none',\n pageId: '',\n openInNewTab: false,\n style: {\n width: 240,\n height: 48,\n paddingTop: 12,\n paddingBottom: 12,\n paddingLeft: 24,\n paddingRight: 24,\n borderRadius: 8,\n backgroundColor: '#3B82F6',\n color: '#FFFFFF'\n }\n }),\n renderer: ButtonWidgetComponent,\n properties: [\n {\n label: 'Content',\n fields: [\n { key: 'label', type: 'text', label: 'Button Label' },\n {\n key: 'variant',\n type: 'select',\n label: 'Style Variant',\n options: [\n { label: 'Primary (Blue)', value: 'primary' },\n { label: 'Secondary (White)', value: 'secondary' }\n ]\n }\n ]\n },\n {\n label: 'Link',\n fields: [\n {\n key: 'link',\n type: 'custom',\n label: 'Link Settings',\n customComponent: ButtonLinkSettingsComponent\n }\n ]\n },\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TRANSFORM_SECTION\n ]\n }),\n // 4. Brick (project-local component)\n defineWidget(pluginId, {\n kind: 'text',\n flavor: 'web',\n type: 'brick',\n icon: 'layout-list',\n label: 'Brick',\n createConfig: () => ({\n id: generateId(),\n name: 'brick_' + Date.now(),\n type: 'brick',\n brickId: '',\n props: {}\n }),\n renderer: BrickWidgetComponent,\n properties: [\n {\n label: 'Brick',\n fields: [\n {\n key: 'brick',\n type: 'custom',\n label: 'Brick Settings',\n customComponent: BrickSettingsComponent\n }\n ]\n },\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION\n ]\n })\n];\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl } from '@angular/forms';\nimport { FormEngine } from '../../form-core/form-engine';\nimport { mergeAndNormalize } from '../style-helpers';\n\n@Component({\n selector: 'app-email-heading-widget',\n standalone: true,\n imports: [CommonModule],\n template: `\n <h1 *ngIf=\"level === 'h1'\" [style]=\"h1Styles\">{{ text }}</h1>\n <h2 *ngIf=\"level === 'h2'\" [style]=\"h2Styles\">{{ text }}</h2>\n <h3 *ngIf=\"level === 'h3'\" [style]=\"h3Styles\">{{ text }}</h3>\n `\n})\nexport class EmailHeadingWidgetComponent {\n @Input({ required: true }) config!: any;\n @Input() engine?: FormEngine;\n @Input() control?: FormControl;\n\n get text(): string {\n return this.config?.text || this.config?.label || '';\n }\n\n get level(): string {\n return this.config?.level || 'h2';\n }\n\n get h1Styles() {\n return mergeAndNormalize({\n 'font-size': '32px',\n 'font-weight': '700',\n 'line-height': '1.2',\n 'margin': '0 0 16px 0',\n 'color': '#1a1a1a',\n 'font-family': '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif'\n }, this.config?.style);\n }\n\n get h2Styles() {\n return mergeAndNormalize({\n 'font-size': '24px',\n 'font-weight': '600',\n 'line-height': '1.3',\n 'margin': '0 0 12px 0',\n 'color': '#1a1a1a',\n 'font-family': '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif'\n }, this.config?.style);\n }\n\n get h3Styles() {\n return mergeAndNormalize({\n 'font-size': '18px',\n 'font-weight': '600',\n 'line-height': '1.4',\n 'margin': '0 0 8px 0',\n 'color': '#1a1a1a',\n 'font-family': '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif'\n }, this.config?.style);\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl } from '@angular/forms';\nimport { FormEngine } from '../../form-core/form-engine';\nimport { mergeAndNormalize } from '../style-helpers';\n\n@Component({\n selector: 'app-email-text-widget',\n standalone: true,\n imports: [CommonModule],\n template: `\n <p [style]=\"paragraphStyles\">{{ text }}</p>\n `\n})\nexport class EmailTextWidgetComponent {\n @Input({ required: true }) config!: any;\n @Input() engine?: FormEngine;\n @Input() control?: FormControl;\n\n get text(): string {\n return this.config?.text || '';\n }\n\n get isMuted(): boolean {\n return this.config?.muted === true;\n }\n\n get paragraphStyles() {\n return mergeAndNormalize({\n 'font-size': '14px',\n 'line-height': '1.6',\n 'margin': '0 0 12px 0',\n 'color': this.isMuted ? '#6b7280' : '#374151',\n 'font-family': '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif'\n }, this.config?.style);\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl } from '@angular/forms';\nimport { FormEngine } from '../../form-core/form-engine';\nimport { mergeAndNormalize } from '../style-helpers';\n\n@Component({\n selector: 'app-email-button-widget',\n standalone: true,\n imports: [CommonModule],\n template: `\n <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n <tr>\n <td [style]=\"buttonWrapperStyles\">\n <a [href]=\"href\" [style]=\"buttonStyles\">{{ label }}</a>\n </td>\n </tr>\n </table>\n `\n})\nexport class EmailButtonWidgetComponent {\n @Input({ required: true }) config!: any;\n @Input() engine?: FormEngine;\n @Input() control?: FormControl;\n\n get label(): string {\n return this.config?.label || 'Click Here';\n }\n\n get href(): string {\n return this.config?.href || '#';\n }\n\n get variant(): string {\n return this.config?.variant || 'primary';\n }\n\n get buttonWrapperStyles() {\n return mergeAndNormalize({\n 'border-radius': '6px',\n 'background-color': this.variant === 'primary' ? '#2563eb' : '#ffffff'\n }, this.config?.style);\n }\n\n get buttonStyles() {\n const isPrimary = this.variant === 'primary';\n return mergeAndNormalize({\n 'display': 'inline-block',\n 'padding': this.config?.style?.padding ?? '12px 24px',\n 'font-size': '14px',\n 'font-weight': '600',\n 'line-height': '1.5',\n 'text-decoration': 'none',\n 'border-radius': '6px',\n 'color': isPrimary ? '#ffffff' : '#2563eb',\n 'background-color': isPrimary ? '#2563eb' : '#ffffff',\n 'border': isPrimary ? 'none' : '2px solid #2563eb',\n 'font-family': '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif'\n }, this.config?.style);\n }\n}\n","import { WidgetDefinition, defineWidget } from './widget-definition';\nimport { EmailHeadingWidgetComponent } from './email-widgets/email-heading-widget.component';\nimport { EmailTextWidgetComponent } from './email-widgets/email-text-widget.component';\nimport { EmailButtonWidgetComponent } from './email-widgets/email-button-widget.component';\nimport { STYLE_LAYOUT_SECTION, STYLE_SPACING_SECTION, STYLE_APPEARANCE_SECTION, STYLE_TYPOGRAPHY_SECTION } from './style-properties';\n\nfunction generateId() {\n return 'field_' + Math.random().toString(36).substr(2, 9);\n}\n\nconst pluginId = 'core.email';\n\nexport const EMAIL_WIDGETS: WidgetDefinition[] = [\n // Email Heading\n defineWidget(pluginId, {\n kind: 'text',\n flavor: 'email',\n type: 'email-heading',\n icon: 'type',\n label: 'Email Heading',\n renderer: EmailHeadingWidgetComponent,\n createConfig: () => ({\n id: generateId(),\n name: 'email_heading_' + Date.now(),\n type: 'email-heading',\n label: 'Welcome!',\n text: 'Welcome!',\n level: 'h2',\n style: {\n width: '100%',\n marginBottom: 12,\n color: '#0F172A'\n }\n }),\n properties: [\n {\n label: 'Content',\n fields: [\n { key: 'text', type: 'text', label: 'Heading Text' },\n {\n key: 'level',\n type: 'select',\n label: 'Level',\n options: [\n { label: 'H1', value: 'h1' },\n { label: 'H2', value: 'h2' },\n { label: 'H3', value: 'h3' }\n ]\n }\n ]\n },\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TYPOGRAPHY_SECTION\n ]\n }),\n\n // Email Text\n defineWidget(pluginId, {\n kind: 'text',\n flavor: 'email',\n type: 'email-text',\n icon: 'align-left',\n label: 'Email Text',\n renderer: EmailTextWidgetComponent,\n createConfig: () => ({\n id: generateId(),\n name: 'email_text_' + Date.now(),\n type: 'email-text',\n text: 'This is a sample paragraph for your email.',\n muted: false,\n style: {\n width: '100%',\n marginBottom: 12,\n color: '#1F2937'\n }\n }),\n properties: [\n {\n label: 'Content',\n fields: [\n { key: 'text', type: 'textarea', label: 'Text Content' },\n { key: 'muted', type: 'checkbox', label: 'Muted Text' }\n ]\n },\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TYPOGRAPHY_SECTION\n ]\n }),\n\n // Email Button\n defineWidget(pluginId, {\n kind: 'button',\n flavor: 'email',\n type: 'email-button',\n icon: 'square-arrow-out-up-right',\n label: 'Email Button',\n renderer: EmailButtonWidgetComponent,\n createConfig: () => ({\n id: generateId(),\n name: 'email_btn_' + Date.now(),\n type: 'email-button',\n label: 'Click Here',\n href: 'https://example.com',\n variant: 'primary',\n style: {\n width: 'auto',\n paddingTop: 12,\n paddingBottom: 12,\n paddingLeft: 24,\n paddingRight: 24,\n backgroundColor: '#3B82F6',\n color: '#FFFFFF',\n borderRadius: 8\n }\n }),\n properties: [\n {\n label: 'Content',\n fields: [\n { key: 'label', type: 'text', label: 'Button Label' },\n { key: 'href', type: 'text', label: 'Link URL' },\n {\n key: 'variant',\n type: 'select',\n label: 'Style Variant',\n options: [\n { label: 'Primary (Blue)', value: 'primary' },\n { label: 'Secondary (White)', value: 'secondary' }\n ]\n }\n ]\n },\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TYPOGRAPHY_SECTION\n ]\n })\n];\n","import { DesignerFlavor } from '../form-core/models';\nimport { WidgetDefinition, WidgetPack } from './widget-definition';\nimport { FIELD_WIDGETS } from './widgets';\n\nexport const DEFAULT_WIDGET_PACKS: WidgetPack[] = [\n { flavor: 'form', widgets: FIELD_WIDGETS }\n];\n\nexport function getWidgetsForFlavor(flavor: DesignerFlavor, packs: WidgetPack[] = DEFAULT_WIDGET_PACKS): WidgetDefinition[] {\n const match = packs.find(p => p.flavor === flavor);\n if (match) {\n return match.widgets;\n }\n // Fallback to first pack if no specific flavor match found\n return packs.length > 0 ? packs[0].widgets : [];\n}\n","import { inject } from '@angular/core';\nimport { DesignerContext } from '../form-designer/designer-context.service';\nimport { FieldSchema } from '../form-core/models';\nimport { mergeAndNormalize, normalizeStyle } from '../widgets/style-helpers';\n\nexport interface PluginContext {\n readonly pluginId: string;\n\n // Schema helpers\n getSchema(): ReturnType<DesignerContext['getSchema']>;\n updateSchema(mutator: (schema: ReturnType<DesignerContext['getSchema']>) => ReturnType<DesignerContext['getSchema']>): void;\n\n // Fields\n getFields(): FieldSchema[];\n getFieldById(id: string): FieldSchema | undefined;\n\n // Plugin-scoped metadata on THIS plugin's fields/schema\n getMySchemaMeta<T = unknown>(): T | undefined;\n setMySchemaMeta<T = unknown>(value: T): void;\n\n getMyFieldMeta<T = unknown>(fieldId: string): T | undefined;\n setMyFieldMeta<T = unknown>(fieldId: string, value: T): void;\n\n // Style helpers\n style: {\n normalize: (style?: Record<string, any>) => Record<string, any>;\n merge: (base?: Record<string, any>, override?: Record<string, any>) => Record<string, any>;\n };\n}\n\nexport function createPluginContext(pluginId: string): PluginContext {\n const core = inject(DesignerContext);\n\n return {\n pluginId,\n\n getSchema: () => core.getSchema(),\n updateSchema: mutator => core.updateSchema(mutator),\n\n getFields: () => core.getFields(),\n getFieldById: id => core.getFieldById(id),\n\n getMySchemaMeta: <T = unknown>() => core.getPluginSchemaMeta<T>(pluginId),\n setMySchemaMeta: <T = unknown>(value: T) => core.setPluginSchemaMeta(pluginId, value),\n\n getMyFieldMeta: <T = unknown>(fieldId: string) => core.getPluginFieldMeta<T>(fieldId, pluginId),\n setMyFieldMeta: <T = unknown>(fieldId: string, value: T) => core.setPluginFieldMeta(fieldId, pluginId, value),\n\n style: {\n normalize: normalizeStyle,\n merge: mergeAndNormalize\n }\n };\n}\n","import { Component, Input, inject, OnInit, OnChanges, SimpleChanges, OnDestroy, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { debounceTime } from 'rxjs/operators';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormEngine } from '../../form-core/form-engine';\nimport { DATA_PROVIDER } from '../../data/data-provider';\nimport { createPluginContext } from '../../plugins/plugin-context';\nimport { mergeAndNormalize } from '../style-helpers';\n\n@Component({\n selector: 'app-table-widget',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n template: `\n <div class=\"w-full bg-white border border-gray-200 rounded-lg shadow-sm flex flex-col\"\n [ngStyle]=\"getStyles()\"\n role=\"region\"\n [attr.aria-label]=\"config?.label || 'Data table'\">\n\n <!-- Toolbar: Search & Pagination Info -->\n <div class=\"px-4 py-3 border-b border-gray-200 flex items-center justify-between bg-gray-50 rounded-t-lg\"\n *ngIf=\"showToolbar()\">\n \n <!-- Search -->\n <div class=\"flex-1 max-w-xs mr-4\">\n <input *ngIf=\"config?.dataConfig?.searchEnabled\"\n [formControl]=\"searchControl\"\n type=\"text\" \n placeholder=\"Search...\" \n [attr.aria-label]=\"'Search ' + (config?.label || 'table')\"\n class=\"w-full px-3 py-1.5 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-blue-500\">\n </div>\n\n <!-- Pagination Controls -->\n <div class=\"flex items-center space-x-2 text-sm text-gray-600\">\n <span *ngIf=\"loading\" class=\"mr-2 text-blue-600\" role=\"status\" aria-live=\"polite\">Loading...</span>\n <span *ngIf=\"!loading && total > 0\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ pageStart }} - {{ pageEnd }} of {{ total }}\n </span>\n \n <div class=\"flex space-x-1 ml-2\" role=\"group\" aria-label=\"Table pagination\">\n <button (click)=\"prevPage()\"\n [disabled]=\"pageIndex === 0 || loading\"\n aria-label=\"Previous page\"\n class=\"p-1 rounded hover:bg-gray-200 disabled:opacity-50 disabled:cursor-not-allowed\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\"></path></svg>\n </button>\n <button (click)=\"nextPage()\"\n [disabled]=\"!hasNextPage() || loading\"\n aria-label=\"Next page\"\n class=\"p-1 rounded hover:bg-gray-200 disabled:opacity-50 disabled:cursor-not-allowed\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"></path></svg>\n </button>\n </div>\n </div>\n </div>\n \n <!-- Table -->\n <div class=\"overflow-x-auto flex-1 relative\">\n <div *ngIf=\"loading\" class=\"absolute inset-0 bg-white/50 z-10 flex items-center justify-center\" role=\"status\" aria-live=\"polite\">\n <span class=\"sr-only\">Loading table data...</span>\n </div>\n\n <table class=\"min-w-full divide-y divide-gray-200\" role=\"table\" [attr.aria-label]=\"config?.label || 'Data table'\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th *ngFor=\"let col of config?.columns\" \n scope=\"col\"\n class=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n {{ col.label }}\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white divide-y divide-gray-200\">\n <ng-container *ngIf=\"displayRows.length > 0; else emptyState\">\n <tr *ngFor=\"let row of displayRows; let i = index\" [class.bg-gray-50]=\"config?.striped && i % 2 === 1\">\n <td *ngFor=\"let col of config?.columns\" \n class=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\"\n [class.py-2]=\"config?.compact\">\n {{ row[col.key] }}\n </td>\n </tr>\n </ng-container>\n <ng-template #emptyState>\n <tr>\n <td [attr.colspan]=\"config?.columns?.length || 1\" class=\"px-6 py-4 text-center text-sm text-gray-400 italic\" role=\"status\">\n {{ error ? error : 'No data available' }}\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n </div>\n `,\n styles: [`.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border-width: 0; }`]\n})\nexport class TableWidgetComponent implements OnInit, OnChanges, OnDestroy {\n @Input({ required: true }) config!: any;\n @Input() engine?: FormEngine;\n @Input() control?: FormControl;\n\n private readonly dataProvider = inject(DATA_PROVIDER, { optional: true });\n private readonly pluginCtx = createPluginContext('core-table');\n\n searchControl = new FormControl('');\n loading = false;\n error: string | null = null;\n\n // Pagination State\n pageSize = 10;\n pageIndex = 0;\n total = 0;\n\n displayRows: any[] = [];\n private readonly destroyRef = inject(DestroyRef);\n private reqId = 0;\n\n ngOnInit() {\n // Setup Search Debounce\n this.searchControl.valueChanges\n .pipe(\n debounceTime(300),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.pageIndex = 0; // Reset to first page on search\n this.updateRows();\n });\n\n this.updateRows();\n\n // Dependencies\n const dependencyIds = this.getDependencyFieldIds();\n if (this.engine && dependencyIds.length > 0) {\n this.engine.valueChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(values => {\n const schema = this.engine!.getSchema();\n const depNames = schema.fields\n .filter(f => dependencyIds.includes(f.id))\n .map(f => f.name);\n\n const touched = depNames.some(name => name in values);\n if (touched) {\n this.pageIndex = 0;\n this.updateRows();\n }\n });\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config']) {\n // Reset state if source changes\n if (this.config?.dataConfig?.pageSize) {\n this.pageSize = this.config.dataConfig.pageSize;\n } else {\n this.pageSize = 10;\n }\n if (changes['config'].isFirstChange()) {\n // handled by ngOnInit\n } else {\n this.pageIndex = 0;\n this.updateRows();\n }\n }\n if (changes['engine'] && !changes['engine'].isFirstChange()) {\n this.updateRows();\n }\n }\n\n ngOnDestroy() {\n // Cleanup handled by takeUntilDestroyed\n }\n\n getStyles() {\n return mergeAndNormalize(\n {\n width: '100%',\n display: 'flex',\n flexDirection: 'column'\n },\n this.config?.style\n );\n }\n\n // UI Helpers\n showToolbar(): boolean {\n // Show if search enabled OR if we have multiple pages of data\n return !!this.config?.dataConfig?.searchEnabled || this.total > this.pageSize;\n }\n\n get pageStart(): number {\n if (this.total === 0) return 0;\n return (this.pageIndex * this.pageSize) + 1;\n }\n\n get pageEnd(): number {\n return Math.min((this.pageIndex + 1) * this.pageSize, this.total);\n }\n\n prevPage() {\n if (this.pageIndex > 0) {\n this.pageIndex--;\n this.updateRows();\n }\n }\n\n nextPage() {\n if (this.hasNextPage()) {\n this.pageIndex++;\n this.updateRows();\n }\n }\n\n hasNextPage(): boolean {\n return (this.pageIndex + 1) * this.pageSize < this.total;\n }\n\n private async updateRows() {\n const currentReqId = ++this.reqId;\n this.loading = true;\n this.error = null;\n\n // 1. Unified DataProvider (Source-Backed or Non-Static)\n // We use queryList if we have data config. \n if (this.dataProvider && this.config?.dataConfig) {\n try {\n const isStatic = this.config.dataConfig.type === 'static';\n\n // Use queryList for consistent paging across source/static configs.\n\n const result = await this.dataProvider.queryList(\n this.config,\n {\n limit: this.pageSize,\n offset: this.pageIndex * this.pageSize,\n term: this.config.dataConfig.searchEnabled ? (this.searchControl.value || '') : undefined,\n sort: this.config.dataConfig.sort\n },\n this.engine\n );\n\n if (this.reqId === currentReqId) {\n this.displayRows = result.rows;\n this.total = result.total;\n this.loading = false;\n }\n return;\n } catch (err) {\n if (this.reqId === currentReqId) {\n this.error = 'Failed to load data';\n this.loading = false;\n }\n // console.error('TableWidget: Failed to load data from provider', err); // Do not log per component\n }\n return;\n }\n\n // 2. Legacy fallback for really old configs / no dataConfig object\n // (Just render static rows from 'rows' prop if present, or binding)\n // This path essentially means \"Static\" without explicit dataConfig.\n\n let rows = (this.config?.rows && this.config.rows.length > 0) ? this.config.rows : [];\n const boundRows = this.getRowsFromBinding(rows);\n if (boundRows) rows = boundRows;\n\n // Simple client-side paging for legacy\n this.total = rows.length;\n const start = this.pageIndex * this.pageSize;\n if (rows.length > 0) {\n this.displayRows = rows.slice(start, start + this.pageSize);\n } else {\n // 4. Default placeholder if truly empty\n // Only show placeholder if NOT loading and NO data\n this.displayRows = [\n { id: '1', name: 'Sample Row 1', status: 'Active' },\n { id: '2', name: 'Sample Row 2', status: 'Pending' }\n ];\n this.total = 2;\n }\n\n this.loading = false;\n }\n\n private getRowsFromBinding(existingRows: any[]): any[] | null {\n if (!this.engine) return null;\n\n const sourceFieldId: string | undefined = this.config?.rowCountSourceFieldId;\n if (!sourceFieldId) return null;\n\n const sourceField = this.pluginCtx.getFieldById(sourceFieldId);\n if (!sourceField?.name) return null;\n\n const raw = this.engine.getValue(sourceField.name);\n const count = Number.parseInt(String(raw ?? '0'), 10);\n if (!Number.isFinite(count) || count <= 0) return null;\n\n const templateRows = existingRows.length > 0 ? existingRows : [\n { name: 'Sample Row', status: 'Active' }\n ];\n\n const rows: any[] = [];\n for (let i = 0; i < count; i++) {\n const template = templateRows[i % templateRows.length];\n rows.push({\n ...template,\n __index: i + 1\n });\n }\n\n return rows;\n }\n\n private getDependencyFieldIds(): string[] {\n const cfg = this.config?.dataConfig;\n if (!cfg || !cfg.dependsOn || cfg.dependsOn.length === 0) return [];\n return cfg.dependsOn\n .map((d: any) => d.fieldId)\n .filter((id: any): id is string => !!id);\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { UiIconModule } from '../../ui/ui-icon.module';\n\n@Component({\n selector: 'app-table-inspector',\n standalone: true,\n imports: [CommonModule, FormsModule, UiIconModule],\n template: `\n <div class=\"flex flex-col gap-4 p-2 bg-gray-50 border border-gray-200 rounded\">\n \n <!-- Columns Manager -->\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex items-center justify-between\">\n <span class=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">Columns</span>\n <button (click)=\"addColumn()\" class=\"text-blue-600 hover:text-blue-700 text-xs font-medium flex items-center gap-1\">\n <lucide-icon name=\"plus\" class=\"w-3 h-3\"></lucide-icon> Add\n </button>\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <div *ngFor=\"let col of columns; let i = index\" class=\"flex gap-2\">\n <input [(ngModel)]=\"col.key\" (blur)=\"updateColumns()\" \n placeholder=\"Key\" class=\"w-1/3 text-xs border border-gray-300 rounded px-1 h-7\">\n <input [(ngModel)]=\"col.label\" (blur)=\"updateColumns()\" \n placeholder=\"Label\" class=\"flex-1 text-xs border border-gray-300 rounded px-1 h-7\">\n <button (click)=\"removeColumn(i)\" class=\"text-red-500 hover:bg-red-50 p-1 rounded\">\n <lucide-icon name=\"trash-2\" class=\"w-3 h-3\"></lucide-icon>\n </button>\n </div>\n <p *ngIf=\"columns.length === 0\" class=\"text-xs text-gray-400 italic\">No columns defined.</p>\n </div>\n </div>\n\n <div class=\"h-px bg-gray-200 w-full\"></div>\n\n <!-- Simple Row Editor (Just basic data entry for demo) -->\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex items-center justify-between\">\n <span class=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">Data Rows</span>\n <button (click)=\"addRow()\" class=\"text-blue-600 hover:text-blue-700 text-xs font-medium flex items-center gap-1\">\n <lucide-icon name=\"plus\" class=\"w-3 h-3\"></lucide-icon> Add Row\n </button>\n </div>\n \n <div class=\"bg-white border border-gray-200 rounded max-h-40 overflow-auto\">\n <table class=\"w-full text-xs\">\n <thead class=\"bg-gray-100 text-gray-500\">\n <tr>\n <th *ngFor=\"let col of columns\" class=\"p-1 text-left font-medium\">{{col.label}}</th>\n <th class=\"w-6\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of rows; let i = index\" class=\"border-t border-gray-100\">\n <td *ngFor=\"let col of columns\" class=\"p-1\">\n <input [(ngModel)]=\"row[col.key]\" (blur)=\"updateRows()\" \n class=\"w-full border-none p-0 text-xs focus:ring-0\">\n </td>\n <td class=\"p-1 text-center\">\n <button (click)=\"removeRow(i)\" class=\"text-red-400 hover:text-red-600\">\n <lucide-icon name=\"x\" class=\"w-3 h-3\"></lucide-icon>\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n <p *ngIf=\"rows.length === 0\" class=\"p-2 text-center text-gray-400 italic\">No data rows.</p>\n </div>\n </div>\n\n <div class=\"h-px bg-gray-200 w-full\"></div>\n `\n})\nexport class TableInspectorComponent {\n // private readonly context = inject(DesignerContext);\n // private readonly pluginId = 'core-table';\n\n // Provided by parent via *ngComponentOutlet inputs\n @Input() config: any;\n @Input() getValue!: (path: string) => any;\n @Input() setValue!: (path: string, value: any) => void;\n @Input() onChange!: () => void;\n\n get columns() {\n return this.getValue('columns') || [];\n }\n\n get rows() {\n return this.getValue('rows') || [];\n }\n\n // --- Cross-plugin metadata helpers for row count binding ---\n // REMOVED: Managed by generic field-reference property in main properties panel\n\n addColumn() {\n const cols = [...this.columns];\n cols.push({ key: `col${cols.length + 1}`, label: 'New Column' });\n this.setValue('columns', cols);\n }\n\n removeColumn(index: number) {\n const cols = [...this.columns];\n cols.splice(index, 1);\n this.setValue('columns', cols);\n }\n\n updateColumns() {\n this.setValue('columns', this.columns);\n }\n\n addRow() {\n const rows = [...this.rows];\n const newRow: any = {};\n this.columns.forEach((c: any) => newRow[c.key] = '-');\n rows.push(newRow);\n this.setValue('rows', rows);\n }\n\n removeRow(index: number) {\n const rows = [...this.rows];\n rows.splice(index, 1);\n this.setValue('rows', rows);\n }\n\n updateRows() {\n this.setValue('rows', this.rows);\n }\n}\n","import { WidgetDefinition, defineWidget } from './widget-definition';\nimport { TableWidgetComponent } from './page-widgets/table-widget.component';\n\nimport { TableInspectorComponent } from './page-widgets/table-inspector.component';\nimport { STYLE_APPEARANCE_SECTION, STYLE_LAYOUT_SECTION, STYLE_SPACING_SECTION, STYLE_TRANSFORM_SECTION } from './style-properties';\n\nexport const TABLE_WIDGET: WidgetDefinition = defineWidget('core.web', {\n kind: 'table',\n // Flavor is undefined so it can be used across multiple flavors (handled by plugin filtering)\n flavor: undefined,\n type: 'table',\n icon: 'table', // Assuming Lucide 'table' icon is available\n label: 'Table',\n renderer: TableWidgetComponent,\n dataConsumer: 'list',\n dataBinding: { shape: 'list', targetPath: 'rows' },\n createConfig: () => ({\n label: 'Info Table',\n appearance: 'outline',\n columns: [\n { key: 'name', label: 'Name' },\n { key: 'status', label: 'Status' }\n ],\n rows: [], // Will fallback to sample data in component\n compact: false,\n striped: true,\n style: {\n width: '100%',\n marginBottom: 12\n }\n }),\n properties: [\n {\n label: 'General',\n fields: [\n { key: 'label', label: 'Label', type: 'text' },\n {\n key: 'rowCountSourceFieldId',\n label: 'Row Count Source',\n type: 'field-reference',\n allowedFieldTypes: ['number', 'text']\n }\n ]\n },\n {\n label: 'Appearance',\n fields: [\n { key: 'compact', label: 'Compact Density', type: 'checkbox' },\n { key: 'striped', label: 'Striped Rows', type: 'checkbox' }\n ]\n },\n {\n label: 'Columns & Data',\n fields: [\n {\n key: 'tableEditor',\n label: 'Editor',\n type: 'custom',\n customComponent: TableInspectorComponent\n }\n ]\n },\n STYLE_LAYOUT_SECTION,\n STYLE_SPACING_SECTION,\n STYLE_APPEARANCE_SECTION,\n STYLE_TRANSFORM_SECTION\n ]\n});\n","import { DesignerFlavor } from '../form-core/models';\nimport { WidgetDefinition } from '../widgets/widget-definition';\nimport { FIELD_WIDGETS } from '../widgets/widgets';\nimport { PAGE_WIDGETS } from '../widgets/page-widgets';\nimport { EMAIL_WIDGETS } from '../widgets/email-widgets';\nimport { DesignerPlugin } from './designer-plugin';\nimport { TABLE_WIDGET } from '../widgets/table-widget';\nimport { DEFAULT_WEBSITE_SECTIONS } from '../website/website-section-library';\n\nexport const CORE_DESIGNER_PLUGINS: DesignerPlugin[] = [\n {\n id: 'core-form',\n label: 'Core Form Widgets',\n flavors: ['form'],\n widgets: FIELD_WIDGETS,\n version: '1.0.0'\n },\n {\n id: 'core-web',\n label: 'Core Web Widgets',\n flavors: ['web'],\n widgets: PAGE_WIDGETS,\n sections: DEFAULT_WEBSITE_SECTIONS,\n version: '1.0.0'\n },\n {\n id: 'core-email',\n label: 'Core Email Widgets',\n flavors: ['email'],\n widgets: EMAIL_WIDGETS,\n version: '1.0.0'\n },\n {\n id: 'core-table',\n label: 'Core Table Widget',\n flavors: ['web', 'email'],\n widgets: [TABLE_WIDGET],\n version: '1.0.0'\n }\n];\n\nexport function flattenPluginWidgets(plugins: DesignerPlugin[], flavor?: DesignerFlavor): WidgetDefinition[] {\n let widgets: WidgetDefinition[] = [];\n\n if (!flavor) {\n widgets = plugins.flatMap(p => p.widgets ?? []);\n } else {\n const matchingPlugins = plugins.filter(p => p.flavors.includes(flavor));\n widgets = matchingPlugins.flatMap(p => p.widgets ?? []).filter(w => !w.flavor || w.flavor === flavor);\n }\n\n // Check for Duplicates\n const seen = new Map<string, number>();\n for (const w of widgets) {\n if (w.id) {\n seen.set(w.id, (seen.get(w.id) ?? 0) + 1);\n }\n }\n\n const duplicates = Array.from(seen.entries()).filter(([, count]) => count > 1);\n if (duplicates.length) {\n console.warn('[ngx-form-designer] Duplicate widget IDs detected:', duplicates.map(([id]) => id));\n }\n\n return widgets;\n}\n","import { Provider } from '@angular/core';\nimport { DESIGNER_PLUGINS, DesignerPlugin } from './designer-plugin';\nimport { flattenPluginWidgets } from './core-plugins';\nimport { WIDGET_DEFINITIONS } from '../widgets/widget-definition';\nimport { DESIGNER_SECTIONS, DesignerSectionDefinition } from './section-definition';\n\nexport function provideDesignerPlugins(plugins: DesignerPlugin[]): Provider[] {\n return [\n { provide: DESIGNER_PLUGINS, useValue: plugins, multi: true },\n {\n provide: WIDGET_DEFINITIONS,\n multi: true,\n useFactory: (allPlugins: DesignerPlugin[][]) =>\n flattenPluginWidgets(allPlugins.flat()),\n deps: [DESIGNER_PLUGINS]\n },\n {\n provide: DESIGNER_SECTIONS,\n multi: true,\n useFactory: (allPlugins: DesignerPlugin[][]) =>\n flattenPluginSections(allPlugins.flat()),\n deps: [DESIGNER_PLUGINS]\n }\n ];\n}\n\nfunction flattenPluginSections(plugins: DesignerPlugin[]): DesignerSectionDefinition[] {\n return plugins.flatMap(plugin => plugin.sections ?? []);\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nexport interface FormTheme {\n id: string;\n name: string;\n properties: Record<string, string>;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeService {\n private themes: FormTheme[] = [\n {\n id: 'default',\n name: 'Default Light',\n properties: {\n '--form-bg': '#ffffff',\n '--form-text': '#333333',\n '--field-bg': '#fafafa',\n '--primary': '#3f51b5'\n }\n },\n {\n id: 'dark',\n name: 'Dark Mode',\n properties: {\n '--form-bg': '#333333',\n '--form-text': '#ffffff',\n '--field-bg': '#424242',\n '--primary': '#bb86fc'\n }\n }\n ];\n\n constructor(@Inject(DOCUMENT) private document: Document) { }\n\n setTheme(themeId: string) {\n const theme = this.themes.find(t => t.id === themeId);\n if (theme) {\n Object.entries(theme.properties).forEach(([key, value]) => {\n this.document.documentElement.style.setProperty(key, value);\n });\n }\n }\n\n getThemes() {\n return this.themes;\n }\n}\n","\nimport { Injectable } from '@angular/core';\nimport { DataCatalog, DataSourceDefinition } from './data-catalog';\n\ninterface DataSourceInstance {\n def: DataSourceDefinition;\n rows: any[]; // parsed rows; kept for future DataProvider work\n}\n\n@Injectable({ providedIn: 'root' })\nexport class InMemoryDataCatalogService extends DataCatalog {\n private sources: DataSourceInstance[] = [];\n\n listSources(): DataSourceDefinition[] {\n return this.sources.map(s => s.def);\n }\n\n getSourceById(id: string): DataSourceDefinition | undefined {\n return this.sources.find(s => s.def.id === id)?.def;\n }\n\n getRows(id: string): any[] {\n return this.sources.find(s => s.def.id === id)?.rows ?? [];\n }\n\n upsert(def: DataSourceDefinition, rows: any[]): void {\n const idx = this.sources.findIndex(s => s.def.id === def.id);\n if (idx >= 0) {\n this.sources[idx] = { def, rows };\n } else {\n this.sources.push({ def, rows });\n }\n }\n\n remove(id: string): void {\n this.sources = this.sources.filter(s => s.def.id !== id);\n }\n}\n","import { Injectable, InjectionToken, Provider, EnvironmentProviders, inject } from '@angular/core';\nimport { HttpClient, provideHttpClient } from '@angular/common/http';\nimport { firstValueFrom } from 'rxjs';\nimport { DataSourceClient, DataSourceColumn, DataSourceQuery, DataSourceQueryResult, DATA_SOURCE_CLIENT, CreateSourceRequest } from './data-source-client';\nimport { DataSourceDefinition } from './data-catalog';\n\nexport interface HttpDataSourceClientConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n cacheTtlMs?: {\n sources?: number;\n columns?: number;\n };\n}\n\nexport const HTTP_DATA_SOURCE_CLIENT_CONFIG = new InjectionToken<HttpDataSourceClientConfig>('HTTP_DATA_SOURCE_CLIENT_CONFIG');\n\n@Injectable({ providedIn: 'root' })\nexport class HttpDataSourceClient implements DataSourceClient {\n private http = inject(HttpClient);\n private config = inject(HTTP_DATA_SOURCE_CLIENT_CONFIG);\n\n private sourceCache = {\n data: null as DataSourceDefinition[] | null,\n ts: 0\n };\n\n private columnCache = new Map<string, { data: DataSourceColumn[], ts: number }>();\n\n async listSources(): Promise<DataSourceDefinition[]> {\n const ttl = this.config.cacheTtlMs?.sources ?? 30_000;\n const now = Date.now();\n\n if (this.sourceCache.data && (now - this.sourceCache.ts < ttl)) {\n return this.sourceCache.data;\n }\n\n const url = `${this.stripTrailingSlash(this.config.baseUrl)}/data-sources`;\n const headers = await this.mergeHeaders();\n\n try {\n const res = await firstValueFrom(this.http.get<DataSourceDefinition[]>(url, { headers }));\n this.sourceCache = { data: res, ts: now };\n return res;\n } catch (err: any) {\n throw new Error(`Failed to list sources: ${err.status} ${err.statusText || ''}`);\n }\n }\n\n async getSourceById(id: string): Promise<DataSourceDefinition | undefined> {\n // Try cache first\n if (this.sourceCache.data) {\n const found = this.sourceCache.data.find(s => s.id === id);\n if (found) return found;\n }\n\n // If not in cache or cache empty, fetch directly\n const url = `${this.stripTrailingSlash(this.config.baseUrl)}/data-sources/${encodeURIComponent(id)}`;\n const headers = await this.mergeHeaders();\n\n try {\n return await firstValueFrom(this.http.get<DataSourceDefinition>(url, { headers }));\n } catch (err: any) {\n // If 404, return undefined check? Or let it throw? \n // Contract says return undefined if not found usually, but Http will throw.\n // Let's explicitly catch 404.\n if (err.status === 404) return undefined;\n throw new Error(`Failed to get source ${id}: ${err.status} ${err.statusText || ''}`);\n }\n }\n\n async getColumns(id: string): Promise<DataSourceColumn[]> {\n const ttl = this.config.cacheTtlMs?.columns ?? 60_000;\n const now = Date.now();\n const cached = this.columnCache.get(id);\n\n if (cached && (now - cached.ts < ttl)) {\n return cached.data;\n }\n\n const url = `${this.stripTrailingSlash(this.config.baseUrl)}/data-sources/${encodeURIComponent(id)}/columns`;\n const headers = await this.mergeHeaders();\n\n try {\n const res = await firstValueFrom(this.http.get<DataSourceColumn[]>(url, { headers }));\n this.columnCache.set(id, { data: res, ts: now });\n return res;\n } catch (err: any) {\n // Fallback: return empty or throw? \n // Generally empty array if columns not found is safer for UI, but for API error we should probably throw or log (no console.log allowed).\n // Let's return empty array on failure as per typical resilience\n return [];\n }\n }\n\n async query(id: string, q?: DataSourceQuery): Promise<DataSourceQueryResult> {\n const url = `${this.stripTrailingSlash(this.config.baseUrl)}/data-sources/${encodeURIComponent(id)}/query`;\n const headers = await this.mergeHeaders();\n\n try {\n return await firstValueFrom(this.http.post<DataSourceQueryResult>(url, q || {}, { headers }));\n } catch (err: any) {\n throw new Error(`Query failed for source ${id}: ${err.status} ${err.statusText || ''}`);\n }\n }\n\n async createSource(req: CreateSourceRequest): Promise<DataSourceDefinition> {\n const url = `${this.stripTrailingSlash(this.config.baseUrl)}/data-sources`;\n const headers = await this.mergeHeaders();\n\n try {\n const res = await firstValueFrom(this.http.post<DataSourceDefinition>(url, req, { headers }));\n // Invalidate Caches\n this.sourceCache = { data: null, ts: 0 };\n return res;\n } catch (err: any) {\n throw new Error(`Failed to create source: ${err.status} ${err.statusText || ''}`);\n }\n }\n\n async deleteSource(sourceId: string): Promise<void> {\n const url = `${this.stripTrailingSlash(this.config.baseUrl)}/data-sources/${encodeURIComponent(sourceId)}`;\n const headers = await this.mergeHeaders();\n\n try {\n await firstValueFrom(this.http.delete(url, { headers }));\n // Invalidate Caches\n this.sourceCache = { data: null, ts: 0 };\n this.columnCache.delete(sourceId);\n } catch (err: any) {\n throw new Error(`Failed to delete source ${sourceId}: ${err.status} ${err.statusText || ''}`);\n }\n }\n\n private stripTrailingSlash(url: string): string {\n return url.endsWith('/') ? url.slice(0, -1) : url;\n }\n\n private async mergeHeaders(): Promise<Record<string, string>> {\n const base = this.config.headers || {};\n let dynamic = {};\n if (this.config.getHeaders) {\n const res = this.config.getHeaders();\n dynamic = res instanceof Promise ? await res : res;\n }\n return { ...base, ...dynamic };\n }\n}\n\nexport function provideHttpDataSourceClient(config: HttpDataSourceClientConfig): (Provider | EnvironmentProviders)[] {\n return [\n provideHttpClient(),\n { provide: HTTP_DATA_SOURCE_CLIENT_CONFIG, useValue: config },\n { provide: DATA_SOURCE_CLIENT, useClass: HttpDataSourceClient }\n ];\n}\n","/*\n * Public API Surface of ngx-form-designer\n */\n\n// Models & Core\nexport * from './lib/form-core/models';\nexport * from './lib/form-core/form-engine';\nexport * from './lib/form-core/schema-factory';\nexport * from './lib/form-core/schema-guard';\n\n// Renderer\nexport * from './lib/form-renderer/json-form-renderer.component';\nexport * from './lib/form-renderer/layout-node.component';\nexport * from './lib/email-renderer/email-renderer.component';\n\n// Designer\nexport * from './lib/form-designer/json-form-designer.component';\nexport * from './lib/form-designer/form-designer-shell.component';\nexport * from './lib/form-designer/designer-state.service';\nexport * from './lib/form-designer/designer-context.service'; // Public Plugin API\n// export * from './lib/form-designer/helpers'; // Export new helpers\nexport * from './lib/form-designer/layout-canvas.component';\nexport * from './lib/form-designer/field-palette.component';\nexport * from './lib/form-designer/properties-panel.component';\nexport * from './lib/form-designer/template-library';\n\n// Inspector & Panels\nexport * from './lib/form-designer/widget-inspector.component';\nexport * from './lib/form-designer/dynamic-properties/dynamic-properties.component';\nexport * from './lib/form-designer/data-panel/data-panel.component';\nexport * from './lib/form-designer/rules-editor/rules-panel/rules-panel.component';\nexport * from './lib/form-designer/events-panel/events-panel.component';\nexport * from './lib/form-designer/services/widget-definition-resolver.service';\n\n// Inspector Sections (Reusable)\nexport * from './lib/form-designer/inspector-sections/inspector-layout-section.component';\nexport * from './lib/form-designer/inspector-sections/inspector-spacing-section.component';\nexport * from './lib/form-designer/inspector-sections/inspector-size-section.component';\nexport * from './lib/form-designer/inspector-sections/inspector-position-section.component';\nexport * from './lib/form-designer/inspector-sections/inspector-typography-section.component';\nexport * from './lib/form-designer/inspector-sections/inspector-borders-section.component';\nexport * from './lib/form-designer/inspector-sections/inspector-backgrounds-section.component';\nexport * from './lib/form-designer/inspector-sections/inspector-effects-section.component';\nexport * from './lib/form-designer/inspector-sections/inspector-advanced-section.component';\n\n// Website Designer (multi-page)\nexport * from './lib/website/website-project.models';\nexport * from './lib/website/website-project.service';\nexport * from './lib/website/website-designer-shell.component';\nexport * from './lib/website/website-brick-studio.component';\nexport * from './lib/website/website-preview-shell.component';\nexport * from './lib/website/website-section-library';\n\n// Widgets\nexport * from './lib/widgets/widget-definition'; // Exports WidgetDefinition, PropertyField, PropertySection, buildWidgetId, defineWidget, WIDGET_ID_SEPARATOR\n// Plugin authors: Please use defineWidget(pluginId, ...) to ensure unique, stable IDs.\n\nexport * from './lib/widgets/widgets'; // Core widgets';\nexport * from './lib/widgets/page-widgets';\nexport * from './lib/widgets/email-widgets';\nexport * from './lib/widgets/widget-packs';\n\n// Plugin Tools\nexport * from './lib/plugins/designer-plugin';\nexport * from './lib/plugins/core-plugins';\nexport * from './lib/plugins/plugin-providers';\nexport * from './lib/plugins/plugin-context'; // Plugin DX Helper\nexport * from './lib/plugins/section-definition';\n\n// Theme\nexport * from './lib/theme/theme.service';\n\n// UI Primitives\nexport * from './lib/ui/ui-tabs.component';\nexport * from './lib/ui/ui-accordion.component';\nexport * from './lib/ui/ui-field-wrapper.component';\nexport * from './lib/ui/ui-input.component';\nexport * from './lib/ui/ui-dimension.component';\nexport * from './lib/ui/ui-box-model.component';\nexport * from './lib/ui/ui-edge-box.component';\nexport * from './lib/ui/ui-color-swatch.component';\nexport * from './lib/ui/ui-range-number.component';\nexport * from './lib/ui/ui-select-icon.component';\n\n// Style helpers\nexport * from './lib/widgets/style-properties';\nexport * from './lib/widgets/style-sections';\nexport * from './lib/widgets/style-helpers';\n\n// Data\nexport * from './lib/data/data-catalog';\nexport * from './lib/data/data-provider';\nexport * from './lib/data/in-memory-data-catalog.service';\nexport * from './lib/form-designer/global-data-manager.component';\nexport * from './lib/data/file-upload-client';\nexport * from './lib/data/data-source-client';\nexport * from './lib/data/http-data-source-client';\nexport * from './lib/data/data-source-parsers';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uuidv4","i1.DesignerStateService","i2","i4","i3","i1","debounceTime","generateId","pluginId"],"mappings":"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"}