{"version":3,"file":"eru-studio.mjs","sources":["../../../projects/eru-studio/src/lib/models/eru-project.model.ts","../../../projects/eru-studio/src/lib/constants/app-constants.ts","../../../projects/eru-studio/src/lib/services/component-registry.service.ts","../../../projects/eru-studio/src/lib/services/eru-app-route.service.ts","../../../projects/eru-studio/src/lib/utils/json.util.ts","../../../projects/eru-studio/src/lib/services/logic-evaluator.service.ts","../../../projects/eru-studio/src/lib/utils/payload-field.util.ts","../../../projects/eru-studio/src/lib/utils/file-download.util.ts","../../../projects/eru-studio/src/lib/utils/page-patch.util.ts","../../../projects/eru-studio/src/lib/services/eru-studio.store.ts","../../../projects/eru-studio/src/lib/services/eru-api.service.ts","../../../projects/eru-studio/src/lib/services/component-schema.service.ts","../../../projects/eru-studio/src/lib/services/property-to-tailwind.service.ts","../../../projects/eru-studio/src/lib/services/form-validation.service.ts","../../../projects/eru-studio/src/lib/services/row-data-context.ts","../../../projects/eru-studio/src/lib/utils/breakpoint.util.ts","../../../projects/eru-studio/src/lib/services/breakpoint-scope.service.ts","../../../projects/eru-studio/src/lib/utils/number-format.util.ts","../../../projects/eru-studio/src/lib/components/base-component/base-component.ts","../../../projects/eru-studio/src/lib/directives/canvas-event-handler.directive.ts","../../../projects/eru-studio/src/lib/components/text/text.component.ts","../../../projects/eru-studio/src/lib/components/text/text.component.html","../../../projects/eru-studio/src/lib/components/grid/grid-card-host.component.ts","../../../projects/eru-studio/src/lib/components/tile/tile.component.ts","../../../projects/eru-studio/src/lib/components/tile/tile.component.html","../../../projects/eru-studio/src/lib/components/button/button.component.ts","../../../projects/eru-studio/src/lib/components/button/button.component.html","../../../projects/eru-studio/src/lib/components/image/image.component.ts","../../../projects/eru-studio/src/lib/components/image/image.component.html","../../../projects/eru-studio/src/lib/components/button-toggle/button-toggle.component.ts","../../../projects/eru-studio/src/lib/components/button-toggle/button-toggle.component.html","../../../projects/eru-studio/src/lib/components/badge/badge.component.ts","../../../projects/eru-studio/src/lib/components/badge/badge.component.html","../../../projects/eru-studio/src/lib/components/chips/chips.component.ts","../../../projects/eru-studio/src/lib/components/chips/chips.component.html","../../../projects/eru-studio/src/lib/components/icon/icon.component.ts","../../../projects/eru-studio/src/lib/components/icon/icon.component.html","../../../projects/eru-studio/src/lib/components/progress-bar/progress-bar.component.ts","../../../projects/eru-studio/src/lib/components/progress-bar/progress-bar.component.html","../../../projects/eru-studio/src/lib/components/progress-spinner/progress-spinner.component.ts","../../../projects/eru-studio/src/lib/components/progress-spinner/progress-spinner.component.html","../../../projects/eru-studio/src/lib/components/timer/timer.component.ts","../../../projects/eru-studio/src/lib/components/timer/timer.component.html","../../../projects/eru-studio/src/lib/components/flex-container/flex-container.component.ts","../../../projects/eru-studio/src/lib/components/flex-container/flex-container.component.html","../../../projects/eru-studio/src/lib/components/grid-container/grid-container.component.ts","../../../projects/eru-studio/src/lib/components/grid-container/grid-container.component.html","../../../projects/eru-studio/src/lib/components/card/card.component.ts","../../../projects/eru-studio/src/lib/components/card/card.component.html","../../../projects/eru-studio/src/lib/components/divider/divider.component.ts","../../../projects/eru-studio/src/lib/components/divider/divider.component.html","../../../projects/eru-studio/src/lib/components/expansion-panel/expansion-panel.component.ts","../../../projects/eru-studio/src/lib/components/expansion-panel/expansion-panel.component.html","../../../projects/eru-studio/src/lib/components/list/list.component.ts","../../../projects/eru-studio/src/lib/components/list/list.component.html","../../../projects/eru-studio/src/lib/components/stepper/stepper.component.ts","../../../projects/eru-studio/src/lib/components/stepper/stepper.component.html","../../../projects/eru-studio/src/lib/components/sidebar-stepper/sidebar-stepper.component.ts","../../../projects/eru-studio/src/lib/components/sidebar-stepper/sidebar-stepper.component.html","../../../projects/eru-studio/src/lib/components/tree/tree.component.ts","../../../projects/eru-studio/src/lib/components/tree/tree.component.html","../../../projects/eru-studio/src/lib/components/grid-list/grid-list.component.ts","../../../projects/eru-studio/src/lib/components/grid-list/grid-list.component.html","../../../projects/eru-studio/src/lib/components/radio/radio.component.ts","../../../projects/eru-studio/src/lib/components/radio/radio.component.html","../../../projects/eru-studio/src/lib/components/slider/slider.component.ts","../../../projects/eru-studio/src/lib/components/slider/slider.component.html","../../../projects/eru-studio/src/lib/components/slide-toggle/slide-toggle.component.ts","../../../projects/eru-studio/src/lib/components/slide-toggle/slide-toggle.component.html","../../../projects/eru-studio/src/lib/components/autocomplete/autocomplete.component.ts","../../../projects/eru-studio/src/lib/components/autocomplete/autocomplete.component.html","../../../projects/eru-studio/src/lib/eru_components/priority/phone/phone.component.ts","../../../projects/eru-studio/src/lib/eru_components/priority/phone/phone.component.html","../../../projects/eru-studio/src/lib/utils/menu-item.util.ts","../../../projects/eru-studio/src/lib/components/menu/menu-panel.component.ts","../../../projects/eru-studio/src/lib/components/toolbar/toolbar.component.ts","../../../projects/eru-studio/src/lib/components/toolbar/toolbar.component.html","../../../projects/eru-studio/src/lib/components/menu/menu.component.ts","../../../projects/eru-studio/src/lib/components/menu/menu.component.html","../../../projects/eru-studio/src/lib/components/sidenav/sidenav.component.ts","../../../projects/eru-studio/src/lib/components/sidenav/sidenav.component.html","../../../projects/eru-studio/src/lib/components/tabs/tabs.component.ts","../../../projects/eru-studio/src/lib/components/tabs/tabs.component.html","../../../projects/eru-studio/src/lib/components/nav-menu/nav-menu.component.ts","../../../projects/eru-studio/src/lib/components/nav-menu/nav-menu.component.html","../../../projects/eru-studio/src/lib/components/runtime-canvas/runtime-canvas.component.ts","../../../projects/eru-studio/src/lib/components/runtime-canvas/runtime-canvas.component.html","../../../projects/eru-studio/src/lib/components/nav-outlet/nav-outlet.component.ts","../../../projects/eru-studio/src/lib/components/nav-outlet/nav-outlet.component.html","../../../projects/eru-studio/src/lib/components/grid/grid.component.ts","../../../projects/eru-studio/src/lib/components/grid/grid.component.html","../../../projects/eru-studio/src/lib/utils/chart-data.util.ts","../../../projects/eru-studio/src/lib/components/chart-base/chart-base.component.ts","../../../projects/eru-studio/src/lib/components/chart-base/chart-selectors.component.ts","../../../projects/eru-studio/src/lib/components/line-chart/line-chart.component.ts","../../../projects/eru-studio/src/lib/components/bar-chart/bar-chart.component.ts","../../../projects/eru-studio/src/lib/components/pie-chart/pie-chart.component.ts","../../../projects/eru-studio/src/lib/components/eru-page/eru-page.component.ts","../../../projects/eru-studio/src/lib/components/eru-page/eru-page.component.html","../../../projects/eru-studio/src/lib/components/page/page-ref-panel.component.ts","../../../projects/eru-studio/src/lib/components/page/page.component.ts","../../../projects/eru-studio/src/lib/components/page/page.component.html","../../../projects/eru-studio/src/lib/components/widget/widget.component.ts","../../../projects/eru-studio/src/lib/components/widget/widget.component.html","../../../projects/eru-studio/src/lib/components/floating-panel/floating-panel.component.ts","../../../projects/eru-studio/src/lib/components/floating-panel/floating-panel.component.html","../../../projects/eru-studio/src/lib/components/layer-tree-item/layer-tree-item.component.ts","../../../projects/eru-studio/src/lib/components/layer-tree-item/layer-tree-item.component.html","../../../projects/eru-studio/src/lib/components/layers-panel/layers-panel.component.ts","../../../projects/eru-studio/src/lib/components/layers-panel/layers-panel.component.html","../../../projects/eru-studio/src/lib/components/assets-panel/assets-panel.component.ts","../../../projects/eru-studio/src/lib/components/assets-panel/assets-panel.component.html","../../../projects/eru-studio/src/lib/components/component-palette/component-palette.component.ts","../../../projects/eru-studio/src/lib/components/component-palette/component-palette.component.html","../../../projects/eru-studio/src/lib/components/logic-editor/logic-editor.component.ts","../../../projects/eru-studio/src/lib/components/payload-fields-picker/payload-fields-picker.component.ts","../../../projects/eru-studio/src/lib/components/payload-fields-picker/payload-fields-picker.component.html","../../../projects/eru-studio/src/lib/components/property-editor/property-editor.component.ts","../../../projects/eru-studio/src/lib/components/property-editor/property-editor.component.html","../../../projects/eru-studio/src/lib/components/properties-panel/properties-panel.component.ts","../../../projects/eru-studio/src/lib/components/properties-panel/properties-panel.component.html","../../../projects/eru-studio/src/lib/components/json-editor-panel/json-editor-panel.component.ts","../../../projects/eru-studio/src/lib/components/json-editor-panel/json-editor-panel.component.html","../../../projects/eru-studio/src/lib/components/page-state-panel/page-state-panel.component.ts","../../../projects/eru-studio/src/lib/components/page-state-panel/page-state-panel.component.html","../../../projects/eru-studio/src/lib/components/canvas/canvas.component.ts","../../../projects/eru-studio/src/lib/components/canvas/canvas.component.html","../../../projects/eru-studio/src/lib/components/ghost/ghost.component.ts","../../../projects/eru-studio/src/lib/components/ghost/ghost.component.html","../../../projects/eru-studio/src/lib/eru_components/email/email.component.ts","../../../projects/eru-studio/src/lib/eru_components/email/email.component.html","../../../projects/eru-studio/src/lib/eru_components/number/number.component.ts","../../../projects/eru-studio/src/lib/eru_components/number/number.component.html","../../../projects/eru-studio/src/lib/eru_components/currency/currency.component.ts","../../../projects/eru-studio/src/lib/eru_components/currency/currency.component.html","../../../projects/eru-studio/src/lib/eru_components/date/eru-date-adapter.ts","../../../projects/eru-studio/src/lib/eru_components/date/date.component.ts","../../../projects/eru-studio/src/lib/eru_components/date/date.component.html","../../../projects/eru-studio/src/lib/eru_components/time-picker/time-picker-panel.component.ts","../../../projects/eru-studio/src/lib/eru_components/time-picker/time-picker-panel.component.html","../../../projects/eru-studio/src/lib/eru_components/datetime/datetime.component.ts","../../../projects/eru-studio/src/lib/eru_components/datetime/datetime.component.html","../../../projects/eru-studio/src/lib/eru_components/time-picker/time-picker.component.ts","../../../projects/eru-studio/src/lib/eru_components/time-picker/time-picker.component.html","../../../projects/eru-studio/src/lib/eru_components/duration/duration.component.ts","../../../projects/eru-studio/src/lib/eru_components/duration/duration.component.html","../../../projects/eru-studio/src/lib/eru_components/website/website.component.ts","../../../projects/eru-studio/src/lib/eru_components/website/website.component.html","../../../projects/eru-studio/src/lib/eru_components/textarea/textarea.component.ts","../../../projects/eru-studio/src/lib/eru_components/textarea/textarea.component.html","../../../projects/eru-studio/src/lib/eru_components/textbox/textbox.component.ts","../../../projects/eru-studio/src/lib/eru_components/textbox/textbox.component.html","../../../projects/eru-studio/src/lib/eru_components/checkbox/checkbox.component.ts","../../../projects/eru-studio/src/lib/eru_components/checkbox/checkbox.component.html","../../../projects/eru-studio/src/lib/eru_components/select/select.component.ts","../../../projects/eru-studio/src/lib/eru_components/select/select.component.html","../../../projects/eru-studio/src/lib/eru_components/attachment/attachment.component.ts","../../../projects/eru-studio/src/lib/eru_components/attachment/attachment.component.html","../../../projects/eru-studio/src/lib/eru_components/location/location.component.ts","../../../projects/eru-studio/src/lib/eru_components/location/location.component.html","../../../projects/eru-studio/src/lib/eru_components/people/people-card-host.component.ts","../../../projects/eru-studio/src/lib/eru_components/people/people.component.ts","../../../projects/eru-studio/src/lib/eru_components/people/people.component.html","../../../projects/eru-studio/src/lib/eru_components/priority/priority.component.ts","../../../projects/eru-studio/src/lib/eru_components/priority/priority.component.html","../../../projects/eru-studio/src/lib/eru_components/progress/progress.component.ts","../../../projects/eru-studio/src/lib/eru_components/progress/progress.component.html","../../../projects/eru-studio/src/lib/eru_components/rating/rating.component.ts","../../../projects/eru-studio/src/lib/eru_components/rating/rating.component.html","../../../projects/eru-studio/src/lib/eru_components/status/status.component.ts","../../../projects/eru-studio/src/lib/eru_components/status/status.component.html","../../../projects/eru-studio/src/lib/eru_components/tag/tag.component.ts","../../../projects/eru-studio/src/lib/eru_components/tag/tag.component.html","../../../projects/eru-studio/src/lib/services/component-definitions.ts","../../../projects/eru-studio/src/eru-studio.ts"],"sourcesContent":["export interface PageStateVariable {\n  key: string;\n  initial: any;\n  formula?: StateFormula;\n}\n\nexport interface StateFilter {\n  field: string;\n  equals?: any;\n  not_empty?: boolean;\n  in?: any[];\n  not_in?: any[];\n}\n\nexport interface StateFormula {\n  fn: 'count' | 'sum' | 'avg' | 'min' | 'max' | 'expr';\n  /**\n   * Rows the aggregate runs over.\n   *\n   * 'pageDataArray' (the default) is the page's own record array. `'state:<key>'`\n   * aggregates over an array held in page state instead — which is how a grid's\n   * selected rows get counted or summed: the grid's On Selection Change writes\n   * `selection.selected_rows` into state, and a formula reads it back from there\n   * — which needs the grid's Send Selected Rows in Event turned on, since that\n   * array is empty by default.\n   */\n  source?: 'pageDataArray' | string;\n  field?: string;\n  filter?: StateFilter | StateFilter[];\n  value?: string;\n}\n\nexport interface UpdateStateFormula {\n  fn: 'set' | 'increment' | 'decrement' | 'toggle' | 'set-from-field' | 'set-from-payload' | 'reset' | 'expr';\n  value?: any;\n  by?: number;\n  values?: any[];\n  field?: string;\n  expr?: string;\n  payload_path?: string;\n}\n\nexport interface EruPage {\n  id: string;\n  name: string;\n  title?: string;\n  entity_name?: string;\n  route?: string;\n  components: EruComponent[];\n  styles: PageStyles;\n  state?: PageStateVariable[];\n  display_mode?: 'inline' | 'popup' | 'side_panel';\n  parent_page_id?: string;\n  master_detail_config?: MasterDetailConfig;\n  events?: ComponentEventSubscription[];\n\n  /**\n   * Seed this page's data from a state variable when it is opened on its own\n   * (navigate-to-page, deep link, viewer) — the standalone equivalent of the\n   * page_ref `data_source: 'state'` mapping.\n   *\n   * Inside a page_ref the mount point wins: a page_ref with its own\n   * `data_source: 'state'` feeds the page, so the same page can be reused by\n   * several page_refs each handing it a different record. When the page_ref\n   * declares no state source, this declaration applies there too.\n   *\n   * 'none' (or absent) leaves page data alone.\n   */\n  data_source?: 'none' | 'state';\n  /** Which store the field is read from. Defaults to 'page'. */\n  state_scope?: 'page' | 'app';\n  /** State variable holding the record for this page. */\n  state_field?: string;\n  /** Optional dotted path into that value before it is used. */\n  state_result_path?: string;\n}\n\nexport interface PageStyles {\n  classes: string;\n  responsive_classes: ResponsiveClasses;\n  responsive_styles: ResponsiveStyleProperties;\n  custom: Record<string, any>;\n}\n\nimport { ValidationRule } from './eru-component.model';\n\nexport type TailwindBreakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n/**\n * One query param written alongside the page id by a `navigate-to-page`\n * action. The `param` name should match a state variable declared on the\n * target page — `initPageState` seeds that variable from the URL on mount.\n *\n * Values are scalars by design (ids, flags, tab names): the URL is the\n * transport, so the value survives refresh, Back and link sharing. Set\n * `encode: 'json'` to pass a small structured value; larger payloads belong\n * in app state (`state_scope: 'app'`), with the URL carrying only a handle.\n */\nexport interface NavParam {\n  param: string;\n  value?: any;\n  value_expression?: string;\n  encode?: 'json';\n}\n\n/** Marks a query param whose value is JSON rather than a plain scalar. */\nexport const NAV_PARAM_JSON_PREFIX = 'json:';\n/** Longest nav param value written to the URL; beyond this it is dropped with a warning. */\nexport const NAV_PARAM_MAX_LENGTH = 1500;\n\nexport interface ComponentEventSubscription {\n  id: string;\n  event: string;\n  action: 'no-action' | 'call-function' | 'call-query' | 'fetch-page-data' | 'hide-fields' | 'unhide-fields' | 'save-page-data' | 'start-loading' | 'stop-loading' | 'hide-component' | 'show-component' | 'disable-field' | 'enable-field' | 'update-state' | 'start-timer' | 'stop-timer' | 'set-field' | 'update-property' | 'enable-component' | 'disable-component' | 'refresh-grid' | 'download-grid' | 'refresh-page-ref' | 'step-forward' | 'step-back' | 'set-active-tab' | 'emit-to-parent' | 'toggle-side-panel' | 'open-side-panel' | 'close-side-panel' | 'navigate-to-page' | 'set-page-data' | 'clear-page-data' | 'clear-all-page-data' | 'download-file';\n  apiName?: string;\n  function_name?: string;\n  query_name?: string;\n  api_payload_fields?: string[];\n  fieldNames?: string[];\n  page_id?: string;\n  payload?: any;\n  state_key?: string;\n  state_formula?: UpdateStateFormula;\n  // `set-page-data`: where the record comes from. 'event' (default) is the\n  // record the event itself carries — a grid row select hands over the selected\n  // row, already shaped {entity_id, entity_data}. 'state'/'app_state' read a\n  // variable named by `state_key` instead.\n  record_source?: 'event' | 'state' | 'app_state';\n  // Optional dot path into that source, for when the id or record sits inside\n  // it rather than at the top (e.g. 'extras.program_id', 'entity_data.id').\n  record_path?: string;\n  // `download-file`: where the base64 file content comes from. 'response'\n  // (default) is the API/query result the action fired off — the usual case,\n  // an endpoint that returns the file as a JSON attribute rather than a\n  // stream. On a component or page event with no response behind it,\n  // 'response' falls back to the event payload. 'state'/'app_state'/'page_data'\n  // read the value out of page state, app state or page data instead.\n  file_source?: 'response' | 'state' | 'app_state' | 'page_data';\n  // Dot path to the base64 string within that source (e.g. 'data.file_content',\n  // or just the variable name for a state source). A `data:<mime>;base64,`\n  // prefix on the value is accepted and stripped.\n  file_path?: string;\n  // The file's MIME type ('application/pdf') or a bare extension ('pdf', 'xlsx'),\n  // which is mapped to a MIME type. `file_type_path` reads it from the source\n  // instead, for a response that says what it sent; it wins over `file_type`.\n  file_type?: string;\n  file_type_path?: string;\n  // Download file name. Without one the name is 'download' plus the extension\n  // implied by the file type. `file_name_path` reads it from the source and\n  // wins over `file_name`.\n  file_name?: string;\n  file_name_path?: string;\n  // Scope for `update-state`. 'page' (default) writes the current page's state;\n  // 'app' writes the window-wide app state held on the root store, which\n  // survives nav_outlet page swaps and is readable anywhere as `@app.<key>`.\n  state_scope?: 'page' | 'app';\n  // Extra query params written alongside the page id by `navigate-to-page`.\n  nav_params?: NavParam[];\n  // Author-supplied additions to this subscription's payload, resolved when the\n  // event fires. The event itself only knows what the component can tell it — a\n  // drill click carries the row and the cell, but not the page state the report\n  // was filtered by. These land under `payload.extras`, namespaced so they\n  // cannot collide with the record's own fields.\n  payload_extras?: NavParam[];\n  property_key?: string;\n  value?: any;\n  // Optional expression for set-field / update-property. When set, the value is\n  // computed at runtime via the logic evaluator (e.g. \"@view == 'kanban' ? 'board' : 'table'\")\n  // and takes precedence over the static `value`.\n  value_expression?: string;\n  on_success?: ComponentEventSubscription[];\n  on_error?: ComponentEventSubscription[];\n  error_field?: string;\n  error_state_key?: string;\n  // Snackbar text for a `call-query` / `call-function` result. Shown by the\n  // host only when the matching message is filled in, so a call stays silent\n  // unless the author asked it to speak.\n  success_message?: string;\n  error_message?: string;\n  validate_before_action?: boolean;\n  validate_field_names?: string[];\n  // Grid 'Custom Action' (event: 'custom_action'). One subscription per action\n  // offered on a grid row: these three describe the icon the grid renders, the\n  // rest of the subscription is what runs when it is clicked. `action_name` is\n  // the identity the click comes back with, so it must be unique per grid.\n  action_name?: string;\n  action_icon?: string;\n  action_visible_condition?: string;\n  // Grid 'On Drill' (event: 'on_drill'). The column this subscription drills\n  // from — a column name in table mode, or an aggregation name in pivot mode.\n  // A column named by any on_drill subscription renders its cells as links.\n  // Several subscriptions may name the same column; all of them run on click.\n  drill_column?: string;\n}\n\nexport interface EruComponent {\n  id: string;\n  type: string;\n  isNested?: boolean;\n  nesting_type?: 'object' | 'array' | 'nested_object' | 'nested_array';\n  pageId?: string;\n  index?: number;\n  entityName?: string;\n  /**\n   * dataKey of the page_ref that hosts this component, when that page_ref is\n   * itself inside a looped nested page. Prefixed onto the component's own\n   * dataKey (see BaseComponent.getDataKey) so a nested_array loop inside one\n   * record card reads THAT card's row — `0.txns.1` — instead of resolving\n   * `txns.1` against the outer page.\n   */\n  dataKeyPrefix?: string;\n  properties: ResponsiveEruComponentProperties;\n  styles: {\n    classes: string;\n    responsive_classes: ResponsiveClasses;\n    responsive_styles: ResponsiveStyleProperties;\n    custom: Record<string, any>;\n  };\n  events?: ComponentEventSubscription[];\n  validation_rules?: ValidationRule[];\n  children?: EruComponent[];\n  parent_id?: string;\n  created_at?: string;\n  updated_at?: string;\n}\n\n// Component properties (non-styling: content, behavior, data)\nexport interface EruComponentProperties {\n  // Content properties\n  name?: string;\n  placeholder?: string;\n  label?: string;\n  alt?: string;\n  href?: string;\n  target?: string;\n\n  // Behavior properties\n  disabled?: boolean;\n  required?: boolean;\n  readonly?: boolean;\n\n  // Data properties\n  options?: any[];\n\n  // Form field identification\n  identifier?: boolean;\n\n  // Component-specific properties\n  [key: string]: any;\n}\n\nexport interface ResponsiveEruComponentProperties {\n  base?: EruComponentProperties;\n  sm?: EruComponentProperties;\n  md?: EruComponentProperties;\n  lg?: EruComponentProperties;\n  xl?: EruComponentProperties;\n  '2xl'?: EruComponentProperties;\n}\n\n// Style properties (styling: layout, visual, typography)\nexport interface StyleProperties {\n  // Layout\n  padding?: number;\n  margin?: number;\n  gap?: number;\n  width?: string | number;\n  height?: string | number;\n\n  // Visual\n  background?: string;\n  color?: string;\n  border?: string | number;\n  rounded?: string | number;\n  shadow?: string;\n\n  // Typography\n  font_size?: number;\n  font_weight?: string | number;\n  text_align?: string;\n\n  // Flexbox/Grid\n  direction?: string;\n  justify_content?: string;\n  align_items?: string;\n  wrap?: boolean;\n  columns?: number;\n  rows?: number;\n\n  // Custom style properties\n  [key: string]: any;\n}\n\nexport interface ResponsiveStyleProperties {\n  base?: StyleProperties;\n  sm?: StyleProperties;\n  md?: StyleProperties;\n  lg?: StyleProperties;\n  xl?: StyleProperties;\n  '2xl'?: StyleProperties;\n}\n\nexport interface ResponsiveClasses {\n  base?: string;\n  sm?: string;\n  md?: string;\n  lg?: string;\n  xl?: string;\n  '2xl'?: string;\n}\n\n// New interfaces for master-detail functionality\nexport interface MasterDetailConfig {\n  master_field: string;\n  detail_field: string;\n  relationship_type: 'one-to-many' | 'many-to-one' | 'one-to-one';\n  auto_open?: boolean;\n  display_mode?: 'popup' | 'side_panel';\n}\n\nexport interface PageContainerConfig {\n  page_id: string;\n  display_mode: 'popup' | 'side_panel' | 'inline';\n  width?: string;\n  height?: string;\n  title?: string;\n  closable?: boolean;\n  resizable?: boolean;\n  data_context?: Record<string, any>;\n}\n\nexport interface PageNavigationEvent {\n  page_id: string;\n  action: 'open' | 'close' | 'navigate';\n  data?: any;\n  config?: PageContainerConfig;\n}\n\n// PageData interfaces for form data management\nexport interface PageData {\n  entity_id: string;\n  entity_data: Record<string, any>;\n  // Custom attributes\n  [key: string]: any\n}\n\n/**\n * A field-level write to one record, for other views of that record to apply.\n *\n * `set-page-data` gives the page a copy of the record, so an edit made through\n * the page does not reach the grid the copy came from. This carries just the\n * fields that moved, keyed by the record they belong to; `seq` distinguishes\n * repeat writes of the same value.\n */\nexport interface RecordFieldPatch {\n  entity_id: string;\n  fields: Record<string, any>;\n  seq: number;\n}\n\nexport interface DynamicDataRequest {\n  requestId: string;\n  componentId: string;\n  type: string;\n  payload: any;\n  status: 'pending' | 'success' | 'error';\n  error?: any;\n}\n\nexport interface EntityField {\n  _is?: string;\n  _rpst?: string;\n  _rst?: string;\n  // Selectable weekdays, 'Sun'..'Sat'. Was declared `number`, which\n  // contradicted the string[] both eru-grid and processo declare and write.\n  allow_days?: string[];\n  api_field?: string;\n  api_name?: string;\n  can_edit?: boolean;\n  can_group?: boolean;\n  ce?: string;\n  cef?: string;\n  cefa?: string;\n  close_status?: string;\n  data_length?: string;\n  data_length_check?: string;\n  datatype?: string;\n  date_format?: string;\n  decimal?: number;\n  def?: string;\n  default?: string;\n  default_group?: boolean;\n  description?: string;\n  dfc?: boolean;\n  // Dependent-dropdown mapping for option_type ENTITY_DATA: `def` is the key in\n  // the CURRENT entity supplying the value, `dpef` the key in the mapped\n  // (option-source) entity to filter on. Several pairs scope by all of them.\n  df_fields?: { def: string; dpef: string }[];\n  dpef?: string;\n  editable?: boolean | string;\n  end_value?: any;\n  entity_name?: string;\n  entity_tab_name?: string;\n  field_name?: string;\n  field_size?: number;\n  field_type?: 'SYSTEM' | 'USER';\n  fno?: number;\n  grid_index?: number;\n  is_ephi?: boolean;\n  is_hidden?: boolean;\n  is_pf?: boolean;\n  is_pii?: boolean;\n  is_unique?: boolean;\n  label?: string;\n  linked_obj?: any[];\n  mandatory?: boolean;\n  map_roles?: string[];\n  map_users?: string[];\n  name?: string;\n  nic?: string;\n  nop?: string;\n  num_val?: any;\n  num_val_check?: string;\n  open_status?: string;\n  option_type?: string;\n  options?: any[];\n  org_id?: string;\n  org_process_id?: string;\n  process_id?: string;\n  process_name?: string;\n  rich_text?: boolean;\n  seperator?: string;\n  show_grid?: 'yes' | 'no';\n  show_mobile?: boolean;\n  start_value?: any;\n  symbol?: string;\n  // Server-side validation, run on focus-out via the ds_server_validation request.\n  system_validate?: string;\n  ssv_api?: string;\n  tab_name?: string;\n  tf_idx?: number;\n  to_encrypt?: boolean;\n  tool_tip?: string;\n  unique_fn?: any[];\n  unq_sa?: boolean;\n  [key: string]: any;\n}\n\n/* export interface EntityTab {\n  field_type?: 'SYSTEM' | 'USER';\n  index?: number;\n  label?: string;\n  name?: string;\n} */\n\nexport interface Entity {\n  display_name?: string;\n  name?: string;\n  fields?: EntityField[];\n  nested?: boolean;\n  /**\n   * Whether this entity has an approval matrix defined. Derived and persisted\n   * by the backend when a matrix is saved, and shipped on the entity in the\n   * process metadata — not something a client computes.\n   */\n  has_am?: boolean;\n  /** Whether a workflow is bound to this entity's APPROVE / REJECT trigger. */\n  has_wf_am?: boolean;\n  /**\n   * Whether a workflow is bound to any of this entity's other activity\n   * triggers (SAVE / EDIT / DELETE / PREUPLOAD / POSTUPLOAD).\n   */\n  has_wf_oth?: boolean;\n  /* action_col_first?: boolean;\n  allow_single_entry?: boolean;\n  cond?: string;\n  custom_action?: any[];\n  description?: string;\n  dfc_p_entities?: string[];\n  dl_flag?: boolean;\n  dl_map_roles?: string[];\n  dl_map_users?: string[];\n  dl_visibility_type?: string;\n  en_filter?: Record<string, any>;\n  en_map_roles?: string[];\n  en_map_users?: string[];\n  en_pfilter?: Record<string, any>;\n  en_visibility_type?: string;\n  entity_type?: string;\n  env_map_roles?: string[];\n  env_map_users?: string[];\n  g_name?: string;\n  gd_name?: string;\n  has_wf_post_bu?: boolean;\n  has_wf_pre_bu?: boolean;\n  hide_entity?: string | boolean;\n  hide_fields?: Array<{ name: string; show_grid?: string }>;\n  index?: string;\n  is_conv?: boolean;\n  is_nested?: boolean;\n  is_people?: string | boolean;\n  map_roles?: string[];\n  map_users?: string[];\n  nested_en?: string[];\n  p_entities?: string[];\n  parent_att_filter?: Record<string, any>;\n  parent_entities?: string[];\n  pj_cond?: string;\n  rcd_oth_visibility?: boolean;\n  show_entity?: boolean;\n  tabs?: EntityTab[];\n  user_att_filter?: Record<string, any>;\n  user_op_fn?: string[];\n  visibility_type?: string;\n  workflow?: Record<string, any>; */\n  [key: string]: any;\n}\n","import { TailwindBreakpoint } from '../models';\n\nexport const APP_CONSTANTS = {\n  // Application info\n  APP_NAME: 'ERU Studio',\n  APP_VERSION: '3.0.0',\n  \n  // API configuration\n  API_BASE_URL: '/api/eru',\n  \n  // Storage keys\n  STORAGE_KEYS: {\n    PROJECTS: 'eru-studio-projects',\n    CURRENT_PROJECT: 'eru-studio-current-project',\n    USER_PREFERENCES: 'eru-studio-preferences',\n    PAGE_DATA: 'eru-studio-page-data'\n  },\n  \n  // Designer defaults\n  DESIGNER: {\n    DEFAULT_BREAKPOINT: 'base' as TailwindBreakpoint | 'base',\n    DEFAULT_ZOOM: 1,\n    GRID_SIZE: 8,\n    SNAP_THRESHOLD: 5,\n    MIN_ZOOM: 0.25,\n    MAX_ZOOM: 3,\n    HISTORY_LIMIT: 50\n  },\n  \n  // Component limits\n  COMPONENT: {\n    MAX_NESTING_DEPTH: 10,\n    MAX_CHILDREN_PER_CONTAINER: 100,\n    MIN_WIDTH: 20,\n    MIN_HEIGHT: 20\n  },\n  \n  // File upload limits\n  UPLOAD: {\n    MAX_FILE_SIZE: 10 * 1024 * 1024, // 10MB\n    ALLOWED_IMAGE_TYPES: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'],\n    ALLOWED_DOCUMENT_TYPES: ['application/pdf']\n  },\n  \n  // Responsive breakpoints (Tailwind CSS values)\n  BREAKPOINTS: {\n    sm: 640,\n    md: 768,\n    lg: 1024,\n    xl: 1280,\n    '2xl': 1536\n  }\n} as const;\n\nexport const DRAG_DROP_TYPES = {\n  COMPONENT: 'application/eru-component',\n  REORDER: 'application/eru-reorder'\n} as const;\n\nexport const KEYBOARD_SHORTCUTS = {\n  SAVE: 'cmd+s',\n  UNDO: 'cmd+z',\n  REDO: 'cmd+shift+z',\n  DELETE: 'delete',\n  COPY: 'cmd+c',\n  PASTE: 'cmd+v',\n  SELECT_ALL: 'cmd+a',\n  ZOOM_IN: 'cmd+=',\n  ZOOM_OUT: 'cmd+-',\n  ZOOM_FIT: 'cmd+0'\n} as const;","import { Injectable, Type } from '@angular/core';\nimport { ComponentDefinition, ComponentCategory } from '../models';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ComponentRegistryService {\n  private components = new Map<string, ComponentDefinition>();\n  private categories = new Map<ComponentCategory, ComponentDefinition[]>();\n  private loadedComponents = new Map<string, Type<any>>();\n\n  constructor() {\n    this.initializeCategories();\n  }\n\n  private initializeCategories(): void {\n    const categories: ComponentCategory[] = ['basic', 'layout', 'form', 'data', 'navigation', 'media', 'eru'];\n    categories.forEach(category => {\n      this.categories.set(category, []);\n    });\n  }\n\n  /**\n   * Register a new component definition\n   */\n  registerComponent(definition: ComponentDefinition, component?: Type<any>): void {\n    /* if (this.components.has(definition.type)) {\n      console.warn(`Component type '${definition.type}' is already registered. Overwriting...`);\n    } */\n\n    if (component) {\n      definition.component = component;\n      this.loadedComponents.set(definition.type, component);\n    }\n\n    this.components.set(definition.type, definition);\n\n    // Add to category\n    const categoryComponents = this.categories.get(definition.category) || [];\n    const existingIndex = categoryComponents.findIndex(comp => comp.type === definition.type);\n\n    if (existingIndex >= 0) {\n      categoryComponents[existingIndex] = definition;\n    } else {\n      categoryComponents.push(definition);\n    }\n\n    this.categories.set(definition.category, categoryComponents);\n  }\n\n  /**\n   * Register multiple components at once\n   */\n  registerComponents(definitions: ComponentDefinition[]): void {\n    definitions.forEach(definition => this.registerComponent(definition, definition.component));\n  }\n\n  /**\n   * Get a component definition by type\n   */\n  getComponent(type: string): ComponentDefinition | undefined {\n    return this.components.get(type);\n  }\n\n  /**\n   * Get all registered components\n   */\n  getAllComponents(): ComponentDefinition[] {\n    return Array.from(this.components.values());\n  }\n\n  /**\n   * Get components by category\n   */\n  getComponentsByCategory(category: ComponentCategory): ComponentDefinition[] {\n    return this.categories.get(category) || [];\n  }\n\n  /**\n   * Get all categories with their components\n   */\n  getAllCategories(): Map<ComponentCategory, ComponentDefinition[]> {\n    return new Map(this.categories);\n  }\n\n  getLoadedComponent(type: string): Type<any> | undefined {\n    return this.loadedComponents.get(type);\n  }\n\n  private extractComponentEvents(componentClass: Type<any>): { label: string, value: string }[] {\n    if ((componentClass as any).componentEvents && Array.isArray((componentClass as any).componentEvents)) {\n      return (componentClass as any).componentEvents;\n    }\n    if (componentClass.prototype && (componentClass.prototype as any).componentEvents && Array.isArray((componentClass.prototype as any).componentEvents)) {\n      return (componentClass.prototype as any).componentEvents;\n    }\n    return [];\n  }\n\n  /**\n   * Get component events for a specific component type\n   */\n  getComponentEvents(componentType: string): { label: string, value: string }[] {\n    const definition = this.components.get(componentType);\n    return definition?.events || [];\n  }\n\n\n  /**\n   * Search components by name or type\n   */\n  searchComponents(query: string): ComponentDefinition[] {\n    const lowercaseQuery = query.toLowerCase();\n    return this.getAllComponents().filter(component =>\n      component.name.toLowerCase().includes(lowercaseQuery) ||\n      component.type.toLowerCase().includes(lowercaseQuery)\n    );\n  }\n\n  /**\n   * Validate if a component can be a child of another component\n   */\n  canBeChild(childType: string, parentType: string): boolean {\n    const childDefinition = this.getComponent(childType);\n    if (!childDefinition) {\n      return false;\n    }\n\n    const parentDefinition = this.getComponent(parentType);\n    if (!parentDefinition) {\n      return false;\n    }\n\n    // Check if parent allows children\n    if (!parentDefinition.allow_children) {\n      return false;\n    }\n\n    // Check if child has parent restrictions\n    if (childDefinition.allowed_parents && childDefinition.allowed_parents.length > 0) {\n      return childDefinition.allowed_parents.includes(parentType);\n    }\n\n    return true;\n  }\n\n\n  /**\n   * Get components that can be parents for a given component type\n   */\n  getPossibleParents(componentType: string): ComponentDefinition[] {\n    return this.getAllComponents().filter(definition =>\n      definition.allow_children && this.canBeChild(componentType, definition.type)\n    );\n  }\n\n  /**\n   * Get components that can be children of a given component type\n   */\n  getPossibleChildren(parentType: string): ComponentDefinition[] {\n    const parentDefinition = this.getComponent(parentType);\n    if (!parentDefinition?.allow_children) {\n      return [];\n    }\n\n    return this.getAllComponents().filter(definition =>\n      this.canBeChild(definition.type, parentType)\n    );\n  }\n\n  /**\n   * Validate component hierarchy depth\n   */\n  validateNestingDepth(components: any[], maxDepth: number = 10): boolean {\n    const checkDepth = (comps: any[], currentDepth: number): boolean => {\n      if (currentDepth > maxDepth) {\n        return false;\n      }\n\n      return comps.every(comp => {\n        if (comp.children && comp.children.length > 0) {\n          return checkDepth(comp.children, currentDepth + 1);\n        }\n        return true;\n      });\n    };\n\n    return checkDepth(components, 0);\n  }\n\n  async getComponentClassAsync(type: string): Promise<Type<any> | undefined> {\n    if (this.loadedComponents.has(type)) {\n      return this.loadedComponents.get(type);\n    }\n\n    const definition = this.getComponent(type);\n    if (definition?.component) {\n      this.loadedComponents.set(type, definition.component);\n      return definition.component;\n    }\n\n    try {\n      let component: Type<any> | undefined;\n\n      switch (type) {\n        case 'text':\n          component = (await import('../components/text/text.component')).TextComponent;\n          break;\n        case 'button':\n          component = (await import('../components/button/button.component')).ButtonComponent;\n          break;\n        case 'image':\n          component = (await import('../components/image/image.component')).ImageComponent;\n          break;\n        case 'input':\n          component = (await import('../eru_components/textbox/textbox.component')).TextboxComponent;\n          break;\n        case 'flex_container':\n          component = (await import('../components/flex-container/flex-container.component')).FlexContainerComponent;\n          break;\n        case 'grid_container':\n          component = (await import('../components/grid-container/grid-container.component')).GridContainerComponent;\n          break;\n        case 'checkbox':\n          component = (await import('../eru_components/checkbox/checkbox.component')).CheckboxComponent;\n          break;\n        case 'select':\n          component = (await import('../eru_components/select/select.component')).SelectComponent;\n          break;\n        case 'radio':\n          component = (await import('../components/radio/radio.component')).RadioComponent;\n          break;\n        case 'slider':\n          component = (await import('../components/slider/slider.component')).SliderComponent;\n          break;\n        case 'slide_toggle':\n          component = (await import('../components/slide-toggle/slide-toggle.component')).SlideToggleComponent;\n          break;\n        case 'autocomplete':\n          component = (await import('../components/autocomplete/autocomplete.component')).AutocompleteComponent;\n          break;\n        case 'datepicker':\n          component = (await import('../eru_components/date/date.component')).DateComponent;\n          break;\n        case 'phone':\n          component = (await import('../eru_components/priority/phone/phone.component')).PhoneComponent;\n          break;\n        case 'email':\n          component = (await import('../eru_components/email/email.component')).EmailComponent;\n          break;\n        case 'number':\n          component = (await import('../eru_components/number/number.component')).NumberComponent;\n          break;\n        case 'currency':\n          component = (await import('../eru_components/currency/currency.component')).CurrencyComponent;\n          break;\n        case 'date':\n          component = (await import('../eru_components/date/date.component')).DateComponent;\n          break;\n        case 'datetime':\n          component = (await import('../eru_components/datetime/datetime.component')).DatetimeComponent;\n          break;\n        case 'time-picker':\n          component = (await import('../eru_components/time-picker/time-picker.component')).TimePickerComponent;\n          break;\n        case 'duration':\n          component = (await import('../eru_components/duration/duration.component')).DurationComponent;\n          break;\n        case 'website':\n          component = (await import('../eru_components/website/website.component')).WebsiteComponent;\n          break;\n        case 'textarea':\n          component = (await import('../eru_components/textarea/textarea.component')).TextareaComponent;\n          break;\n        case 'textbox':\n          component = (await import('../eru_components/textbox/textbox.component')).TextboxComponent;\n          break;\n        case 'checkbox-eru':\n          component = (await import('../eru_components/checkbox/checkbox.component')).CheckboxComponent;\n          break;\n        case 'select-eru':\n          component = (await import('../eru_components/select/select.component')).SelectComponent;\n          break;\n        case 'attachment':\n          component = (await import('../eru_components/attachment/attachment.component')).AttachmentComponent;\n          break;\n        case 'location':\n          component = (await import('../eru_components/location/location.component')).LocationComponent;\n          break;\n        case 'people':\n          component = (await import('../eru_components/people/people.component')).PeopleComponent;\n          break;\n        case 'priority':\n          component = (await import('../eru_components/priority/priority.component')).PriorityComponent;\n          break;\n        case 'progress':\n          component = (await import('../eru_components/progress/progress.component')).ProgressComponent;\n          break;\n        case 'rating':\n          component = (await import('../eru_components/rating/rating.component')).RatingComponent;\n          break;\n        case 'status':\n          component = (await import('../eru_components/status/status.component')).StatusComponent;\n          break;\n        case 'tag':\n          component = (await import('../eru_components/tag/tag.component')).TagComponent;\n          break;\n        case 'toolbar':\n          component = (await import('../components/toolbar/toolbar.component')).ToolbarComponent;\n          break;\n        case 'menu':\n          component = (await import('../components/menu/menu.component')).MenuComponent;\n          break;\n        case 'sidenav':\n          component = (await import('../components/sidenav/sidenav.component')).SidenavComponent;\n          break;\n        case 'tabs':\n          component = (await import('../components/tabs/tabs.component')).TabsComponent;\n          break;\n        case 'card':\n          component = (await import('../components/card/card.component')).CardComponent;\n          break;\n        case 'divider':\n          component = (await import('../components/divider/divider.component')).DividerComponent;\n          break;\n        case 'expansion_panel':\n          component = (await import('../components/expansion-panel/expansion-panel.component')).ExpansionPanelComponent;\n          break;\n        case 'list':\n          component = (await import('../components/list/list.component')).ListComponent;\n          break;\n        case 'stepper':\n          component = (await import('../components/stepper/stepper.component')).StepperComponent;\n          break;\n        case 'tree':\n          component = (await import('../components/tree/tree.component')).TreeComponent;\n          break;\n        case 'grid_list':\n          component = (await import('../components/grid-list/grid-list.component')).GridListComponent;\n          break;\n        case 'button_toggle':\n          component = (await import('../components/button-toggle/button-toggle.component')).ButtonToggleComponent;\n          break;\n        case 'chips':\n          component = (await import('../components/chips/chips.component')).ChipsComponent;\n          break;\n        case 'icon':\n          component = (await import('../components/icon/icon.component')).IconComponent;\n          break;\n        case 'progress_bar':\n          component = (await import('../components/progress-bar/progress-bar.component')).ProgressBarComponent;\n          break;\n        case 'progress_spinner':\n          component = (await import('../components/progress-spinner/progress-spinner.component')).ProgressSpinnerComponent;\n          break;\n        case 'badge':\n          component = (await import('../components/badge/badge.component')).BadgeComponent;\n          break;\n        case 'timer':\n          component = (await import('../components/timer/timer.component')).TimerComponent;\n          break;\n        case 'grid':\n          component = (await import('../components/grid/grid.component')).GridComponent;\n          break;\n        case 'line_chart':\n          component = (await import('../components/line-chart/line-chart.component')).LineChartComponent;\n          break;\n        case 'bar_chart':\n          component = (await import('../components/bar-chart/bar-chart.component')).BarChartComponent;\n          break;\n        case 'pie_chart':\n          component = (await import('../components/pie-chart/pie-chart.component')).PieChartComponent;\n          break;\n        case 'page':\n          component = (await import('../components/eru-page/eru-page.component')).EruPageComponent;\n          break;\n        case 'widget':\n          component = (await import('../components/widget/widget.component')).WidgetComponent;\n          break;\n        default:\n          console.warn(`No loader found for component type: ${type}`);\n          return undefined;\n      }\n\n      if (component) {\n        this.loadedComponents.set(type, component);\n        return component;\n      }\n    } catch (error) {\n      console.error(`Failed to load component: ${type}`, error);\n      return undefined;\n    }\n\n    return undefined;\n  }\n}","import { Injectable, computed, inject, signal, DestroyRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router, NavigationEnd, UrlTree } from '@angular/router';\nimport { filter, startWith } from 'rxjs/operators';\n\n/**\n * Reads and writes URL query parameters as a reactive signal.\n *\n * Used by app-shell components (`nav_menu` writes a param to switch\n * the active page; `nav_outlet` reads it to mount the right page).\n *\n * Query params are chosen over path segments because:\n *  - Refresh-safe out of the box (Angular keeps query string).\n *  - No host-side route registration needed for each nav target.\n *  - Multiple shells can coexist on a route by using different param names.\n *\n * The service is provided in root so all components on the page share\n * the same view of the URL — including nested page mounts where each\n * has its own EruStudioStore but the URL itself is global.\n */\n@Injectable({ providedIn: 'root' })\nexport class EruAppRouteService {\n  private router = inject(Router);\n  private destroyRef = inject(DestroyRef);\n\n  private _params = signal<Readonly<Record<string, string>>>({});\n\n  /** All current query params as a plain object. */\n  readonly routeParams = this._params.asReadonly();\n\n  constructor() {\n    this.refreshFromSnapshot();\n    // Re-read on every navigation. Using NavigationEnd (not queryParams\n    // observable on a specific ActivatedRoute) keeps us robust against\n    // route reuse / lazy-loaded outlet changes.\n    this.router.events\n      .pipe(\n        filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n        startWith(null),\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe(() => this.refreshFromSnapshot());\n  }\n\n  /** Read a single param by name. Empty string when absent. */\n  getParam(name: string): string {\n    return this._params()[name] ?? '';\n  }\n\n  /** Reactive accessor — recomputes when the URL changes. */\n  paramSignal(name: string) {\n    return computed(() => this._params()[name] ?? '');\n  }\n\n  /**\n   * Write or clear a single param.\n   *\n   * Pass `null`/empty to remove the param. Other params are preserved.\n   *\n   * Implementation note: building a `UrlTree` against `router.url`\n   * preserves the current path verbatim regardless of which child route\n   * we're under. We can't use `relativeTo: ActivatedRoute` because this\n   * service is `providedIn: 'root'` and the root ActivatedRoute doesn't\n   * carry the current child segments.\n   */\n  setParam(name: string, value: string | null): void {\n    this.applyQueryParams({ [name]: value === '' ? null : value });\n  }\n\n  /** Bulk set/clear. Same semantics as `setParam` per key. */\n  setParams(patch: Record<string, string | null>): void {\n    const queryParams: Record<string, string | null> = {};\n    for (const [k, v] of Object.entries(patch)) {\n      queryParams[k] = v === '' ? null : v;\n    }\n    this.applyQueryParams(queryParams);\n  }\n\n  private applyQueryParams(queryParams: Record<string, string | null>): void {\n    const tree: UrlTree = this.router.parseUrl(this.router.url);\n    const merged: Record<string, string> = { ...tree.queryParams } as any;\n    for (const [k, v] of Object.entries(queryParams)) {\n      if (v === null) delete merged[k];\n      else merged[k] = v;\n    }\n    tree.queryParams = merged;\n    this.router.navigateByUrl(tree, { replaceUrl: false });\n  }\n\n  private refreshFromSnapshot(): void {\n    const snap = this.router.routerState.snapshot.root.queryParams ?? {};\n    const next: Record<string, string> = {};\n    for (const [k, v] of Object.entries(snap)) {\n      if (v === null || v === undefined) continue;\n      next[k] = String(v);\n    }\n    this._params.set(next);\n  }\n}\n","/**\n * Walk a dot path into a value, parsing JSON along the way.\n *\n * The same rule page_ref's State Result Path follows: a state variable, an API\n * response or a page-data field often holds JSON as a *string*, so a plain\n * property walk stops dead at the first one. Each segment parses the current\n * value when it is still a string, and a JSON object/array left at the end is\n * parsed too so the caller receives data rather than text.\n *\n * Returns undefined when the path does not resolve, so a caller can fall back.\n */\nexport function resolveJsonPath(value: any, path: string): any {\n    const p = String(path ?? '').trim();\n    if (!p) return value;\n    let current: any = value;\n    for (const part of p.split('.')) {\n        if (typeof current === 'string') {\n            try { current = JSON.parse(current); } catch { return undefined; }\n        }\n        if (current == null) return undefined;\n        current = current[part];\n    }\n    if (typeof current === 'string') {\n        const s = current.trim();\n        if (s.startsWith('{') || s.startsWith('[')) {\n            try { return JSON.parse(s); } catch { /* keep the string */ }\n        }\n    }\n    return current;\n}\n\n/**\n * Parse a value that is JSON held as a *string*.\n *\n * Designer inputs (Initial Value, nav params, API text responses) are plain\n * text, so an array or object typed there arrives as `'[\"a\",\"b\"]'`. Left alone\n * it travels all the way into an API payload as a quoted string instead of a\n * JSON array. Only `{`/`[` openers are parsed — ids like \"007\" and long numeric\n * strings must survive verbatim.\n */\nexport function parseJsonValue(value: any): any {\n    if (typeof value !== 'string') return value;\n    const s = value.trim();\n    if (!s.startsWith('{') && !s.startsWith('[')) return value;\n    try { return JSON.parse(s); } catch { return value; }\n}\n\nexport class JsonUtil {\n    /**\n     * Gets a nested value from an object using a dot-separated path.\n     */\n    static getNestedValue(obj: any, path: string): any {\n        if (!obj || !path) return undefined;\n\n        const parts = path.split('.');\n        let current = obj;\n\n        for (const part of parts) {\n            if (current === null || current === undefined) return undefined;\n            current = current[part];\n        }\n\n        return current;\n    }\n\n    /**\n     * Sets a nested value in an object using a dot-separated path.\n     * If parent objects don't exist, they will be created.\n     * returns a new object (shallow copy of path) or the same object if you prefer mutation.\n     * For Angular signals, it's better to work on a clone if we want to ensure reactivity.\n     */\n    static setNestedValue(obj: any, path: string, value: any): any {\n        if (!obj) obj = {};\n        if (!path) return obj;\n\n        const parts = path.split('.');\n        const root = { ...obj };\n        let current = root;\n\n        for (let i = 0; i < parts.length - 1; i++) {\n            const part = parts[i];\n            if (!current[part] || typeof current[part] !== 'object') {\n                current[part] = {};\n            } else {\n                current[part] = { ...current[part] };\n            }\n            current = current[part];\n        }\n\n        current[parts[parts.length - 1]] = value;\n        return root;\n    }\n}\n\n/**\n * A stored multi-value field as a list.\n *\n * The rule lives here because a multi-value column reaches the page in whichever\n * shape its source produced, and every consumer has to read all of them the same\n * way: eru-ql hands a `dropdown_multi_select` column back as the JSON *string*\n * `'[\"FIN-2\", \"FIN-3\"]'`, Postgres can hand the same data back as the array\n * literal `'{FIN-2,FIN-3}'`, an author writing a static list types\n * `'FIN-2, FIN-3'`, and an in-memory value is already an array. Splitting on\n * commas alone — which is all a chip list used to do — turns the first of those\n * into the chips `[\"FIN-2` and `\"FIN-3\"]`, brackets and quotes included.\n *\n * A JSON object is returned as a single item rather than its keys: one record is\n * one entry, and the caller decides how to render it.\n */\nexport function parseValueList(raw: any): any[] {\n    if (raw === null || raw === undefined || raw === '') return [];\n    if (Array.isArray(raw)) return raw;\n    if (typeof raw !== 'string') return [raw];\n\n    const trimmed = raw.trim();\n    if (!trimmed) return [];\n\n    const unquote = (part: string): string => {\n        const s = part.trim();\n        if (s.length >= 2 && ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\")))) {\n            return s.slice(1, -1).trim();\n        }\n        return s;\n    };\n    const split = (text: string): string[] =>\n        text.split(',').map(unquote).filter(part => part.length > 0);\n\n    if (trimmed.startsWith('[') || trimmed.startsWith('{')) {\n        try {\n            const parsed = JSON.parse(trimmed);\n            if (Array.isArray(parsed)) return parsed;\n            if (parsed && typeof parsed === 'object') return [parsed];\n        } catch {\n            // A Postgres array literal is not JSON, so parsing it is expected to\n            // fail; the braces are the list's delimiters and come off here.\n            if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n                return split(trimmed.slice(1, -1));\n            }\n        }\n    }\n    return split(trimmed);\n}\n","import { Injectable, inject } from '@angular/core';\nimport { EruStudioStore } from './eru-studio.store';\nimport { parseJsonValue } from '../utils/json.util';\n\n@Injectable()\nexport class LogicEvaluatorService {\n    private store = inject(EruStudioStore);\n\n    /**\n     * Date anchors usable in any expression, with an optional offset in days:\n     * `@current_date`, `@current_date - 7`, `@first_day + 1`.\n     *\n     * The vocabulary deliberately mirrors the date control's Default Date\n     * anchors (Current Date / First Day of Month / Last Day of Month, plus an\n     * offset in days), so the same idea is expressed the same way whether it is\n     * configured on a field or written in an expression.\n     *\n     * The optional trailing `± n` is part of the match so it is CONSUMED by the\n     * substitution. Left behind, `@current_date - 7` would first become a date\n     * and then have 7 subtracted from it as a number — arithmetic on a\n     * timestamp, not on days.\n     */\n    private static readonly DATE_KEYWORDS = /@(current_date|today|first_day|last_day)\\b(\\s*[+-]\\s*\\d+)?/gi;\n\n    /** True when a value uses one of the date anchors above. */\n    static hasDateKeyword(value: any): boolean {\n        return typeof value === 'string' && /@(current_date|today|first_day|last_day)\\b/i.test(value);\n    }\n\n    /**\n     * Replace each date anchor (and its day offset) with a quoted ISO date, so\n     * everything downstream sees an ordinary date literal. In a value\n     * expression that yields the date itself; in a condition it lands on the\n     * existing ISO-literal handling, which turns both sides into timestamps so\n     * the comparison is chronological rather than lexical.\n     */\n    static resolveDateKeywords(expression: string): string {\n        if (!LogicEvaluatorService.hasDateKeyword(expression)) return expression;\n        const now = new Date();\n        return expression.replace(LogicEvaluatorService.DATE_KEYWORDS, (_m, keyword: string, offset?: string) => {\n            const anchor = LogicEvaluatorService.anchorDate(String(keyword).toLowerCase(), now);\n            if (offset) {\n                const days = Number(offset.replace(/\\s+/g, ''));\n                if (Number.isFinite(days)) anchor.setDate(anchor.getDate() + days);\n            }\n            const pad = (n: number) => (n < 10 ? `0${n}` : String(n));\n            return `'${anchor.getFullYear()}-${pad(anchor.getMonth() + 1)}-${pad(anchor.getDate())}'`;\n        });\n    }\n\n    /** Midnight-anchored date for a keyword, so no time component leaks in. */\n    // Mirrors the toBool() used by the toggle and checkbox components, so a\n    // condition and the control bound to the same field agree on what counts as\n    // \"on\". Absent/blank is false. Y/N-style values are the value_true /\n    // value_false mapper's job, not this one.\n    private static isTruthy(value: any): boolean {\n        if (typeof value === 'boolean') return value;\n        if (typeof value === 'number') return value !== 0;\n        if (value === null || value === undefined) return false;\n        if (typeof value === 'string') {\n            const s = value.trim().toLowerCase();\n            return s === 'true' || s === '1' || s === 'yes' || s === 'on' || s === 'checked';\n        }\n        return !!value;\n    }\n\n    private static anchorDate(keyword: string, now: Date): Date {\n        switch (keyword) {\n            case 'first_day':\n                return new Date(now.getFullYear(), now.getMonth(), 1);\n            case 'last_day':\n                // Day 0 of the next month is the last day of this one.\n                return new Date(now.getFullYear(), now.getMonth() + 1, 0);\n            default: // current_date | today\n                return new Date(now.getFullYear(), now.getMonth(), now.getDate());\n        }\n    }\n\n    /**\n     * Evaluates a logic expression string.\n     * Example: \"@firstName == 'John' && (@age > 18 || @isAdmin == true)\"\n     * @param expression The expression string\n     * @param pageId Optional page ID for context\n     * @returns boolean result of the evaluation\n     */\n    /**\n     * Does this expression read entity metadata? Used by callers that must not\n     * answer a condition before `setEntities` has run — every attribute would\n     * read undefined and the condition would settle on the wrong answer.\n     */\n    static referencesEntityMetadata(expression: any): boolean {\n        return typeof expression === 'string' && /@entities?\\./i.test(expression);\n    }\n\n    /**\n     * Resolve one `@token` to its value. Shared by evaluate() and\n     * evaluateValue(), which each used to carry their own copy of this chain —\n     * so a namespace added to one silently did not exist in the other.\n     *\n     * Namespaces, in precedence order:\n     *   `state.x`            page state\n     *   `app.x`              window-wide app state\n     *   `page.x`             page data by key\n     *   `entity.x`           attribute of THIS page's entity\n     *   `entities`           every entity in the process, as an array\n     *   `entities.<name>.x`  attribute of a named entity\n     *   `column.x` / `row.x` the record in scope (board card / event row)\n     *   bare `x`             row field if present, else page data\n     */\n    private resolveToken(\n        fieldName: string,\n        pageId?: string,\n        dataKey?: string,\n        rowData?: Record<string, any> | null,\n    ): any {\n        if (fieldName.startsWith('state.')) {\n            const statePath = fieldName.substring(6);\n            const stateObj = pageId\n                ? this.store.getComputedPageStateFor(pageId, dataKey)\n                : this.store.computedPageState();\n            return this.resolveStatePath(stateObj, statePath);\n        }\n        if (fieldName.startsWith('app.')) {\n            // Window-wide shared state (see EruStudioStore app state):\n            // readable from any page, on either side of a nav_outlet.\n            return this.resolveStatePath(this.store.appState(), fieldName.substring(4));\n        }\n        if (fieldName.startsWith('page.')) {\n            // Walked, not looked up flat: page data is `{entity_id, entity_data}`,\n            // so every field of the record is one level down and the payload\n            // fields the picker offers are `page:entity_data.<name>`. A flat read\n            // answered undefined for all of them, which is why a page-data\n            // payload field reached a page_ref's or a grid's query empty while\n            // the same entry worked on a component event (that path walks).\n            // resolveStatePath still tries the exact key first, so `@page.entity_id`\n            // and any dotted key stored flat resolve as before.\n            const pageKey = fieldName.substring(5);\n            const data = this.store.getPageData(pageId);\n            return this.resolveStatePath(data as any, pageKey);\n        }\n        if (fieldName === 'entities') {\n            // Bare `@entities` — every entity in the process as a JSON array.\n            // Handed over as-is so the consumer picks its own keys off each\n            // element (a select's Option Value/Label Key, say) rather than this\n            // layer deciding what an entity \"is\" for a dropdown.\n            return this.store.getEntities();\n        }\n        if (fieldName.startsWith('entities.')) {\n            // `entities.<entity_name>.<attribute>` — any entity in the process.\n            const rest = fieldName.substring(9);\n            const dot = rest.indexOf('.');\n            if (dot < 1) return undefined;\n            const entity = this.store.getEntity(rest.substring(0, dot));\n            return entity\n                ? this.resolveStatePath(entity as any, rest.substring(dot + 1))\n                : undefined;\n        }\n        if (fieldName.startsWith('entity.')) {\n            // `entity.<attribute>` — the entity of the page the expression is\n            // on. getPageEntityName resolves a nested page_ref to ITS entity,\n            // not the outer page's, so a condition inside a side panel reads\n            // the entity that panel is actually bound to.\n            const entityName = this.store.getPageEntityName(\n                pageId || this.store.currentPage()?.id || '',\n            );\n            const entity = this.store.getEntity(entityName);\n            return entity\n                ? this.resolveStatePath(entity as any, fieldName.substring(7))\n                : undefined;\n        }\n        if (fieldName.startsWith('column.') || fieldName.startsWith('row.')) {\n            // Explicit form of the bare `@field` below: the record in scope — a\n            // board card's row, or the row an event fired on. Worth naming,\n            // because bare `@x` is ambiguous (row field or page-data field) and\n            // silently reads page data when the row has no such column.\n            const path = fieldName.substring(fieldName.indexOf('.') + 1);\n            return this.resolveStatePath(rowData || {}, path);\n        }\n        if (rowData && Object.prototype.hasOwnProperty.call(rowData, fieldName)) {\n            return rowData[fieldName];\n        }\n        if (dataKey) {\n            return this.store.getPageFieldData(dataKey + '.' + fieldName, pageId);\n        }\n        return this.store.getPageFieldData(fieldName, pageId);\n    }\n\n    evaluate(expression: string | any, pageId?: string, componentId?: string, dataKey?: string, rowData?: Record<string, any> | null): boolean {\n        if (!expression) return true;\n\n        // If it's the old array format, handle it or return true for now\n        if (Array.isArray(expression)) {\n            if (expression.length === 0) return true;\n            // We could still support the old format here if needed\n            return true;\n        }\n\n        if (typeof expression !== 'string') return true;\n\n        try {\n            // 0. Resolve date anchors first — they look like @variables, so\n            //    leaving them to the scan below would send `current_date` off\n            //    to page data as a field name and come back empty. Held in a\n            //    separate `any` rather than reassigning the parameter, which\n            //    would narrow it to string and change the inferred types of the\n            //    replace() callbacks further down.\n            const source: string = LogicEvaluatorService.resolveDateKeywords(expression);\n\n            // 1. Identify all variables starting with @\n            const varRegex = /@([a-zA-Z0-9_.]+)/g;\n\n            // 2. Prepare context and transform variables\n            const variables: Record<string, any> = {};\n            let modifiedExpression = source;\n\n            const foundVars = source.match(varRegex);\n            if (foundVars) {\n                foundVars.forEach(v => {\n                    const fieldName = v.substring(1);\n                    let value: any;\n\n                    value = this.resolveToken(fieldName, pageId, dataKey, rowData);\n\n                    // Normalize Date objects to timestamps for reliable numerical comparison\n                    if (value instanceof Date) {\n                        value = value.getTime();\n                    }\n\n                    const safeKey = 'var_' + fieldName.replace(/[.-]/g, '_');\n                    variables[safeKey] = value;\n                    const escapedVar = v.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n                    modifiedExpression = modifiedExpression.replace(new RegExp(escapedVar + '(?![a-zA-Z0-9_.])', 'g'), safeKey);\n                });\n            }\n\n            // 3. Transform operators for better UX\n\n            // Specialized 'is X' / 'is not X' phrase rules must run BEFORE the AND/OR/NOT\n            // and generic 'is'/'is not' replacements — otherwise 'is not empty' (etc.) gets\n            // mangled by `\\bNOT\\b` → '!' (case-insensitive) into 'is ! empty'.\n            // 'Empty' matches null, undefined, '' — the user-intuitive \"missing or blank\".\n            modifiedExpression = modifiedExpression.replace(/(\\S+)\\s+is not empty\\b/gi, '($1 != null && $1 !== \"\")');\n            modifiedExpression = modifiedExpression.replace(/(\\S+)\\s+is empty\\b/gi, '($1 == null || $1 === \"\")');\n            modifiedExpression = modifiedExpression.replace(/\\s+is not null\\b/gi, ' != null');\n            modifiedExpression = modifiedExpression.replace(/\\s+is null\\b/gi, ' == null');\n            modifiedExpression = modifiedExpression.replace(/\\s+is not selected\\b/gi, ' == false');\n            modifiedExpression = modifiedExpression.replace(/\\s+is selected\\b/gi, ' == true');\n\n            // 'is true' / 'is false' accept every shape a boolean arrives in — a real\n            // boolean, 1/0, or the strings a SQL/JSON source hands back — and read a\n            // missing value as false. The plain `== true` / `== false` these used to\n            // become compared loosely, so \"true\" satisfied NEITHER (it coerces to NaN),\n            // and an unset field satisfied neither either — which hid both halves of an\n            // is-true/is-false pair on the designer canvas, where nothing is written to\n            // page data. Negated forms first, and all of them before the generic\n            // 'is'/'is not' rules and the NOT -> '!' rule below.\n            modifiedExpression = modifiedExpression.replace(/(\\S+)\\s+is not true\\b/gi, '(!__truthy($1))');\n            modifiedExpression = modifiedExpression.replace(/(\\S+)\\s+is not false\\b/gi, '(__truthy($1))');\n            modifiedExpression = modifiedExpression.replace(/(\\S+)\\s+is true\\b/gi, '(__truthy($1))');\n            modifiedExpression = modifiedExpression.replace(/(\\S+)\\s+is false\\b/gi, '(!__truthy($1))');\n\n            // Generic 'is not <value>' / 'is <value>' must run BEFORE the NOT → ! replacement.\n            // Otherwise 'is not \"na\"' gets mangled by `\\bNOT\\b` (case-insensitive) into 'is ! \"na\"',\n            // which then evaluates as `== !\"na\"` == `== false`.\n            modifiedExpression = modifiedExpression.replace(/\\s+is not\\s+/gi, ' != ');\n            modifiedExpression = modifiedExpression.replace(/\\s+is\\s+(?!null|selected|after|before)/gi, ' == ');\n\n            // Replace conjunctions\n            modifiedExpression = modifiedExpression.replace(/\\bAND\\b/gi, ' && ');\n            modifiedExpression = modifiedExpression.replace(/\\bOR\\b/gi, ' || ');\n            modifiedExpression = modifiedExpression.replace(/\\bNOT\\b/gi, ' ! ');\n\n            // Normalize ISO date literals (e.g., '2024-01-01') in the expression to timestamps\n            const dateLiteralRegex = /(['\"])\\d{4}-\\d{2}-\\d{2}\\1/g;\n            modifiedExpression = modifiedExpression.replace(dateLiteralRegex, (match) => {\n                const d = new Date(match.slice(1, -1));\n                return !isNaN(d.getTime()) ? d.getTime().toString() : match;\n            });\n\n            modifiedExpression = modifiedExpression.replace(/<>/g, ' != ');\n\n            // Replace single = with ==, but avoid double-replacing existing ==, !=, <=, >=\n            // We match the character before =, ensuring it's not a comparison operator character (!, <, >, =)\n            // We also handle optional whitespace around the =\n            modifiedExpression = modifiedExpression.replace(/([^!<> \\t=])\\s*=\\s*(?!=)/g, '$1 == ');\n\n            // Date comparisons\n            modifiedExpression = modifiedExpression.replace(/\\s+is after or equal\\b/gi, ' >= ');\n            modifiedExpression = modifiedExpression.replace(/\\s+is before or equal\\b/gi, ' <= ');\n            modifiedExpression = modifiedExpression.replace(/\\s+is after\\b/gi, ' > ');\n            modifiedExpression = modifiedExpression.replace(/\\s+is before\\b/gi, ' < ');\n\n            // Helper to match operands (handles variables, quoted strings, and simple values)\n            const operand = '([^\\\\s()]+|\\'[^\\']*\\'|\"[^\"]*\")';\n\n            // String/Array operations (contains, includes, does not contain, does not include)\n            const listOps = [\n                { op: 'contains', js: '.includes', negate: false },\n                { op: 'includes', js: '.includes', negate: false },\n                { op: 'does not contain', js: '.includes', negate: true },\n                { op: 'does not include', js: '.includes', negate: true }\n            ];\n\n            listOps.forEach(({ op, negate }) => {\n                const regex = new RegExp(`${operand}\\\\s+${op}\\\\s+${operand}`, 'gi');\n                modifiedExpression = modifiedExpression.replace(regex, (match, p1, p2) => {\n                    const clause = `${p1} && ${p1}.includes(${p2})`;\n                    return negate ? `!(${clause})` : `(${clause})`;\n                });\n            });\n\n            // Handle \"in\" and \"not in\"\n            modifiedExpression = modifiedExpression.replace(new RegExp(`${operand}\\\\s+in\\\\s+(!?\\\\[[^\\\\]]*\\\\])`, 'gi'), '($2 && $2.includes($1))');\n            modifiedExpression = modifiedExpression.replace(new RegExp(`${operand}\\\\s+not in\\\\s+(!?\\\\[[^\\\\]]*\\\\])`, 'gi'), '!($2 && $2.includes($1))');\n\n            // Handle \"between\"\n            modifiedExpression = modifiedExpression.replace(new RegExp(`${operand}\\\\s+between\\\\s+${operand}\\\\s+&&\\\\s+${operand}`, 'gi'), '($1 >= $2 && $1 <= $3)');\n\n            // 4. Create and execute the function\n            // Using 'new Function' with arguments for variables is safer than 'eval'\n            const keys = [...Object.keys(variables), '__truthy'];\n            const values = [...Object.values(variables), LogicEvaluatorService.isTruthy];\n\n            const fn = new Function(...keys, `return (${modifiedExpression});`);\n            const result = !!fn(...values);\n            return result;\n\n        } catch (e) {\n            console.warn('Logic evaluation error:', e, expression);\n            if (this.strictDepth > 0) {\n                // evaluateStrict wants to know that this failed, rather than\n                // receive the fail-open default below. Rethrown rather than\n                // returned so every failure path inside the try — token\n                // resolution, Function construction, execution — reports\n                // uniformly.\n                throw e;\n            }\n            return true; // Default to visible/enabled on error\n        }\n    }\n\n    /**\n     * Depth counter rather than a boolean: `evaluate` can be re-entered (a\n     * token resolver reading state that itself evaluates), and a boolean would\n     * be cleared by the inner call returning.\n     */\n    private strictDepth = 0;\n\n    /**\n     * Evaluate, distinguishing \"false\" from \"could not be evaluated\".\n     *\n     * `evaluate` resolves any failure to `true`, which is right for layout — a\n     * mis-typed visibility condition should not blank part of a page. It is\n     * wrong wherever the condition is hiding something on purpose, because\n     * then a typo reveals it. Callers that need to fail closed use this and\n     * treat `null` as \"hide\".\n     */\n    evaluateStrict(\n        expression: string | any,\n        pageId?: string,\n        componentId?: string,\n        dataKey?: string,\n        rowData?: Record<string, any> | null,\n    ): boolean | null {\n        this.strictDepth++;\n        try {\n            return this.evaluate(expression, pageId, componentId, dataKey, rowData);\n        } catch {\n            return null;\n        } finally {\n            this.strictDepth--;\n        }\n    }\n\n    /**\n     * Resolve a state reference like `program_data.sts` against the computed\n     * page state. First tries an exact (possibly dotted) key for backward\n     * compatibility, then walks the dotted path into nested objects — parsing a\n     * JSON-string segment if it encounters one (state values are sometimes\n     * stored as stringified JSON). The resolved leaf is parsed too, so a\n     * variable holding `'[\"a\",\"b\"]'` reaches an API payload as an array rather\n     * than as a quoted string.\n     */\n    private resolveStatePath(stateObj: Record<string, any> | null | undefined, path: string): any {\n        if (!stateObj) return undefined;\n        if (Object.prototype.hasOwnProperty.call(stateObj, path)) return parseJsonValue(stateObj[path]);\n        const parts = path.split('.');\n        let cur: any = stateObj;\n        for (const p of parts) {\n            if (cur == null) return undefined;\n            if (typeof cur === 'string') {\n                try { cur = JSON.parse(cur); } catch { return undefined; }\n            }\n            cur = cur[p];\n        }\n        return parseJsonValue(cur);\n    }\n\n    evaluateValue(expression: string, pageId?: string, dataKey?: string, rowData?: Record<string, any> | null): any {\n        if (!expression || typeof expression !== 'string') return expression;\n        try {\n            // Date anchors first — see evaluate(). A bare `@current_date - 7`\n            // becomes the quoted date, which is the whole value here.\n            const source: string = LogicEvaluatorService.resolveDateKeywords(expression);\n\n            const varRegex = /@([a-zA-Z0-9_.]+)/g;\n            const variables: Record<string, any> = {};\n            let modifiedExpression = source;\n            const foundVars = source.match(varRegex);\n            if (foundVars) {\n                foundVars.forEach(v => {\n                    const fieldName = v.substring(1);\n                    let value: any;\n                    value = this.resolveToken(fieldName, pageId, dataKey, rowData);\n                    if (value instanceof Date) value = value.getTime();\n                    const safeKey = 'var_' + fieldName.replace(/[.-]/g, '_');\n                    variables[safeKey] = value;\n                    const escapedVar = v.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n                    modifiedExpression = modifiedExpression.replace(new RegExp(escapedVar + '(?![a-zA-Z0-9_.])', 'g'), safeKey);\n                });\n            }\n            const keys = Object.keys(variables);\n            const values = Object.values(variables);\n            const fn = new Function(...keys, `return (${modifiedExpression});`);\n            return fn(...values);\n        } catch (e) {\n            console.warn('Logic evaluateValue error:', e, expression);\n            return expression;\n        }\n    }\n}\n","/**\n * One entry of an API/query \"payload fields\" list.\n *\n * Authored as `source:path`, with an optional alias naming the key the value is\n * sent under — written either way round (`source:path=alias` or\n * `alias=source:path`). Without an alias the key is the path's last segment, which is\n * usually right — `state:org_id` sends `org_id` — but breaks the moment the\n * value the query wants is nested or named differently on this page:\n * `app:selected_fi.entity_data._in` would be sent as `_in`, and a query\n * expecting `entity_id` never sees it. `=` cannot appear in a state key or a\n * dotted path, so it is unambiguous as the separator.\n */\nexport interface PayloadField {\n  /** 'state' | 'page' | 'app'. */\n  source: string;\n  /** Dotted path within that source. */\n  path: string;\n  /** The key to send the value under. */\n  key: string;\n}\n\nexport function parsePayloadField(field: string): PayloadField | null {\n  if (!field || typeof field !== 'string') return null;\n\n  // Either order: `source:path=alias` or `alias=source:path`. The half naming a\n  // source is the field, so the two are told apart without a rule to remember —\n  // authors write the rename whichever way it reads to them.\n  let spec = field.trim();\n  let key = '';\n  const eq = spec.lastIndexOf('=');\n  if (eq > 0) {\n    const before = spec.substring(0, eq).trim();\n    const after = spec.substring(eq + 1).trim();\n    if (before.includes(':')) { spec = before; key = after; }\n    else if (after.includes(':')) { spec = after; key = before; }\n  }\n\n  const colon = spec.indexOf(':');\n  if (colon < 0) return null;\n  const source = spec.substring(0, colon);\n  const path = spec.substring(colon + 1).trim();\n  if (!path) return null;\n\n  if (!key) {\n    const parts = path.split('.');\n    key = parts[parts.length - 1];\n  }\n  return key ? { source, path, key } : null;\n}\n","/**\n * Hand the browser a file that arrived as a base64 string.\n *\n * The case this exists for: an API that returns a document as a JSON\n * attribute instead of streaming it, so there is no URL to point the browser\n * at. The bytes are decoded into a Blob and saved through a synthetic anchor\n * click — the same route the attachment component uses to open a file, with a\n * `download` attribute instead of a new tab.\n */\n\n/**\n * Extensions authors actually type into the panel, mapped to the MIME type the\n * Blob is built with. A type that is not listed still works: an unknown value\n * containing '/' is used as-is, and anything else falls back to\n * 'application/octet-stream', which every browser saves rather than renders.\n */\nconst MIME_BY_EXTENSION: Record<string, string> = {\n  pdf: 'application/pdf',\n  csv: 'text/csv',\n  txt: 'text/plain',\n  json: 'application/json',\n  xml: 'application/xml',\n  html: 'text/html',\n  zip: 'application/zip',\n  doc: 'application/msword',\n  docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n  xls: 'application/vnd.ms-excel',\n  xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n  ppt: 'application/vnd.ms-powerpoint',\n  pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n  png: 'image/png',\n  jpg: 'image/jpeg',\n  jpeg: 'image/jpeg',\n  gif: 'image/gif',\n  svg: 'image/svg+xml',\n  webp: 'image/webp'\n};\n\nconst EXTENSION_BY_MIME: Record<string, string> = Object.entries(MIME_BY_EXTENSION)\n  .reduce((acc, [ext, mime]) => {\n    if (!acc[mime]) acc[mime] = ext;\n    return acc;\n  }, {} as Record<string, string>);\n\n/** Resolve an author-supplied file type — a MIME type or a bare extension. */\nexport function resolveFileMimeType(fileType?: string | null): string {\n  const raw = String(fileType ?? '').trim().toLowerCase();\n  if (!raw) return 'application/octet-stream';\n  if (raw.includes('/')) return raw;\n  return MIME_BY_EXTENSION[raw.replace(/^\\./, '')] || 'application/octet-stream';\n}\n\n/**\n * The extension a name should end with for this MIME type, or '' when the type\n * is one we have no mapping for — better a name with no extension than a made\n * up one.\n */\nexport function extensionForMimeType(mimeType: string): string {\n  return EXTENSION_BY_MIME[String(mimeType || '').trim().toLowerCase()] || '';\n}\n\n/**\n * Strip a `data:<mime>;base64,` prefix and any whitespace a JSON response may\n * have wrapped the payload in. Returns the MIME type the prefix declared, so a\n * response that carries its own type needs nothing configured.\n */\nexport function parseBase64Payload(value: string): { base64: string; mime_type: string } {\n  const raw = String(value ?? '').trim();\n  const match = /^data:([^;,]*);base64,/i.exec(raw);\n  if (match) {\n    return { base64: raw.substring(match[0].length).replace(/\\s+/g, ''), mime_type: match[1] || '' };\n  }\n  return { base64: raw.replace(/\\s+/g, ''), mime_type: '' };\n}\n\n/** Decode base64 into bytes, URL-safe alphabet included. */\nfunction base64ToBytes(base64: string): Uint8Array {\n  const normalized = base64.replace(/-/g, '+').replace(/_/g, '/');\n  const padded = normalized + '='.repeat((4 - (normalized.length % 4)) % 4);\n  const binary = atob(padded);\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < binary.length; i++) {\n    bytes[i] = binary.charCodeAt(i);\n  }\n  return bytes;\n}\n\n/** Give the file a name, adding the extension implied by its type if it has none. */\nfunction resolveFileName(fileName: string | undefined | null, mimeType: string): string {\n  const name = String(fileName ?? '').trim();\n  const extension = extensionForMimeType(mimeType);\n  if (!name) return extension ? `download.${extension}` : 'download';\n  if (!extension) return name;\n  return name.toLowerCase().endsWith(`.${extension}`) ? name : `${name}.${extension}`;\n}\n\n/**\n * Save a base64 string as a file.\n *\n * `fileType` is a MIME type or a bare extension; a `data:` prefix on the value\n * supplies it when nothing is configured. Returns false when there is nothing\n * to download or the value is not decodable, so the caller can report it\n * rather than leave the click looking successful.\n */\nexport function downloadBase64File(\n  value: string,\n  fileName?: string | null,\n  fileType?: string | null\n): boolean {\n  const { base64, mime_type } = parseBase64Payload(value);\n  if (!base64) return false;\n\n  const explicit = String(fileType ?? '').trim();\n  const mimeType = explicit\n    ? resolveFileMimeType(explicit)\n    : (mime_type || 'application/octet-stream');\n\n  let bytes: Uint8Array;\n  try {\n    bytes = base64ToBytes(base64);\n  } catch {\n    return false;\n  }\n  if (bytes.length === 0) return false;\n\n  const blob = new Blob([bytes as any], { type: mimeType });\n  const url = URL.createObjectURL(blob);\n  const link = document.createElement('a');\n  link.href = url;\n  link.download = resolveFileName(fileName, mimeType);\n  link.style.display = 'none';\n  document.body.appendChild(link);\n  link.click();\n  document.body.removeChild(link);\n  // Revoked on a timer, not immediately: Safari reads the object URL after the\n  // click handler returns, and a URL already revoked downloads nothing.\n  setTimeout(() => URL.revokeObjectURL(url), 60000);\n  return true;\n}\n","import { EruComponent, EruPage, PageStateVariable } from '../models';\n\nexport interface PageStatePatch {\n  upsert?: Record<string, any>[];\n  delete?: string[];\n}\n\nexport interface PagePatch {\n  page_id?: string;\n  page_props?: Record<string, any>;\n  upsert?: Record<string, any>[];\n  delete?: string[];\n  state?: PageStatePatch;\n}\n\nexport interface PagePatchResult {\n  page: EruPage;\n  warnings: string[];\n  added_state_keys: string[];\n}\n\nconst PAGE_ROOT_ARRAYS = new Set(['components', 'state']);\n\nconst PAGE_HOST_TYPES = new Set(['page_ref', 'grid', 'tile', 'nav_outlet', 'widget']);\n\ninterface FlatNode {\n  id: string;\n  original: EruComponent | null;\n  fields: Record<string, any> | null;\n  parent_id: string;\n  children: string[];\n  order: number;\n  dirty: boolean;\n}\n\nfunction is_plain_object(value: any): boolean {\n  return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction clone_value(value: any): any {\n  if (Array.isArray(value)) return value.map(clone_value);\n  if (is_plain_object(value)) {\n    const out: Record<string, any> = {};\n    for (const key of Object.keys(value)) out[key] = clone_value(value[key]);\n    return out;\n  }\n  return value;\n}\n\nfunction merge_value(target: any, incoming: any): any {\n  if (is_plain_object(incoming) && is_plain_object(target)) {\n    const out: Record<string, any> = { ...target };\n    for (const key of Object.keys(incoming)) {\n      out[key] = merge_value(target[key], incoming[key]);\n    }\n    return out;\n  }\n  return clone_value(incoming);\n}\n\nfunction to_string_list(value: any): string[] | null {\n  if (Array.isArray(value)) {\n    return value.filter((item): item is string => typeof item === 'string' && item !== '');\n  }\n  if (typeof value === 'string') {\n    return value.split(',').map(part => part.trim()).filter(part => part !== '');\n  }\n  return null;\n}\n\nfunction to_index(value: any): number {\n  if (typeof value === 'number' && Number.isFinite(value)) return Math.trunc(value);\n  if (typeof value === 'string' && value.trim() !== '') {\n    const parsed = Number(value);\n    if (Number.isFinite(parsed)) return Math.trunc(parsed);\n  }\n  return -1;\n}\n\nfunction remove_id(ids: string[], needle: string): string[] {\n  const at = ids.indexOf(needle);\n  if (at < 0) return ids;\n  const out = ids.slice();\n  out.splice(at, 1);\n  return out;\n}\n\nfunction insert_id(ids: string[], needle: string, index: number): string[] {\n  const out = ids.slice();\n  if (index < 0 || index > out.length) {\n    out.push(needle);\n    return out;\n  }\n  out.splice(index, 0, needle);\n  return out;\n}\n\nclass FlatPage {\n  page: Record<string, any> = {};\n  nodes = new Map<string, FlatNode>();\n  roots: string[] = [];\n  private next = 0;\n\n  constructor(base: EruPage | null) {\n    for (const key of Object.keys(base || {})) {\n      if (key === 'components') continue;\n      this.page[key] = (base as any)[key];\n    }\n    for (const component of (base?.components || [])) {\n      const id = this.add_node(component, '');\n      if (id) this.roots.push(id);\n    }\n  }\n\n  add_node(raw: any, parent_id: string): string {\n    if (!is_plain_object(raw)) return '';\n    const id = typeof raw.id === 'string' ? raw.id : '';\n    if (!id) return '';\n    const node: FlatNode = {\n      id,\n      original: raw as EruComponent,\n      fields: null,\n      parent_id,\n      children: [],\n      order: this.next++,\n      dirty: false,\n    };\n    this.nodes.set(id, node);\n    for (const child of (Array.isArray(raw.children) ? raw.children : [])) {\n      const child_id = this.add_node(child, id);\n      if (child_id) node.children.push(child_id);\n    }\n    return id;\n  }\n\n  create_node(id: string, fields: Record<string, any>): FlatNode {\n    const node: FlatNode = {\n      id,\n      original: null,\n      fields,\n      parent_id: '',\n      children: [],\n      order: this.next++,\n      dirty: true,\n    };\n    this.nodes.set(id, node);\n    this.roots.push(id);\n    return node;\n  }\n\n  fields_of(node: FlatNode): Record<string, any> {\n    if (node.fields) return node.fields;\n    const out: Record<string, any> = {};\n    for (const key of Object.keys(node.original || {})) {\n      if (key === 'children') continue;\n      out[key] = (node.original as any)[key];\n    }\n    node.fields = out;\n    return out;\n  }\n\n  detach(id: string): void {\n    const node = this.nodes.get(id);\n    if (!node) return;\n    if (!node.parent_id) {\n      this.roots = remove_id(this.roots, id);\n      return;\n    }\n    const parent = this.nodes.get(node.parent_id);\n    if (parent) parent.children = remove_id(parent.children, id);\n  }\n\n  attach(id: string, parent_id: string, index: number): void {\n    const node = this.nodes.get(id);\n    if (!node) return;\n    this.detach(id);\n    if (node.parent_id !== parent_id) node.dirty = true;\n    node.parent_id = parent_id;\n    if (!parent_id) {\n      this.roots = insert_id(this.roots, id, index);\n      return;\n    }\n    const parent = this.nodes.get(parent_id);\n    if (!parent) {\n      node.parent_id = '';\n      node.dirty = true;\n      this.roots = insert_id(this.roots, id, index);\n      return;\n    }\n    parent.children = insert_id(parent.children, id, index);\n  }\n\n  remove(id: string): boolean {\n    const node = this.nodes.get(id);\n    if (!node) return false;\n    this.detach(id);\n    for (const child_id of node.children.slice()) this.remove(child_id);\n    this.nodes.delete(id);\n    return true;\n  }\n\n  nest(): EruPage {\n    const page: Record<string, any> = { ...this.page };\n    const seen = new Set<string>();\n    page['components'] = this.roots\n      .map(id => this.nest_node(id, seen))\n      .filter((component): component is EruComponent => !!component);\n    return page as EruPage;\n  }\n\n  private nest_node(id: string, seen: Set<string>): EruComponent | null {\n    const node = this.nodes.get(id);\n    if (!node || seen.has(id)) return null;\n    seen.add(id);\n\n    const children = node.children\n      .map(child_id => this.nest_node(child_id, seen))\n      .filter((component): component is EruComponent => !!component);\n\n    if (node.original && !node.dirty && this.children_unchanged(node.original, children)) {\n      return node.original;\n    }\n\n    const out: Record<string, any> = { ...this.fields_of(node) };\n    if (node.parent_id) out['parent_id'] = node.parent_id;\n    else delete out['parent_id'];\n    if (children.length > 0) out['children'] = children;\n    else delete out['children'];\n    return out as EruComponent;\n  }\n\n  private children_unchanged(original: EruComponent, children: EruComponent[]): boolean {\n    const previous = original.children || [];\n    if (previous.length !== children.length) return false;\n    for (let i = 0; i < children.length; i++) {\n      if (previous[i] !== children[i]) return false;\n    }\n    return true;\n  }\n}\n\n/**\n * Keys the runtime writes onto an emitted event as bookkeeping. They are not\n * part of the page and the component library rejects them, so a page that has\n * picked them up - from an older build that mutated the subscription in place -\n * is cleaned on the way out rather than being handed to the agent as something\n * it has to reproduce or explain.\n */\nconst RUNTIME_EVENT_KEYS = ['_originPageId', '_originDataKey'];\n\n/** A copy of the components with runtime-only event keys removed. */\nexport function stripRuntimeEventKeys(components: EruComponent[]): EruComponent[] {\n  return (components || []).map(component => {\n    const events = (component as any)?.events;\n    const cleanedEvents = Array.isArray(events)\n      ? events.map((event: any) => {\n          if (!event || typeof event !== 'object') return event;\n          if (!RUNTIME_EVENT_KEYS.some(key => key in event)) return event;\n          const copy = { ...event };\n          RUNTIME_EVENT_KEYS.forEach(key => delete copy[key]);\n          return copy;\n        })\n      : events;\n    const children = component?.children ? stripRuntimeEventKeys(component.children) : component?.children;\n    if (cleanedEvents === events && children === component?.children) return component;\n    return { ...component, ...(cleanedEvents ? { events: cleanedEvents } : {}), ...(children ? { children } : {}) } as EruComponent;\n  });\n}\n\nexport function stripMountedPages(components: EruComponent[]): EruComponent[] {\n  return (components || []).map(component => {\n    const type = component?.type || '';\n    if (PAGE_HOST_TYPES.has(type)) {\n      if (!component.children || component.children.length === 0) return component;\n      const { children, ...rest } = component;\n      return rest as EruComponent;\n    }\n    if (!component.children || component.children.length === 0) return component;\n    const stripped = stripMountedPages(component.children);\n    if (stripped === component.children) return component;\n    let changed = stripped.length !== component.children.length;\n    if (!changed) {\n      for (let i = 0; i < stripped.length; i++) {\n        if (stripped[i] !== component.children[i]) { changed = true; break; }\n      }\n    }\n    return changed ? { ...component, children: stripped } : component;\n  });\n}\n\nexport interface ScannedPageComponent {\n  sequence?: number;\n  source?: string;\n  id: string;\n  type?: string;\n  parent_id?: string;\n  children_ids?: string[];\n  component: Record<string, any>;\n}\n\nexport function buildStagingTree(scanned: ScannedPageComponent[]): EruComponent[] {\n  const nodes = new Map<string, ScannedPageComponent>();\n  const order: string[] = [];\n  for (const entry of scanned) {\n    if (!entry?.id || !is_plain_object(entry.component)) continue;\n    if (!nodes.has(entry.id)) order.push(entry.id);\n    nodes.set(entry.id, entry);\n  }\n\n  const claimed = new Set<string>();\n  for (const id of order) {\n    const entry = nodes.get(id)!;\n    for (const child_id of (entry.children_ids || [])) {\n      if (nodes.has(child_id)) claimed.add(child_id);\n    }\n    const parent_id = entry.parent_id || '';\n    if (parent_id && nodes.has(parent_id)) claimed.add(id);\n  }\n\n  const seen = new Set<string>();\n  const build = (id: string): EruComponent | null => {\n    const entry = nodes.get(id);\n    if (!entry || seen.has(id)) return null;\n    seen.add(id);\n\n    const child_ids: string[] = [];\n    for (const child_id of (entry.children_ids || [])) {\n      if (nodes.has(child_id) && !child_ids.includes(child_id)) child_ids.push(child_id);\n    }\n    for (const candidate of order) {\n      if (child_ids.includes(candidate)) continue;\n      if ((nodes.get(candidate)!.parent_id || '') === id) child_ids.push(candidate);\n    }\n\n    const out: Record<string, any> = { ...entry.component };\n    delete out['children_ids'];\n    if (child_ids.length > 0) {\n      const children = child_ids\n        .map(build)\n        .filter((component): component is EruComponent => !!component);\n      out['children'] = children;\n    } else if (!Array.isArray(out['children'])) {\n      delete out['children'];\n    }\n    return ensure_component_shape(id, out) as EruComponent;\n  };\n\n  const roots: EruComponent[] = [];\n  for (const id of order) {\n    if (claimed.has(id)) continue;\n    const built = build(id);\n    if (built) roots.push(built);\n  }\n  for (const id of order) {\n    if (seen.has(id)) continue;\n    const built = build(id);\n    if (built) roots.push(built);\n  }\n  return roots;\n}\n\nexport function applyPagePatch(base: EruPage | null, patch: PagePatch | null | undefined): PagePatchResult {\n  const warnings: string[] = [];\n  if (!patch) {\n    return { page: (base || { components: [] }) as EruPage, warnings: ['no patch to apply'], added_state_keys: [] };\n  }\n\n  const flat = new FlatPage(base);\n  if (patch.page_id) flat.page['id'] = patch.page_id;\n  for (const key of Object.keys(patch.page_props || {})) {\n    if (PAGE_ROOT_ARRAYS.has(key)) {\n      warnings.push(`page_props.${key} was ignored: ${key} has its own patch section`);\n      continue;\n    }\n    flat.page[key] = clone_value(patch.page_props![key]);\n  }\n\n  const child_lists = new Map<string, string[]>();\n  const placements: { id: string; parent_id: string; index: number; explicit: boolean }[] = [];\n\n  for (const raw of (patch.upsert || [])) {\n    const id = typeof raw?.['id'] === 'string' ? raw['id'] : '';\n    if (!id) {\n      warnings.push('an upsert entry without an \"id\" was dropped');\n      continue;\n    }\n    const incoming: Record<string, any> = {};\n    let declared_children: string[] | null = null;\n    let parent_id = '';\n    let index = -1;\n    let has_parent = false;\n    const effective_type = typeof raw['type'] === 'string'\n      ? raw['type']\n      : (flat.nodes.get(id)?.original?.type || flat.nodes.get(id)?.fields?.['type'] || '');\n\n    for (const key of Object.keys(raw)) {\n      const value = raw[key];\n      if (key === 'children_ids') {\n        declared_children = to_string_list(value) || [];\n      } else if (key === 'children') {\n        if (PAGE_HOST_TYPES.has(effective_type)) {\n          warnings.push(`\"${id}\" is a ${effective_type} and mounts another page; the components sent under its \"children\" were ignored`);\n        } else if (Array.isArray(value)) {\n          declared_children = declared_children || [];\n          for (const child of value) {\n            const child_id = flat.add_node(child, id);\n            if (child_id) declared_children.push(child_id);\n          }\n        }\n      } else if (key === 'parent_id') {\n        parent_id = typeof value === 'string' ? value : '';\n        has_parent = true;\n      } else if (key === 'index') {\n        index = to_index(value);\n      } else {\n        incoming[key] = clone_value(value);\n      }\n    }\n\n    const existing = flat.nodes.get(id);\n    if (existing) {\n      existing.fields = merge_value(flat.fields_of(existing), incoming);\n      existing.dirty = true;\n    } else {\n      flat.create_node(id, ensure_component_shape(id, incoming));\n    }\n\n    if (declared_children) child_lists.set(id, declared_children);\n    if (has_parent || index >= 0) placements.push({ id, parent_id, index, explicit: has_parent });\n  }\n\n  for (const parent_id of Array.from(child_lists.keys()).sort()) {\n    const parent = flat.nodes.get(parent_id);\n    if (!parent) {\n      warnings.push(`children_ids named parent \"${parent_id}\", which the page does not have`);\n      continue;\n    }\n    const declared = child_lists.get(parent_id)!;\n    for (const child_id of parent.children) {\n      if (declared.includes(child_id)) continue;\n      const child = flat.nodes.get(child_id);\n      if (!child) continue;\n      child.parent_id = '';\n      child.dirty = true;\n      flat.roots.push(child_id);\n    }\n    parent.children = [];\n    for (const child_id of declared) {\n      if (!flat.nodes.has(child_id)) {\n        warnings.push(`\"${parent_id}\" lists child \"${child_id}\", which no component in the patch or the page defines`);\n        continue;\n      }\n      flat.attach(child_id, parent_id, -1);\n    }\n  }\n\n  for (const place of placements) {\n    if (place.explicit && child_lists.has(place.parent_id)) continue;\n    if (!place.explicit && place.index < 0) continue;\n    let target = place.parent_id;\n    if (!place.explicit) target = flat.nodes.get(place.id)?.parent_id ?? '';\n    flat.attach(place.id, target, place.index);\n  }\n\n  for (const id of (patch.delete || [])) {\n    if (!flat.remove(id)) {\n      warnings.push(`delete named \"${id}\", which the page does not have`);\n    }\n  }\n\n  const added_state_keys: string[] = [];\n  if (patch.state) {\n    flat.page['state'] = apply_state_patch(flat.page['state'], patch.state, warnings, added_state_keys);\n  }\n\n  return { page: flat.nest(), warnings, added_state_keys };\n}\n\nfunction ensure_component_shape(id: string, fields: Record<string, any>): Record<string, any> {\n  const out: Record<string, any> = { id, ...fields };\n  if (!is_plain_object(out['properties'])) out['properties'] = { base: {} };\n  if (!is_plain_object(out['styles'])) {\n    out['styles'] = { classes: '', responsive_classes: {}, responsive_styles: {}, custom: {} };\n  }\n  return out;\n}\n\nfunction apply_state_patch(\n  existing: any,\n  patch: PageStatePatch,\n  warnings: string[],\n  added_keys: string[]\n): PageStateVariable[] {\n  const out: PageStateVariable[] = Array.isArray(existing) ? existing.slice() : [];\n  const index_of = (key: string) => out.findIndex(variable => variable?.key === key);\n\n  for (const raw of (patch.upsert || [])) {\n    const key = typeof raw?.['key'] === 'string' ? raw['key'] : '';\n    if (!key) {\n      warnings.push('a state upsert without a \"key\" was dropped');\n      continue;\n    }\n    const at = index_of(key);\n    if (at >= 0) {\n      out[at] = merge_value(out[at], raw) as PageStateVariable;\n      continue;\n    }\n    out.push(clone_value(raw) as PageStateVariable);\n    added_keys.push(key);\n  }\n\n  for (const key of (patch.delete || [])) {\n    const at = index_of(key);\n    if (at < 0) {\n      warnings.push(`state delete named \"${key}\", which the page does not declare`);\n      continue;\n    }\n    out.splice(at, 1);\n  }\n\n  return out;\n}\n","import { Injectable, Injector, signal, computed, effect, inject, untracked, Signal } from '@angular/core';\nimport {\n  EruPage,\n  EruComponent,\n  DragState,\n  ViewportState,\n  HistoryState,\n  UIState,\n  TailwindBreakpoint,\n  PageData,\n  RecordFieldPatch,\n  ComponentEventSubscription,\n  Entity,\n  EntityField,\n  DynamicDataRequest,\n  UpdateStateFormula,\n  StateFilter,\n  NAV_PARAM_JSON_PREFIX,\n  NAV_PARAM_MAX_LENGTH, ServerValidationNotice } from '../models';\nimport { APP_CONSTANTS } from '../constants/app-constants';\nimport { ComponentRegistryService } from './component-registry.service';\nimport { EruAppRouteService } from './eru-app-route.service';\nimport { LogicEvaluatorService } from './logic-evaluator.service';\nimport { JsonUtil, parseJsonValue, resolveJsonPath } from '../utils/json.util';\nimport { parsePayloadField } from '../utils/payload-field.util';\nimport { downloadBase64File } from '../utils/file-download.util';\nimport { PagePatch, PagePatchResult, ScannedPageComponent, applyPagePatch, buildStagingTree, stripMountedPages, stripRuntimeEventKeys} from '../utils/page-patch.util';\n\n/**\n * Snapshot of one page's runtime state, parked on the root store while the\n * page is unmounted so a return visit (Back, or navigating back to it) can\n * pick up where the user left off. See `retainPageState`.\n */\nexport interface RetainedPageState {\n  state: Record<string, any>;\n  instance_state?: Map<string, Record<string, any>>;\n  page_data?: PageData;\n  page_data_array?: PageData[];\n}\n\n@Injectable()\nexport class EruStudioStore {\n  private componentRegistry = inject(ComponentRegistryService);\n  private routeService = inject(EruAppRouteService);\n  private injector = inject(Injector);\n  // Resolved on first use, not injected: LogicEvaluatorService injects this\n  // store, so taking it as a constructor dependency would be a cycle.\n  private _logicEvaluator: LogicEvaluatorService | null = null;\n  private logicEvaluator(): LogicEvaluatorService | null {\n    if (!this._logicEvaluator) {\n      this._logicEvaluator = this.injector.get(LogicEvaluatorService, null, { optional: true });\n    }\n    return this._logicEvaluator;\n  }\n\n  private _entities = signal<Entity[]>([]);\n  private _currentPage = signal<EruPage | null>(null);\n  private _selectedComponent = signal<EruComponent | null>(null);\n  private _pageData = signal<Map<string, PageData>>(new Map());\n  // Last field-level write to a page RECORD, announced so whatever else is\n  // showing that record can follow it. `set-page-data` hands the page a COPY of\n  // a grid row, so an edit made through the page left the grid's own copy on\n  // the old value until it was refetched. See `recordFieldPatch`.\n  private _recordFieldPatch = signal<RecordFieldPatch | null>(null);\n  private _recordFieldPatchSeq = 0;\n  private _queryData = signal<Map<string, any>>(new Map());\n  private _pageDataArray = signal<Map<string, PageData[]>>(new Map());\n  private _componentEventEmitted = signal<Map<string, Map<string, ComponentEventSubscription[]>>>(new Map());\n  private _fieldVisibilityOverrides = signal<Map<string, Map<string, boolean>>>(new Map()); // pageId -> (fieldName -> visible)\n  private _componentLoadingStates = signal<Map<string, boolean>>(new Map()); // componentId -> isLoading\n  private _componentVisibilityOverrides = signal<Map<string, boolean>>(new Map()); // componentId -> visible\n  private _fieldDisabledOverrides = signal<Map<string, Map<string, boolean>>>(new Map()); // pageId -> (fieldName -> disabled)\n  private _componentPropertyOverrides = signal<Map<string, Map<string, any>>>(new Map()); // componentId -> (propertyKey -> value)\n  private _componentActions = signal<Map<string, { action: string; data?: any }>>(new Map());\n  private _componentDisabledStates = signal<Map<string, boolean>>(new Map());\n  private _sidePanelOpenStates = signal<Map<string, boolean>>(new Map()); // page_ref id -> isOpen\n  private _clipboard = signal<EruComponent | null>(null);\n  private _dynamicData = signal<Map<string, any>>(new Map());\n  private _dynamicDataRequests = signal<Map<string, DynamicDataRequest>>(new Map());\n  private _dynamicDataResponses = signal<Map<string, any>>(new Map());\n  /**\n   * Cache for session-stable dynamic-data responses, keyed by `${type}::${payloadKey}`.\n   * Consulted on new requests of CACHEABLE_DYNAMIC_DATA_TYPES so that sibling\n   * components asking for the same metadata (e.g. multiple grids reading\n   * `ds_fields` for the same entity) get an instant response instead of\n   * round-tripping the host handler again.\n   */\n  private _dynamicDataCache = new Map<string, any>();\n  /**\n   * requestId of the still-unanswered request per coalesce key, so identical\n   * concurrent asks share one round-trip. Distinct from `_dynamicDataCache`,\n   * which holds ANSWERED responses for types stable enough to reuse for the\n   * session: this only ever merges requests that are in flight at the same\n   * moment, so it cannot serve anything stale.\n   */\n  private _dynamicDataInflight = new Map<string, string>();\n  private _pendingData = signal<Map<string, DynamicDataRequest>>(new Map());\n  private _pageState = signal<Map<string, Record<string, any>>>(new Map());\n  private _pageInstanceState = signal<Map<string, Map<string, Record<string, any>>>>(new Map());\n  private _pageStateInitials = signal<Map<string, Record<string, any>>>(new Map());\n\n  /**\n   * Pages whose state is still being seeded by the controls on them.\n   *\n   * A page load is not one state write but a burst of them: every control that\n   * declares a Default From State writes its seed value as it mounts, one per\n   * change-detection pass. Anything that re-runs on a state change — a grid\n   * that resolves bound variables into its query payload above all — would\n   * otherwise fire once per control, in the same few hundred milliseconds, and\n   * the answers land interleaved on top of each other.\n   *\n   * So the page is marked as settling the moment its state is initialised and\n   * stays that way until the writes stop (see `schedulePageSettled`). A reader\n   * that gates on `isPageSettling()` sits the burst out and runs ONCE, with the\n   * final seeded values — while a later change, the user actually choosing\n   * something in a control, passes straight through.\n   */\n  private _pagesSettling = signal<Set<string>>(new Set<string>());\n  private pageSettleTimers = new Map<string, any>();\n  /** Latest moment a page is allowed to stay 'settling', however busy it is. */\n  private pageSettleDeadlines = new Map<string, number>();\n  /** Quiet period after the last seeding write before a page counts as loaded. */\n  private static readonly PAGE_SETTLE_QUIET_MS = 250;\n  /** Hard cap on the settling window, so a page that writes state on a timer\n   *  (a clock, a poll) cannot hold its grids empty forever. */\n  private static readonly PAGE_SETTLE_MAX_MS = 2000;\n\n  // Runtime context supplied by the host app (processo): org_id, process_id,\n  // process_name, org_process_id, user_id and user_access (scoped to the current\n  // org/process). Exposed on every page as read-only system state vars.\n  private _runtimeContext = signal<Record<string, any>>({});\n  /**\n   * Resolves through the parent chain: the host pushes the context onto the\n   * outer store only, so a `nav_outlet` mount (whose inner store the host never\n   * sees) has to inherit it — otherwise `@state.org_id` and friends read as\n   * undefined inside every nested page. Own values win, so a store that is\n   * given its own context is not overridden by its parent's.\n   */\n  readonly runtimeContext: Signal<Record<string, any>> = computed(() => {\n    const parent = this.getParentStore();\n    const own = this._runtimeContext();\n    return parent ? { ...parent.runtimeContext(), ...own } : own;\n  });\n  static readonly SYSTEM_STATE_KEYS = ['org_id', 'process_id', 'process_name', 'org_process_id', 'user_id', 'user_access'];\n  setRuntimeContext(ctx: { org_id?: string; process_id?: string; process_name?: string; org_process_id?: string; user_id?: string; user_access?: any }): void {\n    this._runtimeContext.update(c => ({ ...c, ...ctx }));\n    // App state is scoped to one org_process: switching process in the same tab\n    // must not surface the previous process's shared values.\n    if (ctx.org_process_id) this.enforceAppStateContext(ctx.org_process_id);\n  }\n\n  // ---------------------------------------------------------------------------\n  // App state — window-wide shared state living on the ROOT store.\n  //\n  // Page state is per page and, for nav_outlet mounts, per store — an outlet\n  // swap destroys the inner store and everything in it. App state is held by\n  // the root store (which outlet swaps never destroy), so it is the place for\n  // values several pages share: the selected company, active filters, a chosen\n  // theme. Unlike route params it takes arbitrary JSON, and it is mirrored to\n  // sessionStorage so a refresh does not lose it.\n  //\n  // Read as `@app.<key>` in expressions, or `app:<key>` in payload fields.\n  // Written by an `update-state` action with `state_scope: 'app'`.\n  // ---------------------------------------------------------------------------\n  private static readonly APP_STATE_STORAGE_KEY = 'eru_studio_app_state';\n  private static readonly APP_STATE_MAX_BYTES = 512 * 1024;\n  private _appState = signal<Record<string, any>>({});\n  private _appStateContext: string | null = null;\n\n  /**\n   * The top of the parent chain. App state and retained page state live here\n   * so they outlive the inner stores that nav_outlet creates and destroys.\n   */\n  rootStore(): EruStudioStore {\n    let store: EruStudioStore = this;\n    let parent = store.getParentStore();\n    while (parent) {\n      store = parent;\n      parent = store.getParentStore();\n    }\n    return store;\n  }\n\n  /** Reactive view of app state — resolves through the parent chain to the root. */\n  readonly appState = computed<Record<string, any>>(() => this.rootStore()._appState());\n\n  // Nav params handed over directly, in addition to going into the URL.\n  //\n  // Writing the URL is asynchronous (the router navigates, then the route\n  // service re-reads on NavigationEnd), so a host that mounts the target page\n  // immediately would seed its state before the params land. This slot closes\n  // that window. It is keyed by target page id so an unrelated page mounting in\n  // between (a nested page_ref, say) cannot swallow the params, and lives on the\n  // root store so it is reachable across the store boundary a nav_outlet creates.\n  private _pendingNavParams: { page_id: string; params: Record<string, string> } | null = null;\n\n  setPendingNavParams(pageId: string, params: Record<string, string>): void {\n    const root = this.rootStore();\n    root._pendingNavParams = Object.keys(params).length > 0 ? { page_id: pageId, params } : null;\n  }\n\n  private takePendingNavParams(pageId: string): Record<string, string> {\n    const root = this.rootStore();\n    const pending = root._pendingNavParams;\n    if (!pending || pending.page_id !== pageId) return {};\n    root._pendingNavParams = null;\n    return pending.params;\n  }\n\n  getAppStateValue(key: string): any {\n    return this.appState()[key];\n  }\n\n  setAppStateValue(key: string, value: any): void {\n    const root = this.rootStore();\n    root._appState.update(s => ({ ...s, [key]: value }));\n    root.persistAppState();\n    // A control seeding an app-scoped variable is part of the same load burst\n    // as its page-scoped siblings (see `beginPageSettle`).\n    this.extendPageSettleForCurrentPage();\n  }\n\n  setAppStateValues(patch: Record<string, any>): void {\n    const root = this.rootStore();\n    root._appState.update(s => ({ ...s, ...patch }));\n    root.persistAppState();\n  }\n\n  clearAppState(): void {\n    const root = this.rootStore();\n    root._appState.set({});\n    root.persistAppState();\n  }\n\n  private hydrateAppState(): void {\n    try {\n      const raw = globalThis.sessionStorage?.getItem(EruStudioStore.APP_STATE_STORAGE_KEY);\n      if (!raw) return;\n      const parsed = JSON.parse(raw);\n      if (parsed && typeof parsed.data === 'object' && parsed.data) {\n        this._appState.set(parsed.data);\n        this._appStateContext = parsed.ctx ?? null;\n      }\n    } catch {\n      // Storage unavailable (SSR, privacy mode) or corrupt — start empty.\n    }\n  }\n\n  private persistAppState(): void {\n    try {\n      const payload = JSON.stringify({ ctx: this._appStateContext, data: this._appState() });\n      // A page that parks a large blob here would blow the storage quota and\n      // throw on every subsequent write. Keep it in memory instead.\n      if (payload.length > EruStudioStore.APP_STATE_MAX_BYTES) {\n        console.warn('eru-studio: app state too large to persist, keeping in memory only');\n        return;\n      }\n      globalThis.sessionStorage?.setItem(EruStudioStore.APP_STATE_STORAGE_KEY, payload);\n    } catch {\n      // Non-fatal: app state still works for this session, just not across refresh.\n    }\n  }\n\n  private enforceAppStateContext(orgProcessId: string): void {\n    const root = this.rootStore();\n    if (root._appStateContext === orgProcessId) return;\n    if (root._appStateContext !== null) root._appState.set({});\n    root._appStateContext = orgProcessId;\n    root.persistAppState();\n  }\n\n  // Host-facing page navigation channel. A `navigate-to-page` action inside a\n  // shell writes a route param that the shell's nav_outlet mounts; when the\n  // page is rendered standalone (no nav_outlet listening) the action pushes a\n  // request here instead, which the host app (processo) fulfils by loading the\n  // target page. `seq` makes repeat navigations to the same page distinct so\n  // the signal always emits.\n  private _navSeq = 0;\n  private _pageNavigationRequest = signal<{ page_id: string; param_name: string; params?: Record<string, string>; seq: number } | null>(null);\n  readonly pageNavigationRequest = this._pageNavigationRequest.asReadonly();\n  requestPageNavigation(page_id: string, param_name: string = 'view', params?: Record<string, string>): void {\n    this._navSeq += 1;\n    this._pageNavigationRequest.set({ page_id, param_name, params, seq: this._navSeq });\n  }\n  clearPageNavigationRequest(): void {\n    this._pageNavigationRequest.set(null);\n  }\n\n  /**\n   * Run a `navigate-to-page` action. Shared by component events (base-component)\n   * and page-level events (a custom signal a nested page emitted to its parent),\n   * so both resolve the target the same way: a nav_outlet in the store chain gets\n   * a route-param write, a standalone page hands the request to the host app.\n   *\n   * `evaluate` lets the caller supply its own expression evaluator — a component\n   * inside a row/card scope has a context-bound one that resolves `@` refs\n   * against that row; without it the page-level evaluator is used.\n   */\n  navigateToPage(\n    sub: ComponentEventSubscription,\n    originPageId: string,\n    dataKey?: string,\n    evaluate?: (expression: string) => any\n  ): void {\n    if (!sub.page_id) return;\n    const paramName = sub.state_key || 'view';\n    // Snapshot before leaving so a return visit can resume (no-op unless the\n    // hosting outlet enables retention).\n    this.capturePageStateSnapshot(originPageId);\n    const navParams = this.resolveNavParams(sub, originPageId, dataKey, evaluate);\n    // Everything the firing event knew, offered to the target page by name. Only\n    // the state variables the target DECLARES are ever seeded (routeSeedForPage),\n    // so this stays invisible until a page asks for a key — the author does not\n    // have to park the value in app state and clean it up afterwards.\n    //\n    // Handed over in memory only, never written to the URL: a drilled row can be\n    // wide, and the explicit nav_params below are the ones the author chose to\n    // make part of the address (and so survive refresh and Back).\n    const autoParams = this.autoParamsFromPayload((sub as any).payload);\n    // Hand the params over directly as well as via the URL — the target page\n    // can mount before the router's navigation completes. Explicit nav_params\n    // win: naming a param is the author overriding what the payload offered.\n    this.setPendingNavParams(sub.page_id, { ...autoParams, ...navParams });\n    if (this.hasOutletInChain(paramName)) {\n      // A shell nav_outlet is listening on this param — let it swap the page.\n      // One setParams call so the page id and its context land in a single\n      // history entry; Back then restores both together.\n      this.routeService.setParams({ ...navParams, [paramName]: sub.page_id });\n    } else {\n      // Page rendered standalone (no shell). Hand the page id and params to\n      // the host and let it do a single navigation to the TARGET. Writing the\n      // params onto the current page's URL here would add a second history\n      // entry — Back would land on this page with the target's params stuck\n      // in the URL — and the host puts them on the target url anyway.\n      this.requestPageNavigation(sub.page_id, paramName, navParams);\n    }\n  }\n\n  /**\n   * The values a fired event can offer the page it navigates to, keyed by the\n   * name the target would declare them under.\n   *\n   * Sources, lowest precedence first:\n   *  - `entity_data` — the record the event fired on (a drilled row's columns)\n   *  - `drill.column_name` / `drill.column_value` — which cell was clicked\n   *  - `extras` — what the author added via Extra Payload, so it can override\n   *    a same-named row field deliberately\n   *\n   * Nothing here is filtered by name: `routeSeedForPage` takes only the keys the\n   * target page declares as state variables, which is the whole point — the\n   * handover carries everything and the target decides what it wants.\n   */\n  private autoParamsFromPayload(payload: any): Record<string, string> {\n    if (!payload || typeof payload !== 'object') return {};\n    const out: Record<string, string> = {};\n    const add = (key: string, value: any): void => {\n      if (!key || value === undefined || value === null) return;\n      if (typeof value === 'object') {\n        // Not length-capped like the URL params: this handover is in memory, so\n        // a wide row costs nothing and dropping it would be the surprising part.\n        try {\n          out[key] = NAV_PARAM_JSON_PREFIX + JSON.stringify(value);\n        } catch {\n          // circular / non-serialisable — nothing useful to hand over\n        }\n        return;\n      }\n      out[key] = String(value);\n    };\n    const row = payload.entity_data;\n    if (row && typeof row === 'object') {\n      for (const [k, v] of Object.entries(row)) add(k, v);\n    }\n    const drill = payload.drill;\n    if (drill && typeof drill === 'object') {\n      add('column_name', drill.column_name);\n      add('column_value', drill.column_value);\n    }\n    const extras = payload.extras;\n    if (extras && typeof extras === 'object') {\n      for (const [k, v] of Object.entries(extras)) add(k, v);\n    }\n    return out;\n  }\n\n  /**\n   * Build the extra query params a `navigate-to-page` action carries to its\n   * target. Each param name should match a state variable on the target page,\n   * which `initPageState` seeds from the URL on mount.\n   *\n   * Values are stringified because query params are strings; the target coerces\n   * back using its declared initial as the type hint. Objects need an explicit\n   * `encode: 'json'` — silently JSON-ing an object here would produce\n   * \"[object Object]\" in the URL for anyone who passed one by accident.\n   */\n  resolveNavParams(\n    sub: ComponentEventSubscription,\n    pageId: string,\n    dataKey?: string,\n    evaluate?: (expression: string) => any\n  ): Record<string, string> {\n    const evalExpr = evaluate\n      ?? ((expression: string) => this.logicEvaluator()?.evaluateValue(expression, pageId, dataKey || undefined));\n    const out: Record<string, string> = {};\n    for (const np of (sub.nav_params || [])) {\n      if (!np?.param) continue;\n      const raw = np.value_expression && np.value_expression.trim()\n        ? evalExpr(np.value_expression)\n        : np.value;\n      if (raw === undefined || raw === null) continue;\n      let encoded: string;\n      if (np.encode === 'json') {\n        try {\n          encoded = NAV_PARAM_JSON_PREFIX + JSON.stringify(raw);\n        } catch {\n          console.warn('eru-studio: nav param not serializable, skipped', np.param);\n          continue;\n        }\n      } else if (typeof raw === 'object') {\n        console.warn('eru-studio: nav param is an object but encode is not \"json\", skipped', np.param);\n        continue;\n      } else {\n        encoded = String(raw);\n      }\n      // A URL that exceeds what browsers and proxies accept fails as a whole,\n      // taking the navigation with it. Drop the offending param instead.\n      if (encoded.length > NAV_PARAM_MAX_LENGTH) {\n        console.warn(`eru-studio: nav param \"${np.param}\" exceeds ${NAV_PARAM_MAX_LENGTH} chars, skipped — use app state for large values`);\n        continue;\n      }\n      out[np.param] = encoded;\n    }\n    return out;\n  }\n\n  // Nested canvas stores (nav_outlet mounts create a fresh isolated store per\n  // inner RuntimeCanvas). Each registers here with its parent so the host app\n  // can walk the tree and process component events (call-query/call-function/…) on\n  // every canvas — results must land on the store the page's components read.\n  private _childStores = signal<EruStudioStore[]>([]);\n  readonly childStores = this._childStores.asReadonly();\n  registerChildStore(store: EruStudioStore): void {\n    this._childStores.update(list => (list.includes(store) ? list : [...list, store]));\n  }\n  unregisterChildStore(store: EruStudioStore): void {\n    this._childStores.update(list => list.filter(s => s !== store));\n  }\n\n  // Reverse of childStores: set by the nested canvas on itself when it finds\n  // an ancestor store, so a `navigate-to-page` action fired deep inside a\n  // nav_outlet-mounted page can walk UP to find an outlet claim made by an\n  // ancestor shell — without touching stores belonging to unrelated windows.\n  // A signal (not a plain field) so `appState` and other chain-walking computeds\n  // recompute if the parent is attached after they first run.\n  private _parentStore = signal<EruStudioStore | null>(null);\n  setParentStore(store: EruStudioStore | null): void {\n    this._parentStore.set(store);\n  }\n  getParentStore(): EruStudioStore | null {\n    return this._parentStore();\n  }\n\n  // Route-param names claimed by nav_outlets mounted within THIS store's own\n  // canvas (not globally — each top-level window/canvas gets its own fresh\n  // EruStudioStore, so scoping here keeps unrelated windows from leaking into\n  // each other's `navigate-to-page` resolution).\n  private readonly _outlets = new Map<string, number>();\n  registerOutlet(paramName: string): void {\n    const key = paramName || 'view';\n    this._outlets.set(key, (this._outlets.get(key) ?? 0) + 1);\n  }\n  unregisterOutlet(paramName: string): void {\n    const key = paramName || 'view';\n    const n = (this._outlets.get(key) ?? 0) - 1;\n    if (n <= 0) this._outlets.delete(key);\n    else this._outlets.set(key, n);\n  }\n  hasOutlet(paramName: string): boolean {\n    return (this._outlets.get(paramName || 'view') ?? 0) > 0;\n  }\n\n  /** Walks this store and its ancestor chain for an outlet claiming paramName. */\n  hasOutletInChain(paramName: string): boolean {\n    let store: EruStudioStore | null = this;\n    while (store) {\n      if (store.hasOutlet(paramName)) return true;\n      store = store.getParentStore();\n    }\n    return false;\n  }\n\n  // ---------------------------------------------------------------------------\n  // Retained page state — lets a return visit resume where the user left off.\n  //\n  // A nav_outlet page swap destroys the inner store, so by default coming back\n  // to a page (Back button, or navigating to it again) gives a blank one. When\n  // retention is enabled on the outlet, the page's state is snapshotted as it\n  // leaves and parked on the ROOT store, which survives the swap; the snapshot\n  // is consumed by `initPageState` on the next mount.\n  //\n  // Route params still win over a snapshot: an explicit navigation intent\n  // (\"open company X\") must not be overridden by where the user happened to be\n  // the last time they visited that page.\n  // ---------------------------------------------------------------------------\n  private static readonly RETAINED_PAGE_LIMIT = 20;\n  private readonly _retainedPageState = new Map<string, RetainedPageState>();\n  private _retainPageState = false;\n\n  /** Enabled per canvas by `nav_outlet`'s `retain_page_state` property. */\n  setRetainPageState(retain: boolean): void {\n    this._retainPageState = retain;\n  }\n  getRetainPageState(): boolean {\n    return this._retainPageState;\n  }\n\n  /**\n   * Snapshot a page's state onto the root store. No-op unless retention is on,\n   * so pages that should always start clean are unaffected.\n   */\n  capturePageStateSnapshot(pageId?: string): void {\n    if (!this._retainPageState) return;\n    const pid = pageId || this._currentPage()?.id;\n    if (!pid) return;\n    const state = this._pageState().get(pid);\n    if (!state) return;\n    const cache = this.rootStore()._retainedPageState;\n    // Bounded LRU: re-inserting moves the entry to the end of the Map's\n    // insertion order, so the oldest untouched page is the one evicted.\n    cache.delete(pid);\n    cache.set(pid, {\n      state: { ...state },\n      instance_state: this._pageInstanceState().get(pid),\n      page_data: this._pageData().get(pid),\n      page_data_array: this._pageDataArray().get(pid)\n    });\n    while (cache.size > EruStudioStore.RETAINED_PAGE_LIMIT) {\n      const oldest = cache.keys().next().value;\n      if (oldest === undefined) break;\n      cache.delete(oldest);\n    }\n  }\n\n  /**\n   * Read and remove a page's snapshot. Consumed rather than kept so a later\n   * re-init (e.g. a full page def replacing a stub) does not clobber values\n   * the user has changed since the mount.\n   */\n  private takeRetainedPageState(pageId: string): RetainedPageState | undefined {\n    const cache = this.rootStore()._retainedPageState;\n    const snap = cache.get(pageId);\n    if (snap) cache.delete(pageId);\n    return snap;\n  }\n\n  clearRetainedPageState(pageId?: string): void {\n    const cache = this.rootStore()._retainedPageState;\n    if (pageId) cache.delete(pageId);\n    else cache.clear();\n  }\n\n  private _dragState = signal<DragState>({\n    is_dragging: false\n  });\n\n  private _hoveredComponentId = signal<string | null>(null);\n\n  private _viewport = signal<ViewportState>({\n    breakpoint: APP_CONSTANTS.DESIGNER.DEFAULT_BREAKPOINT,\n    zoom: APP_CONSTANTS.DESIGNER.DEFAULT_ZOOM,\n    show_grid: false,\n    show_rulers: false,\n    preview_mode: false\n  });\n\n  private _editMode = signal<boolean>(true);\n\n  private _history = signal<HistoryState>({\n    can_undo: false,\n    can_redo: false,\n    current_step: 0,\n    max_steps: APP_CONSTANTS.DESIGNER.HISTORY_LIMIT\n  });\n\n  private _undoStack: EruPage[] = [];\n  private _redoStack: EruPage[] = [];\n\n  private _ui = signal<UIState>({\n    left_panel_open: true,\n    right_panel_open: true,\n    selected_tab: 'components',\n    property_tab: 'properties',\n    show_welcome: true,\n    loading: false,\n    error: null\n  });\n\n  readonly entities = this._entities.asReadonly();\n  readonly currentPage = this._currentPage.asReadonly();\n  readonly selectedComponent = this._selectedComponent.asReadonly();\n  readonly dragState = this._dragState.asReadonly();\n  readonly viewport = this._viewport.asReadonly();\n  readonly history = this._history.asReadonly();\n  readonly ui = this._ui.asReadonly();\n  readonly editMode = this._editMode.asReadonly();\n  readonly hoveredComponentId = this._hoveredComponentId.asReadonly();\n  readonly componentEventEmitted = this._componentEventEmitted.asReadonly();\n  readonly pageData = computed(() => Array.from(this._pageData().entries()).map(([key, value]) => ({ key, value })));\n  readonly pageDataArray = computed(() => Array.from(this._pageDataArray().entries()).map(([key, value]) => ({ key, value })));\n  /**\n   * The most recent field write to a page record, for views holding the same\n   * record to apply. Carries a `seq` so two writes of the same value to the\n   * same field are still two distinct notifications.\n   */\n  readonly recordFieldPatch = this._recordFieldPatch.asReadonly();\n  readonly queryData = this._queryData.asReadonly();\n\n  /** @deprecated Use computedPageState instead. Will be removed in a future version. */\n  readonly derivedValues = computed(() => {\n    const pageDataArray = this._pageDataArray();\n    let totalCount = 0;\n    for (const arr of pageDataArray.values()) {\n      totalCount += arr.length;\n    }\n    return {\n      page_data_array_count: totalCount\n    } as Record<string, any>;\n  });\n  readonly fieldVisibilityOverrides = this._fieldVisibilityOverrides.asReadonly();\n  readonly componentLoadingStates = this._componentLoadingStates.asReadonly();\n  readonly componentVisibilityOverrides = this._componentVisibilityOverrides.asReadonly();\n  readonly fieldDisabledOverrides = this._fieldDisabledOverrides.asReadonly();\n  readonly componentPropertyOverrides = this._componentPropertyOverrides.asReadonly();\n  readonly componentActions = this._componentActions.asReadonly();\n  readonly componentDisabledStates = this._componentDisabledStates.asReadonly();\n  readonly sidePanelOpenStates = this._sidePanelOpenStates.asReadonly();\n  readonly clipboard = this._clipboard.asReadonly();\n  readonly dynamicDataRequests = this._dynamicDataRequests.asReadonly();\n\n  /**\n   * Own responses merged with the parent's, so a component inside a nested\n   * canvas reads the answer to a relayed request from its own store — which is\n   * the only store it knows about.\n   */\n  readonly dynamicDataResponses: Signal<Map<string, any>> = computed<Map<string, any>>(() => {\n    const own: Map<string, any> = this._dynamicDataResponses();\n    const parent = this._parentStore();\n    if (!parent) return own;\n    // Explicitly typed: the store references its own member type through the\n    // parent, which TypeScript cannot infer without the annotation.\n    const fromParent: Map<string, any> = parent.dynamicDataResponses();\n    if (fromParent.size === 0) return own;\n    const merged: Map<string, any> = new Map(fromParent);\n    for (const [id, value] of own) merged.set(id, value);\n    return merged;\n  });\n  /**\n   * Own pending data merged with the parent's, for the same reason\n   * `dynamicDataResponses` merges: a relayed request is answered on the ROOT\n   * store — the one the host watches — and `removeDynamicDataRequest` parks it\n   * in that store's pendingData. A grid inside a nested canvas matches its\n   * request out of pendingData, so without the merge it never sees the answer\n   * and renders empty.\n   */\n  readonly pendingData: Signal<Map<string, DynamicDataRequest>> = computed<Map<string, DynamicDataRequest>>(() => {\n    const own: Map<string, DynamicDataRequest> = this._pendingData();\n    const parent = this._parentStore();\n    if (!parent) return own;\n    const fromParent: Map<string, DynamicDataRequest> = parent.pendingData();\n    if (fromParent.size === 0) return own;\n    const merged: Map<string, DynamicDataRequest> = new Map(fromParent);\n    for (const [id, value] of own) merged.set(id, value);\n    return merged;\n  });\n  readonly pageState = this._pageState.asReadonly();\n\n  /**\n   * One `@token` inside a state variable's `expr` formula.\n   *\n   * A flat lookup on the state map, which is what this was, could only see a\n   * whole variable: `@selected_fi.entity_data._in` found no key of that literal\n   * name, fell to the `?? 0` default, and the derived variable sat at 0 while\n   * looking correctly configured. Dotted paths now walk (parsing a JSON-string\n   * segment on the way, so a variable holding stringified JSON resolves too),\n   * and the `state.` / `page.` / `app.` prefixes are accepted so an expression\n   * reads the same here as it does anywhere else.\n   *\n   * Deliberately NOT LogicEvaluatorService: that reads computedPageState(), and\n   * this IS computedPageState — going through it would recurse. App state and\n   * page data are separate signals, so reading those here is safe.\n   */\n  // Formula diagnostics are emitted at most once per variable+token. This runs\n  // inside a computed that re-evaluates on every state change, so warning each\n  // time would bury the message in its own repeats.\n  private readonly _warnedFormulaTokens = new Set<string>();\n\n  private warnUnresolvedFormulaToken(stateKey: string, token: string): void {\n    const id = `${stateKey}|${token}`;\n    if (this._warnedFormulaTokens.has(id)) return;\n    this._warnedFormulaTokens.add(id);\n    const scoped = token.startsWith('app.') || token.startsWith('state.') || token.startsWith('page.');\n    const hint = scoped\n      ? 'Check the variable exists and is spelled the same.'\n      : `A bare token reads PAGE state — app state needs @app.${token}, and a field of the page's record needs @page.entity_data.${token}`;\n    console.warn(\n      `eru-studio: state variable \"${stateKey}\" references @${token}, which resolved to nothing and is being read as 0. ${hint}`\n    );\n  }\n\n  private warnFormulaFailed(stateKey: string, expression: string | undefined, error: unknown): void {\n    const id = `${stateKey}|__expr__`;\n    if (this._warnedFormulaTokens.has(id)) return;\n    this._warnedFormulaTokens.add(id);\n    console.warn(\n      `eru-studio: state variable \"${stateKey}\" kept its previous value — its expression could not be evaluated.`,\n      { expression, error }\n    );\n  }\n\n  private resolveFormulaToken(token: string, manualState: Record<string, any>, pageId?: string): any {\n    if (token.startsWith('app.')) return resolveJsonPath(this.appState(), token.substring(4));\n    if (token.startsWith('page.')) {\n      const key = token.substring(5);\n      const data = this.getPageData(pageId) as any;\n      if (data && Object.prototype.hasOwnProperty.call(data, key)) return parseJsonValue(data[key]);\n      return resolveJsonPath(data, key);\n    }\n    const path = token.startsWith('state.') ? token.substring(6) : token;\n    return resolveJsonPath(manualState, path);\n  }\n\n  readonly computedPageState = computed(() => {\n    const pageId = this._currentPage()?.id;\n    if (!pageId) return {} as Record<string, any>;\n    const page = this._currentPage();\n    const pageDataArray = this._pageDataArray();\n    // Prefer this page's own array when populated; otherwise combine ALL\n    // nested-page arrays so formula filters can select the relevant rows.\n    // Picking any single \"first non-empty\" array was order-dependent and led\n    // to wrong counts when multiple nested pages (e.g. bank statements vs\n    // docs) both have data.\n    let arr: PageData[] = pageDataArray.get(pageId) || [];\n    if (arr.length === 0) {\n      arr = [];\n      for (const v of pageDataArray.values()) arr = arr.concat(v);\n    }\n    const manualState = { ...(this._pageState().get(pageId) || {}) };\n\n    for (const stateVar of (page?.state || [])) {\n      if (!stateVar.formula) continue;\n      const f = stateVar.formula;\n      let result: any = manualState[stateVar.key] ?? stateVar.initial ?? null;\n\n      // Where the aggregate reads its rows. The default is the page's own\n      // record array; `source: 'state:<key>'` points it at an array already in\n      // page state, so a set of rows that never was page data — a grid's\n      // checkbox selection, say — can be counted or summed the same way.\n      //\n      // The key may carry a dotted path into the variable\n      // (`state:grid_rows.selection.selected_rows`), because a state variable\n      // fed straight from an event payload holds the whole payload, not the\n      // array inside it. Without this an author had to declare a second\n      // variable purely to relay one nested field.\n      let items: any[] | null = null;\n      if (f.source === 'pageDataArray' || !f.source) {\n        items = arr.map(d => ({ ...d, ...d.entity_data }));\n      } else if (typeof f.source === 'string' && f.source.startsWith('state:')) {\n        const segments = f.source.slice('state:'.length).split('.').map(x => x.trim()).filter(Boolean);\n        let source: any = segments.length ? manualState[segments[0]] : undefined;\n        for (let i = 1; i < segments.length && source != null; i++) {\n          source = typeof source === 'object' ? source[segments[i]] : undefined;\n        }\n        items = Array.isArray(source)\n          ? source.map((d: any) => (d && typeof d === 'object' && d.entity_data ? { ...d, ...d.entity_data } : d))\n          : [];\n      }\n\n      if (items) {\n        const matchesFilter = (item: any, filter: StateFilter): boolean => {\n          const val = item[filter.field];\n          if (filter.equals !== undefined && String(val) !== String(filter.equals)) return false;\n          if (filter.not_empty) {\n            if (val === undefined || val === null || val === '' || (Array.isArray(val) && val.length === 0)) return false;\n          }\n          if (filter.in && !filter.in.includes(val)) return false;\n          if (filter.not_in && filter.not_in.includes(val)) return false;\n          return true;\n        };\n        const applyFilters = (items: any[]): any[] => {\n          if (!f.filter) return items;\n          const filters = Array.isArray(f.filter) ? f.filter : [f.filter];\n          return items.filter(item => filters.every(fl => matchesFilter(item, fl)));\n        };\n        switch (f.fn) {\n          case 'count':\n            result = f.filter ? applyFilters(items).length : items.length;\n            break;\n          case 'sum': {\n            const filtered = applyFilters(items);\n            result = f.field ? filtered.reduce((acc, item) => acc + (parseFloat(item[f.field!]) || 0), 0) : 0;\n            break;\n          }\n          case 'avg': {\n            const filtered = applyFilters(items);\n            result = f.field && filtered.length > 0\n              ? filtered.reduce((acc, item) => acc + (parseFloat(item[f.field!]) || 0), 0) / filtered.length\n              : 0;\n            break;\n          }\n          case 'min': {\n            const filtered = applyFilters(items);\n            result = f.field && filtered.length > 0 ? Math.min(...filtered.map(item => parseFloat(item[f.field!]) || 0)) : 0;\n            break;\n          }\n          case 'max': {\n            const filtered = applyFilters(items);\n            result = f.field && filtered.length > 0 ? Math.max(...filtered.map(item => parseFloat(item[f.field!]) || 0)) : 0;\n            break;\n          }\n          case 'expr':\n            if (f.value) {\n              try {\n                // Date anchors first (@current_date - 7, @first_day). They are\n                // resolved to a quoted ISO date, which the Function() below\n                // simply returns. Without this the '@' survived into the\n                // generated JS, threw a SyntaxError, and the catch below\n                // silently left the variable on its initial — so a date\n                // expression looked like it did nothing at all.\n                //\n                // Resolved here rather than through LogicEvaluatorService:\n                // that service reads computedPageState() for '@state.x', and\n                // this IS computedPageState, so calling it would recurse.\n                //\n                // Tokens are passed as ARGUMENTS, not spliced in as text. Text\n                // substitution can only carry a number — which is why `@entities`\n                // (an array) and a string-valued variable both used to end up as\n                // invalid JS and fall back to the initial value.\n                let expr = LogicEvaluatorService.resolveDateKeywords(f.value);\n                const args: Record<string, any> = {};\n                expr = expr.replace(/@([a-zA-Z0-9_.]+)/g, (_m, token: string) => {\n                  const argKey = 'var_' + token.replace(/[.-]/g, '_');\n                  // Entity metadata is not page state, so reading it here is\n                  // free of the recursion above; the signal read also makes the\n                  // variable recompute once the host hands the metadata over.\n                  const resolved = token === 'entities'\n                    ? this._entities()\n                    : this.resolveFormulaToken(token, manualState, pageId);\n                  // A token that resolves to nothing becomes 0 below, which is\n                  // protective for arithmetic and a trap for everything else:\n                  // the formula still produces a well-formed answer, just with\n                  // zeros where the values should be, so nothing looks broken.\n                  // Say so once, naming the token.\n                  if (resolved === undefined) this.warnUnresolvedFormulaToken(stateVar.key, token);\n                  args[argKey] = resolved ?? 0;\n                  return argKey;\n                });\n                result = new Function(\n                  ...Object.keys(args),\n                  `\"use strict\"; return (${expr});`\n                )(...Object.values(args));\n              } catch (error) {\n                // Keep the previous value, but do not swallow the reason: a\n                // stray quote here reads as \"the formula does nothing at all\".\n                this.warnFormulaFailed(stateVar.key, f.value, error);\n              }\n            }\n            break;\n        }\n      }\n      manualState[stateVar.key] = result;\n    }\n    // System runtime context (org_id, process_id, process_name, org_process_id)\n    // is always present and authoritative — overrides any same-named manual\n    // state.\n    return { ...manualState, ...this.runtimeContext() };\n  });\n\n  /**\n   * Returns the computed page state for any pageId. For the current outer page\n   * this delegates to `computedPageState()` (which applies formulas). For nested\n   * pages — whose page def is not held in the global store — returns the manual\n   * pageState map keyed by `pageId`. Used by logic-evaluator for `@state.X`\n   * lookups so that nested components see their own page's state, not the outer.\n   */\n  getComputedPageStateFor(pageId: string, dataKey?: string): Record<string, any> {\n    if (!pageId) return {};\n    const currentPageId = this._currentPage()?.id;\n    const base = (pageId === currentPageId)\n      ? this.computedPageState()\n      : { ...(this._pageState().get(pageId) || {}), ...this.linkedParentState(pageId), ...this.runtimeContext() };\n    if (!dataKey) return base;\n    const overlay = this._pageInstanceState().get(pageId)?.get(dataKey);\n    if (!overlay) return base;\n    return { ...base, ...overlay };\n  }\n\n  // Parent/child state linking: a nested page declares its own state variable\n  // (so it stays designable standalone), and when it is hosted inside a page\n  // that has a state variable with the SAME name, the two are linked — the\n  // hosting page's value wins on reads and nested writes redirect to the\n  // hosting page (see setPageStateValue). A key is linked only when it exists\n  // on BOTH pages, so unshared nested state is untouched.\n  private linkedParentState(nestedPageId: string): Record<string, any> {\n    const currentPageId = this._currentPage()?.id;\n    if (!currentPageId || nestedPageId === currentPageId) return {};\n    const own = this._pageState().get(nestedPageId);\n    if (!own) return {};\n    const parent = this.computedPageState();\n    const linked: Record<string, any> = {};\n    for (const key of Object.keys(own)) {\n      if (key in parent) linked[key] = parent[key];\n    }\n    return linked;\n  }\n\n  private isStateKeyLinkedToParent(nestedPageId: string, key: string): boolean {\n    const currentPageId = this._currentPage()?.id;\n    if (!currentPageId || !nestedPageId || nestedPageId === currentPageId) return false;\n    const own = this._pageState().get(nestedPageId);\n    if (!own || !(key in own)) return false;\n    return key in (this._pageState().get(currentPageId) || {});\n  }\n\n  private _agentStagingComponents = signal<EruComponent[] | null>(null);\n  readonly agentStagingActive = computed(() => this._agentStagingComponents() !== null);\n\n  readonly currentPageComponents = computed(() => {\n    const staging = this._agentStagingComponents();\n    if (staging) return staging;\n    const page = this._currentPage();\n    return page?.components ?? [];\n  });\n\n  readonly selectedComponentProperties = computed(() => {\n    const component = this._selectedComponent();\n    return component?.properties ?? {};\n  });\n\n  readonly isDesignerReady = computed(() => {\n    return this._currentPage() !== null;\n  });\n\n  readonly nestedEntities = computed(() => {\n    return this.entities().filter(e => e.nested === true);\n  });\n\n  readonly childEntitiesMap = computed(() => {\n    const entities = this.entities();\n    const result = new Map<string, Entity[]>();\n    for (const parent of entities) {\n      const parentName = parent.name;\n      if (!parentName) continue;\n      const children: Entity[] = [];\n      for (const candidate of entities) {\n        if (candidate.name === parentName) continue;\n        const fields = candidate.fields ?? [];\n        if (fields.some((f: EntityField) => f?.entity_name === parentName)) {\n          children.push(candidate);\n        }\n      }\n      result.set(parentName, children);\n    }\n    return result;\n  });\n\n  readonly page = {\n    current_page: this._currentPage.asReadonly(),\n    current_page_components: computed(() => this._currentPage()?.components ?? []),\n    selected_component: this._selectedComponent.asReadonly(),\n    current_breakpoint: computed(() => this._viewport().breakpoint)\n  };\n\n  constructor() {\n    this.hydrateAppState();\n\n    // Seed a standalone page's data from the state variable it declares.\n    // This is the page-level counterpart of the page_ref `data_source: 'state'`\n    // mapping, for pages reached by navigate-to-page / deep link / viewer.\n    //\n    // Only the page currently being rendered by this store is considered: a\n    // page_ref renders its target under its own page id, so the mount point\n    // stays in charge. The page_ref applies this same declaration itself when\n    // it has no state source of its own (see PageComponent's state effect).\n    effect(() => {\n      const page = this._currentPage();\n      if (!page || page.data_source !== 'state') return;\n      const field = (page.state_field || '').trim();\n      if (!field) return;\n\n      const scope = page.state_scope || 'page';\n      const source = scope === 'app' ? this.appState() : this.computedPageState();\n      let value = source?.[field];\n\n      const path = (page.state_result_path || '').trim();\n      if (path) value = this.resolveStatePath(value, path);\n\n      // Re-apply only on a real change: the page's own on_load events can write\n      // state, which would otherwise re-enter this effect and spin.\n      let fingerprint: string;\n      try {\n        fingerprint = JSON.stringify({ id: page.id, scope, field, path, value });\n      } catch {\n        fingerprint = `${page.id}|${scope}|${field}|${path}|${String(value)}`;\n      }\n      if (fingerprint === this._pageDataSourceKey) return;\n      this._pageDataSourceKey = fingerprint;\n\n      untracked(() => {\n        const record = this.normalizeStateRecord(value);\n        this.setPageData({ entity_id: record.entity_id, entity_data: record.entity_data } as any, page.id);\n        // Applied, even when the source resolved to nothing — the gate below\n        // asks \"has the record source been settled\", not \"is there a record\",\n        // or a page whose source is legitimately empty would never load.\n        this._pageRecordSourceApplied.set(page.id);\n      });\n    });\n\n    effect(() => {\n      const page = this._currentPage();\n      if (!page) return;\n      const sysKeys = EruStudioStore.SYSTEM_STATE_KEYS;\n      const stateVars = [\n        ...sysKeys.map(k => ({ label: `${k} (system)`, value: k })),\n        ...(page.state || []).map(sv => ({ label: sv.key, value: sv.key })),\n      ];\n      const stateOpts = [\n        ...sysKeys.map(k => ({ label: `${k} (system)`, value: `state:${k}` })),\n        ...(page.state || []).map(sv => ({ label: `${sv.key} (state)`, value: `state:${sv.key}` })),\n      ];\n      // App state has no declared schema, so only keys already written this\n      // session can be listed. The panel's payload picker takes free text for\n      // the rest — `resolveApiPayloadFields` resolves `app:<key>` either way.\n      const appOpts = Object.keys(this.appState() || {}).sort()\n        .map(k => ({ label: `${k} (app state)`, value: `app:${k}` }));\n      const pageOpts: { label: string; value: string }[] = [{ label: 'entity_id (page)', value: 'page:entity_id' }];\n      if (page.entity_name) {\n        const fields = this.getEntityFields(page.entity_name) || [];\n        for (const f of fields) {\n          if (f.name) pageOpts.push({ label: `${f.label || f.name} (page data)`, value: `page:entity_data.${f.name}` });\n        }\n      }\n      // The page's own controls, which is the only source a page NOT bound to an\n      // entity has. A dashboard composed of filters and controls over several\n      // entities still writes each control's value to page data under its\n      // `name`, so those keys exist and are addressable — there was simply no\n      // entity field list to enumerate them from, and the picker offered nothing\n      // but state. Listed by component name, deduped against the entity fields\n      // above (which win, for their nicer label).\n      for (const comp of this.flattenComponentTree(page.components || [])) {\n        const name = comp.properties?.['base']?.['name'];\n        if (typeof name !== 'string' || !name) continue;\n        const label = comp.properties?.['base']?.['label'];\n        pageOpts.push({\n          label: `${label || name} (page data)`,\n          value: `page:entity_data.${name}`,\n        });\n      }\n      // Anything already IN page data that neither source named — values written\n      // by a query result or an action rather than declared by a control.\n      //\n      // Read untracked deliberately: page data changes on every keystroke in a\n      // bound control, and tracking it here would rebuild both option lists on\n      // each one. The declared sources above are what the designer actually\n      // needs; this is a bonus, refreshed whenever the effect re-runs for a\n      // reason of its own.\n      const currentPageData = untracked(() => this._pageData().get(page.id)?.entity_data);\n      if (currentPageData && typeof currentPageData === 'object' && !Array.isArray(currentPageData)) {\n        for (const k of Object.keys(currentPageData)) {\n          pageOpts.push({ label: `${k} (page data)`, value: `page:entity_data.${k}` });\n        }\n      }\n      // Dedupe by value (keep first): a page state var can share a name with a\n      // system key (e.g. org_id/process_id), which would otherwise list the same\n      // option twice and trip NG0955 duplicate-track-key warnings in the panel.\n      const dedupeByValue = <T extends { value: string }>(opts: T[]): T[] => {\n        const seen = new Set<string>();\n        return opts.filter(o => (seen.has(o.value) ? false : (seen.add(o.value), true)));\n      };\n      untracked(() => {\n        this.setDynamicData('ds_page_state_vars', dedupeByValue(stateVars));\n        this.setDynamicData('ds_page_ref_payload_fields', dedupeByValue([...stateOpts, ...pageOpts, ...appOpts]));\n      });\n    });\n\n    // App state keys, for pickers that target the shared app scope. App state\n    // has no declared schema — the keys are whatever `update-state` wrote — so\n    // this tracks the live map and the pickers that use it accept free text\n    // for a key that has not been written yet.\n    effect(() => {\n      const keys = Object.keys(this.appState() || {}).sort();\n      untracked(() => {\n        this.setDynamicData('ds_app_state_vars', keys.map(k => ({ label: k, value: k })));\n      });\n    });\n  }\n\n  setQueryData(key: string, value: any): void {\n    this._queryData.update(data => {\n      const newData = new Map(data);\n      newData.set(key, value);\n      return newData;\n    });\n  }\n\n  getQueryData(key: string): any {\n    return this._queryData().get(key);\n  }\n\n  getPageData(pageId?: string): PageData | null {\n    const id = pageId || this._currentPage()?.id;\n    if (!id) return null;\n    return this._pageData().get(id) || null;\n  }\n\n  // Resolve the record ({entity_id, entity_data}) a component is bound to,\n  // accounting for looped nested pages: for `array` nesting the dataKey is a\n  // pure row index into the page's data array; for `nested_array` it is\n  // `<entityName>.<index>` and the rows live inside the page record's\n  // entity_data[entityName]; for `object`/no dataKey it is the page record.\n  getPageRecord(pageId?: string, dataKey?: string): PageData | null {\n    const id = pageId || this._currentPage()?.id;\n    if (!id) return null;\n    if (dataKey) {\n      // array nesting: \"0\", \"1\", ...\n      if (/^\\d+$/.test(dataKey)) {\n        const arr = this.getPageDataArray(id);\n        if (arr && arr[+dataKey]) return arr[+dataKey] as PageData;\n      } else if (dataKey.includes('.')) {\n        // nested_array: \"<entityName>.<index>\", optionally prefixed with the\n        // hosting page_ref's own row (\"0.<entityName>.<index>\") when that\n        // page_ref is itself inside a looped record card.\n        const parts = dataKey.split('.');\n        const idx = parseInt(parts[parts.length - 1], 10);\n        let rest = parts.slice(0, -1);\n        let record: PageData | null = this.getPageData(id);\n        if (rest.length > 1 && /^\\d+$/.test(rest[0])) {\n          record = this.getPageDataArray(id)?.[+rest[0]] as PageData ?? null;\n          rest = rest.slice(1);\n        }\n        const entityName = rest.join('.');\n        const arr = record?.entity_data?.[entityName];\n        if (Array.isArray(arr) && arr[idx] != null) {\n          const rec = arr[idx];\n          return (rec && typeof rec === 'object' && 'entity_data' in rec)\n            ? rec as PageData\n            : { entity_id: rec?.entity_id ?? rec?.id ?? '', entity_data: rec } as PageData;\n        }\n      }\n    }\n    return this.getPageData(id);\n  }\n\n  readonly getPages = computed(() => Object.fromEntries(this._pageData()));\n\n  getPageFieldData(fieldName: string, pageId?: string): any {\n    const data = this.getPageData(pageId);\n    // An index-prefixed name (\"0.fa\") addresses a ROW — that prefix is the\n    // dataKey an array-nested page_ref gives its looped components. Resolve it\n    // from the row array whether or not the page ALSO carries a single record.\n    //\n    // Two page_refs can target the same nested page: an object-scoped side\n    // panel and an array-scoped one. The object one writes page data for that\n    // page id, which made `data` truthy, and the row lookup below — reachable\n    // only when there is no record — was skipped. The read then became\n    // `entity_data[\"0\"]` on the object ref's record, so every looped field came\n    // back undefined and the panel rendered its labels with no values at all.\n    const dot = fieldName.indexOf('.');\n    if (dot > 0 && /^\\d+$/.test(fieldName.slice(0, dot))) {\n      const row = this.getPageDataArray(pageId)?.[parseInt(fieldName.slice(0, dot), 10)];\n      if (row) {\n        const rest = fieldName.slice(dot + 1);\n        return JsonUtil.getNestedValue(row.entity_data, rest) ?? (row as any)?.[rest];\n      }\n    }\n    if (!data) {\n      if (fieldName.includes('.')) {\n        const index = fieldName.split('.')[0];\n        const fn = fieldName.split('.')[1];\n        const pd = this.getPageDataArray(pageId)[parseInt(index)];\n        return pd?.entity_data[fn] ?? (pd as any)?.[fn];\n      }\n      const records = this.getPageDataArray(pageId);\n      // No record and no rows means the field simply has no value. Returning the\n      // empty array instead read as \"a value is present\" to every caller that\n      // guards on undefined/null — which is why a field on a page carrying no\n      // page data (a filter panel, say) never seeded from its default.\n      if (records.length === 0) return undefined;\n      return records.map((d) => d.entity_data);\n    }\n    if (fieldName.includes('.')) {\n      return JsonUtil.getNestedValue(data.entity_data, fieldName);\n    }\n    return data.entity_data[fieldName];\n  }\n\n  setEntities(entities: Entity[]): void {\n    this._entities.set(entities);\n    this._entitiesLoaded.set(true);\n  }\n\n  /**\n   * Whether the host has handed over the process's entity metadata yet.\n   *\n   * A condition on `@entity.*` cannot be answered before this flips, and\n   * answering it anyway reads every attribute as undefined — which hides the\n   * very components the condition was meant to reveal. Consumers show a ghost\n   * for that window instead of committing to an answer.\n   */\n  private _entitiesLoaded = signal(false);\n  readonly entitiesLoaded = this._entitiesLoaded.asReadonly();\n\n  /** One entity's metadata by name, for `@entity.*` / `@entities.<name>.*`. */\n  getEntity(entityName: string): Entity | null {\n    if (!entityName) return null;\n    return this.entities().find(e => e.name === entityName) ?? null;\n  }\n\n  getEntities(): Entity[] {\n    return this._entities();\n  }\n\n  getEntityFields(entityName: string): EntityField[] {\n    const entities = this.entities();\n    const entity = entities.find(e => e.name === entityName);\n    return entity?.fields ?? [];\n  }\n\n  getEntityField(fieldName: string, entityName: string = ''): EntityField | null {\n    const entities = this.entities();\n    if (!entityName || entityName === '') {\n      entityName = this._currentPage()?.entity_name || '';\n    }\n    const entity = entities.find(e => e.name === entityName);\n    return entity?.fields?.find(f => f.name === fieldName) ?? null;\n  }\n\n  // Entity names of NESTED pages rendered on this store (page_ref mounts).\n  // Components inside a nested page carry that page's id; without this\n  // registry their entity-field binding would wrongly resolve against the\n  // OUTER page's entity (e.g. a select in a side-panel form falling back to\n  // stale static options instead of the data model's).\n  private _pageEntityNames = signal<Map<string, string>>(new Map());\n  registerPageEntityName(pageId: string, entityName: string): void {\n    if (!pageId) return;\n    this._pageEntityNames.update(m => {\n      if (m.get(pageId) === entityName) return m;\n      const next = new Map(m);\n      next.set(pageId, entityName || '');\n      return next;\n    });\n  }\n  getPageEntityName(pageId: string): string {\n    if (!pageId) return '';\n    if (pageId === this._currentPage()?.id) return this._currentPage()?.entity_name || '';\n    return this._pageEntityNames().get(pageId) || '';\n  }\n\n  // Nested page component trees, registered by page_ref when its def\n  // resolves. Nested children are stripped from the persisted outer tree\n  // (see normalizeComponents), so findComponentById/findParentComponent\n  // cannot see side-panel/overlay components without this registry — which\n  // visibility-aware validation needs to resolve them.\n  private _nestedPageComponents = signal<Map<string, EruComponent[]>>(new Map());\n  registerNestedPageComponents(pageId: string, components: any): void {\n    if (!pageId) return;\n    const normalized = this.normalizeComponents(components);\n    this._nestedPageComponents.update(m => {\n      const next = new Map(m);\n      next.set(pageId, normalized);\n      return next;\n    });\n  }\n\n  getChildEntities(parentEntityName: string): Entity[] {\n    const map = this.childEntitiesMap();\n    return map.get(parentEntityName) ?? [];\n  }\n\n  /** Guards the page-level data-source effect against re-entrant re-apply. */\n  private _pageDataSourceKey = '';\n\n  /**\n   * The page whose declared record source has been applied to page data.\n   *\n   * `on_load` events send the page's record as their payload, so firing them\n   * before the record lands sends `entity_id: ''` and a query filtered on it\n   * comes back empty. That is invisible in the page viewer — the host seeds the\n   * record as it mounts the page — but a page mounted in a `nav_outlet` gets\n   * its record from this store's own state effect, which lands a tick later, so\n   * on_load won the race and the page loaded against no record at all.\n   */\n  private _pageRecordSourceApplied = signal<string | null>(null);\n\n  /**\n   * Walk a dotted path into a state value. JSON-string segments are parsed on\n   * the way through and a JSON-looking result is parsed too, matching how\n   * page_ref resolves `state_result_path`. `[n]` and `[*]` work as they do in\n   * `resolvePayloadPath`.\n   */\n  private resolveStatePath(value: any, path: string): any {\n    const parts = EruStudioStore.splitPath(path);\n    let current: any = value;\n    for (let i = 0; i < parts.length; i++) {\n      if (typeof current === 'string') {\n        try { current = JSON.parse(current); } catch { return undefined; }\n      }\n      if (current == null) return undefined;\n      if (parts[i] === '*') {\n        if (!Array.isArray(current)) return undefined;\n        const rest = parts.slice(i + 1).join('.');\n        return current\n          .map(item => (rest ? this.resolveStatePath(item, rest) : item))\n          .filter(v => v !== undefined && v !== null);\n      }\n      current = current[parts[i]];\n    }\n    if (typeof current === 'string') {\n      const s = current.trim();\n      if (s.startsWith('{') || s.startsWith('[')) {\n        try { return JSON.parse(s); } catch { /* keep the string */ }\n      }\n    }\n    return current;\n  }\n\n  /** Split a state value into { entity_id, entity_data }, as page_ref does. */\n  private normalizeStateRecord(value: any): { entity_id: string; entity_data: Record<string, any> } {\n    let v = value;\n    if (typeof v === 'string') {\n      const s = v.trim();\n      if (s.startsWith('{')) { try { v = JSON.parse(s); } catch { /* not json */ } }\n    }\n    if (v && typeof v === 'object' && !Array.isArray(v)) {\n      if ('entity_data' in v) {\n        return { entity_id: (v as any).entity_id ?? '', entity_data: (v as any).entity_data ?? {} };\n      }\n      return { entity_id: (v as any).entity_id ?? '', entity_data: v as Record<string, any> };\n    }\n    return { entity_id: '', entity_data: {} };\n  }\n\n  setPageData(pageData: PageData, pageId?: string): void {\n    const id = pageId || this._currentPage()?.id;\n    if (!id) return;\n    this._pageData.update(current => {\n      const next = new Map(current);\n      next.set(id, pageData);\n      return next;\n    });\n  }\n\n  /**\n   * Give a page its record identity — the `set-page-data` action.\n   *\n   * A page-scoped save/fetch/delete sends `getPageData(pageId)` as its payload,\n   * so a page whose selected record was only mirrored into a state variable\n   * saves with a blank `entity_id` and the host writes a NEW row instead of\n   * editing the selected one. Rather than mapping an id into every control's\n   * save subscription (value-change subscriptions are per control), this writes\n   * the identity once onto the page and every downstream action reads it.\n   *\n   * Source is `record_source`: 'event' (default) is the record the event itself\n   * carries — a grid row select hands over the selected row — while\n   * 'state'/'app_state' read the variable named by `state_key`. `record_path`\n   * drills into whichever one is chosen.\n   *\n   * A resolved object is taken as the whole record ({entity_id, entity_data} or\n   * a flat record with an `entity_id`/`id`); a scalar is taken as the id alone\n   * and leaves the existing `entity_data` in place, which is the shape a state\n   * variable like `program_id` holds.\n   */\n  /**\n   * Carry page-local field values across a record swap.\n   *\n   * Selecting a grid row replaces the page's RECORD. But a control that is not\n   * a field of that record — a search box, a filter toggle — keeps its value in\n   * the same `entity_data` bag, and a wholesale replace silently dropped it.\n   * The control then re-synced itself to blank, which the value-change path\n   * announced as a user edit, so a search box wiped its own state variable on\n   * every keystroke and the search could never be typed.\n   *\n   * Only keys that the incoming record does not define AND that are not fields\n   * of the page's entity are carried over. A genuine record field the new row\n   * leaves unset must still read as absent, or the previous row's value would\n   * leak into the one now on screen.\n   */\n  private withPageLocalFields(pageId: string, currentData: any, incoming: any): any {\n    const next: Record<string, any> = { ...(incoming || {}) };\n    const current = currentData && typeof currentData === 'object' ? currentData : null;\n    if (!current) return next;\n    const entityName = this.getPageEntityName(pageId) || '';\n    const recordFields = new Set(\n      (entityName ? this.getEntityFields(entityName) : [])\n        .map((f: any) => f?.name)\n        .filter((n: any) => !!n)\n    );\n    for (const [key, value] of Object.entries(current)) {\n      if (key in next) continue;\n      if (recordFields.has(key)) continue;\n      next[key] = value;\n    }\n    return next;\n  }\n\n  /**\n   * `download-file`: pull a base64 file out of an API response, state or page\n   * data and save it through the browser.\n   *\n   * `response` is the natural source — the action hangs off an API's On\n   * Success and the file came back as a JSON attribute. On an event with no\n   * response behind it (a button click, a page signal) that same source reads\n   * the event payload, so a file already in the payload needs no extra hop\n   * through state.\n   */\n  downloadFileFromAction(sub: ComponentEventSubscription, pageId?: string, response?: any, dataKey?: string): void {\n    const id = pageId || this._currentPage()?.id || '';\n    const source = sub.file_source ?? 'response';\n    const root = source === 'app_state'\n      ? this.appState()\n      : source === 'state'\n        ? (id ? this.getComputedPageStateFor(id, dataKey) : this.computedPageState())\n        : source === 'page_data'\n          ? this.getPageData(id)\n          : response;\n\n    const read = (path?: string): any => {\n      const p = String(path ?? '').trim();\n      if (!p) return undefined;\n      return this.resolvePayloadPath(root, p);\n    };\n\n    const raw = read(sub.file_path);\n    const content = (raw === null || raw === undefined) ? '' : String(raw);\n    if (!content.trim()) {\n      console.warn('eru-studio: download-file found no content at', sub.file_source ?? 'response', sub.file_path);\n      return;\n    }\n    // A path wins over the static value: the response saying what it sent is\n    // more specific than what the author could know when configuring.\n    const typeFromPath = read(sub.file_type_path);\n    const nameFromPath = read(sub.file_name_path);\n    const fileType = (typeFromPath === null || typeFromPath === undefined || typeFromPath === '')\n      ? sub.file_type : String(typeFromPath);\n    const fileName = (nameFromPath === null || nameFromPath === undefined || nameFromPath === '')\n      ? sub.file_name : String(nameFromPath);\n\n    if (!downloadBase64File(content, fileName, fileType)) {\n      console.warn('eru-studio: download-file could not decode the value at', sub.file_path);\n    }\n  }\n\n  applyPageRecordSource(sub: ComponentEventSubscription, pageId?: string, fallbackRecord?: any): void {\n    const id = pageId || this._currentPage()?.id;\n    if (!id) return;\n    // Default to 'event', which is what the panel shows when `record_source` is\n    // absent. Inferring 'state' from a leftover `state_key` instead made the\n    // action read a page variable the author never pointed it at — a key left\n    // behind by the action they switched away from (update-state writes\n    // `state_key`/`state_formula`) silently redirected the source, and the\n    // record the event carried was dropped. `set-page-data` and `record_source`\n    // shipped together, so no saved page relies on the inference.\n    const source = sub.record_source ?? 'event';\n    let raw = source === 'app_state'\n      ? (sub.state_key ? this.appState()?.[sub.state_key] : undefined)\n      : source === 'state'\n        ? (sub.state_key ? this.getComputedPageStateFor(id)?.[sub.state_key] : undefined)\n        : fallbackRecord;\n    const path = String(sub.record_path ?? '').trim();\n    if (path) {\n      raw = source === 'event' ? this.resolvePayloadPath(raw, path) : this.resolveStatePath(raw, path);\n    }\n    if (raw === null || raw === undefined || raw === '') return;\n    // A one-row result set is a record — the shape a detail page's query answers\n    // with. A SQL query returns [{ Results: [row] }], so the path an author\n    // writes lands on the rows array, not the row; normalizeStateRecord reads an\n    // array as \"no record\" and the page's fields were blanked instead of filled.\n    if (Array.isArray(raw)) {\n      if (raw.length === 0) return;\n      raw = raw[0];\n      if (raw === null || raw === undefined || raw === '') return;\n    }\n    const current = this.getPageData(id) || { entity_id: '', entity_data: {} };\n    if (typeof raw === 'object' || (typeof raw === 'string' && raw.trim().startsWith('{'))) {\n      const record = this.normalizeStateRecord(raw);\n      // Nothing resolvable: leave the page's record alone rather than wiping it.\n      // Clearing is what `clear-page-data` is for, and a path that misses (a\n      // renamed result key, an empty response) should not take the record with\n      // it.\n      if (!record.entity_id && Object.keys(record.entity_data).length === 0) return;\n      this.setPageData({\n        entity_id: record.entity_id || current.entity_id || '',\n        entity_data: this.withPageLocalFields(id, current.entity_data, record.entity_data)\n      } as any, id);\n      return;\n    }\n    this.setPageData({ entity_id: String(raw), entity_data: current.entity_data || {} } as any, id);\n  }\n\n  clearPageData(pageId?: string): void {\n    const id = pageId || this._currentPage()?.id;\n    if (!id) return;\n    // The page-level data source memoises what it last applied; wiping the data\n    // it produced must also drop that memo, or re-entering the page with the\n    // same value would be treated as \"already applied\" and leave it blank.\n    this._pageDataSourceKey = '';\n    this._pageRecordSourceApplied.set(null);\n    if (untracked(() => this._pageData().has(id))) {\n      this._pageData.update(current => {\n        const next = new Map(current);\n        next.set(id, { entity_id: '', entity_data: {} });\n        return next;\n      });\n    }\n    if (untracked(() => this._pageDataArray().has(id))) {\n      this._pageDataArray.update(current => {\n        const next = new Map(current);\n        next.set(id, []);\n        return next;\n      });\n    }\n    if (untracked(() => this._pageInstanceState().has(id))) {\n      this._pageInstanceState.update(current => {\n        const next = new Map(current);\n        next.delete(id);\n        return next;\n      });\n    }\n  }\n\n  /**\n   * Reset all page data and state across the entire store. Used when the user\n   * switches to a different upstream entity (e.g. fetches a new company on\n   * step 1) and every nested page's grid/state needs to start fresh.\n   *\n   * Clears: pageData entity_data for every page, pageDataArray for every page,\n   * per-instance state overlays, page-level state (re-seeded from initials),\n   * field/component visibility & disabled overrides, and component loading\n   * states. Does NOT touch the current page def itself.\n   */\n  clearAllPageData(): void {\n    const currentId = this._currentPage()?.id;\n    this._pageDataSourceKey = '';\n    this._pageRecordSourceApplied.set(null);\n    // Preserve the outer/current page's pageData (it holds inputs the next\n    // fetch needs, e.g. the PAN/CIN about to be looked up). Reset every other\n    // page's pageData, all pageDataArray entries, and all instance state.\n    this._pageData.update(current => {\n      const next = new Map<string, PageData>();\n      current.forEach((value, id) => {\n        if (id === currentId) next.set(id, value);\n        else next.set(id, { entity_id: '', entity_data: {} });\n      });\n      return next;\n    });\n    this._pageDataArray.update(current => {\n      const next = new Map<string, PageData[]>();\n      current.forEach((_, id) => next.set(id, []));\n      return next;\n    });\n    this._pageInstanceState.set(new Map());\n    // Reset page-level state to initials snapshot for non-current pages;\n    // current page state usually carries UI-driven values the user expects\n    // to persist across the fetch (e.g. fetch_attempted, error fields).\n    this._pageState.update(current => {\n      const next = new Map<string, Record<string, any>>();\n      current.forEach((value, id) => {\n        if (id === currentId) {\n          next.set(id, value);\n        } else {\n          const initials = this._pageStateInitials().get(id);\n          next.set(id, { ...(initials || {}) });\n        }\n      });\n      return next;\n    });\n    this.clearRuntimeOverrides();\n\n    // Tell every grid in the page (whether currently mounted or not) to\n    // refresh. eru-grid keeps its groups/rows in its own gridStore, which\n    // is opaque to this studio store. The 'refresh' action is queued in\n    // componentActions and consumed when the grid (re)mounts and its effect\n    // runs — so a grid living inside an unmounted step still refreshes the\n    // moment the user navigates to that step.\n    const collectGridIds = (comps: EruComponent[] | undefined, ids: string[] = []): string[] => {\n      if (!Array.isArray(comps)) return ids;\n      for (const c of comps) {\n        if (c.type === 'grid') ids.push(c.id);\n        if (c.children) collectGridIds(c.children, ids);\n      }\n      return ids;\n    };\n    const gridIds = collectGridIds(this._currentPage()?.components);\n    if (gridIds.length > 0) this.dispatchComponentAction(gridIds, 'refresh');\n  }\n\n  updatePageData(pageData: Partial<PageData>, pageId?: string): void {\n    const id = pageId || untracked(() => this._currentPage()?.id);\n    if (!id) return;\n    // Collected inside the update below, announced after it: the fields whose\n    // value actually moved, and the record they belong to.\n    const patchedFields: Record<string, any> = {};\n    let patchedRecordId = '';\n    if (untracked(() => this._pageData().has(id))) {\n      this._pageData.update(current => {\n        const currentData = current.get(id);\n        if (!currentData) return current;\n\n        let updatedEntityData = { ...currentData.entity_data };\n        let hasChanges = false;\n\n        if (pageData.entity_data) {\n          Object.keys(pageData.entity_data).forEach(key => {\n            const newValue = pageData.entity_data![key];\n            let oldValue;\n\n            if (key.includes('.')) {\n              oldValue = JsonUtil.getNestedValue(updatedEntityData, key);\n              if (oldValue !== newValue) {\n                updatedEntityData = JsonUtil.setNestedValue(updatedEntityData, key, newValue);\n                hasChanges = true;\n              }\n            } else {\n              oldValue = updatedEntityData[key];\n              if (oldValue !== newValue) {\n                updatedEntityData[key] = newValue;\n                hasChanges = true;\n                patchedFields[key] = newValue;\n              }\n            }\n          });\n        }\n\n        if (pageData.entity_id && pageData.entity_id !== currentData.entity_id) {\n          hasChanges = true;\n        }\n\n        if (!hasChanges) return current;\n        const updated = {\n          ...currentData,\n          entity_id: pageData.entity_id || currentData.entity_id,\n          entity_data: updatedEntityData\n        };\n        patchedRecordId = String(updated.entity_id ?? '');\n        const next = new Map(current);\n        next.set(id, updated);\n        return next;\n      });\n    } else if (untracked(() => this._pageDataArray().has(id))) {\n      this._pageDataArray.update(current => {\n        const currentArray = current.get(id);\n        if (!currentArray) return current;\n\n        const nextArray = [...currentArray];\n        let hasChanges = false;\n\n        if (pageData.entity_data) {\n          Object.keys(pageData.entity_data).forEach(key => {\n            if (key.includes('.')) {\n              const parts = key.split('.');\n              const index = parseInt(parts[0]);\n              const remainingKey = parts.slice(1).join('.');\n\n              if (!isNaN(index) && nextArray[index]) {\n                const newValue = pageData.entity_data![key];\n                let oldValue;\n                let itemChanges = false;\n\n                let updatedEntityData = { ...nextArray[index].entity_data };\n                if (remainingKey.includes('.')) {\n                  oldValue = JsonUtil.getNestedValue(updatedEntityData, remainingKey);\n                  if (oldValue !== newValue) {\n                    updatedEntityData = JsonUtil.setNestedValue(updatedEntityData, remainingKey, newValue);\n                    itemChanges = true;\n                  }\n                } else {\n                  oldValue = updatedEntityData[remainingKey];\n                  if (oldValue !== newValue) {\n                    updatedEntityData[remainingKey] = newValue;\n                    itemChanges = true;\n                  }\n                }\n\n                if (pageData.entity_id && pageData.entity_id !== nextArray[index].entity_id) {\n                  itemChanges = true;\n                }\n\n                if (itemChanges) {\n                  nextArray[index] = {\n                    ...nextArray[index],\n                    entity_data: updatedEntityData,\n                    entity_id: pageData.entity_id || nextArray[index].entity_id\n                  };\n                  hasChanges = true;\n                }\n              }\n            }\n          });\n        }\n\n        if (!hasChanges) return current;\n\n        const next = new Map(current);\n        next.set(id, nextArray);\n        return next;\n      });\n    } else {\n      this._pageData.update(current => {\n        const newEntry: PageData = {\n          entity_id: pageData.entity_id || '',\n          entity_data: { ...(pageData.entity_data || {}) }\n        };\n        const next = new Map(current);\n        next.set(id, newEntry);\n        return next;\n      });\n    }\n\n    // Announce the field write so any other view of the SAME record can follow\n    // it — a grid whose row this record was copied from, above all. Emitted\n    // after the write, and only for a record that has an id: a page with no\n    // record identifies nothing to keep in step.\n    if (patchedRecordId && Object.keys(patchedFields).length > 0) {\n      this._recordFieldPatch.set({\n        entity_id: patchedRecordId,\n        fields: patchedFields,\n        seq: ++this._recordFieldPatchSeq\n      });\n    }\n  }\n\n  getPageDataArray(pageId?: string): PageData[] {\n    const id = pageId || this._currentPage()?.id;\n    if (!id) return [];\n    return this._pageDataArray().get(id) || [];\n  }\n\n  readonly getPagesDataArray = computed(() => Object.fromEntries(this._pageDataArray()));\n\n  setPageDataArray(data: PageData[], pageId?: string): void {\n    const id = pageId || this._currentPage()?.id;\n    if (!id) return;\n    this._pageDataArray.update(current => {\n      const next = new Map(current);\n      next.set(id, data);\n      return next;\n    });\n  }\n\n  // ===== SERVER-SIDE VALIDATION NOTICES =====\n  // A field's server-side check produced a message the user should see. Neither\n  // eru-studio nor eru-grid renders a snackbar — both delegate every I/O and\n  // chrome concern to the host app — so this is an enqueue/drain channel like\n  // the dynamic-data requests: the host watches it, shows its own snackbar\n  // (red when status is 'error'), and clears the notice.\n  private readonly _serverValidationNotices = signal<ServerValidationNotice[]>([]);\n  readonly serverValidationNotices = this._serverValidationNotices.asReadonly();\n\n  setServerValidationNotice(notice: ServerValidationNotice): void {\n    // Raised on the ROOT store: the host watches only that one, so a notice\n    // left on a nested canvas's store (a side panel, a nav_outlet page) was\n    // queued where nobody drains it and never reached the screen.\n    const parent = this._parentStore();\n    if (parent) {\n      parent.setServerValidationNotice(notice);\n      return;\n    }\n    this._serverValidationNotices.update(list => [\n      ...list,\n      { ...notice, id: crypto.randomUUID(), timestamp: Date.now() },\n    ]);\n  }\n\n  removeServerValidationNotice(id: string): void {\n    this._serverValidationNotices.update(list => list.filter(n => n.id !== id));\n  }\n\n  /**\n   * Dynamic-data requests made on a nested canvas are relayed to the parent\n   * store, and its answer is mirrored back here.\n   *\n   * A nav_outlet mount gets its own isolated store, but the host app only\n   * watches the OUTER store's `dynamicDataRequests` — `collectCanvasStores()`\n   * walks the tree for component events and nothing else. So a request issued\n   * inside a nested page (a people field asking for the user directory, a\n   * select asking for its options) landed in a map no one reads and was never\n   * answered: the control just stayed empty.\n   *\n   * Relaying here rather than teaching the host to walk the tree keeps the\n   * contract a library should have — ask your host, and let it ask its own —\n   * and fixes every request type at once instead of one handler at a time.\n   * Depth is unbounded: each level forwards to its own parent until the root,\n   * which is the one the host watches.\n   */\n  private readonly _relayedResponseSources = new Map<string, EruStudioStore>();\n\n  requestDynamicData(componentId: string, type: string, payload: any = ''): string {\n    const parent = this._parentStore();\n    if (parent) {\n      const relayedId = parent.requestDynamicData(componentId, type, payload);\n      // Record the request locally too, so this store's own bookkeeping\n      // (dedupe by component+type, pendingData on removal) still sees it.\n      this._relayedResponseSources.set(relayedId, parent);\n      this._dynamicDataRequests.update(map => {\n        const next = new Map(map);\n        next.set(relayedId, { requestId: relayedId, componentId, type, payload, status: 'pending' });\n        return next;\n      });\n      return relayedId;\n    }\n\n    const requestId = crypto.randomUUID();\n\n    // Fast path: if this request type is session-stable (entity field metadata,\n    // page-name lists, …) and we already have a cached response for the same\n    // payload, respond immediately. Consumer effects watching\n    // `dynamicDataResponses` fire synchronously, skipping the round-trip to the\n    // host handler.\n    const cacheKey = this.getDynamicDataCacheKey(type, payload);\n    if (cacheKey) {\n      const cached = this._dynamicDataCache.get(cacheKey);\n      if (cached !== undefined) {\n        this._dynamicDataRequests.update(map => {\n          const next = new Map(map);\n          next.set(requestId, {\n            requestId,\n            componentId,\n            type,\n            payload,\n            status: 'success'\n          });\n          return next;\n        });\n        this._dynamicDataResponses.update(map => {\n          const next = new Map(map);\n          next.set(requestId, cached);\n          return next;\n        });\n        return requestId;\n      }\n    }\n\n    // Join an identical request that is still in flight instead of firing a\n    // second one. A board renders one card host per row, and every one of them\n    // asks for the same card page in the same change-detection pass — before\n    // any answer exists, so neither this store's cache nor the host app's own\n    // page cache can help. Sixteen rows meant sixteen fetch_page calls.\n    // Returning the pending requestId is enough for the callers: they all read\n    // the response out of `dynamicDataResponses` by that id.\n    // In flight is tracked here rather than read off `_dynamicDataRequests`,\n    // because a host removes the request record the moment it dispatches it —\n    // long before its fetch resolves — so the record's absence says nothing\n    // about whether an answer is still coming. This map is the authority: an\n    // entry lives from the ask until setDynamicDataResponse clears it.\n    const coalesceKey = this.getDynamicDataCoalesceKey(type, payload);\n    if (coalesceKey) {\n      const inflightId = this._dynamicDataInflight.get(coalesceKey);\n      if (inflightId) {\n        if (!this._dynamicDataResponses().has(inflightId)) return inflightId;\n        this._dynamicDataInflight.delete(coalesceKey);\n      }\n    }\n\n    // Cleanup old requests and responses for the same component and type.\n    // Why: per-group row fetches (fetch_entity_data and fetch_query_data) can have\n    // multiple concurrent requests (one per grid group) that must not clobber each\n    // other — dedupe by request.groupId for those types; for all other types, one\n    // pending request per (component, type).\n    const currentRequests = this._dynamicDataRequests();\n    const staleIds: string[] = [];\n    const perGroupType = type === 'fetch_entity_data' || type === 'fetch_query_data';\n    const newGroupId = perGroupType ? payload?.request?.groupId : undefined;\n    for (const [id, req] of currentRequests.entries()) {\n      if (req.componentId === componentId && req.type === type) {\n        if (perGroupType) {\n          if (req.payload?.request?.groupId === newGroupId) staleIds.push(id);\n        } else {\n          staleIds.push(id);\n        }\n      }\n    }\n\n    if (staleIds.length > 0) {\n      this._dynamicDataRequests.update(map => {\n        const next = new Map(map);\n        staleIds.forEach(id => next.delete(id));\n        return next;\n      });\n      this._dynamicDataResponses.update(map => {\n        const next = new Map(map);\n        staleIds.forEach(id => next.delete(id));\n        return next;\n      });\n    }\n\n    this._dynamicDataRequests.update(map => {\n      const next = new Map(map);\n      next.set(requestId, {\n        requestId,\n        componentId,\n        type,\n        payload,\n        status: 'pending'\n      });\n      return next;\n    });\n    if (coalesceKey) {\n      this._dynamicDataInflight.set(coalesceKey, requestId);\n    }\n    return requestId;\n  }\n\n  setDynamicDataResponse(request: DynamicDataRequest, data: any): void {\n    this._dynamicDataResponses.update(map => {\n      const next = new Map(map);\n      next.set(request.requestId, data);\n      return next;\n    });\n    this._dynamicDataRequests.update(map => {\n      const next = new Map(map);\n      const req = next.get(request.requestId);\n      if (req) {\n        next.set(request.requestId, { ...req, status: 'success' });\n      }\n      return next;\n    });\n\n    // Populate the metadata cache once the host has answered. Sibling\n    // requests with the same (type, payload) will skip the host round-trip.\n    const cacheKey = this.getDynamicDataCacheKey(request.type, request.payload);\n    if (cacheKey) {\n      this._dynamicDataCache.set(cacheKey, data);\n    }\n\n    // No longer in flight: the next ask starts a fresh round-trip, which is what\n    // keeps this from behaving like a cache and going stale after a page save.\n    const coalesceKey = this.getDynamicDataCoalesceKey(request.type, request.payload);\n    if (coalesceKey) {\n      this._dynamicDataInflight.delete(coalesceKey);\n    }\n  }\n\n  /**\n   * Returns a stable cache key for session-stable dynamic-data types, or\n   * `null` for types that must always round-trip.\n   *\n   * Conservative whitelist: only entity-schema metadata, which is fixed\n   * for the duration of a process session. Page defs and page lists\n   * can change (user saves a page, creates a new one) so they round-trip;\n   * if/when we add invalidation hooks we can grow this list.\n   */\n  private getDynamicDataCacheKey(type: string, payload: any): string | null {\n    switch (type) {\n      case 'ds_fields':\n      case 'ds_group_fields':\n      // Process users and their attribute list are fixed for the session, and\n      // every people field on a page asks for the same list.\n      case 'ds_people':\n      case 'ds_people_fields':\n        if (payload === undefined || payload === null) return `${type}::`;\n        if (typeof payload === 'string' || typeof payload === 'number' || typeof payload === 'boolean') {\n          return `${type}::${payload}`;\n        }\n        return null;\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Types whose identical concurrent requests should share a single round-trip,\n   * keyed by `${type}::${payload}`. Unlike `getDynamicDataCacheKey` this implies\n   * nothing about how long a response stays valid — the merge lasts only while\n   * the request is unanswered — so a type belongs here as soon as many\n   * components can ask for it at once, whether or not it is cacheable.\n   */\n  private getDynamicDataCoalesceKey(type: string, payload: any): string | null {\n    if (type !== 'ds_page') return null;\n    return typeof payload === 'string' && payload ? `${type}::${payload}` : null;\n  }\n\n  /** Drop the cached response for a given (type, payload). Use when the\n   *  underlying source has changed mid-session — e.g. after the user saves\n   *  a page, invalidate `ds_page::<that-page-id>`. */\n  invalidateDynamicDataCache(type: string, payload: any = ''): void {\n    const key = this.getDynamicDataCacheKey(type, payload);\n    if (key) this._dynamicDataCache.delete(key);\n  }\n\n  /** Drop the entire metadata cache (e.g. on org/project switch). */\n  clearDynamicDataCache(): void {\n    this._dynamicDataCache.clear();\n  }\n\n  removeDynamicDataRequest(requestId: string): void {\n    // A relayed request lives on the parent as well; clearing only the local\n    // copy would leave the parent's answer cached for ever.\n    const relayTarget = this._relayedResponseSources.get(requestId);\n    if (relayTarget) {\n      this._relayedResponseSources.delete(requestId);\n      relayTarget.removeDynamicDataRequest(requestId);\n    }\n    const request = this._dynamicDataRequests().get(requestId);\n    if (request && (request.type === 'fetch_entity_group_data' || request.type === 'fetch_entity_data' || request.type === 'fetch_query_data' || request.type === 'fetch_query_group_data' || request.type === 'fetch_function_data' || request.type === 'ds_nestedpage_entity_name')) {\n      this._pendingData.update(map => {\n        const next = new Map(map);\n        next.set(requestId, request);\n        return next;\n      });\n    }\n\n    this._dynamicDataRequests.update(map => {\n      const next = new Map(map);\n      next.delete(requestId);\n      return next;\n    });\n  }\n\n  removePendingData(requestId: string): void {\n    // A relayed request was parked on the parent, so clearing only the local\n    // copy would leave it in the merged view and hand it back for ever.\n    const parent = this._parentStore();\n    if (parent) parent.removePendingData(requestId);\n    this._pendingData.update(map => {\n      const next = new Map(map);\n      next.delete(requestId);\n      return next;\n    });\n  }\n\n  handleDynamicDataError(requestId: string, error: any): void {\n    this._dynamicDataRequests.update(map => {\n      const next = new Map(map);\n      const req = next.get(requestId);\n      if (req) {\n        next.set(requestId, { ...req, status: 'error', error });\n      }\n      return next;\n    });\n  }\n\n  getDynamicDataResponse(requestId: string): any {\n    const response = this._dynamicDataResponses().get(requestId);\n    if (response !== undefined) return response;\n\n    // Fallback for legacy key-based requests\n    return this._dynamicData().get(requestId);\n  }\n\n  setDynamicData(key: string, value: any): void {\n    this._dynamicData.update(data => {\n      const newData = new Map(data);\n      newData.set(key, value);\n      return newData;\n    });\n  }\n\n  getDynamicData(key: string): any {\n    return this._dynamicData().get(key);\n  }\n\n  getComponentDynamicDataRequests(componentId: string): Map<string, string> {\n    const requests = new Map<string, string>();\n    for (const [reqId, req] of this._dynamicDataRequests().entries()) {\n      if (req.componentId === componentId) {\n        requests.set(req.type, reqId);\n      }\n    }\n    return requests;\n  }\n\n  setComponentEventEmitted(componentId: string, eventType: string, eventSubscription: ComponentEventSubscription): void {\n    this._componentEventEmitted.update(data => {\n      const newData = new Map(data);\n      const componentEvents = new Map(newData.get(componentId) || new Map());\n      const existingEvents = componentEvents.get(eventType) || [];\n      componentEvents.set(eventType, [...existingEvents, eventSubscription]);\n      newData.set(componentId, componentEvents);\n      return newData;\n    });\n  }\n\n  getComponentEventEmitted(componentId: string, eventType: string): ComponentEventSubscription[] | undefined {\n    const componentEvents = this._componentEventEmitted().get(componentId);\n    return componentEvents?.get(eventType) ?? undefined;\n  }\n\n  removeComponentEventEmitted(componentId: string, eventType: string): void {\n    this._componentEventEmitted.update(data => {\n      const newData = new Map(data);\n      const componentEvents = newData.get(componentId);\n      if (componentEvents) {\n        const updated = new Map(componentEvents);\n        updated.delete(eventType);\n        newData.set(componentId, updated);\n      }\n      return newData;\n    });\n  }\n\n  /**\n   * Path segments, with bracket notation folded into dots and `[*]` kept as a\n   * wildcard segment.\n   *\n   * A query result is commonly an array of row objects while a consumer — a\n   * select's option list, a chip list — needs an array of ONE key from those\n   * rows. `[*]` projects the rest of the path across every element to produce\n   * exactly that: `Results.0.upl_file_metadata[*].file_name` turns the rows\n   * into an array of file names.\n   */\n  private static splitPath(path: string): string[] {\n    return String(path || '')\n      .replace(/\\[(\\*|[^\\]]+)\\]/g, '.$1')\n      .split('.')\n      .filter(segment => segment.length > 0);\n  }\n\n  private resolvePayloadPath(payload: any, path: string): any {\n    if (payload === null || payload === undefined) return undefined;\n    if (!path) return payload;\n    const parts = EruStudioStore.splitPath(path);\n    let current: any = payload;\n    for (let i = 0; i < parts.length; i++) {\n      if (current == null) return undefined;\n      if (parts[i] === '*') {\n        if (!Array.isArray(current)) return undefined;\n        const rest = parts.slice(i + 1).join('.');\n        return current\n          .map(item => (rest ? this.resolvePayloadPath(item, rest) : item))\n          .filter(v => v !== undefined && v !== null);\n      }\n      current = current[parts[i]];\n    }\n    return current;\n  }\n\n  /**\n   * `dataKey` scopes the read to one row of an array-nested page_ref — the same\n   * row its components read and write. Without it a looped panel resolved\n   * `state:` against page-level state (never seeing the per-row instance state\n   * its own events had written) and `page:` against the page record instead of\n   * the row, so every field it sent was empty or belonged to a sibling.\n   */\n  resolveApiPayloadFields(fields: string[] | undefined | null, pageId?: string, dataKey?: string): Record<string, any> {\n    if (!fields || fields.length === 0) return {};\n    const out: Record<string, any> = {};\n    const currentId = this._currentPage()?.id;\n    const pid = pageId || currentId;\n    const state = pid ? this.getComputedPageStateFor(pid, dataKey || undefined) : {};\n    const pageData = pid\n      ? (dataKey ? this.getPageRecord(pid, dataKey) : this._pageData().get(pid))\n      : undefined;\n    for (const f of fields) {\n      const parsed = parsePayloadField(f);\n      if (!parsed) continue;\n      const { source, path, key } = parsed;\n      let root: any;\n      if (source === 'state') root = state;\n      else if (source === 'page') root = pageData;\n      else if (source === 'app') root = this.appState();\n      else continue;\n      out[key] = resolveJsonPath(root, path);\n    }\n    return out;\n  }\n\n  processExternalEvent(componentId: string, eventType: string, pageId?: string, payload?: any): void {\n    const page = this._currentPage();\n    if (!page) return;\n    const component = this.findComponentInTree(page.components, componentId);\n    if (!component) return;\n\n    const matchingEvents = component.events?.filter(e => e.event === eventType) || [];\n    const targetPageId = component.pageId || pageId || page.id || '';\n    const fieldNames = (sub: ComponentEventSubscription) => sub.fieldNames || [];\n\n    for (const sub of matchingEvents) {\n      const fNames = fieldNames(sub);\n      if (sub.action === 'hide-fields' && fNames.length > 0) {\n        this.setFieldVisibilityOverride(targetPageId, fNames, false);\n      } else if (sub.action === 'unhide-fields' && fNames.length > 0) {\n        this.setFieldVisibilityOverride(targetPageId, fNames, true);\n      } else if (sub.action === 'hide-component' && fNames.length > 0) {\n        this.setComponentVisibilityOverride(fNames, false);\n      } else if (sub.action === 'show-component' && fNames.length > 0) {\n        this.setComponentVisibilityOverride(fNames, true);\n      } else if (sub.action === 'start-loading' && fNames.length > 0) {\n        this.setComponentLoadingState(fNames, true);\n      } else if (sub.action === 'stop-loading' && fNames.length > 0) {\n        this.setComponentLoadingState(fNames, false);\n      } else if (sub.action === 'disable-field' && fNames.length > 0) {\n        this.setFieldDisabledOverride(targetPageId, fNames, true);\n      } else if (sub.action === 'enable-field' && fNames.length > 0) {\n        this.setFieldDisabledOverride(targetPageId, fNames, false);\n      } else if (sub.action === 'update-state' && sub.state_key) {\n        if (sub.state_formula) {\n          if (sub.state_formula.fn === 'set-from-payload') {\n            const path = sub.state_formula.payload_path || '';\n            const newVal = this.resolvePayloadPath(payload, path);\n            this.writeStateValue(sub.state_key, newVal, sub.state_scope, targetPageId);\n          } else {\n            this.updateStateWithFormula(sub.state_key, sub.state_formula, targetPageId, undefined, sub.state_scope);\n          }\n        } else if (sub.value !== undefined) {\n          this.writeStateValue(sub.state_key, sub.value, sub.state_scope, targetPageId);\n        }\n      } else if (sub.action === 'set-active-tab' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'set-active-tab', this.resolveSubscriptionValue(sub, targetPageId));\n      } else if (sub.action === 'refresh-grid' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'refresh');\n      } else if (sub.action === 'download-grid' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'download');\n      } else if (sub.action === 'refresh-page-ref' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'refresh');\n      } else if (sub.action === 'toggle-side-panel' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'toggle-side-panel');\n      } else if (sub.action === 'open-side-panel' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'open-side-panel');\n      } else if (sub.action === 'close-side-panel' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'close-side-panel');\n      } else if (sub.action === 'emit-to-parent' && sub.state_key) {\n        this.emitToParentPage(sub.state_key, targetPageId, payload);\n      } else if (sub.action === 'update-property' && fNames.length > 0 && sub.property_key) {\n        this.setComponentPropertyOverride(fNames, sub.property_key, sub.value);\n      } else if (sub.action === 'set-page-data') {\n        this.applyPageRecordSource(sub, targetPageId, payload);\n      } else if (sub.action === 'download-file') {\n        this.downloadFileFromAction(sub, targetPageId, payload);\n      } else if (sub.action === 'clear-page-data') {\n        this.clearPageData(targetPageId);\n      } else if (sub.action === 'clear-all-page-data') {\n        this.clearAllPageData();\n      }\n      this.setComponentEventEmitted(componentId, eventType, sub);\n    }\n  }\n\n  processApiResponseActions(actions: ComponentEventSubscription[], pageId?: string, dataKey?: string, apiResult?: any): void {\n    const targetPageId = pageId || this._currentPage()?.id || '';\n    const scope = (name: string) => (dataKey && name) ? `${dataKey}.${name}` : name;\n    for (const sub of actions) {\n      const fNames = sub.fieldNames || [];\n      const scopedFNames = fNames.map(scope);\n      if (sub.action === 'hide-fields' && fNames.length > 0) {\n        this.setFieldVisibilityOverride(targetPageId, scopedFNames, false);\n      } else if (sub.action === 'unhide-fields' && fNames.length > 0) {\n        this.setFieldVisibilityOverride(targetPageId, scopedFNames, true);\n      } else if (sub.action === 'hide-component' && fNames.length > 0) {\n        this.setComponentVisibilityOverride(fNames, false);\n      } else if (sub.action === 'show-component' && fNames.length > 0) {\n        this.setComponentVisibilityOverride(fNames, true);\n      } else if (sub.action === 'start-loading' && fNames.length > 0) {\n        this.setComponentLoadingState(fNames, true);\n      } else if (sub.action === 'stop-loading' && fNames.length > 0) {\n        this.setComponentLoadingState(fNames, false);\n      } else if (sub.action === 'disable-field' && fNames.length > 0) {\n        this.setFieldDisabledOverride(targetPageId, scopedFNames, true);\n      } else if (sub.action === 'enable-field' && fNames.length > 0) {\n        this.setFieldDisabledOverride(targetPageId, scopedFNames, false);\n      } else if (sub.action === 'enable-component' && fNames.length > 0) {\n        this.setComponentDisabledState(fNames, false);\n      } else if (sub.action === 'disable-component' && fNames.length > 0) {\n        this.setComponentDisabledState(fNames, true);\n      } else if (sub.action === 'start-timer' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'start');\n      } else if (sub.action === 'stop-timer' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'stop');\n      } else if (sub.action === 'set-field' && sub.state_key) {\n        const fieldKey = scope(sub.state_key);\n        const partialPageData: Partial<any> = { entity_data: { [fieldKey]: sub.value } };\n        this.updatePageData(partialPageData, targetPageId);\n      } else if (sub.action === 'update-state' && sub.state_key) {\n        if (sub.state_formula) {\n          if (sub.state_formula.fn === 'set-from-payload') {\n            const path = sub.state_formula.payload_path || '';\n            const newVal = this.resolvePayloadPath(apiResult, path);\n            this.writeStateValue(sub.state_key, newVal, sub.state_scope, targetPageId, dataKey);\n          } else {\n            this.updateStateWithFormula(sub.state_key, sub.state_formula, targetPageId, dataKey, sub.state_scope);\n          }\n        } else if (sub.value !== undefined) {\n          this.writeStateValue(sub.state_key, sub.value, sub.state_scope, targetPageId, dataKey);\n        }\n      } else if (sub.action === 'set-active-tab' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'set-active-tab', this.resolveSubscriptionValue(sub, targetPageId, dataKey));\n      } else if (sub.action === 'refresh-grid' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'refresh');\n      } else if (sub.action === 'download-grid' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'download');\n      } else if (sub.action === 'refresh-page-ref' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'refresh');\n      } else if (sub.action === 'toggle-side-panel' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'toggle-side-panel');\n      } else if (sub.action === 'open-side-panel' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'open-side-panel');\n      } else if (sub.action === 'close-side-panel' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'close-side-panel');\n      } else if (sub.action === 'emit-to-parent' && sub.state_key) {\n        this.emitToParentPage(sub.state_key, targetPageId, apiResult);\n      } else if (sub.action === 'update-property' && fNames.length > 0 && sub.property_key) {\n        this.setComponentPropertyOverride(fNames, sub.property_key, sub.value);\n      } else if (sub.action === 'call-function' || sub.action === 'call-query') {\n        this.setComponentEventEmitted('api-response', 'api-callback', sub);\n      } else if (sub.action === 'navigate-to-page' && sub.page_id) {\n        // The panel offers this on On Success / On Error, and the page-level\n        // dispatcher runs it, but this path had no branch — so \"save, then go to\n        // the next page\" silently did nothing once the save came back. Routed\n        // through the same shared runner so a nav_outlet gets a route-param\n        // write and a standalone page hands the request to the host, exactly as\n        // it does when the action fires directly off the component event.\n        this.navigateToPage(sub, targetPageId, dataKey);\n      } else if (sub.action === 'set-page-data') {\n        this.applyPageRecordSource(sub, targetPageId, apiResult);\n      } else if (sub.action === 'download-file') {\n        this.downloadFileFromAction(sub, targetPageId, apiResult, dataKey);\n      } else if (sub.action === 'clear-page-data') {\n        this.clearPageData(targetPageId);\n      } else if (sub.action === 'clear-all-page-data') {\n        this.clearAllPageData();\n      }\n    }\n  }\n\n  setFieldVisibilityOverride(pageId: string, fieldNames: string[], visible: boolean): void {\n    this._fieldVisibilityOverrides.update(map => {\n      const newMap = new Map(map);\n      const pageOverrides = new Map(newMap.get(pageId) || new Map());\n      fieldNames.forEach(name => {\n        pageOverrides.set(name, visible);\n      });\n      newMap.set(pageId, pageOverrides);\n      return newMap;\n    });\n  }\n\n  setComponentLoadingState(componentIds: string[], isLoading: boolean): void {\n    this._componentLoadingStates.update(map => {\n      const newMap = new Map(map);\n      componentIds.forEach(id => {\n        if (isLoading) {\n          newMap.set(id, true);\n        } else {\n          newMap.delete(id);\n        }\n      });\n      return newMap;\n    });\n  }\n\n  getComponentLoadingState(componentId: string): boolean {\n    return this._componentLoadingStates().get(componentId) ?? false;\n  }\n\n  setComponentVisibilityOverride(componentIds: string[], visible: boolean): void {\n    this._componentVisibilityOverrides.update(map => {\n      const newMap = new Map(map);\n      componentIds.forEach(id => {\n        newMap.set(id, visible);\n      });\n      return newMap;\n    });\n  }\n\n  setFieldDisabledOverride(pageId: string, fieldNames: string[], disabled: boolean): void {\n    this._fieldDisabledOverrides.update(map => {\n      const newMap = new Map(map);\n      const pageOverrides = new Map(newMap.get(pageId) || new Map());\n      fieldNames.forEach(name => {\n        pageOverrides.set(name, disabled);\n      });\n      newMap.set(pageId, pageOverrides);\n      return newMap;\n    });\n  }\n\n  getFieldDisabledState(pageId: string, fieldName: string): boolean {\n    return this._fieldDisabledOverrides().get(pageId)?.get(fieldName) ?? false;\n  }\n\n  setComponentPropertyOverride(componentIds: string[], propertyKey: string, value: any): void {\n    if (!propertyKey) return;\n    this._componentPropertyOverrides.update(map => {\n      const newMap = new Map(map);\n      componentIds.forEach(id => {\n        const compOverrides = new Map(newMap.get(id) || new Map());\n        compOverrides.set(propertyKey, value);\n        newMap.set(id, compOverrides);\n      });\n      return newMap;\n    });\n  }\n\n  getComponentPropertyOverride(componentId: string, propertyKey: string): any {\n    return this._componentPropertyOverrides().get(componentId)?.get(propertyKey);\n  }\n\n  dispatchComponentAction(componentIds: string[], action: string, data?: any): void {\n    this._componentActions.update(map => {\n      const newMap = new Map(map);\n      componentIds.forEach(id => newMap.set(id, { action, data }));\n      return newMap;\n    });\n  }\n\n  consumeComponentAction(componentId: string): { action: string; data?: any } | undefined {\n    const action = this._componentActions().get(componentId);\n    if (action) {\n      this._componentActions.update(map => {\n        const newMap = new Map(map);\n        newMap.delete(componentId);\n        return newMap;\n      });\n    }\n    return action;\n  }\n\n  /**\n   * `payload` is the emitting component's event payload (entity_id /\n   * entity_data / entity_name), forwarded so a page event handling the signal\n   * can read it — that is what `set-from-payload` resolves against.\n   */\n  emitToParentPage(signalName: string, childPageId: string, payload?: any): void {\n    // The store holds exactly one current page. \"Parent\" here resolves to\n    // that page — child page_refs/widgets emit events that are handled by\n    // their hosting page. Cross-store scenarios (e.g. a nav_outlet mounting\n    // a peer page) use their own store instance, so events naturally stay\n    // within that scope.\n    const currentPage = this._currentPage();\n    if (!currentPage) return;\n    this.processPageEvents(currentPage, signalName, payload);\n  }\n\n  /**\n   * Whether a page's `on_load` events may fire yet.\n   *\n   * False only while a page that DECLARES a state record source is still\n   * waiting for it: those events carry the record as their payload, so firing\n   * early sends an empty `entity_id`. A page with no such declaration is ready\n   * immediately — its record, if any, comes from the host.\n   */\n  isPageRecordSourceReady(page: EruPage | null | undefined): boolean {\n    if (!page?.id) return false;\n    if (page.data_source !== 'state') return true;\n    if (!(page.state_field || '').trim()) return true;\n    return this._pageRecordSourceApplied() === page.id;\n  }\n\n  fireOnLoadPageEvents(page: EruPage): void {\n    const events = page.events || [];\n    const matching = events.filter(e => e.event === 'on_load');\n    if (matching.length === 0) return;\n\n    const pageData = this.getPageData(page.id);\n    const enrichedPayload = {\n      entity_id: pageData?.entity_id || '',\n      entity_data: pageData?.entity_data || {},\n      entity_name: page.entity_name || ''\n    };\n\n    for (const sub of matching) {\n      if (sub.validate_before_action) {\n        if (!enrichedPayload.entity_id) continue;\n        const requiredFields = sub.validate_field_names || [];\n        const hasAllRequired = requiredFields.every(fname => {\n          const v = (enrichedPayload.entity_data as any)?.[fname];\n          return v !== undefined && v !== null && v !== '';\n        });\n        if (!hasAllRequired) continue;\n      }\n\n      const subCopy: any = { ...sub, payload: { ...enrichedPayload } };\n      subCopy._originPageId = page.id;\n      subCopy._originDataKey = '';\n\n      if (sub.action === 'update-state' && sub.state_key && sub.state_formula) {\n        const formula = sub.state_formula;\n        if (formula.fn === 'set-from-payload') {\n          const path = formula.payload_path || '';\n          const newVal = this.resolvePayloadPath(enrichedPayload, path);\n          this.writeStateValue(sub.state_key, newVal, sub.state_scope, page.id);\n        } else {\n          this.updateStateWithFormula(sub.state_key, formula, page.id, undefined, sub.state_scope);\n        }\n      }\n\n      this.setComponentEventEmitted(page.id, 'on_load', subCopy);\n    }\n  }\n\n  private processPageEvents(page: EruPage, signalName: string, payload?: any): void {\n    const matchingEvents = page.events?.filter(e => e.event === signalName) || [];\n    for (const sub of matchingEvents) {\n      const fNames = sub.fieldNames || [];\n      if (sub.action === 'update-state' && sub.state_key) {\n        this.applyUpdateStateAction(sub, page.id, payload);\n      } else if (sub.action === 'set-active-tab' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'set-active-tab', this.resolveSubscriptionValue(sub, page.id));\n      } else if (sub.action === 'refresh-grid' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'refresh');\n      } else if (sub.action === 'download-grid' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'download');\n      } else if (sub.action === 'refresh-page-ref' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'refresh');\n      } else if (sub.action === 'toggle-side-panel' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'toggle-side-panel');\n      } else if (sub.action === 'open-side-panel' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'open-side-panel');\n      } else if (sub.action === 'close-side-panel' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'close-side-panel');\n      } else if (sub.action === 'hide-component' && fNames.length > 0) {\n        this.setComponentVisibilityOverride(fNames, false);\n      } else if (sub.action === 'show-component' && fNames.length > 0) {\n        this.setComponentVisibilityOverride(fNames, true);\n      } else if (sub.action === 'start-loading' && fNames.length > 0) {\n        this.setComponentLoadingState(fNames, true);\n      } else if (sub.action === 'stop-loading' && fNames.length > 0) {\n        this.setComponentLoadingState(fNames, false);\n      } else if (sub.action === 'enable-component' && fNames.length > 0) {\n        this.setComponentDisabledState(fNames, false);\n      } else if (sub.action === 'disable-component' && fNames.length > 0) {\n        this.setComponentDisabledState(fNames, true);\n      } else if (sub.action === 'hide-fields' && fNames.length > 0) {\n        this.setFieldVisibilityOverride(page.id, fNames, false);\n      } else if (sub.action === 'unhide-fields' && fNames.length > 0) {\n        this.setFieldVisibilityOverride(page.id, fNames, true);\n      } else if (sub.action === 'start-timer' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'start');\n      } else if (sub.action === 'stop-timer' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'stop');\n      } else if (sub.action === 'update-property' && fNames.length > 0 && sub.property_key) {\n        this.setComponentPropertyOverride(fNames, sub.property_key, sub.value);\n      } else if (sub.action === 'step-forward' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'step-forward');\n      } else if (sub.action === 'step-back' && fNames.length > 0) {\n        this.dispatchComponentAction(fNames, 'step-back');\n      } else if (sub.action === 'navigate-to-page' && sub.page_id) {\n        this.navigateToPage(sub, page.id);\n      } else if (sub.action === 'set-page-data') {\n        this.applyPageRecordSource(sub, page.id, payload);\n      } else if (sub.action === 'download-file') {\n        this.downloadFileFromAction(sub, page.id, payload);\n      } else if (sub.action === 'clear-page-data') {\n        this.clearPageData(page.id);\n      } else if (sub.action === 'clear-all-page-data') {\n        this.clearAllPageData();\n      } else if (sub.action === 'call-function' || sub.action === 'call-query'\n        || sub.action === 'fetch-page-data' || sub.action === 'save-page-data') {\n        // Host-executed actions. A page event reached by `emit-to-parent` had no\n        // branch for these, so a child panel emitting a signal the parent answers\n        // with a function/query call did nothing. Handed over the same way\n        // `fireOnLoadPageEvents` does, carrying the emitter's payload so\n        // `api_payload_fields` and `set-from-payload` resolve against it.\n        const subCopy: any = { ...sub, payload: { ...(payload || {}) } };\n        subCopy._originPageId = page.id;\n        subCopy._originDataKey = '';\n        this.setComponentEventEmitted(page.id, signalName, subCopy);\n      }\n    }\n  }\n\n  /**\n   * An action's configured value, with `value_expression` winning over the\n   * static `value` — the same precedence base-component applies, so an action\n   * reads the same whether it runs off a component event or an API response.\n   */\n  private resolveSubscriptionValue(sub: ComponentEventSubscription, pageId?: string, dataKey?: string): any {\n    const expr = sub.value_expression;\n    if (expr && expr.trim()) {\n      return this.logicEvaluator()?.evaluateValue(expr, pageId, dataKey || undefined);\n    }\n    return sub.value;\n  }\n\n  /**\n   * Resolve and write an `update-state` action's value. `payload` is the event\n   * payload the action fired with — the source for `set-from-payload`.\n   */\n  private applyUpdateStateAction(sub: ComponentEventSubscription, pageId: string, payload?: any): void {\n    if (!sub.state_key) return;\n    const scope = sub.state_scope;\n    const formula = sub.state_formula;\n    if (formula) {\n      if (formula.fn === 'set-from-payload') {\n        const newVal = this.resolvePayloadPath(payload, formula.payload_path || '');\n        this.writeStateValue(sub.state_key, newVal, scope, pageId);\n      } else if (formula.fn === 'expr' && formula.expr) {\n        const newVal = this.logicEvaluator()?.evaluateValue(formula.expr, pageId);\n        this.writeStateValue(sub.state_key, newVal, scope, pageId);\n      } else {\n        this.updateStateWithFormula(sub.state_key, formula, pageId, undefined, scope);\n      }\n      return;\n    }\n    // No formula: take the value straight from `value_expression`/`value`.\n    // This is how a JSON object reaches state — formulas cannot carry one.\n    if (sub.value_expression && sub.value_expression.trim()) {\n      const newVal = this.logicEvaluator()?.evaluateValue(sub.value_expression, pageId);\n      this.writeStateValue(sub.state_key, newVal, scope, pageId);\n    } else if (sub.value !== undefined) {\n      this.writeStateValue(sub.state_key, sub.value, scope, pageId);\n    }\n  }\n\n  setComponentDisabledState(componentIds: string[], disabled: boolean): void {\n    this._componentDisabledStates.update(map => {\n      const newMap = new Map(map);\n      componentIds.forEach(id => newMap.set(id, disabled));\n      return newMap;\n    });\n  }\n\n  getComponentDisabledState(componentId: string): boolean {\n    return this._componentDisabledStates().get(componentId) ?? false;\n  }\n\n  setSidePanelOpenState(componentId: string, open: boolean): void {\n    this._sidePanelOpenStates.update(map => {\n      const newMap = new Map(map);\n      newMap.set(componentId, open);\n      return newMap;\n    });\n  }\n\n  getSidePanelOpenState(componentId: string): boolean {\n    return this._sidePanelOpenStates().get(componentId) ?? false;\n  }\n\n  setClipboard(component: EruComponent | null): void {\n    this._clipboard.set(component ? JSON.parse(JSON.stringify(component)) : null);\n  }\n\n  findComponentById(id: string): EruComponent | null {\n    const page = this._currentPage();\n    const inPage = page ? this.findComponentInTree(page.components, id) : null;\n    if (inPage) return inPage;\n    for (const components of this._nestedPageComponents().values()) {\n      const found = this.findComponentInTree(components, id);\n      if (found) return found;\n    }\n    return null;\n  }\n\n  findParentComponent(childId: string): EruComponent | null {\n    const page = this._currentPage();\n    const inPage = page?.components ? this.findParentInTree(page.components, childId) : null;\n    if (inPage) return inPage;\n    for (const components of this._nestedPageComponents().values()) {\n      const found = this.findParentInTree(components, childId);\n      if (found) return found;\n    }\n    return null;\n  }\n\n  private findParentInTree(components: EruComponent[], childId: string): EruComponent | null {\n    for (const c of components) {\n      if (c.children?.some(ch => ch.id === childId)) return c;\n      if (c.children) {\n        const found = this.findParentInTree(c.children, childId);\n        if (found) return found;\n      }\n    }\n    return null;\n  }\n\n  setCurrentPage(page: EruPage | null, pageId?: string): void {\n    if (page) {\n      // `components` normally arrives as an array, but generator/agent responses\n      // (and some save formats) serialize it as a JSON string. Normalise to an\n      // array so the canvas and all tree walkers can rely on Array methods.\n      page = { ...page, components: this.normalizeComponents(page.components) };\n      this.initPageState(page, pageId);\n    }\n    // A different page (or a remount of the same one) must re-apply its data\n    // source from scratch — the memo is only valid within one mount.\n    this._pageDataSourceKey = '';\n    this._pageRecordSourceApplied.set(null);\n    this._agentStagingComponents.set(null);\n    this._currentPage.set(page);\n    this._selectedComponent.set(null);\n  }\n\n  pageForAgent(): EruPage | null {\n    const page = untracked(() => this._currentPage());\n    if (!page) return null;\n    return { ...page, components: stripRuntimeEventKeys(stripMountedPages(page.components || [])) };\n  }\n\n  setAgentStagingComponents(scanned: ScannedPageComponent[] | null): void {\n    if (!scanned || scanned.length === 0) {\n      this._agentStagingComponents.set(null);\n      return;\n    }\n    this._agentStagingComponents.set(buildStagingTree(scanned));\n  }\n\n  clearAgentStaging(): void {\n    this._agentStagingComponents.set(null);\n  }\n\n  applyAgentPatch(patch: PagePatch): PagePatchResult | null {\n    const current = untracked(() => this._currentPage());\n    if (!current) return null;\n\n    const result = applyPagePatch(current, patch);\n    this.updatePage({ ...result.page, id: current.id });\n\n    for (const key of result.added_state_keys) {\n      const declared = (result.page.state || []).find(sv => sv.key === key);\n      if (declared) this.applyStateInitial(key, declared.initial, current.id);\n    }\n\n    const selected = untracked(() => this._selectedComponent());\n    if (selected) {\n      const refreshed = this.findComponentInTree(this._currentPage()?.components || [], selected.id);\n      this._selectedComponent.set(refreshed || null);\n    }\n\n    return result;\n  }\n\n  private normalizeComponents(components: any): EruComponent[] {\n    let list: EruComponent[] = [];\n    if (Array.isArray(components)) {\n      list = components;\n    } else if (typeof components === 'string' && components.trim()) {\n      try {\n        const parsed = JSON.parse(components);\n        list = Array.isArray(parsed) ? parsed : [];\n      } catch {\n        return [];\n      }\n    }\n    // Drop persisted page_ref children: the resolved nested page tree gets\n    // mutated into the ref's `children` at runtime and can end up saved with\n    // the page. The snapshot is a runtime artifact (the nested def is fetched\n    // via ds_page) and, worse, its ids can collide with the outer page's ids\n    // (e.g. two \"root-container\"s), which cycles every parent-chain walk and\n    // freezes the page on load.\n    const stripRefChildren = (nodes: EruComponent[] | undefined) => {\n      for (const n of (nodes || [])) {\n        if ((n as any).type === 'page_ref' && Array.isArray(n.children) && n.children.length > 0) {\n          n.children = [];\n        } else {\n          stripRefChildren(n.children);\n        }\n      }\n    };\n    stripRefChildren(list);\n    return list;\n  }\n\n  updatePage(updates: Partial<EruPage>): void {\n    const current = this._currentPage();\n    if (current) {\n      this._undoStack.push(JSON.parse(JSON.stringify(current)));\n      if (this._undoStack.length > APP_CONSTANTS.DESIGNER.HISTORY_LIMIT) {\n        this._undoStack.shift();\n      }\n      this._redoStack = [];\n      this._history.set({\n        can_undo: true,\n        can_redo: false,\n        current_step: this._undoStack.length,\n        max_steps: APP_CONSTANTS.DESIGNER.HISTORY_LIMIT\n      });\n    }\n    this._currentPage.update(c => c ? { ...c, ...updates } : null);\n  }\n\n  undo(): void {\n    const prev = this._undoStack.pop();\n    if (!prev) return;\n    const current = this._currentPage();\n    if (current) {\n      this._redoStack.push(JSON.parse(JSON.stringify(current)));\n    }\n    this._currentPage.set(prev);\n    this._history.set({\n      can_undo: this._undoStack.length > 0,\n      can_redo: true,\n      current_step: this._undoStack.length,\n      max_steps: APP_CONSTANTS.DESIGNER.HISTORY_LIMIT\n    });\n  }\n\n  redo(): void {\n    const next = this._redoStack.pop();\n    if (!next) return;\n    const current = this._currentPage();\n    if (current) {\n      this._undoStack.push(JSON.parse(JSON.stringify(current)));\n    }\n    this._currentPage.set(next);\n    this._history.set({\n      can_undo: true,\n      can_redo: this._redoStack.length > 0,\n      current_step: this._undoStack.length,\n      max_steps: APP_CONSTANTS.DESIGNER.HISTORY_LIMIT\n    });\n  }\n\n  setSelectedComponent(component: EruComponent | null): void {\n    this._selectedComponent.set(component);\n  }\n\n  addComponent(component: EruComponent, containerId?: string, index?: number): void {\n    const page = this._currentPage();\n    if (!page) return;\n\n    let updatedComponents: EruComponent[];\n\n    if (!containerId || containerId === 'root-container') {\n      const rootContainer = page.components.find(c => c.id === 'root-container');\n      if (rootContainer) {\n        const newChildren = [...(rootContainer.children || [])];\n        if (index !== undefined) {\n          newChildren.splice(index, 0, component);\n        } else {\n          newChildren.push(component);\n        }\n        updatedComponents = page.components.map(c =>\n          c.id === 'root-container' ? { ...c, children: newChildren } : c\n        );\n      } else {\n        updatedComponents = [...page.components];\n        if (index !== undefined) {\n          updatedComponents.splice(index, 0, component);\n        } else {\n          updatedComponents.push(component);\n        }\n      }\n    } else {\n      const updated = this.addToContainer(page.components, containerId, component, index);\n      if (!updated) return;\n      updatedComponents = updated;\n    }\n\n    const MAX_NESTING_DEPTH = 25;\n    const wasValid = this.componentRegistry.validateNestingDepth(page.components, MAX_NESTING_DEPTH);\n    if (wasValid && !this.componentRegistry.validateNestingDepth(updatedComponents, MAX_NESTING_DEPTH)) return;\n    this.updatePage({ components: updatedComponents });\n  }\n\n  updateComponent(componentId: string, updates: Partial<EruComponent>): void {\n    const page = untracked(() => this._currentPage());\n    if (!page) return;\n\n    const existingComponent = this.findComponentInTree(page.components, componentId);\n    if (!existingComponent) return;\n\n    const hasChanges = Object.keys(updates).some(key => (updates as any)[key] !== (existingComponent as any)[key]);\n    if (!hasChanges) return;\n\n    const updatedComponents = this.updateComponentInTree(page.components, componentId, updates);\n    this.updatePage({ components: updatedComponents });\n\n    const selected = untracked(() => this._selectedComponent());\n    if (selected?.id === componentId) {\n      this._selectedComponent.update(current =>\n        current ? { ...current, ...updates } : null\n      );\n    }\n  }\n\n  deleteComponent(componentId: string): void {\n    const page = this._currentPage();\n    if (!page) return;\n\n    const updatedComponents = this.removeComponentFromTree(page.components, componentId);\n    this.updatePage({ components: updatedComponents });\n\n    if (this._selectedComponent()?.id === componentId) {\n      this._selectedComponent.set(null);\n    }\n  }\n\n  removeComponent(componentId: string): void {\n    this.deleteComponent(componentId);\n  }\n\n  updateComponentProperty(componentId: string, propertyName: string, value: any): void {\n    const breakpoint = this._viewport().breakpoint as TailwindBreakpoint;\n    this.updateComponentPropertyAtBreakpoint(componentId, propertyName, value, breakpoint);\n  }\n\n  updateComponentPropertyAtBreakpoint(componentId: string, propertyName: string, value: any, breakpoint: TailwindBreakpoint | 'base'): void {\n    const component = untracked(() => this._selectedComponent());\n    if (!component || component.id !== componentId) return;\n\n    if (propertyName === 'layout_type' && (component.type === 'flex_container' || component.type === 'grid_container')) {\n      this.switchLayoutType(componentId, value);\n      return;\n    }\n\n    const updatedProperties = { ...component.properties };\n    if (!updatedProperties[breakpoint]) {\n      updatedProperties[breakpoint] = {};\n    }\n    updatedProperties[breakpoint] = {\n      ...updatedProperties[breakpoint],\n      [propertyName]: value\n    };\n\n    const updatedComponent = {\n      ...component,\n      properties: updatedProperties,\n      updated_at: new Date().toISOString()\n    };\n\n    this.updateComponent(componentId, updatedComponent);\n\n    if (componentId === this._selectedComponent()?.id) {\n      this._selectedComponent.set(updatedComponent);\n    }\n  }\n\n  getComponentProperty(name: string, breakpoint: TailwindBreakpoint | 'base' = 'base'): any {\n    const component = this._selectedComponent();\n    if (!component || !component.properties) return undefined;\n    const props = component.properties[breakpoint];\n    return props ? props[name] : undefined;\n  }\n\n  clearComponentPropertyAtBreakpoint(componentId: string, propertyName: string, breakpoint: TailwindBreakpoint | 'base'): void {\n    const component = untracked(() => this._selectedComponent());\n    if (!component || component.id !== componentId) return;\n    const bp = component.properties?.[breakpoint];\n    if (!bp || !(propertyName in bp)) return;\n    const updatedBp: any = { ...bp };\n    delete updatedBp[propertyName];\n    const updatedProperties: any = { ...component.properties };\n    if (Object.keys(updatedBp).length === 0 && breakpoint !== 'base') {\n      delete updatedProperties[breakpoint];\n    } else {\n      updatedProperties[breakpoint] = updatedBp;\n    }\n    const updatedComponent = { ...component, properties: updatedProperties, updated_at: new Date().toISOString() };\n    this.updateComponent(componentId, updatedComponent);\n    if (componentId === this._selectedComponent()?.id) {\n      this._selectedComponent.set(updatedComponent);\n    }\n  }\n\n  updateStyleProperty(componentId: string, propertyName: string, value: any): void {\n    const breakpoint = this._viewport().breakpoint as TailwindBreakpoint;\n    this.updateStylePropertyAtBreakpoint(componentId, propertyName, value, breakpoint);\n  }\n\n  clearStylePropertyAtBreakpoint(componentId: string, propertyName: string, breakpoint: TailwindBreakpoint | 'base'): void {\n    const component = untracked(() => this._selectedComponent());\n    if (!component || component.id !== componentId) return;\n    const bp = component.styles.responsive_styles?.[breakpoint];\n    if (!bp || !(propertyName in bp)) return;\n    const updatedBp: any = { ...bp };\n    delete updatedBp[propertyName];\n    const updatedResponsive: any = { ...component.styles.responsive_styles };\n    if (Object.keys(updatedBp).length === 0 && breakpoint !== 'base') {\n      delete updatedResponsive[breakpoint];\n    } else {\n      updatedResponsive[breakpoint] = updatedBp;\n    }\n    this.updateComponent(componentId, {\n      styles: { ...component.styles, responsive_styles: updatedResponsive },\n      updated_at: new Date().toISOString(),\n    });\n  }\n\n  updateStylePropertyAtBreakpoint(componentId: string, propertyName: string, value: any, breakpoint: TailwindBreakpoint | 'base'): void {\n    const component = this._selectedComponent();\n    if (!component || component.id !== componentId) return;\n\n    const updatedStyleProperties = { ...component.styles.responsive_styles };\n    if (!updatedStyleProperties[breakpoint]) {\n      updatedStyleProperties[breakpoint] = {};\n    }\n    updatedStyleProperties[breakpoint] = {\n      ...updatedStyleProperties[breakpoint],\n      [propertyName]: value\n    };\n\n    this.updateComponent(componentId, {\n      styles: {\n        ...component.styles,\n        responsive_styles: updatedStyleProperties\n      },\n      updated_at: new Date().toISOString()\n    });\n  }\n\n  // Rename a responsive style key in place, keeping its position in the object\n  // so the panel's list does not reorder while the user is typing.\n  renameStylePropertyAtBreakpoint(componentId: string, oldKey: string, newKey: string, breakpoint: TailwindBreakpoint | 'base'): void {\n    const component = this._selectedComponent();\n    if (!component || component.id !== componentId) return;\n    if (!newKey || oldKey === newKey) return;\n\n    const bp = component.styles.responsive_styles?.[breakpoint];\n    if (!bp || !(oldKey in bp)) return;\n\n    const updatedBp: Record<string, any> = {};\n    for (const [key, value] of Object.entries(bp)) {\n      updatedBp[key === oldKey ? newKey : key] = value;\n    }\n\n    this.updateComponent(componentId, {\n      styles: {\n        ...component.styles,\n        responsive_styles: { ...component.styles.responsive_styles, [breakpoint]: updatedBp }\n      },\n      updated_at: new Date().toISOString()\n    });\n  }\n\n  switchLayoutType(componentId: string, newLayoutType: 'flex' | 'grid'): void {\n    const page = this._currentPage();\n    if (!page) return;\n\n    const component = this.findComponentInTree(page.components, componentId);\n    if (!component) return;\n\n    const newType = newLayoutType === 'flex' ? 'flex_container' : 'grid_container';\n    const baseStyleProps = component.styles.responsive_styles.base || {};\n    const commonStyleProps = {\n      gap: baseStyleProps['gap'] || 16,\n      padding: baseStyleProps['padding'] || 16\n    };\n\n    let newBaseStyleProperties: Record<string, any>;\n\n    if (newLayoutType === 'flex') {\n      newBaseStyleProperties = {\n        direction: 'row',\n        justify_content: 'flex-start',\n        align_items: 'stretch',\n        wrap: false,\n        ...commonStyleProps\n      };\n    } else {\n      newBaseStyleProperties = {\n        columns: 'repeat(auto-fit, minmax(250px, 1fr))',\n        rows: 'auto',\n        ...commonStyleProps\n      };\n    }\n\n    const updatedProperties = { ...component.properties };\n    if (!updatedProperties.base) {\n      updatedProperties.base = {};\n    }\n    updatedProperties.base = {\n      ...updatedProperties.base,\n      layout_type: newLayoutType\n    };\n\n    this.updateComponent(componentId, {\n      type: newType,\n      properties: updatedProperties,\n      styles: {\n        ...component.styles,\n        responsive_styles: { base: newBaseStyleProperties }\n      },\n      updated_at: new Date().toISOString()\n    });\n  }\n\n  addComponentToContainer(containerId: string, component: EruComponent): void {\n    this.addComponent(component, containerId);\n  }\n\n  moveComponentToContainer(componentId: string, targetContainerId: string): void {\n    const page = this._currentPage();\n    if (!page) return;\n\n    const component = this.findComponentInTree(page.components, componentId);\n    if (!component || component.id === targetContainerId) return;\n\n    const withoutSource = this.removeComponentFromTree(page.components, componentId);\n    const withMoved = this.addToContainer(withoutSource, targetContainerId, component);\n    if (withMoved) {\n      this.updatePage({ components: withMoved });\n    }\n  }\n\n  moveComponentToIndex(componentId: string, targetIndex: number): void {\n    const page = this._currentPage();\n    if (!page) return;\n\n    const components = [...page.components];\n    const sourceIndex = components.findIndex(c => c.id === componentId);\n\n    if (sourceIndex === -1 || sourceIndex === targetIndex) return;\n\n    const [movedComponent] = components.splice(sourceIndex, 1);\n    const adjustedTargetIndex = sourceIndex < targetIndex ? targetIndex - 1 : targetIndex;\n    components.splice(adjustedTargetIndex, 0, movedComponent);\n\n    this.updatePage({ components });\n  }\n\n  moveComponentBeforeTarget(sourceId: string, targetId: string): void {\n    const page = this._currentPage();\n    if (!page) return;\n\n    const flatComponents = this.flattenComponentTree(page.components);\n    const sourceComp = flatComponents.find(c => c.id === sourceId);\n    const targetComp = flatComponents.find(c => c.id === targetId);\n\n    if (!sourceComp || !targetComp || sourceId === targetId) return;\n\n    const updatedComponents = this.moveComponentBeforeTargetInTree(\n      page.components,\n      sourceId,\n      targetId\n    );\n\n    if (updatedComponents) {\n      this.updatePage({ components: updatedComponents });\n    }\n  }\n\n  updateResponsiveClasses(componentId: string, breakpoint: TailwindBreakpoint | 'base', value: any): void {\n    const component = this._selectedComponent();\n    if (!component || component.id !== componentId) return;\n\n    this.updateComponent(componentId, {\n      styles: {\n        ...component.styles,\n        responsive_classes: {\n          ...component.styles.responsive_classes,\n          [breakpoint]: value\n        }\n      },\n      updated_at: new Date().toISOString()\n    });\n  }\n\n  updateComponentStyle(componentId: string, styleName: string, value: any): void {\n    const component = this._selectedComponent();\n    if (!component || component.id !== componentId) return;\n\n    this.updateComponent(componentId, {\n      styles: {\n        ...component.styles,\n        [styleName]: value\n      },\n      updated_at: new Date().toISOString()\n    });\n  }\n\n  setCustomStyle(componentId: string, key: string, value: any): void {\n    const component = this._selectedComponent();\n    if (!component || component.id !== componentId) return;\n    if (!key) return;\n\n    const nextCustom = { ...(component.styles.custom || {}), [key]: value };\n    this.updateComponent(componentId, {\n      styles: {\n        ...component.styles,\n        custom: nextCustom\n      },\n      updated_at: new Date().toISOString()\n    });\n  }\n\n  renameCustomStyleKey(componentId: string, oldKey: string, newKey: string): void {\n    const component = this._selectedComponent();\n    if (!component || component.id !== componentId) return;\n    if (!newKey || oldKey === newKey) return;\n\n    const current = { ...(component.styles.custom || {}) };\n    if (!(oldKey in current)) return;\n    const value = current[oldKey];\n    delete current[oldKey];\n    current[newKey] = value;\n    this.updateComponent(componentId, {\n      styles: {\n        ...component.styles,\n        custom: current\n      },\n      updated_at: new Date().toISOString()\n    });\n  }\n\n  removeCustomStyle(componentId: string, key: string): void {\n    const component = this._selectedComponent();\n    if (!component || component.id !== componentId) return;\n\n    const current = { ...(component.styles.custom || {}) };\n    if (!(key in current)) return;\n    delete current[key];\n    this.updateComponent(componentId, {\n      styles: {\n        ...component.styles,\n        custom: current\n      },\n      updated_at: new Date().toISOString()\n    });\n  }\n\n  setCurrentBreakpoint(breakpoint: string): void {\n    this._viewport.update(current => ({ ...current, breakpoint: breakpoint as TailwindBreakpoint }));\n  }\n\n  setDragState(dragState: Partial<DragState>): void {\n    this._dragState.update(current => ({ ...current, ...dragState }));\n  }\n\n  startDrag(draggedComponent: any): void {\n    this._dragState.set({\n      is_dragging: true,\n      dragged_component: draggedComponent\n    });\n  }\n\n  endDrag(): void {\n    this._dragState.set({ is_dragging: false });\n    this._hoveredComponentId.set(null);\n  }\n\n  setHoveredComponentId(componentId: string | null): void {\n    this._hoveredComponentId.set(componentId);\n  }\n\n  setViewport(viewport: Partial<ViewportState>): void {\n    this._viewport.update(current => ({ ...current, ...viewport }));\n  }\n\n  setBreakpoint(breakpoint: TailwindBreakpoint): void {\n    this._viewport.update(current => ({ ...current, breakpoint }));\n  }\n\n  setZoom(zoom: number): void {\n    const clampedZoom = Math.max(\n      APP_CONSTANTS.DESIGNER.MIN_ZOOM,\n      Math.min(APP_CONSTANTS.DESIGNER.MAX_ZOOM, zoom)\n    );\n    this._viewport.update(current => ({ ...current, zoom: clampedZoom }));\n  }\n\n  setUI(ui: Partial<UIState>): void {\n    this._ui.update(current => ({ ...current, ...ui }));\n  }\n\n  togglePanel(panel: 'left' | 'right'): void {\n    if (panel === 'left') {\n      this._ui.update(ui => ({ ...ui, left_panel_open: !ui.left_panel_open }));\n    } else {\n      this._ui.update(ui => ({ ...ui, right_panel_open: !ui.right_panel_open }));\n    }\n  }\n\n  setSelectedTab(tab: UIState['selected_tab']): void {\n    this._ui.update(ui => ({ ...ui, selected_tab: tab }));\n  }\n\n  setPropertyTab(tab: UIState['property_tab']): void {\n    this._ui.update(ui => ({ ...ui, property_tab: tab }));\n  }\n\n  setError(error: string | null): void {\n    this._ui.update(ui => ({ ...ui, error }));\n  }\n\n  /**\n   * Runtime effects of page events — property/visibility/disabled overrides and\n   * loading flags. They describe what a page did while someone drove it, never\n   * what it was authored as, so they are dropped whenever the page restarts or\n   * the designer is entered or left. Left in place they read as the saved value:\n   * a `set-property` fired in view mode kept painting the canvas after the\n   * switch back to edit, hiding the property the page actually stores.\n   */\n  private clearRuntimeOverrides(): void {\n    this._fieldVisibilityOverrides.set(new Map());\n    this._fieldDisabledOverrides.set(new Map());\n    this._componentVisibilityOverrides.set(new Map());\n    this._componentPropertyOverrides.set(new Map());\n    this._componentDisabledStates.set(new Map());\n    this._componentLoadingStates.set(new Map());\n  }\n\n  toggleEditMode(): void {\n    this._editMode.update(mode => !mode);\n    this.clearRuntimeOverrides();\n  }\n\n  setEditMode(mode: boolean): void {\n    if (this._editMode() === mode) return;\n    this._editMode.set(mode);\n    this.clearRuntimeOverrides();\n  }\n\n  setLoading(loading: boolean): void {\n    this._ui.update(ui => ({ ...ui, loading }));\n  }\n\n  findComponentInTree(components: EruComponent[], componentId: string): EruComponent | null {\n    for (const comp of components) {\n      if (comp.id === componentId) return comp;\n      if (comp.children) {\n        const found = this.findComponentInTree(comp.children, componentId);\n        if (found) return found;\n      }\n    }\n    return null;\n  }\n\n  private flattenComponentTree(components: EruComponent[]): EruComponent[] {\n    const result: EruComponent[] = [];\n    for (const comp of components) {\n      result.push(comp);\n      if (comp.children?.length) {\n        result.push(...this.flattenComponentTree(comp.children));\n      }\n    }\n    return result;\n  }\n\n  private moveComponentBeforeTargetInTree(\n    components: EruComponent[],\n    sourceId: string,\n    targetId: string\n  ): EruComponent[] | null {\n    let sourceComponent: EruComponent | null = null;\n\n    const extractComponent = (comps: EruComponent[]): EruComponent[] => {\n      return comps\n        .filter(comp => {\n          if (comp.id === sourceId) {\n            sourceComponent = { ...comp };\n            return false;\n          }\n          return true;\n        })\n        .map(comp => comp.children?.length\n          ? { ...comp, children: extractComponent(comp.children) }\n          : comp\n        );\n    };\n\n    let updatedComponents = extractComponent(JSON.parse(JSON.stringify(components)));\n\n    if (!sourceComponent) return null;\n\n    const insertComponent = (comps: EruComponent[]): EruComponent[] => {\n      const result: EruComponent[] = [];\n      for (const comp of comps) {\n        if (comp.id === targetId) {\n          result.push(sourceComponent!);\n        }\n        result.push(comp.children?.length\n          ? { ...comp, children: insertComponent(comp.children) }\n          : comp);\n      }\n      return result;\n    };\n\n    return insertComponent(updatedComponents);\n  }\n\n  private addToContainer(\n    components: EruComponent[],\n    containerId: string,\n    newComponent: EruComponent,\n    index?: number\n  ): EruComponent[] | null {\n    for (const comp of components) {\n      if (comp.id === containerId) {\n        const existingChildren = comp.children || [];\n        const newChildren = [...existingChildren];\n        if (index !== undefined) {\n          newChildren.splice(index, 0, newComponent);\n        } else {\n          newChildren.push(newComponent);\n        }\n        return components.map(c =>\n          c.id === containerId ? { ...c, children: newChildren } : c\n        );\n      }\n      if (comp.children) {\n        const result = this.addToContainer(comp.children, containerId, newComponent, index);\n        if (result !== null) {\n          return components.map(c =>\n            c.id === comp.id ? { ...c, children: result } : c\n          );\n        }\n      }\n    }\n    return null;\n  }\n\n  private updateComponentInTree(\n    components: EruComponent[],\n    componentId: string,\n    updates: Partial<EruComponent>\n  ): EruComponent[] {\n    return components.map(component => {\n      if (component.id === componentId) {\n        return { ...component, ...updates };\n      } else if (component.children) {\n        return {\n          ...component,\n          children: this.updateComponentInTree(component.children, componentId, updates)\n        };\n      }\n      return component;\n    });\n  }\n\n  /**\n   * A declared state variable's starting value.\n   *\n   * Literal in every case except a date anchor (`@current_date - 7`,\n   * `@first_day`), which is resolved at mount so a page can start from a date\n   * relative to today — the same thing the date control's Default Date offers a\n   * field, expressed the same way.\n   *\n   * Deliberately narrow: only a recognised anchor is evaluated, so an initial\n   * that merely happens to start with '@' stays the literal string it was.\n   * Full expression support would also be near-useless here — initials are\n   * resolved before page data exists, so a `@field` reference has nothing to\n   * read.\n   */\n  private resolveStateInitial(initial: any): any {\n    if (!LogicEvaluatorService.hasDateKeyword(initial)) return parseJsonValue(initial) ?? null;\n    const resolved = this.logicEvaluator()?.evaluateValue(String(initial));\n    return resolved ?? null;\n  }\n\n  /**\n   * Apply a declared Initial Value to the running page state now.\n   *\n   * initPageState deliberately lets an existing runtime value win per key, so a\n   * re-render (or a stub page def arriving before the full one) never discards\n   * what the user or an action put there. That rule is wrong for an authoring\n   * edit: changing Initial Value in the designer is an explicit instruction to\n   * use the new value, and without this the panel kept showing the old one\n   * until the page was saved and reloaded. Date anchors resolve here too, so\n   * `@current_date - 7` shows its date the moment the variable is saved.\n   */\n  applyStateInitial(key: string, initial: any, pageId?: string): void {\n    const pid = pageId || this._currentPage()?.id;\n    if (!pid || !key) return;\n    const value = this.resolveStateInitial(initial);\n    this._pageState.update(m => {\n      const next = new Map(m);\n      next.set(pid, { ...(next.get(pid) || {}), [key]: value });\n      return next;\n    });\n    this._pageStateInitials.update(m => {\n      const next = new Map(m);\n      next.set(pid, { ...(next.get(pid) || {}), [key]: value });\n      return next;\n    });\n  }\n\n  /**\n   * True while `pageId`'s controls are still seeding its state on load.\n   *\n   * Read as a signal, so an effect that returns early on a settling page\n   * re-runs by itself the moment the page is settled and can then do its work\n   * with the finished state.\n   */\n  isPageSettling(pageId?: string): boolean {\n    const pid = pageId || this._currentPage()?.id;\n    if (!pid) return false;\n    if (this._pagesSettling().has(pid)) return true;\n    const parent = this._parentStore();\n    return parent ? parent.isPageSettling(pid) : false;\n  }\n\n  /**\n   * Mark a page as loading and start the quiet-period countdown. Called when\n   * the page's state is initialised — i.e. before any control has mounted.\n   */\n  beginPageSettle(pageId: string): void {\n    if (!pageId) return;\n    if (!this._pagesSettling().has(pageId)) {\n      this._pagesSettling.update(set => {\n        const next = new Set(set);\n        next.add(pageId);\n        return next;\n      });\n    }\n    this.pageSettleDeadlines.set(pageId, Date.now() + EruStudioStore.PAGE_SETTLE_MAX_MS);\n    this.schedulePageSettled(pageId);\n  }\n\n  /**\n   * (Re)arm the quiet-period timer. Each seeding write pushes the end of the\n   * window back, so the page is declared loaded only once the writes stop —\n   * but never past the deadline `beginPageSettle` set.\n   */\n  private schedulePageSettled(pageId: string): void {\n    const existing = this.pageSettleTimers.get(pageId);\n    if (existing) clearTimeout(existing);\n    const deadline = this.pageSettleDeadlines.get(pageId) ?? 0;\n    const wait = Math.max(0, Math.min(EruStudioStore.PAGE_SETTLE_QUIET_MS, deadline - Date.now()));\n    this.pageSettleTimers.set(pageId, setTimeout(() => this.endPageSettle(pageId), wait));\n  }\n\n  /** Keep the current page's load window open for an app-state write. */\n  private extendPageSettleForCurrentPage(): void {\n    const pid = this._currentPage()?.id;\n    if (pid && this._pagesSettling().has(pid)) this.schedulePageSettled(pid);\n  }\n\n  /** Declare the page loaded: gated readers re-run from here on. */\n  private endPageSettle(pageId: string): void {\n    const timer = this.pageSettleTimers.get(pageId);\n    if (timer) clearTimeout(timer);\n    this.pageSettleTimers.delete(pageId);\n    this.pageSettleDeadlines.delete(pageId);\n    if (!this._pagesSettling().has(pageId)) return;\n    this._pagesSettling.update(set => {\n      const next = new Set(set);\n      next.delete(pageId);\n      return next;\n    });\n  }\n\n  initPageState(page: EruPage, pageId?: string): void {\n    const pid = pageId || page.id;\n    page.id = pid;\n    // The controls have not mounted yet, so this is the moment the load burst\n    // starts. Everything they seed from here lands inside the settling window.\n    this.beginPageSettle(pid);\n    const initial: Record<string, any> = {};\n    for (const sv of (page.state || [])) {\n      initial[sv.key] = this.resolveStateInitial(sv.initial);\n    }\n    const existing = this._pageState().get(pid);\n    // Merge, don't bail: when the page first renders from a lightweight stub\n    // (no/partial state) and the full def arrives later, the declared state\n    // initials must still be seeded. Add any state keys missing from the\n    // existing runtime state, but never overwrite a value already present\n    // (a runtime change the user/actions made). `existing` wins per-key;\n    // `initial` fills the gaps.\n    //\n    // Two more layers on top, lowest precedence first:\n    //  - a retained snapshot from a previous visit (see capturePageStateSnapshot)\n    //  - route params matching declared state keys, written by a\n    //    `navigate-to-page` action's nav_params. The caller's explicit\n    //    navigation intent outranks both the initials and where the user\n    //    happened to be last time.\n    const snapshot = this.takeRetainedPageState(pid);\n    const routeSeed = this.routeSeedForPage(page);\n    const mergedState = { ...initial, ...(existing || {}), ...(snapshot?.state || {}), ...routeSeed };\n    this._pageState.update(m => {\n      const next = new Map(m);\n      next.set(pid, mergedState);\n      return next;\n    });\n    if (snapshot) this.restoreRetainedPageData(pid, snapshot);\n    // Keep the initials snapshot complete (used by the 'reset' formula) —\n    // declared initials win here since it must reflect the design-time defaults.\n    this._pageStateInitials.update(m => {\n      const next = new Map(m);\n      next.set(pid, { ...(next.get(pid) || {}), ...initial });\n      return next;\n    });\n  }\n\n  /**\n   * Values for this page's declared state variables that are present as URL\n   * query params — how a `navigate-to-page` action's `nav_params` reach the\n   * target page. The URL is the transport precisely because it crosses the\n   * store boundary a nav_outlet mount creates, and survives refresh and Back.\n   *\n   * Only declared state keys are read, so unrelated query params (`page`,\n   * `view`, host app params) never leak into page state.\n   */\n  private routeSeedForPage(page: EruPage): Record<string, any> {\n    const declared = page.state || [];\n    // Consume the handover slot even with nothing declared, so a stale entry\n    // never leaks into a later mount of the same page id.\n    const pending = this.takePendingNavParams(page.id);\n    if (declared.length === 0) return {};\n    // Pending params win over the URL: they are this navigation's values, while\n    // the URL may not have caught up yet (or may still hold the previous ones).\n    const params = { ...this.routeService.routeParams(), ...pending };\n    const seed: Record<string, any> = {};\n    for (const sv of declared) {\n      const raw = params[sv.key];\n      if (raw === undefined) continue;\n      seed[sv.key] = this.decodeRouteParamValue(raw, sv.initial);\n    }\n    return seed;\n  }\n\n  /**\n   * Query params are always strings. Coerce back using the declared initial as\n   * the type hint, so a numeric state var doesn't silently become a string —\n   * and leave everything else alone (ids like \"007\" or \"12345678901234567890\"\n   * must survive verbatim).\n   */\n  private decodeRouteParamValue(raw: string, initial: any): any {\n    if (raw.startsWith(NAV_PARAM_JSON_PREFIX)) {\n      try {\n        return JSON.parse(raw.slice(NAV_PARAM_JSON_PREFIX.length));\n      } catch {\n        return raw;\n      }\n    }\n    if (typeof initial === 'number') {\n      const n = Number(raw);\n      return Number.isNaN(n) ? raw : n;\n    }\n    if (typeof initial === 'boolean') return raw === 'true';\n    if (initial !== null && typeof initial === 'object') return parseJsonValue(raw);\n    return raw;\n  }\n\n  /** Put back the data half of a retained snapshot (state is merged by the caller). */\n  private restoreRetainedPageData(pid: string, snapshot: RetainedPageState): void {\n    if (snapshot.instance_state) {\n      this._pageInstanceState.update(m => {\n        const next = new Map(m);\n        next.set(pid, new Map(snapshot.instance_state!));\n        return next;\n      });\n    }\n    if (snapshot.page_data) {\n      this._pageData.update(m => {\n        const next = new Map(m);\n        next.set(pid, snapshot.page_data!);\n        return next;\n      });\n    }\n    if (snapshot.page_data_array) {\n      this._pageDataArray.update(m => {\n        const next = new Map(m);\n        next.set(pid, snapshot.page_data_array!);\n        return next;\n      });\n    }\n  }\n\n  getPageStateValue(key: string, pageId?: string, dataKey?: string): any {\n    const pid = pageId || this._currentPage()?.id;\n    if (!pid) return undefined;\n    // A key linked to a same-named parent variable is page-level shared state\n    // (never per-row), so the parent's value wins over any loop instance\n    // overlay — otherwise a looped nested page would read a stale per-row copy.\n    if (this.isStateKeyLinkedToParent(pid, key)) {\n      return this.computedPageState()[key];\n    }\n    if (dataKey) {\n      const overlay = this._pageInstanceState().get(pid)?.get(dataKey);\n      if (overlay && key in overlay) return overlay[key];\n    }\n    return this._pageState().get(pid)?.[key] ?? undefined;\n  }\n\n  /**\n   * Write a runtime state value.\n   *\n   * `declare: false` writes the value but leaves the page's declared `state`\n   * list alone. A caller that writes purely to show something on the canvas —\n   * a chip list seeding its default selection while the page is being edited —\n   * must not add a state variable to the page as a side effect, or opening a\n   * page in the designer would dirty it.\n   */\n  setPageStateValue(key: string, value: any, pageId?: string, dataKey?: string, options?: { declare?: boolean }): void {\n    let pid = pageId || this._currentPage()?.id;\n    if (!pid) return;\n    // Linked page-level shared state redirects to the parent page state\n    // REGARDLESS of a loop dataKey. A looped nested page (e.g. a list of doc\n    // cards) still shares selected_* with its parent; writing per-row instance\n    // state here would strand the value and never reach the parent.\n    if (this.isStateKeyLinkedToParent(pid, key)) {\n      pid = this._currentPage()!.id;\n      dataKey = undefined;\n    }\n    if (dataKey) {\n      this._pageInstanceState.update(m => {\n        const next = new Map(m);\n        const pageMap = new Map(next.get(pid) || new Map<string, Record<string, any>>());\n        const inst = { ...(pageMap.get(dataKey) || {}) };\n        inst[key] = value;\n        pageMap.set(dataKey, inst);\n        next.set(pid, pageMap);\n        return next;\n      });\n      return;\n    }\n    this._pageState.update(m => {\n      const next = new Map(m);\n      const existing = { ...(next.get(pid) || {}) };\n      existing[key] = value;\n      next.set(pid, existing);\n      return next;\n    });\n    // A write during the load burst pushes the quiet period back, so the page\n    // is not called loaded while controls are still seeding themselves.\n    if (this._pagesSettling().has(pid)) this.schedulePageSettled(pid);\n    const page = this._currentPage();\n    if (page && page.id === pid && options?.declare !== false) {\n      const declared = (page.state || []).some(sv => sv.key === key);\n      if (!declared) {\n        const updated = [...(page.state || []), { key, initial: value ?? null }];\n        this.updatePage({ state: updated });\n      }\n    }\n  }\n\n  processApiResult(\n    apiResult: any,\n    subscription: { on_success?: ComponentEventSubscription[]; on_error?: ComponentEventSubscription[]; error_field?: string; error_state_key?: string; success_message?: string; error_message?: string; },\n    pageId?: string,\n    dataKey?: string\n  ): { isError: boolean; errorMessage: string } {\n    const errorField = (subscription.error_field || '').trim();\n    const errorStateKey = (subscription.error_state_key || '').trim();\n    let errorMsg = '';\n    let isError = false;\n    if (errorField) {\n      errorMsg = (apiResult && typeof apiResult === 'object' && !Array.isArray(apiResult) && (apiResult as any)[errorField]) || '';\n      isError = !!errorMsg;\n    }\n    if (errorStateKey) {\n      this.setPageStateValue(errorStateKey, isError ? String(errorMsg || '') : '', pageId, dataKey);\n    }\n    // Only what the author wrote is announced. A call with neither message\n    // filled in stays silent, which is how every call behaved before this.\n    //\n    // A call that never reached the server is an error whether or not an Error\n    // Field was configured: the host hands the failure over as `{ error: ... }`,\n    // and without this a transport failure would announce the SUCCESS message.\n    // Kept to the notice — `on_error` still runs only on the author's own\n    // Error Field, so no existing page starts taking a different branch.\n    const failed = isError\n      || (!errorField\n        && !!apiResult\n        && typeof apiResult === 'object'\n        && !Array.isArray(apiResult)\n        && !!(apiResult as any)['error']);\n    const notice = (failed ? subscription.error_message : subscription.success_message) || '';\n    if (notice.trim()) {\n      this.setServerValidationNotice({\n        componentId: '',\n        field_name: '',\n        status: failed ? 'error' : 'success',\n        msg: notice,\n      });\n    }\n    if (!isError && subscription.on_success && subscription.on_success.length > 0) {\n      this.processApiResponseActions(subscription.on_success, pageId, dataKey, apiResult);\n    }\n    if (isError && subscription.on_error && subscription.on_error.length > 0) {\n      this.processApiResponseActions(subscription.on_error, pageId, dataKey, apiResult);\n    }\n    return { isError, errorMessage: String(errorMsg || '') };\n  }\n\n  /**\n   * `eventRecord` is the payload of the event that asked for the write — for a\n   * value change, the field that changed and its new value. It is consulted\n   * only where page data has no answer, which is the case that made a\n   * state-bound control wipe the very variable it had just set: the control\n   * keeps its value in page STATE, so `set-from-field` read page data, found\n   * nothing, and wrote undefined over it.\n   */\n  updateStateWithFormula(key: string, formula: UpdateStateFormula, pageId?: string, dataKey?: string, scope: 'page' | 'app' = 'page', recordOverride?: { entity_id: string; entity_data: Record<string, any> } | null, eventRecord?: { entity_id?: string; entity_data?: Record<string, any> } | null): void {\n    const isApp = scope === 'app';\n    const pid = pageId || this._currentPage()?.id;\n    // App-scoped writes are page-independent, but the formulas that read page\n    // data (`set-from-field`, `reset`) still need a page for their source.\n    if (!pid && !isApp) return;\n    const overlay = (!isApp && dataKey && pid) ? this._pageInstanceState().get(pid)?.get(dataKey) : undefined;\n    const current = isApp\n      ? this.getAppStateValue(key)\n      : (overlay && key in overlay) ? overlay[key] : this._pageState().get(pid!)?.[key];\n    let next: any = current;\n\n    switch (formula.fn) {\n      case 'set':\n        next = formula.value;\n        break;\n      case 'increment':\n        next = (parseFloat(current) || 0) + (formula.by ?? 1);\n        break;\n      case 'decrement':\n        next = (parseFloat(current) || 0) - (formula.by ?? 1);\n        break;\n      case 'toggle':\n        next = !current;\n        break;\n      case 'expr': {\n        // Handled here rather than only at the call sites that knew about it:\n        // base-component and applyUpdateStateAction each evaluated `expr`\n        // themselves before delegating, so an Expression written on an\n        // on_success/on_error action or a page on_load event fell through to\n        // this switch, matched nothing, and kept the variable's current value —\n        // silently doing nothing while looking correctly configured.\n        if (!formula.expr || !formula.expr.trim()) break;\n        next = this.logicEvaluator()?.evaluateValue(formula.expr, pid, dataKey || undefined);\n        break;\n      }\n      case 'reset': {\n        const initials = pid ? this._pageStateInitials().get(pid) : undefined;\n        if (initials && key in initials) {\n          next = initials[key];\n        } else {\n          const page = this._currentPage();\n          const sv = page?.state?.find(s => s.key === key);\n          next = sv?.initial ?? null;\n        }\n        break;\n      }\n      case 'set-from-field': {\n        // Special sources: the whole page record (entity_data object) or the\n        // record id (entity_id), in addition to individual fields. In a looped\n        // nested page the record is the specific row (resolved via dataKey),\n        // not the page-level record. `recordOverride` carries a row that lives\n        // outside page data — a board card's row (see RowDataContext.getRecord).\n        const record = recordOverride ?? this.getPageRecord(pid, dataKey);\n        if (formula.field === '$record') {\n          // Both halves together, so a state variable can carry the record's\n          // identity as well as its fields — what a page_ref sourced from state\n          // needs to set page data with a usable entity_id.\n          next = { entity_id: record?.entity_id ?? '', entity_data: record?.entity_data ?? {} };\n        } else if (formula.field === '$entity_data') {\n          next = record?.entity_data ?? {};\n        } else if (formula.field === '$entity_id') {\n          next = record?.entity_id ?? '';\n        } else if (formula.field) {\n          // A named field sits on the same record the branches above resolve.\n          // Inside an array-nested page_ref that is the row, and page data holds\n          // it under \"<index>.<field>\" — asking `getPageFieldData` for the bare\n          // name there answers with the whole row array, so a panel mounted as\n          // an array ref wrote junk (or nothing) into state while the same page\n          // opened standalone worked. Go through the record whenever one is\n          // scoped, and keep the page-level read for the unscoped case.\n          next = (recordOverride || dataKey)\n            ? this.resolveStatePath(record?.entity_data, formula.field)\n            : this.getPageFieldData(formula.field, pid);\n          // Page data is silent about a field whose Value Source is Page State\n          // or App State — that value lives in state, under a key the formula\n          // does not name. The event that triggered this carries the field and\n          // its new value, so ask it before giving up.\n          if (next === undefined && eventRecord?.entity_data) {\n            next = this.resolveStatePath(eventRecord.entity_data, formula.field);\n          }\n          // Still nothing: the field this formula copies does not exist here.\n          // Leave the variable alone. Writing undefined emptied a variable the\n          // control itself had just written, which broke every dependent that\n          // read it (a cascading dropdown's query sent no parent id at all).\n          if (next === undefined) return;\n        }\n        break;\n      }\n    }\n\n    this.writeStateValue(key, next, scope, pid, dataKey);\n  }\n\n  /**\n   * Single entry point for state writes so every `update-state` call site\n   * honours `state_scope` without repeating the branch.\n   */\n  writeStateValue(key: string, value: any, scope: 'page' | 'app' | undefined, pageId?: string, dataKey?: string): void {\n    if (scope === 'app') this.setAppStateValue(key, value);\n    else this.setPageStateValue(key, value, pageId, dataKey);\n  }\n\n  private removeComponentFromTree(components: EruComponent[], componentId: string): EruComponent[] {\n    return components\n      .filter(component => component.id !== componentId)\n      .map(component => {\n        if (component.children) {\n          return {\n            ...component,\n            children: this.removeComponentFromTree(component.children, componentId)\n          };\n        }\n        return component;\n      });\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, delay } from 'rxjs';\nimport { APP_CONSTANTS } from '../constants/app-constants';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class EruApiService {\n  private baseUrl = APP_CONSTANTS.API_BASE_URL;\n\n  constructor() {}\n\n  // Asset operations\n  uploadImage(file: File): Observable<{ url: string }> {\n    // Mock file upload - in reality, this would upload to a server\n    return new Observable<{ url: string }>(observer => {\n      const reader = new FileReader();\n      reader.onload = (event) => {\n        const url = event.target?.result as string;\n        // In a real implementation, you'd upload to a server and get back a URL\n        observer.next({ url });\n        observer.complete();\n      };\n      reader.onerror = () => {\n        observer.error(new Error('Failed to read file'));\n      };\n      reader.readAsDataURL(file);\n    }).pipe(delay(1000));\n  }\n}","import { Injectable, Type, signal, computed } from '@angular/core';\nimport { PropertySchema } from '../models';\nimport { StyleSchema } from '../components/base-component/base-component';\n\n@Injectable()\nexport class ComponentSchemaService {\n  private componentSchemas = new Map<string, {\n    propertySchema: PropertySchema[];\n    styleSchema: StyleSchema[];\n    componentEvents: { label: string, value: string }[];\n  }>();\n\n  // Signal to track registered component types\n  private _registeredTypes = signal<Set<string>>(new Set());\n\n  // Register component schema\n  registerComponentSchema(\n    componentType: string,\n    propertySchema: PropertySchema[],\n    styleSchema: StyleSchema[],\n    componentEvents: { label: string, value: string }[] = []\n  ): void {\n    // Check if component is already registered\n    if (this.componentSchemas.has(componentType)) {\n      return;\n    }\n    this.componentSchemas.set(componentType, {\n      propertySchema,\n      styleSchema,\n      componentEvents\n    });\n\n    // Update the signal to notify that this component type is now registered\n    const currentTypes = this._registeredTypes();\n    const newTypes = new Set(currentTypes);\n    newTypes.add(componentType);\n    this._registeredTypes.set(newTypes);\n  }\n\n  // Get property schema for a component type\n  getPropertySchema(componentType: string): PropertySchema[] {\n    return this.componentSchemas.get(componentType)?.propertySchema || [];\n  }\n\n  // Get style schema for a component type\n  getStyleSchema(componentType: string): StyleSchema[] {\n    const schema = this.componentSchemas.get(componentType);\n    return schema?.styleSchema || [];\n  }\n\n  // Get component events for a component type\n  getComponentEvents(componentType: string): { label: string, value: string }[] {\n    const schema = this.componentSchemas.get(componentType);\n    return schema?.componentEvents || [];\n  }\n\n  // Get all schemas for a component type\n  getAllSchemas(componentType: string): {\n    propertySchema: PropertySchema[];\n    styleSchema: StyleSchema[];\n  } {\n    const schema = this.componentSchemas.get(componentType);\n    return schema || { propertySchema: [], styleSchema: [] };\n  }\n\n  // Get all registered component types\n  getRegisteredComponentTypes(): string[] {\n    return Array.from(this.componentSchemas.keys());\n  }\n\n  // Computed signal to check if a component type is registered\n  isComponentRegistered(componentType: string) {\n    return computed(() => this._registeredTypes().has(componentType));\n  }\n\n  // Get the registered types signal for monitoring\n  get registeredTypes() {\n    return this._registeredTypes.asReadonly();\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { TailwindBreakpoint, ResponsiveClasses, ResponsiveStyleProperties, StyleProperties } from '../models';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class PropertyToTailwindService {\n\n  // Convert style properties to responsive properties\n  convertFlatStylePropertiesToResponsive(flatProps: StyleProperties): ResponsiveStyleProperties {\n    return {\n      base: { ...flatProps }\n    };\n  }\n\n  // Generate Tailwind classes from style properties\n  generateClassesFromStyleProperties(styleProps: ResponsiveStyleProperties): ResponsiveClasses {\n    const responsive_classes: ResponsiveClasses = {};\n\n    if (styleProps.base) {\n      responsive_classes.base = this.generateClassesForBreakpoint(styleProps.base);\n    }\n\n    const breakpoints: TailwindBreakpoint[] = ['sm', 'md', 'lg', 'xl', '2xl'];\n    for (const bp of breakpoints) {\n      if (styleProps[bp]) {\n        responsive_classes[bp] = this.generateClassesForBreakpoint(styleProps[bp]);\n      }\n    }\n\n    return responsive_classes;\n  }\n\n  // Convert style properties to CSS (for inline styles)\n  convertStylePropertiesToCSS(styleProps: Record<string, any>): Record<string, any> {\n\n    const css: Record<string, any> = {};\n\n    for (const [key, value] of Object.entries(styleProps)) {\n      if (value !== undefined && value !== null && value !== '') {\n        const cssProperty = this.getCSSProperty(key, value);\n        if (cssProperty) {\n          css[cssProperty.property] = cssProperty.value;\n        }\n      }\n    }\n    return css;\n  }\n\n  // Whether getCSSProperty knows how to turn this style key into CSS. Keys it\n  // does not know are dropped silently during rendering, so the properties\n  // panel uses this to flag them instead of showing an edit that does nothing.\n  isRenderableStyleKey(key: string): boolean {\n    return this.getCSSProperty(key, '__probe__') !== null;\n  }\n\n  // Get CSS property name and value from style property\n  private getCSSProperty(key: string, value: any): { property: string; value: string } | null {\n    switch (key) {\n      case 'font_size':\n        return { property: 'font-size', value: `${value}px` };\n      case 'font_weight':\n        return { property: 'font-weight', value: value };\n      case 'text_align':\n        return { property: 'text-align', value: value };\n      case 'color':\n        return { property: 'color', value: value };\n      case 'background_color':\n        return { property: 'background-color', value: value };\n      case 'background':\n        return { property: 'background', value: value };\n      case 'padding':\n        return { property: 'padding', value: `${value}px` };\n      case 'margin':\n        return { property: 'margin', value: `${value}px` };\n      case 'gap':\n        return { property: 'gap', value: `${value}px` };\n      case 'width': {\n        if (value === 'auto' || value === '' || value === null || value === undefined) {\n          return null;\n        }\n        const numW = Number(value);\n        const resolvedWidth = (!isNaN(numW) && value !== '') ? `${numW}px` : String(value);\n        return { property: 'width', value: resolvedWidth };\n      }\n      case 'height': {\n        if (value === 'auto' || value === '' || value === null || value === undefined) {\n          return null;\n        }\n        const numH = Number(value);\n        const resolvedHeight = (!isNaN(numH) && value !== '') ? `${numH}px` : String(value);\n        return { property: 'height', value: resolvedHeight };\n      }\n      case 'border_width':\n        return { property: 'border-width', value: `${value}px` };\n      case 'border_style':\n        return { property: 'border-style', value: value };\n      case 'border_color':\n        return { property: 'border-color', value: value };\n      case 'border_radius':\n        return { property: 'border-radius', value: `${value}px` };\n      case 'line_height':\n        return { property: 'line-height', value: value };\n      case 'letter_spacing':\n        return { property: 'letter-spacing', value: `${value}px` };\n      case 'font_family':\n        return { property: 'font-family', value: value };\n      case 'opacity':\n        return { property: 'opacity', value: value };\n      case 'box_shadow':\n        return { property: 'box-shadow', value: value };\n      case 'text_shadow':\n        return { property: 'text-shadow', value: value };\n      case 'display':\n        return { property: 'display', value: value };\n      case 'position':\n        return { property: 'position', value: value };\n      case 'z_index':\n        return { property: 'z-index', value: value };\n      case 'background_image':\n        return { property: 'background-image', value: `url(${value})` };\n      case 'background_size':\n        return { property: 'background-size', value: value };\n      case 'background_position':\n        return { property: 'background-position', value: value };\n      case 'background_repeat':\n        return { property: 'background-repeat', value: value };\n      // Add more mappings as needed\n      default:\n        return null;\n    }\n  }\n  private propertyMap: Record<string, (value: any) => string> = {\n    font_size: (v) => this.getFontSizeClass(v),\n    font_weight: (v) => this.getFontWeightClass(v),\n    text_align: (v) => this.getTextAlignClass(v),\n    color: (v) => this.getColorClass(v),\n    background_color: (v) => this.getBackgroundColorClass(v),\n    background: (v) => this.getBackgroundColorClass(v),\n    padding: (v) => v ? `p-${this.pxToSpacing(v)}` : '',\n    margin: (v) => v ? `m-${this.pxToSpacing(v)}` : '',\n    gap: (v) => v ? `gap-${this.pxToSpacing(v)}` : '',\n    direction: (v) => v === 'column' ? 'flex-col' : 'flex-row',\n    justify_content: (v) => this.getJustifyClass(v),\n    align_items: (v) => this.getAlignClass(v),\n    wrap: (v) => v ? 'flex-wrap' : 'flex-nowrap',\n    columns: (v) => '',\n    rows: (v) => '',\n    width: (v) => v ? `w-${v}` : '',\n    height: (v) => v ? `h-${v}` : '',\n    border: (v) => v ? `border-${v}` : '',\n    border_radius: (v) => v ? `rounded-${this.pxToSpacing(v)}` : '',\n    rounded: (v) => v ? `rounded-${v}` : '',\n    shadow: (v) => v ? `shadow-${v}` : ''\n  };\n\n  generateClassesForBreakpoint(properties: Record<string, any>): string {\n    const classes: string[] = [];\n\n    for (const [key, value] of Object.entries(properties)) {\n      if (value !== undefined && value !== null && value !== '') {\n        const mapFn = this.propertyMap[key];\n        if (mapFn) {\n          const className = mapFn(value);\n          if (className) {\n            classes.push(className);\n          }\n        }\n      }\n    }\n\n    return classes.filter(Boolean).join(' ');\n  }\n\n  generateResponsiveClasses(properties: ResponsiveStyleProperties): ResponsiveClasses {\n    const responsive_classes: ResponsiveClasses = {};\n    if (properties.base) {\n      responsive_classes.base = this.generateClassesForBreakpoint(properties.base);\n    }\n\n    const breakpoints: TailwindBreakpoint[] = ['sm', 'md', 'lg', 'xl', '2xl'];\n    for (const bp of breakpoints) {\n      if (properties[bp]) {\n        responsive_classes[bp] = this.generateClassesForBreakpoint(properties[bp]);\n      }\n    }\n\n    return responsive_classes;\n  }\n\n  combineAllClasses(styles: {\n    classes: string;\n    responsive_classes: ResponsiveClasses\n  }): string {\n    const parts: string[] = [];\n\n    if (styles.classes) {\n      parts.push(styles.classes);\n    }\n\n    if (styles.responsive_classes?.base) {\n      parts.push(styles.responsive_classes.base);\n    }\n\n    const breakpoints: TailwindBreakpoint[] = ['sm', 'md', 'lg', 'xl', '2xl'];\n    for (const bp of breakpoints) {\n      if (styles.responsive_classes?.[bp]) {\n        const prefixed = styles.responsive_classes[bp]!\n          .split(' ')\n          .map((cls: string) => cls ? `${bp}:${cls}` : '')\n          .filter(Boolean)\n          .join(' ');\n        if (prefixed) parts.push(prefixed);\n      }\n    }\n    return parts.filter(Boolean).join(' ');\n  }\n\n  getPropertyValueForBreakpoint(\n    properties: ResponsiveStyleProperties,\n    propertyKey: string,\n    breakpoint: TailwindBreakpoint | 'base',\n    useFallback: boolean = true\n  ): any {\n    if (!properties) {\n      return undefined;\n    }\n    if (properties[breakpoint]?.[propertyKey] !== undefined) {\n      return properties[breakpoint]![propertyKey];\n    }\n    if (!useFallback) {\n      return undefined;\n    }\n    if (breakpoint !== 'base' && properties.base?.[propertyKey] !== undefined) {\n      return properties.base[propertyKey];\n    }\n    return undefined;\n  }\n\n  private getFontSizeClass(px: number): string {\n    const sizeMap: Record<number, string> = {\n      12: 'text-xs',\n      14: 'text-sm',\n      16: 'text-base',\n      18: 'text-lg',\n      20: 'text-xl',\n      24: 'text-2xl',\n      30: 'text-3xl',\n      36: 'text-4xl',\n      48: 'text-5xl',\n      60: 'text-6xl',\n      72: 'text-7xl',\n      96: 'text-8xl',\n      128: 'text-9xl'\n    };\n    return sizeMap[px] || '';\n  }\n\n  private getFontWeightClass(weight: number | string): string {\n    const weightMap: Record<string, string> = {\n      '100': 'font-thin',\n      '200': 'font-extralight',\n      '300': 'font-light',\n      '400': 'font-normal',\n      '500': 'font-medium',\n      '600': 'font-semibold',\n      '700': 'font-bold',\n      '800': 'font-extrabold',\n      '900': 'font-black',\n      'thin': 'font-thin',\n      'normal': 'font-normal',\n      'bold': 'font-bold'\n    };\n    return weightMap[String(weight)] || '';\n  }\n\n  private getTextAlignClass(align: string): string {\n    const alignMap: Record<string, string> = {\n      'left': 'text-left',\n      'center': 'text-center',\n      'right': 'text-right',\n      'justify': 'text-justify'\n    };\n    return alignMap[align] || '';\n  }\n\n  private getJustifyClass(value: string): string {\n    const map: Record<string, string> = {\n      'flex-start': 'justify-start',\n      'center': 'justify-center',\n      'flex-end': 'justify-end',\n      'space-between': 'justify-between',\n      'space-around': 'justify-around',\n      'space-evenly': 'justify-evenly'\n    };\n    return map[value] || '';\n  }\n\n  private getAlignClass(value: string): string {\n    const map: Record<string, string> = {\n      'flex-start': 'items-start',\n      'center': 'items-center',\n      'flex-end': 'items-end',\n      'stretch': 'items-stretch',\n      'baseline': 'items-baseline'\n    };\n    return map[value] || '';\n  }\n\n  private pxToSpacing(px: number): string {\n    const spacingMap: Record<number, string> = {\n      0: '0',\n      4: '1',\n      8: '2',\n      12: '3',\n      16: '4',\n      20: '5',\n      24: '6',\n      32: '8',\n      40: '10',\n      48: '12',\n      64: '16'\n    };\n    return spacingMap[px] || String(px / 4);\n  }\n\n  private getColorClass(color: string): string {\n    if (!color || color === 'transparent') return '';\n\n    // Handle hex colors - for now, we'll use arbitrary values\n    if (color.startsWith('#')) {\n      return `text-[${color}]`;\n    }\n\n    // Handle named colors\n    const colorMap: Record<string, string> = {\n      'black': 'text-black',\n      'white': 'text-white',\n      'red': 'text-red-500',\n      'blue': 'text-blue-500',\n      'green': 'text-green-500',\n      'yellow': 'text-yellow-500',\n      'purple': 'text-purple-500',\n      'pink': 'text-pink-500',\n      'gray': 'text-gray-500',\n      'indigo': 'text-indigo-500',\n      'orange': 'text-orange-500',\n      'teal': 'text-teal-500',\n      'cyan': 'text-cyan-500',\n      'lime': 'text-lime-500',\n      'emerald': 'text-emerald-500',\n      'violet': 'text-violet-500',\n      'fuchsia': 'text-fuchsia-500',\n      'rose': 'text-rose-500',\n      'slate': 'text-slate-500',\n      'zinc': 'text-zinc-500',\n      'neutral': 'text-neutral-500',\n      'stone': 'text-stone-500'\n    };\n\n    return colorMap[color.toLowerCase()] || `text-[${color}]`;\n  }\n\n  private getBackgroundColorClass(color: string): string {\n    if (!color || color === 'transparent') return '';\n\n    // Handle hex colors - for now, we'll use arbitrary values\n    if (color.startsWith('#')) {\n      return `bg-[${color}]`;\n    }\n\n    // Handle named colors\n    const colorMap: Record<string, string> = {\n      'black': 'bg-black',\n      'white': 'bg-white',\n      'red': 'bg-red-500',\n      'blue': 'bg-blue-500',\n      'green': 'bg-green-500',\n      'yellow': 'bg-yellow-500',\n      'purple': 'bg-purple-500',\n      'pink': 'bg-pink-500',\n      'gray': 'bg-gray-500',\n      'indigo': 'bg-indigo-500',\n      'orange': 'bg-orange-500',\n      'teal': 'bg-teal-500',\n      'cyan': 'bg-cyan-500',\n      'lime': 'bg-lime-500',\n      'emerald': 'bg-emerald-500',\n      'violet': 'bg-violet-500',\n      'fuchsia': 'bg-fuchsia-500',\n      'rose': 'bg-rose-500',\n      'slate': 'bg-slate-500',\n      'zinc': 'bg-zinc-500',\n      'neutral': 'bg-neutral-500',\n      'stone': 'bg-stone-500'\n    };\n\n    return colorMap[color.toLowerCase()] || `bg-[${color}]`;\n  }\n}\n","import { Injectable, signal, computed, effect } from '@angular/core';\nimport { FormGroup, FormControl, Validators, AbstractControl, ValidationErrors, ValidatorFn, FormArray } from '@angular/forms';\nimport { EruComponent, ValidationRule } from '../models';\nimport { EruStudioStore } from './eru-studio.store';\nimport { PropertyToTailwindService } from './property-to-tailwind.service';\nimport { ComponentSchemaService } from './component-schema.service';\nimport { LogicEvaluatorService } from './logic-evaluator.service';\n\nexport interface FormControlInfo {\n  componentId: string;\n  fieldName: string;\n  control: FormControl;\n}\n\nexport interface CustomValidator {\n  name: string;\n  validator: ValidatorFn;\n}\n\n@Injectable()\nexport class FormValidationService {\n  private forms = new Map<string, FormGroup>();\n  private formControls = new Map<string, Map<string, FormControlInfo>>();\n  private customValidators = new Map<string, CustomValidator>();\n\n  readonly formValid = signal<boolean>(true);\n  readonly formErrors = signal<Record<string, string[]>>({});\n\n  /**\n   * Bumped whenever a form-level check runs, so every field can refresh the\n   * message it shows.\n   *\n   * A field's `<mat-error>` text comes from its own `validationErrors` signal,\n   * which it refreshes from the control's `statusChanges`. A form-level check\n   * marks controls touched and revalidates with `emitEvent: false` — touching\n   * never emits a status change, and the flag suppresses the one revalidation\n   * would raise — so a field the user never touched turned red (Material reads\n   * the control directly) while its message stayed empty. A select is where\n   * this showed most: a text box usually gets a keystroke and, with it, a\n   * status change, while a dropdown left alone gets nothing.\n   *\n   * The flag itself stays: dropping it would emit `valueChanges` too, and the\n   * subscription behind that writes page data and announces a value change —\n   * pressing Save would fire every field's Value Change actions.\n   */\n  private readonly _validationTick = signal<number>(0);\n  readonly validationTick = this._validationTick.asReadonly();\n\n  constructor(\n    private store: EruStudioStore,\n    private tailwindService: PropertyToTailwindService,\n    private schemaService: ComponentSchemaService,\n    private logicEvaluator: LogicEvaluatorService\n  ) {\n    // Watch for page changes and sync the form status signals when switching pages\n    let lastPageId: string | null = null;\n    effect(() => {\n      const pageId = this.store.currentPage()?.id;\n      if (pageId && pageId !== lastPageId) {\n        lastPageId = pageId;\n        // Sync the global signals with the status of the current page's form\n        this.updateFormStatus(pageId);\n      }\n    });\n  }\n\n  initializeFormForPage(pageId: string): void {\n    if (!this.forms.has(pageId)) {\n      const form = new FormGroup({});\n      this.forms.set(pageId, form);\n      this.formControls.set(pageId, new Map());\n\n      // Subscribe to status changes to keep the service's signals in sync\n      // but only if this is currently the active page\n      form.statusChanges.subscribe(() => {\n        if (this.store.currentPage()?.id === pageId) {\n          this.updateFormStatus(pageId);\n        }\n      });\n    }\n  }\n\n  /*   reinitializeFormForPage(pageId: string = ''): void {\n      if (pageId === '') {\n        pageId = this.store.currentPage()?.id || '';\n      }\n      if (pageId) {\n        this.updateFormFromComponents(pageId);\n      }\n    } */\n\n  registerFormControl(component: EruComponent, pageId: string): FormControl | null {\n    const identifier = this.getPropertyValue(component, 'identifier');\n    const fieldName = this.getPropertyValue(component, 'name');\n\n    if (!identifier || !fieldName) {\n      return null;\n    }\n\n    if (!this.forms.has(pageId)) {\n      this.initializeFormForPage(pageId);\n    }\n\n    const form = this.forms.get(pageId)!;\n    const controls = this.formControls.get(pageId)!;\n\n    if (controls.has(component.id)) {\n      const existingControl = controls.get(component.id)!.control;\n      const newValidators = this.buildValidators(component);\n      existingControl.setValidators(newValidators);\n      existingControl.updateValueAndValidity();\n\n      const isDisabled = this.getPropertyValue(component, 'disabled');\n      if (isDisabled === true && existingControl.enabled) {\n        existingControl.disable({ emitEvent: false });\n      } else if (isDisabled === false && existingControl.disabled) {\n        existingControl.enable({ emitEvent: false });\n      }\n\n      this.updateFormStatus(pageId);\n      return existingControl;\n    }\n\n    const validators = this.buildValidators(component);\n    const initialValue = this.store.getPageFieldData(fieldName);\n    const isDisabled = this.getPropertyValue(component, 'disabled');\n    const control = new FormControl({ value: initialValue ?? null, disabled: isDisabled === true }, validators);\n\n    const parentGroup = this.getOrCreateParentGroup(form, fieldName);\n    const leafName = this.getLeafName(fieldName);\n    parentGroup.addControl(leafName, control);\n\n    controls.set(component.id, {\n      componentId: component.id,\n      fieldName,\n      control\n    });\n\n    this.updateFormStatus(pageId);\n    return control;\n  }\n\n  unregisterFormControl(componentId: string, pageId: string): void {\n    const controls = this.formControls.get(pageId);\n    if (!controls) return;\n\n    const controlInfo = controls.get(componentId);\n    if (!controlInfo) return;\n\n    const form = this.forms.get(pageId);\n    if (form) {\n      const parentGroup = this.getOrCreateParentGroup(form, controlInfo.fieldName);\n      const leafName = this.getLeafName(controlInfo.fieldName);\n      parentGroup.removeControl(leafName);\n    }\n\n    controls.delete(componentId);\n    this.updateFormStatus(pageId);\n  }\n\n  getFormControl(componentId: string, pageId: string): FormControl | null {\n    const controls = this.formControls.get(pageId);\n    if (!controls) return null;\n\n    const controlInfo = controls.get(componentId);\n    return controlInfo ? controlInfo.control : null;\n  }\n\n  getAllFormControls(pageId: string): FormControl[] {\n    const controls = this.formControls.get(pageId);\n    if (!controls) return [];\n\n    return Array.from(controls.values()).map(info => info.control);\n  }\n\n  getAllFormControlInfos(pageId: string): FormControlInfo[] {\n    const controls = this.formControls.get(pageId);\n    if (!controls) return [];\n\n    return Array.from(controls.values());\n  }\n\n  getFormControlsByFieldName(pageId: string): Map<string, FormControl> {\n    const controls = this.formControls.get(pageId);\n    if (!controls) return new Map();\n\n    const result = new Map<string, FormControl>();\n    controls.forEach(info => {\n      result.set(info.fieldName, info.control);\n    });\n\n    return result;\n  }\n\n  getForm(pageId: string = ''): FormGroup | null {\n    if (pageId === '') {\n      pageId = this.store.currentPage()?.id || '';\n    }\n    return this.forms.get(pageId) || null;\n  }\n\n  validateForm(pageId: string): boolean {\n    const controls = this.formControls.get(pageId);\n    if (!controls || controls.size === 0) return true;\n    const valid = this.validateControlInfos(Array.from(controls.values()));\n    this.updateFormStatus(pageId);\n    return valid;\n  }\n\n  validateFields(pageId: string, fieldNames: string[]): boolean {\n    const controls = this.formControls.get(pageId);\n    if (!controls || fieldNames.length === 0) return true;\n    const targets = Array.from(controls.values()).filter(info => fieldNames.includes(info.fieldName));\n    if (targets.length === 0) return true;\n    return this.validateControlInfos(targets);\n  }\n\n  // Hidden fields (visible: never, a false condition, or a hide-fields /\n  // hide-component override) are skipped: the user cannot fill what they\n  // cannot see, so a hidden mandatory field must not block the action.\n  private validateControlInfos(infos: FormControlInfo[]): boolean {\n    let allValid = true;\n    infos.forEach(info => {\n      if (!this.isComponentEffectivelyVisible(info.componentId)) return;\n      info.control.markAsTouched();\n      info.control.updateValueAndValidity({ emitEvent: false });\n      if (!info.control.disabled && info.control.invalid) allValid = false;\n    });\n    this._validationTick.update(n => n + 1);\n    return allValid;\n  }\n\n  private isComponentEffectivelyVisible(componentId: string): boolean {\n    const component = this.store.findComponentById(componentId);\n    if (!component) return true;\n    if (!this.checkComponentVisibility(component)) return false;\n    const seen = new Set<string>([componentId]);\n    let current = this.store.findParentComponent(componentId);\n    while (current) {\n      if (!this.checkComponentVisibility(current)) return false;\n      if (seen.has(current.id)) break;\n      seen.add(current.id);\n      current = this.store.findParentComponent(current.id);\n    }\n    return true;\n  }\n\n  private checkComponentVisibility(component: EruComponent): boolean {\n    const componentOverrides = this.store.componentVisibilityOverrides();\n    if (componentOverrides.has(component.id)) {\n      return componentOverrides.get(component.id)!;\n    }\n\n    const pageId = component.pageId || this.store.currentPage()?.id || '';\n    const pageOverrides = this.store.fieldVisibilityOverrides().get(pageId);\n    const fieldName = this.getPropertyValue(component, 'name');\n    if (pageOverrides && fieldName && pageOverrides.has(fieldName)) {\n      return pageOverrides.get(fieldName)!;\n    }\n\n    const visibility = this.getPropertyValue(component, 'visible') || 'always';\n    if (visibility === 'always') return true;\n    if (visibility === 'never') return false;\n    if (visibility === 'conditionally') {\n      const expression = this.getPropertyValue(component, 'visibility_conditions');\n      return !!this.logicEvaluator.evaluate(expression, component.pageId, component.id);\n    }\n    return true;\n  }\n\n  getFormErrors(pageId: string): Record<string, string[]> {\n    const form = this.forms.get(pageId);\n    if (!form) return {};\n\n    const errors: Record<string, string[]> = {};\n\n    Object.keys(form.controls).forEach(fieldName => {\n      const control = form.get(fieldName);\n      if (control && control.invalid && control.touched) {\n        const controlErrors = this.getControlErrors(control);\n        if (controlErrors.length > 0) {\n          errors[fieldName] = controlErrors;\n        }\n      }\n    });\n\n    return errors;\n  }\n\n  getControlErrors(control: AbstractControl): string[] {\n    if (!control.errors || !control.touched) return [];\n\n    const errors: string[] = [];\n    Object.keys(control.errors).forEach(key => {\n      const error = control.errors![key];\n      if (typeof error === 'object' && error.message) {\n        errors.push(error.message);\n      } else {\n        errors.push(this.getDefaultErrorMessage(key, error));\n      }\n    });\n\n    return errors;\n  }\n\n  private getDefaultErrorMessage(key: string, error: any): string {\n    const messages: Record<string, string> = {\n      'required': 'This field is required',\n      'min': `Minimum value is ${error.min !== undefined ? error.min : error.actual}`,\n      'max': `Maximum value is ${error.max !== undefined ? error.max : error.actual}`,\n      'minlength': `Minimum length is ${error.requiredLength} characters`,\n      'maxlength': `Maximum length is ${error.requiredLength} characters`,\n      // The regex itself is not a message a user can act on, and echoing it is\n      // what makes a pattern error long enough to disturb a layout. An author\n      // who wants specific wording sets `message` on the validation rule.\n      'pattern': 'Invalid format',\n      'email': 'Invalid email address',\n      'custom': error.message || 'Validation failed'\n    };\n    return messages[key] || 'Invalid value';\n  }\n\n  private buildValidators(component: EruComponent): ValidatorFn[] {\n    const validators: ValidatorFn[] = [];\n\n    const validationRules = this.getValidationRules(component);\n    if (validationRules) {\n      validationRules.forEach(rule => {\n        const validator = this.buildValidatorFromRule(rule, component);\n        if (validator) {\n          validators.push(validator);\n        }\n      });\n    }\n\n    const componentType = component.type;\n    if (componentType === 'input') {\n      const inputType = this.getPropertyValue(component, 'type');\n      if (inputType === 'email') {\n        validators.push(Validators.email);\n      }\n    }\n    if (componentType === 'email') {\n      const hasEmailRule = (validationRules || []).some(r => r.type === 'email');\n      if (!hasEmailRule) {\n        validators.push((control: AbstractControl): ValidationErrors | null => {\n          const result = Validators.email(control);\n          if (result && result['email']) {\n            return { email: { ...result['email'], message: this.getDefaultErrorMessage('email', result['email']) } };\n          }\n          return result;\n        });\n      }\n    }\n\n    if (componentType === 'website') {\n      const hasFormatRule = (validationRules || []).some(r => r.type === 'pattern');\n      if (!hasFormatRule) {\n        validators.push((control: AbstractControl): ValidationErrors | null => {\n          const raw = control.value;\n          if (raw === null || raw === undefined || String(raw).trim() === '') return null;\n          return isValidWebsiteUrl(String(raw).trim())\n            ? null\n            : { pattern: { message: 'Enter a valid URL' } };\n        });\n      }\n    }\n\n    const hasRequiredRule = (validationRules || []).some(r => r.type === 'required');\n    if (!hasRequiredRule) {\n      validators.push((control: AbstractControl): ValidationErrors | null => {\n        const mandatory = this.getPropertyValue(component, 'mandatory');\n        let isMandatory = false;\n        if (mandatory === 'always') {\n          isMandatory = true;\n        } else if (mandatory === 'conditionally') {\n          const expression = this.getPropertyValue(component, 'mandatory_conditions');\n          const pageId = component.pageId || this.store.currentPage()?.id || '';\n          isMandatory = !!this.logicEvaluator.evaluate(expression, pageId, component.id);\n        }\n        if (!isMandatory) return null;\n        const result = Validators.required(control);\n        if (result && result['required']) {\n          return { required: { ...result['required'], message: this.getDefaultErrorMessage('required', result['required']) } };\n        }\n        return result;\n      });\n    }\n\n    return validators;\n  }\n\n  private getValidationRules(component: EruComponent): ValidationRule[] | null {\n    const own = (component.validation_rules && Array.isArray(component.validation_rules))\n      ? component.validation_rules\n      : [];\n    const fromModel = this.getDataModelValidationRules(component);\n    const all = [...fromModel, ...own];\n    return all.length > 0 ? all : null;\n  }\n\n  /**\n   * Validation rules derived from the bound data-model field.\n   *\n   * The data model expresses these as metadata — `num_val` + `num_val_check`\n   * for a numeric bound, `data_length` + `data_length_check` for a length —\n   * rather than as component properties. Translating them into ValidationRules\n   * here means the limits are enforced by the same machinery as hand-authored\n   * rules, and a page picks them up purely by being bound to the field. The\n   * component's own rules are appended after these so an explicit rule wins.\n   */\n  private getDataModelValidationRules(component: EruComponent): ValidationRule[] {\n    const fieldName = component.properties?.['base']?.['name'];\n    if (!fieldName) return [];\n    const entityName = this.store.getPageEntityName(component.pageId || '');\n    const field: any = this.store.getEntityField(fieldName, entityName);\n    if (!field) return [];\n\n    const rules: ValidationRule[] = [];\n    const label = field.label || fieldName;\n\n    // Numeric bound: one-sided, MIN or MAX.\n    const numBound = Number(field.num_val);\n    if (Number.isFinite(numBound)) {\n      const mode = String(field.num_val_check || '').toUpperCase();\n      if (mode === 'MIN') {\n        rules.push({ type: 'min', value: numBound, message: `${label} must be at least ${numBound}` });\n      } else if (mode === 'MAX') {\n        rules.push({ type: 'max', value: numBound, message: `${label} cannot exceed ${numBound}` });\n      }\n    }\n\n    // Length bound. EXACT is a length rule, not a value rule, so it becomes a\n    // minLength and a maxLength at the same N rather than needing a new type.\n    const lenBound = Number(field.data_length);\n    if (Number.isFinite(lenBound) && lenBound > 0) {\n      const mode = String(field.data_length_check || 'MAX').toUpperCase();\n      if (mode === 'MIN') {\n        rules.push({ type: 'minLength', value: lenBound, message: `${label} must be at least ${lenBound} characters` });\n      } else if (mode === 'EXACT') {\n        rules.push({ type: 'minLength', value: lenBound, message: `${label} must be exactly ${lenBound} characters` });\n        rules.push({ type: 'maxLength', value: lenBound, message: `${label} must be exactly ${lenBound} characters` });\n      } else {\n        rules.push({ type: 'maxLength', value: lenBound, message: `${label} cannot exceed ${lenBound} characters` });\n      }\n    }\n\n    return rules;\n  }\n\n  private buildValidatorFromRule(rule: ValidationRule, component: EruComponent): ValidatorFn | null {\n    const wrapValidator = (validator: ValidatorFn, errorKey: string): ValidatorFn => {\n      return (control: AbstractControl): ValidationErrors | null => {\n        const result = validator(control);\n        if (result && result[errorKey]) {\n          const errorValue = result[errorKey];\n          const defaultMessage = this.getDefaultErrorMessage(errorKey, errorValue);\n          return {\n            [errorKey]: {\n              ...errorValue,\n              message: rule.message || defaultMessage\n            }\n          };\n        }\n        return result;\n      };\n    };\n\n    switch (rule.type) {\n      case 'required':\n        return wrapValidator(Validators.required, 'required');\n\n      case 'min':\n        return rule.value !== undefined ? wrapValidator(Validators.min(Number(rule.value)), 'min') : null;\n\n      case 'max':\n        return rule.value !== undefined ? wrapValidator(Validators.max(Number(rule.value)), 'max') : null;\n\n      case 'minLength':\n        return rule.value !== undefined ? wrapValidator(Validators.minLength(Number(rule.value)), 'minlength') : null;\n\n      case 'maxLength':\n        return rule.value !== undefined ? wrapValidator(Validators.maxLength(Number(rule.value)), 'maxlength') : null;\n\n      case 'pattern':\n        if (rule.value && typeof rule.value === 'string') {\n          try {\n            return wrapValidator(Validators.pattern(new RegExp(rule.value)), 'pattern');\n          } catch (e) {\n            console.error('Invalid regex pattern:', rule.value, e);\n            return null;\n          }\n        }\n        return null;\n\n      case 'email':\n        return wrapValidator(Validators.email, 'email');\n\n      case 'custom':\n        return this.buildCustomValidator(rule, component);\n\n      default:\n        return null;\n    }\n  }\n\n  private buildCustomValidator(rule: ValidationRule, component: EruComponent): ValidatorFn | null {\n    const customValidator = this.customValidators.get(rule.value);\n    if (customValidator) {\n      return (control: AbstractControl): ValidationErrors | null => {\n        const result = customValidator.validator(control);\n        if (result) {\n          return {\n            custom: {\n              message: rule.message || 'Validation failed',\n              ...result\n            }\n          };\n        }\n        return null;\n      };\n    }\n    return null;\n  }\n\n  registerCustomValidator(name: string, validator: ValidatorFn): void {\n    this.customValidators.set(name, { name, validator });\n  }\n\n  unregisterCustomValidator(name: string): void {\n    this.customValidators.delete(name);\n  }\n\n\n\n  private updateFormStatus(pageId: string): void {\n    const form = this.forms.get(pageId);\n    if (form) {\n      this.formValid.set(form.valid);\n      this.formErrors.set(this.getFormErrors(pageId));\n    } else {\n      // If no form exists for this page yet, it's considered valid\n      this.formValid.set(true);\n      this.formErrors.set({});\n    }\n  }\n\n  private getPropertyValue(component: EruComponent, key: string): any {\n    const breakpoint = this.store.viewport().breakpoint;\n    return this.tailwindService.getPropertyValueForBreakpoint(\n      component.properties,\n      key,\n      breakpoint,\n      true\n    );\n  }\n\n  private getOrCreateParentGroup(root: FormGroup, path: string): FormGroup {\n    if (!path.includes('.')) return root;\n\n    const parts = path.split('.');\n    let currentGroup: FormGroup = root;\n\n    for (let i = 0; i < parts.length - 1; i++) {\n      const part = parts[i];\n      const nextPart = parts[i + 1];\n      const isNextPartArray = !isNaN(Number(nextPart));\n\n      if (isNextPartArray) {\n        // currentGroup[part] should be a FormArray\n        let formArray = currentGroup.get(part) as FormArray;\n        if (!formArray) {\n          formArray = new FormArray<any>([]);\n          currentGroup.addControl(part, formArray);\n        }\n\n        // Now we need the FormGroup at the specified index\n        const index = Number(nextPart);\n        while (formArray.length <= index) {\n          formArray.push(new FormGroup({}));\n        }\n\n        // Advance currentGroup to the FormGroup inside the FormArray\n        currentGroup = formArray.at(index) as FormGroup;\n        i++; // Skip the index part in the next iteration\n      } else {\n        let group = currentGroup.get(part) as FormGroup;\n        if (!group) {\n          group = new FormGroup({});\n          currentGroup.addControl(part, group);\n        }\n        currentGroup = group;\n      }\n    }\n\n    return currentGroup;\n  }\n\n  private getLeafName(path: string): string {\n    if (!path.includes('.')) return path;\n    const parts = path.split('.');\n    return parts[parts.length - 1];\n  }\n}\n\n/**\n * Whether a string is a usable website address.\n *\n * Deliberately accepts a bare host (`example.com`) as well as a full URL: the\n * website component itself prepends `https://` when it builds the href, so\n * rejecting the bare form would fail values the component handles correctly.\n * A scheme, when present, must be http or https — `javascript:` and `data:`\n * are never a website, and one of them is an injection vector.\n */\nexport function isValidWebsiteUrl(value: string): boolean {\n  const text = value.trim();\n  if (!text || /\\s/.test(text)) return false;\n  const scheme = /^([a-z][a-z0-9+.-]*):\\/\\//i.exec(text);\n  if (scheme && !/^https?$/i.test(scheme[1])) return false;\n  // A scheme-less value that still carries a colon-prefix (`javascript:alert`)\n  // must not slip through the host check below.\n  if (!scheme && /^[a-z][a-z0-9+.-]*:/i.test(text)) return false;\n  let url: URL;\n  try {\n    url = new URL(scheme ? text : `https://${text}`);\n  } catch {\n    return false;\n  }\n  if (url.username || url.password) return false;\n  const host = url.hostname;\n  if (host === 'localhost') return true;\n  // A dotted name whose last label is alphabetic and at least two characters —\n  // enough to reject `example`, `example.`, and `foo.1`.\n  return /^(?!-)[a-z0-9-]+(?:\\.(?!-)[a-z0-9-]+)*\\.[a-z]{2,}$/i.test(host);\n}\n","import { Injectable, signal } from '@angular/core';\n\n/**\n * Row-scoped data context provided by board-card hosts and consumed by descendant\n * components (text / chips / progress_bar / …) when they resolve `value_source: 'field'`.\n *\n * Each rendered card creates its own instance via component-level `providers`,\n * so multiple cards on screen don't trample each other's data.\n *\n * BaseComponent injects this token as `optional` — when no row context exists\n * (i.e. rendering outside a board card), it falls back to the page data store.\n */\n@Injectable()\nexport class RowDataContext {\n  readonly row = signal<any | null>(null);\n  readonly columns = signal<any[]>([]);\n  readonly group = signal<any | null>(null);\n\n  /**\n   * Look up `fieldName` against the current row.\n   * Tries `row.entity_data[name]` first (eru-grid's standard shape),\n   * then a flat `row[name]` lookup as a fallback.\n   *\n   * A dotted name is a path into the row: `pj.0.fa` reads element 0 of the\n   * row's `pj` array. That is what a page_ref looping an array field inside a\n   * cell/board card hands us — its cards carry a data key of `<field>.<index>`\n   * and the array only exists on the row, never in page data.\n   */\n  getFieldValue(fieldName: string): any {\n    const row = this.row();\n    if (!row || !fieldName) return undefined;\n    if (fieldName.includes('.')) return this.resolvePath(fieldName);\n    const data = row.entity_data;\n    if (data && data[fieldName] !== undefined) return data[fieldName];\n    return row[fieldName];\n  }\n\n  /**\n   * Walk a dotted path from the row. Numeric segments index arrays, and a\n   * segment holding JSON text is parsed before the walk continues — a query\n   * can return an array column as a string.\n   */\n  private resolvePath(path: string): any {\n    const segments = path.split('.').filter(s => s !== '');\n    let current: any = this.getFieldValue(segments[0]);\n    for (let i = 1; i < segments.length; i++) {\n      current = RowDataContext.parseIfJson(current);\n      if (current === null || current === undefined) return undefined;\n      current = current[segments[i]];\n    }\n    return RowDataContext.parseIfJson(current);\n  }\n\n  private static parseIfJson(value: any): any {\n    if (typeof value !== 'string') return value;\n    const trimmed = value.trim();\n    if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) return value;\n    try {\n      return JSON.parse(trimmed);\n    } catch {\n      return value;\n    }\n  }\n\n  /**\n   * Write `fieldName` back into the current row, mirroring getFieldValue's\n   * precedence so a value is read back from where it was put.\n   *\n   * An editable control inside a card reads its value from here but wrote its\n   * edit only to page data, which a card never reads — so the moment the\n   * control returned to view mode it redisplayed the untouched row value and the\n   * edit looked discarded. The row is replaced rather than mutated so the signal\n   * notifies and the card re-renders.\n   */\n  setFieldValue(fieldName: string, value: any): void {\n    const row = this.row();\n    if (!row || !fieldName) return;\n    if (row.entity_data && typeof row.entity_data === 'object') {\n      this.row.set({ ...row, entity_data: { ...row.entity_data, [fieldName]: value } });\n      return;\n    }\n    this.row.set({ ...row, [fieldName]: value });\n  }\n\n  hasRow(): boolean {\n    return this.row() !== null;\n  }\n\n  /**\n   * The effective row data object (entity_data merged over the flat row), for\n   * resolving `@field` references in logic expressions against the card's row.\n   */\n  getData(): Record<string, any> | null {\n    const row = this.row();\n    if (!row) return null;\n    return { ...row, ...(row.entity_data || {}) };\n  }\n\n  /**\n   * The row in page-record shape, so actions that read `$entity_data` /\n   * `$entity_id` (update-state, emit-to-parent payloads) resolve the card's own\n   * row instead of the card page's shared page data — a board card never writes\n   * its row into the store, so there is nothing there to read.\n   *\n   * eru-grid rows are flat (fields plus `entity_id`), so the flat row itself is\n   * the record data; a row already carrying `entity_data` is passed through.\n   */\n  getRecord(): { entity_id: string; entity_data: Record<string, any> } | null {\n    const row = this.row();\n    if (!row || typeof row !== 'object') return null;\n    return {\n      entity_id: row.entity_id ?? row.id ?? '',\n      entity_data: row.entity_data ?? row\n    };\n  }\n}\n","import { TailwindBreakpoint } from '../models';\nimport { APP_CONSTANTS } from '../constants/app-constants';\n\nexport function calculateBreakpointFromWidth(width: number): TailwindBreakpoint {\n  const breakpoints = APP_CONSTANTS.BREAKPOINTS;\n  \n  if (width >= breakpoints['2xl']) {\n    return '2xl';\n  } else if (width >= breakpoints.xl) {\n    return 'xl';\n  } else if (width >= breakpoints.lg) {\n    return 'lg';\n  } else if (width >= breakpoints.md) {\n    return 'md';\n  } else if (width >= breakpoints.sm) {\n    return 'sm';\n  }\n  \n  return 'sm';\n}\n\nexport function getBreakpointFromViewport(): TailwindBreakpoint {\n  if (typeof window === 'undefined') {\n    return 'sm';\n  }\n  return calculateBreakpointFromWidth(window.innerWidth);\n}\n","import { Injectable, signal } from '@angular/core';\nimport { TailwindBreakpoint } from '../models';\nimport { calculateBreakpointFromWidth } from '../utils/breakpoint.util';\n\n/**\n * The breakpoint a subtree of components resolves its responsive properties\n * against, measured from the box they actually occupy rather than from the\n * browser window.\n *\n * A page reference renders its nested page inside whatever space the host gave\n * it — a side panel a few hundred pixels wide, a narrow inline slot in a\n * two-column layout — but every component in it read `store.viewport()`, which\n * is derived from `window.innerWidth`. A page opened in an 800px side panel on\n * a 1400px screen therefore laid itself out as `xl`: desktop columns, desktop\n * type, nothing wrapped. The store cannot answer this, and must not: the\n * nested page shares the host's store on purpose (page state, dynamic-data\n * wiring and events all flow through it), so the breakpoint is the one thing\n * that has to be scoped separately.\n *\n * Provided per page-reference and per runtime canvas, so the nearest enclosing\n * container wins and nesting resolves naturally. Components read it through\n * `BaseComponent.currentBreakpoint()`, which falls back to the store's viewport\n * wherever no scope is provided — the designer's top-level canvas, where the\n * toolbar's breakpoint selector is the author's deliberate choice.\n */\n@Injectable()\nexport class BreakpointScopeService {\n  private readonly _breakpoint = signal<TailwindBreakpoint | 'base' | null>(null);\n\n  /** The scoped breakpoint, or null until a width has been measured. */\n  readonly breakpoint = this._breakpoint.asReadonly();\n\n  setWidth(width: number): void {\n    // 0 is what a display:none or not-yet-laid-out container reports. Keeping\n    // the previous value beats collapsing the whole subtree to the narrowest\n    // breakpoint for a frame every time a panel is hidden and shown again.\n    if (!width || width <= 0) return;\n    const next = calculateBreakpointFromWidth(width);\n    if (this._breakpoint() !== next) this._breakpoint.set(next);\n  }\n\n  /**\n   * Track an element's content-box width for as long as the returned teardown\n   * is not called. Returns a no-op teardown where ResizeObserver is missing\n   * (SSR, older embedded webviews), leaving the subtree on the store's\n   * viewport rather than on a stale guess.\n   */\n  observe(element: HTMLElement | null | undefined): () => void {\n    if (!element || typeof ResizeObserver === 'undefined') return () => { };\n    this.setWidth(element.getBoundingClientRect().width);\n    const observer = new ResizeObserver(entries => {\n      for (const entry of entries) {\n        const width = entry.contentRect?.width ?? (entry.target as HTMLElement).getBoundingClientRect().width;\n        this.setWidth(width);\n      }\n    });\n    observer.observe(element);\n    return () => observer.disconnect();\n  }\n}\n","/**\n * How a number is rendered for display.\n *\n * Extracted from `BaseComponent.formatNumericValue` so a chart can format a\n * measure the same way a number or currency field formats the same column. The\n * rule has to live in one place: the data model carries `decimal`, `seperator`,\n * `dynamic_number` and `display_number_as`, eru-grid honours them, and a second\n * copy of the logic is how a value ends up formatted one way in a grid and\n * another way on a chart.\n */\nexport interface NumberFormatSpec {\n  /** Decimal places. Defaults to 0 — an unset `decimal` in the data model\n   *  means an integer, which is how eru-grid's cell renderer reads it too. */\n  decimals?: number;\n  /** '' | 'none' | 'thousands' — 'thousands' is the Indian grouping. */\n  seperator?: string;\n  /** Abbreviate instead of grouping, e.g. 1.2 Cr or 12 mn. */\n  dynamic_number?: boolean;\n  /** Which scale to abbreviate on. */\n  display_number_as?: 'lacs' | 'mn';\n  /** Prefixed when present, e.g. a currency symbol. */\n  symbol?: string;\n  /**\n   * How a negative value reads, the way a spreadsheet asks it. Only the TEXT is\n   * decided here — the colour is the renderer's job, because a formatter\n   * returning a string has nowhere to put one. Use `negativeIsColoured` to ask\n   * whether a mode wants the negative colour applied.\n   *\n   *   'as_is'        -1,234.10   the plain minus sign\n   *   'colored'      -1,234.10   sign kept, painted\n   *   'colored_abs'   1,234.10   sign dropped, painted\n   *   'parentheses'  (1,234.10)  the accounting convention, painted\n   */\n  negative_display?: NegativeDisplay;\n}\n\nexport type NegativeDisplay = 'as_is' | 'colored' | 'colored_abs' | 'parentheses';\n\n/** The default negative colour, used wherever the author has not chosen one. */\nexport const DEFAULT_NEGATIVE_COLOR = '#d32f2f';\n\n/** Whether a mode asks for the negative colour to be painted. */\nexport function negativeIsColoured(mode: NegativeDisplay | null | undefined): boolean {\n  return mode === 'colored' || mode === 'colored_abs' || mode === 'parentheses';\n}\n\n/**\n * Whether this value should be painted with the negative colour under this spec.\n * Bundled with the formatter so a renderer asks the same question the formatter\n * answered, rather than re-deriving \"is it negative\" from the formatted text —\n * which 'colored_abs' and 'parentheses' have already stripped the sign out of.\n */\nexport function isNegativeValue(value: any, spec: NumberFormatSpec = {}): boolean {\n  if (!negativeIsColoured(spec.negative_display)) return false;\n  const num = Number(value);\n  return Number.isFinite(num) && num < 0;\n}\n\n/**\n * Apply the negative-display mode to already-formatted text.\n *\n * Takes the formatted string rather than re-deriving it, so abbreviation,\n * grouping and the symbol prefix are all decided once. The sign is removed from\n * the number, not from the string blindly: a symbol prefix sits ahead of it\n * ('$ -1,234.10'), so the minus is stripped where it actually is.\n */\nexport function applyNegativeDisplay(text: string, num: number, mode: NegativeDisplay | undefined): string {\n  if (num >= 0 || !mode || mode === 'as_is' || mode === 'colored') return text;\n  const unsigned = text.replace('-', '');\n  return mode === 'parentheses' ? `(${unsigned})` : unsigned;\n}\n\n/** Abbreviate a number to the Indian (k/L/Cr) or Western (k/mn/bn/tn) scale. */\nexport function abbreviateNumber(num: number, system: 'lacs' | 'mn', decimals: number): string {\n  const abs = Math.abs(num);\n  const sign = num < 0 ? '-' : '';\n  const trim = (n: number) => {\n    const s = n.toFixed(decimals);\n    return decimals > 0 ? s.replace(/\\.?0+$/, '') : s;\n  };\n  if (system === 'lacs') {\n    if (abs >= 1e7) return `${sign}${trim(abs / 1e7)} Cr`;\n    if (abs >= 1e5) return `${sign}${trim(abs / 1e5)} L`;\n    if (abs >= 1e3) return `${sign}${trim(abs / 1e3)} k`;\n    return `${sign}${trim(abs)}`;\n  }\n  if (abs >= 1e12) return `${sign}${trim(abs / 1e12)} tn`;\n  if (abs >= 1e9) return `${sign}${trim(abs / 1e9)} bn`;\n  if (abs >= 1e6) return `${sign}${trim(abs / 1e6)} mn`;\n  if (abs >= 1e3) return `${sign}${trim(abs / 1e3)} k`;\n  return `${sign}${trim(abs)}`;\n}\n\n/**\n * Which scale a value abbreviates on when no `display_number_as` is chosen:\n * the one its digit grouping already implies.\n *\n * `seperator` and `display_number_as` were asking the same question twice — the\n * data model already says whether a field reads Indian or Western, and a field\n * grouped 1,00,00,000 that abbreviates to 'mn' is a contradiction. So the\n * grouping supplies the scale and 'Display as' stays editable to override it.\n */\nexport function abbreviationScaleFor(seperator: string | null | undefined): 'lacs' | 'mn' {\n  return String(seperator ?? '').toLowerCase() === 'thousands' ? 'lacs' : 'mn';\n}\n\n/**\n * Render a value under a spec.\n *\n * Non-numeric input is returned unchanged rather than coerced to NaN, so a text\n * category passed here by mistake still reads as itself.\n */\nexport function formatNumberValue(value: any, spec: NumberFormatSpec = {}): string {\n  if (value === null || value === undefined || value === '') return '';\n  const num = Number(value);\n  if (isNaN(num)) return String(value);\n\n  // 0, not 2, when the spec carries no usable precision: a field whose\n  // `decimal` the data model never set is an integer, and eru-grid's cell\n  // renderer already reads a blank one that way. Defaulting to 2 here is what\n  // made a field with decimal 0 in the model render as 50.00 on a page while\n  // the same column read 50 in a grid.\n  const decimals = Number.isFinite(Number(spec.decimals)) ? Number(spec.decimals) : 0;\n  const symbol = (spec.symbol || '').trim();\n  const prefix = symbol ? `${symbol} ` : '';\n\n  // Only the explicit 'Abbreviate' flag abbreviates. `seperator` and\n  // `display_number_as` are about how digits are GROUPED and, when abbreviating,\n  // on which scale — neither is a request to abbreviate, so a field carrying\n  // them still reads 30,00,000 rather than 3 mn. Mirrors eru-grid, so a column\n  // reads the same on a page as in a grid.\n  if (spec.dynamic_number) {\n    return applyNegativeDisplay(\n      `${prefix}${abbreviateNumber(num, spec.display_number_as || abbreviationScaleFor(spec.seperator), decimals)}`,\n      num, spec.negative_display);\n  }\n\n  // Same mapping eru-grid uses: 'none' leaves the digits ungrouped, 'thousands'\n  // is the Indian grouping (1,00,00,000) via en-IN, anything else the Western\n  // one (10,000,000).\n  const seperator = String(spec.seperator ?? '').toLowerCase();\n  if (seperator === 'none') {\n    return applyNegativeDisplay(`${prefix}${num.toFixed(decimals)}`, num, spec.negative_display);\n  }\n  const locale = seperator === 'thousands' ? 'en-IN' : 'en-US';\n  return applyNegativeDisplay(prefix + num.toLocaleString(locale, {\n    minimumFractionDigits: decimals,\n    maximumFractionDigits: decimals,\n  }), num, spec.negative_display);\n}\n\n/** A cleaned string that is a number outright, and not merely number-ish. */\nconst NUMERIC_TEXT = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/;\n\n/**\n * The inverse of `formatNumberValue`: a display string back to the number page\n * data should hold.\n *\n * A number/currency field edits through a `type=\"text\"` input, so every\n * keystroke arrives as a string and used to be written to page data verbatim —\n * which is how a currency column ended up persisted as text. Since the value\n * reaches the store through here, it also has to survive what formatting put in\n * front of the digits: a currency symbol, and en-US or en-IN digit grouping.\n *\n * Only formatting is removed — spaces, grouping commas, and a symbol PREFIX\n * (the only place `formatNumberValue` puts one). What is left must then read as\n * a number in full, or the input is returned UNCHANGED rather than coerced.\n *\n * Requiring the whole remainder to be numeric is the point, not a detail:\n * stripping every non-digit instead would turn '12abc' into 12 and '1.2 Cr'\n * into 1.2, the latter off by a factor of ten million. A half-typed '-' or '1.'\n * likewise must survive mid-edit. A non-numeric entry is for validation to\n * reject, not for this to quietly reinterpret; abbreviated output is\n * display-only and deliberately not parsed back.\n */\nexport function parseNumberValue(value: any): any {\n  if (value === null || value === undefined || value === '') return value;\n  if (typeof value === 'number') return value;\n  const cleaned = String(value).replace(/[\\s,]/g, '').replace(/^[^0-9+\\-.]+/, '');\n  if (!NUMERIC_TEXT.test(cleaned)) return value;\n  const num = Number(cleaned);\n  return Number.isFinite(num) ? num : value;\n}\n\n/**\n * A spec from an entity field's own definition, with explicit overrides layered\n * on top — the \"map it to the data model, and let it be set here when it isn't\"\n * rule, in one place.\n */\nexport function numberFormatSpec(field: any, overrides: Partial<NumberFormatSpec> = {}): NumberFormatSpec {\n  const pick = (key: string, fallback?: any) => {\n    const own = (overrides as any)[key];\n    if (own !== undefined && own !== null && own !== '') return own;\n    const fromModel = field?.[key];\n    if (fromModel !== undefined && fromModel !== null && fromModel !== '') return fromModel;\n    return fallback;\n  };\n  return {\n    decimals: Number.isFinite(Number(pick('decimals', pick('decimal'))))\n      ? Number(pick('decimals', pick('decimal')))\n      : undefined,\n    seperator: pick('seperator'),\n    dynamic_number: !!pick('dynamic_number'),\n    display_number_as: pick('display_number_as'),\n    symbol: pick('symbol'),\n    negative_display: pick('negative_display')\n  };\n}\n","import { inject, computed, input, Directive, OnInit, OnDestroy, ElementRef, Renderer2, effect, signal, Input, untracked, Injector, afterNextRender } from '@angular/core';\nimport { ComponentEvent, EruComponent, PropertySchema, ComponentEventSubscription, EruComponentProperties, TailwindBreakpoint, ResponsiveEruComponentProperties, ResponsiveStyleProperties, PageData, ComponentCondition, ColorRange } from '../../models';\nimport { EruStudioStore } from '../../services/eru-studio.store';\nimport { ComponentSchemaService } from '../../services/component-schema.service';\nimport { PropertyToTailwindService } from '../../services/property-to-tailwind.service';\nimport { FormValidationService } from '../../services/form-validation.service';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\nimport { RowDataContext } from '../../services/row-data-context';\nimport { FormControl, Validators } from '@angular/forms';\nimport { StyleProperties, EntityField } from '../../models/eru-project.model';\nimport { EruAppRouteService } from '../../services/eru-app-route.service';\nimport { BreakpointScopeService } from '../../services/breakpoint-scope.service';\nimport { formatNumberValue, parseNumberValue, isNegativeValue, DEFAULT_NEGATIVE_COLOR, NegativeDisplay } from '../../utils/number-format.util';\n\nconst _defaultPropsCache = new Map<string, EruComponentProperties>();\nconst _defaultStylesCache = new Map<string, StyleProperties>();\n\n/** Painted when a model option enumerates a value but gives it no colour. */\nconst NEUTRAL_OPTION_COLOR = '#9ca3af';\n/** `letterSpacing` -> `letter-spacing`, leaving an already-kebab key untouched. */\nfunction toKebabCaseStyleKey(key: string): string {\n  return key.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`);\n}\n\n/**\n * CSS properties that only take effect on a flex/grid ITEM, mapped to the\n * camelCase form a style object wants. A component's custom styles land on its\n * own inner element, but the item is the wrapper the parent container renders\n * around it, so these have to be lifted onto that wrapper to do anything.\n */\nconst ITEM_ONLY_STYLE_PROPERTIES: Record<string, string> = {\n  'align-self': 'alignSelf',\n  'justify-self': 'justifySelf',\n  'place-self': 'placeSelf',\n  'order': 'order',\n  'flex': 'flex',\n  'flex-grow': 'flexGrow',\n  'flex-shrink': 'flexShrink',\n  'flex-basis': 'flexBasis',\n  'grid-column': 'gridColumn',\n  'grid-row': 'gridRow',\n  'grid-area': 'gridArea',\n};\n\n/**\n * Record an event carries instead of the emitting component's page data — used\n * when the event is about one row rather than the page (grid row select, grid\n * cell edit). `row_entity_name` and `old_entity_data` are set only by row-level\n * edits, and are what let the host app save the row's own entity.\n *\n * `row` is the untouched source row. A cell edit's `entity_data` is only the one\n * field that changed, so without the row a handler has no access to the rest of\n * the record — the ids, the query aliases, the columns it wants to send along.\n */\nexport interface EventPayloadOverride {\n  entity_id?: string;\n  entity_data?: any;\n  entity_name?: string;\n  row_entity_name?: string;\n  old_entity_data?: any;\n  row?: any;\n  /**\n   * Extra top-level keys to merge onto the subscription payload, for event\n   * detail that is not part of the record. A drill click needs to say which\n   * cell was clicked and what its value was, and none of the record-shaped\n   * fields above can carry that.\n   *\n   * Namespace what you put here (the drill event uses a single `drill` key) so\n   * an author's payload path stays stable and cannot collide with the\n   * record fields. Reaches handlers as `eventSubscription.payload`, so it is\n   * addressable from `set-from-payload` and goes out with a call-query/function.\n   */\n  context?: Record<string, any>;\n}\n\n// Style schema interface\nexport interface StyleSchema {\n  key: string;\n  type: 'color' | 'number' | 'select' | 'boolean' | 'text';\n  label: string;\n  category: 'layout' | 'style' | 'typography' | 'spacing' | 'border' | 'background';\n  default_value: any;\n  placeholder?: string;\n  options?: Array<{ label: string, value: any }>;\n  min?: number;\n  max?: number;\n  step?: number;\n  width?: 1 | 2 | 'half' | 'full';\n}\n\n@Directive({\n  selector: '[eruBaseComponent]',\n  standalone: true\n})\nexport class BaseComponent implements OnInit, OnDestroy {\n  protected store = inject(EruStudioStore);\n\n  /**\n   * The breakpoint scope of the nearest enclosing page reference or runtime\n   * canvas, when this component is rendered inside one. Absent on the\n   * designer's top-level canvas, where the toolbar selection is authoritative.\n   */\n  private breakpointScope = inject(BreakpointScopeService, { optional: true });\n\n  /**\n   * The breakpoint every responsive read below resolves against.\n   *\n   * A scoped breakpoint is measured from the container this component actually\n   * sits in, so a page opened in a side panel lays out for the panel's width\n   * instead of the browser window's. Where nothing provides a scope this is the\n   * store's viewport, exactly as before.\n   */\n  protected currentBreakpoint(): TailwindBreakpoint | 'base' {\n    return this.breakpointScope?.breakpoint()\n      ?? (this.store.viewport().breakpoint as TailwindBreakpoint | 'base');\n  }\n  protected schemaService = inject(ComponentSchemaService);\n  protected tailwindService = inject(PropertyToTailwindService);\n  protected formValidationService = inject(FormValidationService);\n  protected logicEvaluator = inject(LogicEvaluatorService);\n  protected routeService = inject(EruAppRouteService);\n  protected rowContext = inject(RowDataContext, { optional: true });\n  protected elementRef = inject(ElementRef);\n  protected renderer = inject(Renderer2);\n  protected injector = inject(Injector);\n  protected formControl: FormControl | null = null;\n  private _syncHydrated = false;\n  // entity_id of the record this control last synced its editor to. The\n  // sentinel is not a possible id, so the first sync reads as a swap and never\n  // announces — see the sync effect.\n  private _syncedRecordId: string | null = null;\n  // Whether this control was effectively visible at its previous store sync.\n  // false initially, so a control's first sync never announces.\n  private _syncWasVisible = false;\n  private validationErrorsSignal = signal<string[]>([]);\n  // Computed signal for validation errors - accessible in templates\n  protected readonly validationErrors = computed(() => this.validationErrorsSignal());\n\n  // Conditional logic signals\n  public checkVisibility(component: EruComponent): boolean {\n    const componentOverrides = this.store.componentVisibilityOverrides();\n    if (componentOverrides.has(component.id)) {\n      return componentOverrides.get(component.id)!;\n    }\n\n    const pageId = component.pageId || this.store.currentPage()?.id || '';\n    const pageOverrides = this.store.fieldVisibilityOverrides().get(pageId);\n\n    const dataKey = this.getDataKey(component);\n    const fieldName = this.getPropertyValue(component, 'name');\n    const visibilityKey = (dataKey && fieldName) ? `${dataKey}.${fieldName}` : fieldName;\n\n    if (pageOverrides && visibilityKey && pageOverrides.has(visibilityKey)) {\n      const override = pageOverrides.get(visibilityKey)!;\n      return override;\n    }\n\n\n\n    const visibility = this.getPropertyValue(component, 'visible', 'always');\n    if (!visibility || visibility === 'always') return true;\n    if (visibility === 'never') return false;\n    if (visibility === 'conditionally') {\n      const expression = this.getPropertyValue(component, 'visibility_conditions');\n      // A condition on entity metadata cannot be answered before the host hands\n      // it over — every attribute would read undefined and the component would\n      // settle on hidden, then pop in. Stay rendered for that window; the\n      // ghost effect below makes it read as loading rather than as an answer.\n      if (LogicEvaluatorService.referencesEntityMetadata(expression) && !this.store.entitiesLoaded()) {\n        return true;\n      }\n      return this.logicEvaluator.evaluate(expression, component?.pageId, component?.id, this.getDataKey(component), this.rowContext?.getData() ?? undefined);\n    }\n    return true;\n  }\n\n  /**\n   * True while this component's visibility hangs on entity metadata that has\n   * not arrived. Drives the same shimmer as an explicit loading state.\n   */\n  protected readonly isAwaitingEntityMetadata = computed(() => {\n    const component = this.component();\n    if (this.getPropertyValue(component, 'visible', 'always') !== 'conditionally') return false;\n    const expression = this.getPropertyValue(component, 'visibility_conditions');\n    return LogicEvaluatorService.referencesEntityMetadata(expression) && !this.store.entitiesLoaded();\n  });\n\n  protected readonly isComponentVisible = computed(() => {\n    return this.checkVisibility(this.component());\n  });\n\n  protected readonly isAncestorChainVisible = computed(() => {\n    const componentId = this.component()?.id;\n    if (!componentId) return true;\n    // Guard against id collisions in the tree (e.g. a page_ref whose persisted\n    // nested snapshot reuses an outer component's id like \"root-container\"):\n    // findParentComponent resolves by id, so a duplicate makes the parent\n    // chain cycle and this walk would otherwise spin forever and freeze the\n    // page. Stop as soon as an id repeats.\n    const seen = new Set<string>([componentId]);\n    let current = this.store.findParentComponent(componentId);\n    while (current) {\n      if (!this.checkVisibility(current)) return false;\n      if (seen.has(current.id)) break;\n      seen.add(current.id);\n      current = this.store.findParentComponent(current.id);\n    }\n    return true;\n  });\n\n  protected readonly isEffectivelyVisible = computed(() => {\n    return this.isComponentVisible() && this.isAncestorChainVisible();\n  });\n\n  protected readonly isComponentMandatory = computed(() => {\n    const mandatory = this.getProperty('mandatory');\n    if (mandatory === 'always') return true;\n    if (mandatory === 'never') return false;\n    if (mandatory === 'conditionally') {\n      const expression = this.getProperty('mandatory_conditions');\n      return this.logicEvaluator.evaluate(expression, this.component()?.pageId, this.component()?.id, this.dataKey(), this.rowContext?.getData() ?? undefined);\n    }\n    return this.hasRequiredRule(); // fallback to static validation\n  });\n\n  // Effective default value for a form field: the data-model field's default\n  // is authoritative when the component is bound to an entity field (same\n  // rule as select options); the component's own `default_value` property is\n  // the fallback for unbound fields. Returns undefined when no default is\n  // configured. 'true'/'false' strings are coerced for toggle-like fields.\n  protected readonly effectiveDefaultValue = computed(() => {\n    // A configured state default outranks both the data model and the\n    // component's own Default Value: the author bound this field to a state\n    // variable deliberately and per page, where the other two are static\n    // fallbacks. Checked here rather than inside resolveDefaultValue() so the\n    // components that override that (date's Current Date / offset handling)\n    // still honour it.\n    const fromState = this.defaultStateValue();\n    if (fromState !== undefined && fromState !== null && fromState !== '') return fromState;\n    return this.resolveDefaultValue();\n  });\n\n  /** The state variable this field seeds from and writes back to, if configured. */\n  protected readonly defaultStateKey = computed<string>(() =>\n    String(this.getProperty('default_state_key') ?? '').trim());\n\n  /** Which state that variable lives in. */\n  protected readonly defaultStateScope = computed<'page' | 'app'>(() =>\n    this.getProperty('default_state_scope') === 'app' ? 'app' : 'page');\n\n  /**\n   * Current value of the state variable named by 'Default From State'.\n   *\n   * Read as a signal so the seeding effect re-runs when the variable is\n   * populated later — a page whose state is filled by a query or a nav param\n   * would otherwise seed from an empty value on mount and never correct itself.\n   */\n  protected readonly defaultStateValue = computed(() => {\n    const key = this.defaultStateKey();\n    if (!key) return undefined;\n    if (this.defaultStateScope() === 'app') return this.store.getAppStateValue(key);\n    const pageId = this.component()?.pageId;\n    const dataKey = this.dataKey();\n    const state = pageId\n      ? this.store.getComputedPageStateFor(pageId, dataKey || undefined)\n      : this.store.computedPageState();\n    return state?.[key];\n  });\n\n  /**\n   * Mirror an edit back into the bound state variable.\n   *\n   * Deliberately additive: the normal page-data write still happens, so the\n   * field keeps taking part in save-page-data exactly as before. This is the\n   * difference from Value Source = state, which routes the value to state\n   * INSTEAD of page data.\n   */\n  protected writeBackToDefaultState(value: any): void {\n    const key = this.defaultStateKey();\n    if (!key) return;\n    if (this.store.editMode()) return;\n    if (this.defaultStateScope() === 'app') {\n      this.store.setAppStateValue(key, value);\n      return;\n    }\n    this.store.setPageStateValue(key, value, this.component()?.pageId, this.dataKey() || undefined);\n  }\n\n  /**\n   * The value a form control should hold for a given stored value — the single\n   * place the control is fed from, so overrides cannot end up fighting the sync\n   * effect. Override to show something when page data holds nothing (e.g. the\n   * date component's resolved Default Date). Returning undefined leaves a\n   * freshly created control untouched and clears an existing one.\n   */\n  protected controlValueFor(value: any): any {\n    return value;\n  }\n\n  /** Override in a component that derives its default from more than the raw\n   *  property (e.g. the date component's Current Date / First Day / offset). */\n  protected resolveDefaultValue(): any {\n    const ef = this.fieldValue();\n    const efDefault = ef?.default;\n    const def: any = (efDefault !== undefined && efDefault !== null && efDefault !== '')\n      ? efDefault\n      : this.getProperty('default_value');\n    if (def === undefined || def === null || def === '') return undefined;\n    if (def === 'true') return true;\n    if (def === 'false') return false;\n    return def;\n  }\n\n  protected readonly isComponentDisabled = computed(() => {\n    const component = this.component();\n    if (component?.id) {\n      const disabledStates = this.store.componentDisabledStates();\n      if (disabledStates.has(component.id)) return disabledStates.get(component.id)!;\n    }\n    const pageId = component?.pageId || this.store.currentPage()?.id || '';\n    const fieldName = this.getPropertyValue(component, 'name');\n    const dataKey = this.dataKey();\n    const disabledKey = (dataKey && fieldName) ? `${dataKey}.${fieldName}` : fieldName;\n    const disabledOverrides = this.store.fieldDisabledOverrides().get(pageId);\n    if (disabledKey && disabledOverrides?.has(disabledKey)) {\n      return disabledOverrides.get(disabledKey)!;\n    }\n    if (this.isDisabledByEvent()) return true;\n    const disabledBehavior = this.getProperty('disabled_behavior');\n    if (disabledBehavior === 'always') return true;\n    if (disabledBehavior === 'never') return false;\n    if (disabledBehavior === 'conditionally') {\n      const expression = this.getProperty('disabled_conditions');\n      return this.logicEvaluator.evaluate(expression, this.component()?.pageId, this.component()?.id, this.dataKey(), this.rowContext?.getData() ?? undefined);\n    }\n    return this.getProperty('disabled') === true; // fallback to static boolean\n  });\n\n  protected readonly isComponentLoading = computed(() => {\n    return this.store.componentLoadingStates().get(this.component()?.id ?? '') ?? false;\n  });\n\n  /**\n   * Whether double-clicking the view-mode display would actually open the\n   * editor — the same three conditions the display's dblclick handler checks.\n   *\n   * Templates bind this to drive the hover affordance, so the tint and pointer\n   * appear only where an edit is really possible. They used to show on every\n   * control, promising an editor that a read-only or disabled field never opens.\n   */\n  protected readonly canInlineEdit = computed(() =>\n    !this.store.editMode()\n    && !!this.getProperty('editable')\n    && !this.isComponentDisabled()\n  );\n\n  protected readonly inlineEditHoverBg = computed<string>(() => {\n    const value = this.getProperty('hover_background_color');\n    return typeof value === 'string' ? value.trim() : '';\n  });\n\n  /**\n   * How a display-mode value behaves when it is wider than its slot. Wrapping is\n   * the default because that is what these controls have always done; the other\n   * two exist for fixed-height layouts (board cards especially), where a value\n   * spilling onto a second line pushes everything below it out of place.\n   */\n  protected readonly textOverflowMode = computed<'wrap' | 'ellipsis' | 'clamp'>(() => {\n    const v = this.getProperty('text_overflow');\n    return v === 'ellipsis' || v === 'clamp' ? v : 'wrap';\n  });\n\n  protected readonly textOverflowStyles = computed<Record<string, string>>(() => {\n    const mode = this.textOverflowMode();\n    if (mode === 'ellipsis') {\n      return <Record<string, string>>{\n        'white-space': 'nowrap',\n        'overflow': 'hidden',\n        'text-overflow': 'ellipsis',\n        // Without this the element refuses to shrink below its content inside a\n        // flex or grid parent, so it overflows instead of ellipsising.\n        'min-width': '0',\n      };\n    }\n    if (mode === 'clamp') {\n      const raw = Number(this.getProperty('max_lines'));\n      const lines = Number.isFinite(raw) && raw >= 1 ? Math.floor(raw) : 2;\n      return <Record<string, string>>{\n        'display': '-webkit-box',\n        '-webkit-line-clamp': String(lines),\n        'line-clamp': String(lines),\n        '-webkit-box-orient': 'vertical',\n        'overflow': 'hidden',\n        'min-width': '0',\n        'word-break': 'break-word',\n      };\n    }\n    return {};\n  });\n\n  /** The component's own styles with the overflow behaviour merged on top.\n   *  A hidden component is left alone — clamp sets `display`, which would\n   *  otherwise undo `display: none`. */\n  protected readonly stylesWithTextOverflow = computed<Record<string, any>>(() => {\n    const base = this.combinedStyles();\n    if (base['display'] === 'none') return base;\n    return { ...base, ...this.textOverflowStyles() };\n  });\n\n  protected textOverflowPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'text_overflow',\n        type: 'select',\n        label: 'Overflow',\n        category: 'layout',\n        default_value: 'wrap',\n        options: [\n          { value: 'wrap', label: 'Wrap' },\n          { value: 'ellipsis', label: 'Single line (…)' },\n          { value: 'clamp', label: 'Limit lines (…)' }\n        ],\n        description: 'What a value too wide for its slot does. Wrap flows onto more lines; the other two keep the height fixed and end the text with an ellipsis — which is what keeps a board card from being pushed out of shape by one long value.'\n      },\n      {\n        key: 'max_lines',\n        type: 'number',\n        label: 'Max Lines',\n        category: 'layout',\n        default_value: 2,\n        min: 1,\n        description: 'Lines to show before the ellipsis.',\n        visible_if: { key: 'text_overflow', equals: 'clamp' }\n      }\n    ];\n  }\n\n  protected readonly isHiddenByEvent = computed(() => {\n    const id = this.component()?.id ?? '';\n    const overrides = this.store.componentVisibilityOverrides();\n    if (!overrides.has(id)) return false;\n    return !overrides.get(id);\n  });\n\n  protected readonly isDisabledByEvent = computed(() => {\n    const component = this.component();\n    if (!component) return false;\n    const pageId = component.pageId || this.store.currentPage()?.id || '';\n    const fieldName = this.getPropertyValue(component, 'name');\n    if (!fieldName) return false;\n    return this.store.fieldDisabledOverrides().get(pageId)?.get(fieldName) ?? false;\n  });\n\n  // Event listeners storage\n  private eventListeners: { [key: string]: () => void } = {};\n\n  public getDataKey(component: EruComponent): string {\n    if (component?.isNested) {\n      const entityName = component.entityName || '';\n      // The hosting page_ref's own row, when it is itself looped. Without it a\n      // nested_array inside a record card resolved `txns.1` against the outer\n      // page and every card showed the same (or no) rows.\n      const prefix = component.dataKeyPrefix ? `${component.dataKeyPrefix}.` : '';\n      // nested_array is the one that uses main JSON prefixing logic\n      if (component.nesting_type === 'nested_array' && component.index !== undefined) {\n        return `${prefix}${entityName}.${component.index}`;\n      }\n      // If independent JSON (object/array), we might not need a prefix if the pageData itself is the entity's data\n      if (component.nesting_type === 'object' || component.nesting_type === 'array') {\n        if (component.nesting_type === 'array' && component.index !== undefined) {\n          // If it's an independent array, we still might need the index if the pageData.entity_data IS the array OR contains the array\n          // Let's assume for now that if it's an array nesting, we always want the index if provided.\n          // However, if it's an independent page data, the entityName might not be needed if it's already scoped.\n          return `${component.index}`;\n        }\n        return '';\n      }\n      return entityName;\n    }\n    return '';\n  }\n\n  public dataKey = computed(() => {\n    return this.getDataKey(this.component());\n  });\n\n  // Common component input - all components inherit this\n  /**\n   * Signal-backed input for the component definition.\n   * Using @Input with a setter to avoid InputSignal brand mismatch issues in library consumers.\n   */\n  readonly component = signal<EruComponent>(null!);\n\n  @Input('component')\n  set componentSetter(value: EruComponent) {\n    this.component.set(value);\n  }\n  componentEvents: { label: string, value: string }[] = [];\n  excludeBaseEvents: string[] = [];\n  targetElementSelector: string = ''; // CSS selector for the target element to bind events to\n  eventTargets: { [event: string]: string } = {}; // Optional: event-specific target selectors\n\n  // Override this method in child components to define event-specific targets\n  protected getEventTargets(): { [event: string]: string } {\n    return this.eventTargets;\n  }\n  // Direct computed signals - no wrapper functions needed!\n  protected readonly classes = computed(() => this.getClasses(this.component()));\n  protected readonly customStyles = computed(() => this.getCustomStyles(this.component()));\n\n  // Get computed styles with fallback mechanism\n  protected readonly computedStyles = computed(() => {\n    const component = this.component();\n    return this.getComputedStyles(component);\n  });\n\n  /**\n   * Custom styles are merged LAST, because the panel promises they bypass the\n   * responsive style system. With the responsive styles last a custom value was\n   * silently beaten by anything the Styles tab also set for that property.\n   *\n   * Keys are normalised to kebab-case on the way in. The responsive system emits\n   * kebab (`letter-spacing`) while the panel asks authors for camelCase\n   * (`letterSpacing`), so the two spellings are different object keys: both\n   * survived the merge and whichever ngStyle happened to write last won.\n   */\n  protected readonly combinedStyles = computed(() => {\n    const styles: any = { ...this.computedStyles() };\n    for (const [key, value] of Object.entries(this.customStyles())) {\n      styles[toKebabCaseStyleKey(key)] = value;\n    }\n    // A colour the VALUE asked for beats the one the Styles tab set for the\n    // component. Text Color is a blanket choice about the control; a negative\n    // colour or a matching Colour Range is a statement about this reading of\n    // it, and a loss there is a number that reads as if it were positive.\n    const value_color = this.valueColorOverride();\n    if (value_color) {\n      styles['color'] = value_color;\n    }\n    if (!this.checkVisibility(this.component())) {\n      styles['display'] = 'none';\n    }\n    const hover_bg = this.inlineEditHoverBg();\n    if (hover_bg) {\n      styles['--eru-inline-hover-bg'] = hover_bg;\n    }\n    // A Material form field draws its floating label and its select arrow from\n    // its own theme token, through an element rule - so they never inherit the\n    // colour set on the component, and a page that puts a form on a dark card\n    // gets labels in the light theme's near-black. Pointing the token at the\n    // colour the page chose is what the token is for: it means \"text on this\n    // surface\", and the page has just said what this surface is.\n    const color = styles['color'];\n    if (typeof color === 'string' && color.trim() !== '') {\n      styles['--mat-sys-on-surface-variant'] = color;\n    }\n    return styles;\n  });\n\n  // Helper methods for property access - simplified signatures\n  protected getProperty(key: string) {\n    const defaultValue = this.getDefaultProperties()[key];\n    return this.getPropertyValue(this.component(), key, defaultValue);\n  }\n\n  /**\n   * Read a property whose key was renamed to match the data model, falling back\n   * to the pre-rename key so pages saved earlier keep their configured value.\n   * New edits always write the current key, so a page migrates the first time\n   * the property is touched.\n   *\n   * Both reads deliberately bypass the schema default (passing `undefined`):\n   * getProperty() substitutes the default when nothing is stored, which would\n   * always beat the legacy value and make the fallback dead code.\n   */\n  protected getPropertyWithLegacy(key: string, legacyKey: string): any {\n    const component = this.component();\n    if (component) {\n      const isSet = (v: any) => v !== undefined && v !== null && v !== '';\n      const current = this.getPropertyValue(component, key, undefined);\n      if (isSet(current)) return current;\n      const legacy = this.getPropertyValue(component, legacyKey, undefined);\n      if (isSet(legacy)) return legacy;\n    }\n    return this.getProperty(key);\n  }\n\n  // Resolve a `color_ranges` property against a numeric value. Rows are checked\n  // in order and the first match wins, so authors control precedence by\n  // ordering. A missing/blank `from` or `to` leaves that side unbounded.\n  // Returns null when nothing matches, so callers fall back to their normal\n  // colours rather than painting something arbitrary.\n  /**\n   * The bound entity field's colour bands, when the data model defines them.\n   * The model is the single place bands are authored — the same rule a select's\n   * options follow — so every page and the grid paint a value identically.\n   */\n  protected modelColorRanges(): ColorRange[] | null {\n    const ranges = (this.fieldValue() as any)?.color_ranges;\n    return Array.isArray(ranges) && ranges.length > 0 ? ranges : null;\n  }\n\n  /**\n   * `disable_if` helper for a `color_ranges` property: the panel editor is\n   * locked while the bound data-model field supplies the bands, and stays open\n   * when it does not (unbound component, or a field with no bands configured).\n   */\n  protected hasModelColorRanges = (getValue?: (k: string) => any): boolean => {\n    if (getValue) {\n      const field: any = this.store.getEntityField(getValue('name'));\n      return Array.isArray(field?.color_ranges) && field.color_ranges.length > 0;\n    }\n    return !!this.modelColorRanges();\n  };\n\n  /**\n   * Label → colour for a field whose data model enumerates its values.\n   *\n   * One helper for both shapes the model uses: a tag or select field lists its\n   * values under `options`, a status field splits them across `open_status` and\n   * `close_status`. Which one is present decides how the field is read — a\n   * shape test rather than a datatype test, so `r_status` (which is in neither\n   * library's datatype union) resolves its colours like any other status field.\n   *\n   * Each entry carries `name` when it came from the model and `label` when a\n   * property panel authored it; both are accepted.\n   *\n   * `fieldName` defaults to this component's own bound field. Pass another\n   * field's name to borrow its palette — a chip list summarising a status\n   * column needs that column's colours, not its own.\n   *\n   * Shared because tag and status each hand-rolled this parsing, which is how\n   * one field ends up painted two different ways by two controls.\n   */\n  protected modelOptionColors(fieldName?: string): Map<string, string> {\n    const colors = new Map<string, string>();\n    const name = fieldName ?? this.getProperty('name');\n    if (!name) return colors;\n    const entityName = this.store.getPageEntityName(this.component()?.pageId || '');\n    const field: any = this.store.getEntityField(name, entityName);\n    if (!field) return colors;\n\n    const collect = (raw: any, fallback: string) => {\n      let parsed = raw;\n      if (typeof parsed === 'string') {\n        try { parsed = JSON.parse(parsed); } catch { return; }\n      }\n      if (!Array.isArray(parsed)) return;\n      for (const option of parsed) {\n        const label = String(\n          (typeof option === 'string' ? option : (option?.name ?? option?.label)) ?? ''\n        ).trim();\n        // First definition wins, so a value listed in both status groups keeps\n        // the colour of the group that declared it first.\n        if (!label || colors.has(label)) continue;\n        const color = (typeof option === 'object' && option?.color) || fallback;\n        colors.set(label, color);\n      }\n    };\n\n    if (field.open_status || field.close_status) {\n      collect(field.open_status, '#22C55E');\n      collect(field.close_status, '#EF4444');\n    } else {\n      collect(field.options, NEUTRAL_OPTION_COLOR);\n    }\n    return colors;\n  }\n\n  /**\n   * Black or white, whichever stays legible on the given background.\n   * Returns black for anything it cannot parse, which is the safer default\n   * against the light surfaces the studio paints by default.\n   */\n  protected contrastTextColor(background: string): string {\n    let hex = (background || '').replace('#', '');\n    if (hex.length === 3) {\n      hex = hex.split('').map(c => c + c).join('');\n    }\n    if (hex.length !== 6) return '#000000';\n    const r = parseInt(hex.slice(0, 2), 16);\n    const g = parseInt(hex.slice(2, 4), 16);\n    const b = parseInt(hex.slice(4, 6), 16);\n    if (isNaN(r) || isNaN(g) || isNaN(b)) return '#000000';\n    return (r * 299 + g * 587 + b * 114) / 1000 >= 128 ? '#000000' : '#ffffff';\n  }\n\n  /**\n   * Value for a property the data model owns: the bound field's definition wins,\n   * and the component's own property is the fallback for an unbound component.\n   *\n   * This is the general form of the rule `default_value`, `color_ranges` and the\n   * select's option source already follow. Reach for it whenever the key is in\n   * the inherited set — resolving from the component's stored property alone\n   * means a field configured in the data model renders one way on a page and\n   * another way in a grid, which is the whole class of bug this exists to close.\n   */\n  protected modelOrProperty(key: string, legacyKey?: string): any {\n    const fromModel = (this.fieldValue() as any)?.[key];\n    if (fromModel !== undefined && fromModel !== null && fromModel !== '') return fromModel;\n    return legacyKey ? this.getPropertyWithLegacy(key, legacyKey) : this.getProperty(key);\n  }\n\n  /**\n   * The inverse of `modelOrProperty`: the data model SEEDS the value and the\n   * component's own property overrides it.\n   *\n   * For keys the data model has an opinion about but a page may legitimately\n   * disagree with on one component — an attachment's upload destination, where\n   * the field says where files normally go and a particular page files them\n   * somewhere else. `modelOrProperty` cannot express this: the model always\n   * wins there, so an override would be silently ignored.\n   */\n  protected propertyOrModel(key: string): any {\n    const isSet = (v: any) => v !== undefined && v !== null && v !== '';\n    const component = this.component();\n    // The schema default is bypassed on the first read, for the same reason\n    // getPropertyWithLegacy() bypasses it: getProperty() substitutes it whenever\n    // nothing is stored, so the model would never get a look in and the seeding\n    // would be dead code. It comes back as the last fallback below.\n    const own = component ? this.getPropertyValue(component, key, undefined) : undefined;\n    if (isSet(own)) return own;\n    const fromModel = (this.fieldValue() as any)?.[key];\n    if (isSet(fromModel)) return fromModel;\n    return this.getProperty(key);\n  }\n\n  /**\n   * The component's display label, resolved the way the properties panel shows\n   * it: `label` is a data-model owned key (INHERITED_FIELD_KEYS), so a bound\n   * field's label wins and the component's own property is the fallback for an\n   * unbound one. Reading the stored property alone is why a bound field's panel\n   * read \"Deal Status\" while the page rendered no label at all — the panel never\n   * copies an inherited value into the page.\n   */\n  protected readonly resolvedLabel = computed<string>(() =>\n    String(this.modelOrProperty('label') ?? '').trim());\n\n  /** Decimal precision for a numeric field, from the data model's `decimal`.\n   *  Falls back to 0 — an unset `decimal` means an integer, the same reading\n   *  eru-grid's cell renderer gives it. A component that wants a different\n   *  fallback (currency, conventionally 2) carries it as its schema default. */\n  protected numericDecimals(): number {\n    const n = Number(this.modelOrProperty('decimal', 'decimalPlaces'));\n    return Number.isFinite(n) ? n : 0;\n  }\n\n  /**\n   * Display formatting shared by the number and currency components: precision\n   * from `decimal`, digit grouping from `seperator`, and optional abbreviation.\n   *\n   * Shared so the two cannot drift on how the same value renders, and so\n   * `seperator` — which the data model has always carried, and which eru-grid\n   * has always honoured — finally applies on a page too. Previously both\n   * components hardcoded the en-US grouping, so an Indian-format column\n   * formatted one way in a grid and another way on a page.\n   */\n  protected formatNumericValue(value: any): string {\n    // The rule itself lives in number-format.util so a chart measure formats the\n    // same column the same way — see the note there. This resolves the spec from\n    // the model-or-property rule and hands it over.\n    return formatNumberValue(value, {\n      decimals: this.numericDecimals(),\n      seperator: this.modelOrProperty('seperator'),\n      dynamic_number: !!this.modelOrProperty('dynamic_number'),\n      display_number_as: this.explicitAbbreviationScale(),\n      negative_display: this.negativeDisplayMode()\n    });\n  }\n\n  /**\n   * How this control renders a negative value. A component property rather than\n   * `modelOrProperty`: the data model has no such attribute, so a lookup there\n   * only ever returns undefined and then falls through to the same property.\n   */\n  protected negativeDisplayMode(): NegativeDisplay {\n    return (this.getProperty('negative_display') || 'as_is') as NegativeDisplay;\n  }\n\n  /**\n   * The colour a negative value is painted, or null when it is not one or the\n   * chosen mode does not paint.\n   *\n   * The question is asked of the VALUE, not of the formatted text: 'no sign'\n   * and 'brackets' have already removed the minus by the time there is a string\n   * to look at, so a renderer that sniffed the text would paint neither.\n   */\n  /**\n   * A colour the current VALUE dictates, or null when nothing about the value\n   * has an opinion. Overridden by the numeric controls, which answer with the\n   * matching Colour Range's colour or the negative colour.\n   *\n   * Read inside `combinedStyles`, so the override lands on the same style map\n   * as the author's Text Color instead of racing it from a separate binding —\n   * `[style.color]` on an element ngStyle also writes is settled by whichever\n   * ran last, which is how a styled component kept its text colour on negatives.\n   */\n  protected valueColorOverride(): string | null {\n    return null;\n  }\n\n  protected negativeColorFor(value: any): string | null {\n    if (!isNegativeValue(value, { negative_display: this.negativeDisplayMode() })) return null;\n    return this.getProperty('negative_color') || DEFAULT_NEGATIVE_COLOR;\n  }\n\n  /**\n   * An abbreviation scale only if one was actually chosen — the bound field's,\n   * else the one stored on this component.\n   *\n   * Deliberately not `modelOrProperty`, which falls through to `getProperty`\n   * and so would hand back the schema's `default_value: 'mn'`. Since choosing a\n   * scale is itself what turns abbreviation on (see formatNumberValue), that\n   * default would read as a choice on every numeric field and abbreviate the\n   * lot — every plain number rendering as '98.98 k'.\n   */\n  private explicitAbbreviationScale(): 'lacs' | 'mn' | undefined {\n    const fromModel = (this.fieldValue() as any)?.display_number_as;\n    if (fromModel) return fromModel;\n    const component = this.component();\n    const stored = component ? this.getPropertyValue(component, 'display_number_as', undefined) : undefined;\n    return stored || undefined;\n  }\n\n  /**\n   * The field's value in the representation page data keeps — the one that ends\n   * up in the save-entity payload.\n   *\n   * Paired with `get_formatted_value()` so the two readings of a value can never\n   * be confused for each other. A control that formats for display (number,\n   * currency) must render through that one, because everything a formatter adds\n   * — a currency symbol, digit grouping, a fixed precision — makes the value a\n   * string, and writing that string back is how a numeric column comes to be\n   * stored as text. Anything downstream that aggregates or compares the column\n   * then does so on text: `sum()` fails outright and `max()` answers\n   * lexicographically ('98975' > '145000').\n   */\n  get_value(): any {\n    return this.reactiveFieldValue();\n  }\n\n  /**\n   * Layout for a view-mode display label.\n   *\n   * Applied to the label SPAN rather than to its container: every display\n   * template is `<div class=\"eru-x-display\"><span class=\"x-display-label\">…`\n   * with the value straight after, so a block label already puts the value on\n   * the next line — where restyling the container would have to reckon with\n   * what each one holds (chips, avatars, a multi-line list).\n   *\n   * `margin-right` is cleared with it, since the 6px that separates a label\n   * from a value beside it is dead space above one.\n   */\n  readonly displayLabelStyles = computed<Record<string, string>>(() => {\n    const layout: Record<string, string> = this.getProperty('label_position') === 'left'\n      ? {}\n      : { 'display': 'block', 'margin-right': '0' };\n    return { ...layout, ...this.labelTypographyStyles() };\n  });\n\n  /**\n   * Typography the author set for the LABEL specifically, from the `label_*`\n   * style keys the Styles tab writes when its Typography group is switched to\n   * the Label target.\n   *\n   * Kept as its own set of keys rather than inherited from the component shell:\n   * the shell's typography is the VALUE's, and a label that inherited it could\n   * not be a caption without also pinning every property in CSS — which is\n   * exactly the half-pinned state that made Text Color reach only the value\n   * while Font Weight reached both. Unset keys are simply absent here, so the\n   * shared `.eru-display-label` caption rule remains in charge of them.\n   */\n  protected readonly labelTypographyStyles = computed<Record<string, string>>(() => {\n    const component = this.component();\n    if (!component) return {};\n    const out: Record<string, string> = {};\n    const put = (styleKey: string, cssProp: string, unit = ''): void => {\n      const value = this.getStylePropertyValue(component, styleKey, undefined);\n      if (value === undefined || value === null || value === '') return;\n      out[cssProp] = unit ? `${value}${unit}` : String(value);\n    };\n    put('label_font_size', 'font-size', 'px');\n    put('label_color', 'color');\n    put('label_font_weight', 'font-weight');\n    put('label_font_family', 'font-family');\n    put('label_letter_spacing', 'letter-spacing', 'px');\n    put('label_text_align', 'text-align');\n    put('label_text_transform', 'text-transform');\n    put('label_text_decoration', 'text-decoration');\n    return out;\n  });\n\n  /**\n   * Layout for the view-mode display CONTAINER that holds label and value.\n   *\n   * Only `flex-direction` is set, never `display`: most of these containers are\n   * already a flex row, and the few that are not (date, number, currency) are\n   * plain blocks where the block label above is what stacks them — forcing flex\n   * on those would drop the `text-align` a number column depends on.\n   *\n   * 'left' returns nothing at all rather than restating the row direction, so\n   * the layout there is byte-for-byte what it was before this property existed.\n   */\n  readonly displayContainerStyles = computed<Record<string, string>>(() =>\n    this.getProperty('label_position') === 'left'\n      ? {}\n      : { 'flex-direction': 'column', 'align-items': 'flex-start' } as Record<string, string>);\n\n  /**\n   * Typography that must land on the VALUE's own element rather than on the\n   * component shell.\n   *\n   * Only the properties that cannot be scoped from the shell live here.\n   * `text-decoration` is the case: it is drawn across all in-flow descendants\n   * and a descendant cannot remove it, so set on the shell it underlined the\n   * label too. Everything else the Styles tab sets stays on the shell and\n   * inherits, with the label opting out via the shared caption rule.\n   */\n  readonly displayValueStyles = computed<Record<string, string>>(() => {\n    const component = this.component();\n    if (!component) return {};\n    const decoration = this.getStylePropertyValue(component, 'text_decoration', undefined);\n    const out: Record<string, string> = {};\n    if (decoration && decoration !== 'none') out['text-decoration'] = String(decoration);\n    return out;\n  });\n\n  /**\n   * The value span's own styles plus the overflow rules, for the controls whose\n   * template already bound `textOverflowStyles()` there. Angular templates have\n   * no spread, so the merge belongs here rather than in the binding.\n   */\n  readonly valueTextStyles = computed<Record<string, string>>(() => ({\n    ...this.textOverflowStyles(),\n    ...this.displayValueStyles(),\n  }));\n\n  /** The same value as the control shows it. Identity unless a control formats. */\n  get_formatted_value(): string {\n    const value = this.get_value();\n    return value === null || value === undefined ? '' : String(value);\n  }\n\n  /**\n   * A numeric control's value as page data should keep it. See\n   * `parseNumberValue` for why a non-numeric entry is passed through untouched.\n   *\n   * Held here rather than in each numeric component so the number and currency\n   * fields cannot drift on it, the same reason `formatNumericValue` is shared.\n   */\n  protected numericStoreValue(value: any): any {\n    return parseNumberValue(value);\n  }\n\n  protected matchColorRange(value: any, key: string = 'color_ranges'): ColorRange | null {\n    let ranges: any = key === 'color_ranges' ? this.modelColorRanges() : null;\n    if (!ranges) ranges = this.getProperty(key);\n    if (typeof ranges === 'string') {\n      try { ranges = JSON.parse(ranges); } catch { return null; }\n    }\n    if (!Array.isArray(ranges) || ranges.length === 0) return null;\n\n    const num = Number(value);\n    if (value === null || value === undefined || value === '' || isNaN(num)) return null;\n\n    const bound = (v: any): number | null => {\n      if (v === null || v === undefined || v === '') return null;\n      const n = Number(v);\n      return isNaN(n) ? null : n;\n    };\n\n    const match = ranges.find((r: any) => {\n      const from = bound(r?.from);\n      const to = bound(r?.to);\n      if (from !== null && num < from) return false;\n      if (to !== null && num > to) return false;\n      return true;\n    });\n    return match || null;\n  }\n\n  // Helper method to set property value at current breakpoint\n  protected setProperty(key: string, value: any) {\n    const component = this.component();\n    if (component) {\n      const breakpoint = this.store.viewport().breakpoint as TailwindBreakpoint | 'base';\n      this.store.updateComponentPropertyAtBreakpoint(component.id, key, value, breakpoint);\n    }\n  }\n\n  protected getStyleProperty(key: string) {\n    const defaultValue = this.getDefaultStyles()[key];\n    return this.getStylePropertyValue(this.component(), key, defaultValue);\n  }\n\n\n  // Static `required` validation rule on the component definition.\n  private hasRequiredRule(): boolean {\n    const component = this.component();\n    if (!component.validation_rules || !Array.isArray(component.validation_rules)) {\n      return false;\n    }\n    return component.validation_rules.some(rule => rule.type === 'required');\n  }\n\n  // Every field template binds [required] to this — it must reflect the\n  // EFFECTIVE mandatory state (the `mandatory` property incl. conditional\n  // expressions, falling back to a static required rule) so Material renders\n  // the required asterisk in the label whenever the field is mandatory.\n  protected hasRequiredValidation(): boolean {\n    return this.isComponentMandatory();\n  }\n\n  readonly fieldValue = computed(() => {\n    const fieldName = this.getProperty('name');\n    // Components inside a nested page (page_ref) must bind against THEIR\n    // page's entity, not the outer page's — getPageEntityName resolves the\n    // nested page's entity and falls back to the current page's for '' /\n    // unknown ids (getEntityField's own default).\n    const pageId = this.component()?.pageId || '';\n    const entityName = this.store.getPageEntityName(pageId);\n    return this.store.getEntityField(fieldName, entityName);\n  });\n\n  // Field/input components opt in so they gain a common \"Value Source\"\n  // (Page Data Field | Page State | App State) selector. Display components\n  // (text, badge, containers) and components that ship their own value_source\n  // (currency, status) leave this false. When true and value_source is\n  // 'state' or 'app', storeValue reads from — and edits write back to — the\n  // chosen state variable instead of page data.\n  protected supportsValueSource(): boolean {\n    return false;\n  }\n\n  protected readonly valueSourceMode = computed<'field' | 'state'>(() => {\n    if (!this.supportsValueSource()) return 'field';\n    const source = this.getProperty('value_source');\n    return (source === 'state' || source === 'app') ? 'state' : 'field';\n  });\n\n  /**\n   * Which state map a state-bound field reads and writes.\n   *\n   * App state is shared across pages and survives navigation, and its keys are\n   * not declared anywhere — so the key comes from a free-text property while\n   * page state keeps its picker of declared variables.\n   */\n  protected readonly valueStateScope = computed<'page' | 'app'>(() =>\n    this.getProperty('value_source') === 'app' ? 'app' : 'page');\n\n  /** The state variable this field binds to, in whichever scope is selected. */\n  /** Guards the state-default seeding below to one write per field. */\n  private defaultStateSeeded = false;\n\n  protected readonly boundStateKey = computed<string>(() => {\n    if (this.valueStateScope() === 'app') {\n      return String(this.getProperty('app_state_key') ?? '').trim();\n    }\n    return this.getProperty('state_key') || this.getProperty('name');\n  });\n\n  /** The state map behind `boundStateKey`, for reads and for value_path patching. */\n  protected boundStateMap(): Record<string, any> {\n    if (this.valueStateScope() === 'app') return this.store.appState() || {};\n    const pageId = this.component()?.pageId;\n    const dataKey = this.dataKey();\n    return pageId\n      ? this.store.getComputedPageStateFor(pageId, dataKey || undefined)\n      : this.store.computedPageState();\n  }\n\n  /**\n   * Read `path` out of a (possibly JSON-string) value.\n   *\n   * `[n]` indexes an array and `[*]` projects the rest of the path across every\n   * element — `rows[*].file_name` turns an array of row objects into an array\n   * of file names. A wildcard path is read-only: `setValueByPath` has no\n   * meaningful inverse for it, so a field that writes back should not use one.\n   */\n  private resolveValueByPath(value: any, path: string): any {\n    if (!path) return value;\n    let obj = value;\n    if (typeof obj === 'string') {\n      try { obj = JSON.parse(obj); } catch { return value; }\n    }\n    if (obj === null || typeof obj !== 'object') return value;\n    const segments = path.replace(/\\[(\\*|[^\\]]+)\\]/g, '.$1').split('.').filter(Boolean);\n    let current = obj;\n    for (let i = 0; i < segments.length; i++) {\n      if (current === null || current === undefined) return '';\n      if (segments[i] === '*') {\n        if (!Array.isArray(current)) return '';\n        const rest = segments.slice(i + 1).join('.');\n        return current\n          .map((item: any) => (rest ? this.resolveValueByPath(item, rest) : item))\n          .filter((v: any) => v !== undefined && v !== null && v !== '');\n      }\n      current = current[segments[i]];\n    }\n    return current ?? '';\n  }\n\n  /**\n   * Write `value` at `path` inside `target`, returning a new object — the\n   * inverse of resolveValueByPath.\n   *\n   * Needed because several fields commonly bind to ONE state variable, each\n   * reading its own path out of it (seven toggles on `program_data`, paths\n   * `sec_enabled` / `etf` / `ca` / ...). Writing the bare value to the variable\n   * replaced that whole object with a single boolean, after which every other\n   * field's path resolved against a non-object and fell back to the raw value —\n   * so flipping one toggle flipped all of them.\n   *\n   * A JSON string is re-serialised so the state variable keeps the shape it had.\n   */\n  private setValueByPath(target: any, path: string, value: any): any {\n    const segments = path.replace(/\\[(\\w+)\\]/g, '.$1').split('.').filter(Boolean);\n    if (segments.length === 0) return value;\n\n    let base = target;\n    let wasJsonString = false;\n    if (typeof base === 'string') {\n      try { base = JSON.parse(base); wasJsonString = true; } catch { base = undefined; }\n    }\n\n    const clone = (node: any) => (node && typeof node === 'object')\n      ? (Array.isArray(node) ? [...node] : { ...node })\n      : {};\n\n    const root = clone(base);\n    let cursor: any = root;\n    for (const segment of segments.slice(0, -1)) {\n      cursor[segment] = clone(cursor[segment]);\n      cursor = cursor[segment];\n    }\n    cursor[segments[segments.length - 1]] = value;\n\n    return wasJsonString ? JSON.stringify(root) : root;\n  }\n\n  // State-source resolution: reads the configured page state variable (with\n  // optional JSON path). Used by the mirror effect below to keep the field's\n  // page-data slot in step with the state variable.\n  protected readonly resolvedStateValue = computed(() => {\n    const key = this.boundStateKey();\n    if (!key) return undefined;\n    const state = this.boundStateMap();\n    return this.resolveValueByPath(state[key] ?? undefined, this.getProperty('value_path') || '');\n  });\n\n  protected readonly storeValue = computed(() => {\n    let key = this.getProperty('name');\n\n    // A state-bound field with no Name has no page-data slot: the mirror effect\n    // below bails on the empty name, so nothing ever reaches page data and the\n    // control stays blank. Read the state variable directly instead — a\n    // display-only field bound to page state (a selected-row count on a number,\n    // say) has no reason to be given a page-data field name it never writes.\n    if (this.valueSourceMode() === 'state' && !key) {\n      return this.resolvedStateValue();\n    }\n\n    // Row-scoped resolution: when rendered inside a board card, prefer the\n    // row data over page-level data so each card binds to its own row.\n    const rowVal = this.rowFieldValue(key);\n    if (rowVal !== undefined) return rowVal;\n\n    if (this.dataKey() !== '') {\n      key = this.dataKey() + '.' + key;\n    }\n    const fromPageData = this.store.getPageFieldData(key, this.component()?.pageId);\n    // A state-bound field renders from its page-data slot, which the mirror\n    // effect below keeps in step with the state variable — but that effect does\n    // not run on the designer canvas, so there the slot is empty and the field\n    // showed nothing for a state value it plainly had. Fall back to the\n    // variable itself whenever the slot has never been written; a slot that\n    // holds anything, including '', is a real page-data value and still wins.\n    if (fromPageData === undefined && this.valueSourceMode() === 'state') {\n      return this.resolvedStateValue();\n    }\n    return fromPageData;\n  });\n\n  /**\n   * Page-data key for a field on the SAME record as this component.\n   *\n   * `storeValue()` prefixes the component's own field with `dataKey()`, which is\n   * what makes a component inside an array-nested page_ref read its own row\n   * (`\"0.fa\"`). Any read of a *different* field on that record has to do the\n   * same: an unprefixed name has no record to resolve against, and\n   * `getPageFieldData` answers it with `records.map(d => d.entity_data)` — the\n   * whole array of rows. That is where the stray `[object Object]` came from:\n   * a currency's symbol field and a tile's value field both asked for a bare\n   * name and got the row array, which stringifies to exactly that.\n   */\n  protected scopedFieldKey(fieldName: string): string {\n    const dataKey = this.dataKey();\n    return dataKey !== '' ? `${dataKey}.${fieldName}` : fieldName;\n  }\n\n  /**\n   * A field's value read off the card's row, scoped the way page data is.\n   *\n   * The scoped key comes first for the same reason `storeValue` prefixes page\n   * data with it: inside a looped record card the component means its OWN\n   * record (`pj.0.fa`), and the row may well carry a field of the same bare\n   * name. The bare lookup stays as the fallback — that is every component\n   * directly on a card, where there is no data key at all.\n   */\n  protected rowFieldValue(fieldName: string): any {\n    if (!fieldName || !this.rowContext?.hasRow()) return undefined;\n    const scoped = this.scopedFieldKey(fieldName);\n    if (scoped !== fieldName) {\n      const scopedVal = this.rowContext.getFieldValue(scoped);\n      if (scopedVal !== undefined) return scopedVal;\n    }\n    return this.rowContext.getFieldValue(fieldName);\n  }\n\n  /**\n   * Current value of a SIBLING field, resolved the same way as this component's\n   * own value — row data first when rendered inside a board card, then\n   * page data under the same data key.\n   *\n   * Needed for a dependent dropdown: `dpef` names another field on the same\n   * record whose value scopes this field's option list, so the list cannot be\n   * requested without reading that field.\n   */\n  protected siblingFieldValue(fieldName: string): any {\n    if (!fieldName) return undefined;\n    const rowVal = this.rowFieldValue(fieldName);\n    if (rowVal !== undefined) return rowVal;\n    const key = this.scopedFieldKey(fieldName);\n    const fromPageData = this.store.getPageFieldData(key, this.component()?.pageId);\n    if (fromPageData !== undefined && fromPageData !== null && fromPageData !== '') {\n      return fromPageData;\n    }\n    // A sibling whose Value Source is 'state' never writes entity_data —\n    // onValueChange sends its edits to the page state variable instead — so a\n    // dependent dropdown reading page data alone saw nothing and silently\n    // fetched an unscoped list. Its state key defaults to the field name, which\n    // is the only handle available here.\n    const pageId = this.component()?.pageId;\n    if (!pageId) return fromPageData;\n    const state = this.store.getComputedPageStateFor(pageId, this.dataKey() || undefined);\n    const fromState = state?.[fieldName];\n    return fromState !== undefined ? fromState : fromPageData;\n  }\n\n  /**\n   * Run the subscriptions wired to an event.\n   *\n   * `subscriptionFilter` narrows the matches beyond the event name, for events\n   * where several subscriptions of the same type coexist and only one of them\n   * is meant to fire. A grid's 'Custom Action' is the case: every configured\n   * row action is its own `custom_action` subscription, and the click says\n   * which action it was — without the filter, clicking one icon would run\n   * every action on the grid.\n   */\n  protected emitEvent(eventType: string, data?: any, defaultSubscription?: ComponentEventSubscription, payloadOverride?: EventPayloadOverride, subscriptionFilter?: (subscription: ComponentEventSubscription) => boolean): void {\n    const component = this.component();\n\n    // The designer canvas renders live controls, so a click or a toggle there is\n    // an authoring gesture, not a user one — configured actions must not run\n    // while the page is being edited. Each DOM handler (onClick, onMouseEnter,\n    // ...) already checked this, but the component-specific emits did not, and\n    // `valueChange` is raised straight from onValueChange: flipping a slide\n    // toggle on the canvas fired its action. Guarding the one choke point covers\n    // every control and every event rather than one handler at a time.\n    //\n    // A component whose event reports state the canvas itself renders — not a\n    // gesture — opts out per event via `suppressEventsInEditMode`.\n    if (this.store.editMode() && !this.selfSeededChange && this.suppressEventsInEditMode(eventType)) {\n      return;\n    }\n\n    if (this.isComponentDisabled()) {\n      return;\n    }\n\n    // NOTE: deliberately no visibility guard here. It belongs on the sync\n    // effect's programmatic emit, not on this choke point: a container's\n    // condition often reads the very record a `row_select` -> `set-page-data`\n    // is about to supply, so while the page is still recordless that ancestor\n    // evaluates hidden — and suppressing here stopped the one action that would\n    // have given the page its record, leaving every save with a blank\n    // entity_id. Events that arrive from the DOM come from something the user\n    // could reach, so they need no such check.\n\n    const eventsSubscriptions = component.events;\n\n    const matchingEvents = (eventsSubscriptions?.filter(event => event.event === eventType) || [])\n      .filter(event => !subscriptionFilter || subscriptionFilter(event));\n\n    if (matchingEvents.length > 0) {\n      for (const eventSubscription of matchingEvents) {\n        if (eventSubscription.validate_before_action) {\n          const pageId = component.pageId || this.store.currentPage()?.id || '';\n          const scopedFields = eventSubscription.validate_field_names || [];\n          const isValid = scopedFields.length > 0\n            ? this.formValidationService.validateFields(pageId, scopedFields)\n            : this.formValidationService.validateForm(pageId);\n          if (!isValid) {\n            return;\n          }\n        }\n        this.processEventSubscription(eventSubscription, eventType, payloadOverride);\n      }\n    } else if (defaultSubscription) {\n      this.processEventSubscription(defaultSubscription, eventType, payloadOverride);\n    }\n  }\n\n  private processEventSubscription(eventSubscription: ComponentEventSubscription, eventType: string, payloadOverride?: EventPayloadOverride): void {\n    const component = this.component();\n    // Inside a board card the row is held by the card host's RowDataContext and\n    // never written to page data, so every record-shaped read below has to come\n    // from the row — the card page's page data is empty (or a stale sibling).\n    const rowRecord = this.rowContext?.hasRow() ? this.rowContext.getRecord() : null;\n    if (payloadOverride) {\n      eventSubscription.payload = {\n        entity_id: payloadOverride.entity_id || '',\n        entity_data: payloadOverride.entity_data || {}\n      };\n      eventSubscription.payload['entity_name'] = payloadOverride.entity_name || component.entityName;\n      // A grid row's edit belongs to that row's own entity, which is not\n      // necessarily the page's. `row_entity_name` is what tells the host app to\n      // save against it; it is set only for row-scoped edits, so page-scoped\n      // save-page-data subscriptions keep resolving the page entity as before.\n      if (payloadOverride.row_entity_name) {\n        eventSubscription.payload['row_entity_name'] = payloadOverride.row_entity_name;\n      }\n      if (payloadOverride.old_entity_data) {\n        eventSubscription.payload['old_entity_data'] = payloadOverride.old_entity_data;\n      }\n      if (payloadOverride.row !== undefined) {\n        eventSubscription.payload['row'] = payloadOverride.row;\n      }\n      if (payloadOverride.context) {\n        Object.assign(eventSubscription.payload, payloadOverride.context);\n      }\n    } else if (component.nesting_type === 'nested_array' && component.index !== undefined) {\n      const entityName = component.entityName || '';\n      // The record that holds the nested array: the hosting page_ref's own row\n      // when this loop sits inside a looped record card, else the page record.\n      const parentPageData = component.dataKeyPrefix\n        ? this.store.getPageRecord(component.pageId, component.dataKeyPrefix)\n        : (this.store.getPageData(component.pageId) || this.store.getPageData());\n      const nestedArray = parentPageData?.entity_data?.[entityName];\n      const rowData = Array.isArray(nestedArray) ? nestedArray[component.index] : {};\n      eventSubscription.payload = { entity_id: parentPageData?.entity_id || '', entity_data: rowData || {} };\n      eventSubscription.payload['entity_name'] = entityName;\n    } else if (component.nesting_type === 'array' && component.index !== undefined) {\n      const pageId = component.pageId || '';\n      const arr = this.store.getPageDataArray(pageId);\n      const row = arr[component.index];\n      eventSubscription.payload = row ? { ...row } : { entity_id: '', entity_data: {} };\n      eventSubscription.payload['entity_name'] = component.entityName;\n    } else if (rowRecord) {\n      eventSubscription.payload = { entity_id: rowRecord.entity_id, entity_data: rowRecord.entity_data };\n      // A component inside a board card carries no entityName of its own, so\n      // fall back to the entity of the page it belongs to (the card page). It\n      // was left undefined, which a host reading `payload.entity_name` — as\n      // save-page-data does to resolve a cross-page link — crashed on.\n      eventSubscription.payload['entity_name'] =\n        component.entityName || this.store.getPageEntityName(component.pageId || '') || '';\n    } else {\n      eventSubscription.payload = this.store.getPageData(this.component().pageId) || {};\n      eventSubscription.payload['entity_name'] = this.component().entityName;\n    }\n\n    // Whatever shape the payload took, a value change can say what it replaced.\n    // The record-shaped branches read the CURRENT row/page data, which by now\n    // already holds the new value, so the prior one has to be carried in.\n    if (this.pendingOldValue && eventSubscription.payload && !eventSubscription.payload['old_entity_data']) {\n      eventSubscription.payload['old_entity_data'] = {\n        [this.pendingOldValue.field]: this.pendingOldValue.value\n      };\n    }\n\n    // Handle internal actions\n    const targetPageId = component.pageId || this.store.currentPage()?.id || '';\n    const dataKey = this.dataKey();\n\n    // Author-added payload values (page state / page data / any expression).\n    // Resolved per subscription because each one declares its own, and after the\n    // record-shaped payload above so `extras` is never overwritten by it — and\n    // so `@column` can resolve against the record the event is ABOUT. For a\n    // drill that is the clicked row, which no other scope here holds: a grid is\n    // not inside a card, so it has no RowDataContext to read the row from.\n    const extras = this.resolvePayloadExtras(\n      eventSubscription, targetPageId, dataKey, eventSubscription.payload?.['entity_data']);\n    if (extras) eventSubscription.payload['extras'] = extras;\n\n    const fieldNames = eventSubscription.fieldNames || [];\n    const scopedFieldNames = fieldNames.map(f => (dataKey && f) ? `${dataKey}.${f}` : f);\n\n    if (eventSubscription.action === 'hide-fields' && scopedFieldNames.length > 0) {\n      this.store.setFieldVisibilityOverride(targetPageId, scopedFieldNames, false);\n    } else if (eventSubscription.action === 'unhide-fields' && scopedFieldNames.length > 0) {\n      this.store.setFieldVisibilityOverride(targetPageId, scopedFieldNames, true);\n    } else if (eventSubscription.action === 'hide-component' && fieldNames.length > 0) {\n      this.store.setComponentVisibilityOverride(fieldNames, false);\n    } else if (eventSubscription.action === 'show-component' && fieldNames.length > 0) {\n      this.store.setComponentVisibilityOverride(fieldNames, true);\n    } else if (eventSubscription.action === 'start-loading' && fieldNames.length > 0) {\n      this.store.setComponentLoadingState(fieldNames, true);\n    } else if (eventSubscription.action === 'stop-loading' && fieldNames.length > 0) {\n      this.store.setComponentLoadingState(fieldNames, false);\n    } else if (eventSubscription.action === 'disable-field' && scopedFieldNames.length > 0) {\n      this.store.setFieldDisabledOverride(targetPageId, scopedFieldNames, true);\n    } else if (eventSubscription.action === 'enable-field' && scopedFieldNames.length > 0) {\n      this.store.setFieldDisabledOverride(targetPageId, scopedFieldNames, false);\n    } else if (eventSubscription.action === 'update-state' && eventSubscription.state_key) {\n      // `state_scope: 'app'` sends the write to the root store's app state\n      // instead of this page's — see EruStudioStore.writeStateValue.\n      const scope = eventSubscription.state_scope;\n      const formula = eventSubscription.state_formula;\n      if (formula) {\n        if (formula.fn === 'expr' && formula.expr) {\n          const newVal = this.logicEvaluator.evaluateValue(formula.expr, targetPageId, dataKey || undefined, this.rowContext?.getData() ?? undefined);\n          this.store.writeStateValue(eventSubscription.state_key, newVal, scope, targetPageId, dataKey || undefined);\n        } else if (formula.fn === 'set-from-payload') {\n          const path = formula.payload_path || '';\n          const newVal = this.resolvePayloadPath(eventSubscription.payload, path);\n          this.store.writeStateValue(eventSubscription.state_key, newVal, scope, targetPageId, dataKey || undefined);\n        } else {\n          // The subscription payload goes along as the last resort for\n          // 'set-from-field': a value change carries the field that changed,\n          // which is the only place to read it when the control keeps its value\n          // in page/app state rather than in page data.\n          this.store.updateStateWithFormula(\n            eventSubscription.state_key, formula, targetPageId, dataKey || undefined, scope, rowRecord,\n            eventSubscription.payload as any);\n        }\n      } else if (eventSubscription.value_expression || eventSubscription.value !== undefined) {\n        // No formula: take the value straight from `value_expression`/`value`.\n        // This is how a JSON object reaches app state — formulas cannot carry one.\n        const newVal = this.resolveActionValue(eventSubscription, targetPageId, dataKey);\n        this.store.writeStateValue(eventSubscription.state_key, newVal, scope, targetPageId, dataKey || undefined);\n      }\n    } else if (eventSubscription.action === 'start-timer' && fieldNames.length > 0) {\n      this.store.dispatchComponentAction(fieldNames, 'start');\n    } else if (eventSubscription.action === 'stop-timer' && fieldNames.length > 0) {\n      this.store.dispatchComponentAction(fieldNames, 'stop');\n    } else if (eventSubscription.action === 'set-field' && eventSubscription.state_key) {\n      const fieldKey = dataKey ? `${dataKey}.${eventSubscription.state_key}` : eventSubscription.state_key;\n      const value = this.resolveActionValue(eventSubscription, targetPageId, dataKey);\n      const partialPageData: Partial<any> = { entity_data: { [fieldKey]: value } };\n      this.store.updatePageData(partialPageData, targetPageId);\n    } else if (eventSubscription.action === 'enable-component' && fieldNames.length > 0) {\n      this.store.setComponentDisabledState(fieldNames, false);\n    } else if (eventSubscription.action === 'disable-component' && fieldNames.length > 0) {\n      this.store.setComponentDisabledState(fieldNames, true);\n    } else if (eventSubscription.action === 'refresh-grid' && fieldNames.length > 0) {\n      this.store.dispatchComponentAction(fieldNames, 'refresh');\n    } else if (eventSubscription.action === 'download-grid' && fieldNames.length > 0) {\n      this.store.dispatchComponentAction(fieldNames, 'download');\n    } else if (eventSubscription.action === 'refresh-page-ref' && fieldNames.length > 0) {\n      this.store.dispatchComponentAction(fieldNames, 'refresh');\n    } else if (eventSubscription.action === 'toggle-side-panel' && fieldNames.length > 0) {\n      this.store.dispatchComponentAction(fieldNames, 'toggle-side-panel');\n    } else if (eventSubscription.action === 'open-side-panel' && fieldNames.length > 0) {\n      this.store.dispatchComponentAction(fieldNames, 'open-side-panel');\n    } else if (eventSubscription.action === 'close-side-panel' && fieldNames.length > 0) {\n      this.store.dispatchComponentAction(fieldNames, 'close-side-panel');\n    } else if (eventSubscription.action === 'step-forward' && fieldNames.length > 0) {\n      this.store.dispatchComponentAction(fieldNames, 'step-forward');\n    } else if (eventSubscription.action === 'step-back' && fieldNames.length > 0) {\n      this.store.dispatchComponentAction(fieldNames, 'step-back');\n    } else if (eventSubscription.action === 'set-active-tab' && fieldNames.length > 0) {\n      this.store.dispatchComponentAction(\n        fieldNames,\n        'set-active-tab',\n        this.resolveActionValue(eventSubscription, targetPageId, dataKey)\n      );\n    } else if (eventSubscription.action === 'emit-to-parent' && eventSubscription.state_key) {\n      this.store.emitToParentPage(eventSubscription.state_key, targetPageId, eventSubscription.payload);\n    } else if (eventSubscription.action === 'update-property' && fieldNames.length > 0 && eventSubscription.property_key) {\n      const value = this.resolveActionValue(eventSubscription, targetPageId, dataKey);\n      this.store.setComponentPropertyOverride(fieldNames, eventSubscription.property_key, value);\n    } else if (eventSubscription.action === 'navigate-to-page' && eventSubscription.page_id) {\n      this.store.navigateToPage(\n        eventSubscription,\n        targetPageId,\n        dataKey,\n        expr => this.logicEvaluator.evaluateValue(expr, targetPageId, dataKey || undefined)\n      );\n    } else if (eventSubscription.action === 'set-page-data') {\n      // The record the event carries (a row select hands over the selected row)\n      // unless the subscription names a state variable to read it from.\n      this.store.applyPageRecordSource(eventSubscription, targetPageId, eventSubscription.payload);\n    } else if (eventSubscription.action === 'download-file') {\n      // No response behind a direct component event, so 'response' resolves to\n      // the event payload — the file may already be in the record on screen.\n      this.store.downloadFileFromAction(\n        eventSubscription, targetPageId, eventSubscription.payload, dataKey || undefined);\n    } else if (eventSubscription.action === 'clear-page-data') {\n      this.store.clearPageData(targetPageId);\n    } else if (eventSubscription.action === 'clear-all-page-data') {\n      this.store.clearAllPageData();\n    }\n\n    // On a COPY: these two are runtime bookkeeping for whoever handles the\n    // emitted action, and the subscription they would otherwise be written to is\n    // the one living in the page's own components array. Mutating it meant every\n    // press of a button added _originPageId / _originDataKey to the page, Save\n    // persisted them, and the next agent edit was rejected against the component\n    // library for carrying event keys the catalog does not allow.\n    this.store.setComponentEventEmitted(component.id, eventType, {\n      ...eventSubscription,\n      _originPageId: targetPageId,\n      _originDataKey: dataKey,\n    } as any);\n  }\n\n  /**\n   * Resolve a subscription's `payload_extras` into a flat {key: value} map.\n   *\n   * Each entry names a payload key and an expression evaluated in this\n   * component's scope: `@state.fd`, `@app.x`, `@page.x`, and a bare `@column`\n   * for a field of `record` — the record the event fired on, which for a drill\n   * is the clicked row. That last one is why `record` is passed in rather than\n   * read from the row context: the row context is a board-card thing, and a\n   * grid has none.\n   *\n   * Returns undefined when nothing is configured, so the payload keeps its\n   * previous shape for every event that does not use this.\n   */\n  /** Expression prefixes that identify a path, so one written without '@' is\n   *  still recognisable as an expression rather than a literal. */\n  private static readonly EXPR_NAMESPACE = /^(column|row|state|app|page)\\./;\n\n  private resolvePayloadExtras(\n    sub: ComponentEventSubscription,\n    pageId: string,\n    dataKey: string,\n    record: any\n  ): Record<string, any> | undefined {\n    const list = sub.payload_extras;\n    if (!Array.isArray(list) || list.length === 0) return undefined;\n    const out: Record<string, any> = {};\n    for (const entry of list) {\n      const key = (entry?.param || '').trim();\n      if (!key) continue;\n      const raw = (entry.value_expression || '').trim();\n      if (!raw) {\n        out[key] = entry.value;\n        continue;\n      }\n      // A namespace written without the leading '@' is what an author types when\n      // they are thinking of the path rather than the syntax. Accept it: the\n      // alternative is that the evaluator runs it as JS, throws on the unknown\n      // identifier, and hands back the source text — which then travels on as a\n      // value and lands in a target page's state as the literal\n      // \"column.referrer_name\".\n      const expr = (!raw.includes('@') && BaseComponent.EXPR_NAMESPACE.test(raw)) ? '@' + raw : raw;\n      const value = this.logicEvaluator.evaluateValue(\n        expr, pageId, dataKey || undefined,\n        (record && typeof record === 'object') ? record : undefined);\n      // Same failure mode, for anything else that does not evaluate: an\n      // expression that came back as its own source did not resolve, so drop the\n      // key rather than send the formula as if it were the answer.\n      if (expr.includes('@') && typeof value === 'string' && value === expr) {\n        console.warn('eru-studio: payload extra did not resolve, skipped', key, expr);\n        continue;\n      }\n      out[key] = value;\n    }\n    return Object.keys(out).length > 0 ? out : undefined;\n  }\n\n  // Resolve the value for set-field / update-property actions. When a\n  // `value_expression` is provided it is evaluated against page state/data\n  // (e.g. \"@view == 'kanban' ? 'board' : 'table'\"); otherwise the static\n  // `value` is used.\n  private resolveActionValue(sub: ComponentEventSubscription, pageId: string, dataKey: string): any {\n    const expr = sub.value_expression;\n    if (expr && expr.trim()) {\n      return this.logicEvaluator.evaluateValue(expr, pageId, dataKey || undefined, this.rowContext?.getData() ?? undefined);\n    }\n    return sub.value;\n  }\n\n  /**\n   * Convert a form control's value into the representation page data keeps.\n   * Inverse of `controlValueFor`, and identity unless a control's editor works\n   * in a different type than the one that is stored — the datepicker hands back\n   * a `Date` where the store holds a `yyyy-MM-dd` string.\n   *\n   * Without this the raw control value was written and announced: a date picked\n   * as 20-08 reached subscribers as `2026-08-19T18:30:00.000Z`, the previous day\n   * in any timezone east of UTC.\n   */\n  protected storeValueFor(controlValue: any): any {\n    return controlValue;\n  }\n\n  /**\n   * The field's value for anything a template renders — the stored value, with\n   * the form control consulted only while the store holds nothing.\n   *\n   * `formControl.value` is a plain property, not a signal, so a computed that\n   * read it never re-ran when the control changed: a display built on it kept\n   * showing whatever the value was the first time it evaluated, and an edit made\n   * in place appeared to revert the moment the control returned to view mode.\n   * Reading `storeValue()` first makes the store the reactive source, and it is\n   * kept current on every keystroke by the value-change path.\n   */\n  protected reactiveFieldValue(): any {\n    const stored = this.storeValue();\n    if (stored !== undefined && stored !== null && stored !== '') return stored;\n    return this.formControl ? this.formControl.value : stored;\n  }\n\n  /** Last value announced, so one edit is never announced twice. */\n  private lastAnnouncedValue: any = Symbol('no-value-announced');\n\n  /**\n   * Keep the card's own row in step with an edit made inside it.\n   *\n   * `storeValue()` prefers the row context over page data whenever the component\n   * renders inside a board card, so writing the edit only to page data left the\n   * card still showing the old value. No-ops outside a card.\n   */\n  protected writeRowValue(fieldName: string, value: any): void {\n    if (!fieldName || !this.rowContext?.hasRow()) return;\n    this.rowContext.setFieldValue(fieldName, value);\n  }\n\n  /**\n   * Announce a value change, once.\n   *\n   * A change can reach here twice for a single edit: the form control's\n   * `valueChanges` fires when the editor writes it, and controls that own a\n   * change handler (date's `dateChange`, checkbox, rating, …) also call\n   * `onValueChange`. Both paths are needed — the ten controls without a handler\n   * have only the subscription — so the duplicate is suppressed here instead.\n   * Only a repeat of the value just announced is dropped; going A → B → A still\n   * announces three times.\n   */\n  private announceValueChange(newValue: any, oldValue?: any): void {\n    if (this.lastAnnouncedValue === newValue) return;\n    // Suppressed in edit mode by emitEvent — so don't record the value as\n    // announced either, or setting the same value again in view mode would look\n    // like a repeat and the action would never run. A self-seed is exempt: it\n    // is the control's own doing, not an authoring gesture.\n    if (this.store.editMode() && !this.selfSeededChange) return;\n    this.lastAnnouncedValue = newValue;\n    const component = this.component();\n    // Handed to processEventSubscription so the value being replaced reaches the\n    // payload in BOTH modes. The record-shaped payload is assembled from the row\n    // or the page data, neither of which remembers what a field held a moment\n    // ago, so old_entity_data was arriving empty unless the whole payload was\n    // narrowed to the changed field.\n    const fieldName = this.getProperty('name');\n    this.pendingOldValue = fieldName ? { field: fieldName, value: oldValue } : null;\n    this.emitEvent(\n      'valueChange',\n      {\n        componentId: component.id,\n        componentType: component.type,\n        newValue: newValue,\n        timestamp: Date.now()\n      },\n      undefined,\n      this.changedFieldPayload(newValue, oldValue)\n    );\n    this.pendingOldValue = null;\n  }\n\n  /** Field and prior value of the change currently being announced, if any. */\n  private pendingOldValue: { field: string; value: any } | null = null;\n\n  /**\n   * Whether the change being announced is one the CONTROL made for itself —\n   * 'Auto Select First Option' seeding an empty field — rather than a gesture\n   * the author made on the designer canvas.\n   *\n   * Edit mode suppresses configured actions because a click or a toggle there\n   * is authoring, not use. A self-seed is neither: it is the control doing at\n   * design time exactly what it will do on load, and the page is built around\n   * what follows from it — the dependent dropdown whose list is fetched for\n   * the seeded parent. Suppressing it left the author looking at an empty\n   * currency list with no way to fill it.\n   */\n  private selfSeededChange = false;\n\n  /**\n   * Run a value write as a self-seeded change, so its Value Change actions\n   * fire on the designer canvas too. See `selfSeededChange`.\n   */\n  protected asSelfSeededChange(run: () => void): void {\n    const previous = this.selfSeededChange;\n    this.selfSeededChange = true;\n    try {\n      run();\n    } finally {\n      this.selfSeededChange = previous;\n    }\n  }\n\n  /**\n   * Forget the last announcement, so re-applying the same value counts as a new\n   * change. Needed where a write was lost rather than superseded — a default\n   * seeded before the page's data load is wiped by it, and the re-seed has to\n   * announce again or the actions listening to it never re-run.\n   */\n  protected resetValueAnnouncement(): void {\n    this.lastAnnouncedValue = Symbol('no-value-announced');\n  }\n\n  /**\n   * Payload carrying only the field that changed, when the component asks for it\n   * via `value_change_payload`.\n   *\n   * The default payload is the whole record — the card's entire row, or the\n   * page's data — which is right for a save triggered by a Save button but wrong\n   * for a single edit: it writes back every key it was given, including the\n   * query aliases a board row carries (a computed `o_sn`, a `rsts` that is not\n   * even the stored field), and it cannot say what the value used to be.\n   *\n   * Returning undefined leaves the existing record-shaped payload in place.\n   */\n  private changedFieldPayload(newValue: any, oldValue: any): EventPayloadOverride | undefined {\n    if (this.getProperty('value_change_payload') !== 'changed_field') return undefined;\n    const fieldName = this.getProperty('name');\n    if (!fieldName) return undefined;\n    const component = this.component();\n    const record = this.rowContext?.hasRow() ? this.rowContext.getRecord() : null;\n    const entityName = component.entityName || this.store.getPageEntityName(component.pageId || '') || '';\n    return {\n      entity_id: record?.entity_id || this.store.getPageData(component.pageId)?.entity_id || '',\n      entity_data: { [fieldName]: newValue },\n      old_entity_data: { [fieldName]: oldValue },\n      entity_name: entityName,\n      // Tells the host to save against this entity rather than re-resolving it\n      // from the page — the row a card edits is rarely the page's own record.\n      row_entity_name: entityName,\n      row: record?.entity_data\n    };\n  }\n\n  // Value change tracking\n  protected onValueChange(newValue: any): void {\n    // Read before anything is written, so the change can report what it replaced.\n    const previousValue = this.storeValue();\n    const controlValue = this.controlValueFor(newValue);\n    if (this.formControl && this.formControl.value !== controlValue) {\n      this.formControl.setValue(controlValue, { emitEvent: false });\n      this.updateValidationErrors();\n    }\n\n    this.writeStoreValue(newValue);\n\n    // 'Default From State' is two-way: a field seeded from a state variable\n    // keeps that variable current. Runs after the branch above, not instead of\n    // it, so the page-data write is untouched.\n    this.writeBackToDefaultState(newValue);\n\n    this.announceValueChange(newValue, previousValue);\n  }\n\n  /**\n   * Write a value to wherever this field's value lives — the bound state\n   * variable, or page data (and the enclosing card's row).\n   *\n   * Split out of `onValueChange` so a component can correct what the store\n   * already holds without it looking like a user edit: the checkbox rewrites a\n   * boolean `true` as the configured `value_true` (\"Y\") on load, and that must\n   * not sync the control or announce a `valueChange` the author never made.\n   */\n  protected writeStoreValue(newValue: any): void {\n    const component = this.component();\n\n    // Value Source = state: edits write to the bound state variable (two-way).\n    // When that key is linked to a parent page (same-named parent state var),\n    // setPageStateValue redirects the write to the parent — so a child field's\n    // value becomes available in the parent's state (and any parent payload\n    // referencing state:<key>). The mirror effect then reflects the new state\n    // value back into this field's entity_data slot, keeping save-page-data\n    // correct. So no direct entity_data write is needed here for state fields.\n    let key = this.getProperty('name')\n    if (this.valueSourceMode() === 'state') {\n      const stateKey = this.boundStateKey();\n      if (stateKey) {\n        // A value_path means this field owns one slot inside the state variable,\n        // not the whole variable — patch that slot and leave its siblings alone.\n        const valuePath = String(this.getProperty('value_path') ?? '').trim();\n        let stateValue = newValue;\n        if (valuePath) {\n          stateValue = this.setValueByPath(this.boundStateMap()[stateKey], valuePath, newValue);\n        }\n        this.store.writeStateValue(stateKey, stateValue, this.valueStateScope(), component.pageId, this.dataKey() || undefined);\n      }\n    } else {\n      if (this.dataKey() != '') {\n        key = this.dataKey() + '.' + key;\n      }\n      const partialPageData: Partial<PageData> = {\n        entity_data: {\n          [key]: newValue\n        }\n      }\n\n      // Update page data in store - the store will handle if it's an object or array page\n      this.store.updatePageData(partialPageData, component.pageId);\n      this.writeRowValue(this.getProperty('name'), newValue);\n    }\n  }\n\n  constructor() {\n    // Server-side validation verdicts arrive asynchronously on the shared\n    // dynamic-data channel; every field component gets this without extra wiring.\n    effect(() => {\n      this.store.dynamicDataResponses();\n      this.consumeServerValidationResponse();\n    });\n\n    // A form-level check (Save, or a validate-before-action) marks controls\n    // touched without emitting a status change, so the per-field message had no\n    // trigger to refresh from — see FormValidationService.validationTick.\n    effect(() => {\n      this.formValidationService.validationTick();\n      untracked(() => this.updateValidationErrors());\n    });\n\n    effect(() => {\n      const loading = this.isComponentLoading() || this.isAwaitingEntityMetadata();\n      const el = this.elementRef.nativeElement;\n      if (loading) {\n        this.renderer.addClass(el, 'eru-component-loading');\n      } else {\n        this.renderer.removeClass(el, 'eru-component-loading');\n      }\n    });\n\n    // Re-bind DOM listeners when the subscriptions change OR when the control\n    // swaps which element it renders. Listeners are attached to an element found\n    // by querySelector, so a value control that only renders its input in edit\n    // mode had nothing to bind to while it sat in view mode — getTargetElement\n    // quietly fell back to the host, and `blur` does not bubble, so the event\n    // could never fire even once the input appeared.\n    //\n    // Binding runs after the next render: at effect time the template for the\n    // new mode has not necessarily been written to the DOM yet, so querying here\n    // would find the element that is on its way out.\n    effect(() => {\n      this.component();\n      this.readRenderedMode();\n      afterNextRender(() => this.setupEventListeners(), { injector: this.injector });\n    });\n\n    // Watch for identifier/name changes and re-register form control\n    effect(() => {\n      const component = this.component();\n      const fieldName = this.getProperty('name');\n      const identifier = this.getProperty('identifier');\n\n      if (component) {\n        const shouldHaveControl = identifier && fieldName;\n        const hasControl = !!this.formControl;\n\n        if (shouldHaveControl && !hasControl) {\n          this.unregisterFormControl();\n          this.registerFormControl();\n        } else if (!shouldHaveControl && hasControl) {\n          this.unregisterFormControl();\n        }\n      }\n    });\n\n    // Seed the field's default value: when the component renders as a live\n    // form field (runtime, not the designer canvas) and the stored value is\n    // undefined or null, populate the effective default into the page data.\n    // A blank string ('') is a deliberate user value and is never replaced.\n    effect(() => {\n      if (this.store.editMode()) return;\n      const component = this.component();\n      if (!component) return;\n      if (this.rowContext?.hasRow()) return;\n      // State-bound fields own their value via the state variable; page-data\n      // default seeding does not apply.\n      if (this.valueSourceMode() === 'state') return;\n      const fieldName = this.getProperty('name');\n      if (!fieldName) return;\n      const def = this.effectiveDefaultValue();\n      if (def === undefined) return;\n      const current = this.storeValue();\n      if (current !== undefined && current !== null) return;\n      untracked(() => {\n        let key = fieldName;\n        if (this.dataKey() !== '') {\n          key = this.dataKey() + '.' + key;\n        }\n        this.store.updatePageData({ entity_data: { [key]: def } }, component.pageId);\n      });\n    });\n\n    // Value Source = state: seed the state variable from the field's default.\n    //\n    // The page-data seeding above deliberately skips state-bound fields, which\n    // left a filter showing a default it had never written anywhere. A date with\n    // Default Date = Current Date rendered today's date while its state variable\n    // stayed empty, so a query driven by that filter through api_payload_fields\n    // was called with \"\" — the control said one thing and the payload said\n    // another, and the query failed or returned nothing.\n    //\n    // Seeded once per field: a user who clears the filter has cleared it, and\n    // must not have the default pushed back in underneath them.\n    //\n    // Runs on the designer canvas too. The write is the control's own doing,\n    // not an authoring gesture — the same reason a dropdown's 'Auto Select\n    // First Option' seeds there (see BaseComponent.selfSeededChange) — and\n    // skipping it left the canvas showing a date whose state variable was\n    // empty, so everything reading that variable there (a grid's payload, a\n    // page-state panel the author is checking) disagreed with the control.\n    effect(() => {\n      if (!this.supportsValueSource()) return;\n      if (this.valueSourceMode() !== 'state') return;\n      if (this.defaultStateSeeded) return;\n      const component = this.component();\n      if (!component) return;\n      if (this.rowContext?.hasRow()) return;\n      const key = this.boundStateKey();\n      if (!key) return;\n      const current = this.resolvedStateValue();\n      if (current !== undefined && current !== null && current !== '') return;\n      const def = this.effectiveDefaultValue();\n      if (def === undefined || def === null || def === '') return;\n      this.defaultStateSeeded = true;\n      untracked(() => {\n        this.store.writeStateValue(\n          key,\n          def,\n          this.valueStateScope() === 'app' ? 'app' : 'page',\n          component.pageId,\n          this.dataKey() || undefined,\n        );\n      });\n    });\n\n    // Value Source = state: mirror the chosen state variable into this field's\n    // page-data slot (entity_data[name]) so the field both displays the state\n    // value AND — when it is a Form Field — includes it in save-page-data.\n    // Tracks the resolved state value only (writes are untracked), so a user\n    // edit persists in page data until the state value next changes.\n    effect(() => {\n      if (!this.supportsValueSource()) return;\n      if (this.valueSourceMode() !== 'state') return;\n      if (this.store.editMode()) return;\n      const component = this.component();\n      if (!component) return;\n      if (this.rowContext?.hasRow()) return;\n      const fieldName = this.getProperty('name');\n      if (!fieldName) return;\n      const value = this.resolvedStateValue();\n      const key = this.dataKey() ? `${this.dataKey()}.${fieldName}` : fieldName;\n      untracked(() => {\n        const current = this.store.getPageFieldData(key, component.pageId);\n        if (current === value) return;\n        this.store.updatePageData({ entity_data: { [key]: value } }, component.pageId);\n      });\n    });\n\n    // Sync store data back to formControl.\n    // Coerce undefined/null to '' so that clearing pageData (e.g. via clear-page-data)\n    // wipes the form control instead of leaving stale values in the input.\n    effect(() => {\n      const value = this.storeValue();\n      const component = this.component();\n      if (!this.formControl) return;\n      // Which record this control is looking at. A change of identity means the\n      // page was handed a different record and this control is re-syncing to\n      // it — not a user edit — so the announcement below is skipped.\n      //\n      // Read off the very page data the control renders from, deliberately: a\n      // counter bumped inside setPageData only works when the control and the\n      // set-page-data run against the SAME store, and a nested canvas gives its\n      // children a different one. The counter then never advanced on the\n      // control's side and every row select announced a change, saving the\n      // record that had just been selected. The identity cannot miss that,\n      // because it is the same value the control renders.\n      const syncedRecordId = String(this.store.getPageData(component?.pageId)?.entity_id ?? '');\n      const recordSwapped = this._syncedRecordId !== syncedRecordId;\n      this._syncedRecordId = syncedRecordId;\n      // A control that was hidden and is now showing the new value is coming\n      // INTO view, not reporting a change — the same reason hydration is\n      // excluded below. Two controls on one field, each in the container for\n      // its own case, flip visibility on the very edit that changes the field:\n      // without this the incoming twin announced the value its counterpart had\n      // just written and ran the author's action a second time.\n      const visibleNow = this.isEffectivelyVisible();\n      const wasVisible = this._syncWasVisible;\n      this._syncWasVisible = visibleNow;\n      const next = this.controlValueFor(value) ?? '';\n      if (this.formControl.value !== next) {\n        // Read before the write below overwrites it — this is the only place the\n        // value being replaced still exists, and the payload has to report it.\n        const previous = this.storeValueFor(this.formControl.value);\n        this.formControl.setValue(next, { emitEvent: false });\n        // Only propagate a `valueChange` ACTION for a genuine store-side change\n        // at runtime — never on the initial hydration of a freshly (re)created\n        // control, and never on the designer canvas. Emitting on hydration runs\n        // user valueChange subscriptions (e.g. update-state) with an empty\n        // payload, clobbering unrelated state variables on load and on every\n        // property-panel edit (which recreates the control with a null value).\n        //\n        // A record swap is excluded for the same reason: selecting a row only\n        // asks the page to DISPLAY that record, so every bound control\n        // re-syncing to it would otherwise fire the author's `save-page-data`\n        // and write the freshly selected record straight back to the host.\n        if (component && this._syncHydrated && !recordSwapped && wasVisible && visibleNow && !this.store.editMode()) {\n          // Same payload treatment a change announced by this control's own\n          // editor gets. Without it this emit ignored `value_change_payload`\n          // and reported no old value, so two controls bound to one field made\n          // an edit on either of them save the WHOLE record with an empty\n          // old_entity_data — the narrow payload the author asked for went out\n          // for the edited control and the full record for its twin.\n          const fieldName = this.getProperty('name');\n          this.pendingOldValue = fieldName ? { field: fieldName, value: previous } : null;\n          this.emitEvent(\n            'valueChange',\n            {\n              componentId: component.id,\n              componentType: component.type,\n              newValue: next,\n              timestamp: Date.now()\n            },\n            undefined,\n            this.changedFieldPayload(value, previous)\n          );\n          this.pendingOldValue = null;\n        }\n      }\n      this._syncHydrated = true;\n    });\n\n    effect(() => {\n      const isVisible = this.isComponentVisible() && !this.isHiddenByEvent();\n      if (isVisible) {\n        this.renderer.removeStyle(this.elementRef.nativeElement, 'display');\n      } else {\n        this.renderer.setStyle(this.elementRef.nativeElement, 'display', 'none');\n      }\n    });\n\n    // Handle conditional disabled status\n    effect(() => {\n      const isDisabled = this.isComponentDisabled();\n      if (this.formControl) {\n        if (isDisabled && this.formControl.enabled) {\n          this.formControl.disable({ emitEvent: false });\n        } else if (!isDisabled && this.formControl.disabled) {\n          this.formControl.enable({ emitEvent: false });\n        }\n      }\n    });\n  }\n\n  // Dynamic event binding methods\n  ngOnInit(): void {\n    // Register component schema\n    const component = this.component();\n    if (component) {\n      const propertySchema = this.getPropertySchema();\n      this.schemaService.registerComponentSchema(\n        component.type,\n        propertySchema,\n        this.getStyleSchema(),\n        this.getComponentEvents()\n      );\n\n      // Trigger on_value_change for all properties on init to ensure data dependencies are met\n      propertySchema.forEach(prop => {\n        if (prop.on_value_change) {\n          const value = this.getPropertyValue(component, prop.key, prop.default_value);\n          prop.on_value_change(value, '');\n        }\n      });\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.unregisterFormControl();\n    this.removeAllEventListeners();\n  }\n\n  protected registerFormControl(): void {\n    const component = this.component();\n    const page = this.store.currentPage();\n    if (component && page) {\n      const fieldName = this.getProperty('name');\n      const identifier = this.getProperty('identifier');\n      if (identifier && fieldName) {\n        const pageId = component.pageId || page.id;\n        this.formControl = this.formValidationService.registerFormControl(component, pageId);\n\n        if (this.formControl) {\n          const initialValue = this.controlValueFor(this.storeValue());\n          if (initialValue !== undefined && this.formControl.value !== initialValue) {\n            this.formControl.setValue(initialValue, { emitEvent: false });\n          }\n\n          this.formControl.valueChanges.subscribe(rawValue => {\n            // The editor's own type, converted to what the store keeps — see\n            // storeValueFor(). Comparing and writing the raw value is what put a\n            // Date into page data and announced it as a UTC instant.\n            const value = this.storeValueFor(rawValue);\n            const storeVal = this.storeValue();\n            if (value !== storeVal) {\n              let key = fieldName;\n              if (this.dataKey() !== '') {\n                key = this.dataKey() + '.' + fieldName;\n              }\n              const partialPageData: Partial<PageData> = {\n                entity_data: {\n                  [key]: value\n                }\n              };\n\n              this.store.updatePageData(partialPageData, component.pageId);\n              this.writeRowValue(fieldName, value);\n              this.announceValueChange(value, storeVal);\n            }\n          });\n\n          this.formControl.statusChanges.subscribe(() => {\n            this.updateValidationErrors();\n          });\n\n          this.updateValidationErrors();\n        }\n      }\n    }\n  }\n\n  protected unregisterFormControl(): void {\n    const component = this.component();\n    const page = this.store.currentPage();\n    if (component && page) {\n      const pageId = component.pageId || page.id;\n      this.formValidationService.unregisterFormControl(component.id, pageId);\n      this.formControl = null;\n    }\n  }\n\n  protected updateValidationErrors(): void {\n    if (!this.formControl || !this.formControl.touched || this.formControl.valid) {\n      this.validationErrorsSignal.set([]);\n      return;\n    }\n    this.validationErrorsSignal.set(this.formValidationService.getControlErrors(this.formControl));\n  }\n\n  protected markControlAsTouched(): void {\n    if (this.formControl) {\n      this.formControl.markAsTouched();\n      this.updateValidationErrors();\n    }\n    this.requestServerSideValidation();\n  }\n\n  // ===== SERVER-SIDE VALIDATION =====\n  // Request id of the in-flight check, and the value it was issued for. Held so\n  // a superseded response can be discarded — the user may edit again before a\n  // slow check returns, and a stale verdict must not overwrite a newer one.\n  private ssvRequestId: string | null = null;\n  private ssvRequestedValue: any = undefined;\n\n  /** Server-side validation message for this field, or '' when none. */\n  readonly serverValidationMessage = signal<string>('');\n  /** True when the last server-side check reported an error. */\n  readonly serverValidationFailed = signal<boolean>(false);\n\n  /**\n   * Ask the host app to validate this field's value, when the bound data-model\n   * field sets `system_validate`.\n   *\n   * Runs on focus-out. The request goes over the same dynamic-data channel as a\n   * dropdown's option fetch — neither library makes HTTP calls, the host does —\n   * under the type `ds_server_validation`. The host answers with\n   * `{ status: 'success' | 'error', msg }`.\n   *\n   * The entered value is never reverted: the check reports, it does not correct.\n   * Navigation is never blocked either, so a slow check cannot trap the user in\n   * a field.\n   */\n  protected requestServerSideValidation(): void {\n    const field: any = this.fieldValue();\n    if (!field) return;\n    const flag = field.system_validate;\n    const enabled = flag === true || String(flag ?? '').toLowerCase() === 'true';\n    if (!enabled) return;\n\n    const component = this.component();\n    if (!component) return;\n    const value = this.storeValue();\n    // Nothing to check, and an empty value is the mandatory rule's business.\n    if (value === null || value === undefined || value === '') {\n      this.serverValidationMessage.set('');\n      this.serverValidationFailed.set(false);\n      return;\n    }\n    // Same value as the in-flight or last completed check — don't re-ask.\n    if (this.ssvRequestedValue !== undefined && this.ssvRequestedValue === value) return;\n\n    this.ssvRequestedValue = value;\n    this.ssvRequestId = this.store.requestDynamicData(component.id, 'ds_server_validation', {\n      field_name: this.getProperty('name'),\n      value,\n      ssv_api: field.ssv_api || '',\n      entity_name: this.store.getPageEntityName(component.pageId || ''),\n    });\n  }\n\n  /**\n   * Consume a server-side validation response. Called from an effect set up in\n   * the constructor so every field component gets it without extra wiring.\n   */\n  private consumeServerValidationResponse(): void {\n    const reqId = this.ssvRequestId;\n    if (!reqId) return;\n    const response = this.store.dynamicDataResponses().get(reqId);\n    if (response === undefined) return;\n\n    // Discard a verdict for a value the user has since changed.\n    const stale = this.ssvRequestedValue !== this.storeValue();\n    untracked(() => {\n      this.store.removeDynamicDataRequest(reqId);\n      this.ssvRequestId = null;\n      if (stale) return;\n      const status = String(response?.status ?? '').toLowerCase();\n      const msg = String(response?.msg ?? '');\n      const failed = status === 'error';\n      this.serverValidationFailed.set(failed);\n      this.serverValidationMessage.set(msg);\n      // The host renders the snackbar — neither library has one, and both\n      // already delegate every other I/O concern to it. Only surfaced when there\n      // is something to say.\n      if (msg.length > 0) {\n        this.store.setServerValidationNotice?.({\n          componentId: this.component()?.id || '',\n          field_name: this.getProperty('name'),\n          status: failed ? 'error' : 'success',\n          msg,\n        });\n      }\n    });\n  }\n\n  /**\n   * Register a dependency on a value control's view/edit mode.\n   *\n   * The nineteen value controls each declare their own `_mode` signal rather\n   * than inheriting one, so it is read reflectively: a component that has one\n   * contributes the dependency, and anything else contributes none. Only the\n   * read matters — the value is unused.\n   */\n  private readRenderedMode(): void {\n    const mode = (this as unknown as { _mode?: () => unknown })._mode;\n    if (typeof mode === 'function') mode();\n  }\n\n  protected setupEventListeners(): void {\n    // Remove existing listeners first\n    this.removeAllEventListeners();\n    this.addEventListeners(this.getEvents());\n  }\n\n\n\n  private getEvents(): string[] {\n    const component = this.component();\n    if (!component.events || component.events.length === 0) {\n      return [];\n    }\n    // Return unique event types to avoid binding multiple DOM listeners for the same event\n    return [...new Set(component.events.map(event => event.event))];\n  }\n\n  private addEventListeners(events: string[]): void {\n    const eventMap = this.getEventMap();\n    // Get the target element for event binding\n    const targetElement = this.getTargetElement();\n\n    events.forEach(event => {\n      if (eventMap[event]) {\n        const eventTargetElement = this.getTargetElement(event);\n        this.eventListeners[event] = this.renderer.listen(\n          eventTargetElement,\n          event,\n          (eventData) => {\n            eventMap[event](eventData);\n          }\n        );\n      }\n    });\n  }\n\n  private getTargetElement(event?: string): HTMLElement {\n    // Check for event-specific target first\n    if (event) {\n      const eventTargets = this.getEventTargets();\n      if (eventTargets[event]) {\n        const targetElement = this.elementRef.nativeElement.querySelector(eventTargets[event]);\n        if (targetElement) {\n          return targetElement;\n        }\n      }\n    }\n\n    // Fallback to general target selector\n    if (this.targetElementSelector) {\n      const targetElement = this.elementRef.nativeElement.querySelector(this.targetElementSelector);\n      if (targetElement) {\n        return targetElement;\n      }\n    }\n\n    // Final fallback to the host element\n    return this.elementRef.nativeElement;\n  }\n\n  private removeAllEventListeners(): void {\n    Object.values(this.eventListeners).forEach(removeListener => {\n      if (removeListener) {\n        removeListener();\n      }\n    });\n    this.eventListeners = {};\n  }\n\n  // Override this method in child components to provide component-specific event handlers\n  protected getEventMap(): { [key: string]: (event: any) => void } {\n    return {\n      'click': (event) => this.onClick(event),\n      'mouseenter': (event) => this.onMouseEnter(event),\n      'mouseleave': (event) => this.onMouseLeave(event),\n      'focus': (event) => this.onFocus(event),\n      'blur': (event) => this.onBlur(event),\n      'mousedown': (event) => this.onMouseDown(event),\n      'mouseup': (event) => this.onMouseUp(event),\n      'keydown': (event) => this.onKeyDown(event),\n      'keyup': (event) => this.onKeyUp(event)\n    };\n  }\n\n  // Default event handlers - can be overridden in child components\n  protected onClick(event: any): void {\n    if (!this.store.editMode()) {\n      event?.stopPropagation();\n      this.emitEvent('click', { originalEvent: event }, { id: this.component().id, event: 'click', action: 'no-action' });\n    }\n  }\n\n  protected onMouseEnter(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('mouseenter', { originalEvent: event });\n    }\n  }\n\n  protected onMouseLeave(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('mouseleave', { originalEvent: event });\n    }\n  }\n\n  protected onFocus(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('focus', { originalEvent: event });\n    }\n  }\n\n  protected onBlur(event: any): void {\n    if (!this.store.editMode()) {\n      this.markControlAsTouched();\n      this.emitEvent('blur', { originalEvent: event });\n    }\n  }\n\n  protected onMouseDown(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('mousedown', { originalEvent: event });\n    }\n  }\n\n  protected onMouseUp(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('mouseup', { originalEvent: event });\n    }\n  }\n\n  protected onKeyDown(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('keydown', { originalEvent: event });\n    }\n  }\n\n  protected onKeyUp(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('keyup', { originalEvent: event });\n    }\n  }\n\n\n  // Direct property computed signals - much cleaner!\n  protected createPropertyComputed(key: string, defaultValue?: any) {\n    return computed(() => this.getPropertyValue(this.component(), key, defaultValue));\n  }\n\n  protected createStylePropertyComputed(key: string, defaultValue?: any) {\n    return computed(() => this.getStylePropertyValue(this.component(), key, defaultValue));\n  }\n\n  // ===== PROPERTY HELPER METHODS (formerly in ComponentPropertyHelper) =====\n\n  // Get component properties (non-styling: content, behavior, data)\n  protected getPropertyValue(component: EruComponent, key: string, defaultValue: any = ''): any {\n    const override = this.store.componentPropertyOverrides().get(component.id);\n    if (override && override.has(key)) {\n      return override.get(key);\n    }\n    const breakpoint = this.currentBreakpoint();\n    return this.getPropertyValueForBreakpoint(component.properties, key, breakpoint) ?? defaultValue;\n  }\n\n  // Get style properties (for panel editing)\n  protected getStylePropertyValue(component: EruComponent, key: string, defaultValue: any = ''): any {\n    const breakpoint = this.currentBreakpoint();\n    return this.getPropertyValueForBreakpoint(component.styles.responsive_styles, key, breakpoint) ?? defaultValue;\n  }\n\n  // Get all classes (common + responsive). The responsive half resolves like\n  // every other responsive value: the current breakpoint's classes if set,\n  // otherwise the base ones. Reading only the breakpoint key dropped base\n  // classes at runtime entirely, since the runtime breakpoint is never 'base'.\n  protected getClasses(component: EruComponent): string {\n    const commonClasses = component.styles?.classes || '';\n    const responsive = component.styles?.responsive_classes;\n    const breakpoint = this.currentBreakpoint();\n    const responsiveClasses = responsive?.[breakpoint] ?? responsive?.base ?? '';\n    return [commonClasses, responsiveClasses].filter(Boolean).join(' ');\n  }\n\n  // Get custom styles only\n  protected getCustomStyles(component: EruComponent): any {\n    return component.styles.custom || {};\n  }\n\n  /**\n   * The child's own custom styles that belong on its flex/grid item wrapper\n   * rather than on the child element. Called by the containers when building a\n   * child wrapper's styles; see ITEM_ONLY_STYLE_PROPERTIES for why.\n   */\n  protected getCustomItemStyles(child: EruComponent): Record<string, any> {\n    const styles: Record<string, any> = {};\n    for (const [key, value] of Object.entries(child.styles?.custom || {})) {\n      const property = ITEM_ONLY_STYLE_PROPERTIES[toKebabCaseStyleKey(key)];\n      if (property && value !== undefined && value !== null && value !== '') {\n        styles[property] = value;\n      }\n    }\n    return styles;\n  }\n\n  // Get computed styles for current breakpoint with fallback\n  protected getComputedStyles(component: EruComponent): Record<string, any> {\n    const breakpoint = this.currentBreakpoint() as TailwindBreakpoint;\n\n    // Get all style properties for current breakpoint with fallback\n    const currentBreakpointStyles = this.getStylesForBreakpoint(component.styles.responsive_styles, breakpoint);\n    // Convert to CSS using Tailwind service\n    return this.tailwindService.convertStylePropertiesToCSS(currentBreakpointStyles);\n  }\n\n  // Get styles for specific breakpoint with fallback to previous breakpoints\n  private getStylesForBreakpoint(\n    responsiveStyles: ResponsiveStyleProperties,\n    breakpoint: TailwindBreakpoint\n  ): Record<string, any> {\n    const result: Record<string, any> = {};\n\n    // Get all available style keys from all breakpoints\n    const allKeys = new Set<string>();\n    Object.values(responsiveStyles).forEach(styles => {\n      Object.keys(styles).forEach(key => allKeys.add(key));\n    });\n\n    // For each style property, get value with fallback to previous breakpoints\n    allKeys.forEach(key => {\n      const value = this.getPropertyValueForBreakpoint(responsiveStyles, key, breakpoint);\n      if (value !== undefined) {\n        result[key] = value;\n      }\n    });\n\n    return result;\n  }\n\n  // Helper method to get property value for a specific breakpoint\n  private getPropertyValueForBreakpoint(\n    properties: ResponsiveEruComponentProperties | ResponsiveStyleProperties,\n    key: string,\n    breakpoint: TailwindBreakpoint | 'base'\n  ): any {\n    return this.tailwindService.getPropertyValueForBreakpoint(properties, key, breakpoint, true);\n  }\n\n\n\n  // Common properties available to all components\n  protected getCommonPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'name',\n        type: 'autocomplete',\n        dynamic_options: 'entity_field_name',\n        label: 'Component Name',\n        category: 'content',\n        default_value: '',\n        description: '',\n        responsive: false,\n        on_value_change: (value: string, oldValue: string) => {\n          const entityField = this.store.getEntityField(value);\n          if (entityField) {\n            // Binding to a field deliberately copies NOTHING onto the component.\n            // Every attribute the data model owns (option_type, options, the\n            // option source, status lists, formats, precision...) is read live\n            // from the bound field — by the components at runtime and by the\n            // property panel for display — and the panel locks those controls.\n            // Copying them here as well left the page holding a snapshot that\n            // silently drifted the moment the data model changed, and forced\n            // shape translations (options array to CSV, {name,color} to\n            // {label,color}, JSON-parsing a status list) that had to be kept in\n            // step by hand.\n            //\n            // Only the entity dropdown's own option list is refreshed, which is\n            // panel state rather than component data.\n            const children = this.store.getEntities() || [];\n            this.store.setDynamicData('ds_entity_name', children.map((ent: any) => ({ label: ent.display_name || ent.name, value: ent.name })));\n          }\n        }\n      },\n      ...(this.supportsValueSource() ? [\n        {\n          key: 'value_source',\n          label: 'Value Source',\n          type: 'select',\n          category: 'content',\n          default_value: 'field',\n          responsive: false,\n          description: \"Where this field reads and writes the value the user enters or picks. For a dropdown this is NOT where the option list comes from — that is Option Type.\",\n          options: [\n            { value: 'field', label: 'Page Data Field' },\n            { value: 'state', label: 'Page State' },\n            { value: 'app', label: 'App State' }\n          ]\n        },\n        {\n          key: 'state_key',\n          label: 'State Variable',\n          type: 'select',\n          category: 'content',\n          dynamic_options: 'ds_page_state_vars',\n          responsive: false,\n          description: 'Page state variable this field binds to (defaults to the field name).',\n          visible_if: { key: 'value_source', equals: 'state' }\n        },\n        {\n          key: 'app_state_key',\n          label: 'App State Variable',\n          type: 'autocomplete',\n          category: 'content',\n          default_value: '',\n          dynamic_options: 'ds_app_state_vars',\n          responsive: false,\n          description: 'App state variable this field binds to. App state is shared across pages and has no declarations, so a key that nothing has written yet can be typed here.',\n          visible_if: { key: 'value_source', equals: 'app' }\n        },\n        {\n          key: 'value_path',\n          label: 'Value Path',\n          type: 'text',\n          category: 'content',\n          default_value: '',\n          responsive: false,\n          description: 'Dot/bracket path to extract from a JSON state value (e.g. data.name or items[0].label). Leave empty to use the value as is.',\n          visible_if: [\n            { key: 'value_source', equals: 'state' },\n            { key: 'value_source', equals: 'app' }\n          ],\n          visible_operator: 'any'\n        }\n      ] as PropertySchema[] : []),\n      {\n        key: 'label',\n        type: 'text',\n        label: 'Label',\n        category: 'content',\n        default_value: '',\n        description: 'Display label for this component',\n        responsive: false,\n      },\n      {\n        key: 'label_position',\n        type: 'select',\n        label: 'Label Position',\n        category: 'content',\n        default_value: 'top',\n        options: [\n          { value: 'top', label: 'Top' },\n          { value: 'left', label: 'Left' }\n        ],\n        description: 'Where the label sits in view mode. Edit mode is unaffected — a Material field floats its own label.',\n        responsive: false,\n      },\n      {\n        key: 'default_value',\n        type: 'text',\n        label: 'Default Value',\n        category: 'content',\n        default_value: '',\n        responsive: false,\n        description: 'Pre-fills the field when its value is null/undefined. A blank value entered by the user is kept. For fields bound to the data model, the default defined there takes precedence.',\n        disable_if: {\n          evaluate: (getValue: (k: string) => any) => {\n            const ef = this.store.getEntityField(getValue('name'));\n            return !!(ef && ef.default !== undefined && ef.default !== null && ef.default !== '');\n          }\n        }\n      },\n      {\n        key: 'default_state_key',\n        type: 'text',\n        label: 'Default From State',\n        category: 'content',\n        default_value: '',\n        responsive: false,\n        description: 'State variable to seed this field from when its value is empty. Takes precedence over Default Value and the data model default. Once set, the field also writes its value back to this state variable on every change, in addition to the normal page-data update.'\n      },\n      {\n        key: 'default_state_scope',\n        type: 'select',\n        label: 'Default State Scope',\n        category: 'content',\n        default_value: 'page',\n        responsive: false,\n        options: [\n          { label: 'Page State', value: 'page' },\n          { label: 'App State', value: 'app' }\n        ],\n        description: 'Which state the variable lives in. App state is shared across every page in the process.',\n        visible_if: { key: 'default_state_key', notEquals: '' }\n      },\n      {\n        key: 'description',\n        type: 'textarea',\n        label: 'Description',\n        category: 'content',\n        default_value: '',\n        description: 'Detailed description of this component',\n        width: 'full',\n        responsive: false,\n      },\n      {\n        key: 'identifier',\n        type: 'boolean',\n        label: 'Form Field',\n        category: 'behavior',\n        default_value: false,\n        description: 'Mark this component as a form field for data collection',\n        responsive: false\n      },\n      {\n        key: 'value_change_payload',\n        type: 'select',\n        label: 'Value Change Payload',\n        category: 'behavior',\n        default_value: 'record',\n        options: [\n          { value: 'record', label: 'Whole Record' },\n          { value: 'changed_field', label: 'Changed Field Only' }\n        ],\n        responsive: false,\n        description: 'What an On Value Change action receives. Whole Record sends the full record — the card\\'s row or the page data — which on a board row includes the query\\'s computed columns. Changed Field Only sends just this field with its previous value in old_entity_data, the way a grid cell edit does.',\n        visible_if: { key: 'identifier', equals: true }\n      },\n      {\n        key: 'visible',\n        type: 'select',\n        label: 'Visible',\n        category: 'behavior',\n        default_value: 'always',\n        responsive: true,\n        options: [\n          { label: 'Always', value: 'always' },\n          { label: 'Never', value: 'never' },\n          { label: 'Conditionally', value: 'conditionally' }\n        ],\n        description: 'Visibility of the component',\n        width: 'full'\n      },\n      {\n        key: 'visibility_conditions',\n        type: 'logic_editor',\n        label: 'Visibility Conditions',\n        category: 'behavior',\n        default_value: '',\n        visible_if: { key: 'visible', equals: 'conditionally' },\n        description: 'Use @ to select fields.',\n        width: 'full'\n      },\n      {\n        key: 'mandatory',\n        type: 'select',\n        label: 'Mandatory',\n        category: 'behavior',\n        default_value: 'never',\n        options: [\n          { label: 'Always', value: 'always' },\n          { label: 'Never', value: 'never' },\n          { label: 'Conditionally', value: 'conditionally' }\n        ]\n      },\n      {\n        key: 'mandatory_conditions',\n        type: 'logic_editor',\n        label: 'Mandatory Conditions',\n        category: 'behavior',\n        default_value: '',\n        visible_if: { key: 'mandatory', equals: 'conditionally' },\n        description: 'Logic expression for mandatory status. Use @ to select fields.'\n      },\n      {\n        key: 'disabled_behavior',\n        type: 'select',\n        label: 'Disabled Behavior',\n        category: 'behavior',\n        default_value: 'never',\n        responsive: true,\n        options: [\n          { label: 'Always', value: 'always' },\n          { label: 'Never', value: 'never' },\n          { label: 'Conditionally', value: 'conditionally' }\n        ]\n      },\n      {\n        key: 'disabled_conditions',\n        type: 'logic_editor',\n        label: 'Disabled Conditions',\n        category: 'behavior',\n        default_value: '',\n        visible_if: { key: 'disabled_behavior', equals: 'conditionally' },\n        description: 'Logic expression for disabled status. Use @ to select fields.'\n      },\n      {\n        key: 'hover_background_color',\n        type: 'color',\n        label: 'Editable Hover Background',\n        category: 'behavior',\n        default_value: '',\n        responsive: false,\n        description: 'Tint painted behind the control when it is hovered in view mode and Editable is on — the hint that a double-click opens the editor. Blank uses the theme surface tint.',\n        visible_if: { key: 'editable', equals: true }\n      }\n    ];\n  }\n\n  // Common styles available to all components\n  protected getCommonStyleSchema(): StyleSchema[] {\n    return [\n      // Layout\n      {\n        key: 'width',\n        type: 'text',\n        label: 'Width',\n        category: 'layout',\n        default_value: '',\n        placeholder: 'e.g. 200px, 10rem, 50%',\n        width: 2\n      },\n      {\n        key: 'height',\n        type: 'text',\n        label: 'Height',\n        category: 'layout',\n        default_value: '',\n        placeholder: 'e.g. 200px, 10rem, 50%'\n      },\n      {\n        key: 'position',\n        type: 'select',\n        label: 'Position',\n        category: 'layout',\n        default_value: 'static',\n        options: [\n          { label: 'Static', value: 'static' },\n          { label: 'Relative', value: 'relative' },\n          { label: 'Absolute', value: 'absolute' },\n          { label: 'Fixed', value: 'fixed' },\n          { label: 'Sticky', value: 'sticky' }\n        ],\n        width: 2\n      },\n      /**\n       * Cross-axis alignment for this component as a flex/grid item. It has to\n       * live on the item's wrapper, not on the component's own box — the flex\n       * container renders each child inside a `.flex-child` div, and that div is\n       * the actual flex item. Setting align-self through Custom Styles cannot\n       * work: those land on the component's inner div, whose parent is a block.\n       *\n       * flex-container/grid-container already read `align_self` out of the\n       * child's responsive_styles (getChildFlexStyles / getChildGridStyles) and\n       * put it on the wrapper, so this entry is what lets an author reach it.\n       * Not in the property-to-CSS map on purpose, so it never also leaks onto\n       * the inner div as an inert inline style.\n       */\n      {\n        key: 'align_self',\n        type: 'select',\n        label: 'Align Self',\n        category: 'layout',\n        default_value: 'auto',\n        options: [\n          { label: 'Auto', value: 'auto' },\n          { label: 'Flex Start', value: 'flex-start' },\n          { label: 'Flex End', value: 'flex-end' },\n          { label: 'Center', value: 'center' },\n          { label: 'Baseline', value: 'baseline' },\n          { label: 'Stretch', value: 'stretch' }\n        ],\n        width: 2\n      },\n      {\n        key: 'margin',\n        type: 'number',\n        label: 'Margin (px)',\n        category: 'spacing',\n        default_value: 0,\n        min: 0,\n        max: 100,\n        step: 1,\n        width: 'half'\n      },\n      {\n        key: 'padding',\n        type: 'number',\n        label: 'Padding (px)',\n        category: 'spacing',\n        default_value: 0,\n        min: 0,\n        max: 100,\n        step: 1,\n        width: 'half'\n      },\n      {\n        key: 'font_family',\n        type: 'text',\n        label: 'Font Family',\n        category: 'typography',\n        default_value: 'inherit',\n        width: 'full'\n      },\n      {\n        // Matches the `--studio-font-size-body` baseline the eru controls now\n        // render at (see the base rule in styles/components.scss). The panel\n        // only DISPLAYS this until the author edits it — nothing is written to\n        // the page — so a default that disagreed with what renders read as a\n        // 16px control that was actually drawing at 12.\n        key: 'font_size',\n        type: 'number',\n        label: 'Font Size (px)',\n        category: 'typography',\n        default_value: 12,\n        min: 8,\n        max: 72,\n        step: 1\n      },\n      {\n        key: 'font_weight',\n        type: 'select',\n        label: 'Font Weight',\n        category: 'typography',\n        default_value: 'normal',\n        options: [\n          { label: '100', value: '100' },\n          { label: '200', value: '200' },\n          { label: '300', value: '300' },\n          { label: 'Normal', value: 'normal' },\n          { label: '500', value: '500' },\n          { label: '600', value: '600' },\n          { label: 'Bold', value: 'bold' },\n          { label: '800', value: '800' },\n          { label: '900', value: '900' }\n        ]\n      },\n      {\n        key: 'text_align',\n        type: 'select',\n        label: 'Text Align',\n        category: 'typography',\n        default_value: 'left',\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        key: 'color',\n        type: 'color',\n        label: 'Text Color',\n        category: 'typography',\n        default_value: '#000000'\n      },\n      {\n        // Deliberately NOT handled by property-to-tailwind's getCSSProperty, so\n        // it never reaches the component shell. `text-decoration` is drawn\n        // across every in-flow descendant and a child cannot cancel it, so an\n        // underline on the shell struck the label as well as the value and no\n        // amount of pinning on the label could undo it — which is exactly what\n        // the `underline` utility in the CSS Classes box does. Routed to the\n        // value span (or the label span, on the Label target) instead, where it\n        // decorates one piece of text and not the other.\n        key: 'text_decoration',\n        type: 'select',\n        label: 'Decoration',\n        category: 'typography',\n        default_value: 'none',\n        options: [\n          { label: 'None', value: 'none' },\n          { label: 'Underline', value: 'underline' },\n          { label: 'Line Through', value: 'line-through' },\n          { label: 'Overline', value: 'overline' }\n        ]\n      },\n      // Background\n      {\n        key: 'background_color',\n        type: 'color',\n        label: 'Background Color',\n        category: 'background',\n        default_value: 'transparent',\n        // Full width so the Solid/Gradient/Image toggle and the gradient /\n        // image editors get the whole panel width instead of a half cell.\n        width: 'full'\n      },\n      {\n        key: 'border_width',\n        type: 'number',\n        label: 'Border Width (px)',\n        category: 'border',\n        default_value: 0,\n        min: 0,\n        max: 20,\n        step: 1\n      },\n      {\n        key: 'border_style',\n        type: 'select',\n        label: 'Border Style',\n        category: 'border',\n        default_value: 'solid',\n        options: [\n          { label: 'None', value: 'none' },\n          { label: 'Solid', value: 'solid' },\n          { label: 'Dashed', value: 'dashed' },\n          { label: 'Dotted', value: 'dotted' },\n          { label: 'Double', value: 'double' }\n        ]\n      },\n      {\n        key: 'border_color',\n        type: 'color',\n        label: 'Border Color',\n        category: 'border',\n        default_value: '#000000'\n      },\n      {\n        key: 'border_radius',\n        type: 'number',\n        label: 'Border Radius (px)',\n        category: 'border',\n        default_value: 0,\n        min: 0,\n        max: 50,\n        step: 1\n      }\n    ];\n  }\n\n  protected resolvePayloadPath(payload: any, path: string): any {\n    if (!payload) return undefined;\n    if (!path) return payload;\n    const parts = path.split('.');\n    let current: any = payload;\n    for (const part of parts) {\n      if (current == null) return undefined;\n      current = current[part];\n    }\n    return current;\n  }\n\n  // Exclusion mechanism - override in child components\n  protected getExcludedProperties(): string[] {\n    return [];\n  }\n\n  protected getExcludedStyles(): string[] {\n    return [];\n  }\n\n  // Component-specific additions - override in child components\n  protected getComponentPropertySchema(): PropertySchema[] {\n    return [];\n  }\n\n  protected getComponentStyleSchema(): StyleSchema[] {\n    return [];\n  }\n\n  protected getComponentDefaultProperties(): EruComponentProperties {\n    return {};\n  }\n\n  protected getComponentDefaultStyles(): StyleProperties {\n    return {};\n  }\n\n  // Final schema methods that combine common + component-specific\n  protected getPropertySchema(): PropertySchema[] {\n    const common = this.getCommonPropertySchema();\n    const component = this.getComponentPropertySchema();\n    const excluded = this.getExcludedProperties();\n    const overridden = new Set(component.map(prop => prop.key));\n    const filteredCommon = common.filter(prop => !excluded.includes(prop.key) && !overridden.has(prop.key));\n    return [...filteredCommon, ...component];\n  }\n\n  protected getStyleSchema(): StyleSchema[] {\n    const common = this.getCommonStyleSchema();\n    const component = this.getComponentStyleSchema();\n    const excluded = this.getExcludedStyles();\n    const filteredCommon = common.filter(style => !excluded.includes(style.key));\n    return [...filteredCommon, ...component];\n  }\n\n  // Final default value methods that combine common + component-specific\n  protected getDefaultProperties(): EruComponentProperties {\n    const key = this.constructor.name;\n    let cached = _defaultPropsCache.get(key);\n    if (!cached) {\n      const schema = this.getPropertySchema();\n      cached = {};\n      schema.forEach(prop => {\n        if (prop.default_value !== undefined) {\n          cached![prop.key] = prop.default_value;\n        }\n      });\n      _defaultPropsCache.set(key, cached);\n    }\n    return cached;\n  }\n\n  protected getDefaultStyles(): StyleProperties {\n    const key = this.constructor.name;\n    let cached = _defaultStylesCache.get(key);\n    if (!cached) {\n      const schema = this.getStyleSchema();\n      cached = {};\n      schema.forEach(style => {\n        if (style.default_value !== undefined) {\n          (cached as any)[style.key] = style.default_value;\n        }\n      });\n      _defaultStylesCache.set(key, cached);\n    }\n    return cached;\n  }\n\n  // Get all supported properties (both component and style properties)\n  protected getAllProperties(): Record<string, any> {\n    const component = this.component();\n    return {\n      ...component.properties,\n      ...component.styles.responsive_styles\n    };\n  }\n\n  // Common events available to all components\n  readonly commonEvents: { label: string, value: string }[] = [\n    { label: 'Click', value: 'click' },\n    { label: 'Double Click', value: 'dblclick' },\n    { label: 'Mouse Enter', value: 'mouseenter' },\n    { label: 'Mouse Leave', value: 'mouseleave' },\n    { label: 'Mouse Over', value: 'mouseover' },\n    { label: 'Mouse Out', value: 'mouseout' },\n    { label: 'Mouse Down', value: 'mousedown' },\n    { label: 'Mouse Up', value: 'mouseup' },\n    { label: 'Focus', value: 'focus' },\n    { label: 'Blur', value: 'blur' },\n    { label: 'Key Down', value: 'keydown' },\n    { label: 'Key Up', value: 'keyup' }\n  ];\n\n  /**\n   * Whether an event must stay silent on the designer canvas.\n   *\n   * True for everything by default: a click or a toggle there is authoring, not\n   * use. Override for an event that reports what the canvas is already showing\n   * — the shell's initial menu selection, say, whose handler fills a header the\n   * designer otherwise renders empty.\n   */\n  protected suppressEventsInEditMode(eventType: string): boolean {\n    return true;\n  }\n\n  private getComponentEvents(): { label: string, value: string }[] {\n    const component = this.component();\n    const hasIdentifier = component.properties?.base?.identifier || false;\n    const valueEvent = hasIdentifier ? [{ label: 'Value Change', value: 'valueChange' }] : [];\n    return [...this.commonEvents, ...this.componentEvents, ...valueEvent];\n  }\n}\n","import { Directive, ElementRef, HostListener, inject } from '@angular/core';\nimport { EruStudioStore } from '../services/eru-studio.store';\n\n@Directive({\n  selector: '[eruCanvasEventHandler]',\n  standalone: true\n})\nexport class CanvasEventHandlerDirective {\n  private store = inject(EruStudioStore);\n\n  constructor(private el: ElementRef) {}\n\n  @HostListener('mouseenter', ['$event'])\n  onMouseEnter(event: MouseEvent) {\n    if (this.store.editMode()) {\n      // In design mode, stop propagation to prevent canvas hover events\n      event.stopPropagation();\n    }\n  }\n\n  @HostListener('mouseleave', ['$event'])\n  onMouseLeave(event: MouseEvent) {\n    if (this.store.editMode()) {\n      // In design mode, stop propagation to prevent canvas hover events\n      event.stopPropagation();\n    }\n  }\n\n  @HostListener('mousedown', ['$event'])\n  onMouseDown(event: MouseEvent) {\n    if (this.store.editMode()) {\n      // In design mode, stop propagation to prevent canvas selection\n      event.stopPropagation();\n    }\n  }\n\n  @HostListener('mouseup', ['$event'])\n  onMouseUp(event: MouseEvent) {\n    if (this.store.editMode()) {\n      // In design mode, stop propagation to prevent canvas selection\n      event.stopPropagation();\n    }\n  }\n\n  @HostListener('click', ['$event'])\n  onClick(event: MouseEvent) {\n    if (this.store.editMode()) {\n      // In design mode, stop propagation to prevent canvas selection\n      event.stopPropagation();\n      \n      // Find the most specific (deepest) component element that contains the clicked element\n      const target = event.target as HTMLElement;\n      \n      // Get all elements with data-component-id that contain the target\n      const allComponentElements = target.closest('.page-content')?.querySelectorAll('[data-component-id]') || [];\n      let deepestComponent: HTMLElement | null = null;\n      let deepestLevel = -1;\n      \n      \n      // Find the component with the highest nesting level (most specific)\n      // If multiple components have the same level, find the one closest to the target\n      allComponentElements.forEach((element: Element) => {\n        const level = parseInt(element.getAttribute('data-nesting-level') || '0');\n        const componentId = element.getAttribute('data-component-id');\n        \n        if (level > deepestLevel && element.contains(target)) {\n          deepestLevel = level;\n          deepestComponent = element as HTMLElement;\n        } else if (level === deepestLevel && element.contains(target)) {\n          // If same level, check which one is closer to the target\n          const currentDistance = this.getDistanceToTarget(target, deepestComponent as HTMLElement);\n          const newDistance = this.getDistanceToTarget(target, element as HTMLElement);\n          if (newDistance < currentDistance) {\n            deepestComponent = element as HTMLElement;\n          }\n        }\n      });\n      \n      if (deepestComponent !== null) {\n        const componentId = (deepestComponent as HTMLElement).getAttribute('data-component-id');\n        \n        // Dispatch a custom event to trigger component selection\n        const customEvent = new CustomEvent('component-select', {\n          detail: { componentId },\n          bubbles: true\n        });\n        (deepestComponent as HTMLElement).dispatchEvent(customEvent);\n      } else {\n      }\n    }\n  }\n\n  @HostListener('focus', ['$event'])\n  onFocus(event: FocusEvent) {\n    if (this.store.editMode()) {\n      // In design mode, stop propagation\n      event.stopPropagation();\n    }\n  }\n\n  @HostListener('blur', ['$event'])\n  onBlur(event: FocusEvent) {\n    if (this.store.editMode()) {\n      // In design mode, stop propagation\n      event.stopPropagation();\n    }\n  }\n\n  @HostListener('input', ['$event'])\n  onInput(event: Event) {\n    if (this.store.editMode()) {\n      // In design mode, stop propagation\n      event.stopPropagation();\n    }\n  }\n\n  private getDistanceToTarget(target: HTMLElement, component: HTMLElement): number {\n    // Calculate the DOM distance between target and component\n    // Count the number of parent elements from target to component\n    let distance = 0;\n    let current: HTMLElement | null = target;\n    \n    while (current && current !== component) {\n      current = current.parentElement;\n      distance++;\n    }\n    \n    // If we didn't find the component in the parent chain, return a large number\n    return current === component ? distance : 999999;\n  }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-text',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective],\n  templateUrl: './text.component.html',\n  styleUrl: './text.component.scss'\n})\nexport class TextComponent extends BaseComponent {\n\n  constructor() {\n    super();\n    // When the text is marked as a Form Field, its displayed value must be\n    // collected into page data so save-page-data includes it in entity_data.\n    // Unlike an input, text has no form control writing back — it renders a\n    // derived value (static label, or a state/derived lookup). Mirror that\n    // value into page data at runtime. The 'field' source already reads from\n    // page data, so it needs no write-back (and would loop).\n    effect(() => {\n      if (this.store.editMode()) return;\n      const component = this.component();\n      if (!component) return;\n      if (!this.getProperty('identifier')) return;\n      const source = this.getProperty('value_source') || 'label';\n      if (source === 'field') return;\n      const fieldName = this.getProperty('name');\n      if (!fieldName) return;\n      const value = this.displayValue();\n      const key = this.dataKey() ? `${this.dataKey()}.${fieldName}` : fieldName;\n      untracked(() => {\n        const current = this.store.getPageFieldData(key, component.pageId);\n        if (current === value) return;\n        this.store.updatePageData({ entity_data: { [key]: value } }, component.pageId);\n      });\n    });\n  }\n\n  protected override getComponentStyleSchema(): StyleSchema[] {\n    return [{\n      key: 'line_height',\n      type: 'number',\n      label: 'Line Height',\n      category: 'typography',\n      default_value: 1.5,\n      min: 0.5,\n      max: 3,\n      step: 0.1\n    }];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      label: 'Sample Text',\n      value_source: 'label'\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      color: '#000000',\n      font_size: 16,\n      font_weight: 'normal',\n      text_align: 'left',\n      line_height: 1.5,\n      letter_spacing: 0\n    };\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'value_source',\n        label: 'Value Source',\n        type: 'select',\n        category: 'content',\n        default_value: 'label',\n        options: [\n          { value: 'label', label: 'Static Label' },\n          { value: 'field', label: 'Page Data Field' },\n          { value: 'state', label: 'Page State' }\n        ]\n      },\n      {\n        key: 'state_key',\n        label: 'State Variable',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_page_state_vars',\n        visible_if: { key: 'value_source', equals: 'state' }\n      },\n      {\n        key: 'value_path',\n        label: 'Value Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        description: 'Dot/bracket path to extract from a JSON value (e.g. data.name or items[0].label). Leave empty to show the value as is.',\n        visible_if: { key: 'value_source', in: ['field', 'state'] }\n      },\n      ...this.textOverflowPropertySchema()\n    ];\n  }\n\n  private resolveByPath(value: any, path: string): any {\n    if (!path) return value;\n    let obj = value;\n    if (typeof obj === 'string') {\n      try { obj = JSON.parse(obj); } catch { return value; }\n    }\n    if (obj === null || typeof obj !== 'object') return value;\n    const segments = path.replace(/\\[(\\w+)\\]/g, '.$1').split('.').filter(Boolean);\n    let current = obj;\n    for (const segment of segments) {\n      if (current === null || current === undefined) return '';\n      current = current[segment];\n    }\n    return current ?? '';\n  }\n\n  /**\n   * Fall back to the configured Default Value when the bound value is missing.\n   * A display-only component never gets the page-data seeding the input\n   * components rely on — that effect is skipped on the designer canvas and\n   * inside a board card row — so a text bound to a column the backend returns\n   * as `null` ignored its default everywhere it mattered.\n   */\n  private withDefault(value: any): any {\n    if (value !== null && value !== undefined && value !== '') return value;\n    const fallback = this.effectiveDefaultValue();\n    return fallback === undefined ? (value ?? '') : fallback;\n  }\n\n  readonly displayValue = computed(() => {\n    const source = this.getProperty('value_source') || 'label';\n    const valuePath = this.getProperty('value_path') || '';\n\n    if (source === 'state' || source === 'derived') {\n      if (source === 'derived') {\n        const key = this.getProperty('derived_value_key');\n        if (key) return this.withDefault(this.resolveByPath(this.store.derivedValues()[key] ?? '', valuePath));\n      }\n      const stateKey = this.getProperty('state_key') || this.getProperty('name');\n      if (!stateKey) return this.withDefault('');\n      const pageId = this.component()?.pageId;\n      const dataKey = this.dataKey();\n      const state = pageId ? this.store.getComputedPageStateFor(pageId, dataKey || undefined) : this.store.computedPageState();\n      return this.withDefault(this.resolveByPath(state[stateKey] ?? '', valuePath));\n    }\n    if (source === 'field') {\n      return this.withDefault(this.resolveByPath(this.storeValue() ?? '', valuePath));\n    }\n    const label = this.getProperty('label');\n    if (!label && this.getProperty('name')) {\n      return this.withDefault(this.storeValue());\n    }\n    return this.withDefault(label);\n  });\n\n  /**\n   * What the template prints. A whitespace-only value — typically a ' ' Default\n   * Value set precisely to stop the box collapsing — renders as nothing in HTML:\n   * normal white-space processing drops collapsible spaces at the start and end\n   * of a line, leaving a line box with no height. Non-breaking spaces survive\n   * it, so the blank line the author asked for actually appears. Page data still\n   * receives displayValue(), so the stored value stays a plain space.\n   */\n  readonly renderedValue = computed(() => {\n    const value = this.displayValue();\n    if (typeof value !== 'string' || value === '' || value.trim() !== '') return value;\n    return '\\u00A0'.repeat(value.length);\n  });\n}\n","<div\n  [class]=\"classes()\"\n  [ngStyle]=\"stylesWithTextOverflow()\"\n  [title]=\"textOverflowMode() === 'wrap' ? null : displayValue()\"\n>\n  {{ renderedValue() }}\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  EnvironmentInjector,\n  Input,\n  OnChanges,\n  OnInit,\n  SimpleChanges,\n  computed,\n  createEnvironmentInjector,\n  effect,\n  inject,\n  signal,\n  untracked\n} from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { ComponentRegistryService, EruStudioStore, RowDataContext } from '../../services';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\nimport { EruComponent } from '../../models';\n\n/**\n * Renders a single board card by loading a designated card-layout page from the\n * page-data store and dynamically projecting its component tree, with the row\n * provided to descendants via `RowDataContext`.\n *\n * Used by `eru-grid` (eru-studio's wrapper of `eru-grid` lib) when `view_mode === 'board'`\n * and a `card_page_id` is configured. eru-grid invokes our `boardCardTemplate` once per\n * row; that template instantiates this host component, which owns the per-card\n * RowDataContext instance.\n */\n@Component({\n  selector: 'eru-grid-card-host',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, NgComponentOutlet],\n  providers: [RowDataContext],\n  template: `\n    <div class=\"eru-board-card-host\">\n      @if (componentsReady() && pageComponents().length > 0) {\n        @for (child of pageComponents(); track child.id) {\n          <ng-container\n            *ngComponentOutlet=\"getComponentClass(child.type);\n                                injector: dynamicComponentInjector;\n                                inputs: { component: child }\">\n          </ng-container>\n        }\n      }\n    </div>\n  `,\n  styles: [`\n    /* Fill the eru-grid card slot (its .board-card-container minus padding) so\n       the card is centred with equal top/bottom spacing — the host used to take\n       the raw boardCardHeight, overflowing the padded slot by 8px and clipping\n       the bottom (more space on top). */\n    :host { display: block; height: 100%; }\n    .eru-board-card-host { display: flex; flex-direction: column; box-sizing: border-box; overflow: hidden; height: 100%; }\n    /* Stretch the card's root element(s) to fill the slot so the card surface\n       covers the whole area (no large tinted gap below short content) and the\n       selection ring hugs the card. */\n    .eru-board-card-host > * { flex: 1 1 auto; min-height: 0; }\n\n    /* Compact inline editors to the height of the view-mode display they\n       replace (32px). A card's height is fixed by the grid's Card Height, so the\n       taller Material field a control swaps in on double click pushed the rest\n       of the card down — obvious once a control is given an explicit width,\n       because the growth then happens inside a drawn box.\n\n       It lives here rather than in each control: the card host is what makes\n       these editors inline, so this is the one place that knows they should be\n       compact, and every control gets it instead of date alone. ::ng-deep is\n       required to reach mat-form-field's internals, which carry no component of\n       ours' encapsulation attribute — the reason the same rule written inside\n       date.component.scss silently matched nothing. */\n    :host ::ng-deep .mat-mdc-text-field-wrapper { min-height: 32px; }\n    :host ::ng-deep .mat-mdc-form-field-flex {\n      min-height: 32px;\n      height: 32px;\n      align-items: center;\n    }\n    :host ::ng-deep .mat-mdc-form-field-infix {\n      min-height: 32px;\n      padding-top: 0;\n      padding-bottom: 0;\n      display: flex;\n      align-items: center;\n    }\n  `]\n})\nexport class EruGridCardHostComponent implements OnInit, OnChanges {\n  private store = inject(EruStudioStore);\n  private rowDataContext = inject(RowDataContext);\n  private componentRegistry = inject(ComponentRegistryService);\n  private logicEvaluator = inject(LogicEvaluatorService);\n  private parentEnv = inject(EnvironmentInjector);\n\n  @Input() row: any;\n  @Input() columns: any[] = [];\n  @Input() group: any;\n  @Input() cardPageId: string = '';\n  @Input() cardHeight: number = 132;\n  /**\n   * Identity for hosts that have no row — a tile with `layout: page` renders the\n   * same card page outside a board. Without it two such hosts on one page would\n   * share a component id and collide on dynamic-data requests and child ids.\n   * Board cards always have a row id, so they are unaffected.\n   */\n  @Input() instanceKey: string = '';\n\n  /** Last requestId used for ds_page so we can read the response. */\n  private lastPageRequestId = signal<string | null>(null);\n\n  /**\n   * Row identity and card page as signals, because `pageComponents` stamps them\n   * into every component id and must restamp when either changes.\n   *\n   * @Input properties are not reactive, so reading `this.row` inside that\n   * computed only ever captured the FIRST row this host was given. That is\n   * invisible while a host is never reused — the board's cdkVirtualFor sets\n   * `templateCacheSize: 0`, so scrolling destroys and rebuilds every card — but\n   * the table body recycles views normally. A recycled host would take the new\n   * row into RowDataContext (correct values) while its descendants kept the\n   * previous row's ids, and anything keyed by component id — dynamic-data\n   * requests, child state — would read the wrong row's entry.\n   */\n  private readonly rowKey = signal<string>('');\n  private readonly cardPageIdSignal = signal<string>('');\n\n  /** Loaded card page definition (resolved from store responses). */\n  readonly cardPageDef = computed(() => {\n    const reqId = this.lastPageRequestId();\n    if (!reqId) return null;\n    const resp = this.store.dynamicDataResponses().get(reqId);\n    return resp ?? null;\n  });\n\n  /** Components from the loaded card page, marked as nested so the runtime knows\n   *  they live inside a host (suppresses canvas interactivity / nesting bookkeeping).\n   */\n  readonly pageComponents = computed<EruComponent[]>(() => {\n    const def = this.cardPageDef() as any;\n    const comps: EruComponent[] | undefined = def?.page_def?.components;\n    if (!comps || comps.length === 0) return [];\n    const cardId = this.cardPageIdSignal();\n    const rowId = this.rowKey();\n    const markCard = (component: EruComponent): EruComponent => ({\n      ...component,\n      id: `${component.id}_card_${rowId}`,\n      isNested: true,\n      pageId: cardId,\n      children: component.children?.map(markCard)\n    });\n    return comps.map(markCard);\n  });\n\n  readonly componentsReady = signal(true);\n\n  readonly dynamicComponentInjector = createEnvironmentInjector(\n    [\n      { provide: EruStudioStore, useValue: this.store },\n      { provide: LogicEvaluatorService, useValue: this.logicEvaluator },\n      { provide: RowDataContext, useValue: this.rowDataContext }\n    ],\n    this.parentEnv\n  );\n\n  constructor() {\n    // The card page's own entity, registered against the id its components\n    // carry (see pageComponents' `pageId` stamp), so a field inside the card\n    // binds to the CARD page's entity rather than the outer page's. Without it\n    // getPageEntityName returns '' for the card id and getEntityField falls back\n    // to the current page's entity: the field is never found and every\n    // data-model owned key (decimal, seperator, label, color_ranges...) silently\n    // reverts to the component's schema default — a field with decimal 0 in the\n    // model rendered with 2 decimals on a card. Same registration page_ref does.\n    effect(() => {\n      const def = (this.cardPageDef() as any)?.page_def;\n      const cardId = this.cardPageIdSignal();\n      if (!def || !cardId) return;\n      untracked(() => this.store.registerPageEntityName(cardId, def.entity_name || ''));\n    });\n\n    // Ensure component classes for everything we plan to render are loaded\n    // before we project them via *ngComponentOutlet.\n    effect(() => {\n      const comps = this.pageComponents();\n      if (!comps || comps.length === 0) {\n        this.componentsReady.set(true);\n        return;\n      }\n      const types = new Set<string>();\n      const collect = (c: EruComponent) => {\n        types.add(c.type);\n        c.children?.forEach(collect);\n      };\n      comps.forEach(collect);\n      const allLoaded = Array.from(types).every(t => !!this.getComponentClass(t));\n      if (allLoaded) {\n        this.componentsReady.set(true);\n      } else {\n        this.componentsReady.set(false);\n        Promise.all(\n          Array.from(types).map(t => this.componentRegistry.getComponentClassAsync(t))\n        ).then(() => this.componentsReady.set(true));\n      }\n    });\n  }\n\n  ngOnInit(): void {\n    this.cardPageIdSignal.set(this.cardPageId || '');\n    this.applyRow();\n    this.requestCardPage();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['row'] || changes['columns'] || changes['group']) {\n      this.applyRow();\n    }\n    if (changes['cardPageId']) {\n      this.cardPageIdSignal.set(this.cardPageId || '');\n      if (!changes['cardPageId'].firstChange) this.requestCardPage();\n    }\n  }\n\n  private applyRow(): void {\n    this.rowDataContext.row.set(this.row ?? null);\n    this.rowDataContext.columns.set(this.columns ?? []);\n    this.rowDataContext.group.set(this.group ?? null);\n    this.rowKey.set(this.hostKey(''));\n  }\n\n  private requestCardPage(): void {\n    const id = this.cardPageId;\n    if (!id) return;\n    // Every card on the board asks for the same page in the same pass; the\n    // store merges those into one round-trip and hands them all the same\n    // requestId (see getDynamicDataCoalesceKey).\n    const reqId = this.store.requestDynamicData(this.cardHostComponentId(), 'ds_page', id);\n    this.lastPageRequestId.set(reqId);\n  }\n\n  /** Stable per-card component id so dynamic-data requests are scoped per card host. */\n  private cardHostComponentId(): string {\n    return `eru-grid-card-host__${this.cardPageId}__${this.hostKey(Math.random().toString(36).slice(2))}`;\n  }\n\n  /**\n   * Identity for this host's stamped component ids.\n   *\n   * Row id when there is a row, else the caller-supplied instance key — and\n   * BOTH when both exist. A board has one card per row so the row id alone is\n   * unique, but a table can carry two `page` columns, whose hosts sit on the\n   * same row and would otherwise stamp identical ids. instanceKey is the\n   * column name there.\n   */\n  private hostKey(fallback: string): string {\n    const rowId = this.row?.entity_id ?? this.row?.id;\n    const hasRow = rowId !== undefined && rowId !== null && rowId !== '';\n    if (!hasRow) return this.instanceKey || fallback;\n    return this.instanceKey ? `${this.instanceKey}_${rowId}` : String(rowId);\n  }\n\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) return definition.component;\n    return (this.componentRegistry as any)['loadedComponents']?.get(type);\n  }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, signal, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { EruGridCardHostComponent } from '../grid/grid-card-host.component';\nimport { resolveJsonPath } from '../../utils/json.util';\nimport { applyNegativeDisplay, formatNumberValue } from '../../utils/number-format.util';\n\nconst TEXT_EMPHASIS_STEPS = ['xs', 'sm', 'md', 'lg', 'xl', '2xl'];\nconst ICON_SIZE_STEPS = ['xs', 'sm', 'md', 'lg', 'xl', '2xl'];\n\nconst TEXT_EMPHASIS_OPTIONS = [\n  { value: '', label: 'Follow value emphasis' },\n  { value: 'xs', label: 'Extra small' },\n  { value: 'sm', label: 'Small' },\n  { value: 'md', label: 'Medium' },\n  { value: 'lg', label: 'Large' },\n  { value: 'xl', label: 'Extra large' },\n  { value: '2xl', label: 'Display' }\n];\n\n@Component({\n  selector: 'eru-tile',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatIconModule, EruGridCardHostComponent],\n  templateUrl: './tile.component.html',\n  styleUrl: './tile.component.scss'\n})\nexport class TileComponent extends BaseComponent {\n\n  private readonly queryData = signal<any>(null);\n\n  constructor() {\n    super();\n\n    effect(() => {\n      const componentId = this.component()?.id;\n      if (!componentId) return;\n      const requests = this.store.dynamicDataRequests();\n      for (const [requestId, request] of requests.entries()) {\n        if (request.componentId !== componentId || request.status !== 'pending') continue;\n        let options: { label: string; value: string }[] = [];\n        let processed = false;\n\n        if (request.type === 'ds_entity_name') {\n          const ds = this.getProperty('data_source');\n          if (ds === 'nested_entity') {\n            options = this.store.nestedEntities().map(e => ({ label: e.display_name || e.name || '', value: e.name || '' }));\n          } else {\n            const parentName = this.store.currentPage()?.entity_name || '';\n            if (parentName) {\n              options = (this.store.getChildEntities(parentName) || []).map(e => ({ label: e.display_name || e.name || '', value: e.name || '' }));\n            }\n          }\n          untracked(() => this.store.setDynamicDataResponse(request, options));\n          processed = true;\n        } else if (request.type === 'ds_tile_fields') {\n          // Entity fields: tile entity, falling back to the page entity (the tile\n          // often reads page data with no entity_name of its own).\n          const entityName = request.payload || this.getProperty('entity_name') || this.store.currentPage()?.entity_name || '';\n          const entityOpts = entityName\n            ? (this.store.getEntityFields(entityName) || []).map(f => ({ label: f.label || f.name || '', value: f.name || '' }))\n            : [];\n          // Union the page's state variables, prefixed with `state_` so the tile\n          // can resolve them from page state (many tiles show aggregated state\n          // values like total_limit that aren't entity fields). Built fresh on\n          // each request so they show reliably on a page refresh.\n          const stateOpts = (this.store.currentPage()?.state || [])\n            .filter((sv: any) => sv?.key)\n            .map((sv: any) => ({ label: `${sv.key} (state)`, value: `state_${sv.key}` }));\n          options = [...entityOpts, ...stateOpts];\n          untracked(() => {\n            this.store.setDynamicDataResponse(request, options);\n            this.store.setDynamicData('ds_tile_fields', options);\n          });\n          processed = true;\n        }\n\n        if (processed) {\n          this.store.removeDynamicDataRequest(request.requestId);\n        }\n      }\n    });\n\n    effect(() => {\n      const storeQueryData = this.store.queryData();\n      untracked(() => {\n        const query = this.getProperty('query');\n        if (!query) return;\n        const data = storeQueryData.get(query);\n        if (data !== undefined) this.queryData.set(data);\n      });\n    });\n\n    // Ask the host to run the query.\n    //\n    // The tile used to only read `store.queryData()` and never fill it: nothing\n    // inside the library calls setQueryData, so for a tile that map stayed empty\n    // for good. A dashboard of seven tiles bound to three queries never issued a\n    // single request for them — the tiles simply rendered blank while the charts\n    // beside them, which do ask, drew fine. Charts request through\n    // `fetch_query_data`; a tile has no variables of its own to pass, so it asks\n    // the same way with an empty payload.\n    effect(() => {\n      if (this.getProperty('data_source') !== 'query') return;\n      const query = String(this.getProperty('query') || '').trim();\n      if (!query) return;\n      untracked(() => {\n        if (query === this.lastQueryRequested) return;\n        this.lastQueryRequested = query;\n        this.queryRequestId.set(\n          this.store.requestDynamicData(this.component()?.id || '', 'fetch_query_data', { query, payload: {} }),\n        );\n      });\n    });\n\n    // The host answers a fetch_query_data request through\n    // setDynamicDataResponse, keyed by the request id - NOT through\n    // setQueryData, which only the older ds_fetch_query path fills. Reading the\n    // wrong one leaves the tile blank even though its query ran and returned.\n    effect(() => {\n      const requestId = this.queryRequestId();\n      if (!requestId) return;\n      const responses = this.store.dynamicDataResponses();\n      if (!responses.has(requestId)) return;\n      const data = responses.get(requestId);\n      if (data === undefined || data === null) return;\n      untracked(() => this.queryData.set(data));\n    });\n  }\n\n  /** The dynamic-data request this tile is waiting on for its query rows. */\n  private readonly queryRequestId = signal<string | null>(null);\n\n  /** The query already asked for, so the effect does not re-fetch on every tick. */\n  private lastQueryRequested = '';\n\n  /**\n   * The single row a tile reads its *_field values from.\n   *\n   * A saved query answers with one envelope per statement, each keyed by its\n   * result set: `[{ Results: [ …rows ] }]`. Reading `data[0][field]` off that\n   * lands on the envelope, not the row, so every field came back undefined and\n   * the tile showed nothing even once the query had run.\n   */\n  private readonly queryRow = computed<Record<string, any> | null>(() => {\n    const data = this.queryData();\n    if (!data) return null;\n    const unwrap = (value: any): any[] | null => {\n      if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n      for (const key of ['Results', 'results', 'result', 'rows', 'data']) {\n        if (Array.isArray(value[key])) return value[key];\n      }\n      return null;\n    };\n    let rows: any[] | null = null;\n    if (Array.isArray(data)) {\n      rows = (data.length === 1 ? unwrap(data[0]) : null) ?? data;\n    } else {\n      rows = unwrap(data);\n      if (!rows) return data as Record<string, any>;\n    }\n    return rows && rows.length > 0 ? (rows[0] as Record<string, any>) : null;\n  });\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      layout: 'preset',\n      card_page_id: '',\n      variant: 'metric',\n      density: 'comfortable',\n      emphasis: 'md',\n      title_emphasis: '',\n      subtitle_emphasis: '',\n      label_emphasis: '',\n      label_position: '',\n      stats_layout: 'auto',\n      icon_position: 'top',\n      icon_size: '',\n      data_source: 'page_data',\n      entity_name: '',\n      query: '',\n      title: 'Total Properties',\n      subtitle: '',\n      title_field: '',\n      title_path: '',\n      primary_value_path: '',\n      secondary_value_path: '',\n      primary_value_field: '',\n      primary_value_label: '',\n      secondary_value_field: '',\n      secondary_value_label: '',\n      dynamic_number: false,\n      display_number_as: 'lacs',\n      number_decimals: 2,\n      seperator: '',\n      currency_symbol_field: '',\n      currency_symbol_path: '',\n      currency_symbol: '',\n      icon: 'analytics',\n      icon_color: '',\n      badge_text: '',\n      badge_color: '',\n      badge_text_color: '',\n      alert_text: '',\n      badge_text_path: '',\n      alert_text_path: '',\n      alert_icon: 'warning',\n      show_graph: false,\n      graph_data_field: '',\n      color_rules: '',\n      bg_color: '',\n      text_color: '',\n      scale: 1\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {};\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'layout',\n        label: 'Layout',\n        type: 'select',\n        category: 'content',\n        default_value: 'preset',\n        options: [\n          { value: 'preset', label: 'Preset' },\n          { value: 'page', label: 'Custom page' }\n        ],\n        description: 'Preset draws the built-in tile. Custom page renders a saved page as the tile body, the same way a board card does.'\n      },\n      {\n        key: 'card_page_id',\n        label: 'Card Page',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_page_name',\n        default_value: '',\n        visible_if: { key: 'layout', equals: 'page' },\n        width: 'full'\n      },\n      {\n        key: 'variant',\n        label: 'Variant',\n        type: 'select',\n        category: 'content',\n        default_value: 'metric',\n        visible_if: { key: 'layout', equals: 'preset' },\n        description: 'Chooses the value visual. Everything else — icon, badge, subtitle, secondary value, sparkline, alert — is available to all variants.',\n        options: [\n          { value: 'metric', label: 'Metric' },\n          { value: 'progress', label: 'Progress' },\n          { value: 'gauge', label: 'Gauge' },\n          { value: 'card', label: 'Card' }\n        ]\n      },\n      {\n        key: 'data_source',\n        label: 'Data Source',\n        type: 'select',\n        category: 'data',\n        default_value: 'page_data',\n        description: 'Where the *_field values are read from. A tile cannot pass variables to its own query, so ' +\n          'Query runs it with every variable empty — use it only for a query that takes none. To show a filtered ' +\n          'number, land the rows in page state with a call-query action and point *_field at that variable.',\n        options: [\n          { value: 'page_data', label: 'Page Data' },\n          { value: 'query', label: 'Query' },\n          { value: 'static', label: 'Static' }\n        ]\n      },\n      {\n        key: 'entity_name',\n        label: 'Entity',\n        type: 'select',\n        category: 'data',\n        dynamic_options: 'ds_entity_name',\n        default_value: '',\n        visible_if: { key: 'data_source', equals: 'page_data' },\n        on_value_change: (value: string) => {\n          this.store.requestDynamicData(this.component()?.id || '', 'ds_tile_fields', value);\n        }\n      },\n      {\n        key: 'query',\n        label: 'Query',\n        type: 'text',\n        category: 'data',\n        default_value: '',\n        description: 'Saved query run by this tile, with no variables — a query that needs filter values will ' +\n          'return nothing here.',\n        visible_if: { key: 'data_source', equals: 'query' },\n        on_value_change: (value: string) => {\n          const requestId = this.store.requestDynamicData(this.component()?.id || '', 'ds_fetch_query', value);\n        }\n      },\n      { key: 'title', label: 'Title', type: 'text', category: 'content', default_value: 'Total Properties', width: 2 },\n      {\n        key: 'title_field',\n        label: 'Title Field',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_tile_fields',\n        default_value: '',\n        width: 2\n      },\n      {\n        key: 'title_path',\n        label: 'Title Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        width: 2,\n        description: 'Dot path into the selected field when it holds a JSON object or array (e.g. entity_data.program_name). Leave blank to use the value as it is.'\n      },\n      { key: 'subtitle', label: 'Subtitle', type: 'text', category: 'content', width: 2 },\n      {\n        key: 'primary_value_field',\n        label: 'Primary Value Field',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_tile_fields',\n        default_value: '',\n        description: 'Field holding the value. With Data Source \"query\" this is a column name and the row is ' +\n          'already unwrapped, so Primary Value Path stays blank unless that column holds JSON. It may also name a ' +\n          'page-state variable, by prefixing the state key with state_ — variable \"er_rows\" is read as ' +\n          '\"state_er_rows\" — whatever Data Source is set to; a variable holding an array of rows is the one case ' +\n          'that needs an index, e.g. path \"0.latest_rate\".',\n        width: 2\n      },\n      {\n        key: 'primary_value_path',\n        label: 'Primary Value Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        width: 2,\n        description: 'Dot path into the selected field when it holds a JSON object or array (e.g. entity_data.limit_amount). Leave blank to use the value as it is.'\n      },\n      { key: 'primary_value_label', label: 'Primary Value Label', type: 'text', category: 'content', width: 2 },\n      {\n        key: 'secondary_value_field',\n        label: 'Secondary Value Field',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_tile_fields',\n        default_value: '',\n        width: 2\n      },\n      {\n        key: 'secondary_value_path',\n        label: 'Secondary Value Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        width: 2,\n        description: 'Dot path into the selected field when it holds a JSON object or array (e.g. totals.0.amount). Leave blank to use the value as it is.'\n      },\n      { key: 'secondary_value_label', label: 'Secondary Value Label', type: 'text', category: 'content', width: 2 },\n      {\n        key: 'dynamic_number',\n        label: 'Abbreviate Numbers (k, L, Cr)',\n        type: 'boolean',\n        category: 'content',\n        default_value: false,\n        description: 'Format primary/secondary numeric values in shortened form (e.g. 1.76Cr or 12.3mn).',\n        width: 2\n      },\n      {\n        key: 'negative_display',\n        type: 'select',\n        label: 'Negative Numbers',\n        category: 'behavior',\n        default_value: 'as_is',\n        options: [\n          { value: 'as_is', label: 'As is', preview: '-1,234.10' },\n          { value: 'colored', label: 'Coloured', preview: '-1,234.10', preview_color: '#d32f2f' },\n          { value: 'colored_abs', label: 'Coloured, no sign', preview: '1,234.10', preview_color: '#d32f2f' },\n          { value: 'parentheses', label: 'Coloured, in brackets', preview: '(1,234.10)', preview_color: '#d32f2f' }\n        ],\n        description: 'How a negative primary or secondary value reads, the way a spreadsheet asks it. The last three paint the value in the colour below.',\n        responsive: false\n      },\n      {\n        key: 'negative_color',\n        type: 'color',\n        label: 'Negative Colour',\n        category: 'behavior',\n        default_value: '#d32f2f',\n        description: 'Colour for negative values. A matching Colour Rule wins over this, since a rule is about the specific value.',\n        visible_if: { key: 'negative_display', notEquals: 'as_is' },\n        responsive: false\n      },\n      {\n        key: 'display_number_as',\n        label: 'Abbreviation System',\n        type: 'select',\n        category: 'content',\n        default_value: 'lacs',\n        options: [\n          { value: 'lacs', label: 'Indian (k, L, Cr)' },\n          { value: 'mn', label: 'International (k, mn, bn, tn)' }\n        ],\n        visible_if: { key: 'dynamic_number', equals: true },\n        width: 2\n      },\n      {\n        key: 'number_decimals',\n        label: 'Decimal Places',\n        type: 'number',\n        category: 'content',\n        default_value: 2,\n        min: 0,\n        max: 6,\n        width: 2\n      },\n      {\n        key: 'seperator',\n        label: 'Digit Grouping',\n        type: 'select',\n        category: 'content',\n        default_value: '',\n        options: [\n          { value: '', label: 'From data model' },\n          { value: 'none', label: 'None (10000000)' },\n          { value: 'thousands', label: 'Indian (1,00,00,000)' },\n          { value: 'millions', label: 'Western (10,000,000)' }\n        ],\n        description: 'Digit grouping for the primary and secondary values. Key and values match the data model, so a bound field groups the same way here, in a number or currency field and in a grid. Left blank, the bound field\\'s own grouping applies, and Indian grouping when the model does not say either.',\n        width: 2,\n        responsive: false\n      },\n      {\n        key: 'currency_symbol_field',\n        label: 'Currency Symbol Field',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_tile_fields',\n        default_value: '',\n        description: 'Take the currency symbol from a field/state value (e.g. a currency code). Overrides the static symbol below.',\n        width: 2\n      },\n      {\n        key: 'currency_symbol_path',\n        label: 'Currency Symbol Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        width: 2,\n        description: 'Dot path into the selected field when it holds a JSON object or array (e.g. entity_data.currency). Leave blank to use the value as it is.'\n      },\n      { key: 'currency_symbol', label: 'Currency Symbol (static)', type: 'text', category: 'content', default_value: '', width: 2 },\n      { key: 'icon', label: 'Icon', type: 'text', category: 'content', default_value: 'analytics', width: 2 },\n      { key: 'icon_color', label: 'Icon Color', type: 'color', category: 'content', width: 2 },\n      { key: 'badge_text', label: 'Badge (text or field)', type: 'text', category: 'content', width: 2 },\n      {\n        key: 'badge_text_path',\n        label: 'Badge Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        width: 2,\n        description: 'Dot path into the field named above when it holds a JSON object or array (e.g. entity_data.status). Ignored when the text above is literal rather than a field name.'\n      },\n      { key: 'badge_color', label: 'Badge Background', type: 'color', category: 'content', width: 2 },\n      { key: 'badge_text_color', label: 'Badge Text Color', type: 'color', category: 'content', width: 2 },\n      { key: 'alert_text', label: 'Alert Text (text or field)', type: 'text', category: 'content', width: 2 },\n      {\n        key: 'alert_text_path',\n        label: 'Alert Text Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        width: 2,\n        description: 'Dot path into the field named above when it holds a JSON object or array (e.g. entity_data.breach_reason). Ignored when the text above is literal rather than a field name.'\n      },\n      { key: 'alert_icon', label: 'Alert Icon', type: 'text', category: 'content', default_value: 'warning', width: 2 },\n      { key: 'show_graph', label: 'Show Sparkline', type: 'boolean', category: 'content' },\n      {\n        key: 'graph_data_field',\n        label: 'Graph Data Field',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_tile_fields',\n        default_value: '',\n        width: 2\n      },\n      {\n        key: 'color_rules',\n        label: 'Color Rules (JSON)',\n        type: 'textarea',\n        category: 'layout',\n        description: '[{\"min\":0,\"max\":30,\"bg\":\"#fee2e2\",\"text\":\"#ef4444\"},{\"min\":31,\"bg\":\"#dcfce7\",\"text\":\"#16a34a\"}]',\n        width: 'full'\n      },\n      { key: 'bg_color', label: 'Background Color', type: 'color', category: 'layout', width: 2 },\n      { key: 'text_color', label: 'Text Color', type: 'color', category: 'layout', width: 2 },\n      {\n        key: 'density',\n        label: 'Density',\n        type: 'select',\n        category: 'layout',\n        default_value: 'comfortable',\n        width: 2,\n        options: [\n          { value: 'compact', label: 'Compact' },\n          { value: 'comfortable', label: 'Comfortable' },\n          { value: 'spacious', label: 'Spacious' }\n        ],\n        description: 'Padding and gaps. Drives the whole spacing ramp together.'\n      },\n      {\n        key: 'emphasis',\n        label: 'Value Emphasis',\n        type: 'select',\n        category: 'layout',\n        default_value: 'md',\n        width: 2,\n        options: [\n          { value: 'sm', label: 'Small' },\n          { value: 'md', label: 'Medium' },\n          { value: 'lg', label: 'Large' },\n          { value: 'xl', label: 'Extra large' }\n        ],\n        description: 'Size of the primary value. Title and subtitle follow it at fixed ratios so the tile stays in proportion.'\n      },\n      {\n        key: 'title_emphasis',\n        label: 'Title Size',\n        type: 'select',\n        category: 'layout',\n        default_value: '',\n        width: 2,\n        options: TEXT_EMPHASIS_OPTIONS,\n        description: 'Overrides the size the value emphasis would pick for the title.'\n      },\n      {\n        key: 'subtitle_emphasis',\n        label: 'Subtitle Size',\n        type: 'select',\n        category: 'layout',\n        default_value: '',\n        width: 2,\n        options: TEXT_EMPHASIS_OPTIONS\n      },\n      {\n        key: 'label_emphasis',\n        label: 'Caption Size',\n        type: 'select',\n        category: 'layout',\n        default_value: '',\n        width: 2,\n        options: TEXT_EMPHASIS_OPTIONS,\n        description: 'Value labels, stat labels and the badge.'\n      },\n      {\n        key: 'icon_position',\n        label: 'Icon Position',\n        type: 'select',\n        category: 'layout',\n        default_value: 'top',\n        width: 2,\n        options: [\n          { value: 'top', label: 'Header row' },\n          { value: 'left', label: 'Leading (left)' },\n          { value: 'right', label: 'Trailing (right)' }\n        ],\n        description: 'Leading and trailing place the icon beside the whole value/title block; header keeps it on the badge row.'\n      },\n      {\n        key: 'icon_size',\n        label: 'Icon Size',\n        type: 'select',\n        category: 'layout',\n        default_value: '',\n        width: 2,\n        options: [\n          { value: '', label: 'Follow value emphasis' },\n          { value: 'xs', label: 'Extra small' },\n          { value: 'sm', label: 'Small' },\n          { value: 'md', label: 'Medium' },\n          { value: 'lg', label: 'Large' },\n          { value: 'xl', label: 'Extra large' },\n          { value: '2xl', label: 'Display' }\n        ]\n      },\n      {\n        key: 'label_position',\n        label: 'Title Position',\n        type: 'select',\n        category: 'layout',\n        default_value: '',\n        width: 2,\n        options: [\n          { value: '', label: 'Variant default' },\n          { value: 'below', label: 'Below value' },\n          { value: 'above', label: 'Above value' }\n        ],\n        description: 'Set explicitly to make every variant read in the same order.'\n      },\n      {\n        key: 'stats_layout',\n        label: 'Secondary Value',\n        type: 'select',\n        category: 'layout',\n        default_value: 'auto',\n        width: 2,\n        options: [\n          { value: 'auto', label: 'Variant default' },\n          { value: 'inline', label: 'Inline under value' },\n          { value: 'row', label: 'Side-by-side stat' }\n        ]\n      },\n      {\n        key: 'scale',\n        label: 'Scale',\n        type: 'number',\n        category: 'layout',\n        default_value: 1,\n        min: 0.5,\n        max: 4,\n        step: 0.1,\n        width: 2,\n        description: 'Multiplies the whole ramp on top of Density and Emphasis. 1 = 100%.'\n      }\n    ];\n  }\n\n  /**\n   * Value behind a configured field, with an optional dot path into it.\n   *\n   * A state variable (or a query/page-data field) often holds a JSON object —\n   * the record a row select parked there, an aggregate returned as one blob —\n   * so the field alone resolves to the whole thing and the tile has nothing to\n   * show. `path` drills in, parsing JSON strings on the way, the same rule\n   * page_ref's State Result Path follows.\n   */\n  private resolveField(fieldName: string, path?: string): any {\n    if (!fieldName) return null;\n    const withPath = (value: any) => {\n      const p = String(path ?? '').trim();\n      if (!p) return value;\n      const resolved = resolveJsonPath(value, p);\n      return resolved === undefined ? null : resolved;\n    };\n    // Page state field — unioned into the field pickers with a `state_` prefix.\n    if (fieldName.startsWith('state_')) {\n      return withPath(this.store.getPageStateValue(fieldName.slice(6), this.component()?.pageId));\n    }\n    const ds = this.getProperty('data_source');\n    if (ds === 'static') return null;\n    if (ds === 'query') {\n      const row = this.queryRow();\n      if (!row) return null;\n      return withPath(row[fieldName] ?? null);\n    }\n    return withPath(this.store.getPageFieldData(this.scopedFieldKey(fieldName), this.component()?.pageId));\n  }\n\n  // Map common variant aliases used in page configs to the supported set.\n  readonly resolvedVariant = computed<'metric' | 'progress' | 'gauge' | 'card'>(() => {\n    const v = String(this.getProperty('variant') || 'metric').toLowerCase();\n    if (v === 'kpi') return 'metric';\n    if (v === 'summary') return 'card';\n    if (v === 'progress' || v === 'gauge' || v === 'card' || v === 'metric') return v as any;\n    return 'metric';\n  });\n\n  /** Preset shell, or a saved page projected as the tile body. */\n  readonly resolvedLayout = computed<'preset' | 'page'>(() =>\n    this.getProperty('layout') === 'page' && this.getProperty('card_page_id') ? 'page' : 'preset');\n\n  readonly cardPageId = computed<string>(() => this.getProperty('card_page_id') || '');\n\n  /**\n   * Which visual fills the value slot. This is the only thing `variant` decides\n   * now — the header, title, subtitle, secondary value, sparkline and alert are\n   * shared by every variant rather than re-declared (and half-forgotten) in each.\n   */\n  readonly valueVisual = computed<'number' | 'bar' | 'arc'>(() => {\n    const v = this.resolvedVariant();\n    if (v === 'progress') return 'bar';\n    if (v === 'gauge') return 'arc';\n    return 'number';\n  });\n\n  /** The arc draws its own value, so the shell must not draw it twice. */\n  readonly showShellValue = computed(() => this.valueVisual() !== 'arc');\n\n  readonly density = computed<'compact' | 'comfortable' | 'spacious'>(() => {\n    const d = String(this.getProperty('density') || 'comfortable');\n    return (d === 'compact' || d === 'spacious') ? d : 'comfortable';\n  });\n\n  readonly emphasis = computed<'sm' | 'md' | 'lg' | 'xl'>(() => {\n    const e = String(this.getProperty('emphasis') || 'md');\n    return (e === 'sm' || e === 'lg' || e === 'xl') ? e : 'md';\n  });\n\n  /**\n   * Title before or after the value. Defaults per variant so existing pages keep\n   * their reading order; set explicitly to make all variants agree.\n   */\n  readonly labelPosition = computed<'above' | 'below'>(() => {\n    const p = this.getProperty('label_position');\n    if (p === 'above' || p === 'below') return p;\n    return this.resolvedVariant() === 'card' ? 'above' : 'below';\n  });\n\n  /** `card` shows primary and secondary as two stats; the rest inline the secondary. */\n  readonly statsLayout = computed<'inline' | 'row'>(() => {\n    const s = this.getProperty('stats_layout');\n    if (s === 'inline' || s === 'row') return s;\n    return this.resolvedVariant() === 'card' ? 'row' : 'inline';\n  });\n\n  readonly hasSecondary = computed(() =>\n    this.secondaryValue() != null || !!this.getProperty('secondary_value_label'));\n\n  /**\n   * With `data_source: static` the *_value_label properties hold the value\n   * itself, so rendering them again as a caption prints it twice.\n   */\n  private readonly isStatic = computed(() => this.getProperty('data_source') === 'static');\n  readonly showValueLabel = computed(() =>\n    !this.isStatic() && !!this.getProperty('primary_value_label'));\n  readonly showSecondaryLabel = computed(() =>\n    !this.isStatic() && !!this.getProperty('secondary_value_label'));\n\n  readonly hasIcon = computed(() => !!this.getProperty('icon'));\n\n  readonly iconPosition = computed<'top' | 'left' | 'right'>(() => {\n    const p = String(this.getProperty('icon_position') || 'top');\n    return (p === 'left' || p === 'right') ? p : 'top';\n  });\n\n  readonly iconSize = computed(() => {\n    const v = String(this.getProperty('icon_size') || '');\n    return ICON_SIZE_STEPS.includes(v) ? v : '';\n  });\n\n  /** The header row exists for the badge, and for the icon only when it sits there. */\n  readonly showHeader = computed(() =>\n    !!this.resolvedBadge() || (this.hasIcon() && this.iconPosition() === 'top'));\n\n  /** '' means \"follow the value emphasis\"; anything else pins a step on the scale. */\n  private textStep(key: string): string {\n    const v = String(this.getProperty(key) || '');\n    return TEXT_EMPHASIS_STEPS.includes(v) ? v : '';\n  }\n\n  readonly titleEmphasis = computed(() => this.textStep('title_emphasis'));\n  readonly subtitleEmphasis = computed(() => this.textStep('subtitle_emphasis'));\n  readonly labelEmphasis = computed(() => this.textStep('label_emphasis'));\n\n  readonly shellClasses = computed(() => {\n    const title = this.titleEmphasis();\n    const subtitle = this.subtitleEmphasis();\n    const label = this.labelEmphasis();\n    return {\n      [`tile--${this.resolvedVariant()}`]: true,\n      [`tile--density-${this.density()}`]: true,\n      [`tile--emphasis-${this.emphasis()}`]: true,\n      [`tile--titlepos-${this.labelPosition()}`]: true,\n      [`tile--stats-${this.statsLayout()}`]: true,\n      [`tile--iconpos-${this.iconPosition()}`]: true,\n      [`tile--iconsize-${this.iconSize()}`]: !!this.iconSize(),\n      [`tile--title-${title}`]: !!title,\n      [`tile--subtitle-${subtitle}`]: !!subtitle,\n      [`tile--label-${label}`]: !!label,\n      'tile--page': this.resolvedLayout() === 'page'\n    };\n  });\n\n  readonly primaryValue = computed(() => {\n    if (this.getProperty('data_source') === 'static') {\n      const label = this.getProperty('primary_value_label');\n      return label !== undefined && label !== '' ? label : null;\n    }\n    return this.resolveField(this.getProperty('primary_value_field'), this.getProperty('primary_value_path'));\n  });\n  readonly secondaryValue = computed(() => {\n    if (this.getProperty('data_source') === 'static') {\n      const label = this.getProperty('secondary_value_label');\n      return label !== undefined && label !== '' ? label : null;\n    }\n    return this.resolveField(this.getProperty('secondary_value_field'), this.getProperty('secondary_value_path'));\n  });\n\n  // Display-formatted primary/secondary values: dynamic numbering (k/L/Cr) and\n  // an optional currency symbol resolved from a field/state value — mirroring\n  // the currency datatype. Kept separate from primaryValue()/secondaryValue()\n  // so the gauge/progress/colour maths still use the raw numeric value.\n  readonly formattedPrimary = computed(() =>\n    this.formatValue(this.primaryValue(), this.getProperty('primary_value_field')));\n  readonly formattedSecondary = computed(() =>\n    this.formatValue(this.secondaryValue(), this.getProperty('secondary_value_field')));\n\n  private modelFieldFor(fieldName: string): any {\n    if (!fieldName || fieldName.startsWith('state_')) return null;\n    return this.store.getEntityField(fieldName, this.getProperty('entity_name') || '');\n  }\n\n  private explicitSeperator(fieldName: string): string | undefined {\n    const own = String(this.getProperty('seperator') ?? '').trim();\n    if (own) return own;\n    const fromModel = String(this.modelFieldFor(fieldName)?.seperator ?? '').trim();\n    return fromModel || undefined;\n  }\n\n  /** Resolve the currency symbol: from a field/state value if configured, else\n   *  the static symbol property. */\n  private resolveCurrencySymbol(): string {\n    const symField = this.getProperty('currency_symbol_field');\n    if (symField) {\n      const v = this.resolveField(symField, this.getProperty('currency_symbol_path'));\n      if (v != null && v !== '') return String(v);\n      return '';\n    }\n    return this.getProperty('currency_symbol') || '';\n  }\n\n  /** Format a value for display. Only formats when dynamic numbering is on or a\n   *  currency symbol is set — otherwise returns the value unchanged so plain\n   *  text / counts are untouched. */\n  private formatValue(raw: any, fieldName: string = ''): any {\n    if (raw === null || raw === undefined || raw === '') return raw;\n    const symbol = this.resolveCurrencySymbol();\n    const dyn = this.getProperty('dynamic_number') === true || this.getProperty('dynamic_number') === 'yes';\n    const seperator = this.explicitSeperator(fieldName);\n    const num = Number(raw);\n    const negative = this.negativeDisplayMode();\n    // The untouched path stays untouched unless a negative mode was chosen: a\n    // tile showing a count or a piece of text must not start growing brackets\n    // just because it holds a minus sign somewhere.\n    if (!dyn && !symbol && !seperator) {\n      return (negative !== 'as_is' && !isNaN(num))\n        ? applyNegativeDisplay(String(raw), num, negative)\n        : raw;\n    }\n    if (isNaN(num)) return raw;\n    return formatNumberValue(num, {\n      decimals: Number(this.getProperty('number_decimals') ?? 2),\n      seperator: seperator ?? 'thousands',\n      dynamic_number: dyn,\n      display_number_as: this.getProperty('display_number_as') === 'lacs' ? 'lacs' : 'mn',\n      symbol,\n      negative_display: negative\n    });\n  }\n\n  /** Negative colour for each value slot, or null. See BaseComponent. */\n  readonly negativePrimaryColor = computed<string | null>(() => this.negativeColorFor(this.primaryValue()));\n  readonly negativeSecondaryColor = computed<string | null>(() => this.negativeColorFor(this.secondaryValue()));\n\n  readonly resolvedTitle = computed(() => {\n    const field = this.getProperty('title_field');\n    if (field) {\n      const val = this.resolveField(field, this.getProperty('title_path'));\n      if (val != null) return String(val);\n    }\n    return this.getProperty('title') || '';\n  });\n\n  readonly resolvedBadge = computed(() => {\n    const text = this.getProperty('badge_text');\n    if (!text) return '';\n    const val = this.resolveField(text, this.getProperty('badge_text_path'));\n    return val != null ? String(val) : text;\n  });\n\n  readonly resolvedAlert = computed(() => {\n    const text = this.getProperty('alert_text');\n    if (!text) return '';\n    const val = this.resolveField(text, this.getProperty('alert_text_path'));\n    return val != null ? String(val) : text;\n  });\n\n  /**\n   * The first colour rule whose band contains the primary value, or null.\n   *\n   * Split out of `dynamicColors` because the two answer different questions.\n   * `dynamicColors` is \"what colour is this tile\", which folds in the plain\n   * Text Colour as a fallback — and that fallback is not a rule about the value,\n   * so it must not outrank the negative colour. Only a MATCH does.\n   */\n  private readonly matchedColorRule = computed<{ bg?: string; text?: string } | null>(() => {\n    const rulesJson = this.getProperty('color_rules');\n    const numValue = parseFloat(String(this.primaryValue() ?? ''));\n    if (!rulesJson || isNaN(numValue)) return null;\n    try {\n      const rules: Array<{ min?: number; max?: number; bg?: string; text?: string }> = JSON.parse(rulesJson);\n      for (const rule of rules) {\n        if ((rule.min == null || numValue >= rule.min) && (rule.max == null || numValue <= rule.max)) {\n          return rule;\n        }\n      }\n    } catch {}\n    return null;\n  });\n\n  readonly dynamicColors = computed(() => {\n    const rule = this.matchedColorRule();\n    const defaultBg = this.getProperty('bg_color') || '';\n    const defaultText = this.getProperty('text_color') || '';\n    return { bg: rule?.bg || defaultBg, text: rule?.text || defaultText };\n  });\n\n  /** Text colour from a matched rule only — see `matchedColorRule`. */\n  readonly ruleTextColor = computed<string>(() => this.matchedColorRule()?.text || '');\n\n  readonly tileStyles = computed(() => {\n    const colors = this.dynamicColors();\n    const base = this.combinedStyles();\n    if (!colors.text) {\n      return {\n        ...base,\n        ...(colors.bg ? { 'background-color': colors.bg } : {})\n      };\n    }\n    // The title, subtitle and value labels each set their own colour from the\n    // studio surface variables, and an element rule beats an inherited one — so\n    // setting `color` on the tile alone left every one of them at the light\n    // theme's dark grey, which is invisible on a dark tile. Pointing the\n    // variables at the chosen colour is what the variables are for, and it\n    // reaches the atoms without any of them having to know about text_color.\n    return {\n      ...base,\n      ...(colors.bg ? { 'background-color': colors.bg } : {}),\n      color: colors.text,\n      '--studio-on-surface': colors.text,\n      '--studio-on-surface-variant': colors.text\n    };\n  });\n\n  readonly tileScale = computed(() => {\n    const raw = parseFloat(String(this.getProperty('scale')));\n    if (isNaN(raw) || raw <= 0) return 1;\n    return Math.min(Math.max(raw, 0.5), 4);\n  });\n\n  readonly gaugeCircumference = 2 * Math.PI * 36;\n\n  readonly gaugeDashoffset = computed(() => {\n    const val = Math.min(Math.max(parseFloat(String(this.primaryValue() ?? 0)) || 0, 0), 100);\n    return this.gaugeCircumference * (1 - val / 100);\n  });\n\n  readonly gaugeColor = computed(() => this.dynamicColors().text || 'var(--studio-primary)');\n\n  readonly progressPercent = computed(() => {\n    const val = parseFloat(String(this.primaryValue() ?? 0)) || 0;\n    return Math.min(Math.max(val, 0), 100);\n  });\n\n  readonly sparklinePath = computed(() => {\n    const field = this.getProperty('graph_data_field');\n    const raw = this.resolveField(field);\n    if (!raw) return '';\n    const values = String(raw).split(',').map(v => parseFloat(v.trim())).filter(v => !isNaN(v));\n    if (values.length < 2) return '';\n    const w = 80, h = 28;\n    const min = Math.min(...values), max = Math.max(...values);\n    const range = max - min || 1;\n    const pts = values.map((v, i) => `${((i / (values.length - 1)) * w).toFixed(1)},${(h - ((v - min) / range) * h).toFixed(1)}`);\n    return `M ${pts.join(' L ')}`;\n  });\n\n  readonly sparklineAreaPath = computed(() => {\n    const line = this.sparklinePath();\n    return line ? `${line} L 80,28 L 0,28 Z` : '';\n  });\n}\n","@if (isComponentLoading()) {\n  <div class=\"tile tile-ghost\" [class]=\"classes()\" [ngClass]=\"shellClasses()\" [style.--tile-scale]=\"tileScale()\">\n    <div class=\"tg-icon\"></div>\n    <div class=\"tg-value\"></div>\n    <div class=\"tg-label\"></div>\n    <div class=\"tg-label tg-label--short\"></div>\n  </div>\n} @else {\n<div class=\"tile\" [class]=\"classes()\" [ngClass]=\"shellClasses()\" [ngStyle]=\"tileStyles()\" [style.--tile-scale]=\"tileScale()\">\n\n  @if (resolvedLayout() === 'page') {\n    <eru-grid-card-host\n      class=\"tile-page-host\"\n      [cardPageId]=\"cardPageId()\"\n      [instanceKey]=\"component()?.id || ''\">\n    </eru-grid-card-host>\n  } @else {\n\n  <!-- One icon definition, placed in whichever slot the position asks for, so\n       the leading and header layouts cannot drift apart. -->\n  <ng-template #iconTpl>\n    <span class=\"tile-icon\" [style.color]=\"dynamicColors().text || getProperty('icon_color')\">\n      <mat-icon>{{ getProperty('icon') }}</mat-icon>\n    </span>\n  </ng-template>\n\n  <div class=\"tile-inner\">\n\n  @if (hasIcon() && iconPosition() === 'left') {\n    <ng-container *ngTemplateOutlet=\"iconTpl\"></ng-container>\n  }\n\n  <div class=\"tile-shell\">\n\n    @if (showHeader()) {\n      <div class=\"tile-header\">\n        @if (hasIcon() && iconPosition() === 'top') {\n          <ng-container *ngTemplateOutlet=\"iconTpl\"></ng-container>\n        }\n        @if (resolvedBadge()) {\n          <span class=\"tile-badge\"\n            [style.background-color]=\"getProperty('badge_color') || ''\"\n            [style.color]=\"getProperty('badge_text_color') || ''\">\n            {{ resolvedBadge() }}\n          </span>\n        }\n      </div>\n    }\n\n    <!-- Title/subtitle and the value slot swap order via .tile--label-above.\n         Both are always emitted; CSS `order` decides which reads first, so the\n         two never drift apart the way four hand-written blocks did. -->\n    <div class=\"tile-text\">\n      <div class=\"tile-title\">{{ resolvedTitle() }}</div>\n      @if (getProperty('subtitle')) {\n        <div class=\"tile-subtitle\">{{ getProperty('subtitle') }}</div>\n      }\n    </div>\n\n    <div class=\"tile-body\">\n      <div class=\"tile-visual\">\n      @if (valueVisual() === 'arc') {\n        <svg class=\"gauge-svg\" viewBox=\"0 0 88 88\">\n          <circle class=\"gauge-track\" cx=\"44\" cy=\"44\" r=\"36\" />\n          <circle class=\"gauge-fill\"\n            cx=\"44\" cy=\"44\" r=\"36\"\n            [attr.stroke]=\"gaugeColor()\"\n            [attr.stroke-dasharray]=\"gaugeCircumference\"\n            [attr.stroke-dashoffset]=\"gaugeDashoffset()\"\n            transform=\"rotate(-90 44 44)\" />\n          <text x=\"44\" y=\"49\" class=\"gauge-value\" text-anchor=\"middle\"\n            [attr.fill]=\"negativePrimaryColor()\">\n            {{ primaryValue() != null ? formattedPrimary() : '—' }}\n          </text>\n        </svg>\n      }\n\n      @if (showShellValue()) {\n        <div class=\"tile-value\" [style.color]=\"ruleTextColor() || negativePrimaryColor() || dynamicColors().text || ''\">\n          @if (valueVisual() === 'bar') {\n            {{ primaryValue() != null ? primaryValue() + '%' : '—' }}\n          } @else {\n            {{ formattedPrimary() ?? '—' }}\n          }\n        </div>\n        @if (showValueLabel()) {\n          <div class=\"tile-value-label\">{{ getProperty('primary_value_label') }}</div>\n        }\n      }\n\n      @if (valueVisual() === 'bar') {\n        <div class=\"tile-progress-bar-track\">\n          <div class=\"tile-progress-bar-fill\"\n            [style.width]=\"progressPercent() + '%'\"\n            [style.background-color]=\"dynamicColors().text || 'var(--studio-primary)'\">\n          </div>\n        </div>\n      }\n    </div>\n\n    @if (hasSecondary()) {\n      <div class=\"tile-stats\">\n        <span class=\"tile-secondary-value\" [style.color]=\"negativeSecondaryColor()\">{{ formattedSecondary() }}</span>\n        @if (showSecondaryLabel()) {\n          <span class=\"tile-secondary-label\">{{ getProperty('secondary_value_label') }}</span>\n        }\n      </div>\n    }\n    </div>\n\n    @if (getProperty('show_graph') && sparklinePath()) {\n      <div class=\"tile-sparkline\">\n        <svg viewBox=\"0 0 80 28\" preserveAspectRatio=\"none\">\n          <path [attr.d]=\"sparklineAreaPath()\" class=\"sparkline-area\" />\n          <path [attr.d]=\"sparklinePath()\" class=\"sparkline-line\" />\n        </svg>\n      </div>\n    }\n\n    @if (resolvedAlert()) {\n      <div class=\"tile-alert\">\n        <mat-icon class=\"tile-alert-icon\">{{ getProperty('alert_icon') || 'warning' }}</mat-icon>\n        <span>{{ resolvedAlert() }}</span>\n      </div>\n    }\n\n  </div>\n\n  @if (hasIcon() && iconPosition() === 'right') {\n    <ng-container *ngTemplateOutlet=\"iconTpl\"></ng-container>\n  }\n\n  </div>\n\n  }\n\n</div>\n}\n","import { ChangeDetectionStrategy, Component, input, computed, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-button',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule, CanvasEventHandlerDirective, BaseComponent],\n  templateUrl: './button.component.html',\n  styleUrl: './button.component.scss'\n})\nexport class ButtonComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  /**\n   * If the button's click event toggles a side_panel/popup page_ref, return its target id.\n   * Used by `isToggleActive`/`effectiveLabel`/`effectiveIcon` to flip label/icon based on\n   * the target panel's open state.\n   */\n  private readonly toggleTargetId = computed<string | null>(() => {\n    const events = this.component()?.events ?? [];\n    for (const e of events) {\n      if (\n        (e.action === 'toggle-side-panel' || e.action === 'open-side-panel' || e.action === 'close-side-panel')\n        && e.fieldNames && e.fieldNames.length > 0\n      ) {\n        return e.fieldNames[0];\n      }\n    }\n    return null;\n  });\n\n  readonly isToggleActive = computed<boolean>(() => {\n    const id = this.toggleTargetId();\n    if (!id) return false;\n    return this.store.sidePanelOpenStates().get(id) === true;\n  });\n\n  readonly effectiveLabel = computed<string>(() => {\n    const active = this.isToggleActive();\n    if (active) {\n      const al = this.getProperty('active_label');\n      if (al !== undefined && al !== null && al !== '') return al;\n    }\n    return this.getProperty('label') ?? '';\n  });\n\n  readonly effectiveIcon = computed<string>(() => {\n    const active = this.isToggleActive();\n    if (active) {\n      const ai = this.getProperty('active_icon');\n      if (ai !== undefined && ai !== null && ai !== '') return ai;\n    }\n    return this.getProperty('icon') ?? '';\n  });\n\n  private readonly iconOnlyVariants = ['mat-icon-button', 'mat-fab', 'mat-mini-fab'];\n\n  readonly effectiveTooltip = computed<string>(() => {\n    if (!this.getProperty('show_tooltip')) return '';\n    const custom = (this.getProperty('tooltip') ?? '').toString().trim();\n    if (custom) return custom;\n    if (this.iconOnlyVariants.includes(this.getProperty('variant'))) {\n      return this.effectiveLabel();\n    }\n    return '';\n  });\n\n  readonly iconStyles = computed<Record<string, string>>(() => {\n    const styles: Record<string, string> = {};\n    const cs = this.combinedStyles();\n    const size = cs['font-size'] ?? cs['fontSize'];\n    if (size !== null && size !== undefined && size !== '') {\n      const px = typeof size === 'number' ? `${size}px` : `${size}`;\n      styles['font-size'] = px;\n      styles['width'] = px;\n      styles['height'] = px;\n    }\n    const weight = cs['font-weight'] ?? cs['fontWeight'];\n    if (weight !== null && weight !== undefined && weight !== '') {\n      styles['font-weight'] = `${weight}`;\n      styles['font-variation-settings'] = `'wght' ${weight}`;\n    }\n    return styles;\n  });\n\n  // Override the event map to provide button-specific event handlers\n  /*  protected override getEventMap(): { [key: string]: (event: any) => void } {\n     const baseEventMap = super.getEventMap();\n \n     return {\n       ...baseEventMap,\n       'buttonpress': (event) => this.onButtonPress(event),\n       'buttonrelease': (event) => this.onButtonRelease(event),\n       'buttonhover': (event) => this.onButtonHover(event),\n       'buttonfocus': (event) => this.onButtonFocus(event),\n       'buttonblur': (event) => this.onButtonBlur(event)\n     };\n   } */\n\n  protected onButtonPress(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('buttonpress', { originalEvent: event });\n      // NOTE: do NOT also emit 'click' here. The base component's onClick\n      // handler already emits 'click' for every component on a DOM click, so\n      // emitting it here too fires each Click-event action twice. That is\n      // invisible for idempotent actions (navigate, update-state) but breaks\n      // toggle actions (e.g. toggle-side-panel), which then open-then-close and\n      // appear to do nothing.\n    }\n  }\n\n  protected onButtonRelease(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('buttonrelease', { originalEvent: event });\n    }\n  }\n\n  protected onButtonHover(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('buttonhover', { originalEvent: event });\n    }\n  }\n\n  protected onButtonFocus(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('buttonfocus', { originalEvent: event });\n    }\n  }\n\n  protected onButtonBlur(event: any): void {\n    if (!this.store.editMode()) {\n      this.emitEvent('buttonblur', { originalEvent: event });\n    }\n  }\n\n  override componentEvents = [\n    { label: 'Button Press', value: 'buttonpress' },\n    { label: 'Button Release', value: 'buttonrelease' },\n    { label: 'Button Hover', value: 'buttonhover' },\n    { label: 'Button Focus', value: 'buttonfocus' },\n    { label: 'Button Blur', value: 'buttonblur' },\n    { label: 'API Success', value: 'api_success' },\n    { label: 'API Error', value: 'api_error' }\n  ];\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'variant',\n        type: 'select',\n        label: 'Variant',\n        category: 'layout',\n        default_value: 'mat-button',\n        options: [\n          { label: 'Basic Button', value: 'mat-button' },\n          { label: 'Raised Button', value: 'mat-raised-button' },\n          { label: 'Flat Button', value: 'mat-flat-button' },\n          { label: 'Stroked Button', value: 'mat-stroked-button' },\n          { label: 'Icon Button', value: 'mat-icon-button' },\n          { label: 'FAB', value: 'mat-fab' },\n          { label: 'Mini FAB', value: 'mat-mini-fab' }\n        ]\n      },\n      {\n        key: 'color',\n        type: 'select',\n        label: 'Color',\n        category: 'behavior',\n        default_value: 'primary',\n        options: [\n          { label: 'Primary', value: 'primary' },\n          { label: 'Accent', value: 'accent' },\n          { label: 'Warn', value: 'warn' }\n        ]\n      },\n      {\n        key: 'size',\n        type: 'select',\n        label: 'Size',\n        category: 'layout',\n        default_value: 'medium',\n        options: [\n          { label: 'Small', value: 'small' },\n          { label: 'Medium', value: 'medium' },\n          { label: 'Large', value: 'large' }\n        ]\n      },\n      {\n        key: 'disableRipple',\n        type: 'boolean',\n        label: 'Disable Ripple',\n        category: 'behavior',\n        default_value: false\n      },\n      {\n        key: 'type',\n        type: 'select',\n        label: 'Button Type',\n        category: 'behavior',\n        default_value: 'button',\n        options: [\n          { label: 'Button', value: 'button' },\n          { label: 'Submit', value: 'submit' },\n          { label: 'Reset', value: 'reset' }\n        ]\n      },\n      {\n        key: 'ariaLabel',\n        type: 'text',\n        label: 'Aria Label',\n        category: 'behavior',\n        default_value: ''\n      },\n      {\n        key: 'ariaLabelledBy',\n        type: 'text',\n        label: 'Aria Labelled By',\n        category: 'behavior',\n        default_value: ''\n      },\n      {\n        key: 'icon',\n        type: 'text',\n        label: 'Icon',\n        category: 'content',\n        default_value: '',\n        description: 'Material icon name (leave empty for no icon)'\n      },\n      {\n        key: 'iconPosition',\n        type: 'select',\n        label: 'Icon Position',\n        category: 'content',\n        default_value: 'before',\n        options: [\n          { label: 'Before', value: 'before' },\n          { label: 'After', value: 'after' }\n        ]\n      },\n      {\n        key: 'active_label',\n        type: 'text',\n        label: 'Active Label',\n        category: 'content',\n        default_value: '',\n        description: 'Label shown while a toggle-side-panel target is open. Empty = use Label.'\n      },\n      {\n        key: 'active_icon',\n        type: 'text',\n        label: 'Active Icon',\n        category: 'content',\n        default_value: '',\n        description: 'Icon shown while a toggle-side-panel target is open. Empty = use Icon.'\n      },\n      {\n        key: 'show_tooltip',\n        type: 'boolean',\n        label: 'Show Tooltip',\n        category: 'behavior',\n        default_value: true,\n        description: 'Show a tooltip on hover. Icon-only buttons (Icon/FAB/Mini FAB) fall back to the label.'\n      },\n      {\n        key: 'tooltip',\n        type: 'text',\n        label: 'Tooltip',\n        category: 'behavior',\n        default_value: '',\n        description: 'Custom tooltip text. Empty = use the label for icon-only buttons.'\n      }\n    ];\n  }\n\n\n}\n","@switch (getProperty('variant')) {\n@case ('mat-button') {\n<button mat-button [disabled]=\"isComponentDisabled()\" [color]=\"getProperty('color')\"\n  [disableRipple]=\"getProperty('disableRipple')\" [type]=\"getProperty('type')\"\n  [attr.aria-label]=\"getProperty('ariaLabel') || null\" [attr.aria-labelledby]=\"getProperty('ariaLabelledBy') || null\"\n  [class]=\"classes()\" [ngStyle]=\"combinedStyles()\"\n  [matTooltip]=\"effectiveTooltip()\" [matTooltipDisabled]=\"!effectiveTooltip()\"\n  (click)=\"onButtonPress($event)\" (mouseup)=\"onButtonRelease($event)\"\n  (mouseenter)=\"onButtonHover($event)\" (focus)=\"onButtonFocus($event)\" (blur)=\"onButtonBlur($event)\">\n  @if (effectiveIcon() && getProperty('iconPosition') !== 'after') {<mat-icon [ngStyle]=\"iconStyles()\">{{ effectiveIcon() }}</mat-icon>}\n  {{ effectiveLabel() }}\n  @if (effectiveIcon() && getProperty('iconPosition') === 'after') {<mat-icon iconPositionEnd [ngStyle]=\"iconStyles()\">{{ effectiveIcon() }}</mat-icon>}\n</button>\n}\n@case ('mat-raised-button') {\n<button mat-raised-button [disabled]=\"isComponentDisabled()\" [color]=\"getProperty('color')\"\n  [disableRipple]=\"getProperty('disableRipple')\" [type]=\"getProperty('type')\"\n  [attr.aria-label]=\"getProperty('ariaLabel') || null\" [attr.aria-labelledby]=\"getProperty('ariaLabelledBy') || null\"\n  [class]=\"classes()\" [ngStyle]=\"combinedStyles()\"\n  [matTooltip]=\"effectiveTooltip()\" [matTooltipDisabled]=\"!effectiveTooltip()\"\n  (click)=\"onButtonPress($event)\" (mouseup)=\"onButtonRelease($event)\"\n  (mouseenter)=\"onButtonHover($event)\" (focus)=\"onButtonFocus($event)\" (blur)=\"onButtonBlur($event)\">\n  @if (effectiveIcon() && getProperty('iconPosition') !== 'after') {<mat-icon [ngStyle]=\"iconStyles()\">{{ effectiveIcon() }}</mat-icon>}\n  {{ effectiveLabel() }}\n  @if (effectiveIcon() && getProperty('iconPosition') === 'after') {<mat-icon iconPositionEnd [ngStyle]=\"iconStyles()\">{{ effectiveIcon() }}</mat-icon>}\n</button>\n}\n@case ('mat-flat-button') {\n<button mat-flat-button [disabled]=\"isComponentDisabled()\" [color]=\"getProperty('color')\"\n  [disableRipple]=\"getProperty('disableRipple')\" [type]=\"getProperty('type')\"\n  [attr.aria-label]=\"getProperty('ariaLabel') || null\" [attr.aria-labelledby]=\"getProperty('ariaLabelledBy') || null\"\n  [class]=\"classes()\" [ngStyle]=\"combinedStyles()\"\n  [matTooltip]=\"effectiveTooltip()\" [matTooltipDisabled]=\"!effectiveTooltip()\"\n  (click)=\"onButtonPress($event)\" (mouseup)=\"onButtonRelease($event)\"\n  (mouseenter)=\"onButtonHover($event)\" (focus)=\"onButtonFocus($event)\" (blur)=\"onButtonBlur($event)\">\n  @if (effectiveIcon() && getProperty('iconPosition') !== 'after') {<mat-icon [ngStyle]=\"iconStyles()\">{{ effectiveIcon() }}</mat-icon>}\n  {{ effectiveLabel() }}\n  @if (effectiveIcon() && getProperty('iconPosition') === 'after') {<mat-icon iconPositionEnd [ngStyle]=\"iconStyles()\">{{ effectiveIcon() }}</mat-icon>}\n</button>\n}\n@case ('mat-stroked-button') {\n<button mat-stroked-button [disabled]=\"isComponentDisabled()\" [color]=\"getProperty('color')\"\n  [disableRipple]=\"getProperty('disableRipple')\" [type]=\"getProperty('type')\"\n  [attr.aria-label]=\"getProperty('ariaLabel') || null\" [attr.aria-labelledby]=\"getProperty('ariaLabelledBy') || null\"\n  [class]=\"classes()\" [ngStyle]=\"combinedStyles()\" eruCanvasEventHandler\n  [matTooltip]=\"effectiveTooltip()\" [matTooltipDisabled]=\"!effectiveTooltip()\"\n  (click)=\"onButtonPress($event)\" (mouseup)=\"onButtonRelease($event)\"\n  (mouseenter)=\"onButtonHover($event)\" (focus)=\"onButtonFocus($event)\" (blur)=\"onButtonBlur($event)\">\n  @if (effectiveIcon() && getProperty('iconPosition') !== 'after') {<mat-icon [ngStyle]=\"iconStyles()\">{{ effectiveIcon() }}</mat-icon>}\n  {{ effectiveLabel() }}\n  @if (effectiveIcon() && getProperty('iconPosition') === 'after') {<mat-icon iconPositionEnd [ngStyle]=\"iconStyles()\">{{ effectiveIcon() }}</mat-icon>}\n</button>\n}\n@case ('mat-icon-button') {\n<button mat-icon-button [disabled]=\"isComponentDisabled()\" [color]=\"getProperty('color')\"\n  [disableRipple]=\"getProperty('disableRipple')\" [type]=\"getProperty('type')\"\n  [attr.aria-label]=\"getProperty('ariaLabel') || null\" [attr.aria-labelledby]=\"getProperty('ariaLabelledBy') || null\"\n  [class]=\"classes()\" [ngStyle]=\"combinedStyles()\"\n  [matTooltip]=\"effectiveTooltip()\" [matTooltipDisabled]=\"!effectiveTooltip()\"\n  (click)=\"onButtonPress($event)\" (mouseup)=\"onButtonRelease($event)\"\n  (mouseenter)=\"onButtonHover($event)\" (focus)=\"onButtonFocus($event)\" (blur)=\"onButtonBlur($event)\">\n  <mat-icon [ngStyle]=\"iconStyles()\">{{ effectiveIcon() }}</mat-icon>\n</button>\n}\n@case ('mat-fab') {\n<button mat-fab [disabled]=\"isComponentDisabled()\" [color]=\"getProperty('color')\"\n  [disableRipple]=\"getProperty('disableRipple')\" [type]=\"getProperty('type')\"\n  [attr.aria-label]=\"getProperty('ariaLabel') || null\" [attr.aria-labelledby]=\"getProperty('ariaLabelledBy') || null\"\n  [class]=\"classes()\" [ngStyle]=\"combinedStyles()\"\n  [matTooltip]=\"effectiveTooltip()\" [matTooltipDisabled]=\"!effectiveTooltip()\"\n  (click)=\"onButtonPress($event)\" (mouseup)=\"onButtonRelease($event)\"\n  (mouseenter)=\"onButtonHover($event)\" (focus)=\"onButtonFocus($event)\" (blur)=\"onButtonBlur($event)\">\n  <mat-icon [ngStyle]=\"iconStyles()\">{{ effectiveIcon() }}</mat-icon>\n</button>\n}\n@case ('mat-mini-fab') {\n<button mat-mini-fab [disabled]=\"isComponentDisabled()\" [color]=\"getProperty('color')\"\n  [disableRipple]=\"getProperty('disableRipple')\" [type]=\"getProperty('type')\"\n  [attr.aria-label]=\"getProperty('ariaLabel') || null\" [attr.aria-labelledby]=\"getProperty('ariaLabelledBy') || null\"\n  [class]=\"classes()\" [ngStyle]=\"combinedStyles()\"\n  [matTooltip]=\"effectiveTooltip()\" [matTooltipDisabled]=\"!effectiveTooltip()\"\n  (click)=\"onButtonPress($event)\" (mouseup)=\"onButtonRelease($event)\"\n  (mouseenter)=\"onButtonHover($event)\" (focus)=\"onButtonFocus($event)\" (blur)=\"onButtonBlur($event)\">\n  <mat-icon [ngStyle]=\"iconStyles()\">{{ effectiveIcon() }}</mat-icon>\n</button>\n}\n}\n","import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-image',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, MatIconModule, MatTooltipModule, CanvasEventHandlerDirective],\n  templateUrl: './image.component.html',\n  styleUrl: './image.component.scss'\n})\nexport class ImageComponent extends BaseComponent {\n\n  private effectiveComponent = computed(() => {\n    const comp = this.component();\n    const selected = this.store.selectedComponent();\n    return (selected?.id === comp.id) ? selected! : comp;\n  });\n\n  private getEffectiveProp(key: string): any {\n    return this.effectiveComponent().properties?.base?.[key];\n  }\n\n  readonly src = computed(() => this.getEffectiveProp('src') || '');\n  readonly alt = computed(() => this.getEffectiveProp('alt') || '');\n  readonly objectFit = computed(() => this.getEffectiveProp('object_fit') || 'cover');\n  readonly objectPosition = computed(() => this.getEffectiveProp('object_position') || 'center');\n  readonly loading = computed(() => this.getEffectiveProp('loading') || 'lazy');\n  readonly fallbackIcon = computed(() => this.getEffectiveProp('fallback_icon') || 'broken_image');\n  readonly tooltip = computed(() => this.getEffectiveProp('tooltip') || '');\n\n  readonly hasError = signal(false);\n  private _prevSrc = '';\n\n  onImageError(): void {\n    this.hasError.set(true);\n  }\n\n  onImageLoad(): void {\n    this.hasError.set(false);\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'src',\n        type: 'select',\n        label: 'Image',\n        category: 'content',\n        default_value: '',\n        width: 'full',\n        responsive: false,\n        dynamic_options: 'ds_images'\n      },\n      {\n        key: 'alt',\n        type: 'text',\n        label: 'Alt Text',\n        category: 'content',\n        default_value: '',\n        responsive: false,\n        width: 'full'\n      },\n      {\n        key: 'tooltip',\n        type: 'text',\n        label: 'Tooltip',\n        category: 'content',\n        default_value: '',\n        responsive: false\n      },\n      {\n        key: 'object_fit',\n        type: 'select',\n        label: 'Object Fit',\n        category: 'layout',\n        default_value: 'cover',\n        responsive: true,\n        options: [\n          { label: 'Cover', value: 'cover' },\n          { label: 'Contain', value: 'contain' },\n          { label: 'Fill', value: 'fill' },\n          { label: 'Scale Down', value: 'scale-down' },\n          { label: 'None', value: 'none' }\n        ]\n      },\n      {\n        key: 'object_position',\n        type: 'select',\n        label: 'Object Position',\n        category: 'layout',\n        default_value: 'center',\n        responsive: true,\n        options: [\n          { label: 'Center', value: 'center' },\n          { label: 'Top', value: 'top' },\n          { label: 'Bottom', value: 'bottom' },\n          { label: 'Left', value: 'left' },\n          { label: 'Right', value: 'right' },\n          { label: 'Top Left', value: 'top left' },\n          { label: 'Top Right', value: 'top right' },\n          { label: 'Bottom Left', value: 'bottom left' },\n          { label: 'Bottom Right', value: 'bottom right' }\n        ]\n      },\n      {\n        key: 'loading',\n        type: 'select',\n        label: 'Loading',\n        category: 'behavior',\n        default_value: 'lazy',\n        responsive: false,\n        options: [\n          { label: 'Lazy', value: 'lazy' },\n          { label: 'Eager', value: 'eager' }\n        ]\n      },\n      {\n        key: 'fallback_icon',\n        type: 'text',\n        label: 'Fallback Icon',\n        category: 'behavior',\n        default_value: 'broken_image',\n        responsive: false\n      }\n    ];\n  }\n\n  protected override getComponentStyleSchema(): StyleSchema[] {\n    return [\n      {\n        key: 'width',\n        type: 'text',\n        label: 'Width',\n        category: 'layout',\n        default_value: '100%'\n      },\n      {\n        key: 'height',\n        type: 'text',\n        label: 'Height',\n        category: 'layout',\n        default_value: 'auto'\n      },\n      {\n        key: 'border_radius',\n        type: 'number',\n        label: 'Border Radius (px)',\n        category: 'style',\n        default_value: 0,\n        min: 0,\n        max: 200,\n        step: 1\n      },\n      {\n        key: 'opacity',\n        type: 'number',\n        label: 'Opacity',\n        category: 'style',\n        default_value: 1,\n        min: 0,\n        max: 1,\n        step: 0.05\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      src: '',\n      alt: '',\n      object_fit: 'cover',\n      object_position: 'center',\n      loading: 'lazy',\n      fallback_icon: 'broken_image',\n      tooltip: ''\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      width: '100%',\n      height: 'auto'\n    };\n  }\n}\n","<div class=\"image-wrapper\" [class]=\"classes()\" [ngStyle]=\"combinedStyles()\" [matTooltip]=\"tooltip()\" eruCanvasEventHandler>\n  @if (src() && !hasError()) {\n  <img\n    [src]=\"src()\"\n    [alt]=\"alt()\"\n    [loading]=\"loading()\"\n    [style.object-fit]=\"objectFit() !== 'none' ? objectFit() : null\"\n    [style.object-position]=\"objectPosition()\"\n    (error)=\"onImageError()\"\n    (load)=\"onImageLoad()\"\n  />\n  } @else if (!src()) {\n  <div class=\"image-placeholder\">\n    <mat-icon>image</mat-icon>\n    <span>No image selected</span>\n  </div>\n  } @else {\n  <div class=\"image-placeholder image-error\">\n    <mat-icon>{{ fallbackIcon() }}</mat-icon>\n    <span>Failed to load image</span>\n  </div>\n  }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, OnInit, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\ninterface ToggleOption {\n  label: string;\n  value: string;\n  icon?: string;\n}\n\n@Component({\n  selector: 'eru-button-toggle',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatButtonToggleModule, MatIconModule, MatTooltipModule],\n  templateUrl: './button-toggle.component.html',\n  styleUrl: './button-toggle.component.scss'\n})\nexport class ButtonToggleComponent extends BaseComponent implements OnInit {\n  // Options come from the `toggle_options` property (the single canonical key,\n  // edited in the property panel). Each entry may be `Label=value` or just\n  // `Label` (label used as value). Icons come from a parallel CSV\n  // `toggle_icons` matched positionally to the options.\n  readonly toggleOptions = computed<ToggleOption[]>(() => {\n    const raw = this.getProperty('toggle_options') || '';\n    if (!raw) return [];\n    const icons = String(this.getProperty('toggle_icons') || '')\n      .split(',')\n      .map((s: string) => s.trim());\n    return String(raw)\n      .split(',')\n      .map((entry: string) => entry.trim())\n      .filter((entry: string) => entry.length > 0)\n      .map((entry: string, i: number) => {\n        const icon = icons[i] || undefined;\n        const eq = entry.indexOf('=');\n        if (eq >= 0) {\n          return { label: entry.slice(0, eq).trim(), value: entry.slice(eq + 1).trim(), icon };\n        }\n        return { label: entry, value: entry, icon };\n      });\n  });\n\n  readonly displayMode = computed<'icon_label' | 'icon_only' | 'label_only'>(() => {\n    const mode = this.getProperty('display_mode');\n    return mode === 'icon_only' || mode === 'label_only' ? mode : 'icon_label';\n  });\n\n  /** Extra class on the group, so the stylesheet can square up the buttons. */\n  readonly groupClasses = computed<string>(() =>\n    this.classes() + (this.displayMode() === 'icon_only' ? ' eru-tg-icon-only' : ''));\n\n  showIcon(option: ToggleOption): boolean {\n    return !!option.icon && this.displayMode() !== 'label_only';\n  }\n\n  /**\n   * Icon-only hides the text but NOT an option that has no icon to show in its\n   * place — `toggle_icons` is matched positionally and a slot may be left empty,\n   * and a button rendering nothing at all is unpressable in practice. Such an\n   * option keeps its label so the group stays usable.\n   */\n  showLabel(option: ToggleOption): boolean {\n    if (this.displayMode() === 'icon_only') return !option.icon;\n    return true;\n  }\n\n  /**\n   * The label as a tooltip, for the mode that hides it. This is the only place\n   * an icon-only option says what it means, so it is not decoration: without it\n   * the option's meaning exists nowhere on screen.\n   */\n  tooltipFor(option: ToggleOption): string {\n    return this.displayMode() === 'icon_only' && option.icon ? option.label : '';\n  }\n\n  // The template binds `[aria-label]`, which is MatButtonToggle's own input, not\n  // `[attr.aria-label]` — the attribute form lands on the host element and never\n  // reaches the inner <button>, leaving an icon-only toggle with no accessible\n  // name at all once the text is gone.\n\n  // The default selected value(s). For multiple mode a comma-separated list is\n  // parsed into an array; for single mode the raw value is used.\n  readonly defaultSelection = computed<any>(() => {\n    const def = this.getProperty('default_selection');\n    if (def === undefined || def === null || def === '') return this.getProperty('multiple') ? [] : null;\n    if (this.getProperty('multiple')) {\n      return String(def).split(',').map((v: string) => v.trim()).filter((v: string) => v.length > 0);\n    }\n    return def;\n  });\n\n  // The value bound to the toggle group: stored field value, falling back to\n  // the configured default so a button is selected on load.\n  readonly currentValue = computed<any>(() => {\n    const stored = this.store.getPageFieldData(this.getProperty('name'));\n    if (stored !== undefined && stored !== null && !(Array.isArray(stored) && stored.length === 0)) {\n      return stored;\n    }\n    return this.defaultSelection();\n  });\n\n  /** Set once the user picks a button, after which the default is never re-seeded. */\n  private userHasChosen = false;\n\n  /** A click on the toggle — the user's choice replaces the default for good. */\n  onUserToggle(value: any): void {\n    this.userHasChosen = true;\n    this.onValueChange(value);\n  }\n\n  constructor() {\n    super();\n    // Seed the default selection into page data at runtime so the rest of the\n    // page (and any value-change actions) reflect the default on load.\n    //\n    // This waits for the page to exist rather than running in ngOnInit, which\n    // fired before the component's page was registered: the write landed in no\n    // page's data, and the value-change actions it triggers then evaluated\n    // against a field that read as empty. A toggle defaulting to 'Kanban' with\n    // `@btn_kl == 'Kanban' ? 'board' : 'table'` therefore resolved the 'table'\n    // branch and pinned the grid to table — while the toggle itself still\n    // displayed Kanban, because its own display falls back to the default.\n    effect(() => {\n      if (this.userHasChosen) return;\n      if (this.store.editMode()) return;\n      const pageId = this.component()?.pageId || this.store.currentPage()?.id;\n      if (!pageId) return;\n      const name = this.getProperty('name');\n      const def = this.defaultSelection();\n      const hasDefault = Array.isArray(def) ? def.length > 0 : (def !== undefined && def !== null && def !== '');\n      if (!name || !hasDefault) return;\n      // Read reactively: an early seed can be wiped when the page's own data\n      // load lands, and the write has to be repeated once it has. Seeding is\n      // gated on the value being empty rather than on a has-run flag, so a lost\n      // write is retried while a value that stuck is never overwritten — and\n      // once the value holds, this stops re-running because it is no longer\n      // empty. A user's own choice latches it off for good.\n      const stored = this.store.getPageFieldData(name, pageId);\n      const isEmpty = stored === undefined || stored === null || (Array.isArray(stored) && stored.length === 0) || stored === '';\n      if (!isEmpty) return;\n      untracked(() => {\n        // The lost seed already announced this value, and the duplicate guard\n        // would swallow the retry — leaving the actions that depend on it\n        // (a grid's view mode, here) still holding the value computed while the\n        // field read as empty.\n        this.resetValueAnnouncement();\n        this.onValueChange(def);\n      });\n    });\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'toggle_options',\n        type: 'text',\n        label: 'Options (comma-separated)',\n        category: 'content',\n        default_value: 'Option 1, Option 2, Option 3',\n        description: 'Enter options as \"Label=value,Label=value\" or just \"Label,Label\"',\n        width: 'full'\n      },\n      {\n        key: 'toggle_icons',\n        type: 'text',\n        label: 'Icons (comma-separated)',\n        category: 'content',\n        default_value: '',\n        description: 'Material icon names matched positionally to options, e.g. \"view_kanban,view_list\". Leave a slot empty to skip.',\n        width: 'full'\n      },\n      {\n        key: 'display_mode',\n        type: 'select',\n        label: 'Display',\n        category: 'content',\n        default_value: 'icon_label',\n        options: [\n          { value: 'icon_label', label: 'Icon and label' },\n          { value: 'icon_only', label: 'Icon only' },\n          { value: 'label_only', label: 'Label only' }\n        ],\n        description: 'Icon only hides the text but keeps each option\\'s value, so the payload and the selected state are unchanged. The label becomes the tooltip.'\n      },\n      {\n        key: 'icon_scale',\n        type: 'number',\n        label: 'Icon Scale',\n        category: 'content',\n        default_value: 1.2,\n        min: 0.5,\n        max: 3,\n        step: 0.1,\n        description: 'Icon size as a multiple of the text font size (1 = same as text). One value scales both together.'\n      },\n      {\n        key: 'selected_bg_color',\n        type: 'color',\n        label: 'Selected Background',\n        category: 'content',\n        default_value: '',\n        description: 'Background colour of the selected button. Pick a theme token or a custom colour. Leave blank for the default.'\n      },\n      {\n        key: 'selected_text_color',\n        type: 'color',\n        label: 'Selected Text/Icon',\n        category: 'content',\n        default_value: '',\n        description: 'Text and icon colour of the selected button. Pick a theme token or a custom colour. Leave blank for the default.'\n      },\n      {\n        key: 'multiple',\n        type: 'boolean',\n        label: 'Multiple Selection',\n        category: 'behavior',\n        default_value: false,\n        description: 'Allow multiple selections'\n      },\n      {\n        key: 'hide_selection_indicator',\n        type: 'boolean',\n        label: 'Hide Selection Indicator',\n        category: 'behavior',\n        default_value: false,\n        description: 'Hide the selection checkmark on selected toggles (applies to single or multiple mode based on Multiple Selection)'\n      },\n      {\n        key: 'default_selection',\n        type: 'text',\n        label: 'Default Selection',\n        category: 'behavior',\n        default_value: '',\n        description: 'Value selected by default (must match an option value; comma-separated for multiple)'\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      toggle_options: 'Option 1, Option 2, Option 3',\n      toggle_icons: '',\n      display_mode: 'icon_label',\n      icon_scale: 1.2,\n      selected_bg_color: '',\n      selected_text_color: '',\n      multiple: false,\n      hide_selection_indicator: false,\n      default_selection: ''\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}\n","<mat-button-toggle-group\n  [class]=\"groupClasses()\"\n  [ngStyle]=\"combinedStyles()\"\n  [style.--eru-tg-icon-scale]=\"getProperty('icon_scale') || 1.2\"\n  [style.--eru-tg-selected-bg]=\"getProperty('selected_bg_color') || null\"\n  [style.--eru-tg-selected-color]=\"getProperty('selected_text_color') || null\"\n  [multiple]=\"getProperty('multiple')\"\n  [hideSingleSelectionIndicator]=\"!getProperty('multiple') && getProperty('hide_selection_indicator')\"\n  [hideMultipleSelectionIndicator]=\"getProperty('multiple') && getProperty('hide_selection_indicator')\"\n  [disabled]=\"isComponentDisabled()\"\n  [value]=\"currentValue()\"\n  (change)=\"onUserToggle($event.value)\">\n  @for (option of toggleOptions(); track option.value) {\n    <mat-button-toggle\n      [value]=\"option.value\"\n      [matTooltip]=\"tooltipFor(option)\"\n      [aria-label]=\"option.label\">\n      @if (showIcon(option)) {\n        <mat-icon>{{ option.icon }}</mat-icon>\n      }\n      @if (showLabel(option)) {\n        {{ option.label }}\n      }\n    </mat-button-toggle>\n  }\n</mat-button-toggle-group>\n","import { ChangeDetectionStrategy, Component, computed} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatButtonModule } from '@angular/material/button';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-badge',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatBadgeModule, MatButtonModule],\n  templateUrl: './badge.component.html',\n  styleUrl: './badge.component.scss'\n})\nexport class BadgeComponent extends BaseComponent {\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'content',\n        type: 'text',\n        label: 'Content',\n        category: 'content',\n        default_value: 'Badge',\n        description: 'Text content for the badge',\n        width: 2\n      },\n      {\n        key: 'value_source',\n        label: 'Badge Value Source',\n        type: 'select',\n        category: 'content',\n        default_value: 'label',\n        options: [\n          { value: 'label', label: 'Static Text' },\n          { value: 'field', label: 'Page Data Field' },\n          { value: 'state', label: 'Page State' }\n        ]\n      },\n      {\n        key: 'badge_text',\n        type: 'text',\n        label: 'Badge Text',\n        category: 'content',\n        default_value: '5',\n        description: 'Text to display in the badge',\n        width: 2,\n        visible_if: { key: 'value_source', equals: 'label' }\n      },\n      {\n        key: 'state_key',\n        label: 'State Variable',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_page_state_vars',\n        visible_if: { key: 'value_source', equals: 'state' }\n      },\n      {\n        key: 'value_path',\n        label: 'Value Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        description: 'Dot/bracket path to extract from a JSON value (e.g. data.count or items[0].label). Leave empty to use the value as is.',\n        visible_if: { key: 'value_source', in: ['field', 'state'] }\n      },\n      {\n        key: 'badge_position',\n        type: 'select',\n        label: 'Badge Position',\n        category: 'layout',\n        default_value: 'above after',\n        options: [\n          { label: 'Above After', value: 'above after' },\n          { label: 'Above Before', value: 'above before' },\n          { label: 'Below After', value: 'below after' },\n          { label: 'Below Before', value: 'below before' },\n          { label: 'Before', value: 'before' },\n          { label: 'After', value: 'after' }\n        ]\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      content: 'Badge',\n      badge_text: '5',\n      badge_position: 'above after',\n      value_source: 'label'\n    };\n  }\n\n  private resolveByPath(value: any, path: string): any {\n    if (!path) return value;\n    let obj = value;\n    if (typeof obj === 'string') {\n      try { obj = JSON.parse(obj); } catch { return value; }\n    }\n    if (obj === null || typeof obj !== 'object') return value;\n    const segments = path.replace(/\\[(\\w+)\\]/g, '.$1').split('.').filter(Boolean);\n    let current = obj;\n    for (const segment of segments) {\n      if (current === null || current === undefined) return '';\n      current = current[segment];\n    }\n    return current ?? '';\n  }\n\n  readonly badgeValue = computed(() => {\n    const source = this.getProperty('value_source') || 'label';\n    const valuePath = this.getProperty('value_path') || '';\n\n    if (source === 'state' || source === 'derived') {\n      if (source === 'derived') {\n        const key = this.getProperty('derived_value_key');\n        if (key) return this.resolveByPath(this.store.derivedValues()[key] ?? '', valuePath);\n      }\n      const stateKey = this.getProperty('state_key') || this.getProperty('name');\n      if (!stateKey) return '';\n      const pageId = this.component()?.pageId;\n      const dataKey = this.dataKey();\n      const state = pageId ? this.store.getComputedPageStateFor(pageId, dataKey || undefined) : this.store.computedPageState();\n      return this.resolveByPath(state[stateKey] ?? '', valuePath);\n    }\n    if (source === 'field') {\n      return this.resolveByPath(this.storeValue() ?? '', valuePath);\n    }\n    const badgeText = this.getProperty('badge_text');\n    if (!badgeText && this.getProperty('name')) {\n      return this.storeValue() ?? '';\n    }\n    return badgeText;\n  });\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}\n","<mat-badge\n  [matBadge]=\"badgeValue()\"\n  [matBadgePosition]=\"getProperty('badge_position')\">\n  <!--\n    Visible content lives in <button mat-button>; mat-button binds its own\n    text/background via Material's MDC CSS variables, so a `color:` set on\n    the outer <mat-badge> doesn't propagate. Apply the user's combined\n    styles directly to the button so things like Text Color and Padding\n    are honored.\n  -->\n  <button mat-button\n    [class]=\"classes()\"\n    [ngStyle]=\"combinedStyles()\">{{ getProperty('content') }}</button>\n</mat-badge>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, effect, signal, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { parseValueList } from '../../utils/json.util';\n// Shared with eru-grid so a chip cannot paint a status value differently than\n// the grid cell for the same field does.\nimport { statusPillColors } from 'eru-grid';\n\n/** One rendered segment of a chip — a single key's value, never concatenated. */\ninterface ChipPart {\n  key: string;\n  value: string;\n}\n\ninterface ChipItem {\n  /** Emitted on click and held as the selection. */\n  value: string;\n  parts: ChipPart[];\n  /** Resolved colour, or null when nothing supplies one. */\n  color: string | null;\n}\n\ntype SelectionMode = 'none' | 'single' | 'multi';\n\n@Component({\n  selector: 'eru-chips',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatChipsModule],\n  templateUrl: './chips.component.html',\n  styleUrl: './chips.component.scss',\n  // Material's own chip internals have to be reached to make the style panel's\n  // font size apply at all — it pins `.mat-mdc-chip-action-label` to 14px, so an\n  // inherited size never gets past it. Same reason status and tag turn\n  // encapsulation off; every selector is namespaced under `.eru-chips-set`.\n  encapsulation: ViewEncapsulation.None\n})\nexport class ChipsComponent extends BaseComponent {\n  override componentEvents = [\n    { label: 'Chip Click', value: 'chipClick' }\n  ];\n\n  /**\n   * The list's raw value, by authoring mode:\n   *\n   *  - `static` — `chips`, a comma-separated string.\n   *  - `field`  — `storeValue()`, which honours RowDataContext inside a board card.\n   *  - `state`  — the named page state variable. Read here rather than through\n   *    `supportsValueSource()` because that routes a component's *edits* to\n   *    state; this list is a display whose selection goes somewhere else\n   *    entirely (`selection_state_key`), so binding both to one key would have\n   *    the selection overwrite the list it came from.\n   */\n  private readonly rawValue = computed<any>(() => {\n    const source = this.getProperty('value_source') || 'static';\n\n    if (source === 'field') return this.storeValue();\n\n    if (source === 'state') {\n      const stateKey = this.getProperty('state_key') || this.getProperty('name');\n      if (!stateKey) return null;\n      const pageId = this.component()?.pageId;\n      const dataKey = this.dataKey();\n      const state = pageId\n        ? this.store.getComputedPageStateFor(pageId, dataKey || undefined)\n        : this.store.computedPageState();\n      return state?.[stateKey];\n    }\n\n    return this.getProperty('chips');\n  });\n\n  /** Keys to render, in order. Empty means every key the object carries. */\n  private readonly displayKeys = computed<string[]>(() =>\n    String(this.getProperty('display_keys') ?? '')\n      .split(',')\n      .map(k => k.trim())\n      .filter(k => k.length > 0)\n  );\n\n  /**\n   * Label → colour from the data model, for `color_source: model_field`.\n   *\n   * `color_field` names the field whose options carry the palette; it falls back\n   * to this component's own bound field. A chip list is usually a summary of\n   * some other column — the Deals stage counts are not themselves a `ds` value —\n   * so the field being *coloured by* is rarely the field being *read*.\n   */\n  private readonly optionColors = computed<Map<string, string>>(() => {\n    if (this.getProperty('color_source') !== 'model_field') return new Map();\n    return this.modelOptionColors(this.getProperty('color_field') || undefined);\n  });\n\n  readonly chipList = computed<ChipItem[]>(() => {\n    const raw = this.rawValue();\n    if (raw === null || raw === undefined || raw === '') return [];\n\n    // parseValueList, not a comma split: a multi-value field arrives as the JSON\n    // string '[\"FIN-2\", \"FIN-3\"]' (or a Postgres '{FIN-2,FIN-3}') as often as it\n    // arrives as an array, and splitting those on commas made chips out of the\n    // brackets and quotes.\n    const items: any[] = parseValueList(raw);\n\n    return items\n      // A query that pads its result with a null, or a trailing comma in a\n      // static list, must not become an empty chip.\n      .filter(item => item !== null && item !== undefined && item !== '')\n      .map(item => this.toChipItem(item))\n      .filter((chip): chip is ChipItem => chip !== null);\n  });\n\n  private toChipItem(item: any): ChipItem | null {\n    const valueKey = String(this.getProperty('value_key') ?? '').trim();\n    const colorKey = String(this.getProperty('color_key') ?? '').trim();\n\n    let parts: ChipPart[];\n    let value: string;\n    let colorMatch: string;\n\n    if (typeof item === 'object') {\n      const keys = this.displayKeys().length > 0 ? this.displayKeys() : Object.keys(item);\n      parts = keys\n        .map(key => ({ key, value: this.formatPart(item[key]) }))\n        .filter(part => part.value.length > 0);\n      if (parts.length === 0) return null;\n      // The value emitted on click is the one the author nominated; the first\n      // rendered part is the fallback, since that is the chip's own identity.\n      value = valueKey && item[valueKey] !== undefined\n        ? String(item[valueKey])\n        : parts[0].value;\n      colorMatch = colorKey && item[colorKey] !== undefined ? String(item[colorKey]) : value;\n    } else {\n      value = String(item).trim();\n      if (value.length === 0) return null;\n      parts = [{ key: '', value }];\n      colorMatch = value;\n    }\n\n    return { value, parts, color: this.resolveColor(colorMatch) };\n  }\n\n  /** Numbers go through the shared numeric formatter so a count in a chip\n   *  groups its digits the same way the same number does anywhere else. */\n  private formatPart(value: any): string {\n    if (value === null || value === undefined) return '';\n    if (typeof value === 'number') return this.formatNumericValue(value);\n    return String(value).trim();\n  }\n\n  private resolveColor(match: string): string | null {\n    const source = this.getProperty('color_source') || 'none';\n    if (source === 'model_field') {\n      return this.optionColors().get(match) ?? null;\n    }\n    if (source === 'ranges') {\n      return this.matchColorRange(match)?.color ?? null;\n    }\n    return null;\n  }\n\n  readonly selectionMode = computed<SelectionMode>(() => {\n    const mode = this.getProperty('selection_mode');\n    return mode === 'single' || mode === 'multi' ? mode : 'none';\n  });\n\n  /** State variable the selection is written to and read back from. */\n  private readonly selectionKey = computed<string>(() =>\n    String(this.getProperty('selection_state_key') ?? '').trim()\n  );\n\n  /**\n   * Selection held by the component itself, for when no state variable is named.\n   *\n   * Without this, turning Selection on but leaving Selection State Variable\n   * empty produced a chip list that could be clicked and never highlighted —\n   * the click was written nowhere, so nothing could read it back.\n   */\n  private readonly localSelection = signal<string[]>([]);\n\n  /**\n   * Currently selected values.\n   *\n   * Read back out of the state variable rather than held locally whenever one is\n   * named, so the highlight reflects what the rest of the page is actually\n   * filtering on — including a selection cleared by some other control's\n   * `update-state`.\n   */\n  readonly selectedValues = computed<string[]>(() => {\n    if (this.selectionMode() === 'none') return [];\n    const key = this.selectionKey();\n    if (!key) return this.localSelection();\n    const pageId = this.component()?.pageId;\n    const dataKey = this.dataKey();\n    const state = pageId\n      ? this.store.getComputedPageStateFor(pageId, dataKey || undefined)\n      : this.store.computedPageState();\n    const current = state?.[key];\n    if (current === null || current === undefined || current === '') return [];\n    return Array.isArray(current) ? current.map(v => String(v)) : [String(current)];\n  });\n\n  isActive(chip: ChipItem): boolean {\n    return this.selectedValues().includes(chip.value);\n  }\n\n  /**\n   * Values that should start selected.\n   *\n   * A default, not a binding: it is read once to seed the selection and then\n   * never consulted again. Holding it live would re-assert itself after every\n   * click, and clearing the active chip is behaviour `nextSelection` goes out of\n   * its way to allow — a filter the user cannot switch off is a trap.\n   *\n   * Static lists nominate values directly. Field/state lists nominate the key\n   * carrying the flag, because the values are not known at authoring time.\n   * Either way the answer is a plain list of chip values, so the seeding path\n   * below does not care which mode produced it.\n   */\n  private readonly defaultSelection = computed<string[]>(() => {\n    if (this.selectionMode() === 'none') return [];\n    const source = this.getProperty('value_source') || 'static';\n\n    if (source === 'static') {\n      const raw = this.getProperty('default_selected');\n      const wanted = (Array.isArray(raw) ? raw : String(raw ?? '').split(','))\n        .map(v => String(v).trim())\n        .filter(v => v.length > 0);\n      if (wanted.length === 0) return [];\n      // Only values the list actually renders: a default left behind by an edit\n      // to the chips string would otherwise select a chip that is not there,\n      // and the highlight would be invisible while the filter was live.\n      const rendered = new Set(this.chipList().map(chip => chip.value));\n      return wanted.filter(value => rendered.has(value));\n    }\n\n    const flagKey = String(this.getProperty('selected_key') ?? '').trim();\n    if (!flagKey) return [];\n    const raw = this.rawValue();\n    if (!Array.isArray(raw)) return [];\n    const values: string[] = [];\n    for (const item of raw) {\n      if (!item || typeof item !== 'object') continue;\n      if (!this.isSelectedFlag(item[flagKey])) continue;\n      const chip = this.toChipItem(item);\n      if (chip) values.push(chip.value);\n    }\n    return values;\n  });\n\n  /** A flag from a query is as likely to arrive as 1 or 'true' as a boolean. */\n  private isSelectedFlag(value: any): boolean {\n    if (value === true) return true;\n    if (typeof value === 'number') return value === 1;\n    if (typeof value === 'string') {\n      const v = value.trim().toLowerCase();\n      return v === 'true' || v === '1' || v === 'y' || v === 'yes';\n    }\n    return false;\n  }\n\n  /** Seeded once per mount, so a cleared selection is never re-seeded. */\n  private readonly defaultSeeded = signal(false);\n\n  /**\n   * The default last applied, so an authoring edit re-seeds on the canvas.\n   * Only consulted in edit mode — at runtime the seed stays a one-shot.\n   */\n  private lastSeededDefaults: string | null = null;\n\n  constructor() {\n    super();\n\n    /**\n     * Answer the panel's request for this list's own values, so \"Selected by\n     * Default\" offers the chips the author typed rather than a free-text box.\n     *\n     * Served per component rather than through a shared bucket: the values are\n     * this component's `chips` property and nothing else's. (The grid publishes\n     * `ds_fields` globally as a convenience, which is how a chip list ends up\n     * offering an unrelated entity's fields.)\n     */\n    effect(() => {\n      const requests = this.store.dynamicDataRequests();\n      const componentId = this.component()?.id;\n      if (!componentId) return;\n      for (const request of requests.values()) {\n        if (request.componentId !== componentId) continue;\n        if (request.status !== 'pending') continue;\n        if (request.type !== 'ds_chip_values') continue;\n        const options = String(this.getProperty('chips') ?? '')\n          .split(',')\n          .map(value => value.trim())\n          .filter(value => value.length > 0)\n          .map(value => ({ label: value, value }));\n        untracked(() => this.store.setDynamicDataResponse(request, options));\n      }\n    });\n\n    /**\n     * Seed the default selection.\n     *\n     * Deferred to an effect rather than done at construction because the values\n     * a field/state list nominates arrive with the data, which is not loaded\n     * yet.\n     *\n     * Applied on the canvas as well as at runtime, so a default reads as\n     * configured without a trip through view mode — and re-applied there\n     * whenever the author changes it, since the point of showing it is to see\n     * the edit land. What the canvas must NOT do is alter the page: the write\n     * passes `declare: false`, which keeps the value in runtime state and off\n     * the page's declared `state` list. Actions stay silent either way —\n     * emitEvent already no-ops in edit mode.\n     *\n     * At runtime it remains a one-shot per mount: re-asserting the default\n     * would undo a click, and clearing the active chip is behaviour\n     * `nextSelection` goes out of its way to allow.\n     *\n     * The write goes through `writeSelection`, so it lands in\n     * `selection_state_key` whenever one is named. That matters more than the\n     * highlight — a default that paints the chip but leaves the state empty\n     * would show a filter the page is not actually applying.\n     */\n    effect(() => {\n      const editing = this.store.editMode();\n      if (this.selectionMode() === 'none') return;\n\n      const defaults = this.defaultSelection();\n      if (defaults.length === 0) return;\n      const signature = JSON.stringify(defaults);\n\n      if (editing) {\n        if (this.lastSeededDefaults === signature) return;\n      } else if (this.defaultSeeded()) {\n        return;\n      }\n\n      // A selection already in play wins — the state variable may have been set\n      // by another control, or restored with the page. Not on the canvas, where\n      // the value in play is usually the previous default and re-showing it\n      // would hide the author's edit.\n      const claimed = editing ? false : this.selectedValues().length > 0;\n\n      untracked(() => {\n        this.defaultSeeded.set(true);\n        this.lastSeededDefaults = signature;\n        if (claimed) return;\n\n        const single = this.selectionMode() === 'single';\n        const selected = single ? [defaults[0]] : defaults;\n        this.writeSelection(single ? defaults[0] : defaults, editing ? { declare: false } : undefined);\n\n        // One event carrying the whole initial selection, not one per chip.\n        // Off by default: a page whose load action already queries would\n        // otherwise fetch twice the moment it gains a default.\n        if (this.getProperty('emit_on_default')) {\n          this.emitEvent('chipClick', { value: '' }, undefined, {\n            context: { chip: this.chipContext(null, selected) }\n          });\n        }\n      });\n    });\n  }\n\n  /**\n   * Colours for a chip.\n   *\n   * The resting look is eru-grid's status cell exactly — `statusPillColors`\n   * lightens the fill 90% toward white, keeps the border saturated and darkens\n   * the text 30% — so a chip, a status badge and a grid cell painted from the\n   * same field are the same pill. Selecting a chip inverts it: the border colour\n   * becomes the fill, and the light fill becomes the text.\n   *\n   * The colours travel as custom properties because they cannot be inherited:\n   * Material's label element sets `color` on itself and sits between the host\n   * and our spans, so both an inherited `color` and the\n   * `--mdc-chip-label-text-color` token lose to it. A custom property passes\n   * through it untouched and the stylesheet spends it deeper down.\n   *\n   * With no colour resolved this returns nothing, so an uncoloured chip list\n   * keeps Material's default look.\n   */\n  chipStyles(chip: ChipItem): Record<string, string> {\n    if (!chip.color) return {};\n    const pill = statusPillColors(chip.color);\n    const selected = this.isActive(chip);\n\n    // Selected IS the pill eru-grid paints in board view — the light tint, the\n    // saturated border, the darkened text, unaltered. Filling it with the\n    // saturated colour instead read as a different component altogether.\n    //\n    // The off state is the same pill with its fill removed and its border faded,\n    // so the two differ by weight rather than by hue: the row stays one palette,\n    // and the selected member is the only one carrying a fill.\n    const background = selected ? pill.background : 'transparent';\n    const border = selected\n      ? pill.border\n      : `color-mix(in srgb, ${pill.border} 45%, transparent)`;\n\n    return {\n      'background-color': background,\n      'border-color': border,\n      '--mdc-chip-elevated-container-color': background,\n      // Material 3's own name for the same token — the one the current theme\n      // actually reads when it paints the chip's container.\n      '--mat-chip-elevated-container-color': background,\n      // Text is the darkened colour in both states — the value that makes a pale\n      // palette entry readable, and what the grid cell uses.\n      '--eru-chip-fg': pill.text,\n      // The count badge stays solid against both, so it reads as a count rather\n      // than as more label.\n      '--eru-chip-badge-bg': pill.text,\n      '--eru-chip-badge-fg': pill.background,\n      // Doubles the border weight on the selected chip without the 1px layout\n      // shift a thicker border would cause.\n      ...(selected ? { 'box-shadow': `inset 0 0 0 1px ${pill.border}` } : {})\n    };\n  }\n\n  onChipClick(chip: ChipItem): void {\n    if (this.store.editMode()) return;\n    if (this.isComponentDisabled()) return;\n\n    const mode = this.selectionMode();\n    // The new selection is computed once and used for both the write and the\n    // payload, rather than writing and then re-reading `selectedValues()` — the\n    // handler must see the selection the click produced, not whatever the state\n    // happens to hold by the time the event is assembled.\n    let selected: string[] = [];\n    if (mode !== 'none') {\n      const next = this.nextSelection(chip, mode);\n      this.writeSelection(next);\n      selected = next === null ? [] : (Array.isArray(next) ? next : [next]);\n    }\n\n    // Emitted regardless of selection mode, so a chip list can drive an action\n    // without owning any selection state. `context` namespaces the chip detail\n    // under one key, reachable as `payload.chip.value` from set-from-payload or\n    // a call-query — the same route a grid drill click takes.\n    this.emitEvent('chipClick', { value: chip.value }, undefined, {\n      context: { chip: this.chipContext(chip, selected) }\n    });\n  }\n\n  /**\n   * Clicking the active chip clears it, in both modes. A filter the user cannot\n   * switch off is a trap — this is the behaviour a segmented toggle cannot give,\n   * and the reason a filter belongs on chips rather than on one.\n   */\n  private nextSelection(chip: ChipItem, mode: SelectionMode): string | string[] | null {\n    const current = this.selectedValues();\n    if (mode === 'single') {\n      return current.includes(chip.value) ? null : chip.value;\n    }\n    return current.includes(chip.value)\n      ? current.filter(v => v !== chip.value)\n      : [...current, chip.value];\n  }\n\n  private writeSelection(value: string | string[] | null, options?: { declare?: boolean }): void {\n    const key = this.selectionKey();\n    if (!key) {\n      this.localSelection.set(this.toSelectionArray(value));\n      return;\n    }\n    this.store.setPageStateValue(key, value, this.component()?.pageId, this.dataKey() || undefined, options);\n  }\n\n  private toSelectionArray(value: string | string[] | null): string[] {\n    if (value === null) return [];\n    return Array.isArray(value) ? value : [value];\n  }\n\n  /**\n   * Whether a click on a chip does anything — which is what the pointer cursor\n   * promises. Selection is one reason; a wired Chip Click or Click subscription\n   * is the other, since a chip list can drive an action while owning no\n   * selection state of its own.\n   */\n  readonly isClickable = computed<boolean>(() => {\n    if (this.store.editMode()) return false;\n    if (this.selectionMode() !== 'none') return true;\n    const events = this.component()?.events || [];\n    return events.some(e => e.event === 'chipClick' || e.event === 'click');\n  });\n\n  /** The detail both chip events carry, so the two cannot describe a click differently. */\n  private chipContext(chip: ChipItem | null, selected: string[]): Record<string, any> {\n    return {\n      // Empty for the initial-selection emit, which no chip click produced.\n      value: chip?.value ?? '',\n      // Whether the chip the user just clicked ended up on or off. A click that\n      // clears the active chip is otherwise indistinguishable from one that\n      // sets it — both report the same `value`.\n      active: chip ? selected.includes(chip.value) : false,\n      // Every value active after this click, always an array — single mode\n      // included, so a handler never has to branch on the selection mode.\n      // This is the one to filter a query by.\n      selected,\n      parts: (chip?.parts ?? []).reduce<Record<string, string>>((acc, part) => {\n        if (part.key) acc[part.key] = part.value;\n        return acc;\n      }, {})\n    };\n  }\n\n  /**\n   * `Click` carries the clicked chip too.\n   *\n   * The base binds one DOM listener for `click` on the host and emits with the\n   * page-data payload, which has no idea a chip was involved — so an author who\n   * reached for the familiar `Click` in the panel (rather than `Chip Click`) got\n   * a subscription that fired with nothing to read, and a `set-from-payload` on\n   * `chip.value` resolved to nothing. Resolving the chip from the event target\n   * keeps that one listener and gives it the same context `chipClick` sends.\n   */\n  protected override getEventMap(): { [key: string]: (event: any) => void } {\n    return {\n      ...super.getEventMap(),\n      'click': (event: any) => {\n        const chip = this.chipFromEvent(event);\n        if (!chip) {\n          super.onClick(event);\n          return;\n        }\n        this.emitEvent('click', { value: chip.value }, undefined, {\n          context: { chip: this.chipContext(chip, this.selectedValues()) }\n        });\n      }\n    };\n  }\n\n  /** The chip a DOM event happened inside, or null for the gaps between them. */\n  private chipFromEvent(event: any): ChipItem | null {\n    const target = event?.target as HTMLElement | null;\n    const element = target?.closest?.('mat-chip');\n    if (!element) return null;\n    const rendered = Array.from(\n      this.elementRef.nativeElement.querySelectorAll('mat-chip')) as HTMLElement[];\n    const index = rendered.indexOf(element as HTMLElement);\n    return index >= 0 ? (this.chipList()[index] ?? null) : null;\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'value_source',\n        type: 'select',\n        label: 'Value Source',\n        category: 'content',\n        default_value: 'static',\n        options: [\n          { value: 'static', label: 'Static (comma-separated)' },\n          { value: 'field', label: 'Page Data Field' },\n          { value: 'state', label: 'Page State' }\n        ],\n        description: 'Static list, a field on the page / row, or a page state variable'\n      },\n      {\n        key: 'chips',\n        type: 'text',\n        label: 'Chips (comma-separated)',\n        category: 'content',\n        default_value: 'Chip 1, Chip 2, Chip 3',\n        description: 'Enter chips separated by commas',\n        width: 'full',\n        visible_if: { key: 'value_source', equals: 'static' }\n      },\n      {\n        key: 'state_key',\n        type: 'select',\n        label: 'State Variable',\n        category: 'content',\n        dynamic_options: 'ds_page_state_vars',\n        visible_if: { key: 'value_source', equals: 'state' },\n        description: 'Variable holding the list — an array of strings, or of objects'\n      },\n      {\n        key: 'display_keys',\n        type: 'text',\n        label: 'Display Keys',\n        category: 'content',\n        default_value: '',\n        width: 'full',\n        description: 'For a list of objects: keys to show, comma-separated, e.g. \"stage,cnt\". Each renders as its own segment — never concatenated. Leave empty to show every key.',\n        visible_if: { key: 'value_source', in: ['field', 'state'] }\n      },\n      {\n        key: 'value_key',\n        type: 'text',\n        label: 'Value Key',\n        category: 'content',\n        default_value: '',\n        description: 'Key whose value is emitted on click and held as the selection. Defaults to the first display key.',\n        visible_if: { key: 'value_source', in: ['field', 'state'] }\n      },\n      {\n        key: 'color_source',\n        type: 'select',\n        label: 'Colour Source',\n        category: 'content',\n        default_value: 'none',\n        options: [\n          { value: 'none', label: 'None' },\n          { value: 'model_field', label: 'Data Model Field' },\n          { value: 'ranges', label: 'Value Ranges' }\n        ],\n        description: 'Where each chip takes its colour from'\n      },\n      {\n        key: 'color_field',\n        type: 'select',\n        label: 'Colour From Field',\n        category: 'content',\n        dynamic_options: 'ds_fields',\n        description: 'Field whose data-model options supply the palette. Works for a tag, select or status field. Defaults to this component\\'s own field.',\n        visible_if: { key: 'color_source', equals: 'model_field' }\n      },\n      {\n        key: 'color_key',\n        type: 'text',\n        label: 'Colour Match Key',\n        category: 'content',\n        default_value: '',\n        description: 'Key matched against that field\\'s options to pick the colour. Must match the option exactly. Defaults to the value key.',\n        visible_if: { key: 'color_source', equals: 'model_field' }\n      },\n      {\n        key: 'color_ranges',\n        type: 'color_ranges',\n        label: 'Colour Ranges',\n        category: 'content',\n        default_value: [],\n        width: 'full',\n        description: 'Colour by numeric band instead of by label.',\n        visible_if: { key: 'color_source', equals: 'ranges' },\n        disable_if: { evaluate: (getValue) => this.hasModelColorRanges(getValue) }\n      },\n      {\n        key: 'selection_mode',\n        type: 'select',\n        label: 'Selection',\n        category: 'behavior',\n        default_value: 'none',\n        options: [\n          { value: 'none', label: 'None (display only)' },\n          { value: 'single', label: 'Single' },\n          { value: 'multi', label: 'Multiple' }\n        ],\n        description: 'Make chips selectable, e.g. as a filter. Clicking the active chip clears it.'\n      },\n      {\n        key: 'selection_state_key',\n        type: 'select',\n        label: 'Selection State Variable',\n        category: 'behavior',\n        dynamic_options: 'ds_page_state_vars',\n        description: 'Variable the selection is written to. Point a grid or query at it, then wire Chip Click to refresh.',\n        visible_if: { key: 'selection_mode', in: ['single', 'multi'] }\n      },\n      {\n        key: 'default_selected',\n        type: 'multiselect',\n        label: 'Selected by Default',\n        category: 'behavior',\n        dynamic_options: 'ds_chip_values',\n        default_value: [],\n        description: 'Chips that start selected. A starting point only — the user can clear them.',\n        visible_if: { key: 'value_source', equals: 'static' }\n      },\n      {\n        key: 'selected_key',\n        type: 'text',\n        label: 'Selected Flag Key',\n        category: 'behavior',\n        default_value: '',\n        description: 'Key on each item marking it selected to begin with (true, 1 or \\'yes\\'). Read once as a starting point, not kept in sync.',\n        visible_if: { key: 'value_source', in: ['field', 'state'] }\n      },\n      {\n        key: 'emit_on_default',\n        type: 'boolean',\n        label: 'Fire Chip Click for Default',\n        category: 'behavior',\n        default_value: false,\n        description: 'Emit one Chip Click for the starting selection, carrying every value at once. Leave off when the page already loads its own data.'\n      },\n      {\n        key: 'removable',\n        type: 'boolean',\n        label: 'Removable',\n        category: 'behavior',\n        default_value: false,\n        description: 'Allow chips to be removed'\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      value_source: 'static',\n      chips: 'Chip 1, Chip 2, Chip 3',\n      display_keys: '',\n      value_key: '',\n      color_source: 'none',\n      color_field: '',\n      color_key: '',\n      color_ranges: [],\n      selection_mode: 'none',\n      selection_state_key: '',\n      default_selected: [],\n      selected_key: '',\n      emit_on_default: false,\n      removable: false\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}\n","<mat-chip-set\n  [class]=\"'eru-chips-set ' + classes()\"\n  [ngStyle]=\"combinedStyles()\">\n  @for (chip of chipList(); track chip.value) {\n    <mat-chip\n      class=\"eru-chip\"\n      [class.eru-chip-clickable]=\"isClickable()\"\n      [class.eru-chip-active]=\"isActive(chip)\"\n      [ngStyle]=\"chipStyles(chip)\"\n      [removable]=\"getProperty('removable')\"\n      (click)=\"onChipClick(chip)\">\n      @for (part of chip.parts; track part.key; let first = $first) {\n        @if (first) {\n          <span class=\"eru-chip-label\">{{ part.value }}</span>\n        } @else {\n          <span class=\"eru-chip-badge\">{{ part.value }}</span>\n        }\n      }\n    </mat-chip>\n  }\n</mat-chip-set>\n","import { ChangeDetectionStrategy, Component, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-icon',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, MatIconModule, MatTooltipModule, CanvasEventHandlerDirective],\n  templateUrl: './icon.component.html',\n  styleUrl: './icon.component.scss'\n})\nexport class IconComponent extends BaseComponent {\n\n  readonly iconName = computed(() => {\n    const fallback = this.getProperty('icon_name') || 'star';\n    if ((this.getProperty('value_source') || 'static') !== 'state') return fallback;\n\n    const stateKey = this.getProperty('state_key') || this.getProperty('name');\n    if (!stateKey) return fallback;\n\n    const pageId = this.component()?.pageId;\n    const dataKey = this.dataKey();\n    const state = pageId\n      ? this.store.getComputedPageStateFor(pageId, dataKey || undefined)\n      : this.store.computedPageState();\n    const resolved = this.resolveByPath(state?.[stateKey] ?? '', this.getProperty('value_path') || '');\n    return resolved ? String(resolved) : fallback;\n  });\n\n  private resolveByPath(value: any, path: string): any {\n    if (!path) return value;\n    let obj = value;\n    if (typeof obj === 'string') {\n      try { obj = JSON.parse(obj); } catch { return value; }\n    }\n    if (obj === null || typeof obj !== 'object') return value;\n    const segments = path.replace(/\\[(\\w+)\\]/g, '.$1').split('.').filter(Boolean);\n    let current = obj;\n    for (const segment of segments) {\n      if (current === null || current === undefined) return '';\n      current = current[segment];\n    }\n    return current ?? '';\n  }\n  readonly iconSize = computed(() => this.getStylePropertyValue(this.component(), 'font_size', 24));\n  readonly fontSet = computed(() => this.getProperty('font_set') || '');\n  readonly iconColor = computed(() => this.getProperty('color') || '');\n  readonly inline = computed(() => !!this.getProperty('inline'));\n  readonly tooltip = computed(() => this.getProperty('tooltip') || '');\n  readonly ariaLabel = computed(() => this.getProperty('aria_label') || '');\n  readonly ariaHidden = computed(() => !!this.getProperty('aria_hidden'));\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'value_source',\n        type: 'select',\n        label: 'Icon Source',\n        category: 'content',\n        default_value: 'static',\n        responsive: false,\n        options: [\n          { label: 'Static Name', value: 'static' },\n          { label: 'Page State', value: 'state' }\n        ]\n      },\n      {\n        key: 'icon_name',\n        type: 'text',\n        label: 'Icon Name',\n        category: 'content',\n        default_value: 'star',\n        description: 'Material icon name. Used as the fallback when the state value is empty.',\n        width: 'full',\n        responsive: false\n      },\n      {\n        key: 'state_key',\n        type: 'select',\n        label: 'State Variable',\n        category: 'content',\n        dynamic_options: 'ds_page_state_vars',\n        responsive: false,\n        visible_if: { key: 'value_source', equals: 'state' }\n      },\n      {\n        key: 'value_path',\n        type: 'text',\n        label: 'Value Path',\n        category: 'content',\n        default_value: '',\n        description: 'Dot/bracket path into a JSON state value (e.g. icon or menu_item.icon). Leave empty to use the value as is.',\n        width: 'full',\n        responsive: false,\n        visible_if: { key: 'value_source', equals: 'state' }\n      },\n      {\n        key: 'font_set',\n        type: 'select',\n        label: 'Icon Style',\n        category: 'content',\n        default_value: '',\n        responsive: false,\n        options: [\n          { label: 'Filled (default)', value: '' },\n          { label: 'Outlined', value: 'material-icons-outlined' },\n          { label: 'Round', value: 'material-icons-round' },\n          { label: 'Sharp', value: 'material-icons-sharp' },\n          { label: 'Two-Tone', value: 'material-icons-two-tone' },\n          { label: 'Symbols Outlined', value: 'material-symbols-outlined' },\n          { label: 'Symbols Rounded', value: 'material-symbols-rounded' },\n          { label: 'Symbols Sharp', value: 'material-symbols-sharp' }\n        ]\n      },\n      {\n        key: 'color',\n        type: 'select',\n        label: 'Theme Color',\n        category: 'content',\n        default_value: '',\n        responsive: false,\n        options: [\n          { label: 'Inherit', value: '' },\n          { label: 'Primary', value: 'primary' },\n          { label: 'Accent', value: 'accent' },\n          { label: 'Warn', value: 'warn' }\n        ]\n      },\n      {\n        key: 'inline',\n        type: 'boolean',\n        label: 'Inline (scales with text)',\n        category: 'behavior',\n        default_value: false,\n        responsive: false\n      },\n      {\n        key: 'tooltip',\n        type: 'text',\n        label: 'Tooltip',\n        category: 'behavior',\n        default_value: '',\n        responsive: false\n      },\n      {\n        key: 'aria_label',\n        type: 'text',\n        label: 'Aria Label',\n        category: 'behavior',\n        default_value: '',\n        responsive: false\n      },\n      {\n        key: 'aria_hidden',\n        type: 'boolean',\n        label: 'Hide from Screen Readers',\n        category: 'behavior',\n        default_value: true,\n        responsive: false\n      }\n    ];\n  }\n\n  protected override getComponentStyleSchema(): StyleSchema[] {\n    return [\n      {\n        key: 'font_size',\n        type: 'number',\n        label: 'Size (px)',\n        category: 'style',\n        default_value: 24,\n        min: 12,\n        max: 128,\n        step: 2\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      value_source: 'static',\n      icon_name: 'star',\n      state_key: '',\n      value_path: '',\n      font_set: '',\n      color: '',\n      inline: false,\n      tooltip: '',\n      aria_label: '',\n      aria_hidden: true\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      font_size: 24\n    };\n  }\n}\n","<mat-icon\n  eruCanvasEventHandler\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  [fontSet]=\"fontSet()\"\n  [color]=\"iconColor()\"\n  [inline]=\"inline()\"\n  [attr.aria-label]=\"ariaHidden() ? null : (ariaLabel() || iconName())\"\n  [attr.aria-hidden]=\"ariaHidden() ? 'true' : null\"\n  [matTooltip]=\"tooltip()\"\n  [style.font-size.px]=\"iconSize()\"\n  [style.width.px]=\"iconSize()\"\n  [style.height.px]=\"iconSize()\"\n>{{ iconName() }}</mat-icon>\n","import { ChangeDetectionStrategy, Component, input, computed} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-progress-bar',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatProgressBarModule],\n  templateUrl: './progress-bar.component.html',\n  styleUrl: './progress-bar.component.scss'\n})\nexport class ProgressBarComponent extends BaseComponent {\n  private resolveByPath(value: any, path: string): any {\n    if (!path) return value;\n    let obj = value;\n    if (typeof obj === 'string') {\n      try { obj = JSON.parse(obj); } catch { return value; }\n    }\n    if (obj === null || typeof obj !== 'object') return value;\n    const segments = path.replace(/\\[(\\w+)\\]/g, '.$1').split('.').filter(Boolean);\n    let current = obj;\n    for (const segment of segments) {\n      if (current === null || current === undefined) return '';\n      current = current[segment];\n    }\n    return current ?? '';\n  }\n\n  // Resolved progress value from the configured source (static / field / state),\n  // mirroring the text component. Static falls back to the bound field value when\n  // no literal is set and a `name` is bound (preserves card/row behaviour).\n  readonly resolvedValue = computed(() => {\n    const source = this.getProperty('value_source') || 'static';\n    const valuePath = this.getProperty('value_path') || '';\n\n    if (source === 'state') {\n      const stateKey = this.getProperty('state_key') || this.getProperty('name');\n      if (!stateKey) return '';\n      const pageId = this.component()?.pageId;\n      const dataKey = this.dataKey();\n      const state = pageId ? this.store.getComputedPageStateFor(pageId, dataKey || undefined) : this.store.computedPageState();\n      return this.resolveByPath(state[stateKey] ?? '', valuePath);\n    }\n\n    if (source === 'field') {\n      return this.resolveByPath(this.storeValue() ?? '', valuePath);\n    }\n\n    const value = this.getProperty('value');\n    if ((value === undefined || value === null || value === '') && this.getProperty('name')) {\n      return this.storeValue() ?? '';\n    }\n    return value;\n  });\n\n  readonly progressValue = computed<number>(() => {\n    const v = this.resolvedValue();\n    const num = typeof v === 'number' ? v : parseFloat(String(v ?? ''));\n    return isFinite(num) ? num : 0;\n  });\n\n  // Bar colour from the configured value ranges (e.g. 0-20 green). Applies in\n  // every mode. Null when no range matches, so the bar keeps its theme colour.\n  readonly barColor = computed<string | null>(() => {\n    return this.matchColorRange(this.progressValue())?.color || null;\n  });\n\n  readonly trackColor = computed<string | null>(() => {\n    return this.matchColorRange(this.progressValue())?.background || null;\n  });\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'value_source',\n        label: 'Value Source',\n        type: 'select',\n        category: 'content',\n        default_value: 'static',\n        options: [\n          { value: 'static', label: 'Static' },\n          { value: 'field', label: 'Page Data Field' },\n          { value: 'state', label: 'Page State' }\n        ]\n      },\n      {\n        key: 'state_key',\n        label: 'State Variable',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_page_state_vars',\n        visible_if: { key: 'value_source', equals: 'state' }\n      },\n      {\n        key: 'value_path',\n        label: 'Value Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        description: 'Dot/bracket path to extract from a JSON value (e.g. data.progress). Leave empty to use the value as is.',\n        visible_if: { key: 'value_source', in: ['field', 'state'] }\n      },\n      {\n        key: 'value',\n        type: 'number',\n        label: 'Progress Value',\n        category: 'content',\n        default_value: 50,\n        min: 0,\n        max: 100,\n        step: 1,\n        description: 'Progress value (0-100)',\n        width: 2,\n        visible_if: { key: 'value_source', equals: 'static' }\n      },\n      {\n        key: 'mode',\n        type: 'select',\n        label: 'Mode',\n        category: 'layout',\n        default_value: 'determinate',\n        options: [\n          { label: 'Determinate', value: 'determinate' },\n          { label: 'Indeterminate', value: 'indeterminate' },\n          { label: 'Buffer', value: 'buffer' },\n          { label: 'Query', value: 'query' }\n        ],\n        width: 2\n      },\n      {\n        key: 'buffer_value',\n        type: 'number',\n        label: 'Buffer Value',\n        category: 'content',\n        default_value: 75,\n        min: 0,\n        max: 100,\n        step: 1,\n        description: 'Buffer value for buffer mode (0-100)',\n        width: 2\n      },\n      {\n        key: 'color_ranges',\n        type: 'color_ranges',\n        label: 'Colour ranges (by %)',\n        category: 'content',\n        default_value: [],\n        width: 'full',\n        min: 0,\n        max: 100,\n        description: 'Colour the bar when the value falls in a range \\u2014 Text is the filled bar, Fill is the track behind it. Leave a bound blank for an open-ended range. Rows are checked top-down and the first match wins, so order matters. Locked when the mapped data-model field already defines ranges.',\n        disable_if: { evaluate: (getValue) => this.hasModelColorRanges(getValue) }\n      }\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      value_source: 'static',\n      value: 50,\n      mode: 'determinate',\n      buffer_value: 75,\n      color_ranges: []\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}","<mat-progress-bar\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  [style.--mat-progress-bar-active-indicator-color]=\"barColor()\"\n  [style.--mat-progress-bar-track-color]=\"trackColor()\"\n  [value]=\"progressValue()\"\n  [mode]=\"getProperty('mode')\"\n  [bufferValue]=\"getProperty('buffer_value')\">\n</mat-progress-bar>","import { ChangeDetectionStrategy, Component, input, computed} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-progress-spinner',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatProgressSpinnerModule],\n  templateUrl: './progress-spinner.component.html',\n  styleUrl: './progress-spinner.component.scss'\n})\nexport class ProgressSpinnerComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'value',\n        type: 'number',\n        label: 'Progress Value',\n        category: 'content',\n        default_value: 50,\n        min: 0,\n        max: 100,\n        step: 1,\n        description: 'Progress value (0-100)',\n        width: 2\n      },\n      {\n        key: 'diameter',\n        type: 'number',\n        label: 'Diameter',\n        category: 'layout',\n        default_value: 40,\n        min: 20,\n        max: 200,\n        step: 5,\n        description: 'Diameter of the spinner in pixels',\n        width: 2\n      },\n      {\n        key: 'stroke_width',\n        type: 'number',\n        label: 'Stroke Width',\n        category: 'layout',\n        default_value: 4,\n        min: 1,\n        max: 20,\n        step: 1,\n        description: 'Width of the spinner stroke',\n        width: 2\n      }\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      value: 50,\n      diameter: 40,\n      stroke_width: 4\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}","<mat-spinner\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  [value]=\"store.getPageFieldData(getProperty('name'))\"\n  [diameter]=\"getProperty('diameter')\"\n  [strokeWidth]=\"getProperty('stroke_width')\">\n</mat-spinner>","import { ChangeDetectionStrategy, Component, computed, signal, OnDestroy, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-timer',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective],\n  templateUrl: './timer.component.html',\n  styleUrl: './timer.component.scss'\n})\nexport class TimerComponent extends BaseComponent implements OnDestroy {\n  private intervalId: any = null;\n  private _remaining = signal<number>(0);\n  private _running = signal<boolean>(false);\n  private _autoStarted = false;\n\n  readonly remaining = this._remaining.asReadonly();\n  readonly running = this._running.asReadonly();\n\n  private readonly _actionWatcher = effect(() => {\n    const actions = this.store.componentActions();\n    const id = this.component()?.id;\n    if (!id) return;\n    const pending = actions.get(id);\n    if (pending) {\n      this.store.consumeComponentAction(id);\n      if (pending.action === 'start') this.start();\n      else if (pending.action === 'stop') this.stop();\n    }\n  });\n\n  readonly displayTime = computed(() => {\n    const secs = this._remaining();\n    if (secs <= 0) return this._running() ? '0' : '';\n    const format = this.getProperty('display_format') || 'seconds';\n    if (format === 'mm:ss') {\n      const m = Math.floor(secs / 60);\n      const s = secs % 60;\n      return `${m}:${s.toString().padStart(2, '0')}`;\n    }\n    return String(secs);\n  });\n\n  override componentEvents = [\n    { label: 'Timeout', value: 'timeout' },\n    { label: 'Timer Start', value: 'timer_start' }\n  ];\n\n  start(): void {\n    if (this._running()) return;\n    const duration = this.getProperty('duration') || 300;\n    this._remaining.set(duration);\n    this._running.set(true);\n    this.emitEvent('timer_start');\n\n    this.intervalId = setInterval(() => {\n      const next = this._remaining() - 1;\n      this._remaining.set(next);\n      if (next <= 0) {\n        this.stop();\n        this.emitEvent('timeout');\n      }\n    }, 1000);\n  }\n\n  stop(): void {\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = null;\n    }\n    this._running.set(false);\n  }\n\n  override ngOnDestroy(): void {\n    this.stop();\n    super.ngOnDestroy();\n  }\n\n  private readonly _autoStartWatcher = effect(() => {\n    const editMode = this.store.editMode();\n    const component = this.component();\n    if (!component) return;\n    if (editMode) {\n      this._autoStarted = false;\n      return;\n    }\n    const visible = this.isComponentVisible() && !this.isHiddenByEvent();\n    if (!visible) {\n      this._autoStarted = false;\n      return;\n    }\n    if (!this._autoStarted && this.getProperty('auto_start')) {\n      this._autoStarted = true;\n      this.start();\n    }\n  });\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'duration',\n        label: 'Duration (seconds)',\n        type: 'number',\n        category: 'content',\n        default_value: 300,\n        min: 1,\n        max: 3600\n      },\n      {\n        key: 'display_format',\n        label: 'Display Format',\n        type: 'select',\n        category: 'content',\n        default_value: 'seconds',\n        options: [\n          { value: 'seconds', label: 'Seconds (295)' },\n          { value: 'mm:ss', label: 'Minutes (4:55)' }\n        ]\n      },\n      {\n        key: 'auto_start',\n        label: 'Auto Start',\n        type: 'boolean',\n        category: 'behavior',\n        default_value: false\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      duration: 300,\n      display_format: 'seconds',\n      auto_start: false\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      font_size: 14,\n      font_weight: '600',\n      color: '#e65100'\n    };\n  }\n}\n","<span\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  eruCanvasEventHandler>\n  {{ displayTime() }}\n</span>\n","import { ChangeDetectionStrategy, Component, input, inject, computed, signal, effect, OnInit, EnvironmentInjector, createEnvironmentInjector, Input } from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { EruComponent, PropertySchema, TailwindBreakpoint } from '../../models';\nimport { ComponentRegistryService, EruStudioStore } from '../../services';\nimport { BaseComponent } from '../base-component';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\n\n@Component({\n  selector: 'eru-flex-container',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, NgComponentOutlet, MatIconModule, CanvasEventHandlerDirective],\n  templateUrl: './flex-container.component.html',\n  styleUrl: './flex-container.component.scss'\n})\nexport class FlexContainerComponent extends BaseComponent {\n  private componentRegistry = inject(ComponentRegistryService);\n\n  /**\n   * Signal-backed input for nesting level.\n   * Using @Input with a setter to avoid InputSignal brand mismatch issues in library consumers.\n   */\n  readonly nestingLevel = signal<number>(0);\n\n  @Input('nestingLevel')\n  set nestingLevelSetter(value: number) {\n    this.nestingLevel.set(value || 0);\n  }\n  readonly selectedComponent = this.store.selectedComponent;\n  readonly componentsReady = signal(false);\n  private readonly parentEnv = inject(EnvironmentInjector);\n  readonly dynamicComponentInjector = createEnvironmentInjector(\n    [\n      { provide: EruStudioStore, useValue: this.store },\n      { provide: LogicEvaluatorService, useValue: this.logicEvaluator }\n    ],\n    this.parentEnv\n  );\n\n  protected isChildHovered = computed(() => {\n    const hoveredId = this.store.hoveredComponentId();\n    if (!hoveredId) return null;\n    const children = this.component().children;\n    if (!children) return null;\n    return children.find(c => c.id === hoveredId)?.id || null;\n  });\n\n  /**\n   * Whether `child` should be rendered at all (structural).\n   *\n   * The library's default visibility implementation toggles `display:none` on\n   * an already-mounted element, which means hidden components still mount\n   * their effects (e.g. an inactive board-view grid still fires entity-data\n   * fetches). When this method returns false in design-mode the canvas keeps\n   * showing it; outside design-mode (runtime) we skip rendering entirely so\n   * the component tree (and its data side-effects) is never instantiated.\n   */\n  isChildRendered(child: EruComponent): boolean {\n    if (this.store.editMode()) return true;\n    return this.checkVisibility(child);\n  }\n\n  constructor() {\n    super();\n    effect(() => {\n      const children = this.component()?.children;\n\n      if (!children || children.length === 0) {\n        this.componentsReady.set(true);\n        return;\n      }\n\n      const allLoaded = children.every((child: any) => this.getComponentClass(child.type));\n\n      if (allLoaded) {\n        this.componentsReady.set(true);\n      } else {\n        this.componentsReady.set(false);\n        Promise.all(\n          children.map((child: any) =>\n            this.componentRegistry.getComponentClassAsync(child.type)\n          )\n        ).then(() => {\n          this.componentsReady.set(true);\n        });\n      }\n    });\n  }\n\n  onDragOver(event: DragEvent) {\n    event.preventDefault();\n    event.dataTransfer!.dropEffect = 'move';\n\n    const target = event.target as HTMLElement;\n    const flexChild = target.closest('.flex-child');\n\n    if (flexChild) {\n      const childId = flexChild.getAttribute('data-component-id');\n      if (childId && this.store.dragState().is_dragging) {\n        this.store.setHoveredComponentId(childId);\n      }\n    }\n  }\n\n  selectComponent(event: MouseEvent, component: EruComponent) {\n    if (!this.store.editMode()) {\n      return;\n    }\n    event.stopPropagation();\n    this.store.setSelectedComponent(component);\n  }\n\n  onComponentDragStart(event: DragEvent, component: EruComponent) {\n    event.stopPropagation();\n    const dragData = {\n      type: 'move',\n      component_id: component.id\n    };\n    event.dataTransfer!.effectAllowed = 'move';\n    event.dataTransfer!.setData('application/json', JSON.stringify(dragData));\n    this.store.startDrag(component);\n  }\n\n  onComponentDragEnd(event: DragEvent) {\n    event.stopPropagation();\n    this.store.endDrag();\n  }\n\n  onComponentMouseEnter(event: MouseEvent, component: EruComponent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(component.id);\n  }\n\n  onComponentMouseLeave(event: MouseEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(null);\n  }\n  onCanvasMouseOver(event: MouseEvent, component: EruComponent) {\n    event.preventDefault();\n    event.stopPropagation();\n    // Check if mouse is over the canvas background area (not over child components)\n    const target = event.target as HTMLElement;\n    // Only set hover to root-container if we're over the canvas background, not over child components\n    if (target.getAttribute('data-component-id') === component.id) {\n      this.store.setHoveredComponentId(component.id);\n    }\n  }\n\n  isContainer(type: string): boolean {\n    return type === 'flex_container' || type === 'grid_container' || type === 'card' || type === 'attachment';\n  }\n\n  hasCustomComponent(type: string): boolean {\n    const definition = this.componentRegistry.getComponent(type);\n    return !!definition?.component;\n  }\n\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) {\n      return definition.component;\n    }\n    return this.componentRegistry['loadedComponents'].get(type);\n  }\n\n  getZIndex(level: number): number {\n    // Base z-index is 1, each nesting level adds 10\n    // This ensures nested components appear above their parents\n    return 1 + (level * 10);\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): any {\n    return {\n      layout_type: 'flex',\n      flex_direction: 'row',\n      justify_content: 'flex-start',\n      align_items: 'stretch',\n      align_content: 'stretch',\n      gap: 0,\n      row_gap: 0,\n      column_gap: 0,\n      flex_grow: 0,\n      flex_shrink: 1,\n      flex_basis: 'auto',\n      align_self: 'auto'\n    };\n  }\n\n  // Get computed flex styles for the container\n  getFlexStyles(): any {\n    const styles: any = {\n      display: 'flex',\n      flexDirection: this.getProperty('flex_direction') || 'row',\n      justifyContent: this.getProperty('justify_content') || 'flex-start',\n      alignItems: this.getProperty('align_items') || 'stretch',\n      alignContent: this.getProperty('align_content') || 'stretch'\n    };\n\n    const breakpoint = this.currentBreakpoint();\n    const userWrap = this.tailwindService.getPropertyValueForBreakpoint(\n      this.component().properties, 'flex_wrap', breakpoint, true\n    );\n    const direction = styles.flexDirection;\n    const isRow = direction === 'row' || direction === 'row-reverse';\n    if (userWrap !== undefined) {\n      styles.flexWrap = userWrap;\n    } else {\n      styles.flexWrap = isRow ? 'wrap' : 'nowrap';\n    }\n\n    const rawGap = this.tailwindService.getPropertyValueForBreakpoint(this.component().properties, 'gap', breakpoint, true);\n    const rawRowGap = this.tailwindService.getPropertyValueForBreakpoint(this.component().properties, 'row_gap', breakpoint, true);\n    const rawColumnGap = this.tailwindService.getPropertyValueForBreakpoint(this.component().properties, 'column_gap', breakpoint, true);\n\n    if (rawGap !== undefined && rawGap !== null) {\n      styles.gap = `${rawGap}px`;\n    }\n    if (rawRowGap !== undefined && rawRowGap !== null) {\n      styles.rowGap = `${rawRowGap}px`;\n    }\n    if (rawColumnGap !== undefined && rawColumnGap !== null) {\n      styles.columnGap = `${rawColumnGap}px`;\n    }\n\n    return styles;\n  }\n\n  // Get computed flex styles for children\n  getChildFlexStyles(child: EruComponent): any {\n    const styles: any = {};\n\n    // If the component is not visible, hide the wrapper div completely from layout\n    if (!this.checkVisibility(child)) {\n      styles.display = 'none';\n      return styles;\n    }\n\n    // Hiding a child at a breakpoint has to hide its wrapper too, or the row\n    // keeps the gap where the child used to be.\n    if (this.tailwindService.getPropertyValueForBreakpoint(\n      (child.styles?.responsive_styles ?? {}) as any, 'display', this.currentBreakpoint(), true) === 'none') {\n      styles.display = 'none';\n      return styles;\n    }\n\n    // Read child's own sizing/flex props from its responsive_styles so the wrapper can honor them\n    // (otherwise width:50% applied on the inner component is ignored because the wrapper has no width).\n    const breakpoint = this.currentBreakpoint();\n    const childStyles = (child.styles?.responsive_styles ?? {}) as any;\n    const pick = (key: string) =>\n      this.tailwindService.getPropertyValueForBreakpoint(childStyles, key, breakpoint, true);\n\n    const formatSize = (v: any) => {\n      if (v === undefined || v === null || v === '') return undefined;\n      if (typeof v === 'number') return `${v}px`;\n      return String(v);\n    };\n\n    const width = formatSize(pick('width'));\n    const height = formatSize(pick('height'));\n    const minWidth = formatSize(pick('min_width'));\n    const maxWidth = formatSize(pick('max_width'));\n    const minHeight = formatSize(pick('min_height'));\n    const maxHeight = formatSize(pick('max_height'));\n\n    // `flex-basis` sizes the MAIN axis, so translating a width into it is only\n    // correct while the container lays out in a row. In a column container the\n    // main axis is vertical, and the same translation turned a child's width\n    // into its height — a control given width: 130px came out 130px TALL, and a\n    // width of 100% grew to fill the column instead of the row.\n    const isRowAxis = !String(this.getProperty('flex_direction') || 'row').startsWith('column');\n\n    if (width !== undefined) {\n      // For width:100% (a panel that should fill the remainder of the row), use flex-grow: 1\n      // and don't pin width — otherwise the wrapper outgrows fixed-size siblings (340px sidebar)\n      // and the row wraps. For auto, leave the wrapper to default flex behaviour.\n      // For everything else (fixed px / sub-100% percentages), pin the wrapper to that width\n      // and freeze flex so segmented bars at 50%/33%/17% render side by side.\n      const isFull = /^\\s*100\\s*%\\s*$/.test(width);\n      const isAuto = /^\\s*auto\\s*$/.test(width);\n      if (isFull) {\n        if (isRowAxis) {\n          styles.flexGrow = 1;\n          styles.flexShrink = 1;\n          styles.flexBasis = '0%';\n          styles.minWidth = 0;\n        } else {\n          // Cross axis: filling the row is just a width.\n          styles.width = width;\n        }\n      } else if (!isAuto) {\n        styles.width = width;\n        if (isRowAxis) {\n          styles.flexBasis = width;\n          styles.flexGrow = 0;\n          styles.flexShrink = 0;\n        }\n      }\n    }\n    if (height !== undefined) styles.height = height;\n    if (minWidth !== undefined) styles.minWidth = minWidth;\n    if (maxWidth !== undefined) styles.maxWidth = maxWidth;\n    if (minHeight !== undefined) styles.minHeight = minHeight;\n    if (maxHeight !== undefined) styles.maxHeight = maxHeight;\n\n    // The container's own flex_grow/flex_shrink/flex_basis/align_self are the\n    // \"(Children)\" controls in its panel: a default for every child. They live on\n    // the container's properties while pick() reads the child's styles, so the\n    // two never met and setting Align Self (Children) did nothing at all. Only a\n    // value the author moved off the schema default counts, otherwise every child\n    // would inherit flex-grow: 0 and clobber the width handling above.\n    const containerDefault = (key: string, schemaDefault: any) => {\n      const value = this.getProperty(key);\n      if (value === undefined || value === null || value === '' || value === schemaDefault) return undefined;\n      return value;\n    };\n\n    // Allow per-child flex overrides if present, falling back to the container default\n    const childFlexGrow = pick('flex_grow') ?? containerDefault('flex_grow', 0);\n    const childFlexShrink = pick('flex_shrink') ?? containerDefault('flex_shrink', 1);\n    const childFlexBasis = pick('flex_basis') ?? containerDefault('flex_basis', 'auto');\n    const childAlignSelf = pick('align_self') ?? containerDefault('align_self', 'auto');\n    const childGridColumn = pick('grid_column');\n    const childGridRow = pick('grid_row');\n\n    if (childFlexGrow !== undefined && childFlexGrow !== null) styles.flexGrow = childFlexGrow;\n    if (childFlexShrink !== undefined && childFlexShrink !== null) styles.flexShrink = childFlexShrink;\n    if (childFlexBasis !== undefined && childFlexBasis !== null && childFlexBasis !== 'auto') styles.flexBasis = childFlexBasis;\n    if (childAlignSelf !== undefined && childAlignSelf !== null && childAlignSelf !== 'auto') styles.alignSelf = childAlignSelf;\n    if (childGridColumn !== undefined && childGridColumn !== null) styles.gridColumn = childGridColumn;\n    if (childGridRow !== undefined && childGridRow !== null) styles.gridRow = childGridRow;\n\n    // Last, so a custom style still bypasses everything above it.\n    Object.assign(styles, this.getCustomItemStyles(child));\n\n    return styles;\n  }\n\n  // Get combined styles (base styles + flex styles)\n  getCombinedFlexStyles(): any {\n    const baseStyles = this.combinedStyles();\n    const flexStyles = this.getFlexStyles();\n    const merged: any = {\n      ...baseStyles,\n      ...flexStyles\n    };\n\n    // Treat a fixed height as a minimum when content may grow beyond it:\n    // - wrapping row containers (wrapped rows would otherwise be clipped)\n    // - column containers (stacked children should not be clipped)\n    const direction = merged.flexDirection;\n    const isRow = direction === 'row' || direction === 'row-reverse';\n    const isColumn = direction === 'column' || direction === 'column-reverse';\n    const wrap = merged.flexWrap !== 'nowrap';\n    if (merged.height && merged.height !== 'auto' && ((isRow && wrap) || isColumn)) {\n      if (!merged.minHeight) {\n        merged.minHeight = merged.height;\n      }\n      delete merged.height;\n    }\n    return merged;\n  }\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'layout_type',\n        type: 'select',\n        label: 'Layout Type',\n        category: 'layout',\n        default_value: 'flex',\n        responsive: true,\n        options: [\n          { label: 'Flex', value: 'flex' },\n          { label: 'Grid', value: 'grid' }\n        ]\n      },\n      {\n        key: 'flex_direction',\n        type: 'select',\n        label: 'Flex Direction',\n        category: 'layout',\n        default_value: 'row',\n        responsive: true,\n        options: [\n          { label: 'Row', value: 'row' },\n          { label: 'Row Reverse', value: 'row-reverse' },\n          { label: 'Column', value: 'column' },\n          { label: 'Column Reverse', value: 'column-reverse' }\n        ],\n        width: 2\n      },\n      {\n        key: 'justify_content',\n        type: 'select',\n        label: 'Justify Content',\n        category: 'layout',\n        default_value: 'flex-start',\n        responsive: true,\n        options: [\n          { label: 'Flex Start', value: 'flex-start' },\n          { label: 'Flex End', value: 'flex-end' },\n          { label: 'Center', value: 'center' },\n          { label: 'Space Between', value: 'space-between' },\n          { label: 'Space Around', value: 'space-around' },\n          { label: 'Space Evenly', value: 'space-evenly' }\n        ],\n        width: 2\n      },\n      {\n        key: 'align_items',\n        type: 'select',\n        label: 'Align Items',\n        category: 'layout',\n        default_value: 'stretch',\n        responsive: true,\n        options: [\n          { label: 'Stretch', value: 'stretch' },\n          { label: 'Flex Start', value: 'flex-start' },\n          { label: 'Flex End', value: 'flex-end' },\n          { label: 'Center', value: 'center' },\n          { label: 'Baseline', value: 'baseline' }\n        ],\n        width: 2\n      },\n      {\n        key: 'flex_wrap',\n        type: 'select',\n        label: 'Flex Wrap',\n        category: 'layout',\n        default_value: 'nowrap',\n        responsive: true,\n        options: [\n          { label: 'No Wrap', value: 'nowrap' },\n          { label: 'Wrap', value: 'wrap' },\n          { label: 'Wrap Reverse', value: 'wrap-reverse' }\n        ],\n        width: 2\n      },\n      {\n        key: 'align_content',\n        type: 'select',\n        label: 'Align Content',\n        category: 'layout',\n        default_value: 'stretch',\n        responsive: true,\n        options: [\n          { label: 'Stretch', value: 'stretch' },\n          { label: 'Flex Start', value: 'flex-start' },\n          { label: 'Flex End', value: 'flex-end' },\n          { label: 'Center', value: 'center' },\n          { label: 'Space Between', value: 'space-between' },\n          { label: 'Space Around', value: 'space-around' }\n        ],\n        width: 2\n      },\n      {\n        key: 'gap',\n        type: 'number',\n        label: 'Gap',\n        category: 'layout',\n        default_value: 0,\n        responsive: true,\n        min: 0,\n        max: 100,\n        step: 1,\n        width: 2\n      },\n      {\n        key: 'row_gap',\n        type: 'number',\n        label: 'Row Gap',\n        category: 'layout',\n        default_value: 0,\n        responsive: true,\n        min: 0,\n        max: 100,\n        step: 1,\n        width: 2\n      },\n      {\n        key: 'column_gap',\n        type: 'number',\n        label: 'Column Gap',\n        category: 'layout',\n        default_value: 0,\n        responsive: true,\n        min: 0,\n        max: 100,\n        step: 1,\n        width: 2\n      },\n      {\n        key: 'flex_grow',\n        type: 'number',\n        label: 'Flex Grow (Children)',\n        category: 'behavior',\n        default_value: 0,\n        responsive: true,\n        min: 0,\n        max: 10,\n        step: 0.1,\n        description: 'A DEFAULT applied to every direct child of this container, not to this container itself. To make ONE pane take the leftover space while a sibling stays fixed, set that pane\\'s own Width style to 100% (or its own style flex_grow) - a value here applies to all children equally and cannot produce an uneven split.',\n        width: 2\n      },\n      {\n        key: 'flex_shrink',\n        type: 'number',\n        label: 'Flex Shrink (Children)',\n        category: 'behavior',\n        default_value: 1,\n        responsive: true,\n        min: 0,\n        max: 10,\n        step: 0.1,\n        description: 'A DEFAULT applied to every direct child of this container, not to this container itself. How far a child may shrink below its content size; 0 forbids shrinking, which is what lets a wide child push a sibling off the row.',\n        width: 2\n      },\n      {\n        key: 'flex_basis',\n        type: 'text',\n        label: 'Flex Basis (Children)',\n        category: 'behavior',\n        default_value: 'auto',\n        responsive: true,\n        description: 'A DEFAULT applied to every direct child of this container, not to this container itself (e.g. auto, 100px, 50%). It cannot make an uneven split, because every child gets the same value. A 35/65 two-pane split is built on the PANES: give the narrow pane a Width style of 35% and the wide one a Width of 100%, and leave this alone.',\n        width: 2\n      },\n      {\n        key: 'align_self',\n        type: 'select',\n        label: 'Align Self (Children)',\n        category: 'behavior',\n        default_value: 'auto',\n        responsive: true,\n        options: [\n          { label: 'Auto', value: 'auto' },\n          { label: 'Flex Start', value: 'flex-start' },\n          { label: 'Flex End', value: 'flex-end' },\n          { label: 'Center', value: 'center' },\n          { label: 'Baseline', value: 'baseline' },\n          { label: 'Stretch', value: 'stretch' }\n        ],\n        description: 'A DEFAULT applied to every direct child of this container, not to this container itself: overrides the container Align Items for its children. One child can override it with its own Align Self style.',\n        width: 2\n      }\n    ];\n  }\n}\n","<div class=\"flex-container-component flex\" eruCanvasEventHandler\n  [class]=\"classes() + ' flex-direction-' + (getProperty('flex_direction') || 'row')\"\n  [class.design-mode]=\"store.editMode()\"\n  [attr.data-container-id]=\"component().id\" [attr.data-component-id]=\"component().id\"\n  [attr.data-nesting-level]=\"nestingLevel()\" [style.z-index]=\"getZIndex(nestingLevel())\"\n  [ngStyle]=\"getCombinedFlexStyles()\" (dragover)=\"onDragOver($event)\">\n  @if (!component().children || component().children?.length === 0) {\n    @if (store.editMode()) {\n      <div class=\"container-empty-state\">\n        <mat-icon>view_column</mat-icon>\n        <span>Flex Container - Drop components here</span>\n      </div>\n    }\n  } @else if (componentsReady()) {\n  @if (isComponentLoading()) {\n  @for (child of component().children; track child.id) {\n  <div class=\"flex-child flex-ghost-child\" [ngStyle]=\"getChildFlexStyles(child)\">\n    <div class=\"flex-ghost-bar\"></div>\n  </div>\n  }\n  }\n  @for (child of component().children; track child.id) {\n  @if (isChildRendered(child)) {\n  <div class=\"flex-child\"\n    [class.no-children]=\"child.children?.length == 0\" [class.selected]=\"selectedComponent()?.id === child.id\"\n    [class.hovered-drop-target]=\"isChildHovered() === child.id\"\n    [attr.data-container-id]=\"isContainer(child.type) ? child.id : null\" [attr.data-component-id]=\"child.id\"\n    [attr.data-component-type]=\"child.type\"\n    [attr.data-nesting-level]=\"nestingLevel() + 1\" [style.z-index]=\"getZIndex(nestingLevel() + 1)\"\n    [ngStyle]=\"isComponentLoading() ? {display: 'none'} : getChildFlexStyles(child)\" draggable=\"true\" (mouseenter)=\"onComponentMouseEnter($event, child)\"\n    (mouseleave)=\"onComponentMouseLeave($event)\" (mouseover)=\"onCanvasMouseOver($event, child)\"\n    (dragstart)=\"onComponentDragStart($event, child)\" (dragend)=\"onComponentDragEnd($event)\"\n    (click)=\"selectComponent($event, child)\">\n    <ng-container\n      *ngComponentOutlet=\"getComponentClass(child.type);\n                              injector: dynamicComponentInjector;\n                              inputs: isContainer(child.type) ? {component: child, nestingLevel: nestingLevel() + 1} : {component: child}\" />\n  </div>\n  }\n  }\n  }\n</div>\n","import { ChangeDetectionStrategy, Component, input, inject, signal, effect, computed, EnvironmentInjector, createEnvironmentInjector, Input, DestroyRef } from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { EruComponent, PropertySchema, TailwindBreakpoint } from '../../models';\nimport { ComponentRegistryService, EruStudioStore } from '../../services';\nimport { BaseComponent } from '../base-component';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\n@Component({\n  selector: 'eru-grid-container',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, NgComponentOutlet, MatIconModule, CanvasEventHandlerDirective],\n  templateUrl: './grid-container.component.html',\n  styleUrl: './grid-container.component.scss'\n})\nexport class GridContainerComponent extends BaseComponent {\n  private componentRegistry = inject(ComponentRegistryService);\n  private destroyRef = inject(DestroyRef);\n\n  /**\n   * Signal-backed input for nesting level.\n   * Using @Input with a setter to avoid InputSignal brand mismatch issues in library consumers.\n   */\n  readonly nestingLevel = signal<number>(0);\n\n  @Input('nestingLevel')\n  set nestingLevelSetter(value: number) {\n    this.nestingLevel.set(value || 0);\n  }\n  readonly selectedComponent = this.store.selectedComponent;\n  readonly componentsReady = signal(false);\n  private readonly parentEnv = inject(EnvironmentInjector);\n  readonly dynamicComponentInjector = createEnvironmentInjector(\n    [\n      { provide: EruStudioStore, useValue: this.store },\n      { provide: LogicEvaluatorService, useValue: this.logicEvaluator }\n    ],\n    this.parentEnv\n  );\n\n  protected isChildHovered = computed(() => {\n    const hoveredId = this.store.hoveredComponentId();\n    if (!hoveredId) return null;\n    const children = this.component().children;\n    if (!children) return null;\n    return children.find(c => c.id === hoveredId)?.id || null;\n  });\n\n  // Own width in px, tracked only while collapse_below_width is set.\n  private readonly observedWidth = signal<number | null>(null);\n  private resizeObserver: ResizeObserver | null = null;\n\n  // The width below which the grid stacks into a single column, or null when\n  // the author has not asked for stacking. Resolved like every other property:\n  // the current breakpoint's value, else base.\n  readonly collapseBelowWidth = computed<number | null>(() => {\n    const raw = this.getProperty('collapse_below_width');\n    if (raw === undefined || raw === null || raw === '') return null;\n    const px = Number(raw);\n    return Number.isFinite(px) && px > 0 ? px : null;\n  });\n\n  // True when stacking is configured and the container is currently narrower.\n  readonly isCollapsed = computed(() => {\n    const threshold = this.collapseBelowWidth();\n    if (threshold === null) return false;\n    const width = this.observedWidth();\n    return width !== null && width < threshold;\n  });\n\n  constructor() {\n    super();\n    effect(() => {\n      const children = this.component()?.children;\n\n      if (!children || children.length === 0) {\n        this.componentsReady.set(true);\n        return;\n      }\n\n      const allLoaded = children.every((child: any) => this.getComponentClass(child.type));\n\n      if (allLoaded) {\n        this.componentsReady.set(true);\n      } else {\n        this.componentsReady.set(false);\n        Promise.all(\n          children.map((child: any) =>\n            this.componentRegistry.getComponentClassAsync(child.type)\n          )\n        ).then(() => {\n          this.componentsReady.set(true);\n        });\n      }\n    });\n\n    // Observe the host only while stacking is configured, so grids that never\n    // stack pay nothing for it.\n    effect(() => {\n      const wanted = this.collapseBelowWidth() !== null;\n      if (!wanted) {\n        this.teardownResizeObserver();\n        this.observedWidth.set(null);\n        return;\n      }\n      if (this.resizeObserver) return;\n      const host = this.elementRef.nativeElement as HTMLElement;\n      this.observedWidth.set(host.getBoundingClientRect().width);\n      this.resizeObserver = new ResizeObserver(entries => {\n        const width = entries[0]?.contentRect?.width;\n        if (typeof width === 'number') this.observedWidth.set(width);\n      });\n      this.resizeObserver.observe(host);\n    });\n\n    this.destroyRef.onDestroy(() => this.teardownResizeObserver());\n  }\n\n  private teardownResizeObserver(): void {\n    this.resizeObserver?.disconnect();\n    this.resizeObserver = null;\n  }\n\n  onDragOver(event: DragEvent) {\n    event.preventDefault();\n    event.dataTransfer!.dropEffect = 'move';\n\n    const target = event.target as HTMLElement;\n    const gridChild = target.closest('.grid-child');\n\n    if (gridChild) {\n      const childId = gridChild.getAttribute('data-component-id');\n      if (childId && this.store.dragState().is_dragging) {\n        this.store.setHoveredComponentId(childId);\n      }\n    }\n  }\n\n  selectComponent(event: MouseEvent, component: EruComponent) {\n    if (!this.store.editMode()) {\n      return;\n    }\n    event.stopPropagation();\n    this.store.setSelectedComponent(component);\n  }\n\n  onGridContainerClick(event: MouseEvent) {\n    if (!this.store.editMode()) {\n      return;\n    }\n    const target = event.target as HTMLElement;\n    const currentTarget = event.currentTarget as HTMLElement;\n\n    // Check if the click is on a child component\n    const clickedComponentElement = target.closest('[data-component-id]');\n\n    if (clickedComponentElement && clickedComponentElement !== currentTarget) {\n      // If clicking on a child, let the child handle it\n      const clickedNestingLevel = parseInt(clickedComponentElement.getAttribute('data-nesting-level') || '0');\n      const gridNestingLevel = this.nestingLevel();\n\n      if (clickedNestingLevel > gridNestingLevel) {\n        // Child component will handle the click\n        return;\n      }\n    }\n\n    // Only select the grid container if clicking directly on it (not on children)\n    if (target === currentTarget || (target.closest('.container-empty-state') && target.closest('.grid-container-component') === currentTarget)) {\n      event.stopPropagation();\n      this.store.setSelectedComponent(this.component());\n    }\n  }\n\n  onComponentDragStart(event: DragEvent, component: EruComponent) {\n    event.stopPropagation();\n    const dragData = {\n      type: 'move',\n      component_id: component.id\n    };\n    event.dataTransfer!.effectAllowed = 'move';\n    event.dataTransfer!.setData('application/json', JSON.stringify(dragData));\n    this.store.startDrag(component);\n  }\n\n  onComponentDragEnd(event: DragEvent) {\n    event.stopPropagation();\n    this.store.endDrag();\n  }\n\n  onComponentMouseEnter(event: MouseEvent, component: EruComponent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(component.id);\n  }\n\n  onComponentMouseLeave(event: MouseEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(null);\n  }\n\n  onCanvasMouseOver(event: MouseEvent, component: EruComponent) {\n    event.preventDefault();\n    event.stopPropagation();\n    // Check if mouse is over the canvas background area (not over child components)\n    const target = event.target as HTMLElement;\n    // Only set hover to root-container if we're over the canvas background, not over child components\n    if (target.getAttribute('data-component-id') === component.id) {\n      this.store.setHoveredComponentId(component.id);\n    }\n  }\n  isContainer(type: string): boolean {\n    return type === 'flex_container' || type === 'grid_container' || type === 'card' || type === 'attachment';\n  }\n\n  hasCustomComponent(type: string): boolean {\n    const definition = this.componentRegistry.getComponent(type);\n    return !!definition?.component;\n  }\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) {\n      return definition.component;\n    }\n    return this.componentRegistry['loadedComponents'].get(type);\n  }\n\n  getZIndex(level: number): number {\n    // Base z-index is 1, each nesting level adds 10\n    // This ensures nested components appear above their parents\n    return 1 + (level * 10);\n  }\n\n  /* onDrop(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const dragData = event.dataTransfer!.getData('application/json');\n    if (!dragData) return;\n\n    try {\n      const data = JSON.parse(dragData);\n      if (data.type === 'component') {\n        // Handle component drop directly into this grid container\n        this.createComponentInGridContainer(data.component_type);\n      } else if (data.type === 'move' && data.component_id) {\n        // Handle component move - delegate to parent canvas\n        const canvasElement = document.querySelector('eru-canvas');\n        if (canvasElement) {\n          const canvasComponent = (canvasElement as any).__ngContext__?.[0];\n          if (canvasComponent && canvasComponent.moveComponentBeforeTarget) {\n            canvasComponent.moveComponentBeforeTarget(data.component_id);\n          }\n        }\n      }\n    } catch (error) {\n      console.error('Error parsing drag data:', error);\n    }\n\n    this.store.endDrag();\n  } */\n\n  /* private createComponentInGridContainer(componentType: string) {\n    const componentDef = this.componentRegistry.getComponent(componentType);\n    if (!componentDef) {\n      console.error('Component definition not found:', componentType);\n      return;\n    }\n\n    const component: EruComponent = {\n      id: this.generateId(),\n      type: componentType,\n      properties: {\n        base: {\n          name: '',\n          label: '',\n          identifier: false,\n          events: []\n        }\n      },\n      styles: {\n        classes: '',\n        responsive_classes: {},\n        responsive_styles: {},\n        custom: {}\n      },\n      children: componentDef.allow_children ? [] : undefined,\n      created_at: new Date().toISOString(),\n      updated_at: new Date().toISOString()\n    };\n\n    // Add component to this grid container\n    this.store.addComponentToContainer(this.component().id, component);\n    this.store.setSelectedComponent(component);\n  } */\n\n  /*  private generateId(): string {\n     return '#' + Math.random().toString(36).substr(2, 9);\n   } */\n\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): any {\n    return {\n      layout_type: 'grid',\n      grid_template_columns: 'repeat(auto-fit, minmax(250px, 1fr))',\n      collapse_below_width: '',\n      grid_template_rows: 'auto',\n      grid_template_areas: '',\n      gap: 0,\n      row_gap: 0,\n      column_gap: 0,\n      justify_items: 'stretch',\n      align_items: 'stretch',\n      justify_content: 'start',\n      align_content: 'start',\n      grid_auto_flow: 'row',\n      grid_auto_columns: 'auto',\n      grid_auto_rows: 'auto',\n      grid_column: 'auto',\n      grid_row: 'auto',\n      grid_area: 'auto',\n      justify_self: 'auto',\n      align_self: 'auto'\n    };\n  }\n\n  // Get computed grid styles for the container\n  getGridStyles(): any {\n    const styles: any = {\n      display: 'grid',\n      gridTemplateColumns: this.isCollapsed()\n        ? '1fr'\n        : this.getProperty('grid_template_columns') || 'repeat(auto-fit, minmax(250px, 1fr))',\n      gridTemplateRows: this.getProperty('grid_template_rows') || 'auto',\n      justifyItems: this.getProperty('justify_items') || 'stretch',\n      alignItems: this.getProperty('align_items') || 'stretch',\n      justifyContent: this.getProperty('justify_content') || 'start',\n      alignContent: this.getProperty('align_content') || 'start',\n      gridAutoFlow: this.getProperty('grid_auto_flow') || 'row',\n      gridAutoColumns: this.getProperty('grid_auto_columns') || 'auto',\n      gridAutoRows: this.getProperty('grid_auto_rows') || 'auto'\n    };\n\n    // Add grid template areas if specified\n    const gridTemplateAreas = this.getProperty('grid_template_areas');\n    if (gridTemplateAreas && gridTemplateAreas.trim()) {\n      styles.gridTemplateAreas = gridTemplateAreas;\n    }\n\n    // Add gap properties\n    const breakpoint = this.currentBreakpoint();\n    const rawGap = this.tailwindService.getPropertyValueForBreakpoint(this.component().properties, 'gap', breakpoint, true);\n    const rawRowGap = this.tailwindService.getPropertyValueForBreakpoint(this.component().properties, 'row_gap', breakpoint, true);\n    const rawColumnGap = this.tailwindService.getPropertyValueForBreakpoint(this.component().properties, 'column_gap', breakpoint, true);\n\n    if (rawGap !== undefined && rawGap !== null) {\n      styles.gap = `${rawGap}px`;\n    }\n    if (rawRowGap !== undefined && rawRowGap !== null) {\n      styles.rowGap = `${rawRowGap}px`;\n    }\n    if (rawColumnGap !== undefined && rawColumnGap !== null) {\n      styles.columnGap = `${rawColumnGap}px`;\n    }\n\n    return styles;\n  }\n\n  // Get computed grid styles for children — reads from each child's own styles so per-child\n  // grid_column / grid_row / width / height overrides actually take effect.\n  getChildGridStyles(child: EruComponent): any {\n    const styles: any = {};\n\n    // If the component is not visible, hide the wrapper div completely from layout\n    if (!this.checkVisibility(child)) {\n      styles.display = 'none';\n      return styles;\n    }\n\n    const breakpoint = this.currentBreakpoint();\n    const childStyles = (child.styles?.responsive_styles ?? {}) as any;\n    const pick = (key: string) =>\n      this.tailwindService.getPropertyValueForBreakpoint(childStyles, key, breakpoint, true);\n\n    // A child hidden at this breakpoint must take the wrapper with it. Without\n    // this, display:none reaches the component and the wrapper keeps its grid\n    // cell: the element disappears and the empty slot it sat in does not.\n    if (pick('display') === 'none') {\n      styles.display = 'none';\n      return styles;\n    }\n\n    const formatSize = (v: any) => {\n      if (v === undefined || v === null || v === '') return undefined;\n      if (typeof v === 'number') return `${v}px`;\n      return String(v);\n    };\n\n    // These five are the \"(Children)\" controls in the container's panel: a\n    // default for every child. They are stored on the container's properties\n    // while pick() reads the child's styles, so on their own they never applied\n    // — the same dead wiring the flex container had. Only a value the author\n    // moved off the schema default counts, so an untouched 'auto' stays inert.\n    const containerDefault = (key: string) => {\n      const value = this.getProperty(key);\n      if (value === undefined || value === null || value === '' || value === 'auto') return undefined;\n      return value;\n    };\n\n    const gridColumn = pick('grid_column') ?? containerDefault('grid_column');\n    const gridRow = pick('grid_row') ?? containerDefault('grid_row');\n    const gridArea = pick('grid_area') ?? containerDefault('grid_area');\n    const justifySelf = pick('justify_self') ?? containerDefault('justify_self');\n    const alignSelf = pick('align_self') ?? containerDefault('align_self');\n    const width = formatSize(pick('width'));\n    const height = formatSize(pick('height'));\n    const minWidth = formatSize(pick('min_width'));\n    const maxWidth = formatSize(pick('max_width'));\n    const minHeight = formatSize(pick('min_height'));\n    const maxHeight = formatSize(pick('max_height'));\n\n    if (gridColumn !== undefined && gridColumn !== null && gridColumn !== 'auto') styles.gridColumn = gridColumn;\n    if (gridRow !== undefined && gridRow !== null && gridRow !== 'auto') styles.gridRow = gridRow;\n    if (gridArea !== undefined && gridArea !== null && gridArea !== 'auto') styles.gridArea = gridArea;\n    if (justifySelf !== undefined && justifySelf !== null && justifySelf !== 'auto') styles.justifySelf = justifySelf;\n    if (alignSelf !== undefined && alignSelf !== null && alignSelf !== 'auto') styles.alignSelf = alignSelf;\n    if (width !== undefined) styles.width = width;\n    if (height !== undefined) styles.height = height;\n    if (minWidth !== undefined) styles.minWidth = minWidth;\n    if (maxWidth !== undefined) styles.maxWidth = maxWidth;\n    if (minHeight !== undefined) styles.minHeight = minHeight;\n    if (maxHeight !== undefined) styles.maxHeight = maxHeight;\n\n    // Last, so a custom style still bypasses everything above it.\n    Object.assign(styles, this.getCustomItemStyles(child));\n\n    return styles;\n  }\n\n  readonly combinedGridStyles = computed(() => {\n    return { ...this.combinedStyles(), ...this.getGridStyles() };\n  });\n\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'layout_type',\n        type: 'select',\n        label: 'Layout Type',\n        category: 'layout',\n        default_value: 'grid',\n        responsive: true,\n        options: [\n          { label: 'Flex', value: 'flex' },\n          { label: 'Grid', value: 'grid' }\n        ],\n        description: 'Switches this container between Grid and Flex. Grid lays children into the configured columns; Flex sizes them by their content and wraps, which is what leaves spare width for Justify Content to distribute.',\n        width: 'full'\n      },\n      {\n        key: 'grid_template_columns',\n        type: 'text',\n        label: 'Grid Template Columns',\n        category: 'layout',\n        default_value: 'repeat(auto-fit, minmax(250px, 1fr))',\n        responsive: true,\n        description: 'Define the size of grid columns (e.g., 1fr 2fr, repeat(3, 1fr), 200px auto)',\n        width: 'full'\n      },\n      {\n        key: 'collapse_below_width',\n        type: 'number',\n        label: 'Collapse Below Width (px)',\n        category: 'layout',\n        default_value: '',\n        responsive: true,\n        min: 0,\n        max: 2000,\n        step: 10,\n        description: 'Stack into a single column when the container is narrower than this. Leave empty to always keep the configured columns',\n        width: 'full'\n      },\n      {\n        key: 'grid_template_rows',\n        type: 'text',\n        label: 'Grid Template Rows',\n        category: 'layout',\n        default_value: 'auto',\n        responsive: true,\n        description: 'Define the size of grid rows (e.g., auto 1fr, repeat(2, 100px))',\n        width: 'full'\n      },\n      {\n        key: 'grid_template_areas',\n        type: 'text',\n        label: 'Grid Template Areas',\n        category: 'layout',\n        default_value: '',\n        responsive: true,\n        description: 'Define named grid areas (e.g., \\\"header header\\\" \\\"sidebar main\\\")',\n        width: 'full'\n      },\n      {\n        key: 'gap',\n        type: 'number',\n        label: 'Gap',\n        category: 'layout',\n        default_value: 0,\n        responsive: true,\n        min: 0,\n        max: 100,\n        step: 1,\n        width: 2\n      },\n      {\n        key: 'row_gap',\n        type: 'number',\n        label: 'Row Gap',\n        category: 'layout',\n        default_value: 0,\n        responsive: true,\n        min: 0,\n        max: 100,\n        step: 1,\n        width: 2\n      },\n      {\n        key: 'column_gap',\n        type: 'number',\n        label: 'Column Gap',\n        category: 'layout',\n        default_value: 0,\n        responsive: true,\n        min: 0,\n        max: 100,\n        step: 1,\n        width: 2\n      },\n      {\n        key: 'justify_items',\n        type: 'select',\n        label: 'Justify Items',\n        category: 'layout',\n        default_value: 'stretch',\n        responsive: true,\n        options: [\n          { label: 'Start', value: 'start' },\n          { label: 'End', value: 'end' },\n          { label: 'Center', value: 'center' },\n          { label: 'Stretch', value: 'stretch' }\n        ],\n        width: 2\n      },\n      {\n        key: 'align_items',\n        type: 'select',\n        label: 'Align Items',\n        category: 'layout',\n        default_value: 'stretch',\n        responsive: true,\n        options: [\n          { label: 'Start', value: 'start' },\n          { label: 'End', value: 'end' },\n          { label: 'Center', value: 'center' },\n          { label: 'Stretch', value: 'stretch' }\n        ],\n        width: 2\n      },\n      {\n        key: 'justify_content',\n        type: 'select',\n        label: 'Justify Content',\n        category: 'layout',\n        default_value: 'start',\n        responsive: true,\n        description: 'Distributes spare horizontal space between the columns. There is none to distribute while every column is sized in fr, since fr tracks absorb it — use Gap or container padding for spacing, or content-sized tracks such as repeat(2, max-content) to give this something to work with.',\n        options: [\n          { label: 'Start', value: 'start' },\n          { label: 'End', value: 'end' },\n          { label: 'Center', value: 'center' },\n          { label: 'Stretch', value: 'stretch' },\n          { label: 'Space Around', value: 'space-around' },\n          { label: 'Space Between', value: 'space-between' },\n          { label: 'Space Evenly', value: 'space-evenly' }\n        ],\n        width: 2\n      },\n      {\n        key: 'align_content',\n        type: 'select',\n        label: 'Align Content',\n        category: 'layout',\n        default_value: 'start',\n        responsive: true,\n        description: 'Distributes spare vertical space. A container whose height is its content has none — set a Height style first.',\n        options: [\n          { label: 'Start', value: 'start' },\n          { label: 'End', value: 'end' },\n          { label: 'Center', value: 'center' },\n          { label: 'Stretch', value: 'stretch' },\n          { label: 'Space Around', value: 'space-around' },\n          { label: 'Space Between', value: 'space-between' },\n          { label: 'Space Evenly', value: 'space-evenly' }\n        ],\n        width: 2\n      },\n      {\n        key: 'grid_auto_flow',\n        type: 'select',\n        label: 'Grid Auto Flow',\n        category: 'layout',\n        default_value: 'row',\n        responsive: true,\n        options: [\n          { label: 'Row', value: 'row' },\n          { label: 'Column', value: 'column' },\n          { label: 'Row Dense', value: 'row dense' },\n          { label: 'Column Dense', value: 'column dense' }\n        ],\n        width: 2\n      },\n      {\n        key: 'grid_auto_columns',\n        type: 'text',\n        label: 'Grid Auto Columns',\n        category: 'layout',\n        default_value: 'auto',\n        responsive: true,\n        description: 'Size of implicit columns (e.g., auto, 100px, 1fr)',\n        width: 2\n      },\n      {\n        key: 'grid_auto_rows',\n        type: 'text',\n        label: 'Grid Auto Rows',\n        category: 'layout',\n        default_value: 'auto',\n        responsive: true,\n        description: 'Size of implicit rows (e.g., auto, 100px, 1fr)',\n        width: 2\n      },\n      {\n        key: 'grid_column',\n        type: 'text',\n        label: 'Grid Column (Children)',\n        category: 'behavior',\n        default_value: 'auto',\n        responsive: true,\n        description: 'Grid column placement (e.g., 1 / 3, span 2, auto)',\n        width: 2\n      },\n      {\n        key: 'grid_row',\n        type: 'text',\n        label: 'Grid Row (Children)',\n        category: 'behavior',\n        default_value: 'auto',\n        responsive: true,\n        description: 'Grid row placement (e.g., 1 / 3, span 2, auto)',\n        width: 2\n      },\n      {\n        key: 'grid_area',\n        type: 'text',\n        label: 'Grid Area (Children)',\n        category: 'behavior',\n        default_value: 'auto',\n        responsive: true,\n        description: 'Grid area placement (e.g., header, 1 / 1 / 3 / 3)',\n        width: 2\n      },\n      {\n        key: 'justify_self',\n        type: 'select',\n        label: 'Justify Self (Children)',\n        category: 'behavior',\n        default_value: 'auto',\n        responsive: true,\n        options: [\n          { label: 'Auto', value: 'auto' },\n          { label: 'Start', value: 'start' },\n          { label: 'End', value: 'end' },\n          { label: 'Center', value: 'center' },\n          { label: 'Stretch', value: 'stretch' }\n        ],\n        description: 'Override justify-items for individual grid items',\n        width: 2\n      },\n      {\n        key: 'align_self',\n        type: 'select',\n        label: 'Align Self (Children)',\n        category: 'behavior',\n        default_value: 'auto',\n        responsive: true,\n        options: [\n          { label: 'Auto', value: 'auto' },\n          { label: 'Start', value: 'start' },\n          { label: 'End', value: 'end' },\n          { label: 'Center', value: 'center' },\n          { label: 'Stretch', value: 'stretch' }\n        ],\n        description: 'Override align-items for individual grid items',\n        width: 2\n      }\n    ];\n  }\n}\n","<!-- min-height below is the drop target for an EMPTY container only. Applied\n     to every container, it inflated any grid whose content is shorter than\n     100px, so the designer canvas showed a taller card than the runtime did —\n     the one place the two must agree. -->\n<div class=\"grid-container-component\" eruCanvasEventHandler [class]=\"classes()\"\n  [class.design-mode]=\"store.editMode()\"\n  [ngStyle]=\"combinedGridStyles()\" [attr.data-container-id]=\"component().id\" [attr.data-component-id]=\"component().id\"\n  [attr.data-nesting-level]=\"nestingLevel()\" [style.z-index]=\"getZIndex(nestingLevel())\"\n  [style.min-height]=\"store.editMode() && !component().children?.length ? '100px' : null\"\n  (dragover)=\"onDragOver($event)\" (click)=\"onGridContainerClick($event)\">\n\n  @if (!component().children || component().children?.length === 0) {\n    @if (store.editMode()) {\n      <div class=\"container-empty-state\">\n        <mat-icon>grid_view</mat-icon>\n        <span>Drop components here to build your grid layout</span>\n      </div>\n    }\n  } @else if (componentsReady()) {\n  @for (child of component().children; track child.id) {\n  <div class=\"grid-child\"\n    [class.no-children]=\"child.children?.length == 0\" [class.selected]=\"selectedComponent()?.id === child.id\"\n    [class.hovered-drop-target]=\"isChildHovered() === child.id\"\n    [attr.data-container-id]=\"isContainer(child.type) ? child.id : null\" [attr.data-component-id]=\"child.id\"\n    [attr.data-component-type]=\"child.type\"\n    [attr.data-nesting-level]=\"nestingLevel() + 1\" [style.z-index]=\"getZIndex(nestingLevel() + 1)\"\n    [ngStyle]=\"getChildGridStyles(child)\" draggable=\"true\" (mouseenter)=\"onComponentMouseEnter($event, child)\"\n    (mouseleave)=\"onComponentMouseLeave($event)\" (mouseover)=\"onCanvasMouseOver($event, child)\"\n    (dragstart)=\"onComponentDragStart($event, child)\" (dragend)=\"onComponentDragEnd($event)\"\n    (click)=\"selectComponent($event, child)\">\n    <ng-container\n      *ngComponentOutlet=\"getComponentClass(child.type);\n                              injector: dynamicComponentInjector;\n                              inputs: isContainer(child.type) ? {component: child, nestingLevel: nestingLevel() + 1} : {component: child}\" />\n  </div>\n  }\n  }\n</div>","import { ChangeDetectionStrategy, Component, inject, signal, computed, effect, untracked, input, EnvironmentInjector, createEnvironmentInjector } from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { MatCardModule } from '@angular/material/card';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { ComponentRegistryService, EruStudioStore } from '../../services';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\n\ntype CardSlot = 'header' | 'body' | 'actions';\n\nconst SLOTS: CardSlot[] = ['header', 'body', 'actions'];\n\n/** Material's elevation levels, so the shadow never depends on a theme class. */\nconst ELEVATION_SHADOWS: Record<number, string> = {\n  0: 'none',\n  1: '0 2px 1px -1px rgba(0,0,0,.2), 0 1px 1px 0 rgba(0,0,0,.14), 0 1px 3px 0 rgba(0,0,0,.12)',\n  2: '0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12)',\n  3: '0 3px 3px -2px rgba(0,0,0,.2), 0 3px 4px 0 rgba(0,0,0,.14), 0 1px 8px 0 rgba(0,0,0,.12)',\n  4: '0 2px 4px -1px rgba(0,0,0,.2), 0 4px 5px 0 rgba(0,0,0,.14), 0 1px 10px 0 rgba(0,0,0,.12)',\n  5: '0 3px 5px -1px rgba(0,0,0,.2), 0 5px 8px 0 rgba(0,0,0,.14), 0 1px 14px 0 rgba(0,0,0,.12)'\n};\n\n/**\n * A card owns its chrome — surface, header, image, actions row — and nothing\n * else. Layout belongs to the flex containers it holds in up to three slots\n * (header, body, actions), the same arrangement tabs use for tab content: the\n * slot carries the canvas contract (`data-container-id`, `data-component-id`,\n * `data-nesting-level`, drag and click handlers) so components dropped inside\n * are droppable, selectable and outlined like anywhere else on the canvas.\n *\n * The actions row is a slot rather than a built-in button because a real Button\n * component already carries the whole event system; a hardcoded button could\n * never be given an action.\n */\n@Component({\n  selector: 'eru-card',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, NgComponentOutlet, MatCardModule],\n  templateUrl: './card.component.html',\n  styleUrl: './card.component.scss'\n})\nexport class CardComponent extends BaseComponent {\n  private componentRegistry = inject(ComponentRegistryService);\n  private readonly parentEnv = inject(EnvironmentInjector);\n\n  readonly nestingLevel = input<number>(0);\n  readonly selectedComponent = this.store.selectedComponent;\n  readonly componentsReady = signal(false);\n\n  readonly dynamicComponentInjector = createEnvironmentInjector(\n    [\n      { provide: EruStudioStore, useValue: this.store },\n      { provide: LogicEvaluatorService, useValue: this.logicEvaluator }\n    ],\n    this.parentEnv\n  );\n\n  readonly appearance = computed<'outlined' | 'raised' | 'filled'>(() => {\n    const value = this.getProperty('appearance');\n    return value === 'outlined' || value === 'filled' ? value : 'raised';\n  });\n\n  readonly elevationShadow = computed<string | null>(() => {\n    const raw = this.getProperty('elevation');\n    if (raw === '' || raw === null || raw === undefined) return null;\n    const level = Number(raw);\n    if (!Number.isFinite(level)) return null;\n    return ELEVATION_SHADOWS[Math.min(Math.max(Math.round(level), 0), 5)] ?? null;\n  });\n\n  readonly headerType = computed<'none' | 'text' | 'custom'>(() => {\n    const value = this.getProperty('header_type');\n    return value === 'none' || value === 'custom' ? value : 'text';\n  });\n\n  readonly showActions = computed(() => this.getProperty('show_actions') === true);\n  readonly actionsAlign = computed<'start' | 'end'>(() =>\n    this.getProperty('actions_align') === 'start' ? 'start' : 'end'\n  );\n\n  readonly imageUrl = computed<string>(() => (this.getProperty('image_url') ?? '').toString().trim());\n  readonly imagePosition = computed<'top' | 'bottom'>(() =>\n    this.getProperty('image_position') === 'bottom' ? 'bottom' : 'top'\n  );\n  readonly avatarUrl = computed<string>(() => (this.getProperty('avatar_url') ?? '').toString().trim());\n\n  readonly titleStyles = computed<Record<string, string>>(() => this.partStyles('title'));\n  readonly subtitleStyles = computed<Record<string, string>>(() => this.partStyles('subtitle'));\n\n  readonly headerSlot = computed<EruComponent>(() => this.slotComponent('header'));\n  readonly bodySlot = computed<EruComponent>(() => this.slotComponent('body'));\n  readonly actionsSlot = computed<EruComponent>(() => this.slotComponent('actions'));\n\n  /** The `content` text is a fallback for a card whose body was never filled. */\n  readonly fallbackContent = computed<string>(() => {\n    if ((this.bodySlot().children ?? []).length > 0) return '';\n    return (this.getProperty('content') ?? '').toString();\n  });\n\n  private readonly placeholders = new Map<string, EruComponent>();\n\n  constructor() {\n    super();\n\n    effect(() => {\n      const component = this.component();\n      const headerType = this.headerType();\n      const showActions = this.showActions();\n      const actionsAlign = this.actionsAlign();\n      if (!component) return;\n      untracked(() => this.reconcileSlots(component, headerType === 'custom', showActions, actionsAlign));\n    });\n\n    effect(() => {\n      const children = this.component()?.children;\n      this.componentsReady.set(false);\n      if (children && children.length > 0) {\n        Promise.all(\n          children.map((child: EruComponent) =>\n            this.componentRegistry.getComponentClassAsync(child.type)\n          )\n        ).then(() => this.componentsReady.set(true));\n      } else {\n        this.componentsReady.set(true);\n      }\n    });\n  }\n\n  getSlotComponentClass(slot: EruComponent): any {\n    return this.getComponentClass(slot.type);\n  }\n\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) return definition.component;\n    return this.componentRegistry['loadedComponents'].get(type);\n  }\n\n  getZIndex(level: number): number {\n    return 1 + (level * 10);\n  }\n\n  isSlotHovered(slot: EruComponent): boolean {\n    return this.store.hoveredComponentId() === slot.id;\n  }\n\n  onSlotMouseEnter(event: MouseEvent, slot: EruComponent) {\n    if (!this.store.editMode()) return;\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(slot.id);\n  }\n\n  onSlotMouseLeave(event: MouseEvent) {\n    if (!this.store.editMode()) return;\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(null);\n  }\n\n  onSlotDragStart(event: DragEvent) {\n    // A slot belongs to its card; dragging it out of one would leave the card\n    // without the container it renders into.\n    event.stopPropagation();\n    event.preventDefault();\n  }\n\n  selectSlot(event: MouseEvent, slot: EruComponent) {\n    if (!this.store.editMode()) return;\n    event.stopPropagation();\n    this.store.setSelectedComponent(slot);\n  }\n\n  private partStyles(part: 'title' | 'subtitle'): Record<string, string> {\n    const styles: Record<string, string> = {};\n    const fontSize = this.getStyleProperty(`${part}_font_size`);\n    const fontWeight = this.getStyleProperty(`${part}_font_weight`);\n    const color = this.getStyleProperty(`${part}_color`);\n    const align = this.getStyleProperty(`${part}_text_align`);\n    if (fontSize !== '' && fontSize !== null && fontSize !== undefined) {\n      styles['font-size'] = `${fontSize}px`;\n    }\n    if (fontWeight) styles['font-weight'] = String(fontWeight);\n    if (color) styles['color'] = String(color);\n    if (align) styles['text-align'] = String(align);\n    return styles;\n  }\n\n  private slotId(slot: CardSlot): string {\n    return `${this.component()?.id ?? ''}-slot-${slot}`;\n  }\n\n  private slotComponent(slot: CardSlot): EruComponent {\n    const id = this.slotId(slot);\n    const children = this.component()?.children ?? [];\n    const existing = children.find(child => child.id === id);\n    if (existing) return existing;\n\n    // Nothing reconciled yet (runtime, or a page saved before slots existed).\n    // A stable stand-in keeps the outlet from being re-created on every change\n    // detection pass.\n    const slotIds = new Set(SLOTS.map(name => this.slotId(name)));\n    const adopted = slot === 'body'\n      ? children.filter(child => !slotIds.has(child.id))\n      : [];\n\n    const cached = this.placeholders.get(id);\n    if (cached\n      && cached.children?.length === adopted.length\n      && (cached.children ?? []).every((child, index) => child === adopted[index])) {\n      return cached;\n    }\n\n    // A card saved before slots existed keeps its children directly. Outside\n    // the designer nothing reconciles them, so the body adopts them here —\n    // otherwise such a page would render an empty card at runtime.\n    const placeholder = { ...this.createSlotContainer(id, slot), children: adopted };\n    this.placeholders.set(id, placeholder);\n    return placeholder;\n  }\n\n  /**\n   * Keeps the card's children as its slots, in render order. Children saved\n   * before slots existed — or dropped straight onto the card's chrome — are\n   * moved into the body, which is where they were meant to land. A slot that\n   * is switched off is kept, never deleted, so its content survives the toggle.\n   */\n  private reconcileSlots(\n    component: EruComponent,\n    needHeader: boolean,\n    needActions: boolean,\n    actionsAlign: 'start' | 'end'\n  ): void {\n    if (!this.store.editMode()) return;\n\n    const children = component.children ?? [];\n    const ids = new Map<CardSlot, string>(SLOTS.map(slot => [slot, this.slotId(slot)]));\n    const slotIds = new Set(ids.values());\n\n    let header = children.find(child => child.id === ids.get('header')) ?? null;\n    let body = children.find(child => child.id === ids.get('body')) ?? null;\n    let actions = children.find(child => child.id === ids.get('actions')) ?? null;\n    const legacy = children.filter(child => !slotIds.has(child.id));\n\n    if (!body) body = this.createSlotContainer(ids.get('body')!, 'body');\n    if (needHeader && !header) header = this.createSlotContainer(ids.get('header')!, 'header');\n    if (needActions && !actions) actions = this.createSlotContainer(ids.get('actions')!, 'actions');\n\n    // `mat-card-actions align` cannot place the row on its own: the slot fills\n    // the card's width, so the alignment has to reach the flex container that\n    // actually lays the buttons out.\n    if (actions) {\n      const justify = actionsAlign === 'start' ? 'flex-start' : 'flex-end';\n      const base = (actions.properties as any)?.base ?? {};\n      if (base['justify_content'] !== justify) {\n        actions = {\n          ...actions,\n          properties: { ...actions.properties, base: { ...base, justify_content: justify } } as EruComponent['properties']\n        };\n      }\n    }\n\n    if (legacy.length > 0) {\n      body = { ...body, children: [...(body.children ?? []), ...legacy] };\n    }\n\n    const next = [header, body, actions].filter((slot): slot is EruComponent => !!slot);\n    const unchanged = next.length === children.length\n      && next.every((slot, index) => slot === children[index]);\n    if (unchanged) return;\n\n    this.store.updateComponent(component.id, { children: next });\n  }\n\n  private createSlotContainer(id: string, slot: CardSlot): EruComponent {\n    const now = new Date().toISOString();\n    const base: Record<string, any> = slot === 'body'\n      ? { flex_direction: 'column', gap: 8 }\n      : { flex_direction: 'row', align_items: 'center', gap: 8 };\n    return {\n      id,\n      type: 'flex_container',\n      properties: { base } as EruComponent['properties'],\n      styles: {\n        classes: '',\n        responsive_classes: {},\n        responsive_styles: {},\n        custom: {}\n      },\n      children: [],\n      created_at: now,\n      updated_at: now\n    };\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'layout',\n        default_value: 'raised',\n        options: [\n          { value: 'raised', label: 'Raised' },\n          { value: 'outlined', label: 'Outlined' },\n          { value: 'filled', label: 'Filled' }\n        ],\n        description: 'Material card surface style',\n        width: 2\n      },\n      {\n        key: 'elevation',\n        type: 'select',\n        label: 'Elevation',\n        category: 'layout',\n        default_value: '',\n        options: [\n          { value: '', label: 'Default' },\n          { value: 0, label: 'None' },\n          { value: 1, label: '1' },\n          { value: 2, label: '2' },\n          { value: 3, label: '3' },\n          { value: 4, label: '4' },\n          { value: 5, label: '5' }\n        ],\n        description: 'Shadow depth. Default leaves the appearance untouched.',\n        width: 2\n      },\n      {\n        key: 'header_type',\n        type: 'select',\n        label: 'Header',\n        category: 'content',\n        default_value: 'text',\n        options: [\n          { value: 'text', label: 'Title & Subtitle' },\n          { value: 'custom', label: 'Custom (drop components)' },\n          { value: 'none', label: 'None' }\n        ],\n        description: 'Custom turns the header into a container you can drop components into',\n        width: 'full'\n      },\n      {\n        key: 'title',\n        type: 'text',\n        label: 'Card Title',\n        category: 'content',\n        default_value: '',\n        description: 'Title displayed in the card header',\n        width: 2,\n        visible_if: { key: 'header_type', equals: 'text' }\n      },\n      {\n        key: 'subtitle',\n        type: 'text',\n        label: 'Card Subtitle',\n        category: 'content',\n        default_value: '',\n        description: 'Subtitle displayed below the title',\n        width: 2,\n        visible_if: { key: 'header_type', equals: 'text' }\n      },\n      {\n        key: 'avatar_url',\n        type: 'text',\n        label: 'Avatar Image URL',\n        category: 'content',\n        default_value: '',\n        description: 'Round image shown to the left of the title',\n        width: 'full',\n        visible_if: { key: 'header_type', equals: 'text' }\n      },\n      {\n        key: 'image_url',\n        type: 'text',\n        label: 'Card Image URL',\n        category: 'content',\n        default_value: '',\n        description: 'Full-width image on the card',\n        width: 'full'\n      },\n      {\n        key: 'image_position',\n        type: 'select',\n        label: 'Image Position',\n        category: 'content',\n        default_value: 'top',\n        options: [\n          { value: 'top', label: 'Top' },\n          { value: 'bottom', label: 'Bottom' }\n        ],\n        width: 2\n      },\n      {\n        key: 'content',\n        type: 'textarea',\n        label: 'Card Content',\n        category: 'content',\n        default_value: '',\n        description: 'Text shown while the card body has no components in it',\n        width: 'full'\n      },\n      {\n        key: 'show_actions',\n        type: 'boolean',\n        label: 'Show Actions',\n        category: 'behavior',\n        default_value: false,\n        description: 'Adds an actions row at the bottom to drop buttons into'\n      },\n      {\n        key: 'actions_align',\n        type: 'select',\n        label: 'Actions Alignment',\n        category: 'behavior',\n        default_value: 'end',\n        options: [\n          { value: 'start', label: 'Start' },\n          { value: 'end', label: 'End' }\n        ],\n        width: 2,\n        visible_if: { key: 'show_actions', equals: true }\n      }\n    ];\n  }\n\n  protected override getComponentStyleSchema(): StyleSchema[] {\n    return [\n      {\n        key: 'title_font_size',\n        type: 'number',\n        label: 'Title Size (px)',\n        category: 'typography',\n        default_value: '',\n        min: 8,\n        max: 64,\n        step: 1\n      },\n      {\n        key: 'title_font_weight',\n        type: 'select',\n        label: 'Title Weight',\n        category: 'typography',\n        default_value: '',\n        options: [\n          { value: '', label: 'Default' },\n          { value: 'normal', label: 'Normal' },\n          { value: '500', label: 'Medium' },\n          { value: '600', label: 'Semi Bold' },\n          { value: 'bold', label: 'Bold' }\n        ]\n      },\n      {\n        key: 'title_color',\n        type: 'color',\n        label: 'Title Color',\n        category: 'typography',\n        default_value: ''\n      },\n      {\n        key: 'title_text_align',\n        type: 'select',\n        label: 'Title Align',\n        category: 'typography',\n        default_value: '',\n        options: [\n          { value: '', label: 'Default' },\n          { value: 'left', label: 'Left' },\n          { value: 'center', label: 'Center' },\n          { value: 'right', label: 'Right' }\n        ]\n      },\n      {\n        key: 'subtitle_font_size',\n        type: 'number',\n        label: 'Subtitle Size (px)',\n        category: 'typography',\n        default_value: '',\n        min: 8,\n        max: 64,\n        step: 1\n      },\n      {\n        key: 'subtitle_font_weight',\n        type: 'select',\n        label: 'Subtitle Weight',\n        category: 'typography',\n        default_value: '',\n        options: [\n          { value: '', label: 'Default' },\n          { value: 'normal', label: 'Normal' },\n          { value: '500', label: 'Medium' },\n          { value: '600', label: 'Semi Bold' },\n          { value: 'bold', label: 'Bold' }\n        ]\n      },\n      {\n        key: 'subtitle_color',\n        type: 'color',\n        label: 'Subtitle Color',\n        category: 'typography',\n        default_value: ''\n      },\n      {\n        key: 'subtitle_text_align',\n        type: 'select',\n        label: 'Subtitle Align',\n        category: 'typography',\n        default_value: '',\n        options: [\n          { value: '', label: 'Default' },\n          { value: 'left', label: 'Left' },\n          { value: 'center', label: 'Center' },\n          { value: 'right', label: 'Right' }\n        ]\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      appearance: 'raised',\n      elevation: '',\n      header_type: 'text',\n      title: '',\n      subtitle: '',\n      avatar_url: '',\n      image_url: '',\n      image_position: 'top',\n      content: '',\n      show_actions: false,\n      actions_align: 'end'\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}\n","<mat-card\n  [appearance]=\"appearance()\"\n  [class]=\"classes()\"\n  [class.design-mode]=\"store.editMode()\"\n  [ngStyle]=\"combinedStyles()\"\n  [style.box-shadow]=\"elevationShadow()\"\n  [attr.data-component-id]=\"component().id\"\n  [attr.data-nesting-level]=\"nestingLevel()\">\n\n  @if (imageUrl() && imagePosition() === 'top') {\n    <img mat-card-image [src]=\"imageUrl()\" [alt]=\"getProperty('title') || ''\" />\n  }\n\n  @if (headerType() === 'text') {\n    @if (getProperty('title') || getProperty('subtitle') || avatarUrl()) {\n      <mat-card-header>\n        @if (avatarUrl()) {\n          <img mat-card-avatar [src]=\"avatarUrl()\" [alt]=\"getProperty('title') || ''\" />\n        }\n        @if (getProperty('title')) {\n          <mat-card-title [ngStyle]=\"titleStyles()\">{{ getProperty('title') }}</mat-card-title>\n        }\n        @if (getProperty('subtitle')) {\n          <mat-card-subtitle [ngStyle]=\"subtitleStyles()\">{{ getProperty('subtitle') }}</mat-card-subtitle>\n        }\n      </mat-card-header>\n    }\n  } @else if (headerType() === 'custom' && componentsReady()) {\n    <mat-card-header class=\"card-slot-header\">\n      <div\n        class=\"card-slot-wrapper\"\n        [class.design-mode]=\"store.editMode()\"\n        [class.selected]=\"selectedComponent()?.id === headerSlot().id\"\n        [class.hovered-drop-target]=\"isSlotHovered(headerSlot())\"\n        [attr.data-container-id]=\"headerSlot().id\"\n        [attr.data-component-id]=\"headerSlot().id\"\n        [attr.data-component-type]=\"'header'\"\n        [attr.data-nesting-level]=\"nestingLevel() + 1\"\n        [style.z-index]=\"getZIndex(nestingLevel() + 1)\"\n        (mouseenter)=\"onSlotMouseEnter($event, headerSlot())\"\n        (mouseleave)=\"onSlotMouseLeave($event)\"\n        (dragstart)=\"onSlotDragStart($event)\"\n        (click)=\"selectSlot($event, headerSlot())\">\n        <ng-container\n          [ngComponentOutlet]=\"getSlotComponentClass(headerSlot())\"\n          [ngComponentOutletInjector]=\"dynamicComponentInjector\"\n          [ngComponentOutletInputs]=\"{ component: headerSlot(), nestingLevel: nestingLevel() + 1 }\" />\n      </div>\n    </mat-card-header>\n  }\n\n  <mat-card-content>\n    @if (fallbackContent()) {\n      <p class=\"card-fallback-content\">{{ fallbackContent() }}</p>\n    }\n    @if (componentsReady()) {\n      <div\n        class=\"card-slot-wrapper\"\n        [class.design-mode]=\"store.editMode()\"\n        [class.selected]=\"selectedComponent()?.id === bodySlot().id\"\n        [class.hovered-drop-target]=\"isSlotHovered(bodySlot())\"\n        [attr.data-container-id]=\"bodySlot().id\"\n        [attr.data-component-id]=\"bodySlot().id\"\n        [attr.data-component-type]=\"'body'\"\n        [attr.data-nesting-level]=\"nestingLevel() + 1\"\n        [style.z-index]=\"getZIndex(nestingLevel() + 1)\"\n        (mouseenter)=\"onSlotMouseEnter($event, bodySlot())\"\n        (mouseleave)=\"onSlotMouseLeave($event)\"\n        (dragstart)=\"onSlotDragStart($event)\"\n        (click)=\"selectSlot($event, bodySlot())\">\n        <ng-container\n          [ngComponentOutlet]=\"getSlotComponentClass(bodySlot())\"\n          [ngComponentOutletInjector]=\"dynamicComponentInjector\"\n          [ngComponentOutletInputs]=\"{ component: bodySlot(), nestingLevel: nestingLevel() + 1 }\" />\n      </div>\n    }\n  </mat-card-content>\n\n  @if (showActions() && componentsReady()) {\n    <mat-card-actions [align]=\"actionsAlign()\">\n      <div\n        class=\"card-slot-wrapper card-slot-actions\"\n        [class.design-mode]=\"store.editMode()\"\n        [class.selected]=\"selectedComponent()?.id === actionsSlot().id\"\n        [class.hovered-drop-target]=\"isSlotHovered(actionsSlot())\"\n        [attr.data-container-id]=\"actionsSlot().id\"\n        [attr.data-component-id]=\"actionsSlot().id\"\n        [attr.data-component-type]=\"'actions'\"\n        [attr.data-nesting-level]=\"nestingLevel() + 1\"\n        [style.z-index]=\"getZIndex(nestingLevel() + 1)\"\n        (mouseenter)=\"onSlotMouseEnter($event, actionsSlot())\"\n        (mouseleave)=\"onSlotMouseLeave($event)\"\n        (dragstart)=\"onSlotDragStart($event)\"\n        (click)=\"selectSlot($event, actionsSlot())\">\n        <ng-container\n          [ngComponentOutlet]=\"getSlotComponentClass(actionsSlot())\"\n          [ngComponentOutletInjector]=\"dynamicComponentInjector\"\n          [ngComponentOutletInputs]=\"{ component: actionsSlot(), nestingLevel: nestingLevel() + 1 }\" />\n      </div>\n    </mat-card-actions>\n  }\n\n  @if (imageUrl() && imagePosition() === 'bottom') {\n    <img mat-card-image [src]=\"imageUrl()\" [alt]=\"getProperty('title') || ''\" />\n  }\n</mat-card>\n","import { ChangeDetectionStrategy, Component, input, computed} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-divider',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatDividerModule],\n  templateUrl: './divider.component.html',\n  styleUrl: './divider.component.scss'\n})\nexport class DividerComponent extends BaseComponent {\n  protected override getExcludedProperties(): string[] {\n    return [\n      'identifier',\n      'mandatory',\n      'mandatory_conditions',\n      'disabled_behavior',\n      'disabled_conditions'\n    ];\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'inset',\n        type: 'boolean',\n        label: 'Inset',\n        category: 'layout',\n        default_value: false,\n        description: 'Whether the divider is inset'\n      },\n      {\n        key: 'vertical',\n        type: 'boolean',\n        label: 'Vertical',\n        category: 'layout',\n        default_value: false,\n        description: 'Whether the divider is vertical'\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      inset: false,\n      vertical: false\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 0,\n      padding: 0\n    };\n  }\n}","<mat-divider\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  [inset]=\"getProperty('inset')\"\n  [vertical]=\"getProperty('vertical')\"\n  >\n</mat-divider>","import { ChangeDetectionStrategy, Component, input, inject, EnvironmentInjector, createEnvironmentInjector, OnInit } from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { ComponentRegistryService, EruStudioStore } from '../../services';\nimport { BaseComponent } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\n\n@Component({\n  selector: 'eru-expansion-panel',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, NgComponentOutlet, MatExpansionModule, MatIconModule],\n  templateUrl: './expansion-panel.component.html',\n  styleUrl: './expansion-panel.component.scss'\n})\nexport class ExpansionPanelComponent extends BaseComponent implements OnInit {\n  private componentRegistry = inject(ComponentRegistryService);\n  readonly nestingLevel = input<number>(0);\n  readonly selectedComponent = this.store.selectedComponent;\n  private readonly parentEnv = inject(EnvironmentInjector);\n  readonly dynamicComponentInjector = createEnvironmentInjector(\n    [\n      { provide: EruStudioStore, useValue: this.store },\n      { provide: LogicEvaluatorService, useValue: this.logicEvaluator }\n    ],\n    this.parentEnv\n  );\n\n  private findChild(suffix: string): EruComponent | null {\n    const component = this.component();\n    if (!component?.children?.length) return null;\n    const direct = component.children.find(c => c.id === `${component.id}${suffix}`);\n    if (direct) return direct;\n    const baseId = component.id.replace(/_\\d+$/, '');\n    return component.children.find(c => c.id.replace(/_\\d+$/, '') === `${baseId}${suffix}`) || null;\n  }\n\n  getHeaderContainer(): EruComponent | null {\n    return this.findChild('-header');\n  }\n\n  getContentContainer(): EruComponent | null {\n    return this.findChild('-content');\n  }\n\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) return definition.component;\n    return this.componentRegistry['loadedComponents']?.get(type);\n  }\n\n  isContainer(type: string): boolean {\n    return type === 'flex_container' || type === 'grid_container' || type === 'card' || type === 'attachment' || type === 'sidebar_stepper';\n  }\n\n  selectComponent(event: MouseEvent, component: EruComponent): void {\n    if (!this.store.editMode()) return;\n    event.stopPropagation();\n    this.store.setSelectedComponent(component);\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'expanded',\n        type: 'boolean',\n        label: 'Initially Expanded',\n        category: 'behavior',\n        default_value: false\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      expanded: false\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {};\n  }\n\n  override ngOnInit(): void {\n    super.ngOnInit();\n    const component = this.component();\n    if (!component) return;\n    if (!component.children) component.children = [];\n    if (!this.findChild('-header')) {\n      component.children.unshift({\n        id: `${component.id}-header`,\n        type: 'flex_container',\n        properties: { base: { name: '', label: '', identifier: false, events: [] } },\n        styles: { classes: '', responsive_classes: {}, responsive_styles: {}, custom: {} },\n        children: []\n      });\n    }\n  }\n}\n","<mat-accordion [class]=\"classes()\" [ngStyle]=\"combinedStyles()\">\n  <mat-expansion-panel [expanded]=\"getProperty('expanded')\">\n    <mat-expansion-panel-header>\n      @if (getHeaderContainer(); as header) {\n        <div class=\"eru-panel-header-slot\"\n          [attr.data-component-id]=\"header.id\"\n          [class.selected]=\"selectedComponent()?.id === header.id\"\n          (click)=\"selectComponent($event, header)\">\n          <ng-container\n            *ngComponentOutlet=\"getComponentClass(header.type);\n              injector: dynamicComponentInjector;\n              inputs: { component: header, nestingLevel: nestingLevel() + 1 }\" />\n        </div>\n      } @else {\n        <mat-panel-title class=\"eru-panel-header-empty\">\n          <span>Add header container: {{ component().id }}-header</span>\n        </mat-panel-title>\n      }\n    </mat-expansion-panel-header>\n\n    @if (getContentContainer(); as container) {\n      <div [attr.data-component-id]=\"container.id\"\n        [class.selected]=\"selectedComponent()?.id === container.id\"\n        (click)=\"selectComponent($event, container)\">\n        <ng-container\n          *ngComponentOutlet=\"getComponentClass(container.type);\n            injector: dynamicComponentInjector;\n            inputs: isContainer(container.type) ? { component: container, nestingLevel: nestingLevel() + 1 } : { component: container }\" />\n      </div>\n    } @else {\n      <div class=\"panel-empty-state\">\n        <mat-icon>view_agenda</mat-icon>\n        <span>Add content container: {{ component().id }}-content</span>\n      </div>\n    }\n  </mat-expansion-panel>\n</mat-accordion>\n","import { ChangeDetectionStrategy, Component, input, computed} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatListModule } from '@angular/material/list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-list',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatListModule, MatIconModule],\n  templateUrl: './list.component.html',\n  styleUrl: './list.component.scss'\n})\nexport class ListComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  // Parse list items from comma-separated string\n  readonly listItems = computed(() => {\n    const itemsString = this.getProperty('items') || '';\n    return itemsString.split(',').map((item: string) => item.trim()).filter((item: string) => item.length > 0);\n  });\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'items',\n        type: 'text',\n        label: 'List Items (comma-separated)',\n        category: 'content',\n        default_value: 'Item 1, Item 2, Item 3, Item 4',\n        description: 'Enter list items separated by commas',\n        width: 'full'\n      },\n      {\n        key: 'show_icons',\n        type: 'boolean',\n        label: 'Show Icons',\n        category: 'behavior',\n        default_value: true,\n        description: 'Show icons next to list items'\n      },\n      {\n        key: 'dense',\n        type: 'boolean',\n        label: 'Dense Layout',\n        category: 'layout',\n        default_value: false,\n        description: 'Use dense layout for smaller spacing'\n      }\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      items: 'Item 1, Item 2, Item 3, Item 4',\n      show_icons: true,\n      dense: false\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}","<mat-list\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  [class.mat-list-dense]=\"getProperty('dense')\"\n  >\n  @for (item of listItems(); track item) {\n    <mat-list-item>\n      @if (getProperty('show_icons')) {\n        <mat-icon matListItemIcon>list</mat-icon>\n      }\n      <div matListItemTitle>{{ item }}</div>\n    </mat-list-item>\n  }\n</mat-list>","import { Component, input, computed, inject, signal, effect, EnvironmentInjector, OnInit, ViewChild } from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { MatStepper, MatStepperModule } from '@angular/material/stepper';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { ComponentRegistryService } from '../../services';\n\n@Component({\n  selector: 'eru-stepper',\n  standalone: true,\n  imports: [CommonModule, MatStepperModule, MatFormFieldModule, MatInputModule, MatButtonModule, NgComponentOutlet, MatIconModule],\n  templateUrl: './stepper.component.html',\n  styleUrl: './stepper.component.scss'\n})\nexport class StepperComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  @ViewChild(MatStepper) private stepper!: MatStepper;\n\n  private componentRegistry = inject(ComponentRegistryService);\n  private _selectedStepIndex = signal<number>(0);\n  readonly nestingLevel = input<number>(0);\n  readonly selectedComponent = this.store.selectedComponent;\n  readonly componentsReady = signal(false);\n  readonly selectedStepIndex = this._selectedStepIndex.asReadonly();\n  // Parse steps from comma-separated string\n  readonly steps = computed(() => {\n    const stepsString = this.getProperty('steps') || '';\n    return stepsString.split(',').map((step: string) => step.trim()).filter((step: string) => step.length > 0);\n  });\n\n  constructor() {\n    super();\n    /* effect(() => {\n      const component = this.component();\n      if (component) {\n        this.initializeStepContainers(component);\n      }\n    }); */\n\n    /* effect(() => {\n      const children = this.component()?.children;\n      this.componentsReady.set(false);\n      if (children && children.length > 0) {\n        Promise.all(\n          children.map((child: any) =>\n            this.componentRegistry.getComponentClassAsync(child.type)\n          )\n        ).then(() => {\n          this.componentsReady.set(true);\n        });\n      } else {\n        this.componentsReady.set(true);\n      }\n    });     */\n  }\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'steps',\n        type: 'text',\n        label: 'Steps (comma-separated)',\n        category: 'content',\n        default_value: 'Step 1, Step 2, Step 3',\n        description: 'Enter step titles separated by commas',\n        width: 'full'\n      },\n      {\n        key: 'orientation',\n        type: 'select',\n        label: 'Orientation',\n        category: 'layout',\n        default_value: 'horizontal',\n        options: [\n          { label: 'Horizontal', value: 'horizontal' },\n          { label: 'Vertical', value: 'vertical' }\n        ],\n        width: 2\n      },\n      {\n        key: 'linear',\n        type: 'boolean',\n        label: 'Linear Mode',\n        category: 'behavior',\n        default_value: false,\n        description: 'Require completion of previous steps before proceeding'\n      },\n      {\n        key: 'validate_steps',\n        type: 'boolean',\n        label: 'Validate Steps',\n        category: 'behavior',\n        default_value: false,\n        description: 'Block forward navigation if required fields in the current step are not filled'\n      },\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      steps: 'Step 1, Step 2, Step 3',\n      orientation: 'horizontal',\n      linear: false,\n      selected_step_index: 0\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n\n  onStepperClick(event: MouseEvent) {\n    // Only select the stepper if clicking directly on the stepper element itself,\n    // not on child elements\n    if (event.target === event.currentTarget) {\n      event.stopPropagation();\n      this.store.setSelectedComponent(this.component());\n    }\n  }\n\n  onComponentMouseEnter(event: MouseEvent, component: EruComponent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(component.id);\n  }\n\n  onComponentMouseLeave(event: MouseEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(null);\n  }\n  onCanvasMouseOver(event: MouseEvent, component: EruComponent) {\n    event.preventDefault();\n    event.stopPropagation();\n    // Check if mouse is over the canvas background area (not over child components)\n    const target = event.target as HTMLElement;\n    // Only set hover to root-container if we're over the canvas background, not over child components\n    if (target.getAttribute('data-component-id') === component.id) {\n      this.store.setHoveredComponentId(component.id);\n    }\n  }\n\n  isContainer(type: string): boolean {\n    return type === 'flex_container' || type === 'grid_container' || type === 'card' || type === 'attachment';\n  }\n\n  hasCustomComponent(type: string): boolean {\n    const definition = this.componentRegistry.getComponent(type);\n    return !!definition?.component;\n  }\n\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) {\n      return definition.component;\n    }\n    return this.componentRegistry['loadedComponents'].get(type);\n  }\n\n  getZIndex(level: number): number {\n    // Base z-index is 1, each nesting level adds 10\n    // This ensures nested components appear above their parents\n    return 1 + (level * 10);\n  }\n\n  isComponentHovered() {\n    return (componentId: string) => {\n      // This would need to be implemented based on your hover state management\n      // For now, return false\n      return false;\n    };\n  }\n\n  onComponentDragStart(event: DragEvent, component: EruComponent) {\n    // Handle drag start for step containers\n    event.stopPropagation();\n    // Add drag start logic here if needed\n  }\n\n  selectComponent(event: MouseEvent, component: EruComponent) {\n    event.stopPropagation();\n    this.store.setSelectedComponent(component);\n  }\n\n  onStepContainerClick(event: MouseEvent, stepContainerComponent: EruComponent) {\n    const target = event.target as HTMLElement;\n    const currentTarget = event.currentTarget as HTMLElement;\n\n    // Check if clicking directly on the step container wrapper itself\n    if (target === currentTarget) {\n      event.stopPropagation();\n      this.store.setSelectedComponent(stepContainerComponent);\n      return;\n    }\n\n    // Check if the click is on a child component (like grid container) inside the step container\n    // Find all elements with data-component-id within the step container that contain the target\n    const stepContainerChildren = stepContainerComponent.children || [];\n    const childComponentIds = stepContainerChildren.map(child => child.id);\n\n    // Walk up the DOM tree from the target to find if we're inside a child component\n    let current: HTMLElement | null = target;\n    while (current && current !== currentTarget) {\n      const componentId = current.getAttribute('data-component-id');\n      if (componentId && childComponentIds.includes(componentId)) {\n        // Found a child component - don't stop propagation, let it handle the click\n        return;\n      }\n      current = current.parentElement;\n    }\n\n    // If no child component was found, select the step container\n    event.stopPropagation();\n    this.store.setSelectedComponent(stepContainerComponent);\n  }\n\n  hasChildren(): boolean {\n    const component = this.component();\n    return !!(component?.children && component.children.length > 0);\n  }\n\n  getStepContainerComponent(stepIndex: number): any {\n    const stepContainerData = this.getStepContainerComponentData(stepIndex);\n    const componentClass = this.getComponentClass(stepContainerData.type);\n    return componentClass;\n  }\n\n  private initializeStepContainers(component: EruComponent): void {\n    const steps = this.steps();\n\n    // Check if step containers already exist\n    const existingStepContainers = component.children?.filter(child =>\n      child.id.includes('-step-')\n    ) || [];\n\n    // Only create step containers if they don't exist or if the number of steps changed\n    if (existingStepContainers.length !== steps.length) {\n      // Remove existing step containers\n      if (component.children) {\n        component.children = component.children.filter(child =>\n          !child.id.includes('-step-')\n        );\n      } else {\n        component.children = [];\n      }\n\n      // Create new step containers - always use flex_container as default\n      steps.forEach((step: string, index: number) => {\n        const containerId = `${component.id}-step-${index}`;\n        const stepContainer: EruComponent = {\n          id: containerId,\n          type: 'flex_container',\n          properties: {\n            base: {}\n          },\n          styles: {\n            classes: '',\n            responsive_classes: {},\n            responsive_styles: {},\n            custom: {}\n          },\n          children: [],\n          created_at: new Date().toISOString(),\n          updated_at: new Date().toISOString()\n        };\n\n        component.children!.push(stepContainer);\n      });\n\n      // Update the component in the store\n      this.store.updateComponent(component.id, component);\n    }\n  }\n\n  getStepContainerComponentData(stepIndex: number): EruComponent {\n    const component = this.component();\n    const stepContainer = component?.children?.find(child =>\n      child.id === `${component.id}-step-${stepIndex}`\n    );\n\n    if (stepContainer) {\n      return stepContainer;\n    }\n\n    // Fallback: create temporary component data (this shouldn't happen after initialization)\n    const containerId = `${component?.id}-step-${stepIndex}`;\n\n    return {\n      id: containerId,\n      type: 'flex_container',\n      properties: {\n        base: {}\n      },\n      styles: {\n        classes: '',\n        responsive_classes: {},\n        responsive_styles: {},\n        custom: {}\n      },\n      children: [],\n      created_at: new Date().toISOString(),\n      updated_at: new Date().toISOString()\n    };\n  }\n\n  // Find which step index a component belongs to (recursively search step containers and their children)\n  private findStepIndexForComponent(componentId: string): number | null {\n    const component = this.component();\n    if (!component || !component.children) return null;\n\n    const steps = this.steps();\n\n    for (let i = 0; i < steps.length; i++) {\n      const stepContainerId = `${component.id}-step-${i}`;\n      const stepContainer = component.children.find(child => child.id === stepContainerId);\n\n      if (!stepContainer) continue;\n\n      // Check if the component is the step container itself\n      if (stepContainer.id === componentId) {\n        return i;\n      }\n\n      // Check if the component is a direct child of the step container\n      if (stepContainer.children) {\n        const isDirectChild = stepContainer.children.some(child => child.id === componentId);\n        if (isDirectChild) {\n          return i;\n        }\n\n        // Recursively check nested children\n        const nestedIndex = this.findComponentInChildren(stepContainer.children, componentId);\n        if (nestedIndex !== null) {\n          return i;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  // Recursively search for a component in children\n  private findComponentInChildren(children: EruComponent[], componentId: string): boolean {\n    for (const child of children) {\n      if (child.id === componentId) {\n        return true;\n      }\n      if (child.children && child.children.length > 0) {\n        if (this.findComponentInChildren(child.children, componentId)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  readonly shouldValidate = computed(() => !!this.getProperty('validate_steps'));\n\n  isStepCompleted(stepIndex: number): boolean {\n    if (!this.shouldValidate()) return true;\n    this.formValidationService.formValid();\n    const stepContainer = this.getStepContainerComponentData(stepIndex);\n    const pageId = this.store.currentPage()?.id || '';\n    const componentIds = new Set<string>();\n    this.collectComponentIds(stepContainer, componentIds);\n    return this.formValidationService\n      .getAllFormControlInfos(pageId)\n      .filter(info => componentIds.has(info.componentId))\n      .every(info => info.control.disabled || info.control.valid);\n  }\n\n  private markCurrentStepControlsTouched(): void {\n    const stepIndex = this._selectedStepIndex();\n    const stepContainer = this.getStepContainerComponentData(stepIndex);\n    const pageId = this.store.currentPage()?.id || '';\n    const componentIds = new Set<string>();\n    this.collectComponentIds(stepContainer, componentIds);\n    this.formValidationService\n      .getAllFormControlInfos(pageId)\n      .filter(info => componentIds.has(info.componentId))\n      .forEach(info => {\n        info.control.markAsTouched();\n        info.control.updateValueAndValidity({ emitEvent: false });\n      });\n  }\n\n  onNextStep(): void {\n    if (this.shouldValidate()) this.markCurrentStepControlsTouched();\n    this.stepper.next();\n  }\n\n  private collectComponentIds(component: EruComponent, ids: Set<string>): void {\n    ids.add(component.id);\n    component.children?.forEach(child => this.collectComponentIds(child, ids));\n  }\n\n  // Handle stepper selection change\n  onStepSelectionChange(event: any): void {\n    this._selectedStepIndex.set(event.selectedIndex);\n    /* \n    const component = this.component();\n    if (component && event.selectedIndex !== undefined) {\n      // Always store selected_step_index in base properties so it persists across breakpoints\n      const updatedProperties = { ...component.properties };\n      if (!updatedProperties.base) {\n        updatedProperties.base = {};\n      }\n      updatedProperties.base = {\n        ...updatedProperties.base,\n        selected_step_index: event.selectedIndex\n      };\n      this.store.updateComponent(component.id, {\n        properties: updatedProperties,\n        updated_at: new Date().toISOString()\n      });\n    } */\n  }\n}\n","<mat-stepper\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  [orientation]=\"getProperty('orientation')\"\n  [linear]=\"shouldValidate() || getProperty('linear')\"\n  [selectedIndex]=\"selectedStepIndex()\"\n  (selectionChange)=\"onStepSelectionChange($event)\"\n  [attr.data-component-id]=\"component().id\"\n  [attr.data-nesting-level]=\"nestingLevel()\"\n  (click)=\"onStepperClick($event)\">\n  @for (step of steps(); track step; let i = $index) {\n    <mat-step [label]=\"step\" [completed]=\"isStepCompleted(i)\">\n      <ng-template matStepContent>\n        <!-- Container for step content -->\n        <div\n          class=\"step-container-wrapper mt-2\"\n          [class.selected]=\"selectedComponent()?.id === getStepContainerComponentData(i).id\"\n          [class.hovered-drop-target]=\"isComponentHovered()(getStepContainerComponentData(i).id)\"\n          [attr.data-container-id]=\"getStepContainerComponentData(i).id\"\n          [attr.data-component-id]=\"getStepContainerComponentData(i).id\"\n          [attr.data-nesting-level]=\"nestingLevel() + 1\"\n          [style.z-index]=\"getZIndex(nestingLevel() + 1)\"\n          (mouseenter)=\"onComponentMouseEnter($event, component())\"\n          (mouseleave)=\"onComponentMouseLeave($event)\"\n          (mouseover)=\"onCanvasMouseOver($event, component())\"\n          (dragstart)=\"onComponentDragStart($event, component())\"\n          draggable=\"true\"\n          (click)=\"onStepContainerClick($event, getStepContainerComponentData(i))\"\n          >\n          <ng-container\n            [ngComponentOutlet]=\"getStepContainerComponent(i)\"\n            [ngComponentOutletInputs]=\"{ component: getStepContainerComponentData(i), nestingLevel: nestingLevel() + 1 }\">\n          </ng-container>\n        </div>\n\n        <!-- Stepper navigation buttons -->\n        <div class=\"stepper-navigation\">\n          <button mat-button matStepperPrevious>Back</button>\n          <button mat-button (click)=\"onNextStep()\">Next</button>\n        </div>\n      </ng-template>\n    </mat-step>\n  }\n</mat-stepper>\n","import { Component, input, computed, signal, inject, EnvironmentInjector, createEnvironmentInjector, effect, untracked } from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { ComponentRegistryService, EruStudioStore } from '../../services';\nimport { BaseComponent } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\n\n@Component({\n  selector: 'eru-sidebar-stepper',\n  standalone: true,\n  imports: [CommonModule, NgComponentOutlet, MatIconModule],\n  templateUrl: './sidebar-stepper.component.html',\n  styleUrl: './sidebar-stepper.component.scss'\n})\nexport class SidebarStepperComponent extends BaseComponent {\n  private componentRegistry = inject(ComponentRegistryService);\n  readonly nestingLevel = input<number>(0);\n  readonly selectedComponent = this.store.selectedComponent;\n  private readonly parentEnv = inject(EnvironmentInjector);\n  readonly dynamicComponentInjector = createEnvironmentInjector(\n    [\n      { provide: EruStudioStore, useValue: this.store },\n      { provide: LogicEvaluatorService, useValue: this.logicEvaluator }\n    ],\n    this.parentEnv\n  );\n\n  private _activeStepIndex = signal<number>(0);\n  readonly activeStepIndex = this._activeStepIndex.asReadonly();\n  private _visitedSteps = signal<Set<number>>(new Set([0]));\n\n  readonly steps = computed(() => {\n    const s = this.getProperty('steps') || '';\n    return s.split(',').map((step: string) => step.trim()).filter((step: string) => step.length > 0);\n  });\n\n  readonly stepSubtitles = computed(() => {\n    const s = this.getProperty('step_subtitles') || '';\n    return s.split(',').map((sub: string) => sub.trim());\n  });\n\n  readonly sidebarWidth = computed(() => this.getProperty('sidebar_width') || 280);\n  readonly activeColor = computed(() => this.getProperty('active_color') || 'var(--studio-primary)');\n  readonly completeColor = computed(() => this.getProperty('complete_color') || 'var(--studio-primary)');\n  readonly showProgress = computed(() => this.getProperty('show_progress') === true);\n  readonly progressPercent = computed(() =>\n    Math.round((this._activeStepIndex() / Math.max(this.steps().length, 1)) * 100)\n  );\n\n  readonly shouldValidate = computed(() => !!this.getProperty('validate_steps'));\n\n  override componentEvents = [\n    { label: 'On Complete', value: 'on_complete' }\n  ];\n\n  constructor() {\n    super();\n    effect(() => {\n      const actions = this.store.componentActions();\n      const id = this.component()?.id;\n      if (!id) return;\n      const pending = actions.get(id);\n      if (!pending) return;\n      this.store.consumeComponentAction(id);\n      untracked(() => {\n        const cur = this._activeStepIndex();\n        const lastIndex = this.steps().length - 1;\n        if (pending.action === 'step-forward') {\n          if (cur < lastIndex) {\n            this.setActiveStep(cur + 1);\n          } else {\n            // Already on last step — treat step-forward as completion.\n            // Run the configured on-complete visibility toggles if, and only\n            // if, the current step's validation passes.\n            if (this.shouldValidate()) {\n              this.markCurrentStepControlsTouched();\n              if (!this.isStepCompleted(cur)) return;\n            }\n            this.runCompletion();\n          }\n        } else if (pending.action === 'step-back') {\n          if (cur > 0) this.setActiveStep(cur - 1);\n        } else if (pending.action === 'step-set' && typeof pending.data === 'number') {\n          this.setActiveStep(pending.data);\n        }\n      });\n    });\n  }\n\n  private runCompletion(): void {\n    // Fire the 'on_complete' event so the user can wire any actions\n    // (hide-component, show-component, navigate-to-page, call-query, etc.)\n    // through the standard event framework in the Properties Panel.\n    this.emitEvent('on_complete', { stepIndex: this._activeStepIndex() });\n  }\n\n  setActiveStep(index: number): void {\n    if (this.shouldValidate() && index > this._activeStepIndex()) {\n      this.markCurrentStepControlsTouched();\n      if (!this.isStepCompleted(this._activeStepIndex())) return;\n    }\n    this._activeStepIndex.set(index);\n    this._visitedSteps.update(visited => {\n      const next = new Set(visited);\n      next.add(index);\n      return next;\n    });\n  }\n\n  isStepCompleted(stepIndex: number): boolean {\n    if (!this.shouldValidate()) return true;\n    this.formValidationService.formValid();\n    const component = this.component();\n    const stepContainer = component?.children?.find(c => c.id === `${component.id}-step-${stepIndex}`);\n    if (!stepContainer) return true;\n    const pageId = this.store.currentPage()?.id || '';\n    const componentIds = new Set<string>();\n    this.collectComponentIds(stepContainer, componentIds);\n    const formsValid = this.formValidationService\n      .getAllFormControlInfos(pageId)\n      .filter(info => componentIds.has(info.componentId))\n      .every(info => info.control.disabled || info.control.valid);\n    if (!formsValid) return false;\n\n    // Additional per-step expression check — useful for cases where step\n    // completion depends on page state (e.g. doc-upload counts) rather than\n    // just required form controls. Expressions are newline-separated, one\n    // per step; blank/missing lines skip the custom check.\n    const raw = (this.getProperty('step_validation_expressions') || '') as string;\n    const exprs = raw.split(/\\r?\\n/);\n    const expr = (exprs[stepIndex] || '').trim();\n    if (expr) return this.logicEvaluator.evaluate(expr, pageId);\n    return true;\n  }\n\n  private markCurrentStepControlsTouched(): void {\n    const component = this.component();\n    const stepIndex = this._activeStepIndex();\n    const stepContainer = component?.children?.find(c => c.id === `${component.id}-step-${stepIndex}`);\n    if (!stepContainer) return;\n    const pageId = this.store.currentPage()?.id || '';\n    const componentIds = new Set<string>();\n    this.collectComponentIds(stepContainer, componentIds);\n    this.formValidationService\n      .getAllFormControlInfos(pageId)\n      .filter(info => componentIds.has(info.componentId))\n      .forEach(info => {\n        info.control.markAsTouched();\n        info.control.updateValueAndValidity({ emitEvent: false });\n      });\n  }\n\n  private collectComponentIds(component: EruComponent, ids: Set<string>): void {\n    ids.add(component.id);\n    component.children?.forEach(child => this.collectComponentIds(child, ids));\n  }\n\n  isStepVisited(index: number): boolean {\n    return this._visitedSteps().has(index);\n  }\n\n  getStepState(index: number): 'active' | 'complete' | 'error' | 'pending' {\n    const active = this._activeStepIndex();\n    if (index === active) return 'active';\n    if (index < active) {\n      if (this.shouldValidate() && !this.isStepCompleted(index)) return 'error';\n      return 'complete';\n    }\n    return 'pending';\n  }\n\n  getActiveStepContainer(): EruComponent | null {\n    const component = this.component();\n    const index = this._activeStepIndex();\n    return component?.children?.find(c => c.id === `${component.id}-step-${index}`) || null;\n  }\n\n  getAllStepContainers(): EruComponent[] {\n    const component = this.component();\n    if (!component?.children) return [];\n    return this.steps().map((_: string, i: number) =>\n      component.children!.find((c: EruComponent) => c.id === `${component.id}-step-${i}`)\n    ).filter((c: EruComponent | undefined): c is EruComponent => !!c);\n  }\n\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) return definition.component;\n    return this.componentRegistry['loadedComponents']?.get(type);\n  }\n\n  isContainer(type: string): boolean {\n    return type === 'flex_container' || type === 'grid_container' || type === 'card' || type === 'attachment' || type === 'sidebar_stepper';\n  }\n\n  selectComponent(event: MouseEvent, component: EruComponent): void {\n    if (!this.store.editMode()) return;\n    event.stopPropagation();\n    this.store.setSelectedComponent(component);\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'steps',\n        type: 'text',\n        label: 'Steps (comma-separated)',\n        category: 'content',\n        default_value: 'Step 1, Step 2, Step 3',\n        width: 'full'\n      },\n      {\n        key: 'step_subtitles',\n        type: 'text',\n        label: 'Subtitles (comma-separated)',\n        category: 'content',\n        default_value: '',\n        width: 'full'\n      },\n      {\n        key: 'sidebar_width',\n        type: 'number',\n        label: 'Sidebar Width (px)',\n        category: 'layout',\n        default_value: 280,\n        min: 180,\n        max: 500\n      },\n      {\n        key: 'show_progress',\n        type: 'boolean',\n        label: 'Show Progress',\n        category: 'content',\n        default_value: true\n      },\n      {\n        key: 'active_color',\n        type: 'text',\n        label: 'Active Color',\n        category: 'content',\n        default_value: ''\n      },\n      {\n        key: 'complete_color',\n        type: 'text',\n        label: 'Complete Color',\n        category: 'content',\n        default_value: ''\n      },\n      {\n        key: 'validate_steps',\n        type: 'boolean',\n        label: 'Validate Steps',\n        category: 'behavior',\n        default_value: false,\n        description: 'Block forward navigation if required fields in the current step are not filled'\n      },\n      {\n        key: 'step_validation_expressions',\n        type: 'textarea',\n        label: 'Step Validation Expressions',\n        category: 'behavior',\n        default_value: '',\n        description: 'One expression per step (newline-separated). Each must evaluate truthy for its step to be complete, in addition to required-field checks. Leave a line blank to skip. Example: \"@uploaded_docs == @required_docs\"'\n      },\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      steps: 'Step 1, Step 2, Step 3',\n      step_subtitles: '',\n      sidebar_width: 280,\n      active_color: '',\n      complete_color: ''\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {};\n  }\n}\n","<div class=\"sidebar-stepper\" [ngStyle]=\"combinedStyles()\" [attr.data-component-id]=\"component().id\">\n  <nav class=\"sidebar-nav\" [style.width.px]=\"sidebarWidth()\">\n    <div class=\"step-nav-list\">\n      @for (step of steps(); track step; let i = $index; let last = $last) {\n        <div class=\"step-nav-item\"\n          [class.active]=\"getStepState(i) === 'active'\"\n          [class.complete]=\"getStepState(i) === 'complete'\"\n          [class.error]=\"getStepState(i) === 'error'\"\n          (click)=\"setActiveStep(i); $event.stopPropagation()\">\n          <div class=\"step-nav-indicator\">\n            <div class=\"step-badge\"\n              [style.background-color]=\"getStepState(i) === 'active' ? activeColor() : getStepState(i) === 'complete' ? completeColor() : getStepState(i) === 'error' ? '#f44336' : null\">\n              @if (getStepState(i) === 'complete') {\n                <mat-icon>check</mat-icon>\n              } @else if (getStepState(i) === 'error') {\n                <mat-icon>warning</mat-icon>\n              } @else {\n                <span>{{ i + 1 }}</span>\n              }\n            </div>\n            @if (!last) {\n              <div class=\"step-connector\"\n                [style.border-color]=\"getStepState(i) === 'complete' ? completeColor() : null\"></div>\n            }\n          </div>\n          <div class=\"step-nav-text\">\n            <span class=\"step-title\" [style.color]=\"getStepState(i) === 'active' ? activeColor() : null\">{{ step }}</span>\n            @if (stepSubtitles()[i]) {\n              <span class=\"step-subtitle\">{{ stepSubtitles()[i] }}</span>\n            }\n          </div>\n        </div>\n      }\n    </div>\n    @if (steps()[activeStepIndex()]; as activeTitle) {\n      <div class=\"active-step-label\">{{ activeTitle }}</div>\n    }\n  @if (showProgress()) {\n    <div class=\"sidebar-progress\">\n      <div class=\"progress-meta\">\n        <span class=\"progress-label\">Overall progress</span>\n        <span class=\"progress-pct\">{{ progressPercent() }}%</span>\n      </div>\n      <div class=\"progress-track\">\n        <div class=\"progress-fill\" [style.width.%]=\"progressPercent()\"></div>\n      </div>\n      <div class=\"progress-sub\">{{ activeStepIndex() }} of {{ steps().length }} steps complete</div>\n    </div>\n  }\n  </nav>\n\n  <div class=\"step-content-area\">\n    @for (stepContainer of getAllStepContainers(); track stepContainer.id; let i = $index) {\n      @if (isStepVisited(i)) {\n        <div [style.display]=\"activeStepIndex() === i ? 'block' : 'none'\"\n          [attr.data-component-id]=\"stepContainer.id\"\n          [class.selected]=\"selectedComponent()?.id === stepContainer.id\"\n          (click)=\"selectComponent($event, stepContainer)\">\n          <ng-container\n            [ngComponentOutlet]=\"getComponentClass(stepContainer.type)\"\n            [ngComponentOutletEnvironmentInjector]=\"dynamicComponentInjector\"\n            [ngComponentOutletInputs]=\"isContainer(stepContainer.type) ? { component: stepContainer, nestingLevel: nestingLevel() + 1 } : { component: stepContainer }\" />\n        </div>\n      }\n    }\n    @if (getAllStepContainers().length === 0) {\n      <div class=\"content-empty-state\">\n        <mat-icon>view_sidebar</mat-icon>\n        <span>Add step containers: {{ component().id }}-step-0, {{ component().id }}-step-1, ...</span>\n      </div>\n    }\n  </div>\n</div>\n","import { Component, input, computed} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { NestedTreeControl } from '@angular/cdk/tree';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-tree',\n  standalone: true,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatTreeModule, MatIconModule, MatButtonModule],\n  templateUrl: './tree.component.html',\n  styleUrl: './tree.component.scss'\n})\nexport class TreeComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  treeControl = new NestedTreeControl<any>(node => node.children);\n  dataSource = new MatTreeNestedDataSource<any>();\n\n  // Tree data structure\n  readonly treeData = computed(() => {\n    const itemsString = this.getProperty('items') || '';\n    const items = itemsString.split(',').map((item: string) => item.trim()).filter((item: string) => item.length > 0);\n    \n    const data = items.map((item: string, index: number) => ({\n      name: item,\n      children: [\n        { name: `${item} - Child 1` },\n        { name: `${item} - Child 2` }\n      ]\n    }));\n    \n    this.dataSource.data = data;\n    return data;\n  });\n\n  hasChild = (_: number, node: any) => !!node.children && node.children.length > 0;\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'items',\n        type: 'text',\n        label: 'Tree Items (comma-separated)',\n        category: 'content',\n        default_value: 'Parent 1, Parent 2, Parent 3',\n        description: 'Enter parent items separated by commas',\n        width: 'full'\n      },\n      {\n        key: 'show_icons',\n        type: 'boolean',\n        label: 'Show Icons',\n        category: 'behavior',\n        default_value: true,\n        description: 'Show expand/collapse icons'\n      }\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      items: 'Parent 1, Parent 2, Parent 3',\n      show_icons: true\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}","<mat-tree\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  [dataSource]=\"dataSource\"\n  [treeControl]=\"treeControl\"\n  >\n  <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\n    @if (getProperty('show_icons')) {\n      <mat-icon matTreeNodeIcon>folder</mat-icon>\n    }\n    {{ node.name }}\n  </mat-tree-node>\n  \n  <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\n    <div matTreeNodeToggle>\n      @if (getProperty('show_icons')) {\n        <mat-icon matTreeNodeIcon>\n          {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n        </mat-icon>\n      }\n      {{ node.name }}\n    </div>\n    <div [class.tree-invisible]=\"!treeControl.isExpanded(node)\" role=\"group\">\n      <ng-container matTreeNodeOutlet></ng-container>\n    </div>\n  </mat-nested-tree-node>\n</mat-tree>","import { Component, input, computed} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatGridListModule } from '@angular/material/grid-list';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-grid-list',\n  standalone: true,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatGridListModule],\n  templateUrl: './grid-list.component.html',\n  styleUrl: './grid-list.component.scss'\n})\nexport class GridListComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  // Parse grid items from comma-separated string\n  readonly gridItems = computed(() => {\n    const itemsString = this.getProperty('items') || '';\n    return itemsString.split(',').map((item: string) => item.trim()).filter((item: string) => item.length > 0);\n  });\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'cols',\n        type: 'number',\n        label: 'Columns',\n        category: 'layout',\n        default_value: 2,\n        min: 1,\n        max: 12,\n        step: 1,\n        description: 'Number of columns in the grid',\n        width: 2\n      },\n      {\n        key: 'row_height',\n        type: 'number',\n        label: 'Row Height (px)',\n        category: 'layout',\n        default_value: 100,\n        min: 50,\n        max: 500,\n        step: 10,\n        description: 'Height of each row in pixels',\n        width: 2\n      },\n      {\n        key: 'items',\n        type: 'text',\n        label: 'Grid Items (comma-separated)',\n        category: 'content',\n        default_value: 'Item 1, Item 2, Item 3, Item 4',\n        description: 'Enter grid items separated by commas',\n        width: 'full'\n      }\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      cols: 2,\n      row_height: 100,\n      items: 'Item 1, Item 2, Item 3, Item 4'\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}","<mat-grid-list\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  [cols]=\"getProperty('cols')\"\n  [rowHeight]=\"getProperty('row_height') + 'px'\"\n  >\n  @for (item of gridItems(); track item) {\n    <mat-grid-tile>{{ item }}</mat-grid-tile>\n  }\n</mat-grid-list>","import { ChangeDetectionStrategy, Component, input, computed} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-radio',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatRadioModule],\n  templateUrl: './radio.component.html',\n  styleUrl: './radio.component.scss'\n})\nexport class RadioComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  // Normalize options to a { value, label } list. Two sources are supported:\n  //  - `options`: an array of { label, value } objects (or plain strings),\n  //    e.g. produced by the agent / runtime payloads.\n  //  - `radio_options`: a comma-separated string used by the design-time\n  //    property editor.\n  readonly radioOptions = computed<{ value: any; label: string }[]>(() => {\n    const optionsArray = this.getProperty('options');\n    if (Array.isArray(optionsArray)) {\n      return optionsArray\n        .map((option: any) => {\n          if (option != null && typeof option === 'object') {\n            const value = option.value ?? option.label;\n            return { value, label: String(option.label ?? option.value ?? '') };\n          }\n          return { value: option, label: String(option) };\n        })\n        .filter((option) => option.label.length > 0);\n    }\n\n    const optionsString = this.getProperty('radio_options') || '';\n    return optionsString\n      .split(',')\n      .map((option: string) => option.trim())\n      .filter((option: string) => option.length > 0)\n      .map((value: string) => ({ value, label: value }));\n  });\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'label',\n        type: 'text',\n        label: 'Group Label',\n        category: 'content',\n        default_value: 'Select an option',\n        description: 'Label for the radio group',\n        width: 2\n      },\n      {\n        key: 'radio_options',\n        type: 'text',\n        label: 'Options (comma-separated)',\n        category: 'content',\n        default_value: 'Option 1, Option 2, Option 3',\n        description: 'Enter radio options separated by commas',\n        width: 'full'\n      },\n      {\n        key: 'vertical',\n        type: 'boolean',\n        label: 'Vertical Layout',\n        category: 'layout',\n        default_value: false,\n        description: 'Arrange radio buttons vertically'\n      }\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      label: 'Select an option',\n      radio_options: 'Option 1, Option 2, Option 3',\n      vertical: false\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}","<!--\n  A radio group is NOT a MatFormFieldControl, so it must not be wrapped in\n  <mat-form-field> (that throws \"mat-form-field must contain a\n  MatFormFieldControl\"). Render a plain label + radio group instead.\n-->\n<div class=\"eru-radio-field\" [class]=\"classes()\" [ngStyle]=\"combinedStyles()\">\n  @if (getProperty('label')) {\n    <label class=\"eru-radio-label\">{{ getProperty('label') }}</label>\n  }\n  <mat-radio-group [disabled]=\"isComponentDisabled()\" [class.vertical-layout]=\"getProperty('vertical')\"\n    [value]=\"store.getPageFieldData(getProperty('name'))\" (change)=\"onValueChange($event.value)\">\n    @for (option of radioOptions(); track option.value) {\n    <mat-radio-button [value]=\"option.value\">{{ option.label }}</mat-radio-button>\n    }\n  </mat-radio-group>\n</div>\n","import { ChangeDetectionStrategy, Component, input, computed} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-slider',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatSliderModule, MatFormFieldModule],\n  templateUrl: './slider.component.html',\n  styleUrl: './slider.component.scss'\n})\nexport class SliderComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  private resolveByPath(value: any, path: string): any {\n    if (!path) return value;\n    let obj = value;\n    if (typeof obj === 'string') {\n      try { obj = JSON.parse(obj); } catch { return value; }\n    }\n    if (obj === null || typeof obj !== 'object') return value;\n    const segments = path.replace(/\\[(\\w+)\\]/g, '.$1').split('.').filter(Boolean);\n    let current = obj;\n    for (const segment of segments) {\n      if (current === null || current === undefined) return '';\n      current = current[segment];\n    }\n    return current ?? '';\n  }\n\n  // Resolved slider value from the configured source (static / field / state),\n  // mirroring the text component. Static falls back to the bound field value when\n  // no literal is set and a `name` is bound.\n  readonly resolvedValue = computed(() => {\n    const source = this.getProperty('value_source') || 'static';\n    const valuePath = this.getProperty('value_path') || '';\n\n    if (source === 'state') {\n      const stateKey = this.getProperty('state_key') || this.getProperty('name');\n      if (!stateKey) return '';\n      const pageId = this.component()?.pageId;\n      const dataKey = this.dataKey();\n      const state = pageId ? this.store.getComputedPageStateFor(pageId, dataKey || undefined) : this.store.computedPageState();\n      return this.resolveByPath(state[stateKey] ?? '', valuePath);\n    }\n\n    if (source === 'field') {\n      return this.resolveByPath(this.storeValue() ?? '', valuePath);\n    }\n\n    const value = this.getProperty('value');\n    if ((value === undefined || value === null || value === '') && this.getProperty('name')) {\n      return this.storeValue() ?? '';\n    }\n    return value;\n  });\n\n  readonly sliderValue = computed<number>(() => {\n    const v = this.resolvedValue();\n    const num = typeof v === 'number' ? v : parseFloat(String(v ?? ''));\n    return isFinite(num) ? num : 0;\n  });\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'label',\n        type: 'text',\n        label: 'Label',\n        category: 'content',\n        default_value: 'Slider',\n        description: 'Label for the slider',\n        width: 2\n      },\n      {\n        key: 'value_source',\n        label: 'Value Source',\n        type: 'select',\n        category: 'content',\n        default_value: 'static',\n        options: [\n          { value: 'static', label: 'Static' },\n          { value: 'field', label: 'Page Data Field' },\n          { value: 'state', label: 'Page State' }\n        ]\n      },\n      {\n        key: 'state_key',\n        label: 'State Variable',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_page_state_vars',\n        visible_if: { key: 'value_source', equals: 'state' }\n      },\n      {\n        key: 'value_path',\n        label: 'Value Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        description: 'Dot/bracket path to extract from a JSON value (e.g. data.amount). Leave empty to use the value as is.',\n        visible_if: { key: 'value_source', in: ['field', 'state'] }\n      },\n      {\n        key: 'value',\n        type: 'number',\n        label: 'Value',\n        category: 'content',\n        default_value: 50,\n        min: 0,\n        max: 100,\n        step: 1,\n        description: 'Current value of the slider',\n        width: 2,\n        visible_if: { key: 'value_source', equals: 'static' }\n      },\n      {\n        key: 'min',\n        type: 'number',\n        label: 'Minimum',\n        category: 'content',\n        default_value: 0,\n        min: 0,\n        max: 1000,\n        step: 1,\n        description: 'Minimum value of the slider',\n        width: 2\n      },\n      {\n        key: 'max',\n        type: 'number',\n        label: 'Maximum',\n        category: 'content',\n        default_value: 100,\n        min: 1,\n        max: 1000,\n        step: 1,\n        description: 'Maximum value of the slider',\n        width: 2\n      },\n      {\n        key: 'step',\n        type: 'number',\n        label: 'Step',\n        category: 'content',\n        default_value: 1,\n        min: 0.1,\n        max: 10,\n        step: 0.1,\n        description: 'Step size for the slider',\n        width: 2\n      },\n      {\n        key: 'discrete',\n        type: 'boolean',\n        label: 'Discrete',\n        category: 'behavior',\n        default_value: true,\n        description: 'Show discrete tick marks'\n      }\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      label: 'Slider',\n      value_source: 'static',\n      value: 50,\n      min: 0,\n      max: 100,\n      step: 1,\n      discrete: true\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}","<div\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  >\n  <label>{{ getProperty('label') }}</label>\n  <mat-slider\n    [min]=\"getProperty('min')\"\n    [max]=\"getProperty('max')\"\n    [step]=\"getProperty('step')\"\n    [disabled]=\"isComponentDisabled()\"\n    [discrete]=\"getProperty('discrete')\"\n    [showTickMarks]=\"getProperty('discrete')\">\n    <input matSliderThumb [value]=\"sliderValue()\">\n  </mat-slider>\n</div>","import { ChangeDetectionStrategy, Component, input, computed, signal, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-slide-toggle',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatSlideToggleModule, MatFormFieldModule],\n  templateUrl: './slide-toggle.component.html',\n  styleUrl: './slide-toggle.component.scss'\n})\nexport class SlideToggleComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  override targetElementSelector = '[data-eru-target=\"slide-toggle\"]';\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  /**\n   * Which side of the switch the label sits on, in Material's own terms —\n   * `after` is its default and puts the label on the right, which is why the\n   * label used to have nowhere else to go.\n   */\n  readonly labelPosition = computed<'before' | 'after'>(() =>\n    this.getProperty('label_position') === 'before' ? 'before' : 'after');\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onToggleChange(checked: boolean): void {\n    this.onValueChange(checked);\n    this.resetToDefaultMode();\n  }\n\n  private resetToDefaultMode(): void {\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  // Without this, onValueChange's state-write branch (valueSourceMode()) never\n  // activates for a \"state\"-bound toggle, since it defaults to 'field'.\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  private resolveByPath(value: any, path: string): any {\n    if (!path) return value;\n    let obj = value;\n    if (typeof obj === 'string') {\n      try { obj = JSON.parse(obj); } catch { return value; }\n    }\n    if (obj === null || typeof obj !== 'object') return value;\n    const segments = path.replace(/\\[(\\w+)\\]/g, '.$1').split('.').filter(Boolean);\n    let current = obj;\n    for (const segment of segments) {\n      if (current === null || current === undefined) return '';\n      current = current[segment];\n    }\n    return current ?? '';\n  }\n\n  private toBool(v: any): boolean {\n    if (typeof v === 'boolean') return v;\n    if (typeof v === 'number') return v !== 0;\n    if (typeof v === 'string') {\n      const s = v.trim().toLowerCase();\n      return s === 'true' || s === '1' || s === 'yes' || s === 'on' || s === 'checked';\n    }\n    return !!v;\n  }\n\n  // When `value_true`/`value_false` are configured, the backend may represent\n  // the toggle with arbitrary values (e.g. \"Y\"/\"N\") instead of a real boolean.\n  // Left blank, both fall through to the generic toBool() heuristic.\n  private resolveToggleState(raw: any): boolean {\n    const valueTrue = this.getProperty('value_true');\n    const valueFalse = this.getProperty('value_false');\n    const hasTrue = valueTrue !== undefined && valueTrue !== null && String(valueTrue).length > 0;\n    const hasFalse = valueFalse !== undefined && valueFalse !== null && String(valueFalse).length > 0;\n    if (!hasTrue && !hasFalse) return this.toBool(raw);\n    if (hasTrue && String(raw) === String(valueTrue)) return true;\n    if (hasFalse && String(raw) === String(valueFalse)) return false;\n    if (hasTrue && !hasFalse) return false;\n    if (hasFalse && !hasTrue) return true;\n    return this.toBool(raw);\n  }\n\n  // Inverse of resolveToggleState: maps a UI boolean back to the configured\n  // true/false representation before it's written to page data/state.\n  private toggleValueFor(checked: boolean): any {\n    const valueTrue = this.getProperty('value_true');\n    const valueFalse = this.getProperty('value_false');\n    const hasTrue = valueTrue !== undefined && valueTrue !== null && String(valueTrue).length > 0;\n    const hasFalse = valueFalse !== undefined && valueFalse !== null && String(valueFalse).length > 0;\n    if (!hasTrue && !hasFalse) return checked;\n    if (checked) return hasTrue ? valueTrue : true;\n    return hasFalse ? valueFalse : false;\n  }\n\n  /**\n   * The toggle's own Checked property, read WITHOUT the schema default.\n   *\n   * `getProperty('checked')` substitutes the default `false` whenever nothing is\n   * stored, so \"never configured\" and \"configured off\" were the same value —\n   * which made every fallback below unreachable and is why a configured Default\n   * Value never showed. Reading it raw keeps the two apart.\n   */\n  private readonly explicitChecked = computed(() => {\n    const component = this.component();\n    if (!component) return undefined;\n    const raw = this.getPropertyValue(component, 'checked', undefined);\n    return (raw === undefined || raw === null || raw === '') ? undefined : raw;\n  });\n\n  // Resolved checked state from the configured source (static / field / state),\n  // mirroring the text component. Static prefers an explicit Checked literal,\n  // then the bound field value (preserves card/row behaviour), then the field's\n  // Default Value.\n  readonly resolvedChecked = computed<boolean>(() => {\n    const source = this.getProperty('value_source') || 'static';\n    const valuePath = this.getProperty('value_path') || '';\n\n    if (source === 'state') {\n      const stateKey = this.getProperty('state_key') || this.getProperty('name');\n      if (!stateKey) return false;\n      const pageId = this.component()?.pageId;\n      const dataKey = this.dataKey();\n      const state = pageId ? this.store.getComputedPageStateFor(pageId, dataKey || undefined) : this.store.computedPageState();\n      return this.resolveToggleState(this.resolveByPath(state[stateKey] ?? '', valuePath));\n    }\n\n    if (source === 'field') {\n      const stored = this.resolveByPath(this.storeValue() ?? '', valuePath);\n      if (stored !== undefined && stored !== null && stored !== '') {\n        return this.resolveToggleState(stored);\n      }\n      return this.defaultChecked();\n    }\n\n    const checked = this.explicitChecked();\n    if (checked !== undefined) return this.toBool(checked);\n\n    const stored = this.storeValue();\n    if (stored !== undefined && stored !== null && stored !== '') {\n      return this.resolveToggleState(stored);\n    }\n    return this.defaultChecked();\n  });\n\n  /**\n   * The field's Default Value (or its data-model default), as a boolean.\n   *\n   * Base's seeding effect already writes this into page data — but only for a\n   * field with a Component Name, so a toggle without one has no page-data slot\n   * to be seeded and has to resolve its default here. Resolving it directly also\n   * removes the one-tick flash of \"off\" while that effect runs.\n   */\n  private defaultChecked(): boolean {\n    const def = this.effectiveDefaultValue();\n    if (def === undefined || def === null || def === '') return false;\n    return this.resolveToggleState(def);\n  }\n\n  protected override onValueChange(checked: boolean): void {\n    super.onValueChange(this.toggleValueFor(checked));\n  }\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'label',\n        type: 'text',\n        label: 'Label',\n        category: 'content',\n        default_value: 'Slide Toggle',\n        description: 'Label for the slide toggle',\n        width: 2\n      },\n      {\n        key: 'label_position',\n        type: 'select',\n        label: 'Label Position',\n        category: 'content',\n        default_value: 'after',\n        options: [\n          { value: 'after', label: 'Right' },\n          { value: 'before', label: 'Left' }\n        ],\n        description: 'Which side of the switch the label sits on.',\n        width: 2\n      },\n      {\n        key: 'value_source',\n        label: 'Value Source',\n        type: 'select',\n        category: 'content',\n        default_value: 'static',\n        options: [\n          { value: 'static', label: 'Static' },\n          { value: 'field', label: 'Page Data Field' },\n          { value: 'state', label: 'Page State' }\n        ]\n      },\n      {\n        key: 'state_key',\n        label: 'State Variable',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_page_state_vars',\n        visible_if: { key: 'value_source', equals: 'state' }\n      },\n      {\n        key: 'value_path',\n        label: 'Value Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        description: 'Dot/bracket path to extract from a JSON value (e.g. data.enabled). Leave empty to use the value as is.',\n        visible_if: { key: 'value_source', in: ['field', 'state'] }\n      },\n      {\n        key: 'checked',\n        type: 'boolean',\n        label: 'Checked',\n        category: 'content',\n        default_value: false,\n        description: 'Initial state of the toggle',\n        visible_if: { key: 'value_source', equals: 'static' }\n      },\n      {\n        key: 'value_true',\n        type: 'text',\n        label: 'Value For True',\n        category: 'content',\n        default_value: '',\n        description: 'Backend value that represents \"on\" (e.g. Y, Yes). Leave blank to use true/false.'\n      },\n      {\n        key: 'value_false',\n        type: 'text',\n        label: 'Value For False',\n        category: 'content',\n        default_value: '',\n        description: 'Backend value that represents \"off\" (e.g. N, No). Leave blank to use true/false.'\n      },\n      {\n        key: 'color',\n        type: 'select',\n        label: 'Color',\n        category: 'behavior',\n        default_value: 'primary',\n        options: [\n          { label: 'Primary', value: 'primary' },\n          { label: 'Accent', value: 'accent' },\n          { label: 'Warn', value: 'warn' }\n        ],\n        width: 2\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ],\n        description: 'View renders the toggle read-only until a double-click switches it to edit; Edit keeps it always interactive.'\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view once the value changes.'\n      }\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      label: 'Slide Toggle',\n      label_position: 'after',\n      value_source: 'static',\n      checked: false,\n      value_true: '',\n      value_false: '',\n      color: 'primary',\n      default_mode: 'edit',\n      editable: true\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}","@if (currentMode() === 'edit') {\n<mat-slide-toggle\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  [checked]=\"resolvedChecked()\"\n  [disabled]=\"isComponentDisabled()\"\n  [color]=\"getProperty('color')\"\n  [labelPosition]=\"labelPosition()\"\n  (change)=\"onToggleChange($event.checked)\"\n  eruCanvasEventHandler\n  data-eru-target=\"slide-toggle\">\n  {{ getProperty('label') }}\n</mat-slide-toggle>\n} @else {\n<div\n  [ngStyle]=\"combinedStyles()\"\n  class=\"slide-toggle-display\"\n  [class]=\"classes()\"\n  [class.eru-inline-editable]=\"canInlineEdit()\"\n  (dblclick)=\"onDisplayDoubleClick()\"\n  eruCanvasEventHandler\n  data-eru-target=\"slide-toggle\">\n  <mat-slide-toggle\n    class=\"slide-toggle-readonly\"\n    [checked]=\"resolvedChecked()\"\n    [color]=\"getProperty('color')\"\n    [labelPosition]=\"labelPosition()\"\n    [disableRipple]=\"true\"\n    tabindex=\"-1\">\n    {{ getProperty('label') }}\n  </mat-slide-toggle>\n</div>\n}\n","import { ChangeDetectionStrategy, Component, input, computed} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-autocomplete',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, ReactiveFormsModule, CanvasEventHandlerDirective, MatAutocompleteModule, MatFormFieldModule, MatInputModule],\n  templateUrl: './autocomplete.component.html',\n  styleUrl: './autocomplete.component.scss'\n})\nexport class AutocompleteComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  // Parse options from comma-separated string\n  readonly autocompleteOptions = computed(() => {\n    const optionsString = this.getProperty('autocomplete_options') || '';\n    return optionsString.split(',').map((option: string) => option.trim()).filter((option: string) => option.length > 0);\n  });\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'label',\n        type: 'text',\n        label: 'Label',\n        category: 'content',\n        default_value: 'Autocomplete',\n        description: 'Label for the autocomplete field',\n        width: 2\n      },\n      {\n        key: 'autocomplete_options',\n        type: 'text',\n        label: 'Options (comma-separated)',\n        category: 'content',\n        default_value: 'Apple, Banana, Cherry, Date, Elderberry',\n        description: 'Enter autocomplete options separated by commas',\n        width: 'full'\n      },\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: 'Type to search...',\n        description: 'Placeholder text for the input',\n        width: 2\n      },\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      label: 'Autocomplete',\n      autocomplete_options: 'Apple, Banana, Cherry, Date, Elderberry',\n      placeholder: 'Type to search...'\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}","<mat-form-field\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  >\n  <mat-label>{{ getProperty('label') }}</mat-label>\n  @if (formControl) {\n    <input\n      matInput\n      [placeholder]=\"getProperty('placeholder')\"\n      [disabled]=\"isComponentDisabled()\"\n      [formControl]=\"formControl\"\n      [matAutocomplete]=\"auto\"\n      (input)=\"onValueChange($event.target.value)\"\n      (blur)=\"markControlAsTouched()\">\n  } @else {\n    <input\n      matInput\n      [placeholder]=\"getProperty('placeholder')\"\n      [disabled]=\"isComponentDisabled()\"\n      [value]=\"store.getPageFieldData(getProperty('name')) ?? ''\"\n      [matAutocomplete]=\"auto\"\n      (input)=\"onValueChange($event.target.value)\"\n      (blur)=\"markControlAsTouched()\">\n  }\n  <mat-autocomplete #auto=\"matAutocomplete\">\n    @for (option of autocompleteOptions(); track option) {\n      <mat-option [value]=\"option\">{{ option }}</mat-option>\n    }\n  </mat-autocomplete>\n  @if (validationErrors().length > 0) {\n    <mat-error>{{ validationErrors()[0] }}</mat-error>\n  }\n</mat-form-field>","import { Component, input, computed, signal, effect, untracked, ViewEncapsulation, ViewChild, ElementRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule, FormControl } from '@angular/forms';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { EruComponent, PropertySchema, SelectOption } from '../../../models';\nimport { CanvasEventHandlerDirective } from '../../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../../components/base-component/base-component';\nimport { polyfillCountryFlagEmojis } from 'country-flag-emoji-polyfill';\n\nconst FLAG_FONT_STACK = '\"Twemoji Country Flags\", \"AppColorEmoji\", \"Noto Color Emoji\", \"Segoe UI Emoji\", \"Apple Color Emoji\", \"Twemoji Mozilla\", emoji, sans-serif';\n\n/**\n * Register the \"Twemoji Country Flags\" @font-face, once per page.\n *\n * Chromium on Windows ships no flag glyphs, and the polyfill is what supplies\n * them. It used to run on the first dropdown open, so the flag on the closed\n * trigger — the selected country, the one always on screen — had no font to\n * render with until the user had opened the list once. Every open also appended\n * another <style>. Registering it when the first phone field is constructed is\n * what puts the selected flag on screen at first paint.\n */\nlet flagFontRegistered = false;\nfunction ensureFlagFont(): void {\n  if (flagFontRegistered || typeof document === 'undefined') {\n    return;\n  }\n  flagFontRegistered = true;\n  polyfillCountryFlagEmojis();\n}\n\nfunction iso2ToFlagEmoji(iso2: string): string {\n  const code = iso2?.toUpperCase();\n  if (!code || code.length !== 2) {\n    return '';\n  }\n  const REGIONAL_INDICATOR_A = 0x1f1e6;\n  const first = REGIONAL_INDICATOR_A + code.charCodeAt(0) - 0x41;\n  const second = REGIONAL_INDICATOR_A + code.charCodeAt(1) - 0x41;\n  return String.fromCodePoint(first, second);\n}\n\nfunction supportsFlagEmoji(): boolean {\n  if (typeof document === 'undefined') {\n    return true;\n  }\n  const span = document.createElement('span');\n  span.style.fontFamily = FLAG_FONT_STACK;\n  span.style.position = 'absolute';\n  span.style.opacity = '0';\n  span.style.pointerEvents = 'none';\n  span.textContent = iso2ToFlagEmoji('in');\n  document.body.appendChild(span);\n  const width = span.getBoundingClientRect().width;\n  document.body.removeChild(span);\n  return width > 0.1;\n}\n\ninterface Country {\n  code: string;\n  dialCode: string;\n  flag: string;\n  name: string;\n}\n\nconst COUNTRIES: Country[] = [\n  { code: 'US', dialCode: '+1', flag: '🇺🇸', name: 'United States' },\n  { code: 'GB', dialCode: '+44', flag: '🇬🇧', name: 'United Kingdom' },\n  { code: 'CA', dialCode: '+1', flag: '🇨🇦', name: 'Canada' },\n  { code: 'AU', dialCode: '+61', flag: '🇦🇺', name: 'Australia' },\n  { code: 'IN', dialCode: '+91', flag: '🇮🇳', name: 'India' },\n  { code: 'DE', dialCode: '+49', flag: '🇩🇪', name: 'Germany' },\n  { code: 'FR', dialCode: '+33', flag: '🇫🇷', name: 'France' },\n  { code: 'IT', dialCode: '+39', flag: '🇮🇹', name: 'Italy' },\n  { code: 'ES', dialCode: '+34', flag: '🇪🇸', name: 'Spain' },\n  { code: 'BR', dialCode: '+55', flag: '🇧🇷', name: 'Brazil' },\n  { code: 'MX', dialCode: '+52', flag: '🇲🇽', name: 'Mexico' },\n  { code: 'JP', dialCode: '+81', flag: '🇯🇵', name: 'Japan' },\n  { code: 'CN', dialCode: '+86', flag: '🇨🇳', name: 'China' },\n  { code: 'RU', dialCode: '+7', flag: '🇷🇺', name: 'Russia' },\n  { code: 'KR', dialCode: '+82', flag: '🇰🇷', name: 'South Korea' },\n  { code: 'NL', dialCode: '+31', flag: '🇳🇱', name: 'Netherlands' },\n  { code: 'SE', dialCode: '+46', flag: '🇸🇪', name: 'Sweden' },\n  { code: 'NO', dialCode: '+47', flag: '🇳🇴', name: 'Norway' },\n  { code: 'DK', dialCode: '+45', flag: '🇩🇰', name: 'Denmark' },\n  { code: 'FI', dialCode: '+358', flag: '🇫🇮', name: 'Finland' },\n  { code: 'PL', dialCode: '+48', flag: '🇵🇱', name: 'Poland' },\n  { code: 'TR', dialCode: '+90', flag: '🇹🇷', name: 'Turkey' },\n  { code: 'SA', dialCode: '+966', flag: '🇸🇦', name: 'Saudi Arabia' },\n  { code: 'AE', dialCode: '+971', flag: '🇦🇪', name: 'United Arab Emirates' },\n  { code: 'SG', dialCode: '+65', flag: '🇸🇬', name: 'Singapore' },\n  { code: 'MY', dialCode: '+60', flag: '🇲🇾', name: 'Malaysia' },\n  { code: 'TH', dialCode: '+66', flag: '🇹🇭', name: 'Thailand' },\n  { code: 'ID', dialCode: '+62', flag: '🇮🇩', name: 'Indonesia' },\n  { code: 'PH', dialCode: '+63', flag: '🇵🇭', name: 'Philippines' },\n  { code: 'VN', dialCode: '+84', flag: '🇻🇳', name: 'Vietnam' },\n  { code: 'NZ', dialCode: '+64', flag: '🇳🇿', name: 'New Zealand' },\n  { code: 'ZA', dialCode: '+27', flag: '🇿🇦', name: 'South Africa' },\n  { code: 'EG', dialCode: '+20', flag: '🇪🇬', name: 'Egypt' },\n  { code: 'NG', dialCode: '+234', flag: '🇳🇬', name: 'Nigeria' },\n  { code: 'KE', dialCode: '+254', flag: '🇰🇪', name: 'Kenya' },\n  { code: 'AR', dialCode: '+54', flag: '🇦🇷', name: 'Argentina' },\n  { code: 'CL', dialCode: '+56', flag: '🇨🇱', name: 'Chile' },\n  { code: 'CO', dialCode: '+57', flag: '🇨🇴', name: 'Colombia' },\n  { code: 'PE', dialCode: '+51', flag: '🇵🇪', name: 'Peru' },\n  { code: 'CH', dialCode: '+41', flag: '🇨🇭', name: 'Switzerland' },\n  { code: 'AT', dialCode: '+43', flag: '🇦🇹', name: 'Austria' },\n  { code: 'BE', dialCode: '+32', flag: '🇧🇪', name: 'Belgium' },\n  { code: 'PT', dialCode: '+351', flag: '🇵🇹', name: 'Portugal' },\n  { code: 'GR', dialCode: '+30', flag: '🇬🇷', name: 'Greece' },\n  { code: 'IE', dialCode: '+353', flag: '🇮🇪', name: 'Ireland' },\n  { code: 'CZ', dialCode: '+420', flag: '🇨🇿', name: 'Czech Republic' },\n  { code: 'HU', dialCode: '+36', flag: '🇭🇺', name: 'Hungary' },\n  { code: 'RO', dialCode: '+40', flag: '🇷🇴', name: 'Romania' },\n  { code: 'BG', dialCode: '+359', flag: '🇧🇬', name: 'Bulgaria' },\n  { code: 'HR', dialCode: '+385', flag: '🇭🇷', name: 'Croatia' },\n  { code: 'SK', dialCode: '+421', flag: '🇸🇰', name: 'Slovakia' },\n  { code: 'SI', dialCode: '+386', flag: '🇸🇮', name: 'Slovenia' },\n  { code: 'LT', dialCode: '+370', flag: '🇱🇹', name: 'Lithuania' },\n  { code: 'LV', dialCode: '+371', flag: '🇱🇻', name: 'Latvia' },\n  { code: 'EE', dialCode: '+372', flag: '🇪🇪', name: 'Estonia' },\n  { code: 'IS', dialCode: '+354', flag: '🇮🇸', name: 'Iceland' },\n  { code: 'LU', dialCode: '+352', flag: '🇱🇺', name: 'Luxembourg' },\n  { code: 'MT', dialCode: '+356', flag: '🇲🇹', name: 'Malta' },\n  { code: 'CY', dialCode: '+357', flag: '🇨🇾', name: 'Cyprus' }\n];\n\n@Component({\n  selector: 'eru-phone',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatSelectModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatIconModule\n  ],\n  templateUrl: './phone.component.html',\n  styleUrl: './phone.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class PhoneComponent extends BaseComponent {\n  @ViewChild('phoneContainer', { static: false }) phoneContainer!: ElementRef<HTMLElement>;\n\n  selectedCountry = signal<Country>(COUNTRIES[0]);\n  phoneNumber = signal<string>('');\n  countrySearchText = signal<string>('');\n  phoneNumberControl = new FormControl('');\n  private readonly flagEmojiSupported = supportsFlagEmoji();\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly countries = COUNTRIES;\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  readonly displayValue = computed(() => {\n    const number = this.phoneNumber();\n    if (!number) return '';\n    return `${this.selectedCountry().dialCode} ${number}`;\n  });\n\n  // Resolve the allowed country list from the `allowed_country_codes` property.\n  // Comma-separated ISO-2 codes (e.g. \"IN,US,GB\"). Blank or absent means\n  // \"show all countries\".\n  readonly allowedCountries = computed(() => {\n    const raw = this.getProperty('allowed_country_codes');\n    const codes = (typeof raw === 'string' ? raw : '')\n      .split(',')\n      .map((c: string) => c.trim().toUpperCase())\n      .filter((c: string) => c.length > 0);\n    if (codes.length === 0) return COUNTRIES;\n    const set = new Set(codes);\n    return COUNTRIES.filter(c => set.has(c.code.toUpperCase()));\n  });\n\n  readonly filteredCountries = computed(() => {\n    const allowed = this.allowedCountries();\n    const search = this.countrySearchText().toLowerCase();\n    if (!search) return allowed;\n    return allowed.filter(country =>\n      country.name.toLowerCase().includes(search) ||\n      country.dialCode.toLowerCase().includes(search) ||\n      country.code.toLowerCase().includes(search)\n    );\n  });\n\n  readonly fullPhoneValue = computed(() => {\n    const country = this.selectedCountry();\n    const number = this.phoneNumber();\n    if (!number) return '';\n    return `${country.dialCode}${number}`;\n  });\n\n  displayFlag(country: Country): string {\n    if (this.flagEmojiSupported) {\n      return country.flag || iso2ToFlagEmoji(country.code);\n    }\n    return `[${country.code.toUpperCase()}]`;\n  }\n\n\n  onCountryChange(countryCode: string): void {\n    const allowed = this.allowedCountries();\n    const country = allowed.find(c => c.code === countryCode) || allowed[0] || COUNTRIES[0];\n    this.selectedCountry.set(country);\n    this.updatePhoneValue();\n  }\n\n  onCountrySearchChange(searchValue: string): void {\n    this.countrySearchText.set(searchValue);\n  }\n\n  onCountrySelectOpenedChange(opened: boolean): void {\n    this.countrySearchText.set('');\n    // The flag font is registered at construction and applied by the stylesheet,\n    // so opening the panel only has to size it.\n    if (opened && this.phoneContainer) {\n      setTimeout(() => {\n        const panel = document.querySelector('.eru-country-select-panel') as HTMLElement;\n        if (panel) {\n          panel.style.width = `100%`;\n        }\n      }, 0);\n    }\n  }\n\n  private updatePhoneValue(): void {\n    const fullValue = this.fullPhoneValue();\n    if (this.formControl && this.formControl.value !== fullValue) {\n      this.formControl.setValue(fullValue, { emitEvent: false });\n    }\n    this.onValueChange(fullValue);\n  }\n\n  constructor() {\n    super();\n    ensureFlagFont();\n\n    // The component mode follows its own `default_mode` property, independent\n    // of the designer's edit/view toggle. Runtime double-click / blur can\n    // override `_mode` until the property changes again.\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n\n    // Snap selectedCountry to an allowed country whenever the allowed list\n    // changes (or initial mount with a non-default allowed list).\n    effect(() => {\n      const allowed = this.allowedCountries();\n      if (allowed.length === 0) return;\n      const cur = this.selectedCountry();\n      if (!allowed.some(c => c.code === cur.code)) {\n        untracked(() => {\n          this.selectedCountry.set(allowed[0]);\n          this.updatePhoneValue();\n        });\n      }\n    });\n\n    effect(() => {\n      const formControlValue = this.formControl?.value;\n      const storeValue = this.store.getPageFieldData(this.getProperty('name'));\n      const storedValue = formControlValue || storeValue || '';\n      const currentValue = this.fullPhoneValue();\n\n      if (storedValue && storedValue !== currentValue) {\n        this.parsePhoneValue(storedValue);\n      }\n    });\n\n    effect(() => {\n      const isDisabled = this.isComponentDisabled();\n      if (this.formControl) {\n        if (isDisabled && this.formControl.enabled) {\n          this.formControl.disable({ emitEvent: false });\n        } else if (!isDisabled && this.formControl.disabled) {\n          this.formControl.enable({ emitEvent: false });\n        }\n      }\n      if (isDisabled && this.phoneNumberControl.enabled) {\n        this.phoneNumberControl.disable({ emitEvent: false });\n      } else if (!isDisabled && this.phoneNumberControl.disabled) {\n        this.phoneNumberControl.enable({ emitEvent: false });\n      }\n    });\n\n    const subscription = this.phoneNumberControl.valueChanges.subscribe(value => {\n      if (value !== null && value !== undefined) {\n        this.phoneNumber.set(value);\n        this.updatePhoneValue();\n      }\n    });\n\n    effect(() => {\n      const currentPhoneNumber = this.phoneNumber();\n      if (this.phoneNumberControl.value !== currentPhoneNumber) {\n        this.phoneNumberControl.setValue(currentPhoneNumber, { emitEvent: false });\n      }\n    });\n\n    effect((onCleanup) => {\n      onCleanup(() => subscription.unsubscribe());\n    });\n  }\n\n  override ngOnInit(): void {\n    super.ngOnInit();\n\n    const storedValue = this.formControl?.value || this.store.getPageFieldData(this.getProperty('name')) || '';\n    if (storedValue) {\n      this.parsePhoneValue(storedValue);\n    }\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onPhoneBlur(): void {\n    this.markControlAsTouched();\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  onPhoneKeyPress(event: KeyboardEvent): void {\n    if (event.ctrlKey || event.metaKey || event.altKey) return;\n    if (event.key.length === 1 && !/[0-9]/.test(event.key)) {\n      event.preventDefault();\n    }\n  }\n\n  onPhoneInput(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    const cleaned = (input.value || '').replace(/\\D/g, '');\n    if (input.value !== cleaned) {\n      input.value = cleaned;\n      this.phoneNumberControl.setValue(cleaned, { emitEvent: true });\n    }\n  }\n\n  onPhonePaste(event: ClipboardEvent): void {\n    event.preventDefault();\n    const text = event.clipboardData?.getData('text') || '';\n    const cleaned = text.replace(/\\D/g, '');\n    if (!cleaned) return;\n    const input = event.target as HTMLInputElement;\n    const start = input.selectionStart ?? input.value.length;\n    const end = input.selectionEnd ?? input.value.length;\n    const next = (input.value.slice(0, start) + cleaned + input.value.slice(end));\n    this.phoneNumberControl.setValue(next, { emitEvent: true });\n  }\n\n  private parsePhoneValue(value: string): void {\n    for (const country of COUNTRIES) {\n      if (value.startsWith(country.dialCode)) {\n        this.selectedCountry.set(country);\n        this.phoneNumber.set(value.substring(country.dialCode.length));\n        break;\n      }\n    }\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: 'Enter phone number',\n        width: 2\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'allowed_country_codes',\n        type: 'text',\n        label: 'Allowed Country Codes',\n        category: 'behavior',\n        default_value: '',\n        description: 'Comma-separated ISO-2 country codes (e.g. \"IN,US,GB\"). Leave blank to allow all countries.',\n        width: 2\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view (on blur).'\n      },\n    ];\n  }\n}\n\n","<div [ngStyle]=\"combinedStyles()\">\n  @if (currentMode() === 'view') {\n  <div\n    class=\"eru-phone-display\"\n    [class]=\"classes()\"\n    [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\"\n    eruCanvasEventHandler\n    data-eru-target=\"phone-display\">\n    @if (getProperty('label')) {\n      <span class=\"eru-display-label phone-display-label\">{{ getProperty('label') }}</span>\n    }\n    @if (phoneNumber()) {\n      <span class=\"phone-display-value\" [ngStyle]=\"displayValueStyles()\">\n        <span class=\"eru-country-flag\">{{ displayFlag(selectedCountry()) }}</span>\n        <span class=\"phone-display-number\">{{ selectedCountry().dialCode }} {{ phoneNumber() }}</span>\n      </span>\n    } @else {\n      <span class=\"phone-display-empty\">&mdash;</span>\n    }\n  </div>\n  } @else {\n  <mat-form-field\n    [appearance]=\"getProperty('appearance')\"\n    [class]=\"classes()\"\n    class=\"eru-phone-form-field\"\n    eruCanvasEventHandler\n    (click)=\"$event.stopPropagation()\"\n    (mousedown)=\"$event.stopPropagation()\">\n    <mat-label>{{ getProperty('label') }}</mat-label>\n    <div class=\"eru-phone-input-container\" #phoneContainer>\n      <mat-select\n        class=\"eru-country-select\"\n        panelClass=\"eru-country-select-panel\"\n        [value]=\"selectedCountry().code\"\n        [disabled]=\"formControl?.disabled ?? isComponentDisabled()\"\n        (selectionChange)=\"onCountryChange($event.value)\"\n        (openedChange)=\"onCountrySelectOpenedChange($event)\"\n        (click)=\"$event.stopPropagation()\"\n        data-eru-target=\"country-select\"\n        data-eru-click-target=\"country-select\">\n        <mat-select-trigger>\n          <span class=\"eru-country-option\">\n            <span class=\"eru-country-flag\">{{ displayFlag(selectedCountry()) }}</span>\n            <span class=\"eru-country-dial-code\">{{ selectedCountry().dialCode }}</span>\n          </span>\n        </mat-select-trigger>\n        <mat-option disabled class=\"eru-search-option\">\n          <mat-form-field\n            [appearance]=\"'outline'\"\n            class=\"eru-search-form-field\">\n            <mat-label>Search</mat-label>\n            <input\n              matInput\n              type=\"text\"\n              class=\"eru-search-input\"\n              placeholder=\"filter options...\"\n              [value]=\"countrySearchText()\"\n              (input)=\"onCountrySearchChange($any($event.target).value)\"\n              (click)=\"$event.stopPropagation()\"\n              (keydown)=\"$event.stopPropagation()\">\n          </mat-form-field>\n        </mat-option>\n        @for (country of filteredCountries(); track country.code) {\n          <mat-option [value]=\"country.code\">\n            <span class=\"eru-country-option\">\n              <span class=\"eru-country-flag\">{{ displayFlag(country) }}</span>\n              <span class=\"eru-country-dial-code\">{{ country.dialCode }}</span>\n            </span>\n          </mat-option>\n        }\n      </mat-select>\n      <input\n        matInput\n        type=\"tel\"\n        inputmode=\"numeric\"\n        pattern=\"[0-9]*\"\n        class=\"eru-phone-input\"\n        [placeholder]=\"getProperty('placeholder')\"\n        [required]=\"hasRequiredValidation()\"\n        [formControl]=\"phoneNumberControl\"\n        (click)=\"$event.stopPropagation()\"\n        (blur)=\"onPhoneBlur()\"\n        (keypress)=\"onPhoneKeyPress($event)\"\n        (input)=\"onPhoneInput($event)\"\n        (paste)=\"onPhonePaste($event)\"\n        data-eru-target=\"phone-input\"\n        data-eru-focus-target=\"phone-input\"\n        data-eru-blur-target=\"phone-input\"\n        data-eru-click-target=\"phone-input\">\n    </div>\n    @if (validationErrors().length > 0) {\n      <mat-error>{{ validationErrors()[0] }}</mat-error>\n    }\n  </mat-form-field>\n  }\n</div>\n\n","/**\n * Shared shape for the item lists authored in the property panel by the\n * `menu_items` and `toolbar_items` editors, and read back by the menu and\n * toolbar components.\n *\n * Nesting is carried by `level` rather than by nested arrays: the property\n * panel is one narrow column, so a flat list with indent / outdent buttons is\n * what an author can actually edit. `buildItemTree` turns it back into the\n * tree the templates render.\n */\nexport interface MenuItemDef {\n  id: string;\n  kind: string;\n  label?: string;\n  icon?: string;\n  value?: string;\n  level?: number;\n  disabled?: boolean;\n  role?: 'menuitem' | 'menuitemradio' | 'menuitemcheckbox';\n  variant?: string;\n  color?: string;\n  tooltip?: string;\n  row?: number;\n  visible_if?: string;\n  [key: string]: any;\n}\n\nexport interface MenuItemNode extends MenuItemDef {\n  children: MenuItemNode[];\n}\n\n/** Kinds that are separators rather than entries, so never hold children. */\nexport const STRUCTURAL_ITEM_KINDS = ['divider', 'spacer'];\n\n/** Item lists are stored as arrays, but a page hand-edited as JSON — or one\n *  round-tripped through a textarea — can hold the string form. */\nexport function parseMenuItems(raw: any): MenuItemDef[] {\n  if (!raw) return [];\n  let list: any = raw;\n  if (typeof raw === 'string') {\n    try {\n      list = JSON.parse(raw);\n    } catch {\n      return [];\n    }\n  }\n  if (!Array.isArray(list)) return [];\n  return list\n    .filter(item => item && typeof item === 'object')\n    .map((item, index) => ({\n      ...item,\n      id: String(item.id ?? `item_${index}`),\n      kind: String(item.kind ?? 'item'),\n      level: Math.max(0, Number(item.level ?? 0) || 0)\n    }));\n}\n\n/**\n * Rebuild the tree from `level`. An item deeper than the one before it becomes\n * that item's child; a level that skips ahead is clamped to one below its\n * parent, so a list an author indented too far still renders rather than\n * dropping items on the floor.\n */\nexport function buildItemTree(items: MenuItemDef[]): MenuItemNode[] {\n  const roots: MenuItemNode[] = [];\n  const stack: MenuItemNode[] = [];\n\n  for (const item of items) {\n    const node: MenuItemNode = { ...item, children: [] };\n    const level = Math.min(Math.max(0, node.level ?? 0), stack.length);\n    stack.length = level;\n    if (level === 0) {\n      roots.push(node);\n    } else {\n      stack[level - 1].children.push(node);\n    }\n    // A separator is never a parent: nothing renders inside a divider, so an\n    // item indented under one would vanish rather than move.\n    if (!STRUCTURAL_ITEM_KINDS.includes(node.kind)) {\n      stack.push(node);\n    }\n  }\n\n  return roots;\n}\n","import { ChangeDetectionStrategy, Component, ViewChild, input, output } from '@angular/core';\nimport { MatMenu, MatMenuModule } from '@angular/material/menu';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MenuItemNode } from '../../utils/menu-item.util';\n\n/**\n * One `mat-menu` panel built from an item tree, recursing into itself for\n * submenus. Shared by `eru-menu` and `eru-toolbar` — neither is registered as\n * a palette component, this is the renderer both of them point a trigger at.\n *\n * The panel is exposed as `menu` so a trigger can bind\n * `[matMenuTriggerFor]=\"panel.menu\"`.\n */\n@Component({\n  selector: 'eru-menu-panel',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MatMenuModule, MatIconModule, MatDividerModule],\n  template: `\n    <mat-menu\n      [xPosition]=\"xPosition()\"\n      [yPosition]=\"yPosition()\"\n      [overlapTrigger]=\"overlapTrigger()\"\n      [hasBackdrop]=\"hasBackdrop()\"\n      [backdropClass]=\"backdropClass()\"\n      [class]=\"panelClass()\"\n      [attr.aria-label]=\"ariaLabel() || null\">\n      @for (item of items(); track item.id) {\n        @if (item.kind === 'divider') {\n          <mat-divider />\n        } @else if (item.children.length > 0) {\n          <button mat-menu-item\n            [matMenuTriggerFor]=\"submenu.menu\"\n            [disabled]=\"!!item.disabled\"\n            [disableRipple]=\"disableRipple()\"\n            [role]=\"item.role || 'menuitem'\">\n            @if (item.icon) { <mat-icon>{{ item.icon }}</mat-icon> }\n            <span>{{ item.label }}</span>\n          </button>\n          <eru-menu-panel #submenu\n            [items]=\"item.children\"\n            [xPosition]=\"xPosition()\"\n            [yPosition]=\"yPosition()\"\n            [overlapTrigger]=\"overlapTrigger()\"\n            [hasBackdrop]=\"hasBackdrop()\"\n            [backdropClass]=\"backdropClass()\"\n            [panelClass]=\"panelClass()\"\n            [disableRipple]=\"disableRipple()\"\n            (itemSelect)=\"itemSelect.emit($event)\" />\n        } @else {\n          <button mat-menu-item\n            [disabled]=\"!!item.disabled\"\n            [disableRipple]=\"disableRipple()\"\n            [role]=\"item.role || 'menuitem'\"\n            (click)=\"itemSelect.emit(item)\">\n            @if (item.icon) { <mat-icon>{{ item.icon }}</mat-icon> }\n            <span>{{ item.label }}</span>\n          </button>\n        }\n      }\n    </mat-menu>\n  `\n})\nexport class MenuPanelComponent {\n  readonly items = input<MenuItemNode[]>([]);\n  readonly xPosition = input<'before' | 'after'>('after');\n  readonly yPosition = input<'above' | 'below'>('below');\n  readonly overlapTrigger = input<boolean>(false);\n  readonly hasBackdrop = input<boolean | undefined>(undefined);\n  readonly backdropClass = input<string>('');\n  readonly panelClass = input<string>('');\n  readonly disableRipple = input<boolean>(false);\n  readonly ariaLabel = input<string>('');\n\n  readonly itemSelect = output<MenuItemNode>();\n\n  /**\n   * Static: the trigger that opens this panel binds to it in the same change\n   * detection pass the panel is created in, and a deferred query would hand\n   * that binding `undefined` first and change it mid-pass.\n   */\n  @ViewChild(MatMenu, { static: true }) menu!: MatMenu;\n}\n","import { ChangeDetectionStrategy, Component, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { MenuItemDef, MenuItemNode, buildItemTree, parseMenuItems } from '../../utils/menu-item.util';\nimport { MenuPanelComponent } from '../menu/menu-panel.component';\n\ninterface ToolbarRow {\n  row: number;\n  items: MenuItemNode[];\n}\n\n/**\n * A `mat-toolbar` whose contents are authored from the property panel: titles,\n * text, buttons, icon buttons, menus, spacers and dividers, in the order the\n * `toolbar_items` editor lists them. Indenting a row under a Menu item makes\n * it an entry of that menu.\n *\n * Every control emits the one `toolbar_action` event, carrying the item that\n * was pressed — the same shape `nav_menu` uses for its selection — so an\n * author wires one handler and switches on the value.\n */\n@Component({\n  selector: 'eru-toolbar',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    MatToolbarModule,\n    MatButtonModule,\n    MatIconModule,\n    MatMenuModule,\n    MatDividerModule,\n    MatTooltipModule,\n    CanvasEventHandlerDirective,\n    MenuPanelComponent\n  ],\n  templateUrl: './toolbar.component.html',\n  styleUrl: './toolbar.component.scss'\n})\nexport class ToolbarComponent extends BaseComponent {\n  override componentEvents = [\n    { label: 'On Toolbar Action', value: 'toolbar_action' }\n  ];\n\n  /**\n   * Top-level items with their menu entries attached. Anything an author\n   * indented rows under opens a menu, whatever kind they picked for it — the\n   * alternative is entries that exist in the editor and render nowhere.\n   */\n  readonly items = computed<MenuItemNode[]>(() =>\n    buildItemTree(this.visibleItems(parseMenuItems(this.getProperty('items'))))\n      .map(item => (item.children.length > 0 && item.kind !== 'menu')\n        ? { ...item, kind: 'menu' }\n        : item)\n  );\n\n  /**\n   * Items grouped into `mat-toolbar-row`s. Material throws when direct content\n   * and rows are mixed, so a multi-row toolbar puts EVERY item in a row —\n   * including the ones an author left without a row number, which land on\n   * row 1.\n   */\n  readonly rows = computed<ToolbarRow[]>(() => {\n    const order: number[] = [];\n    const buckets = new Map<number, MenuItemNode[]>();\n    for (const item of this.items()) {\n      const row = Math.max(1, Number(item.row ?? 1) || 1);\n      if (!buckets.has(row)) {\n        buckets.set(row, []);\n        order.push(row);\n      }\n      buckets.get(row)!.push(item);\n    }\n    return order\n      .sort((a, b) => a - b)\n      .map(row => ({ row, items: buckets.get(row)! }));\n  });\n\n  readonly colorClass = computed<string>(() => {\n    const color = this.getProperty('color');\n    return color ? `eru-color-${color}` : '';\n  });\n\n  itemColorClass(item: MenuItemNode): string {\n    return item.color ? `eru-color-${item.color}` : '';\n  }\n\n  itemAppearance(item: MenuItemNode): 'text' | 'filled' | 'elevated' | 'outlined' | 'tonal' {\n    return (item.variant as any) || 'text';\n  }\n\n  /** See `menu`: `visible_if` is evaluated fail-closed. */\n  private visibleItems(items: MenuItemDef[]): MenuItemDef[] {\n    if (this.store.editMode()) return items;\n    const component = this.component();\n    return items.filter(item => {\n      const expression = String(item?.visible_if ?? '').trim();\n      if (!expression) return true;\n      return this.logicEvaluator.evaluateStrict(\n        expression,\n        component?.pageId,\n        component?.id,\n        this.dataKey(),\n      ) === true;\n    });\n  }\n\n  onItemAction(item: MenuItemNode): void {\n    const { children, ...rest } = item;\n    this.emitEvent('toolbar_action', { value: item.value || item.id }, undefined, {\n      context: { toolbar_item: { ...rest } }\n    });\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'items',\n        type: 'toolbar_items',\n        label: 'Toolbar Items',\n        category: 'content',\n        default_value: [\n          { id: 'item_1', kind: 'title', label: 'Toolbar', level: 0 },\n          { id: 'item_2', kind: 'spacer', level: 0 },\n          { id: 'item_3', kind: 'button', label: 'Save', icon: 'save', value: 'save', variant: 'filled', level: 0 },\n          { id: 'item_4', kind: 'menu', label: 'More', icon: 'more_vert', value: 'more', level: 0 },\n          { id: 'item_5', kind: 'item', label: 'Export', icon: 'download', value: 'export', level: 1 },\n          { id: 'item_6', kind: 'item', label: 'Print', icon: 'print', value: 'print', level: 1 }\n        ],\n        description: 'Indent an item (→) under a Menu to make it an entry of that menu.',\n        width: 'full'\n      },\n      {\n        key: 'multi_row',\n        type: 'boolean',\n        label: 'Multi Row',\n        category: 'layout',\n        default_value: false,\n        description: 'Lay the toolbar out as mat-toolbar-rows, using each item\\'s row number.'\n      },\n      {\n        key: 'color',\n        type: 'select',\n        label: 'Colour',\n        category: 'layout',\n        default_value: '',\n        options: [\n          { label: 'Default', value: '' },\n          { label: 'Primary', value: 'primary' },\n          { label: 'Accent', value: 'accent' },\n          { label: 'Warn', value: 'warn' }\n        ],\n        description: 'Applied through the theme tokens — Material\\'s own color input has no effect under M3.'\n      },\n      {\n        key: 'sticky',\n        type: 'boolean',\n        label: 'Stick To Top',\n        category: 'layout',\n        default_value: false,\n        description: 'Keep the toolbar in view while the page behind it scrolls.'\n      },\n      {\n        key: 'dense',\n        type: 'boolean',\n        label: 'Dense',\n        category: 'layout',\n        default_value: false,\n        description: 'Shorter toolbar, for a secondary bar above a table or a form.'\n      },\n      {\n        key: 'menu_x_position',\n        type: 'select',\n        label: 'Menu X Position',\n        category: 'layout',\n        default_value: 'after',\n        options: [\n          { label: 'After', value: 'after' },\n          { label: 'Before', value: 'before' }\n        ]\n      },\n      {\n        key: 'menu_y_position',\n        type: 'select',\n        label: 'Menu Y Position',\n        category: 'layout',\n        default_value: 'below',\n        options: [\n          { label: 'Below', value: 'below' },\n          { label: 'Above', value: 'above' }\n        ]\n      },\n      {\n        key: 'menu_overlap_trigger',\n        type: 'boolean',\n        label: 'Menus Overlap Trigger',\n        category: 'layout',\n        default_value: false\n      },\n      {\n        key: 'menu_panel_class',\n        type: 'text',\n        label: 'Menu Panel Class',\n        category: 'layout',\n        default_value: ''\n      },\n      {\n        key: 'disable_ripple',\n        type: 'boolean',\n        label: 'Disable Ripple',\n        category: 'behavior',\n        default_value: false\n      },\n      {\n        key: 'aria_label',\n        type: 'text',\n        label: 'Aria Label',\n        category: 'behavior',\n        default_value: ''\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      items: [\n        { id: 'item_1', kind: 'title', label: 'Toolbar', level: 0 },\n        { id: 'item_2', kind: 'spacer', level: 0 },\n        { id: 'item_3', kind: 'button', label: 'Save', icon: 'save', value: 'save', variant: 'filled', level: 0 },\n        { id: 'item_4', kind: 'menu', label: 'More', icon: 'more_vert', value: 'more', level: 0 },\n        { id: 'item_5', kind: 'item', label: 'Export', icon: 'download', value: 'export', level: 1 },\n        { id: 'item_6', kind: 'item', label: 'Print', icon: 'print', value: 'print', level: 1 }\n      ],\n      multi_row: false,\n      color: '',\n      sticky: false,\n      dense: false,\n      menu_x_position: 'after',\n      menu_y_position: 'below',\n      menu_overlap_trigger: false,\n      menu_panel_class: '',\n      disable_ripple: false,\n      aria_label: ''\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 0,\n      padding: 0\n    };\n  }\n}\n","<mat-toolbar\n  [class]=\"classes() + ' eru-toolbar ' + colorClass()\"\n  [class.eru-toolbar--sticky]=\"getProperty('sticky')\"\n  [class.eru-toolbar--dense]=\"getProperty('dense')\"\n  [ngStyle]=\"combinedStyles()\"\n  [attr.aria-label]=\"getProperty('aria_label') || null\"\n  eruCanvasEventHandler>\n\n  @if (getProperty('multi_row')) {\n    @for (row of rows(); track row.row) {\n      <mat-toolbar-row>\n        <ng-container *ngTemplateOutlet=\"toolbarItems; context: { $implicit: row.items }\" />\n      </mat-toolbar-row>\n    }\n  } @else {\n    <ng-container *ngTemplateOutlet=\"toolbarItems; context: { $implicit: items() }\" />\n  }\n\n</mat-toolbar>\n\n<ng-template #toolbarItems let-list>\n  @for (item of list; track item.id) {\n    @switch (item.kind) {\n\n      @case ('spacer') {\n        <span class=\"eru-toolbar-spacer\"></span>\n      }\n\n      @case ('divider') {\n        <span class=\"eru-toolbar-divider\"></span>\n      }\n\n      @case ('title') {\n        <span class=\"eru-toolbar-title\">\n          @if (item.icon) { <mat-icon class=\"eru-toolbar-title-icon\">{{ item.icon }}</mat-icon> }\n          {{ item.label }}\n        </span>\n      }\n\n      @case ('text') {\n        <span class=\"eru-toolbar-text\">\n          @if (item.icon) { <mat-icon class=\"eru-toolbar-title-icon\">{{ item.icon }}</mat-icon> }\n          {{ item.label }}\n        </span>\n      }\n\n      @case ('icon_button') {\n        <button matIconButton\n          [class]=\"itemColorClass(item)\"\n          [disabled]=\"isComponentDisabled() || !!item.disabled\"\n          [disableRipple]=\"getProperty('disable_ripple')\"\n          [matTooltip]=\"item.tooltip || ''\"\n          [matTooltipDisabled]=\"!item.tooltip\"\n          [attr.aria-label]=\"item.label || item.tooltip || null\"\n          (click)=\"onItemAction(item)\">\n          <mat-icon>{{ item.icon || 'more_horiz' }}</mat-icon>\n        </button>\n      }\n\n      @case ('menu') {\n        @if (item.icon && !item.label) {\n          <button matIconButton\n            [class]=\"itemColorClass(item)\"\n            [matMenuTriggerFor]=\"store.editMode() ? null : menuPanel.menu\"\n            [disabled]=\"isComponentDisabled() || !!item.disabled\"\n            [disableRipple]=\"getProperty('disable_ripple')\"\n            [matTooltip]=\"item.tooltip || ''\"\n            [matTooltipDisabled]=\"!item.tooltip\"\n            [attr.aria-label]=\"item.tooltip || 'Menu'\">\n            <mat-icon>{{ item.icon }}</mat-icon>\n          </button>\n        } @else {\n          <button [matButton]=\"itemAppearance(item)\"\n            [class]=\"itemColorClass(item)\"\n            [matMenuTriggerFor]=\"store.editMode() ? null : menuPanel.menu\"\n            [disabled]=\"isComponentDisabled() || !!item.disabled\"\n            [disableRipple]=\"getProperty('disable_ripple')\"\n            [matTooltip]=\"item.tooltip || ''\"\n            [matTooltipDisabled]=\"!item.tooltip\">\n            @if (item.icon) { <mat-icon>{{ item.icon }}</mat-icon> }\n            {{ item.label }}\n            <mat-icon iconPositionEnd>arrow_drop_down</mat-icon>\n          </button>\n        }\n        <eru-menu-panel #menuPanel\n          [items]=\"item.children\"\n          [xPosition]=\"getProperty('menu_x_position')\"\n          [yPosition]=\"getProperty('menu_y_position')\"\n          [overlapTrigger]=\"getProperty('menu_overlap_trigger')\"\n          [panelClass]=\"getProperty('menu_panel_class')\"\n          [disableRipple]=\"getProperty('disable_ripple')\"\n          (itemSelect)=\"onItemAction($event)\" />\n      }\n\n      @default {\n        <button [matButton]=\"itemAppearance(item)\"\n          [class]=\"itemColorClass(item)\"\n          [disabled]=\"isComponentDisabled() || !!item.disabled\"\n          [disableRipple]=\"getProperty('disable_ripple')\"\n          [matTooltip]=\"item.tooltip || ''\"\n          [matTooltipDisabled]=\"!item.tooltip\"\n          (click)=\"onItemAction(item)\">\n          @if (item.icon) { <mat-icon>{{ item.icon }}</mat-icon> }\n          {{ item.label }}\n        </button>\n      }\n\n    }\n  } @empty {\n    @if (store.editMode()) {\n      <span class=\"eru-toolbar-empty\">Toolbar — add items in Properties</span>\n    }\n  }\n</ng-template>\n","import { ChangeDetectionStrategy, Component, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { MenuItemDef, MenuItemNode, buildItemTree, parseMenuItems } from '../../utils/menu-item.util';\nimport { MenuPanelComponent } from './menu-panel.component';\n\n/**\n * A `mat-menu` and the control that opens it, both authored from the property\n * panel: items come from the `menu_items` editor, where indenting a row makes\n * it a submenu entry.\n *\n * On the canvas the overlay is left shut and the items are listed inline\n * instead — an author has to see what they are editing, and an overlay would\n * cover the component being selected.\n */\n@Component({\n  selector: 'eru-menu',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    MatMenuModule,\n    MatButtonModule,\n    MatIconModule,\n    MatTooltipModule,\n    CanvasEventHandlerDirective,\n    MenuPanelComponent\n  ],\n  templateUrl: './menu.component.html',\n  styleUrl: './menu.component.scss'\n})\nexport class MenuComponent extends BaseComponent {\n  override componentEvents = [\n    { label: 'On Menu Item Select', value: 'menu_item_select' },\n    { label: 'On Menu Open', value: 'menu_opened' },\n    { label: 'On Menu Close', value: 'menu_closed' }\n  ];\n\n  readonly openMode = computed<string>(() => this.getProperty('open_mode') || 'click');\n\n  readonly triggerAppearance = computed<'text' | 'filled' | 'elevated' | 'outlined' | 'tonal'>(\n    () => this.getProperty('trigger_variant') || 'text'\n  );\n\n  /** Material's `color` input is M2-only; the studio theme is M3, so the\n   *  choice is carried by a class that overrides the button's M3 tokens. */\n  readonly triggerColorClass = computed<string>(() => {\n    const color = this.getProperty('trigger_color');\n    return color ? `eru-color-${color}` : '';\n  });\n\n  readonly items = computed<MenuItemNode[]>(() =>\n    buildItemTree(this.visibleItems(parseMenuItems(this.getProperty('items'))))\n  );\n\n  /** Flattened items behind the canvas preview, indent included. */\n  readonly previewItems = computed<MenuItemDef[]>(() =>\n    this.visibleItems(parseMenuItems(this.getProperty('items')))\n  );\n\n  /**\n   * `visible_if` is evaluated FAIL-CLOSED, as in `nav_menu`: an expression that\n   * throws or cannot be resolved hides the item. The shared evaluator resolves\n   * errors to `true` so a mis-typed layout condition does not blank a page, but\n   * an item an author meant to hide must not appear because its condition was\n   * mis-typed.\n   */\n  private visibleItems(items: MenuItemDef[]): MenuItemDef[] {\n    if (this.store.editMode()) return items;\n    const component = this.component();\n    return items.filter(item => {\n      const expression = String(item?.visible_if ?? '').trim();\n      if (!expression) return true;\n      return this.logicEvaluator.evaluateStrict(\n        expression,\n        component?.pageId,\n        component?.id,\n        this.dataKey(),\n      ) === true;\n    });\n  }\n\n  onItemSelect(item: MenuItemNode): void {\n    const { children, ...rest } = item;\n    this.emitEvent('menu_item_select', { value: item.value || item.id }, undefined, {\n      context: { menu_item: { ...rest } }\n    });\n  }\n\n  onMenuOpened(): void {\n    this.emitEvent('menu_opened', { value: this.component()?.id });\n  }\n\n  onMenuClosed(): void {\n    this.emitEvent('menu_closed', { value: this.component()?.id });\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'items',\n        type: 'menu_items',\n        label: 'Menu Items',\n        category: 'content',\n        default_value: [\n          { id: 'item_1', kind: 'item', label: 'Edit', icon: 'edit', value: 'edit', level: 0 },\n          { id: 'item_2', kind: 'item', label: 'Duplicate', icon: 'content_copy', value: 'duplicate', level: 0 },\n          { id: 'item_3', kind: 'divider', level: 0 },\n          { id: 'item_4', kind: 'item', label: 'Delete', icon: 'delete', value: 'delete', level: 0 }\n        ],\n        description: 'Indent an item (→) to make it a submenu entry of the item above it.',\n        width: 'full'\n      },\n      {\n        key: 'trigger_label',\n        type: 'text',\n        label: 'Trigger Label',\n        category: 'content',\n        default_value: 'Menu',\n        visible_if: { key: 'open_mode', equals: 'click' }\n      },\n      {\n        key: 'trigger_icon',\n        type: 'text',\n        label: 'Trigger Icon',\n        category: 'content',\n        default_value: '',\n        description: 'Material icon name, e.g. more_vert.',\n        visible_if: { key: 'open_mode', equals: 'click' }\n      },\n      {\n        key: 'open_mode',\n        type: 'select',\n        label: 'Opens On',\n        category: 'behavior',\n        default_value: 'click',\n        options: [\n          { label: 'Click on trigger', value: 'click' },\n          { label: 'Right-click on area', value: 'context' }\n        ],\n        description: 'Right-click turns the component into a context-menu area instead of a button.'\n      },\n      {\n        key: 'context_label',\n        type: 'text',\n        label: 'Area Label',\n        category: 'content',\n        default_value: 'Right-click for options',\n        description: 'Text shown inside the right-click area.',\n        visible_if: { key: 'open_mode', equals: 'context' }\n      },\n      {\n        key: 'trigger_variant',\n        type: 'select',\n        label: 'Trigger Style',\n        category: 'layout',\n        default_value: 'text',\n        options: [\n          { label: 'Text', value: 'text' },\n          { label: 'Filled', value: 'filled' },\n          { label: 'Elevated', value: 'elevated' },\n          { label: 'Outlined', value: 'outlined' },\n          { label: 'Tonal', value: 'tonal' },\n          { label: 'Icon Only', value: 'icon' }\n        ],\n        visible_if: { key: 'open_mode', equals: 'click' }\n      },\n      {\n        key: 'trigger_color',\n        type: 'select',\n        label: 'Trigger Colour',\n        category: 'layout',\n        default_value: '',\n        options: [\n          { label: 'Default', value: '' },\n          { label: 'Primary', value: 'primary' },\n          { label: 'Accent', value: 'accent' },\n          { label: 'Warn', value: 'warn' }\n        ],\n        visible_if: { key: 'open_mode', equals: 'click' }\n      },\n      {\n        key: 'trigger_tooltip',\n        type: 'text',\n        label: 'Trigger Tooltip',\n        category: 'content',\n        default_value: '',\n        visible_if: { key: 'open_mode', equals: 'click' }\n      },\n      {\n        key: 'x_position',\n        type: 'select',\n        label: 'X Position',\n        category: 'layout',\n        default_value: 'after',\n        options: [\n          { label: 'After', value: 'after' },\n          { label: 'Before', value: 'before' }\n        ],\n        description: 'Which side of the trigger the panel opens on.'\n      },\n      {\n        key: 'y_position',\n        type: 'select',\n        label: 'Y Position',\n        category: 'layout',\n        default_value: 'below',\n        options: [\n          { label: 'Below', value: 'below' },\n          { label: 'Above', value: 'above' }\n        ]\n      },\n      {\n        key: 'overlap_trigger',\n        type: 'boolean',\n        label: 'Overlap Trigger',\n        category: 'layout',\n        default_value: false,\n        description: 'Let the panel sit over the trigger rather than beside it.'\n      },\n      {\n        key: 'has_backdrop',\n        type: 'boolean',\n        label: 'Has Backdrop',\n        category: 'behavior',\n        default_value: true,\n        description: 'Off lets clicks reach the page behind the open menu.'\n      },\n      {\n        key: 'backdrop_class',\n        type: 'text',\n        label: 'Backdrop Class',\n        category: 'behavior',\n        default_value: '',\n        visible_if: { key: 'has_backdrop', equals: true }\n      },\n      {\n        key: 'panel_class',\n        type: 'text',\n        label: 'Panel Class',\n        category: 'layout',\n        default_value: '',\n        description: 'CSS class put on the menu panel, for styling it from your theme.'\n      },\n      {\n        key: 'restore_focus',\n        type: 'boolean',\n        label: 'Restore Focus',\n        category: 'behavior',\n        default_value: true,\n        description: 'Return focus to the trigger when the menu closes.'\n      },\n      {\n        key: 'disable_ripple',\n        type: 'boolean',\n        label: 'Disable Ripple',\n        category: 'behavior',\n        default_value: false\n      },\n      {\n        key: 'aria_label',\n        type: 'text',\n        label: 'Aria Label',\n        category: 'behavior',\n        default_value: ''\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      items: [\n        { id: 'item_1', kind: 'item', label: 'Edit', icon: 'edit', value: 'edit', level: 0 },\n        { id: 'item_2', kind: 'item', label: 'Duplicate', icon: 'content_copy', value: 'duplicate', level: 0 },\n        { id: 'item_3', kind: 'divider', level: 0 },\n        { id: 'item_4', kind: 'item', label: 'Delete', icon: 'delete', value: 'delete', level: 0 }\n      ],\n      trigger_label: 'Menu',\n      trigger_icon: 'more_vert',\n      open_mode: 'click',\n      context_label: 'Right-click for options',\n      trigger_variant: 'text',\n      trigger_color: '',\n      trigger_tooltip: '',\n      x_position: 'after',\n      y_position: 'below',\n      overlap_trigger: false,\n      has_backdrop: true,\n      backdrop_class: '',\n      panel_class: '',\n      restore_focus: true,\n      disable_ripple: false,\n      aria_label: ''\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}\n","<div class=\"eru-menu\" [class]=\"classes()\" [ngStyle]=\"combinedStyles()\" eruCanvasEventHandler>\n\n  @if (openMode() === 'context') {\n    <div class=\"eru-menu-context-area\"\n      [matContextMenuTriggerFor]=\"panel.menu\"\n      [matContextMenuTriggerDisabled]=\"store.editMode() || isComponentDisabled()\"\n      [matContextMenuTriggerRestoreFocus]=\"getProperty('restore_focus')\"\n      (menuOpened)=\"onMenuOpened()\"\n      (menuClosed)=\"onMenuClosed()\">\n      <mat-icon class=\"eru-menu-context-icon\">touch_app</mat-icon>\n      <span>{{ getProperty('context_label') }}</span>\n    </div>\n  } @else if (getProperty('trigger_variant') === 'icon') {\n    <button matIconButton\n      [matMenuTriggerFor]=\"store.editMode() ? null : panel.menu\"\n      [matMenuTriggerRestoreFocus]=\"getProperty('restore_focus')\"\n      [disabled]=\"isComponentDisabled()\"\n      [disableRipple]=\"getProperty('disable_ripple')\"\n      [class]=\"triggerColorClass()\"\n      [matTooltip]=\"getProperty('trigger_tooltip') || ''\"\n      [matTooltipDisabled]=\"!getProperty('trigger_tooltip')\"\n      [attr.aria-label]=\"getProperty('aria_label') || getProperty('trigger_label') || null\"\n      (menuOpened)=\"onMenuOpened()\"\n      (menuClosed)=\"onMenuClosed()\">\n      <mat-icon>{{ getProperty('trigger_icon') || 'more_vert' }}</mat-icon>\n    </button>\n  } @else {\n    <button [matButton]=\"triggerAppearance()\"\n      [matMenuTriggerFor]=\"store.editMode() ? null : panel.menu\"\n      [matMenuTriggerRestoreFocus]=\"getProperty('restore_focus')\"\n      [disabled]=\"isComponentDisabled()\"\n      [disableRipple]=\"getProperty('disable_ripple')\"\n      [class]=\"triggerColorClass()\"\n      [matTooltip]=\"getProperty('trigger_tooltip') || ''\"\n      [matTooltipDisabled]=\"!getProperty('trigger_tooltip')\"\n      [attr.aria-label]=\"getProperty('aria_label') || null\"\n      (menuOpened)=\"onMenuOpened()\"\n      (menuClosed)=\"onMenuClosed()\">\n      @if (getProperty('trigger_icon')) {\n        <mat-icon>{{ getProperty('trigger_icon') }}</mat-icon>\n      }\n      {{ getProperty('trigger_label') }}\n    </button>\n  }\n\n  <eru-menu-panel #panel\n    [items]=\"items()\"\n    [xPosition]=\"getProperty('x_position')\"\n    [yPosition]=\"getProperty('y_position')\"\n    [overlapTrigger]=\"getProperty('overlap_trigger')\"\n    [hasBackdrop]=\"getProperty('has_backdrop')\"\n    [backdropClass]=\"getProperty('backdrop_class')\"\n    [panelClass]=\"getProperty('panel_class')\"\n    [disableRipple]=\"getProperty('disable_ripple')\"\n    [ariaLabel]=\"getProperty('aria_label')\"\n    (itemSelect)=\"onItemSelect($event)\" />\n\n  @if (store.editMode()) {\n    <div class=\"eru-menu-preview\">\n      @for (item of previewItems(); track item.id) {\n        @if (item.kind === 'divider') {\n          <div class=\"eru-menu-preview-divider\" [style.margin-left.px]=\"(item.level || 0) * 12\"></div>\n        } @else {\n          <div class=\"eru-menu-preview-item\" [class.eru-menu-preview-item--off]=\"item.disabled\"\n            [style.margin-left.px]=\"(item.level || 0) * 12\">\n            @if (item.icon) { <mat-icon class=\"eru-menu-preview-icon\">{{ item.icon }}</mat-icon> }\n            <span>{{ item.label }}</span>\n          </div>\n        }\n      } @empty {\n        <div class=\"eru-menu-preview-empty\">No items — add them in Properties</div>\n      }\n    </div>\n  }\n\n</div>\n","import { Component, input, computed} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n\n@Component({\n  selector: 'eru-sidenav',\n  standalone: true,\n  imports: [CommonModule, CanvasEventHandlerDirective],\n  templateUrl: './sidenav.component.html',\n  styleUrl: './sidenav.component.scss'\n})\nexport class SidenavComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'label',\n        type: 'text',\n        label: 'Label',\n        category: 'content',\n        default_value: 'Sidenav Label',\n        width: 2\n      }\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      label: 'Sidenav Label'\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n}","<div\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  >\n  {{ getProperty('label') }}\n</div>","import { ChangeDetectionStrategy, Component, input, computed, inject, signal, effect, untracked } from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatIconModule } from '@angular/material/icon';\nimport { EruComponent, PropertySchema, EruComponentProperties } from '../../models';\nimport { BaseComponent } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { ComponentRegistryService } from '../../services';\n\n/** Key the tab's title is mirrored under on its own container. */\nconst TAB_LABEL_KEY = 'tab_label';\n\n@Component({\n  selector: 'eru-tabs',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, MatTabsModule, NgComponentOutlet, MatIconModule],\n  templateUrl: './tabs.component.html',\n  styleUrl: './tabs.component.scss'\n})\nexport class TabsComponent extends BaseComponent {\n  // Component input is inherited from BaseComponent!\n  // classes, customStyles, and combinedStyles are also inherited!\n\n  private componentRegistry = inject(ComponentRegistryService);\n\n  readonly nestingLevel = input<number>(0);\n  readonly selectedComponent = this.store.selectedComponent;\n  readonly componentsReady = signal(false);\n\n  readonly tabs = computed(() => this.parseTabs(this.getProperty('tabs')));\n\n  private readonly _activeTabIndex = signal(0);\n\n  readonly activeTabIndex = computed(() => {\n    const last = this.tabs().length - 1;\n    if (last < 0) return 0;\n    return Math.min(Math.max(this._activeTabIndex(), 0), last);\n  });\n\n  readonly headersHidden = computed(() => this.getProperty('hide_tab_headers') === true);\n\n  readonly alignTabs = computed<string | null>(() => this.getProperty('tab_alignment') || null);\n  readonly stretchTabs = computed(() => this.getProperty('stretch_tabs') !== false);\n  readonly headerPosition = computed<'above' | 'below'>(() =>\n    this.getProperty('header_position') === 'below' ? 'below' : 'above'\n  );\n  readonly dynamicHeight = computed(() => this.getProperty('dynamic_height') === true);\n  readonly fitInkBarToContent = computed(() => this.getProperty('fit_ink_bar_to_content') === true);\n  readonly disableRipple = computed(() => this.getProperty('disable_ripple') === true);\n  readonly animationDuration = computed(() => String(this.getProperty('animation_duration') ?? 500));\n\n  /**\n   * Tab containers in tab order. Order in `children` — not the number in the\n   * id — is what maps a container to a tab, so renaming, reordering or\n   * deleting a tab never has to renumber ids and can never point a tab at\n   * another tab's content.\n   */\n  readonly tabContainers = computed<EruComponent[]>(() => {\n    const component = this.component();\n    if (!component) return [];\n    const prefix = this.tabIdPrefix(component.id);\n    return (component.children ?? []).filter(child => child.id.startsWith(prefix));\n  });\n\n  private readonly placeholders = new Map<string, EruComponent>();\n\n  constructor() {\n    super();\n    effect(() => {\n      const component = this.component();\n      const tabs = this.tabs();\n      if (component) {\n        untracked(() => this.reconcileTabContainers(component, tabs));\n      }\n    });\n\n    effect(() => {\n      const actions = this.store.componentActions();\n      const id = this.component()?.id;\n      if (!id) return;\n      const pending = actions.get(id);\n      if (!pending || pending.action !== 'set-active-tab') return;\n      this.store.consumeComponentAction(id);\n      untracked(() => {\n        const index = this.resolveTabIndex(pending.data);\n        if (index !== null) this._activeTabIndex.set(index);\n      });\n    });\n\n    effect(() => {\n      const children = this.component()?.children;\n      this.componentsReady.set(false);\n      if (children && children.length > 0) {\n        Promise.all(\n          children.map((child: any) =>\n            this.componentRegistry.getComponentClassAsync(child.type)\n          )\n        ).then(() => {\n          this.componentsReady.set(true);\n        });\n      } else {\n        this.componentsReady.set(true);\n      }\n    });\n  }\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'tabs',\n        type: 'tabs_list',\n        label: 'Tabs',\n        category: 'content',\n        default_value: 'Tab 1, Tab 2, Tab 3',\n        description: 'Add, rename, reorder or remove tabs',\n        width: 'full',\n        // One set of containers backs every breakpoint, so the tab list cannot\n        // differ per breakpoint without tabs pointing at missing content.\n        responsive: false\n      },\n      {\n        key: 'hide_tab_headers',\n        type: 'boolean',\n        label: 'Hide Tab Headers',\n        category: 'behavior',\n        default_value: false,\n        description: 'Hides the tab bar so the active tab can only be set by a Set Active Tab action. Hidden while designing too — turn this off to reach another tab\\'s content.',\n        width: 'full',\n        responsive: false\n      },\n      {\n        key: 'tab_alignment',\n        type: 'select',\n        label: 'Tab Alignment',\n        category: 'layout',\n        section: 'Tab Bar',\n        options: [\n          { label: 'Default', value: '' },\n          { label: 'Start', value: 'start' },\n          { label: 'Center', value: 'center' },\n          { label: 'End', value: 'end' }\n        ],\n        default_value: '',\n        visible_if: { key: 'hide_tab_headers', notEquals: true }\n      },\n      {\n        key: 'stretch_tabs',\n        type: 'boolean',\n        label: 'Stretch Tabs To Fill',\n        category: 'layout',\n        section: 'Tab Bar',\n        default_value: true,\n        visible_if: { key: 'hide_tab_headers', notEquals: true }\n      },\n      {\n        key: 'header_position',\n        type: 'select',\n        label: 'Header Position',\n        category: 'layout',\n        section: 'Tab Bar',\n        options: [\n          { label: 'Above Content', value: 'above' },\n          { label: 'Below Content', value: 'below' }\n        ],\n        default_value: 'above',\n        visible_if: { key: 'hide_tab_headers', notEquals: true }\n      },\n      {\n        key: 'fit_ink_bar_to_content',\n        type: 'boolean',\n        label: 'Underline Fits Label',\n        category: 'layout',\n        section: 'Tab Bar',\n        default_value: false,\n        description: 'Draws the active underline the width of the label instead of the whole tab',\n        visible_if: { key: 'hide_tab_headers', notEquals: true }\n      },\n      {\n        key: 'disable_ripple',\n        type: 'boolean',\n        label: 'Disable Ripple',\n        category: 'layout',\n        section: 'Tab Bar',\n        default_value: false,\n        visible_if: { key: 'hide_tab_headers', notEquals: true }\n      },\n      {\n        key: 'dynamic_height',\n        type: 'boolean',\n        label: 'Height Follows Active Tab',\n        category: 'behavior',\n        default_value: false\n      },\n      {\n        key: 'animation_duration',\n        type: 'number',\n        label: 'Animation Duration (ms)',\n        category: 'behavior',\n        default_value: 500,\n        min: 0,\n        description: '0 switches tabs with no slide'\n      }\n    ];\n  }\n\n  // Override to add component-specific default properties\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      tabs: 'Tab 1, Tab 2, Tab 3',\n      hide_tab_headers: false,\n      stretch_tabs: true,\n      header_position: 'above',\n      dynamic_height: false,\n      fit_ink_bar_to_content: false,\n      disable_ripple: false,\n      animation_duration: 500\n    };\n  }\n\n  // Override to add component-specific default styles\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      margin: 8,\n      padding: 8\n    };\n  }\n\n  /**\n   * The tab an author named, as an index. A label is matched first — that is\n   * what an author reads off the Tabs list — and a number is taken as a\n   * position, so either can be written into the action (or produced by its\n   * expression) without a second setting to say which was meant.\n   */\n  private resolveTabIndex(value: any): number | null {\n    const tabs = this.tabs();\n    if (tabs.length === 0) return null;\n    const raw = String(value ?? '').trim();\n    if (!raw) return null;\n    const byLabel = tabs.findIndex(tab => tab.toLowerCase() === raw.toLowerCase());\n    if (byLabel >= 0) return byLabel;\n    const asIndex = Number(raw);\n    if (Number.isInteger(asIndex) && asIndex >= 0 && asIndex < tabs.length) return asIndex;\n    console.warn(`eru-studio: set-active-tab could not match \"${raw}\" to a tab on ${this.component()?.id}`);\n    return null;\n  }\n\n  onSelectedIndexChange(index: number): void {\n    this._activeTabIndex.set(index);\n  }\n\n  onTabsClick(event: MouseEvent) {\n    if (event.target === event.currentTarget) {\n      event.stopPropagation();\n      this.store.setSelectedComponent(this.component());\n    }\n  }\n\n  onComponentMouseEnter(event: MouseEvent, component: EruComponent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(component.id);\n  }\n\n  onComponentMouseLeave(event: MouseEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(null);\n  }\n\n  onCanvasMouseOver(event: MouseEvent, component: EruComponent) {\n    event.preventDefault();\n    event.stopPropagation();\n    const target = event.target as HTMLElement;\n    if (target.getAttribute('data-component-id') === component.id) {\n      this.store.setHoveredComponentId(component.id);\n    }\n  }\n\n  isContainer(type: string): boolean {\n    return type === 'flex_container' || type === 'grid_container' || type === 'card' || type === 'attachment';\n  }\n\n  hasCustomComponent(type: string): boolean {\n    const definition = this.componentRegistry.getComponent(type);\n    return !!definition?.component;\n  }\n\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) {\n      return definition.component;\n    }\n    return this.componentRegistry['loadedComponents'].get(type);\n  }\n\n  getZIndex(level: number): number {\n    return 1 + (level * 10);\n  }\n\n  isComponentHovered() {\n    return (componentId: string) => {\n      return false;\n    };\n  }\n\n  onComponentDragStart(event: DragEvent, component: EruComponent) {\n    event.stopPropagation();\n  }\n\n  selectComponent(event: MouseEvent, component: EruComponent) {\n    event.stopPropagation();\n    this.store.setSelectedComponent(component);\n  }\n\n  hasChildren(): boolean {\n    const component = this.component();\n    return !!(component?.children && component.children.length > 0);\n  }\n\n  getTabContainerComponent(tabIndex: number): any {\n    const tabContainerData = this.getTabContainerComponentData(tabIndex);\n    return this.getComponentClass(tabContainerData.type);\n  }\n\n  getTabContainerComponentData(tabIndex: number): EruComponent {\n    const existing = this.tabContainers()[tabIndex];\n    if (existing) return existing;\n\n    // Nothing reconciled yet (runtime, or a page saved with fewer containers\n    // than tabs). Hand back a stable stand-in — a fresh object each call would\n    // re-create the outlet on every change detection pass.\n    const id = `${this.tabIdPrefix(this.component()?.id ?? '')}${tabIndex}`;\n    let placeholder = this.placeholders.get(id);\n    if (!placeholder) {\n      placeholder = this.createTabContainer(id, this.tabs()[tabIndex] ?? '');\n      this.placeholders.set(id, placeholder);\n    }\n    return placeholder;\n  }\n\n  private tabIdPrefix(componentId: string): string {\n    return `${componentId}-tab-`;\n  }\n\n  private parseTabs(value: any): string[] {\n    const parts = Array.isArray(value) ? value : String(value ?? '').split(',');\n    return parts.map((tab: any) => String(tab ?? '').trim()).filter((tab: string) => tab.length > 0);\n  }\n\n  private tabLabelOf(container: EruComponent): string | null {\n    const label = (container.properties as any)?.base?.[TAB_LABEL_KEY];\n    return typeof label === 'string' ? label : null;\n  }\n\n  private withTabLabel(container: EruComponent, label: string): EruComponent {\n    return {\n      ...container,\n      properties: {\n        ...container.properties,\n        base: { ...((container.properties as any)?.base ?? {}), [TAB_LABEL_KEY]: label }\n      } as EruComponent['properties'],\n      updated_at: new Date().toISOString()\n    };\n  }\n\n  private createTabContainer(id: string, label: string): EruComponent {\n    const now = new Date().toISOString();\n    return {\n      id,\n      type: 'flex_container',\n      properties: {\n        base: { [TAB_LABEL_KEY]: label }\n      } as EruComponent['properties'],\n      styles: {\n        classes: '',\n        responsive_classes: {},\n        responsive_styles: {},\n        custom: {}\n      },\n      children: [],\n      created_at: now,\n      updated_at: now\n    };\n  }\n\n  /** One past the highest id already in use, so a new tab can never take an id a live tab still holds. */\n  private nextTabSequence(containers: EruComponent[], prefix: string): number {\n    let max = -1;\n    for (const container of containers) {\n      const seq = Number(container.id.slice(prefix.length));\n      if (Number.isInteger(seq) && seq > max) max = seq;\n    }\n    return max + 1;\n  }\n\n  /**\n   * Line the tab titles up with the containers that hold their content.\n   *\n   * Containers are matched to titles by title first, then by position for\n   * whatever is left over, so an edit only ever touches the tab it was aimed\n   * at: reordering re-sorts containers, renaming keeps the container in place,\n   * removing a tab drops only that tab's container, and adding one appends an\n   * empty container. The previous version rebuilt every container whenever the\n   * count changed, which emptied every tab on the page.\n   */\n  private reconcileTabContainers(component: EruComponent, labels: string[]): void {\n    if (!this.store.editMode()) return;\n\n    const prefix = this.tabIdPrefix(component.id);\n    const children = component.children ?? [];\n    const containers = children.filter(child => child.id.startsWith(prefix));\n    const others = children.filter(child => !child.id.startsWith(prefix));\n\n    const claimed = new Set<string>();\n    const byLabel = labels.map(label => {\n      const hit = containers.find(c => !claimed.has(c.id) && this.tabLabelOf(c) === label);\n      if (hit) claimed.add(hit.id);\n      return hit ?? null;\n    });\n\n    // Whatever no title claimed is offered back in its original order: that is\n    // what carries a renamed tab's content across the rename, and what adopts\n    // containers saved before titles were mirrored onto them.\n    const spare = containers.filter(c => !claimed.has(c.id));\n    let sequence = this.nextTabSequence(containers, prefix);\n\n    const reconciled = byLabel.map((container, index) => {\n      const label = labels[index];\n      const resolved = container ?? spare.shift() ?? null;\n      if (!resolved) return this.createTabContainer(`${prefix}${sequence++}`, label);\n      return this.tabLabelOf(resolved) === label ? resolved : this.withTabLabel(resolved, label);\n    });\n\n    const nextChildren = [...reconciled, ...others];\n    const unchanged = nextChildren.length === children.length\n      && nextChildren.every((child, index) => child === children[index]);\n    if (unchanged) return;\n\n    this.store.updateComponent(component.id, { children: nextChildren });\n  }\n}\n","<mat-tab-group\n  [class]=\"classes()\"\n  [class.headers-hidden]=\"headersHidden()\"\n  [ngStyle]=\"combinedStyles()\"\n  [attr.data-component-id]=\"component().id\"\n  [attr.data-nesting-level]=\"nestingLevel()\"\n  [selectedIndex]=\"activeTabIndex()\"\n  (selectedIndexChange)=\"onSelectedIndexChange($event)\"\n  [mat-align-tabs]=\"alignTabs()\"\n  [mat-stretch-tabs]=\"stretchTabs()\"\n  [headerPosition]=\"headerPosition()\"\n  [dynamicHeight]=\"dynamicHeight()\"\n  [fitInkBarToContent]=\"fitInkBarToContent()\"\n  [disableRipple]=\"disableRipple()\"\n  [animationDuration]=\"animationDuration()\"\n  (click)=\"onTabsClick($event)\">\n  @for (tab of tabs(); track $index; let i = $index) {\n    <mat-tab [label]=\"tab\">\n      <!--\n        `ng-template matTabContent` defers child instantiation until the\n        tab is first activated. Without it, mat-tab-group eagerly mounts\n        every tab's children — which in eru-studio means every grid /\n        page_ref / data-bound component on every tab fires its\n        ds_fields / fetch_entity_data on the canvas's initial render,\n        even though only one tab is visible. Lazy here is correctness\n        (matches user expectation) and a major load-time win on\n        multi-tab pages like Programs (8 tabs).\n      -->\n      <ng-template matTabContent>\n        <div\n          class=\"tab-container-wrapper mt-2\"\n          [class.selected]=\"selectedComponent()?.id === getTabContainerComponentData(i).id\"\n          [class.hovered-drop-target]=\"isComponentHovered()(getTabContainerComponentData(i).id)\"\n          [attr.data-container-id]=\"getTabContainerComponentData(i).id\"\n          [attr.data-component-id]=\"getTabContainerComponentData(i).id\"\n          [attr.data-nesting-level]=\"nestingLevel() + 1\"\n          [style.z-index]=\"getZIndex(nestingLevel() + 1)\"\n          (mouseenter)=\"onComponentMouseEnter($event, getTabContainerComponentData(i))\"\n          (mouseleave)=\"onComponentMouseLeave($event)\"\n          (mouseover)=\"onCanvasMouseOver($event, getTabContainerComponentData(i))\"\n          (dragstart)=\"onComponentDragStart($event, getTabContainerComponentData(i))\"\n          draggable=\"true\"\n          (click)=\"selectComponent($event, getTabContainerComponentData(i))\">\n          <ng-container\n            [ngComponentOutlet]=\"getTabContainerComponent(i)\"\n            [ngComponentOutletInputs]=\"{ component: getTabContainerComponentData(i), nestingLevel: nestingLevel() + 1 }\">\n          </ng-container>\n        </div>\n      </ng-template>\n    </mat-tab>\n  }\n</mat-tab-group>","import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { EruAppRouteService } from '../../services/eru-app-route.service';\n\ninterface NavItem {\n  id: string;\n  label: string;\n  description?: string;\n  icon?: string;\n  page?: string;       // Target page id (UUID) — value written to URL when clicked.\n  group?: string;\n  badge?: string | number;\n  /**\n   * Optional expression for shaping navigation — hiding an item a user COULD\n   * reach. NOT a permission: page access is what decides whether the page can\n   * be opened, and the host has already dropped items whose target page is not\n   * in the user's visible set before they reach this component.\n   *\n   * Evaluated fail-CLOSED, unlike every other condition in the library: a\n   * malformed layout condition should leave a component visible, but a\n   * malformed one here would reveal navigation an author meant to hide.\n   */\n  visible_if?: string;\n}\n\ninterface NavGroup {\n  label: string;       // '' for ungrouped\n  items: NavItem[];\n}\n\n/**\n * Sidebar / horizontal nav for shell-app pages. Renders grouped, iconed,\n * badged items. Clicking an item writes the item's `page` value to the URL\n * via `EruAppRouteService` under `route_param_name` (default `view`).\n *\n * Pair with `nav_outlet` (which reads the same param) to swap the active\n * page on the right. The two components are decoupled — they share state\n * only via the URL.\n */\n@Component({\n  selector: 'eru-nav-menu',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatIconModule],\n  templateUrl: './nav-menu.component.html',\n  styleUrl: './nav-menu.component.scss'\n})\nexport class NavMenuComponent extends BaseComponent {\n  override componentEvents = [\n    { label: 'On Menu Select', value: 'menu_select' }\n  ];\n\n  readonly collapsed = signal<boolean>(false);\n\n  override ngOnInit(): void {\n    super.ngOnInit?.();\n    if (this.getProperty('default_collapsed')) {\n      this.collapsed.set(true);\n    }\n  }\n\n  constructor() {\n    super();\n\n    // Ask the host for the menu whenever `menu_id` changes. Re-requested on a\n    // change rather than once, so re-pointing a shell at another menu in the\n    // designer takes effect without a reload.\n    effect(() => {\n      const menuId = String(this.getProperty('menu_id') ?? '').trim();\n      if (!menuId) {\n        if (this.lastMenuId) {\n          untracked(() => {\n            this.lastMenuId = '';\n            this.menuItems.set(null);\n            this.menuRequestId.set(null);\n          });\n        }\n        return;\n      }\n      if (menuId === this.lastMenuId) return;\n      untracked(() => {\n        this.lastMenuId = menuId;\n        this.menuItems.set(null);\n        const reqId = this.store.requestDynamicData(\n          this.component()?.id || 'nav-menu',\n          'ds_menu',\n          menuId,\n        );\n        this.menuRequestId.set(reqId);\n      });\n    });\n\n    // Consume the response.\n    effect(() => {\n      const reqId = this.menuRequestId();\n      if (!reqId) return;\n      const response = this.store.dynamicDataResponses().get(reqId);\n      if (response === undefined) return;\n      untracked(() => {\n        // Accept either a bare item array or a { items } envelope, matching how\n        // a menu_def round-trips.\n        const items = Array.isArray(response)\n          ? response\n          : Array.isArray((response as any)?.items)\n            ? (response as any).items\n            : [];\n        this.menuItems.set(items as NavItem[]);\n        this.store.removeDynamicDataRequest(reqId);\n        this.menuRequestId.set(null);\n      });\n    });\n\n    effect(() => {\n      const items = this.parsedItems();\n      const active = this.activeItemId();\n      if (!items.length) return;\n      const item = items.find(i => i.id === active || i.page === active) ?? null;\n      untracked(() => {\n        const key = item ? (item.page || item.id) : '';\n        if (key === this.lastSelectedKey) return;\n        this.lastSelectedKey = key;\n        if (!item) return;\n        this.emitEvent('menu_select', { value: key }, undefined, {\n          context: { menu_item: { ...item } }\n        });\n      });\n    });\n  }\n\n  private lastSelectedKey = '';\n\n  /**\n   * Items fetched from a process menu, or null when none has been requested.\n   *\n   * The host answers `ds_menu` with the menu ALREADY filtered to the pages this\n   * user may open — the library has no business knowing about roles, and the\n   * page set lives in the host. What is left for this component is the\n   * presentation half: `visible_if` and dropping groups it empties.\n   */\n  private readonly menuItems = signal<NavItem[] | null>(null);\n  private readonly menuRequestId = signal<string | null>(null);\n  private lastMenuId = '';\n\n  /** Raw items: the referenced menu when there is one, else the inline JSON. */\n  private readonly rawItems = computed<NavItem[]>(() => {\n    const menuId = String(this.getProperty('menu_id') ?? '').trim();\n    if (menuId) {\n      // Nothing until the menu arrives. Falling back to the inline JSON here\n      // would flash a stale menu — usually the sample default — over the real\n      // one on every load.\n      return this.menuItems() ?? [];\n    }\n    const raw = this.getProperty('items');\n    if (!raw) return [];\n    if (Array.isArray(raw)) return raw as NavItem[];\n    try {\n      const parsed = JSON.parse(String(raw));\n      return Array.isArray(parsed) ? parsed : [];\n    } catch {\n      return [];\n    }\n  });\n\n  /**\n   * Items after `visible_if`, which is evaluated FAIL-CLOSED: an expression\n   * that throws, or references something not yet resolvable, hides the item.\n   *\n   * The shared evaluator resolves errors to `true` because a mis-typed layout\n   * condition should not blank a page. Here the opposite is wanted — a\n   * mis-typed navigation condition must not reveal an item — so the result is\n   * only trusted when the evaluator returns a real boolean.\n   */\n  readonly parsedItems = computed<NavItem[]>(() => {\n    const items = this.rawItems();\n    // In the designer every item shows, or an author cannot see what they are\n    // editing. Nothing is reachable from the canvas anyway.\n    if (this.store.editMode()) return items;\n\n    const component = this.component();\n    return items.filter(item => {\n      const expression = String(item?.visible_if ?? '').trim();\n      if (!expression) return true;\n      // null = the expression could not be evaluated at all, which must hide\n      // the item rather than fall back to the evaluator's visible-on-error\n      // default. See LogicEvaluatorService.evaluateStrict.\n      const result = this.logicEvaluator.evaluateStrict(\n        expression,\n        component?.pageId,\n        component?.id,\n        this.dataKey(),\n      );\n      return result === true;\n    });\n  });\n\n  /** Items grouped by `group` field. Items with no group land in a single\n   *  '' bucket rendered first.\n   */\n  readonly groups = computed<NavGroup[]>(() => {\n    const items = this.parsedItems();\n    const order: string[] = [];\n    const buckets = new Map<string, NavItem[]>();\n    for (const item of items) {\n      const g = item.group ?? '';\n      if (!buckets.has(g)) {\n        buckets.set(g, []);\n        order.push(g);\n      }\n      buckets.get(g)!.push(item);\n    }\n    // A group whose every item was filtered out must go too, or the shell\n    // renders a heading with nothing under it.\n    return order\n      .map(label => ({ label, items: buckets.get(label)! }))\n      .filter(group => group.items.length > 0);\n  });\n\n  /**\n   * Active item id derived from the URL param, falling back to\n   * `default_item_id` and then to the first visible item — a shell opens on its\n   * first page, so that item is the one shown selected, and On Menu Select has\n   * to fire for it the same as for a click.\n   */\n  readonly activeItemId = computed<string>(() => {\n    const paramName = this.getProperty('route_param_name') || 'view';\n    const fromUrl = this.routeService.routeParams()[paramName];\n    if (fromUrl) return fromUrl;\n    const defaultId = this.getProperty('default_item_id') || '';\n    if (defaultId) return defaultId;\n    const first = this.parsedItems().find(item => item.page || item.id);\n    return first ? (first.page || first.id) : '';\n  });\n\n  isItemActive(item: NavItem): boolean {\n    const active = this.activeItemId();\n    if (!active) return false;\n    return active === item.id || active === item.page;\n  }\n\n  onItemClick(item: NavItem): void {\n    if (this.store.editMode()) return;\n    const paramName = this.getProperty('route_param_name') || 'view';\n    const value = item.page || item.id;\n    this.routeService.setParam(paramName, value);\n  }\n\n  /**\n   * `menu_select` fires on the canvas too. The designer opens in edit mode with\n   * the first item's page already mounted in the outlet, so suppressing it left\n   * the header its handler fills blank while the page beside it was rendered.\n   */\n  protected override suppressEventsInEditMode(eventType: string): boolean {\n    return eventType !== 'menu_select';\n  }\n\n  toggleCollapse(): void {\n    if (!this.getProperty('collapsible')) return;\n    this.collapsed.update(v => !v);\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'menu_id',\n        type: 'select',\n        label: 'Menu',\n        category: 'content',\n        dynamic_options: 'ds_menu_name',\n        default_value: '',\n        description: 'A menu defined for this process. Items come from there, already filtered to the pages this user may open. Leave blank to use the inline JSON below.',\n        width: 'full'\n      },\n      {\n        key: 'items',\n        type: 'textarea',\n        label: 'Menu Items (JSON)',\n        category: 'content',\n        default_value: '[\\n  {\"id\":\"home\",\"label\":\"Home\",\"icon\":\"home\",\"page\":\"\"}\\n]',\n        description: 'Used only when no Menu is selected above. JSON array of {id, label, description?, icon?, page?, group?, badge?, visible_if?}. `page` is the target page UUID (written to URL on click).',\n        visible_if: { key: 'menu_id', equals: '' },\n        width: 'full'\n      },\n      {\n        key: 'route_param_name',\n        type: 'text',\n        label: 'Route Param Name',\n        category: 'behavior',\n        default_value: 'view',\n        description: 'URL query param name used to track the active item.'\n      },\n      {\n        key: 'default_item_id',\n        type: 'text',\n        label: 'Default Item Id',\n        category: 'behavior',\n        default_value: '',\n        description: 'Item id (or page id) considered active when the URL param is empty.'\n      },\n      {\n        key: 'app_title',\n        type: 'text',\n        label: 'App Title',\n        category: 'content',\n        default_value: ''\n      },\n      {\n        key: 'app_logo_icon',\n        type: 'text',\n        label: 'App Logo Icon',\n        category: 'content',\n        default_value: '',\n        description: 'Material icon name shown next to the title.'\n      },\n      {\n        key: 'orientation',\n        type: 'select',\n        label: 'Orientation',\n        category: 'layout',\n        default_value: 'vertical',\n        options: [\n          { label: 'Vertical (sidebar)', value: 'vertical' },\n          { label: 'Horizontal (top tabs)', value: 'horizontal' }\n        ]\n      },\n      {\n        key: 'collapsible',\n        type: 'boolean',\n        label: 'Collapsible',\n        category: 'behavior',\n        default_value: true,\n        description: 'Show the collapse / expand toggle. Vertical only.'\n      },\n      {\n        key: 'default_collapsed',\n        type: 'boolean',\n        label: 'Start Collapsed',\n        category: 'behavior',\n        default_value: false\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      items: '[\\n  {\"id\":\"home\",\"label\":\"Home\",\"icon\":\"home\",\"page\":\"\"}\\n]',\n      route_param_name: 'view',\n      default_item_id: '',\n      app_title: '',\n      app_logo_icon: '',\n      orientation: 'vertical',\n      collapsible: true,\n      default_collapsed: false\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    // Width/height come from .nav-menu CSS (240px expanded, 64px collapsed,\n    // 100% height). Setting them in JSON would lock the parent flex-slot\n    // size and break the collapse-releases-space behavior.\n    return {\n      background_color: '#ffffff',\n      border_color: '#e5e7eb',\n      border_width: 1\n    };\n  }\n}\n","<nav class=\"nav-menu\"\n  [class.nav-menu--collapsed]=\"collapsed()\"\n  [class.nav-menu--horizontal]=\"getProperty('orientation') === 'horizontal'\"\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  eruCanvasEventHandler>\n\n  @if (getProperty('orientation') !== 'horizontal') {\n    <div class=\"nav-menu-header\">\n      @if (getProperty('app_logo_icon') || getProperty('app_title')) {\n        <div class=\"nav-menu-logo\">\n          @if (getProperty('app_logo_icon')) {\n            <mat-icon class=\"nav-menu-logo-icon\">{{ getProperty('app_logo_icon') }}</mat-icon>\n          }\n          @if (!collapsed() && getProperty('app_title')) {\n            <span class=\"nav-menu-logo-text\">{{ getProperty('app_title') }}</span>\n          }\n        </div>\n      }\n      @if (getProperty('collapsible')) {\n        <button type=\"button\"\n          class=\"nav-menu-collapse-btn\"\n          (click)=\"toggleCollapse()\"\n          [title]=\"collapsed() ? 'Expand' : 'Collapse'\">\n          <mat-icon>{{ collapsed() ? 'chevron_right' : 'chevron_left' }}</mat-icon>\n        </button>\n      }\n    </div>\n  }\n\n  <div class=\"nav-menu-scroll\">\n    @for (group of groups(); track group.label) {\n      <div class=\"nav-menu-group\">\n        @if (group.label && !collapsed() && getProperty('orientation') !== 'horizontal') {\n          <div class=\"nav-menu-group-header\">{{ group.label }}</div>\n        } @else if (group.label && collapsed()) {\n          <div class=\"nav-menu-group-divider\"></div>\n        }\n        @for (item of group.items; track item.id) {\n          <button\n            type=\"button\"\n            class=\"nav-menu-item\"\n            [class.nav-menu-item--active]=\"isItemActive(item)\"\n            [title]=\"collapsed() ? item.label : ''\"\n            (click)=\"onItemClick(item)\">\n            @if (item.icon) {\n              <mat-icon class=\"nav-menu-item-icon\">{{ item.icon }}</mat-icon>\n            }\n            @if (!collapsed() || getProperty('orientation') === 'horizontal') {\n              <span class=\"nav-menu-item-label\">{{ item.label }}</span>\n              @if (item.badge) {\n                <span class=\"nav-menu-item-badge\">{{ item.badge }}</span>\n              }\n            } @else if (item.badge) {\n              <span class=\"nav-menu-item-badge nav-menu-item-badge--dot\"></span>\n            }\n          </button>\n        }\n      </div>\n    }\n  </div>\n\n</nav>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  EnvironmentInjector,\n  Input,\n  OnInit,\n  OnDestroy,\n  createEnvironmentInjector,\n  computed,\n  effect,\n  inject,\n  signal,\n  untracked,\n  HostListener\n} from '@angular/core';\nimport { NgComponentOutlet, NgStyle } from '@angular/common';\nimport { EruStudioStore } from '../../services/eru-studio.store';\nimport { ComponentRegistryService } from '../../services/component-registry.service';\nimport { ComponentSchemaService } from '../../services/component-schema.service';\nimport { PropertyToTailwindService } from '../../services/property-to-tailwind.service';\nimport { FormValidationService } from '../../services/form-validation.service';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\nimport { EruComponent, EruPage, TailwindBreakpoint } from '../../models';\nimport { getBreakpointFromViewport } from '../../utils/breakpoint.util';\nimport { BreakpointScopeService } from '../../services/breakpoint-scope.service';\n\n@Component({\n  selector: 'eru-runtime-canvas',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [EruStudioStore, ComponentSchemaService, FormValidationService, LogicEvaluatorService],\n  imports: [NgComponentOutlet, NgStyle],\n  templateUrl: './runtime-canvas.component.html',\n  styleUrl: './runtime-canvas.component.scss'\n})\nexport class RuntimeCanvasComponent implements OnInit, OnDestroy {\n  public store = inject(EruStudioStore);\n  /**\n   * Parent canvas's store (if any). When this canvas is mounted *inside*\n   * another canvas (e.g. via `nav_outlet`), its own store is fresh and\n   * isolated — but `ds_page` requests from descendants need to reach the\n   * host's request handler, which is wired to the OUTER store only.\n   *\n   * The constructor sets up a bridge: forward selected request types\n   * (currently only `ds_page`) to the parent store, and copy responses\n   * back into this store so the originating component's effect resolves.\n   */\n  private parentStore = inject(EruStudioStore, { skipSelf: true, optional: true });\n  public componentRegistry = inject(ComponentRegistryService);\n  private schemaService = inject(ComponentSchemaService);\n  private tailwindService = inject(PropertyToTailwindService);\n  private formValidationService = inject(FormValidationService);\n  private logicEvaluator = inject(LogicEvaluatorService);\n\n  private readonly parentEnv = inject(EnvironmentInjector);\n  private readonly elementRef = inject(ElementRef);\n\n  /**\n   * Breakpoint scope for everything this canvas renders, measured from the\n   * canvas's own box. `window.innerWidth` is the wrong ruler whenever the\n   * canvas is not full-width — a `nav_outlet` beside a sidebar, a widget host,\n   * a page embedded in a narrow column — and it is the only reason such a page\n   * laid itself out for the whole screen.\n   */\n  private readonly breakpointScope = new BreakpointScopeService();\n  private stopObservingWidth: (() => void) | null = null;\n\n  readonly dynamicComponentInjector = createEnvironmentInjector(\n    [\n      { provide: EruStudioStore, useValue: this.store },\n      { provide: ComponentSchemaService, useValue: this.schemaService },\n      { provide: FormValidationService, useValue: this.formValidationService },\n      { provide: LogicEvaluatorService, useValue: this.logicEvaluator },\n      { provide: BreakpointScopeService, useValue: this.breakpointScope }\n    ],\n    this.parentEnv\n  );\n\n  readonly componentsReady = signal(false);\n  readonly components = this.store.currentPageComponents;\n  protected pageId = computed(() => this.store.currentPage()?.id);\n\n  readonly initialEntityId = signal<string>('');\n  readonly targetPageId = signal<string>('');\n  readonly inputPageDef = signal<EruPage | null>(null);\n\n  @Input('initialEntityId')\n  set initialEntityIdSetter(value: string) {\n    this.initialEntityId.set(value || '');\n  }\n\n  /**\n   * If set, the canvas fires a `ds_page` request on **its own store**\n   * and calls `setCurrentPage` once a response lands. This only works\n   * if something is watching that store's dynamic-data queue — which\n   * is true for the host's primary canvas (processo wires this up),\n   * but NOT for inner canvas instances mounted inside `nav_outlet`\n   * (each gets a fresh store nobody watches).\n   *\n   * For inner mounts, prefer `pageDef` — the parent fetches the def\n   * via its own already-watched store and hands the resolved object\n   * here.\n   */\n  @Input('targetPageId')\n  set targetPageIdSetter(value: string) {\n    this.targetPageId.set(value || '');\n  }\n\n  /**\n   * Pre-fetched page definition. When set, the canvas calls\n   * `setCurrentPage(pageDef)` directly — no fetch needed. This is\n   * how `nav_outlet` mounts a page: it fetches via the outer store\n   * (which processo watches) and passes the resolved def in.\n   */\n  @Input('pageDef')\n  set pageDefSetter(value: EruPage | null) {\n    this.inputPageDef.set(value || null);\n  }\n\n  /**\n   * Keep this canvas's page state when it is unmounted, so returning to the\n   * page (Back, or navigating to it again) resumes instead of starting blank.\n   * Set by `nav_outlet`'s `retain_page_state` property. The snapshot is parked\n   * on the root store, which survives the swap that destroys this canvas.\n   */\n  @Input('retainPageState')\n  set retainPageStateSetter(value: boolean) {\n    this.store.setRetainPageState(!!value);\n  }\n\n  private readonly pageDataIdentity = computed(() => {\n    const page = this.store.currentPage();\n    if (!page?.id) return '';\n    return JSON.stringify([page.id, page.entity_name || '', page.data_source || '']);\n  });\n\n  private readonly lastPageDataRequestId = signal<string | null>(null);\n  /** Page the in-flight ds_page_data fetch was issued for. A navigation can\n   *  land before the response does, and the record must not be applied to\n   *  whatever page happens to be current by then. */\n  private readonly pageDataRequestPageId = signal<string | null>(null);\n  private readonly lastPageDefRequestId = signal<string | null>(null);\n  private firedOnLoadPageId: string | null = null;\n\n  constructor() {\n    this.store.setEditMode(false);\n\n    // Make this nested canvas's store discoverable by the host: the host app\n    // processes component events (call-query/call-function/…) per canvas store, so\n    // an inner page's on-load queries fire and their results land on THIS\n    // store — the one the inner page's components actually read.\n    if (this.parentStore) {\n      this.parentStore.registerChildStore(this.store);\n      this.store.setParentStore(this.parentStore);\n\n      // Inherit the entity metadata. The host only pushes entities to the\n      // OUTER canvas store; without this, fields inside a nested mount can't\n      // resolve their data-model binding (getEntityField) and fall back to\n      // stale per-component config (e.g. selects showing old static options).\n      effect(() => {\n        const entities = this.parentStore!.entities();\n        if (entities && entities.length > 0 && this.store.getEntities().length === 0) {\n          untracked(() => this.store.setEntities(entities));\n        }\n      });\n    }\n\n    effect(async () => {\n      const comps = this.components();\n      if (comps && comps.length > 0) {\n        await Promise.all(\n          comps.map(comp => this.componentRegistry.getComponentClassAsync(comp.type))\n        );\n        this.componentsReady.set(true);\n      } else {\n        this.componentsReady.set(true);\n      }\n    });\n\n    // Fetch page def by id when targetPageId input is set or changes.\n    effect(() => {\n      const id = this.targetPageId();\n      const current = this.store.currentPage();\n      if (!id) return;\n      if (current?.id === id) return; // already loaded\n      untracked(() => {\n        const reqId = this.store.requestDynamicData('canvas', 'ds_page', id);\n        this.lastPageDefRequestId.set(reqId);\n      });\n    });\n\n    // Direct page-def injection (preferred for nav_outlet mounts).\n    effect(() => {\n      const def = this.inputPageDef();\n      if (!def) return;\n      const current = this.store.currentPage();\n      if (current?.id === def.id) return;\n      untracked(() => this.store.setCurrentPage(def));\n    });\n\n    // Hand the resolved page def to the store as currentPage.\n    effect(() => {\n      const reqId = this.lastPageDefRequestId();\n      if (!reqId) return;\n      const responses = this.store.dynamicDataResponses();\n      const resp = responses.get(reqId);\n      if (resp) {\n        untracked(() => {\n          const pageDef = (resp as any)?.page_def ?? resp;\n          if (pageDef && pageDef.id) {\n            this.store.setCurrentPage(pageDef);\n          }\n          this.store.removeDynamicDataRequest(reqId);\n          this.lastPageDefRequestId.set(null);\n        });\n      }\n    });\n\n    effect(() => {\n      const entityId = this.initialEntityId();\n      // Depend on the page's identity, not the page object: every designer edit\n      // replaces currentPage(), and re-requesting ds_page_data here overwrote\n      // the record a set-page-data action had written.\n      const identity = this.pageDataIdentity();\n      if (!entityId || !identity) return;\n      untracked(() => {\n        const page = this.store.currentPage();\n        // A page that declares a state data source owns its data from state —\n        // fetching the entity record too would race it and win, blanking the\n        // seeded record.\n        if (!page?.id || page.data_source === 'state') return;\n        const payload = { entity_id: entityId, entity_name: page.entity_name || '' };\n        const reqId = this.store.requestDynamicData('canvas', 'ds_page_data', payload);\n        this.lastPageDataRequestId.set(reqId);\n        this.pageDataRequestPageId.set(page.id);\n      });\n    });\n\n    effect(() => {\n      const reqId = this.lastPageDataRequestId();\n      if (!reqId) return;\n      const responses = this.store.dynamicDataResponses();\n      const data = responses.get(reqId);\n      if (data) {\n        untracked(() => {\n          const requestedFor = this.pageDataRequestPageId();\n          // Drop a response whose page is no longer mounted here — applying it\n          // would overwrite the current page's data with another page's record.\n          if (!requestedFor || requestedFor === this.store.currentPage()?.id) {\n            this.store.setPageData(data, requestedFor || undefined);\n          }\n          this.store.removeDynamicDataRequest(reqId);\n          this.lastPageDataRequestId.set(null);\n          this.pageDataRequestPageId.set(null);\n        });\n      }\n    });\n\n    effect(() => {\n      const page = this.store.currentPage();\n      const ready = this.componentsReady();\n      if (!page?.id || !ready) return;\n      // A page that takes its record from state must have it before on_load\n      // fires — those events send the record as their payload. Reads a signal,\n      // so this effect re-runs the moment the record lands.\n      if (!this.store.isPageRecordSourceReady(page)) return;\n      if (this.firedOnLoadPageId === page.id) return;\n      untracked(() => {\n        this.firedOnLoadPageId = page.id;\n        this.store.fireOnLoadPageEvents(page);\n      });\n    });\n\n  }\n\n  /**\n   * Nested-canvas requests are relayed to the parent by the STORE itself\n   * (EruStudioStore.requestDynamicData), which forwards to the parent under one\n   * id, records the request locally for its own bookkeeping, merges the\n   * parent's responses back into `dynamicDataResponses`, and clears both copies\n   * on removal.\n   *\n   * This component used to bridge the same requests a second time\n   * (`installParentBridge`), walking its store's pending requests and calling\n   * `parent.requestDynamicData` again. Its dedupe map was separate from the\n   * store's, so it could not see the record the store had just relayed and\n   * forwarded it under a NEW parent id — the host then ran the same query\n   * twice. That was the double `executegroup`, and the doubled per-group\n   * `execute` calls behind it, on every page mounted in a nav_outlet shell.\n   */\n\n  ngOnInit() {\n    this.updateBreakpointFromViewport();\n    this.stopObservingWidth = this.breakpointScope.observe(this.elementRef?.nativeElement as HTMLElement);\n  }\n\n  ngOnDestroy() {\n    this.stopObservingWidth?.();\n    this.stopObservingWidth = null;\n    // Covers the paths that bypass the navigate-to-page action — Back/Forward,\n    // and a nav_menu writing the route param directly. No-op unless retention\n    // is on. Must run before unregistering, while the parent chain (and so the\n    // root store holding the cache) is still reachable.\n    this.store.capturePageStateSnapshot();\n    this.parentStore?.unregisterChildStore(this.store);\n  }\n\n  @HostListener('window:resize')\n  onWindowResize() {\n    this.updateBreakpointFromViewport();\n  }\n\n  private updateBreakpointFromViewport() {\n    const breakpoint = getBreakpointFromViewport();\n    if (this.store.viewport().breakpoint !== breakpoint) {\n      this.store.setBreakpoint(breakpoint as any);\n    }\n  }\n\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) {\n      return definition.component;\n    }\n    return this.componentRegistry.getLoadedComponent(type);\n  }\n\n  isContainer(type: string): boolean {\n    return type === 'flex_container' || type === 'grid_container' || type === 'card' || type === 'attachment';\n  }\n\n  getPropertyValue(component: EruComponent, key: string, defaultValue: any = ''): any {\n    const breakpoint = this.breakpointScope.breakpoint()\n      ?? (this.store.viewport().breakpoint as TailwindBreakpoint | 'base');\n    return this.tailwindService.getPropertyValueForBreakpoint(component.properties, key, breakpoint) ?? defaultValue;\n  }\n\n  getDataKey(component: EruComponent): string {\n    if (component?.isNested) {\n      const entityName = component.entityName || '';\n      if (component.nesting_type === 'nested_array' && component.index !== undefined) {\n        return `${entityName}.${component.index}`;\n      }\n      if (component.nesting_type === 'object' || component.nesting_type === 'array') {\n        if (component.nesting_type === 'array' && component.index !== undefined) {\n          return `${component.index}`;\n        }\n        return '';\n      }\n      return entityName;\n    }\n    return '';\n  }\n\n  getChildStyles(component: EruComponent): any {\n    if (!this.isChildVisible(component)) {\n      return { display: 'none' };\n    }\n    return {};\n  }\n\n  isChildVisible(component: EruComponent): boolean {\n    const pageId = component.pageId || this.pageId() || '';\n    const pageOverrides = this.store.fieldVisibilityOverrides().get(pageId);\n\n    const dataKey = this.getDataKey(component);\n    const fieldName = this.getPropertyValue(component, 'name');\n    const visibilityKey = (dataKey && fieldName) ? `${dataKey}.${fieldName}` : fieldName;\n\n    if (pageOverrides && visibilityKey && pageOverrides.has(visibilityKey)) {\n      return pageOverrides.get(visibilityKey)!;\n    }\n\n    const visibility = this.getPropertyValue(component, 'visible', 'always');\n    if (!visibility || visibility === 'always') return true;\n    if (visibility === 'never') return false;\n    if (visibility === 'conditionally') {\n      const expression = this.getPropertyValue(component, 'visibility_conditions');\n      return this.logicEvaluator.evaluate(expression, component?.pageId, component?.id);\n    }\n    return true;\n  }\n\n  getZIndex(level: number): number {\n    return 1 + (level * 10);\n  }\n}\n","<div class=\"runtime-canvas\">\n  @if (componentsReady()) {\n    @for (component of components(); track component.id) {\n      <div [ngStyle]=\"getChildStyles(component)\">\n        <ng-container\n          *ngComponentOutlet=\"getComponentClass(component.type);\n                              injector: dynamicComponentInjector;\n                              inputs: isContainer(component.type) ? {component: component, nestingLevel: 0} : {component: component}\" />\n      </div>\n    }\n  }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PropertySchema, EruComponentProperties, EruPage } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { EruAppRouteService } from '../../services/eru-app-route.service';\nimport { RuntimeCanvasComponent } from '../runtime-canvas/runtime-canvas.component';\n\n/**\n * Mounts the page identified by a URL query param. Pair with `nav_menu`\n * (which writes the param). Each mount instantiates a fresh\n * `RuntimeCanvasComponent` — and therefore a fresh `EruStudioStore` —\n * so the inner page is independent of the shell. Existing nesting\n * mechanics (page_ref, isNested, parent walks, page_data) operate\n * entirely within the inner store, exactly as they would for the\n * inner page rendered standalone.\n *\n * Page-def fetch happens on the OUTER store (this.store from\n * BaseComponent) because processo's `ds_page` handler only watches\n * that one. The resolved def is then handed to the inner canvas via\n * its `pageDef` input.\n *\n * If the URL param is empty, falls back to `default_page`.\n */\n@Component({\n  selector: 'eru-nav-outlet',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CanvasEventHandlerDirective, MatIconModule, RuntimeCanvasComponent],\n  templateUrl: './nav-outlet.component.html',\n  styleUrl: './nav-outlet.component.scss'\n})\nexport class NavOutletComponent extends BaseComponent {\n  /** Whether pages mounted here resume their previous state on a return visit. */\n  readonly retainPageState = computed<boolean>(() => !!this.getProperty('retain_page_state'));\n\n  /** Page id to mount, derived from URL query param or default_page fallback. */\n  readonly mountPageId = computed<string>(() => {\n    const paramName = this.getProperty('route_param_name') || 'view';\n    const fromUrl = this.routeService.routeParams()[paramName];\n    if (fromUrl) return fromUrl;\n    return this.getProperty('default_page') || '';\n  });\n\n  /** Most recent in-flight ds_page request id (keyed in outer store). */\n  private readonly lastReqId = signal<string | null>(null);\n\n  /** Resolved page def handed to the inner runtime-canvas. */\n  readonly resolvedPageDef = signal<EruPage | null>(null);\n\n  /**\n   * Single-element list of the resolved page def (or empty). The template\n   * iterates this with `track def.id` so Angular destroys+recreates the\n   * inner `eru-runtime-canvas` whenever the active page id changes —\n   * giving each page a truly fresh `EruStudioStore` instance and preventing\n   * state pollution from the previously-mounted page.\n   */\n  readonly resolvedPageDefAsList = computed<EruPage[]>(() => {\n    const def = this.resolvedPageDef();\n    return def ? [def] : [];\n  });\n\n  constructor() {\n    super();\n\n    // Claim this outlet's route param so a `navigate-to-page` action knows a\n    // shell is present to handle it. Re-registers when the param name changes\n    // and releases the claim on destroy.\n    effect((onCleanup) => {\n      const paramName = this.getProperty('route_param_name') || 'view';\n      this.store.registerOutlet(paramName);\n      onCleanup(() => this.store.unregisterOutlet(paramName));\n    });\n\n    // When the target page id changes, fire ds_page on the OUTER store\n    // (the one processo watches) so the host fulfills the request.\n    effect(() => {\n      const id = this.mountPageId();\n      if (!id) {\n        this.resolvedPageDef.set(null);\n        this.lastReqId.set(null);\n        return;\n      }\n      // Skip refetch when the resolved def already matches.\n      const cached = this.resolvedPageDef();\n      if (cached && cached.id === id) return;\n      untracked(() => {\n        const reqId = this.store.requestDynamicData(\n          this.component()?.id || 'nav-outlet',\n          'ds_page',\n          id\n        );\n        this.lastReqId.set(reqId);\n      });\n    });\n\n    // When the matching response lands, hand it to the inner canvas.\n    effect(() => {\n      const reqId = this.lastReqId();\n      if (!reqId) return;\n      const responses = this.store.dynamicDataResponses();\n      const resp = responses.get(reqId);\n      if (!resp) return;\n      untracked(() => {\n        const pageDef = (resp as any)?.page_def ?? resp;\n        if (pageDef && pageDef.id) {\n          this.resolvedPageDef.set(pageDef as EruPage);\n        }\n        this.store.removeDynamicDataRequest(reqId);\n        this.lastReqId.set(null);\n      });\n    });\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'route_param_name',\n        type: 'text',\n        label: 'Route Param Name',\n        category: 'behavior',\n        default_value: 'view',\n        description: 'URL query param to read for the active page id. Must match the paired nav_menu.'\n      },\n      {\n        key: 'default_page',\n        type: 'text',\n        label: 'Default Page',\n        category: 'content',\n        default_value: '',\n        description: 'Page id mounted when the URL param is empty (e.g. first load).'\n      },\n      {\n        key: 'retain_page_state',\n        type: 'boolean',\n        label: 'Retain Page State',\n        category: 'behavior',\n        default_value: false,\n        description: 'Restore a page\\'s state when the user returns to it, instead of starting fresh. Leave off for pages that must always start clean.'\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      route_param_name: 'view',\n      default_page: '',\n      retain_page_state: false\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      width: '100%',\n      height: '100%'\n    };\n  }\n}\n","<div class=\"nav-outlet\"\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  eruCanvasEventHandler>\n\n  @for (def of resolvedPageDefAsList(); track def.id) {\n    <eru-runtime-canvas [pageDef]=\"def\" [retainPageState]=\"retainPageState()\"></eru-runtime-canvas>\n  } @empty {\n  }\n  @if (!resolvedPageDef() && mountPageId()) {\n    <div class=\"nav-outlet-loading\">\n      <mat-icon>hourglass_empty</mat-icon>\n    </div>\n  } @else if (store.editMode()) {\n    <div class=\"nav-outlet-placeholder\">\n      <mat-icon>view_quilt</mat-icon>\n      <div class=\"nav-outlet-placeholder-label\">Nav Outlet</div>\n      <div class=\"nav-outlet-placeholder-hint\">Mounts the page selected by URL param</div>\n    </div>\n  } @else {\n    <div class=\"nav-outlet-empty\"></div>\n  }\n</div>\n","import { Component, Input, ViewChild, AfterViewInit, inject, signal, effect, OnInit, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BaseComponent } from '../base-component/base-component';\nimport { MatButtonModule } from '@angular/material/button';\nimport { EruGridStore, EruGridComponent, PRESENTATION_DATATYPES, EruGridService, DataTypes, Field, AggregationFunction, GridAction, GridConfiguration, GridPreset, RowDataRequest, RowGroup, ExcelDownloadRequest, CellValueChange } from 'eru-grid';\nimport { of, delay, map } from 'rxjs';\nimport { ComponentSchemaService } from '../../services';\nimport { ComponentEventSubscription, EntityField, PropertySchema } from '../../models';\n\nimport { EruGridCardHostComponent } from './grid-card-host.component';\nimport { parsePayloadField } from '../../utils/payload-field.util';\n\n// Column attributes eru-grid owns locally rather than inheriting from the data\n// model: `field_size` is set by column resize and `grid_index` by column\n// reorder, both persisted as design overrides. Everything else on the entity\n// field flows through to the column untouched, so a datatype's configuration\n// (options, statuses, formats, colour bands, precision, symbol...) is authored\n// once in the data model and honoured identically on a page and in a grid.\nconst GRID_OWNED_COLUMN_KEYS = ['field_size', 'grid_index'] as const;\n\n@Component({\n  selector: 'eru-data-grid',\n  standalone: true,\n  imports: [CommonModule, EruGridComponent, MatButtonModule, EruGridCardHostComponent],\n  templateUrl: './grid.component.html',\n  styleUrl: './grid.component.scss'\n})\nexport class GridComponent extends BaseComponent implements OnInit, AfterViewInit {\n  @ViewChild('eruGrid') eruGrid!: EruGridComponent;\n\n  // Grid configuration\n  public gridConfig: GridConfiguration | undefined;\n  private isGridInitialized = signal(false);\n  private lastSortKey: string | null = null;\n  // Last view mode pushed to eru-grid; guards the runtime re-apply effect.\n  private _appliedViewMode: string | null = null;\n  private processingRequests = new Set<string>();\n  private gridRequestMap = new Map<string, string>(); // groupId -> requestId\n  private pendingViewFileGridRequests = new Map<string, string>(); // studioRequestId -> eruGridKey\n  private forwardedViewFileGridKeys = new Set<string>();\n  // The page list the column design panel offers as a `page` cell's layout,\n  // relayed to the host app: studioRequestId -> eruGridKey.\n  private pendingPageListRequests = new Map<string, string>();\n  private forwardedPageListKeys = new Set<string>();\n  // A grid select's option request, relayed to eru-studio's own host.\n  private pendingSelectOptionRequests = new Map<string, string>(); // studioRequestId -> eruGridKey\n  private forwardedSelectOptionKeys = new Set<string>();\n  // People-option requests forwarded to the host app: studioRequestId -> eruGridKey.\n  private pendingPeopleGridRequests = new Map<string, string>();\n  private forwardedPeopleGridKeys = new Set<string>();\n  // Excel-download requests forwarded to the host app: studioRequestId -> eru-grid request id.\n  private pendingExcelDownloadRequests = new Map<string, number>();\n  private forwardedExcelDownloadIds = new Set<number>();\n  // Watches html/body for the host app's theme swap so token-derived excel\n  // colours are re-resolved against the theme actually on screen.\n  private themeObserver?: MutationObserver;\n  // Full ordered column set (before per-viewport hide filtering).\n  private allFields: Field[] = [];\n  // Per-column design overrides (deltas) keyed by column name. Seeded lazily\n  // from the persisted `column_overrides` property, accumulated on each edit.\n  private columnOverrides: Record<string, any> | null = null;\n  /** Last stats request sent, so an unchanged rule set does not refetch. */\n  private lastColumnStatsKey = '';\n  // Fingerprint of the aggregation list the total rows were last fetched with,\n  // so the catch-up pass runs once per change rather than on every page of rows.\n  private lastTotalsKey = '';\n  // Fingerprint of the last query+payload fetched, so a state change that does\n  // not affect the query/payload does not re-trigger an endless fetch loop.\n  private lastQueryKey = '';\n  // The exact payload the executegroup call went out with. The per-group row\n  // fetches reuse it verbatim instead of rebuilding, so the count pass and the\n  // row pass always see identical variables — rebuilding would resolve the\n  // bound state again at a later moment, and a value that lands in between\n  // (org_id/process_id from the host, a date the user just changed) would make\n  // the rows disagree with the count they were paginated against. A payload\n  // change re-triggers the group fetch, which reseeds this.\n  private lastQueryPayload: Record<string, any> | null = null;\n  // Which load the rows on screen belong to. Bumped whenever the group list is\n  // rebuilt or the rows are cleared, so a per-group page that was asked for\n  // under an older payload can be recognised on arrival and dropped instead of\n  // being appended to the rows of the load that replaced it — which is how the\n  // same records ended up in the grid many times over when a page's controls\n  // seeded their state one after another.\n  // Trailing window the query dispatch waits out, so a change that lands as\n  // several state writes in a row (a select that writes an id and a label, a\n  // filter bar reset) goes to the server once, with the values it settles on.\n  private static readonly QUERY_DISPATCH_DEBOUNCE_MS = 150;\n  private queryDispatchTimer: any;\n  private rowsGeneration = 0;\n  /** Generation each in-flight per-group row request was issued under. */\n  private rowRequestGenerations = new Map<string, number>();\n\n  /** Empty-selection signature, so the selection effect's first run emits nothing. */\n  private lastSelectionSignature = 'ids:';\n  // Guards the 'Select First Row' auto-selection so it fires once per data load.\n  private _autoSelectedFirstRow = false;\n  protected override schemaService = inject(ComponentSchemaService);\n\n  /** Columns to hide for the current viewport: the `hide_columns` multiselect\n   *  merged with any manually-typed names from `hide_columns_manual`. The manual\n   *  list matters for nested-page grids whose columns aren't known until the\n   *  parent query fires, so the dropdown is empty at design time.\n   *\n   *  Hiding is additive across breakpoints: the base list is what the author\n   *  means by \"hidden\", and a breakpoint list hides more on top of it. Normal\n   *  responsive resolution replaces instead — a breakpoint value wins outright\n   *  and base is never read — so one column hidden at, say, `xl` shadowed the\n   *  whole base list and every other hidden column came back on a wide screen.\n   *  That also contradicted the design pane's Hidden checkbox, which writes to\n   *  base precisely because it means \"hidden everywhere\" (see\n   *  routeHiddenToProperty). Unhiding a column for one breakpoint is not\n   *  expressible this way, and never was: the multiselect writes a whole array,\n   *  so removing a name only ever read as \"hide fewer here\" by accident. */\n  private hiddenColumnNames(): Set<string> {\n    const names = new Set<string>();\n    const base = (this.component()?.properties as any)?.base;\n    for (const hide of [base?.hide_columns, this.getProperty('hide_columns')]) {\n      if (Array.isArray(hide)) for (const n of hide) names.add(n);\n    }\n    for (const manual of [base?.hide_columns_manual, this.getProperty('hide_columns_manual')]) {\n      if (typeof manual === 'string') {\n        for (const n of manual.split(',').map(s => s.trim()).filter(Boolean)) names.add(n);\n      }\n    }\n    return names;\n  }\n\n  /**\n   * Layer the user's per-column design overrides (deltas) on top of the\n   * source columns (entity fields / query-inferred). Only attributes the user\n   * actually changed in design mode are stored as overrides, so everything else\n   * keeps flowing from the source.\n   */\n  /** Per-column overrides, seeded once from the persisted property then accumulated in-memory. */\n  private getColumnOverrides(): Record<string, any> {\n    if (this.columnOverrides === null) {\n      const persisted = this.getProperty('column_overrides');\n      this.columnOverrides = (persisted && typeof persisted === 'object') ? { ...persisted } : {};\n    }\n    return this.columnOverrides as Record<string, any>;\n  }\n\n  /**\n   * Cell editability of a data-model field, in eru-grid's `editable` terms.\n   *\n   * The data model authors this with two separate keys, and which one applies\n   * depends on the field: a derived-from-child field (`dfc`) is governed by its\n   * `editable` toggle (\"may this rolled-up value be overridden by hand\"), every\n   * other field by the general \"Can Edit?\" toggle `can_edit` (default true).\n   * eru-grid only knows `editable`, and inheriting that key verbatim read the\n   * rollup toggle for ordinary fields too — where it is stored `false` — which\n   * left every entity-backed column read-only regardless of the data model.\n   */\n  private entityFieldEditable(ef: Record<string, any> | undefined): boolean {\n    if (!ef) return true;\n    if (ef['dfc']) return ef['editable'] === true || ef['editable'] === 'true';\n    return ef['can_edit'] !== false && ef['can_edit'] !== 'false';\n  }\n\n  /**\n   * Build a grid column from a data-model field. The whole entity field is\n   * passed through — hand-picking a few keys here is what previously left every\n   * configurable datatype (dropdown options, status colours, date formats,\n   * decimal precision, currency symbol, colour bands) rendering with library\n   * defaults inside a studio-hosted grid, no matter how the process was set up.\n   * Only the layout keys the grid owns are withheld; user design overrides are\n   * layered on top afterwards by applyColumnOverrides().\n   */\n  private entityFieldToColumn(fieldName: string, ef: EntityField | undefined, index: number): Field {\n    const inherited: Record<string, any> = { ...(ef || {}) };\n    for (const key of GRID_OWNED_COLUMN_KEYS) delete inherited[key];\n    return {\n      ...inherited,\n      name: fieldName,\n      label: ef?.label || fieldName,\n      datatype: (ef?.datatype || 'textbox') as DataTypes,\n      editable: this.entityFieldEditable(ef as Record<string, any> | undefined),\n      field_size: 150,\n      grid_index: index,\n    } as Field;\n  }\n\n  private applyColumnOverrides(fields: Field[]): Field[] {\n    const overrides = this.getColumnOverrides();\n    const merged = fields.map(f => {\n      const override = overrides[f.name];\n      if (!override) return f;\n      const column = { ...f, ...override } as Field;\n      // A stored `label` override IS an author's renaming, so flag it — that is\n      // what stops eru-grid re-seeding the heading from the mapped data-model\n      // field on the next resolve. Derived here rather than relied on from the\n      // override itself so columns renamed before the flag existed keep their\n      // heading instead of reverting to the model's on first load.\n      if (Object.prototype.hasOwnProperty.call(override, 'label') &&\n          String(override.label ?? '').trim() !== '') {\n        (column as any).label_overridden = true;\n      }\n      // `composite` and `page` are how a column is DRAWN, not what it holds, so\n      // an override setting one of them would otherwise erase the only record\n      // of the real type — and a composite's primary part is the column itself,\n      // which then had nothing to format its value by. The source field still\n      // knows, so carry its datatype across. Doing it here rather than only at\n      // authoring time also repairs composites configured before this existed.\n      if (PRESENTATION_DATATYPES.has(String(override.datatype ?? '')) &&\n          !column.presentation_base_datatype &&\n          !PRESENTATION_DATATYPES.has(String(f.datatype ?? ''))) {\n        column.presentation_base_datatype = f.datatype;\n      }\n      // A width typed into the panel has to become the column's `field_size`,\n      // which is the only width eru-grid lays a column out by. Source columns\n      // are all seeded `field_size: 150`, so eru-grid's own minWidth fallback\n      // never gets a look in and a column set to 700 still rendered at 150.\n      // A width set by DRAGGING is stored as a `field_size` override and stays\n      // in charge — it is the later, more specific statement of the two.\n      if (override.field_size === undefined && typeof column.minWidth === 'number' && column.minWidth > 0) {\n        const max = typeof column.maxWidth === 'number' && column.maxWidth > 0 ? column.maxWidth : null;\n        column.field_size = max && column.minWidth > max ? max : column.minWidth;\n      }\n      return column;\n    });\n    // Respect grid_index (set by column reorder) for the rendered order.\n    return merged\n      .map((f, i) => ({ f, i }))\n      .sort((a, b) => ((a.f.grid_index ?? a.i) - (b.f.grid_index ?? b.i)) || (a.i - b.i))\n      .map(x => x.f);\n  }\n\n  /**\n   * The design pane's Hidden checkbox, redirected to the `hide_columns`\n   * property.\n   *\n   * As a column override it was a one-way door: eru-grid drops an `is_hidden`\n   * column from the header row, and the tune icon that opens the design panel\n   * goes with it, so nothing was left to untick. `hide_columns` is a\n   * multiselect in the properties panel listing every column, so a hide made\n   * there or here can always be undone in the same place.\n   *\n   * Any stale `is_hidden` already sitting in the overrides is explicitly\n   * cleared, or it would keep the column hidden no matter what the property\n   * says. Returns the patch with `is_hidden` removed.\n   */\n  private routeHiddenToProperty(name: string, patch: Partial<Field>): Partial<Field> {\n    if (!('is_hidden' in (patch as any))) return patch;\n    const { is_hidden, ...rest } = patch as any;\n    const current = this.getProperty('hide_columns');\n    const names = new Set<string>(Array.isArray(current) ? current : []);\n    if (is_hidden) names.add(name); else names.delete(name);\n    this.persistHideColumns([...names]);\n    if (this.getColumnOverrides()[name]?.is_hidden !== undefined) rest.is_hidden = false;\n    return rest;\n  }\n\n  /**\n   * Write `hide_columns` at base, addressing the component by id.\n   *\n   * Not setProperty(): that goes through updateComponentPropertyAtBreakpoint,\n   * which returns early unless the grid is the *selected* component — and\n   * opening the column design panel from a header does not select it, so the\n   * write was dropped without a word. persistColumnOverrides addresses the\n   * component directly for the same reason.\n   *\n   * Base rather than the active breakpoint because the design pane's checkbox\n   * says \"Hidden\", not \"hidden on this viewport\": the `is_hidden` it replaces\n   * applied everywhere, and a base value is what every breakpoint falls back\n   * to. Per-viewport hiding stays the properties panel's job.\n   */\n  private persistHideColumns(names: string[]): void {\n    const comp = this.component();\n    if (!comp?.id) return;\n    const properties = {\n      ...(comp.properties || {}),\n      base: { ...((comp.properties as any)?.base || {}), hide_columns: names },\n    };\n    this.store.updateComponent(comp.id, { properties } as any);\n  }\n\n  /**\n   * Merge one or more per-column override patches into the in-memory map and\n   * persist the full map at base, by component id (no need for the grid to be\n   * the currently-selected component).\n   */\n  private persistColumnOverrides(updates: Record<string, Partial<Field>>): void {\n    const componentId = this.component()?.id;\n    if (!componentId) return;\n    const ov = this.getColumnOverrides();\n    for (const [name, patch] of Object.entries(updates)) {\n      ov[name] = { ...(ov[name] || {}), ...patch };\n    }\n    this.columnOverrides = { ...ov };\n    const comp = this.component();\n    if (!comp) return;\n    const properties = {\n      ...(comp.properties || {}),\n      base: { ...((comp.properties as any)?.base || {}), column_overrides: this.columnOverrides },\n    };\n    this.store.updateComponent(componentId, { properties } as any);\n  }\n\n  /**\n   * True when the grid's rows can be traced back to a stored record, which is\n   * what any cell edit ultimately has to be written to.\n   *\n   * An entity-backed grid always can — every row is an entity read. The array\n   * sources (query, page field, state) hand over plain objects, and only the\n   * `entity_id_field` property says which of their keys carries the record id.\n   * Nothing infers it: a query that does not select the id has rows that simply\n   * are not addressable, and guessing would write to the wrong record.\n   */\n  private rowsAreIdentifiable(): boolean {\n    const ds = this.getProperty('data_source');\n    if (ds === 'entity' || ds === 'nested_entity') return true;\n    return !!this.entityIdField();\n  }\n\n  /** Row key holding the record id, for the array data sources. Blank when unset. */\n  private entityIdField(): string {\n    const key = this.getProperty('entity_id_field');\n    return typeof key === 'string' ? key.trim() : '';\n  }\n\n  /** True when the page has wired up 'On Cell Edit' itself. */\n  private hasCellEditSubscription(): boolean {\n    return (this.component()?.events || []).some(e => e.event === 'cell_value_change');\n  }\n\n  /**\n   * Lock the columns whose save target is unknowable. On the array sources a\n   * column name is a select-list alias that no entity need have, so only a\n   * column carrying a `mapped_entity`/`mapped_field` mapping can be written\n   * back — the rest would open an editor and drop the value on close.\n   *\n   * A configured 'On Cell Edit' subscription lifts this: the author is building\n   * the write themselves off the row, so an alias column is theirs to interpret\n   * and locking it would leave them an event that can never fire.\n   *\n   * Only unmapped columns are touched, which is exactly the set eru-grid's\n   * data-model merge leaves alone — see the `editable` getter for why the\n   * mapped ones are gated grid-wide instead. Applied to what is handed to the\n   * grid and never written back into `allFields`, so the lock can lift again\n   * when a mapping or subscription is added.\n   */\n  private clampEditableColumns(fields: Field[]): Field[] {\n    const ds = this.getProperty('data_source');\n    if (ds === 'entity' || ds === 'nested_entity') return fields;\n    if (this.hasCellEditSubscription()) return fields;\n    return fields.map(f => {\n      const mapped = !!(f as any).mapped_entity && !!(f as any).mapped_field;\n      return mapped ? f : { ...f, editable: false };\n    });\n  }\n\n  /** Push the full column set to the grid, with overrides applied, filtered by the current viewport's hidden columns. */\n  private setGridFields(full: Field[]): void {\n    this.allFields = this.applyColumnOverrides(full || []);\n    if (!this.gridConfig || !this.eruGrid?.gridService) return;\n    const hidden = this.hiddenColumnNames();\n    // Marked hidden, not dropped. eru-grid already keeps an `is_hidden` column\n    // out of the header and out of the excel payload, while still listing it in\n    // the design panel's target picker (badged \"hidden\") and — the reason this\n    // matters — in the field pickers a column's own settings use, such as a\n    // currency column's Symbol From Field. Filtering the column out here left\n    // eru-grid unaware it existed, so a hidden sibling could not be named as a\n    // symbol source.\n    this.gridConfig.fields = this.applyDrillFlags(\n      this.clampEditableColumns(this.allFields.map(\n        f => hidden.has(f.name) ? { ...f, is_hidden: true } : f)));\n    // Keep mode current — pushing config with a stale mode would revert a\n    // board/pivot grid back to table (set_table_configuration replaces mode).\n    this.gridConfig.mode = this.viewMode;\n    // Re-read too: `editable` depends on entity_id_field / On Cell Edit, either\n    // of which can change after the config was first built.\n    if (this.gridConfig.config) this.gridConfig.config.editable = this.editable;\n    this.eruGrid.gridService.set_table_configuration(this.gridConfig);\n  }\n\n  override componentEvents = [\n    { label: 'On Row Select', value: 'row_select' },\n    { label: 'On Selection Change', value: 'selection_change' },\n    { label: 'On Cell Edit', value: 'cell_value_change' },\n    { label: 'Custom Action', value: 'custom_action' },\n    { label: 'On Drill', value: 'on_drill' }\n  ];\n\n  /**\n   * Column keys that have at least one 'On Drill' subscription.\n   *\n   * This is what makes a cell a link: eru-grid renders the drill affordance for\n   * any column whose Field carries `enableDrilldown`, and that flag is derived\n   * from here rather than configured separately — a link that drills nowhere,\n   * or a handler no cell can reach, is not a state worth being able to express.\n   *\n   * Case-folded for the same reason custom actions are: the key is typed by\n   * hand against a column name, and a case slip would silently produce a\n   * subscription that never fires.\n   */\n  private get drillColumnKeys(): Set<string> {\n    const keys = new Set<string>();\n    for (const e of this.component()?.events || []) {\n      if (e.event !== 'on_drill') continue;\n      const key = (e.drill_column || '').trim().toLowerCase();\n      if (key) keys.add(key);\n    }\n    return keys;\n  }\n\n  /** Stamp `enableDrilldown` onto the columns that have an On Drill handler. */\n  private applyDrillFlags(fields: Field[]): Field[] {\n    const keys = this.drillColumnKeys;\n    return fields.map(f => {\n      const drillable = keys.has(String(f.name || '').toLowerCase());\n      return f.enableDrilldown === drillable ? f : { ...f, enableDrilldown: drillable };\n    });\n  }\n\n  /**\n   * A drill click came back from the grid. Every 'On Drill' subscription naming\n   * that column runs, in the order they appear in the page's event list — the\n   * same grouping rule as Custom Action, so one link can drive several actions.\n   *\n   * The payload extends 'On Row Select' with the cell that was clicked: which\n   * column, its value, and in pivot mode the column-dimension path that located\n   * it. `entity_data` is the row, with the pivot coordinate merged in by\n   * eru-grid, so an api/query configured on the event can filter by it.\n   */\n  private onGridDrilldown(drill: any): void {\n    if (this.store.editMode()) return;\n    const column = String(drill?.columnName || '');\n    if (!column) return;\n    const key = column.toLowerCase();\n    const row = drill?.rowData;\n    const entityId = row?.entity_id ?? '';\n    const entityData = row?.entity_data ?? row ?? {};\n    const entityName = row?.entity_name ?? this.component()?.entityName;\n    this.emitEvent(\n      'on_drill',\n      {\n        row: entityData,\n        rowId: entityId,\n        column_name: column,\n        column_value: drill?.columnValue ?? null,\n        mode: drill?.mode ?? (this.viewMode === 'pivot' ? 'pivot' : 'table'),\n        pivot_path: drill?.pivotPath ?? []\n      },\n      undefined,\n      {\n        entity_id: entityId,\n        entity_data: entityData,\n        entity_name: entityName,\n        // Namespaced so a handler can address it as `drill.column_value` from\n        // set-from-payload, and so it cannot collide with the record's fields.\n        context: {\n          drill: {\n            column_name: column,\n            column_value: drill?.columnValue ?? null,\n            mode: drill?.mode ?? (this.viewMode === 'pivot' ? 'pivot' : 'table'),\n            pivot_path: drill?.pivotPath ?? [],\n            // What the cell covers. `scope` is the one to filter a source by:\n            // on a subtotal or grand total the row's own fields hold the label\n            // rather than the dimension values, so they cannot be used.\n            row_kind: drill?.rowKind ?? 'data',\n            column_kind: drill?.columnKind ?? 'data',\n            is_total: (drill?.rowKind && drill.rowKind !== 'data')\n              || (drill?.columnKind && drill.columnKind !== 'data') || false,\n            scope: drill?.scope ?? {},\n            source_count: drill?.sourceCount ?? null\n          }\n        }\n      },\n      subscription => (subscription.drill_column || '').trim().toLowerCase() === key\n    );\n  }\n\n  /**\n   * Identity of a custom action, for grouping subscriptions and for matching a\n   * click back to them. Trimmed and case-folded so 'Approve', 'approve ' and\n   * 'APPROVE' are one action rather than three icons that each do part of the\n   * job. Grouping and click-matching must use this same key or a click would\n   * fire a different set than the icon represents.\n   */\n  private static actionKey(name: string | undefined | null): string {\n    return (name || '').trim().toLowerCase();\n  }\n\n  /**\n   * The row actions handed to eru-grid, one per distinct action NAME across the\n   * configured 'Custom Action' subscriptions.\n   *\n   * The action list lives in the events, not in a property of its own: an\n   * action IS its handler, and splitting the icon from what it does would let\n   * the two drift — an icon with no subscription, or a subscription no icon can\n   * reach.\n   *\n   * A subscription carries a single action, so running several things from one\n   * icon means several subscriptions sharing a name. They collapse to ONE icon\n   * here, and onGridActionClick() runs all of them — see there for the ordering\n   * rules. Because the author should not have to restate the presentation on\n   * each one, the icon and visible-condition are merged across the group: the\n   * first non-blank value wins, whichever subscription it was set on.\n   */\n  private get gridActions(): GridAction[] {\n    const byKey = new Map<string, GridAction>();\n    for (const e of this.component()?.events || []) {\n      if (e.event !== 'custom_action') continue;\n      const name = (e.action_name || '').trim();\n      if (!name) continue;\n      const icon = (e.action_icon || '').trim() || undefined;\n      const condition = (e.action_visible_condition || '').trim() || undefined;\n      const existing = byKey.get(GridComponent.actionKey(name));\n      if (!existing) {\n        byKey.set(GridComponent.actionKey(name), {\n          action_name: name,\n          action_icon: icon,\n          action_visible_condition: condition\n        });\n        continue;\n      }\n      existing.action_icon = existing.action_icon ?? icon;\n      existing.action_visible_condition = existing.action_visible_condition ?? condition;\n    }\n    return [...byKey.values()];\n  }\n\n  /**\n   * A row action was clicked in the grid. Every subscription declaring that\n   * action name runs, and nothing else does — see emitEvent's\n   * subscriptionFilter. Several subscriptions sharing a name is how one icon\n   * performs several actions, since a subscription holds only one.\n   *\n   * They run in the order they appear in the page's event list, so an author\n   * orders the steps by ordering the cards. Note that emitEvent stops the whole\n   * run if a subscription with 'Validate Before Action' fails its check — the\n   * remaining steps are skipped rather than half-applied.\n   *\n   * The payload matches 'On Row Select' so a handler written for one works for\n   * the other, with the action name added for handlers that branch on it.\n   */\n  onGridActionClick(payload: { action: GridAction | null; row: any; mode: 'table' | 'board'; group?: any }): void {\n    if (this.store.editMode()) return;\n    const actionName = payload?.action?.action_name || '';\n    if (!actionName) return;\n    const actionKey = GridComponent.actionKey(actionName);\n    const row = payload?.row;\n    const entityId = row?.entity_id ?? '';\n    const entityData = row?.entity_data ?? row ?? {};\n    const entityName = row?.entity_name ?? this.component()?.entityName;\n    this.emitEvent(\n      'custom_action',\n      {\n        row: entityData,\n        rowId: entityId,\n        action_name: actionName,\n        mode: payload?.mode,\n        groupId: payload?.group?.id ?? null\n      },\n      undefined,\n      { entity_id: entityId, entity_data: entityData, entity_name: entityName },\n      subscription => GridComponent.actionKey(subscription.action_name) === actionKey\n    );\n  }\n\n  /**\n   * Where an edited cell has to be written back: the entity that owns the field\n   * and the field's name there.\n   *\n   * A column can reach the data model two ways. An entity-backed grid takes its\n   * columns straight from the entity, so the column name IS the field name. A\n   * query-backed grid names its columns after the query's select list, and only\n   * the column's `mapped_entity`/`mapped_field` design mapping says what that\n   * column really is — the column name may be a query alias that no entity has.\n   *\n   * `savable` is what gates the automatic save. A column mapped to an entity\n   * OTHER than the one the grid lists (an account name shown on a deals grid) is\n   * deliberately excluded: the row's entity_id identifies the deal, not the\n   * account, so there is no record to write it to. The event still fires so a\n   * page can handle it with an api/function of its own.\n   */\n  private cellSaveTarget(change: CellValueChange): { entity_name: string; field_name: string; savable: boolean } {\n    const gridEntity = this.getProperty('entity_name') || this.component()?.entityName || '';\n    const rowEntity = change.row?.entity_name || '';\n    const entityName = rowEntity || gridEntity;\n    const column = (this.eruGrid?.gridStore?.columns() || []).find((c: Field) => c.name === change.fieldName) as any;\n    const mappedEntity = column?.mapped_entity;\n    const mappedField = column?.mapped_field;\n    if (mappedEntity && mappedField) {\n      const ownedByThisGrid = !entityName || mappedEntity === entityName;\n      return { entity_name: mappedEntity, field_name: mappedField, savable: ownedByThisGrid };\n    }\n    // Unmapped: only an entity-backed grid can say what the column is, because\n    // there the column name IS the field name. On the array sources it is a\n    // select-list alias that no entity need have, so the edit is forwarded but\n    // not saved — mapping the column is what makes it savable.\n    const ds = this.getProperty('data_source');\n    const entityBacked = ds === 'entity' || ds === 'nested_entity';\n    return { entity_name: entityName, field_name: change.fieldName, savable: entityBacked && !!entityName };\n  }\n\n  /**\n   * The record id of an edited row. Entity-backed rows carry `entity_id`; the\n   * array sources carry it under whatever key `entity_id_field` names, and\n   * nowhere else — eru-grid's own `rowId` falls back to a synthetic\n   * \"<rowIndex>_<column>\" cell id, which would address no record at all.\n   */\n  private rowEntityId(row: any): string {\n    if (!row) return '';\n    const ds = this.getProperty('data_source');\n    if (ds === 'entity' || ds === 'nested_entity') return row.entity_id || '';\n    const key = this.entityIdField();\n    return key ? (row[key] ?? '') : '';\n  }\n\n  /**\n   * An editable cell finished an edit session with a changed value. eru-grid\n   * only announces this on its store — it never writes the value back or\n   * persists it — so the wrapper has to pick it up and forward it, or the edit\n   * dies inside the grid. The event carries just the edited field keyed by the\n   * ROW's entity, not the page's, since a grid usually lists something other\n   * than the page it sits on.\n   *\n   * With no subscription configured the grid still saves, via the default\n   * subscription below: an editable cell whose edits silently vanish is never\n   * what the page author meant, and it matches how the same signal is consumed\n   * outside studio pages (processo's data viewer).\n   */\n  private onCellValueChange(change: CellValueChange): void {\n    if (this.store.editMode()) return;\n    const target = this.cellSaveTarget(change);\n    const entityId = this.rowEntityId(change.row);\n    const savable = target.savable && !!entityId;\n    const defaultSubscription: ComponentEventSubscription | undefined = savable\n      ? {\n          id: `${this.component().id}_cell_value_change`,\n          event: 'cell_value_change',\n          action: 'save-page-data',\n          page_id: this.component().pageId || this.store.currentPage()?.id || ''\n        }\n      : undefined;\n    // Everything a handler gets goes in the payload override — emitEvent's\n    // `data` argument is not forwarded to the subscription.\n    this.emitEvent(\n      'cell_value_change',\n      undefined,\n      defaultSubscription,\n      {\n        entity_id: entityId,\n        entity_data: { [target.field_name]: change.newValue },\n        entity_name: target.entity_name,\n        row_entity_name: target.entity_name,\n        old_entity_data: { [target.field_name]: change.oldValue },\n        row: change.row\n      }\n    );\n  }\n\n  onRowSelect(payload: { row: any; mode: 'table' | 'board'; group?: any }): void {\n    if (this.store.editMode()) return;\n    const row = payload?.row;\n    const entityId = row?.entity_id ?? '';\n    const entityData = row?.entity_data ?? row ?? {};\n    const entityName = row?.entity_name ?? this.component()?.entityName;\n    this.emitEvent(\n      'row_select',\n      {\n        row: entityData,\n        rowId: entityId,\n        mode: payload?.mode,\n        groupId: payload?.group?.id ?? null\n      },\n      undefined,\n      { entity_id: entityId, entity_data: entityData, entity_name: entityName }\n    );\n  }\n\n  /**\n   * Checkbox multi-selection, forwarded as `selection_change`.\n   *\n   * Unlike `row_select` (a row *click*, one record) this is the whole tick-box\n   * set, and it is the only route by which selected records become addressable\n   * from a page: an author lands it in page state with `update-state` and every\n   * other requirement — a count, a sum, a button that posts the ids — then falls\n   * out of the state bindings that already exist.\n   *\n   * The payload is namespaced under a single `selection` key so an author's\n   * payload path stays stable and cannot collide with the record fields.\n   */\n  private onSelectionChange(): void {\n    if (this.store.editMode()) return;\n    const gridStore = this.eruGrid?.gridStore;\n    if (!gridStore) return;\n\n    const select_all_matching = gridStore.selectAllMatching();\n    // Empty under select-all-matching: the ids cover the loaded pages only, so\n    // they describe neither what the user selected nor what the handler should\n    // act on — `filter_criteria` does, and acting on it is a server round-trip\n    // that would re-derive the ids anyway. Sending the partial list invites a\n    // handler to treat it as the whole selection.\n    const selected_ids = select_all_matching\n      ? []\n      : Array.from(gridStore.selectedRowIds());\n    const total_count = gridStore.totalMatchingCount();\n\n    this.emitEvent(\n      'selection_change',\n      undefined,\n      undefined,\n      {\n        entity_id: '',\n        entity_data: {},\n        entity_name: this.getProperty('entity_name') || this.component()?.entityName,\n        context: {\n          selection: {\n            selected_ids,\n            // Off by default, and always empty under select-all-matching for the\n            // same reason the ids are: only the loaded rows are here. Kept in\n            // the payload as an empty array either way so the shape never\n            // changes — a formula summing over it reads [] rather than\n            // undefined.\n            // Flattened the way every other row payload is, so a sum over these\n            // reads plain field names.\n            selected_rows: this.getProperty('emit_selected_rows') && !select_all_matching\n              ? gridStore.selectedRows().map((row: any) => row?.entity_data ?? row)\n              : [],\n            // What the user believes they selected. With select-all-matching\n            // accepted that is the whole result set, not the loaded ids.\n            selected_count: select_all_matching ? total_count : selected_ids.length,\n            total_count,\n            select_all_matching,\n            // Only meaningful when select_all_matching is set: the ids cover\n            // loaded pages only, so this is what the handler must act on\n            // instead. Emitted always so the API contract never changes shape.\n            filter_criteria: this.selectionFilterCriteria()\n          }\n        }\n      }\n    );\n  }\n\n  /**\n   * The descriptor that reproduces exactly the rows this grid is showing —\n   * the same source, payload and sort its own row fetches use, minus the\n   * paging window. A handler acting on \"all N matching\" sends this instead of\n   * an id list.\n   */\n  private selectionFilterCriteria(): Record<string, any> {\n    const qsort = this.gridSortColumns();\n    // Which column of the re-run result carries the record id. A handler acting\n    // on \"all N matching\" runs this descriptor itself and gets rows back, not\n    // ids — without the column name it cannot tell which of them to read.\n    const entity_id_field = this.selectionIdField();\n    if (this.getProperty('data_source') === 'query') {\n      const payload: Record<string, any> = { ...(this.lastQueryPayload ?? this.buildQueryPayload()) };\n      delete payload['qlimit'];\n      delete payload['qskip'];\n      return {\n        data_source: 'query',\n        query: this.getProperty('query'),\n        payload,\n        entity_id_field,\n        ...(qsort.length ? { qsort } : {})\n      };\n    }\n    return {\n      data_source: 'entity',\n      entity_name: this.getProperty('entity_name'),\n      group_by: this.getProperty('group_by') || '',\n      entity_id_field,\n      ...(qsort.length ? { qsort } : {})\n    };\n  }\n\n  /**\n   * The row key the selection is identified by — the same rule `rowEntityId`\n   * follows for a single edited row, so what the payload claims the id column\n   * is cannot disagree with the ids in `selected_ids`. Entity reads always\n   * answer with `entity_id`; an array source carries one only where the author\n   * named the column in Entity Id Column, and is blank otherwise.\n   */\n  private selectionIdField(): string {\n    const ds = this.getProperty('data_source');\n    if (ds === 'entity' || ds === 'nested_entity') return 'entity_id';\n    return this.entityIdField();\n  }\n\n  // Grid Features Properties - Configurable through component properties\n  /**\n   * Grid-level editability handed to eru-grid. Beyond the author's own\n   * 'Editable' switch this withdraws editing entirely when an edit could go\n   * nowhere: on the array sources, rows are only addressable once\n   * `entity_id_field` names the key holding the record id, and only then can a\n   * cell edit be saved. A wired-up 'On Cell Edit' subscription is the other way\n   * to qualify — the author is handling the write themselves.\n   *\n   * This is the gate rather than a per-column flag because eru-grid re-merges\n   * `editable` onto every mapped column from its data-model field\n   * (INHERITED_FIELD_KEYS), which would undo a per-column lock. The grid-level\n   * flag sits outside that merge — see the cell template's\n   * `isEditable() && column.editable !== false`.\n   */\n  get editable(): boolean {\n    if ((this.getProperty('editable') ?? true) === false) return false;\n    const ds = this.getProperty('data_source');\n    if (ds === 'entity' || ds === 'nested_entity') return true;\n    return this.rowsAreIdentifiable() || this.hasCellEditSubscription();\n  }\n\n  get columnResizable(): boolean {\n    return this.getProperty('columnResizable') ?? false;\n  }\n\n  get columnReorderable(): boolean {\n    return this.getProperty('columnReorderable') ?? true;\n  }\n\n  get cellSelection(): boolean {\n    return this.getProperty('cellSelection') ?? true;\n  }\n\n  get rowSelection(): boolean {\n    return this.getProperty('rowSelection') ?? true;\n  }\n\n  get filtering(): boolean {\n    return this.getProperty('filtering') ?? true;\n  }\n\n  get showColumnLines(): boolean {\n    return this.getProperty('showColumnLines') ?? true;\n  }\n\n  get showRowLines(): boolean {\n    return this.getProperty('showRowLines') ?? true;\n  }\n\n  get enableRowSubtotals(): boolean {\n    return this.getProperty('enableRowSubtotals') ?? true;\n  }\n\n  get enableColumnSubtotals(): boolean {\n    return this.getProperty('enableColumnSubtotals') ?? true;\n  }\n\n  get enableColumnGrandTotal(): boolean {\n    return this.getProperty('enableColumnGrandTotal') ?? true;\n  }\n\n  get enableGrandTotal(): boolean {\n    return this.getProperty('enableGrandTotal') ?? true;\n  }\n\n  get subtotalPosition(): 'before' | 'after' {\n    return this.getProperty('subtotalPosition') ?? 'after';\n  }\n\n  get subtotalPositionColumn(): 'before' | 'after' {\n    return this.getProperty('subtotalPositionColumn') ?? 'after';\n  }\n\n  get grandTotalPosition(): 'before' | 'after' {\n    return this.getProperty('grandTotalPosition') ?? 'before';\n  }\n\n  get grandTotalPositionColumn(): 'before' | 'after' {\n    return this.getProperty('grandTotalPositionColumn') ?? 'after';\n  }\n\n  get subtotalLabel(): string {\n    return this.getProperty('subtotalLabel') ?? 'Subtotal';\n  }\n\n  get freezeField(): string {\n    return this.getProperty('freezeField') ?? '';\n  }\n\n  get freezeHeader(): boolean {\n    return this.getProperty('freezeHeader') ?? true;\n  }\n\n  get freezeGrandTotal(): boolean {\n    return this.getProperty('freezeGrandTotal') ?? true;\n  }\n\n  get replaceZeroValue(): string {\n    return this.getProperty('replaceZeroValue') ?? '';\n  }\n\n  get gridHeight(): number {\n    return this.getProperty('gridHeight') ?? 370;\n  }\n\n  /** Rows fetched per lazy page. Undefined lets eru-grid use its own default. */\n  get pageSize(): number | undefined {\n    const v = this.getProperty('page_size');\n    return typeof v === 'number' && v > 0 ? v : undefined;\n  }\n\n  get allowSelection(): boolean {\n    return this.getProperty('allowSelection') ?? false;\n  }\n\n  get actionColumn(): boolean {\n    return this.getProperty('action_column') ?? false;\n  }\n\n  get actionPosition(): 'before' | 'after' {\n    return this.getProperty('action_position') ?? 'after';\n  }\n\n  get actionDisplayType(): 'icons' | 'icons_outlined' | 'kebab' {\n    const configured = this.getProperty('action_display_type');\n    return configured === 'kebab' || configured === 'icons_outlined' ? configured : 'icons';\n  }\n\n  get sortable(): boolean {\n    return this.getProperty('sortable') ?? true;\n  }\n\n  get sortBar(): boolean {\n    return this.getProperty('sortBar') ?? false;\n  }\n\n  get groupBar(): boolean {\n    return this.getProperty('groupBar') ?? false;\n  }\n\n  get headerRowHeight(): number {\n    return this.getProperty('headerRowHeight') ?? 36;\n  }\n\n  get dataRowHeight(): number {\n    return this.getProperty('dataRowHeight') ?? 32;\n  }\n\n  get cursorOnHover(): string {\n    return this.getProperty('cursor_on_hover') ?? '';\n  }\n\n  get enableExcelDownload(): boolean {\n    return this.getProperty('excel_download') ?? false;\n  }\n\n  get showExcelDownloadIcon(): boolean {\n    return this.getProperty('excel_download_icon') ?? true;\n  }\n\n  get showRefreshIcon(): boolean {\n    return this.getProperty('refresh_icon') ?? false;\n  }\n\n  get responseKey(): string {\n    return this.getProperty('response_key') || '';\n  }\n\n  /** eru-grid expects fill colours as an array; the panel edits a single colour. */\n  private colorList(key: string): string[] | undefined {\n    const v = this.getProperty(key);\n    const raw: string[] = Array.isArray(v)\n      ? v.filter((c: any) => typeof c === 'string' && c.trim())\n      : (typeof v === 'string' && v.trim() ? [v] : []);\n    const resolved = raw.map(c => this.resolveColor(c)).filter(c => !!c);\n    return resolved.length ? resolved : undefined;\n  }\n\n  /** A colour property, resolved to a literal hex value (or undefined). */\n  private colorOrUndefined(key: string): string | undefined {\n    const v = this.getProperty(key);\n    if (typeof v !== 'string' || !v.trim()) return undefined;\n    return this.resolveColor(v) || undefined;\n  }\n\n  /**\n   * Excel understands literal colours only, so a design token picked in the\n   * panel (`var(--studio-primary)`) has to be resolved before it leaves the\n   * studio. The token chain is resolved by the browser: the value is applied to\n   * a hidden probe inside this grid's element (so nested theme scopes and the\n   * active light/dark branch apply), and the used colour is read back. Returns\n   * '' when it cannot be resolved, so the key is dropped rather than exported\n   * as some unrelated colour.\n   */\n  private resolveColor(value: string): string {\n    const raw = (value || '').trim();\n    if (!raw) return '';\n    const host: HTMLElement = this.elementRef?.nativeElement || document.body;\n    if (!host || typeof document === 'undefined') return '';\n    const token = /^var\\(\\s*(--[^,)]+?)\\s*(?:,[\\s\\S]*)?\\)$/.exec(raw);\n    if (token && !raw.includes(',') && !getComputedStyle(host).getPropertyValue(token[1]).trim()) {\n      // Undefined token with no fallback: it would compute to the inherited\n      // text colour, which is not the colour the user picked.\n      return '';\n    }\n    const probe = document.createElement('span');\n    probe.style.cssText = 'position:absolute;width:0;height:0;visibility:hidden';\n    probe.style.color = raw;\n    if (!probe.style.color) return '';\n    host.appendChild(probe);\n    const used = getComputedStyle(probe).color;\n    probe.remove();\n    return this.toHexColor(used);\n  }\n\n  /**\n   * Paint the colour on a 1×1 canvas and read the pixel back — that leaves the\n   * oklch/lab → sRGB conversion (and any alpha compositing) to the browser,\n   * which plain string parsing cannot do. Fully transparent yields ''.\n   */\n  private toHexColor(color: string): string {\n    const ctx = GridComponent.colorContext();\n    if (!ctx || !color) return '';\n    ctx.clearRect(0, 0, 1, 1);\n    ctx.fillStyle = '#000000';\n    ctx.fillStyle = color;\n    ctx.fillRect(0, 0, 1, 1);\n    const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n    if (!a) return '';\n    return '#' + [r, g, b].map(n => n.toString(16).padStart(2, '0')).join('').toUpperCase();\n  }\n\n  private static _colorCtx: CanvasRenderingContext2D | null | undefined;\n  private static colorContext(): CanvasRenderingContext2D | null {\n    if (GridComponent._colorCtx === undefined) {\n      let ctx: CanvasRenderingContext2D | null = null;\n      if (typeof document !== 'undefined') {\n        const canvas = document.createElement('canvas');\n        canvas.width = 1;\n        canvas.height = 1;\n        ctx = canvas.getContext('2d', { willReadFrequently: true });\n      }\n      GridComponent._colorCtx = ctx;\n    }\n    return GridComponent._colorCtx;\n  }\n\n  private numberOrUndefined(key: string): number | undefined {\n    const v = this.getProperty(key);\n    return typeof v === 'number' && !isNaN(v) ? v : undefined;\n  }\n\n  private textOrUndefined(key: string): string | undefined {\n    const v = this.getProperty(key);\n    return typeof v === 'string' && v.trim() ? v.trim() : undefined;\n  }\n\n  /** Excel header/data style config forwarded to eru-grid, only when the excel\n   *  download icon is enabled. Omitted keys keep eru-grid's own fallbacks. */\n  private buildExcelConfig(): Record<string, any> {\n    if (!this.enableExcelDownload) return { excel_download: false };\n    return {\n      excel_download: true,\n      excel_download_icon: this.showExcelDownloadIcon,\n      response_key: this.responseKey || undefined,\n      header_fill_color: this.colorList('header_fill_color'),\n      header_fill_type: this.textOrUndefined('header_fill_type'),\n      header_fill_pattern: this.numberOrUndefined('header_fill_pattern'),\n      header_font_family: this.textOrUndefined('header_font_family'),\n      header_font_size: this.numberOrUndefined('header_font_size'),\n      header_font_bold: this.getProperty('header_font_bold') ?? undefined,\n      header_font_color: this.colorOrUndefined('header_font_color'),\n      header_border_type: this.textOrUndefined('header_border_type'),\n      header_border_color: this.colorOrUndefined('header_border_color'),\n      header_border_style: this.numberOrUndefined('header_border_style'),\n      data_fill_color: this.colorList('data_fill_color'),\n      data_fill_type: this.textOrUndefined('data_fill_type'),\n      data_fill_pattern: this.numberOrUndefined('data_fill_pattern'),\n      data_font_family: this.textOrUndefined('data_font_family'),\n      data_font_size: this.numberOrUndefined('data_font_size'),\n      data_font_bold: this.getProperty('data_font_bold') ?? undefined,\n      data_font_color: this.colorOrUndefined('data_font_color'),\n      data_border_type: this.textOrUndefined('data_border_type'),\n      data_border_color: this.colorOrUndefined('data_border_color'),\n      data_border_style: this.numberOrUndefined('data_border_style'),\n    };\n  }\n\n  /**\n   * Adapt the ds_people user directory into the option records eru-grid's people\n   * cell reads: it builds each label as `fn ln` and each value from `id`. The\n   * user directory carries one `user_name`, so it is split on the first space.\n   */\n  /** Append a page of options to what the column already holds, without\n   *  repeating a value that is already there. */\n  private mergeSelectOptions(existing: any[], page: any[]): any[] {\n    const seen = new Set(existing.map((o: any) => String(o?.value ?? o)));\n    const added = page.filter((o: any) => !seen.has(String(o?.value ?? o)));\n    return added.length ? [...existing, ...added] : existing;\n  }\n\n  private toGridPeopleOptions(users: any): { id: string; fn: string; ln: string }[] {\n    if (!Array.isArray(users)) return [];\n    return users\n      .map((user: any) => {\n        const id = String(user?.user_id ?? '');\n        if (!id) return null;\n        const name = String(user?.user_name ?? user?.user_email ?? id).trim();\n        const space = name.indexOf(' ');\n        return space > 0\n          ? { id, fn: name.slice(0, space), ln: name.slice(space + 1).trim() }\n          : { id, fn: name, ln: '' };\n      })\n      .filter((option): option is { id: string; fn: string; ln: string } => option !== null);\n  }\n\n  /**\n   * Wrap an eru-grid ExcelDownloadRequest into the payload the host app needs to\n   * run the export itself. The grid supplies `columns` / `excel_styles`; this\n   * adds the data-source context so the host can pick the right route — the\n   * saved query's `/excel` variant, or the entity fetch with `excel: true`.\n   * No row window (qlimit/qskip) is sent: the export covers the full result.\n   */\n  private buildExcelDownloadPayload(request: ExcelDownloadRequest): Record<string, any> {\n    const { id, timestamp, ...descriptor } = request as any;\n    const dataSource = this.getProperty('data_source');\n    const query = this.getProperty('query') || '';\n    const entityName = this.getProperty('entity_name') || '';\n    const baseName = dataSource === 'query' ? query : entityName;\n    return {\n      data_source: dataSource,\n      query,\n      entity_name: entityName,\n      group_by: dataSource === 'query'\n        ? (this.getProperty('query_group_by') || '').trim()\n        : (this.getProperty('group_by') || ''),\n      file_name: `${baseName || 'export'}.xlsx`,\n      payload: dataSource === 'query'\n        ? { ...(this.lastQueryPayload ?? this.buildQueryPayload()), ...descriptor }\n        : { ...descriptor },\n      ...descriptor\n    };\n  }\n\n  get viewMode(): 'table' | 'board' | 'pivot' {\n    const v = this.getProperty('view_mode');\n    return v === 'board' || v === 'pivot' ? v : 'table';\n  }\n\n  get preset(): GridPreset {\n    const p = this.getProperty('preset');\n    const allowed: GridPreset[] = ['default', 'modern', 'compact', 'bold', 'financial', 'elevated', 'custom'];\n    return allowed.includes(p) ? p : 'default';\n  }\n\n  get boardCardHeight(): number {\n    const h = this.getProperty('board_card_height');\n    return typeof h === 'number' && h > 0 ? h : 132;\n  }\n\n  get boardCardGap(): number {\n    const g = this.getProperty('board_card_gap');\n    return typeof g === 'number' && g >= 0 ? g : 8;\n  }\n\n  get boardCardPadding(): number {\n    const p = this.getProperty('board_card_padding');\n    return typeof p === 'number' && p >= 0 ? p : 8;\n  }\n\n  get cardPageId(): string {\n    return this.getProperty('card_page_id') || '';\n  }\n\n  get boardCardBg(): string {\n    return this.getProperty('board_card_bg') || '';\n  }\n\n  get boardCardHoverBg(): string {\n    return this.getProperty('board_card_hover_bg') || '';\n  }\n\n  get boardCardSelectedBg(): string {\n    return this.getProperty('board_card_selected_bg') || '';\n  }\n\n  get boardCardSelectedOutline(): string {\n    return this.getProperty('board_card_selected_outline') || '';\n  }\n\n  /**\n   * Order the groups themselves are returned in, as an array so more than one\n   * field can drive it later; today the panel offers a single field. Empty array\n   * when unset, so the payload key is always present and the API never has to\n   * distinguish \"not sent\" from \"no ordering\".\n   */\n  get groupOrderBy(): string[] {\n    const v = this.getProperty('group_order_by');\n    if (Array.isArray(v)) return v.filter((s: any) => typeof s === 'string' && s);\n    return (typeof v === 'string' && v.trim()) ? [v.trim()] : [];\n  }\n\n  get boardCountTextColor(): string {\n    return this.getProperty('board_count_text_color') || '';\n  }\n\n  get boardCountBg(): string {\n    return this.getProperty('board_count_bg') || '';\n  }\n\n  get boardColumnHeader(): boolean {\n    return this.getProperty('board_column_header') !== false;\n  }\n\n  get boardColumnMinWidth(): number | undefined {\n    const v = this.getProperty('board_column_min_width');\n    return typeof v === 'number' && v > 0 ? v : undefined;\n  }\n\n  /** Cap on board column width. Undefined (property left blank) = stretch to fill. */\n  get boardColumnMaxWidth(): number | undefined {\n    const v = this.getProperty('board_column_max_width');\n    return typeof v === 'number' && v > 0 ? v : undefined;\n  }\n\n  /** Cap on board column height. 0 = no cap (columns end after their cards);\n   *  undefined (property left blank) = eru-grid's own default. */\n  get boardColumnHeight(): number | undefined {\n    const v = this.getProperty('board_column_height');\n    return typeof v === 'number' && v >= 0 ? v : undefined;\n  }\n\n  /** Board columns wrap onto the next row (default) or stay on one scrolling row. */\n  get boardWrapColumns(): boolean {\n    return this.getProperty('wrap_columns') !== false;\n  }\n\n  private parseFieldList(v: any): string[] {\n    if (Array.isArray(v)) return v.map((s: any) => String(s).trim()).filter((s: string) => !!s);\n    if (typeof v === 'string') return v.split(',').map(s => s.trim()).filter(s => !!s);\n    return v ? [String(v)] : [];\n  }\n\n  get pivotRows(): string[] {\n    return this.parseFieldList(this.getProperty('pivot_rows'));\n  }\n\n  get pivotCols(): string[] {\n    return this.parseFieldList(this.getProperty('pivot_cols'));\n  }\n\n  get pivotAggregations(): Field[] {\n    const raw = this.getProperty('pivot_aggregations');\n    const list = Array.isArray(raw) ? raw : [];\n    // An aggregation is drillable when an 'On Drill' subscription names it —\n    // the same rule as a table column. This used to default to true, which drew\n    // every aggregated cell as a link even though nothing consumed the click.\n    const drillKeys = this.drillColumnKeys;\n    return list\n      .filter((a: any) => a && a.name)\n      .map((a: any, i: number) => ({\n        // Pass the whole saved aggregation through. Hand-picking a few keys\n        // here silently dropped everything the design panel writes — symbol,\n        // decimals, separator, colour bands — so a measure formatted as\n        // currency came back as a bare number on the next build of the config.\n        ...a,\n        name: a.name,\n        label: a.label || a.name,\n        datatype: (a.datatype || 'number') as DataTypes,\n        field_size: a.field_size || 100,\n        grid_index: i,\n        aggregationFunction: (a.aggregationFunction || 'sum') as AggregationFunction,\n        showSubtotals: a.showSubtotals !== false,\n        enableDrilldown: drillKeys.has(String(a.name).toLowerCase())\n      }));\n  }\n\n  /**\n   * Returns the board card template only when board mode + a card page are configured.\n   * Cast to `any` to sidestep cross-bundle TemplateRef identity mismatches between\n   * eru-grid's compiled types and the consumer's Angular runtime types.\n   */\n  resolvedBoardTemplate(tpl: any): any {\n    return (this.viewMode === 'board' && this.cardPageId) ? tpl : undefined;\n  }\n\n  /** Same structural-type escape hatch as resolvedBoardTemplate, for the\n   *  per-cell page renderer. Always supplied: eru-grid only invokes it for a\n   *  column whose datatype is 'page'. */\n  resolvedCellTemplate(tpl: any): any {\n    return tpl;\n  }\n\n  // Map eru-grid design-token keys (→ CSS vars like --grid-primary) to the\n  // component property that supplies each value. Mirrors the token set the\n  // eru-grid usage app exposes.\n  private static readonly GRID_TOKEN_PROPS: { token: string; prop: string }[] = [\n    { token: 'grid-primary', prop: 'token_primary' },\n    { token: 'grid-on-primary', prop: 'token_on_primary' },\n    { token: 'grid-surface', prop: 'token_surface' },\n    { token: 'grid-surface-container', prop: 'token_surface_container' },\n    { token: 'grid-surface-container-high', prop: 'token_surface_container_high' },\n    { token: 'grid-header-color', prop: 'token_header_color' },\n    { token: 'grid-on-surface', prop: 'token_on_surface' },\n    { token: 'grid-on-surface-variant', prop: 'token_on_surface_variant' },\n    { token: 'grid-outline', prop: 'token_outline' },\n    { token: 'grid-outline-variant', prop: 'token_outline_variant' },\n  ];\n\n  /** Build the grid `tokens` map: static alignment tokens plus any design-token\n   *  colours the user set in the panel (token or custom).\n   *\n   *  Every colour key is always emitted, blank when unset. eru-grid paints\n   *  these as inline CSS vars on its host and only clears the keys it is\n   *  handed, so omitting an unset key left the previous colour painted (and\n   *  `!important`, so it beat the preset): clearing a token, or switching the\n   *  preset away from Custom, showed no change until the page was reloaded. */\n  private buildGridTokens(): Record<string, string> {\n    const tokens: Record<string, string> = {\n      'grid-aggregation-text-align': 'center',\n      'grid-aggregation-text-align-number': 'left',\n    };\n    // Colours are owned by the preset; the user's custom colour tokens only\n    // apply when preset = 'custom' (mirrors the panel's disable-unless-custom).\n    const is_custom = this.preset === 'custom';\n    for (const { token, prop } of GridComponent.GRID_TOKEN_PROPS) {\n      const v = is_custom ? this.getProperty(prop) : '';\n      tokens[token] = (typeof v === 'string' && v.trim()) ? v.trim() : '';\n    }\n    return tokens;\n  }\n\n  private buildGridConfig(): GridConfiguration {\n    // Columns come from their source (entity fields / query results); the user's\n    // per-column overrides are layered on top. Idempotent if already applied.\n    const base = (this.allFields.length ? this.allFields : (this.gridConfig?.fields || [])) as Field[];\n    const fullFields = this.applyColumnOverrides(base);\n    this.allFields = fullFields;\n    const hidden = this.hiddenColumnNames();\n    // Marked hidden, not dropped — the same rule setGridFields() follows, and\n    // for the same reason. Filtering here left eru-grid unaware the column\n    // existed at all, so on the next page load a hidden column vanished from\n    // the design panel's own field pickers: a composite's Secondary/Third\n    // field, and a currency's Symbol From Field, all name sibling columns that\n    // are USUALLY hidden precisely because the composite now shows them. The\n    // slot still held the name, but the option was gone, so the picker read as\n    // empty and re-opening the panel offered no way to see or change it.\n    const fields = this.applyDrillFlags(\n      this.clampEditableColumns(fullFields.map(\n        f => hidden.has(f.name) ? { ...f, is_hidden: true } : f)));\n    return {\n      mode: this.viewMode,\n      fields,\n      pageSize: this.pageSize,\n      preset: this.preset,\n      tokens: this.buildGridTokens(),\n      config: {\n        editable: this.editable,\n        columnResizable: this.columnResizable,\n        columnReorderable: this.columnReorderable,\n        cellSelection: this.cellSelection,\n        rowSelection: this.rowSelection,\n        filtering: this.filtering,\n        enableRowSubtotals: this.enableRowSubtotals,\n        subtotalPosition: this.subtotalPosition,\n        enableColumnSubtotals: this.enableColumnSubtotals,\n        subtotalPositionColumn: this.subtotalPositionColumn,\n        enableGrandTotal: this.enableGrandTotal,\n        enableColumnGrandTotal: this.enableColumnGrandTotal,\n        grandTotalPositionColumn: this.grandTotalPositionColumn,\n        subtotalLabel: this.subtotalLabel,\n        replaceZeroValue: this.replaceZeroValue,\n        freezeField: this.freezeField,\n        freezeHeader: this.freezeHeader,\n        freezeGrandTotal: this.freezeGrandTotal,\n        showColumnLines: this.showColumnLines,\n        showRowLines: this.showRowLines,\n        grandTotalPosition: this.grandTotalPosition,\n        gridHeight: this.gridHeight,\n        allowSelection: this.allowSelection,\n        actionColumn: this.actionColumn,\n        actionColumnPosition: this.actionPosition,\n        action_display_type: this.actionDisplayType,\n        actions: this.gridActions,\n        sortable: this.sortable,\n        sortBar: this.sortBar,\n        groupBar: this.groupBar,\n        headerRowHeight: this.headerRowHeight,\n        dataRowHeight: this.dataRowHeight,\n        cursorOnHover: this.cursorOnHover,\n        boardCardBg: this.boardCardBg || undefined,\n        boardCardHoverBg: this.boardCardHoverBg || undefined,\n        boardCardSelectedBg: this.boardCardSelectedBg || undefined,\n        boardCardSelectedOutline: this.boardCardSelectedOutline || undefined,\n        boardCountTextColor: this.boardCountTextColor || undefined,\n        boardCountBg: this.boardCountBg || undefined,\n        boardColumnHeader: this.boardColumnHeader,\n        boardColumnMinWidth: this.boardColumnMinWidth,\n        boardColumnMaxWidth: this.boardColumnMaxWidth,\n        boardColumnHeight: this.boardColumnHeight,\n        boardWrapColumns: this.boardWrapColumns,\n        designMode: this.store.editMode(),\n        refresh_icon: this.showRefreshIcon,\n        ...this.buildExcelConfig()\n      } as any,\n      styles: {\n        subTotalStyle: 'bold' as const,\n        grandTotalStyle: 'bold' as const\n      },\n      columnConstraints: {\n        global: {\n          minWidth: 50,\n          maxWidth: 500\n        },\n        byDatatype: {\n          textbox: { minWidth: 100, maxWidth: 400 },\n          email: { minWidth: 150, maxWidth: 350 },\n          number: { minWidth: 70, maxWidth: 500 }\n        }\n      },\n      pivot: {\n        clientSideThreshold: 10000,\n        rows: this.pivotRows,\n        cols: this.pivotCols,\n        aggregations: this.pivotAggregations\n      },\n    }\n  }\n\n  ngAfterViewInit() {\n    // Placeholder group: hasMoreRows:false so it does NOT auto-trigger a row\n    // fetch before the real group(s) arrive from the executegroup call. The\n    // data-source effect seeds the real group (with the count) which then drives\n    // the paginated fetch — otherwise this placeholder fires a duplicate fetch.\n    let group_data = [\n      {\n        id: '',\n        title: '',\n        totalRowCount: 0,\n        isExpanded: true,\n        currentPage: 0,\n        hasMoreRows: false,\n        currentLoadedRows: 0,\n        isLoading: false,\n        key: '',\n      },\n    ] as RowGroup[];\n    this.gridConfig = this.buildGridConfig();\n    this.eruGrid.set_table_group(group_data || []);\n    this.eruGrid.gridService.set_table_configuration(this.gridConfig);\n    this.eruGrid.gridService.set_grid_mode(this.viewMode);\n    this.isGridInitialized.set(true);\n  }\n\n  constructor() {\n    super();\n\n    // A record edited elsewhere on the page — through the page data a\n    // `set-page-data` copied out of one of these rows — reaches the grid here.\n    // Without it the row kept the value it was fetched with, so the list and\n    // the panel disagreed until the grid was refreshed. Ids the grid is not\n    // holding are ignored by patchRecord, so no filtering is needed.\n    effect(() => {\n      const patch = this.store.recordFieldPatch();\n      if (!patch) return;\n      untracked(() => {\n        if (!this.isGridInitialized()) return;\n        this.eruGrid?.gridStore.patchRecord(patch.entity_id, patch.fields);\n      });\n    });\n\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const selected = this.store.selectedComponent();\n      const myId = untracked(() => this.component()?.id);\n      if (!selected || selected.id !== myId) return;\n      untracked(() => {\n        this.component.set(selected);\n        this.gridConfig = this.buildGridConfig();\n        if (this.eruGrid?.gridService) {\n          this.eruGrid.gridService.set_table_configuration(this.gridConfig);\n          this.eruGrid.gridService.set_grid_mode(this.viewMode);\n        }\n      });\n    });\n\n    // Re-apply the grid view mode whenever `view_mode` changes at runtime —\n    // e.g. an `update-property` action toggling table/board. Without this the\n    // mode only updated on selection in the editor, so it never switched in\n    // view mode or the page viewer.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const mode = this.viewMode;\n      if (mode === this._appliedViewMode) return;\n      this._appliedViewMode = mode;\n      untracked(() => {\n        // Mode-only switch: just change the grid mode, like the eru-grid usage\n        // app. Rebuilding the configuration here (set_table_configuration) would\n        // re-run the grid's row-loading and re-fetch/duplicate already-loaded\n        // rows. The grid reads its mode from the store, so set_grid_mode alone\n        // is enough — the data stays put.\n        // Also keep the cached gridConfig.mode in sync: other effects (e.g.\n        // setGridFields when query rows load) push this.gridConfig back via\n        // set_table_configuration, and a stale mode there would silently revert\n        // the grid to table right after switching to board.\n        if (this.gridConfig) this.gridConfig.mode = mode;\n        this.eruGrid?.gridService?.set_grid_mode(mode);\n      });\n    });\n\n    // Effect to handle dynamic data requests meant for this component\n    effect(() => {\n      const requests = this.store.dynamicDataRequests();\n      const componentId = this.component()?.id;\n      if (!componentId) return;\n      for (const [requestId, request] of requests.entries()) {\n        let processed = false;\n        if (request.componentId === componentId && request.status === 'pending') {\n          if (request.type === 'ds_entity_name') {\n            const ds = this.getProperty('data_source');\n            let options: { label: string, value: string }[] = [];\n            if (ds === 'nested_entity') {\n              options = this.store.nestedEntities().map(e => ({ label: e.display_name || e.name || '', value: e.name || '' }));\n            } else if (ds === 'entity') {\n              const parentName = this.store.currentPage()?.entity_name || '';\n              if (parentName) {\n                const children = this.store.getChildEntities(parentName) || [];\n                options = children.map(ent => ({ label: ent.display_name || ent.name || '', value: ent.name || '' }));\n              }\n            }\n            untracked(() => this.store.setDynamicDataResponse(request, options));\n            processed = true;\n          } else if (request.type === 'ds_fields') {\n            const entityName = request.payload || this.getProperty('entity_name');\n            let options: { label: string, value: string }[] = [];\n            if (entityName) {\n              const fields = this.store.getEntityFields(entityName);\n              if (fields) {\n                options = fields.map(f => ({ label: f.label || f.name || '', value: f.name || '' }));\n              } else {\n                options = [];\n              }\n            }\n            // Add a global update to also serve anyone lacking component context\n            untracked(() => {\n              this.store.setDynamicDataResponse(request, options)\n              this.store.setDynamicData('ds_fields', options);\n            });\n            processed = true;\n          } else if (request.type === 'ds_group_fields') {\n            const entityName = request.payload || this.getProperty('entity_name');\n            let options: { label: string, value: string }[] = [];\n            options.push({ label: 'None', value: '' });\n            if (entityName) {\n              const fields = this.store.getEntityFields(entityName).filter(f => f.can_group === true && f.field_type === 'USER')\n              if (fields) {\n                options = [...options, ...fields.map(f => ({ label: f.label || f.name || '', value: f.name || '' }))];\n              }\n            }\n            // Add a global update here as well\n            untracked(() => {\n              this.store.setDynamicDataResponse(request, options);\n              this.store.setDynamicData('ds_group_fields', options);\n            });\n            processed = true;\n          } else if (request.type === 'ds_grid_columns') {\n            // Columns currently available in the grid (full set), used as the\n            // option list for the per-viewport 'Hide Columns' multiselect. For\n            // the page_field / state sources the grid columns are the keys of\n            // the mapped JSON array's rows (not entity metadata / card fields),\n            // so derive the options from the resolved rows directly.\n            const ds = this.getProperty('data_source');\n            let options: { label: string, value: string }[];\n            if (ds === 'page_field' || ds === 'state') {\n              const rows = this.readBindingRows();\n              const sample = rows.length\n                ? ((rows[0]?.entity_data && typeof rows[0].entity_data === 'object') ? rows[0].entity_data : rows[0])\n                : {};\n              options = Object.keys(sample || {}).map(k => ({ label: k, value: k }));\n            } else {\n              options = (this.allFields || []).map(f => ({ label: f.label || f.name || '', value: f.name || '' }));\n            }\n            untracked(() => {\n              this.store.setDynamicDataResponse(request, options);\n              this.store.setDynamicData('ds_grid_columns', options);\n            });\n            processed = true;\n          } else if (request.type === 'ds_grid_drill_keys') {\n            // Keys an 'On Drill' subscription may name. Columns plus the pivot\n            // aggregations, because in pivot mode the drillable cells are the\n            // aggregated ones and their key is the aggregation's name — which\n            // is configured on this component, not present in the column list.\n            const options: { label: string, value: string }[] = [];\n            const seen = new Set<string>();\n            const push = (value: string, label: string) => {\n              const v = (value || '').trim();\n              if (!v || seen.has(v)) return;\n              seen.add(v);\n              options.push({ label, value: v });\n            };\n            for (const f of this.allFields || []) push(f.name || '', f.label || f.name || '');\n            for (const a of this.pivotAggregations) {\n              push(a.name || '', `${a.label || a.name} (aggregation)`);\n            }\n            untracked(() => {\n              this.store.setDynamicDataResponse(request, options);\n              this.store.setDynamicData('ds_grid_drill_keys', options);\n            });\n            processed = true;\n          }\n        }\n        if (processed) {\n          this.store.removeDynamicDataRequest(request.requestId);\n        }\n      }\n    });\n\n\n    effect(() => {\n      if (!this.isGridInitialized()) {\n        return;\n      }\n      if (!this.isEffectivelyVisible()) {\n        return;\n      }\n      // Sit out the page's load burst. Every control with a Default From State\n      // seeds its variable as it mounts, so a grid whose payload binds six of\n      // them saw six different payloads within a few hundred milliseconds and\n      // fired a query for each — the answers arriving interleaved, each one's\n      // per-group row pages landing on top of the next one's groups. Read as a\n      // signal, so this effect re-runs by itself once the page is settled and\n      // then fetches ONCE, with the values the controls ended up holding. A\n      // change the user makes afterwards is not part of a burst and reloads\n      // the grid immediately, as before.\n      if (this.store.isPageSettling(this.component()?.pageId)) {\n        return;\n      }\n      const dataSource = this.getProperty('data_source');\n      if (dataSource === 'query') {\n        const query = this.getProperty('query');\n        const groupBy = (this.getProperty('query_group_by') || '').trim();\n        const aggregations = this.groupAggregations();\n        // Track payload bindings so the grid re-fetches when bound state/page\n        // values change — but only when the resolved query/payload actually\n        // changes, otherwise unrelated state updates would loop endlessly.\n        const _payloadTracker = this.store.computedPageState();\n        if (!query) return;\n        // Go through the executegroup route first (like the eru-grid usage\n        // app): with a group-by it returns one count row per group; with an empty\n        // group-by it returns a single total-count row. Either way the grid is\n        // seeded with group(s) carrying the count, and eru-grid then drives the\n        // paginated per-group `execute` calls via the request queue.\n        //\n        // This applies to pivot too. The count looks redundant there — nothing\n        // is paginated on screen — but it is what tells the grid how many rows\n        // the aggregation is over, and so when it has them all. Without it the\n        // grid cannot know a page was the last one and keeps asking.\n        const payload = this.buildQueryPayload();\n        const groupOrderBy = this.groupOrderBy;\n        const fingerprint = JSON.stringify({ query, groupBy, groupOrderBy, aggregations, payload });\n        if (fingerprint !== this.lastQueryKey) {\n          this.lastQueryKey = fingerprint;\n          untracked(() => {\n            this.scheduleQueryDispatch(() => {\n              this.lastQueryPayload = payload;\n              this.store.requestDynamicData(this.component()?.id || '', 'fetch_query_group_data', { query, payload, group_by: groupBy, group_order_by: groupOrderBy, aggregations });\n            });\n          });\n        }\n        return;\n      }\n      if (dataSource === 'function') {\n        // One call, whole result. A function answers with a JSON payload rather\n        // than a pageable result set, so none of the executegroup/per-group\n        // machinery above applies — the rows are rendered directly, the way the\n        // page_field and state sources do it.\n        const functionName = (this.getProperty('function_name') || '').trim();\n        const _payloadTracker = this.store.computedPageState();\n        if (!functionName) return;\n        const payload = this.buildQueryPayload();\n        const fingerprint = JSON.stringify({ ds: 'function', functionName, payload });\n        if (fingerprint !== this.lastQueryKey) {\n          this.lastQueryKey = fingerprint;\n          untracked(() => {\n            this.scheduleQueryDispatch(() => {\n              this.lastQueryPayload = payload;\n              this.store.requestDynamicData(this.component()?.id || '', 'fetch_function_data', { function: functionName, payload });\n            });\n          });\n        }\n        return;\n      }\n      if (dataSource === 'page_field' || dataSource === 'state') {\n        // The rows already live in the page's data or state — no fetch. Read\n        // the bound JSON array and render it directly. Reading computedPageState\n        // (state) and getPageFieldData (page-data signal) inside the effect makes\n        // it re-render whenever that value changes.\n        const _stateTracker = this.store.computedPageState();\n        const rows = this.readBindingRows();\n        const fingerprint = JSON.stringify({ ds: dataSource, field: this.getProperty('array_field'), rows });\n        if (fingerprint !== this.lastQueryKey) {\n          this.lastQueryKey = fingerprint;\n          untracked(() => this.renderRowsDirectly(rows));\n        }\n        return;\n      }\n      const groupByField = this.getProperty('group_by');\n      const entityName = this.getProperty('entity_name');\n      const currentKey = groupByField && entityName ? `${entityName}.${groupByField}` : '';\n      // Only refetch when the entity/grouping actually changes. getProperty()\n      // subscribes to the whole componentPropertyOverrides signal, so an\n      // unrelated override (e.g. a view_mode toggle) would otherwise re-run this\n      // effect and reload the data on every Kanban/List switch. The view-mode\n      // effect handles mode switches separately via set_grid_mode only.\n      const groupOrderBy = this.groupOrderBy;\n      const fingerprint = JSON.stringify({ ds: 'entity', entityName, groupByField, groupOrderBy });\n      if (fingerprint === this.lastQueryKey) return;\n      this.lastQueryKey = fingerprint;\n      untracked(() => {\n        const payload = {\n          entity_name: entityName,\n          group_by: groupByField,\n          group_order_by: groupOrderBy,\n          currentKey: currentKey,\n          nestingType: '',\n          aggregations: this.buildTotalsAggregations(),\n        };\n        this.store.requestDynamicData(this.component()?.id || '', 'fetch_entity_group_data', payload);\n      });\n    });\n\n    // A header sort is a row-ordering change, so the rows have to come back from\n    // the server in the new order: drop what is loaded and re-page, which puts\n    // qsort on each execute-query call.\n    //\n    // Deliberately NOT refreshGrid(): that re-seeds the group list, and\n    // setGroups() rewrites sortColumns whenever the group field changes (it\n    // forces the grouped field to the front, ascending). Clearing the groups and\n    // setting them again therefore changes the very signal this effect watches,\n    // which fed itself an endless executegroup storm. reloadRowsForCurrentGroups\n    // keeps the same group field, so sortColumns is never touched.\n    //\n    // Only a sort seen while rows are on screen is a user action: the entry the\n    // group field adds on the first setGroups() lands before anything is loaded,\n    // and there is nothing to re-order then anyway. Row presence is read as a\n    // signal so the arrival of the first page re-runs this and banks the current\n    // sort, rather than the next real sort being spent on arming the watch.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const store = this.eruGrid?.gridStore;\n      const key = JSON.stringify(store?.sortColumns?.() ?? []);\n      const hasRows = !!store && (store.groups() || [])\n        .some((g: RowGroup) => store.getRowsForGroup(g.id).length > 0);\n      untracked(() => {\n        if (!hasRows || this.lastSortKey === null) {\n          this.lastSortKey = key;\n          return;\n        }\n        if (key === this.lastSortKey) return;\n        this.lastSortKey = key;\n        if (this.getProperty('data_source') !== 'query') return;\n        this.reloadRowsForCurrentGroups();\n      });\n    });\n\n    // Answer eru-grid's data-model lookups. The grid is deliberately ignorant\n    // of processo's entities — it asks by key and we resolve from the store, so\n    // a column can be mapped to a data-model field regardless of whether the\n    // grid itself is fed by an entity or a query.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const requests = this.eruGrid?.gridStore.dynamicDataRequest() || [];\n      if (!requests.length) return;\n      // Track the entity catalogue so a data-model edit re-resolves live.\n      const _entities = this.store.entities();\n      untracked(() => {\n        const grid = this.eruGrid?.gridStore;\n        if (!grid) return;\n        for (const request of requests) {\n          const key = request?.key;\n          if (typeof key !== 'string') continue;\n\n          if (key === 'ds_entities') {\n            grid.setDynamicData(key, (this.store.getEntities() || []).map((e: any) => ({\n              value: e.name,\n              label: e.display_name || e.label || e.name\n            })));\n            grid.removeDynamicDataRequest(key);\n            continue;\n          }\n\n          if (key.startsWith('ds_entity_fields:')) {\n            const entity = key.substring('ds_entity_fields:'.length);\n            grid.setDynamicData(key, (this.store.getEntityFields(entity) || []).map((f: any) => ({\n              value: f.name,\n              label: f.label || f.name,\n              datatype: f.datatype\n            })));\n            grid.removeDynamicDataRequest(key);\n            continue;\n          }\n\n          if (key.startsWith('ds_entity_field_meta:')) {\n            const ref = key.substring('ds_entity_field_meta:'.length);\n            const dot = ref.indexOf('.');\n            if (dot <= 0) continue;\n            const entity = ref.substring(0, dot);\n            const fieldName = ref.substring(dot + 1);\n            const field = this.store.getEntityField(fieldName, entity);\n            if (field) {\n              // eru-grid merges this straight onto the mapped column via\n              // INHERITED_FIELD_KEYS, so `editable` has to be handed over in the\n              // grid's terms — see entityFieldEditable(). Whether the grid may\n              // be edited at all is a separate, grid-level question answered by\n              // the `editable` getter; this only carries the data model's word\n              // on the field, cached per entity.field for the page's lifetime.\n              grid.setDynamicData(key, {\n                ...field,\n                editable: this.entityFieldEditable(field as Record<string, any>)\n              });\n              grid.removeDynamicDataRequest(key);\n            }\n            continue;\n          }\n        }\n      });\n    });\n\n    /**\n     * The design panel's cell-page picker. eru-grid asks for `ds_pages` and\n     * eru-studio has no page catalogue of its own, so the request is forwarded\n     * to the host, which answers with {value: page_id, label: page_name} — the\n     * ids a `page` cell is rendered by.\n     */\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const requests = this.eruGrid?.gridStore.dynamicDataRequest() || [];\n      const componentId = untracked(() => this.component()?.id);\n      if (!componentId) return;\n      untracked(() => {\n        for (const request of requests) {\n          const key = request?.key;\n          if (key !== 'ds_pages' || this.forwardedPageListKeys.has(key)) continue;\n          this.forwardedPageListKeys.add(key);\n          const requestId = this.store.requestDynamicData(componentId, 'ds_all_page_name', '');\n          this.pendingPageListRequests.set(requestId, key);\n        }\n      });\n    });\n\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const requests = this.eruGrid?.gridStore.dynamicDataRequest() || [];\n      const componentId = untracked(() => this.component()?.id);\n      if (!componentId) return;\n      const prefix = 'ds_view_file_grid:';\n      untracked(() => {\n        for (const request of requests) {\n          const key = request.key;\n          if (typeof key !== 'string' || !key.startsWith(prefix)) continue;\n          if (this.forwardedViewFileGridKeys.has(key)) continue;\n          const fileName = key.substring(prefix.length);\n          this.forwardedViewFileGridKeys.add(key);\n          const requestId = this.store.requestDynamicData(componentId, 'ds_view_file_grid', { file_name: fileName });\n          this.pendingViewFileGridRequests.set(requestId, key);\n        }\n      });\n    });\n\n    /**\n     * A grid select column's option list (ENTITY_DATA / API), relayed to this\n     * component's own host.\n     *\n     * eru-grid does not know who is rendering it: it asks its consumer through\n     * its dynamic-data framework and waits. When that consumer is processo the\n     * request is answered directly; when it is eru-studio — as here — eru-studio\n     * is the host, and it forwards through ITS dynamic-data framework to its own\n     * host. Without this hop a select column inside a studio page had no answer\n     * at all and its dropdown stayed empty.\n     *\n     * `people` is handled separately below (answered from the user directory\n     * rather than an API), so it is skipped here.\n     */\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const requests = this.eruGrid?.gridStore.dynamicDataRequest() || [];\n      const componentId = untracked(() => this.component()?.id);\n      if (!componentId) return;\n      untracked(() => {\n        for (const request of requests) {\n          const key = request?.key;\n          if (typeof key !== 'string' || !key) continue;\n          const optionType = request.optionType;\n          if (optionType !== 'ENTITY_DATA' && optionType !== 'API') continue;\n          if (optionType === 'API' && request.apiName === 'people') continue;\n          // Keyed by key+search+skip so a new search term or the next page is a\n          // new forward, while an identical in-flight request is not repeated.\n          const signature = `${key}::${request.search || ''}::${request.skip ?? 0}`;\n          if (this.forwardedSelectOptionKeys.has(signature)) continue;\n          this.forwardedSelectOptionKeys.add(signature);\n          const type = optionType === 'ENTITY_DATA' ? 'ds_select_options_entity' : 'ds_select_options_api';\n          const payload = JSON.stringify({\n            entity_name: request.entityName || '',\n            field_name: request.fieldName || '',\n            api_name: request.apiName || '',\n            api_field: request.apiField || '',\n            field_str: request.search || '',\n            limit: request.limit ?? 50,\n            skip: request.skip ?? 0,\n            ...(request.filter && Object.keys(request.filter).length > 0 ? { filter: request.filter } : {}),\n          });\n          const requestId = this.store.requestDynamicData(componentId, type, payload);\n          this.pendingSelectOptionRequests.set(requestId, key);\n        }\n      });\n    });\n\n    // A `people` cell in eru-grid asks for its options as an API named 'people'.\n    // eru-studio answers it from the process user directory instead (the same\n    // ds_people request the eru-people component uses), so a people column needs\n    // no API configured on the process.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const requests = this.eruGrid?.gridStore.dynamicDataRequest() || [];\n      const componentId = untracked(() => this.component()?.id);\n      if (!componentId) return;\n      untracked(() => {\n        for (const request of requests) {\n          const key = request.key;\n          if (typeof key !== 'string' || key !== 'people') continue;\n          if (request.optionType !== 'API' || request.apiName !== 'people') continue;\n          if (this.forwardedPeopleGridKeys.has(key)) continue;\n          this.forwardedPeopleGridKeys.add(key);\n          const requestId = this.store.requestDynamicData(componentId, 'ds_people', '');\n          this.pendingPeopleGridRequests.set(requestId, key);\n        }\n      });\n    });\n\n    // Drain eru-grid's refresh queue. The grid holds no data source of its own,\n    // so its refresh icon can only ask — this runs the same reload the Refresh\n    // Grid action runs, and releases the request once started.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const requests = this.eruGrid?.gridStore.refreshRequest() || [];\n      if (requests.length === 0) return;\n      untracked(() => {\n        for (const request of requests as { id: number }[]) {\n          this.eruGrid?.gridStore.removeRefreshRequest(request.id);\n          this.refreshGrid();\n        }\n      });\n    });\n\n    // Drain eru-grid's excel-download queue and forward each request to the host\n    // app (processo), which owns the HTTP layer. eru-studio is a pass-through:\n    // it adds the data-source context (query + payload, or entity + grouping)\n    // onto the { columns, excel_styles } descriptor the grid already built, and\n    // releases the grid request once the host reports back.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const requests = this.eruGrid?.gridStore.excelDownloadRequest() || [];\n      const componentId = untracked(() => this.component()?.id);\n      if (!componentId) return;\n      untracked(() => {\n        for (const request of requests as ExcelDownloadRequest[]) {\n          if (this.forwardedExcelDownloadIds.has(request.id)) continue;\n          this.forwardedExcelDownloadIds.add(request.id);\n          const studioRequestId = this.store.requestDynamicData(componentId, 'excel_download', this.buildExcelDownloadPayload(request));\n          this.pendingExcelDownloadRequests.set(studioRequestId, request.id);\n        }\n      });\n    });\n\n    // Release the grid's excel request once the host app has finished (or failed)\n    // the download, mirroring the ds_view_file_grid round-trip below.\n    effect(() => {\n      const responses = this.store.dynamicDataResponses();\n      if (!responses || responses.size === 0) return;\n      if (this.pendingExcelDownloadRequests.size === 0) return;\n      untracked(() => {\n        for (const [studioRequestId, excelId] of Array.from(this.pendingExcelDownloadRequests.entries())) {\n          if (!responses.has(studioRequestId)) continue;\n          const result = responses.get(studioRequestId);\n          if (result?.error) console.error('excel download failed', result.error);\n          this.eruGrid?.gridStore.removeExcelDownloadRequest(excelId);\n          this.forwardedExcelDownloadIds.delete(excelId);\n          this.pendingExcelDownloadRequests.delete(studioRequestId);\n          this.store.removeDynamicDataRequest(studioRequestId);\n        }\n      });\n    });\n\n    // Toggle the grid's design mode live when the page edit mode changes.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const _edit = this.store.editMode();\n      untracked(() => {\n        this.gridConfig = this.buildGridConfig();\n        this.eruGrid?.gridService?.set_table_configuration(this.gridConfig);\n      });\n    });\n\n    // Re-theme the grid when a design token changes at runtime. An\n    // `update-property` action (e.g. a view toggle recolouring the surface)\n    // writes a component property override, which getProperty() picks up — but\n    // the token map lives in gridConfig, which is a plain field. Without this\n    // the new colour is resolvable yet never reaches eru-grid.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      // Track every token property so any of them re-runs this.\n      GridComponent.GRID_TOKEN_PROPS.forEach(({ prop }) => this.getProperty(prop));\n      this.getProperty('preset');\n      untracked(() => {\n        this.gridConfig = this.buildGridConfig();\n        this.eruGrid?.gridService?.set_table_configuration(this.gridConfig);\n      });\n    });\n\n    // Persist design-panel column edits as per-column overrides (deltas) so only\n    // the attributes the user actually changed are stored. On reload these are\n    // layered on top of the source columns (entity fields / query results), so\n    // non-overridden attributes keep flowing from the source.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const change = this.eruGrid?.gridStore.columnMetaPatch();\n      if (!change) return;\n      untracked(() => {\n        // A pivot aggregation is configured on this component (pivot_aggregations),\n        // not derived from the data source, so its design edits belong there —\n        // that is where the author defined it and where it round-trips. Sending\n        // them to column_overrides would key them by the aggregation's SOURCE\n        // column name and so also reformat that column in table view, which is\n        // a different field: the source of a count is often text, the count is\n        // a number.\n        if (this.persistAggregationMeta(change.name, change.patch)) return;\n        const patch = this.routeHiddenToProperty(change.name, change.patch);\n        if (Object.keys(patch).length) this.persistColumnOverrides({ [change.name]: patch });\n      });\n    });\n\n    // Fetch the aggregates the formatting rules ask for. The grid derives the\n    // list from the rules themselves and only republishes it when it actually\n    // changes, so this fires on a rule edit and not on every resize.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const requests = this.eruGrid?.gridStore.columnStatsRequest();\n      untracked(() => this.requestColumnStats(requests ?? null));\n    });\n\n    // Persist column resize as a field_size override on that column.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const resize = this.eruGrid?.gridStore.columnResize();\n      if (!resize?.columnName) return;\n      untracked(() => {\n        // A pivot measure's width belongs with the rest of its configuration,\n        // for the same reason its datatype does — see persistAggregationMeta.\n        if (this.persistAggregationMeta(resize.columnName, { field_size: resize.newWidth })) return;\n        this.persistColumnOverrides({ [resize.columnName]: { field_size: resize.newWidth } });\n      });\n    });\n\n    // Forward an in-grid cell edit out as a component event — see onCellValueChange().\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const change = this.eruGrid?.gridStore.cellValueChange();\n      if (!change?.fieldName) return;\n      untracked(() => this.onCellValueChange(change));\n    });\n\n    // Forward checkbox multi-selection out as a component event — see\n    // onSelectionChange(). Signature-guarded rather than drained: the selection\n    // is standing state, not a one-shot, and the effect's first run (empty set,\n    // matching the initial signature) must not fire a configured action on load.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const gridStore = this.eruGrid?.gridStore;\n      const ids = gridStore?.selectedRowIds();\n      if (!ids) return;\n      const signature = `${gridStore!.selectAllMatching() ? 'all' : 'ids'}:${Array.from(ids).sort().join(',')}`;\n      if (signature === this.lastSelectionSignature) return;\n      this.lastSelectionSignature = signature;\n      untracked(() => this.onSelectionChange());\n    });\n\n    // Forward a drill click on a data cell (table or pivot) — see onGridDrilldown().\n    // Drained after handling so clicking the same cell twice fires twice.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const drill = this.eruGrid?.gridStore.drilldown();\n      if (!drill?.columnName) return;\n      untracked(() => {\n        this.onGridDrilldown(drill);\n        this.eruGrid?.gridStore.clearDrilldown();\n      });\n    });\n\n    // Persist column reorder as grid_index overrides reflecting the new order.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const reorder = this.eruGrid?.gridStore.columnReorder();\n      const cols = reorder?.newColumns;\n      if (!Array.isArray(cols) || cols.length === 0) return;\n      untracked(() => {\n        const updates: Record<string, Partial<Field>> = {};\n        cols.forEach((c: Field) => { if (c?.name) updates[c.name] = { grid_index: c.grid_index }; });\n        this.persistColumnOverrides(updates);\n      });\n    });\n\n    effect(() => {\n      const responses = this.store.dynamicDataResponses();\n      if (!responses || responses.size === 0) return;\n      if (this.pendingPageListRequests.size === 0) return;\n      untracked(() => {\n        for (const [studioRequestId, eruGridKey] of Array.from(this.pendingPageListRequests.entries())) {\n          if (!responses.has(studioRequestId)) continue;\n          this.eruGrid?.gridStore.setDynamicData(eruGridKey, responses.get(studioRequestId));\n          this.eruGrid?.gridStore.removeDynamicDataRequest(eruGridKey);\n          this.forwardedPageListKeys.delete(eruGridKey);\n          this.pendingPageListRequests.delete(studioRequestId);\n        }\n      });\n    });\n\n    effect(() => {\n      const responses = this.store.dynamicDataResponses();\n      if (!responses || responses.size === 0) return;\n      if (this.pendingViewFileGridRequests.size === 0) return;\n      untracked(() => {\n        for (const [studioRequestId, eruGridKey] of Array.from(this.pendingViewFileGridRequests.entries())) {\n          if (responses.has(studioRequestId)) {\n            const data = responses.get(studioRequestId);\n            this.eruGrid?.gridStore.setDynamicData(eruGridKey, data);\n            this.eruGrid?.gridStore.removeDynamicDataRequest(eruGridKey);\n            this.forwardedViewFileGridKeys.delete(eruGridKey);\n            this.pendingViewFileGridRequests.delete(studioRequestId);\n          }\n        }\n      });\n    });\n\n    effect(() => {\n      const responses = this.store.dynamicDataResponses();\n      if (!responses || responses.size === 0) return;\n      if (this.pendingSelectOptionRequests.size === 0) return;\n      untracked(() => {\n        for (const [studioRequestId, eruGridKey] of Array.from(this.pendingSelectOptionRequests.entries())) {\n          if (!responses.has(studioRequestId)) continue;\n          const options = responses.get(studioRequestId);\n          // The grid caches option lists by key; a later page appends so the\n          // rows already scrolled past are not dropped.\n          const existing = this.eruGrid?.gridStore.getDynamicData(eruGridKey);\n          const page = Array.isArray(options) ? options : [];\n          const merged = Array.isArray(existing) && existing.length && page.length\n            ? this.mergeSelectOptions(existing, page)\n            : page;\n          this.eruGrid?.gridStore.setDynamicData(eruGridKey, merged);\n          this.eruGrid?.gridStore.removeDynamicDataRequest(eruGridKey);\n          this.store.removeDynamicDataRequest(studioRequestId);\n          this.pendingSelectOptionRequests.delete(studioRequestId);\n        }\n      });\n    });\n\n    effect(() => {\n      const responses = this.store.dynamicDataResponses();\n      if (!responses || responses.size === 0) return;\n      if (this.pendingPeopleGridRequests.size === 0) return;\n      untracked(() => {\n        for (const [studioRequestId, eruGridKey] of Array.from(this.pendingPeopleGridRequests.entries())) {\n          if (!responses.has(studioRequestId)) continue;\n          const users = responses.get(studioRequestId);\n          this.eruGrid?.gridStore.setDynamicData(eruGridKey, this.toGridPeopleOptions(users));\n          this.eruGrid?.gridStore.removeDynamicDataRequest(eruGridKey);\n          this.store.removeDynamicDataRequest(studioRequestId);\n          this.forwardedPeopleGridKeys.delete(eruGridKey);\n          this.pendingPeopleGridRequests.delete(studioRequestId);\n        }\n      });\n    });\n\n    effect(() => {\n      if (!this.isGridInitialized()) {\n        return;\n      }\n      const requestQueue = this.eruGrid?.gridStore.requestQueue();\n      // Process all requests in the queue\n      requestQueue.forEach((request: any) => {\n        if (!this.processingRequests.has(request.groupId)) {\n          untracked(() => {\n            let requestId: string;\n            if (this.getProperty('data_source') === 'query') {\n              // Per-group page fetch for a query data source: re-run the main\n              // query with { qfilter, qlimit, qskip } merged into its payload so\n              // the saved query can filter/paginate server-side. qfilter keys\n              // off the group's field (RowGroup.key).\n              const pageSize = request.pageSize || 50;\n              // Paginate by how many rows are already loaded for this group, not\n              // page*pageSize. A saved query may return its own (smaller) page\n              // size regardless of qlimit, so a page-index-based skip would jump\n              // past not-yet-loaded rows. Offset-based skip is correct for any\n              // server page size.\n              const loadedOffset = this.eruGrid.gridStore.getRowsForGroup(request.groupId ?? '').length;\n              const queryPayload: any = {\n                ...(this.lastQueryPayload ?? this.buildQueryPayload()),\n                qlimit: pageSize,\n                qskip: loadedOffset,\n              };\n              const qsort = this.gridSortColumns();\n              if (qsort.length) queryPayload.qsort = qsort;\n              if (request.groupKey) {\n                queryPayload.qfilter = { [request.groupKey]: request.groupId };\n              }\n              requestId = this.store.requestDynamicData(this.component()?.id || '', 'fetch_query_data', { query: this.getProperty('query'), payload: queryPayload, request });\n            } else {\n              const payload = {\n                entity_name: this.getProperty('entity_name'),\n                group_by: this.getProperty('group_by') || '',\n                request: request\n              };\n              requestId = this.store.requestDynamicData(this.component()?.id || '', 'fetch_entity_data', payload);\n            }\n            this.gridRequestMap.set(request.groupId, requestId);\n            this.rowRequestGenerations.set(requestId, this.rowsGeneration);\n            this.processingRequests.add(request.groupId);\n          });\n        }\n      });\n    });\n\n    // Handle responses for grid data\n    effect(() => {\n      const responses = this.store.dynamicDataResponses() || new Map<string, any>();\n      if (responses.size === 0) return;\n\n      const requests = this.store.pendingData();\n      const componentId = untracked(() => this.component()?.id);\n      untracked(() => {\n        // Handle responses for group data\n        requests.forEach(request => {\n          // pendingData is shared across all grids on the page; only handle the\n          // responses for requests this grid issued, otherwise a sibling grid\n          // (e.g. two board grids on one page) steals and removes this grid's\n          // response before its own effect can process it.\n          if (request.componentId !== componentId) return;\n          if (request.type === 'fetch_entity_group_data' && request.payload?.stats_only) {\n            // The conditional-formatting stats call. Same request type so it\n            // reuses the entity-group plumbing all the way to the server, but\n            // it must never reach set_table_group: it is one ungrouped row of\n            // aggregates, not the grid's groups.\n            const rows = responses.get(request.requestId);\n            if (rows) {\n              this.applyColumnStats(rows, request.payload?.aggregations);\n              this.store.removePendingData(request.requestId);\n              return;\n            }\n          } else if (request.type === 'fetch_entity_group_data') {\n            const groups = responses.get(request.requestId);\n            if (groups) {\n              // A fresh group list replaces whatever was on screen, so the rows\n              // and the per-group fetch tracking from the PREVIOUS list have to\n              // go first — exactly as the query path does. Without this a group\n              // call that comes back with nothing (or with zero counts) left the\n              // old rows rendered underneath the new, empty group list, so a\n              // search that matched nothing still showed the last results.\n              this.resetLoadedRows();\n              this.eruGrid.set_table_group(groups);\n              this.applyEntityGrandTotal(request.payload, groups);\n              this.store.removePendingData(request.requestId);\n              return;\n            }\n          } else if (request.type === 'fetch_entity_data') {\n            if (!responses.has(request.requestId)) {\n              return;\n            }\n            if (this.isStaleRowResponse(request.requestId)) {\n              this.rowRequestGenerations.delete(request.requestId);\n              this.store.removePendingData(request.requestId);\n              return;\n            }\n            const data = responses.get(request.requestId);\n            const payloadReq = request.payload?.request;\n            const groupId = payloadReq?.groupId !== undefined ? payloadReq.groupId : '';\n            const rows = Array.isArray(data) ? data : (data?.entity_data || []);\n            // See the query branch below: the store gates hasMoreRows on the\n            // group's total count, so a non-empty page means \"maybe more\" and a\n            // zero-row page terminates. `rows.length >= pageSize` mis-fires when a\n            // page comes back smaller than requested.\n            const hasMore = rows.length > 0;\n            this.eruGrid.addRowsForGroup(groupId, rows, hasMore);\n            this.eruGrid.gridStore.completeGroupLoading(groupId);\n            this.eruGrid.gridStore.removeFromRequestQueue(groupId);\n            this.gridRequestMap.delete(groupId);\n            this.processingRequests.delete(groupId);\n            this.rowRequestGenerations.delete(request.requestId);\n            this.store.removePendingData(request.requestId);\n            return;\n          } else if (request.type === 'fetch_query_group_data') {\n            if (!responses.has(request.requestId)) return;\n            const data = responses.get(request.requestId);\n            const aggregations = request.payload?.aggregations;\n            // The conditional-formatting stats pass — one ungrouped row of\n            // column-wide aggregates. Checked before totals_only so it can\n            // never be mistaken for the grand-total row it resembles.\n            if (request.payload?.stats_only) {\n              this.applyColumnStats(this.extractQueryRows(data)[0], aggregations);\n              this.store.removePendingData(request.requestId);\n              return;\n            }\n            // The grand-total pass: the same query re-run with an empty group_by,\n            // so its one row totals every row the grid covers. It must not touch\n            // the group list — the groups it would build are a single unnamed\n            // group that would wipe the real ones and their loaded rows.\n            if (request.payload?.totals_only) {\n              const totalsRow = this.extractQueryRows(data)[0];\n              const totals = this.totalsFromRow(totalsRow, aggregations) ?? null;\n              this.eruGrid.gridStore.setRowGrandTotal(totals);\n              // Ungrouped, the one group covers every row, so its subtotal is\n              // these same numbers — matching what buildQueryGroups() attaches\n              // when the group call was able to carry the aggregations itself.\n              if (totals && this.enableRowSubtotals && !(this.getProperty('query_group_by') || '').trim()) {\n                this.eruGrid.gridStore.setGroupSubtotals({ '': totals });\n              }\n              this.store.removePendingData(request.requestId);\n              return;\n            }\n            // The catch-up subtotals pass — same grouping, aggregations added.\n            // Merged into the groups already on screen rather than rebuilt, so\n            // the rows they have loaded and their scroll position survive.\n            if (request.payload?.subtotals_only) {\n              const gbKey = (request.payload?.group_by || '').split(',').map((x: string) => x.trim()).filter(Boolean)[0] || '';\n              const subtotals: Record<string, Record<string, number>> = {};\n              for (const row of this.extractQueryRows(data)) {\n                const src = (row?.entity_data && typeof row.entity_data === 'object') ? row.entity_data : (row || {});\n                const totals = this.totalsFromRow(row, aggregations);\n                if (!totals) continue;\n                const raw = gbKey ? src[gbKey] : '';\n                subtotals[raw === null || raw === undefined ? '' : String(raw)] = totals;\n              }\n              this.eruGrid.gridStore.setGroupSubtotals(subtotals);\n              this.store.removePendingData(request.requestId);\n              return;\n            }\n            const groups = this.buildQueryGroups(data, request.payload?.group_by || '', aggregations);\n            // Fresh group list — clear any rows/tracking from a previous load\n            // (e.g. the whole-result \"\" group or a prior grouping) so per-group\n            // fetches start clean and rows don't accumulate/duplicate.\n            this.resetLoadedRows();\n            this.eruGrid.set_table_group(groups);\n            this.applyQueryGrandTotal(request.payload, groups, aggregations);\n            this.store.removePendingData(request.requestId);\n            return;\n          } else if (request.type === 'fetch_function_data') {\n            if (!responses.has(request.requestId)) return;\n            const data = responses.get(request.requestId);\n            // Same unwrapping as a query response — Result Path when set,\n            // otherwise a bare array or a Results-style envelope.\n            this.renderRowsDirectly(this.extractQueryRows(data));\n            this.store.removePendingData(request.requestId);\n            return;\n          } else if (request.type === 'fetch_query_data') {\n            if (!responses.has(request.requestId)) return;\n            if (this.isStaleRowResponse(request.requestId)) {\n              this.rowRequestGenerations.delete(request.requestId);\n              this.store.removePendingData(request.requestId);\n              return;\n            }\n            const data = responses.get(request.requestId);\n            // Rows are the objects found at the configured result path — used\n            // as-is (no entity_data wrapping). The grid reads fields directly\n            // off the row, falling back from entity_data when present.\n            const rows = this.extractQueryRows(data);\n            if (rows.length > 0 && this.gridConfig) {\n              // Auto-populate columns from the query result fields. User design\n              // overrides are layered on top by setGridFields().\n              const sample = (rows[0]?.entity_data && typeof rows[0].entity_data === 'object')\n                ? rows[0].entity_data\n                : (rows[0] || {});\n              const fields: Field[] = Object.keys(sample).map((key, index) => (\n                { name: key, label: key, datatype: 'textbox' as DataTypes, field_size: 150, grid_index: index }\n              ));\n              this.setGridFields(fields);\n              // Columns are only known now: a query grid derives them from its\n              // first page of rows, which lands after the group call has already\n              // gone out. If that call could not carry the aggregations the\n              // total rows need, fetch them now.\n              this.syncQueryTotals();\n            }\n            const rdr = request.payload?.request;\n            if (rdr) {\n              // Per-group paginated delivery (grouped query mode).\n              const groupId = rdr.groupId !== undefined ? rdr.groupId : '';\n              // \"More rows?\" is authoritative from the group's total count — the\n              // grid store gates hasMoreRows on currentLoadedRows < totalRowCount\n              // and a zero-row page terminates. `rows.length >= pageSize` is wrong\n              // when the server returns a smaller page than requested (e.g. 5 rows\n              // for a qlimit of 50), which stalls pagination.\n              const hasMore = rows.length > 0;\n              this.eruGrid.addRowsForGroup(groupId, rows, hasMore);\n              this.eruGrid.gridStore.completeGroupLoading(groupId);\n              this.eruGrid.gridStore.removeFromRequestQueue(groupId);\n              this.gridRequestMap.delete(groupId);\n              this.processingRequests.delete(groupId);\n              this.rowRequestGenerations.delete(request.requestId);\n            } else {\n              // Whole-result mode: a single synthetic group with all rows.\n              // Clear any rows from a previous load first (e.g. switching back\n              // from a grouped view) so the \"\" group doesn't accumulate them.\n              // currentLoadedRows/currentPage start at 0 because addRowsForGroup\n              // increments them by the rows it adds — seeding them with\n              // rows.length here would double the count (e.g. \"12 OF 6\").\n              this.resetLoadedRows();\n              this.eruGrid.set_table_group([{\n                id: '',\n                title: '',\n                totalRowCount: rows.length,\n                isExpanded: true,\n                currentPage: 0,\n                hasMoreRows: false,\n                currentLoadedRows: 0,\n                isLoading: false,\n                key: '',\n              }]);\n              this.eruGrid.addRowsForGroup('', rows, false);\n              this.eruGrid.gridStore.completeGroupLoading('');\n            }\n            this.store.removePendingData(request.requestId);\n            return;\n          }\n        });\n      });\n    });\n\n    effect(() => {\n      const actions = this.store.componentActions();\n      const id = this.component()?.id;\n      if (!id) return;\n      const pending = actions.get(id);\n      if (pending) {\n        this.store.consumeComponentAction(id);\n        if (pending.action === 'refresh') {\n          untracked(() => this.refreshGrid());\n        } else if (pending.action === 'download') {\n          // Same enqueue the built-in excel icon performs. The existing\n          // excelDownloadRequest effect below picks it up and forwards it to\n          // the host, so a page button and the icon share one path.\n          untracked(() => this.eruGrid?.requestExcelDownload());\n        }\n      }\n    });\n\n    // Mirror the grid's current row count into a page-state key when the\n    // 'Row Count → State Key' property is set. Lets pages bind empty-state\n    // visibility to `@state.<key> == 0` without writing custom logic.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      const stateKey = this.getProperty('row_count_state_key');\n      if (!stateKey) return;\n      const groupRows = this.eruGrid?.gridStore?.groupRows();\n      if (!groupRows) return;\n      let total = 0;\n      groupRows.forEach((rows) => { total += rows?.length || 0; });\n      const pageId = this.component()?.pageId || this.store.currentPage()?.id || '';\n      untracked(() => {\n        // Only write when the state key has been explicitly declared on the\n        // page. This avoids polluting page state with one row per keystroke\n        // while the user is typing into the 'Row Count → State Key' property\n        // in the panel (each intermediate value would otherwise auto-declare\n        // a new state var via setPageStateValue's auto-declare behavior).\n        const page = this.store.currentPage();\n        const declared = (page?.state || []).some((sv: any) => sv.key === stateKey);\n        if (!declared) return;\n        if (this.store.getPageStateValue(stateKey, pageId) !== total) {\n          this.store.setPageStateValue(stateKey, total, pageId);\n        }\n      });\n    });\n\n    // 'Select First Row': once rows are loaded, select the first row and fire the\n    // row-selection event (mirrors a user click). Fires once per data load; the\n    // guard resets when the grid is emptied (refresh/filter) so it re-selects on\n    // the next load, and stays put after a manual selection.\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      if (this.store.editMode()) return;\n      if (!this.getProperty('select_first_row')) return;\n      const groupRows = this.eruGrid?.gridStore?.groupRows();\n      if (!groupRows) return;\n      let firstRow: any = null;\n      let firstGroupId: any = '';\n      for (const [gid, rows] of groupRows.entries()) {\n        if (rows && rows.length) { firstRow = rows[0]; firstGroupId = gid; break; }\n      }\n      untracked(() => {\n        if (!firstRow) { this._autoSelectedFirstRow = false; return; }\n        if (this._autoSelectedFirstRow) return;\n        this._autoSelectedFirstRow = true;\n        const mode = this.viewMode === 'board' ? 'board' : 'table';\n        const groups = this.eruGrid?.gridStore?.groups?.() || [];\n        const group = groups.find((g: any) => g.id === firstGroupId);\n        if (mode === 'table') {\n          const rid = firstRow.entity_id || '';\n          if (rid) this.eruGrid.gridStore.selectRow(rid);\n        }\n        this.eruGrid.emitRowSelect(firstRow, mode, group);\n      });\n    });\n\n    effect(() => {\n      if (!this.isGridInitialized()) return;\n      // In query/function mode, columns are driven by the fetched rows, not\n      // entity fields.\n      const ds = this.getProperty('data_source');\n      if (ds === 'query' || ds === 'function') return;\n      const fields = this.getProperty('fields');\n      const entityName = this.getProperty('entity_name');\n\n      if (fields && entityName) {\n        const entityFields = this.store.getEntityFields(entityName);\n        if (entityFields) {\n          const list: Field[] = fields.map((fieldName: string, index: number) =>\n            this.entityFieldToColumn(fieldName, entityFields.find(f => f.name === fieldName), index)\n          );\n          untracked(() => {\n            if (this.eruGrid?.gridService && this.gridConfig) {\n              this.setGridFields(list);\n            }\n          });\n        }\n      }\n    });\n\n    // Re-apply the visible column set when the viewport changes or the hidden\n    // column properties are edited, so per-viewport hidden columns (the\n    // hide_columns dropdown and the hide_columns_manual list) take effect live.\n    // The board column min-width / height are responsive too: resolve them for\n    // the current breakpoint and push them so a per-viewport override re-lays\n    // out the Kanban immediately (in the designer and at runtime).\n    effect(() => {\n      const _bp = this.currentBreakpoint();\n      const _hide = this.getProperty('hide_columns');\n      const _hideManual = this.getProperty('hide_columns_manual');\n      const _colMinW = this.getProperty('board_column_min_width');\n      const _colMaxW = this.getProperty('board_column_max_width');\n      const _colH = this.getProperty('board_column_height');\n      const _wrap = this.getProperty('wrap_columns');\n      if (!this.isGridInitialized()) return;\n      untracked(() => {\n        if (this.gridConfig?.config) {\n          (this.gridConfig.config as any).boardColumnMinWidth = this.boardColumnMinWidth;\n          (this.gridConfig.config as any).boardColumnMaxWidth = this.boardColumnMaxWidth;\n          (this.gridConfig.config as any).boardColumnHeight = this.boardColumnHeight;\n          (this.gridConfig.config as any).boardWrapColumns = this.boardWrapColumns;\n        }\n        if (this.allFields.length) {\n          this.setGridFields(this.allFields);\n        } else if (this.gridConfig && this.eruGrid?.gridService) {\n          this.gridConfig.mode = this.viewMode;\n          this.eruGrid.gridService.set_table_configuration(this.gridConfig);\n        }\n      });\n    });\n  }\n\n  /**\n   * Persist a design-panel edit onto the matching pivot aggregation.\n   *\n   * Returns false when the patched name is not an aggregation, so the caller\n   * falls through to the normal per-column override path.\n   */\n  private persistAggregationMeta(name: string, patch: Partial<Field>): boolean {\n    const raw = this.getProperty('pivot_aggregations');\n    const list = Array.isArray(raw) ? raw : [];\n    const index = list.findIndex((a: any) => a && String(a.name) === String(name));\n    if (index === -1) return false;\n\n    const componentId = this.component()?.id;\n    const comp = this.component();\n    if (!componentId || !comp) return true;\n    const updated = list.map((a: any, i: number) => i === index ? { ...a, ...patch } : a);\n    const properties = {\n      ...(comp.properties || {}),\n      base: { ...((comp.properties as any)?.base || {}), pivot_aggregations: updated },\n    };\n    this.store.updateComponent(componentId, { properties } as any);\n    return true;\n  }\n\n  /**\n   * Drop every row on screen and the bookkeeping for the pages still in flight,\n   * and start a new generation.\n   *\n   * Clearing `processingRequests` is what lets the new group list ask for its\n   * first page again, but it does NOT stop the previous list's pages from\n   * coming back — the requests are already out. Those answers name a groupId\n   * that usually still exists, so they used to be appended to the rows of the\n   * load that replaced them. The generation counter is what tells them apart.\n   */\n  private resetLoadedRows(): void {\n    this.rowsGeneration++;\n    // rowRequestGenerations is deliberately NOT cleared: its entries are what\n    // identifies the pages already in flight as belonging to the old load.\n    // Each one is removed as its answer arrives (kept or dropped).\n    this.eruGrid?.gridStore.resetGroupRows();\n    this.processingRequests.clear();\n    this.gridRequestMap.clear();\n  }\n\n  /**\n   * Send a query/function fetch after a short quiet period, replacing one that\n   * has not gone out yet.\n   *\n   * The caller has already banked the fingerprint, so an unchanged payload\n   * never gets here; what this collapses is a run of DIFFERENT payloads\n   * arriving within milliseconds of each other, where only the last one is the\n   * state the user is actually looking at.\n   */\n  private scheduleQueryDispatch(dispatch: () => void): void {\n    if (this.queryDispatchTimer) clearTimeout(this.queryDispatchTimer);\n    this.queryDispatchTimer = setTimeout(() => {\n      this.queryDispatchTimer = undefined;\n      dispatch();\n    }, GridComponent.QUERY_DISPATCH_DEBOUNCE_MS);\n  }\n\n  /** True when a row page belongs to a load that has since been replaced. */\n  private isStaleRowResponse(requestId: string): boolean {\n    const generation = this.rowRequestGenerations.get(requestId);\n    return generation !== undefined && generation !== this.rowsGeneration;\n  }\n\n  /**\n   * Re-page every group against the same group list. The counters are reset so\n   * eru-grid asks for page 0 again; the group field is unchanged, so setGroups()\n   * leaves sortColumns alone and no executegroup call is made — group ordering\n   * is `group_order_by`'s business, not a header sort's.\n   */\n  private reloadRowsForCurrentGroups(): void {\n    if (!this.isGridInitialized() || !this.eruGrid) return;\n    const groups = (this.eruGrid.gridStore.groups() || []).map((g: RowGroup) => ({\n      ...g,\n      currentPage: 0,\n      currentLoadedRows: 0,\n      isLoading: false,\n      hasMoreRows: (g.totalRowCount ?? 0) > 0,\n    }));\n    if (!groups.length) return;\n    this.resetLoadedRows();\n    this.eruGrid.set_table_group(groups);\n  }\n\n  private refreshGrid(): void {\n    if (!this.isGridInitialized()) return;\n    this._autoSelectedFirstRow = false;\n    this.resetLoadedRows();\n\n    const entityName = this.getProperty('entity_name');\n    const groupByField = this.getProperty('group_by');\n    const dataSource = this.getProperty('data_source');\n\n    if (dataSource === 'query') {\n      const query = this.getProperty('query');\n      const groupBy = (this.getProperty('query_group_by') || '').trim();\n      const aggregations = this.groupAggregations();\n      const payload = this.buildQueryPayload();\n      const groupOrderBy = this.groupOrderBy;\n      if (query) {\n        // Always executegroup first (empty group_by → single total-count group);\n        // eru-grid then drives the paginated per-group execute calls.\n        this.lastQueryKey = JSON.stringify({ query, groupBy, groupOrderBy, aggregations, payload });\n        this.lastQueryPayload = payload;\n        this.eruGrid.set_table_group([]);\n        this.store.requestDynamicData(this.component()?.id || '', 'fetch_query_group_data', { query, payload, group_by: groupBy, group_order_by: groupOrderBy, aggregations });\n      }\n    } else if (dataSource === 'entity' || dataSource === 'nested_entity') {\n      const currentKey = groupByField && entityName ? `${entityName}.${groupByField}` : '';\n      const groupOrderBy = this.groupOrderBy;\n      this.lastQueryKey = JSON.stringify({ ds: 'entity', entityName, groupByField, groupOrderBy });\n      const payload = {\n        entity_name: entityName,\n        group_by: groupByField,\n        group_order_by: groupOrderBy,\n        currentKey: currentKey,\n        nestingType: '',\n        aggregations: this.buildTotalsAggregations(),\n      };\n      this.eruGrid.set_table_group([]);\n      this.store.requestDynamicData(this.component()?.id || '', 'fetch_entity_group_data', payload);\n    } else if (dataSource === 'function') {\n      const functionName = (this.getProperty('function_name') || '').trim();\n      if (functionName) {\n        const payload = this.buildQueryPayload();\n        this.lastQueryKey = JSON.stringify({ ds: 'function', functionName, payload });\n        this.lastQueryPayload = payload;\n        this.eruGrid.set_table_group([]);\n        this.store.requestDynamicData(this.component()?.id || '', 'fetch_function_data', { function: functionName, payload });\n      }\n    } else if (dataSource === 'page_field' || dataSource === 'state') {\n      const rows = this.readBindingRows();\n      this.lastQueryKey = JSON.stringify({ ds: dataSource, field: this.getProperty('array_field'), rows });\n      this.renderRowsDirectly(rows);\n    }\n  }\n\n  /**\n   * Extract the rows array from a query response. When a 'Result Path' property\n   * (dot path, e.g. \"0.pouches\") is set, the rows are read from that location;\n   * otherwise falls back to the response itself / its entity_data.\n   */\n  /**\n   * Map an executegroup result into the grid's RowGroup[] — mirrors the entity\n   * grouping shape so the lazy per-group row fetch reuses the same plumbing.\n   * executegroup returns the group value under the group-by field name (e.g.\n   * account_type) and the count under `cnt` (or the count aggregation's alias),\n   * NOT gb_field/count — so read those out per row. The group value becomes the\n   * RowGroup id and is sent as the `qfilter` { [groupBy]: value } row query.\n   */\n  // Read the JSON array bound to the grid for the 'page_field' / 'state' data\n  // sources. 'state' resolves via @state.<key> (nested paths supported);\n  // 'page_field' reads the page-data field (nested paths supported).\n  private readBindingRows(): any[] {\n    const dataSource = this.getProperty('data_source');\n    const field = (this.getProperty('array_field') || '').trim();\n    if (!field) return [];\n    const pageId = this.component()?.pageId;\n    let value: any;\n    if (dataSource === 'state') {\n      value = this.logicEvaluator.evaluateValue('@state.' + field, pageId);\n    } else {\n      // Page Field: resolve the field exactly like the sibling field controls\n      // (see BaseComponent.storeValue). Prefix the field with this component's\n      // dataKey so a looped instance reads its own record: inside a page_ref\n      // loop dataKey() is the record index ('0', '1', …) and getPageFieldData\n      // resolves '<index>.<field>' against the page's data array; otherwise it\n      // is '' and the field is read from the single page record.\n      const prefix = this.dataKey();\n      const key = prefix !== '' ? `${prefix}.${field}` : field;\n      value = this.store.getPageFieldData(key, pageId);\n    }\n    return this.coerceToRowArray(value);\n  }\n\n  /** Coerce a bound value into an array of row objects: accepts an array, a\n   *  JSON-string array, or a single object (wrapped). Anything else → []. */\n  private coerceToRowArray(value: any): any[] {\n    let v = value;\n    if (typeof v === 'string') {\n      const s = v.trim();\n      if (!s) return [];\n      try { v = JSON.parse(s); } catch { return []; }\n    }\n    if (Array.isArray(v)) return v;\n    if (v && typeof v === 'object') return [v];\n    return [];\n  }\n\n  /** Render a ready-made array of row objects as a single whole-result group\n   *  (used by the page_field / state data sources). Columns auto-derive from the\n   *  first row, exactly like the query whole-result path. */\n  private renderRowsDirectly(rows: any[]): void {\n    if (!this.eruGrid || !this.gridConfig) return;\n    if (rows.length > 0) {\n      const sample = (rows[0]?.entity_data && typeof rows[0].entity_data === 'object')\n        ? rows[0].entity_data : (rows[0] || {});\n      const fields: Field[] = Object.keys(sample).map((key, index) => (\n        { name: key, label: key, datatype: 'textbox' as DataTypes, field_size: 150, grid_index: index }\n      ));\n      this.setGridFields(fields);\n    }\n    this.resetLoadedRows();\n    this.eruGrid.set_table_group([{\n      id: '', title: '', totalRowCount: rows.length, isExpanded: true,\n      currentPage: 0, hasMoreRows: false, currentLoadedRows: 0, isLoading: false, key: '',\n    }]);\n    this.eruGrid.addRowsForGroup('', rows, false);\n    this.eruGrid.gridStore.completeGroupLoading('');\n  }\n\n  private buildQueryGroups(data: any, groupBy: string, aggregations?: any): RowGroup[] {\n    const rows = this.extractQueryRows(data);\n    const gbKey = (groupBy || '').split(',').map(s => s.trim()).filter(Boolean)[0] || '';\n    const countKey = this.groupCountKey(aggregations);\n    // No group-by → executegroup returns a single total-count row. Build one\n    // paginated group carrying that total; eru-grid then lazily fetches its\n    // pages via execute (qlimit/qskip, no qfilter).\n    if (!gbKey) {\n      const total = rows.length ? this.countFromRow(rows[0], countKey) : 0;\n      return [{\n        id: '', key: '', title: '', totalRowCount: total,\n        isExpanded: true, currentPage: 0, hasMoreRows: total > 0,\n        currentLoadedRows: 0, isLoading: false,\n        // With no group-by there is one implicit group covering every row, so\n        // its subtotal and the grand total are the same numbers.\n        subtotal: rows.length ? this.totalsFromRow(rows[0], aggregations) : undefined,\n      } as RowGroup];\n    }\n    const seen = new Set<string>();\n    return rows.map((r: any, index: number) => {\n      const src = (r?.entity_data && typeof r.entity_data === 'object') ? r.entity_data : (r || {});\n      const raw = gbKey ? src[gbKey] : src.gb_field;\n      const count = Number(countKey ? src[countKey] : src.count) || 0;\n      const probe = raw === null || raw === undefined ? '__NULL__' : String(raw);\n      let id: any = raw;\n      if (seen.has(probe)) id = `${probe}__${index}__`;\n      seen.add(probe);\n      return {\n        id,\n        key: gbKey || 'gb_field',\n        title: raw === null || raw === undefined ? '' : String(raw),\n        totalRowCount: count,\n        isExpanded: true,\n        currentPage: 0,\n        hasMoreRows: count > 0,\n        currentLoadedRows: 0,\n        isLoading: false,\n        subtotal: this.totalsFromRow(r, aggregations),\n      } as RowGroup;\n    });\n  }\n\n  /**\n   * The column holding each group's row count in an executegroup result. When\n   * no aggregations are passed the backend returns `cnt`; otherwise it returns\n   * the alias of the aggregation whose func is `count`.\n   */\n  private groupCountKey(aggregations: any): string {\n    if (Array.isArray(aggregations)) {\n      const countAgg = aggregations.find((a: any) => String(a?.func || '').toLowerCase() === 'count');\n      if (countAgg?.alias) return String(countAgg.alias);\n    }\n    return 'cnt';\n  }\n\n  /** Read the total from an executegroup count row: the count-key column, else\n   *  cnt/count, else the first numeric value. */\n  private countFromRow(row: any, countKey: string): number {\n    const src = (row?.entity_data && typeof row.entity_data === 'object') ? row.entity_data : (row || {});\n    if (typeof src[countKey] === 'number' || (src[countKey] != null && !isNaN(Number(src[countKey])))) return Number(src[countKey]) || 0;\n    if (src.cnt != null && !isNaN(Number(src.cnt))) return Number(src.cnt) || 0;\n    if (src.count != null && !isNaN(Number(src.count))) return Number(src.count) || 0;\n    const k = Object.keys(src).find(key => typeof src[key] === 'number');\n    return k != null ? Number(src[k]) || 0 : 0;\n  }\n\n  /**\n   * Column datatypes the table-mode total rows can aggregate. Everything else\n   * (text, dates, statuses) leaves its total cell blank, which is what the\n   * subtotal/grand-total templates render for a missing key.\n   */\n  private static readonly TOTALLABLE_DATATYPES = new Set(['number', 'currency']);\n\n  /**\n   * Whether the server has to compute total rows for this grid. Table mode only\n   * — a pivot aggregates client-side in eru-grid, and a board has no total row.\n   * The two row flags, because that is what a table draws: a subtotal row under\n   * each group and one grand-total row. The `...Column` pair beside them adds a\n   * total COLUMN and only means anything in pivot.\n   */\n  private get totalsEnabled(): boolean {\n    return this.viewMode === 'table'\n      && (this.enableRowSubtotals || this.enableGrandTotal);\n  }\n\n  /**\n   * The aggregations the executegroup call needs so the total rows have values.\n   *\n   * Every visible number/currency column, aliased to its own column name — the\n   * subtotal/grand-total templates look each cell up by column name, so no\n   * mapping table is needed on the way back. `sum` unless the author picked a\n   * different function for that column in the design panel; that one choice\n   * feeds both total rows, since a column summed in one and averaged in the\n   * other reads as two different measures.\n   *\n   * A `count` is always asked for alongside, aliased `cnt`: the group list's\n   * row counts drive pagination, and once aggregations are passed the backend\n   * returns the count under an alias rather than its default `cnt` column.\n   */\n  private buildTotalsAggregations(): any[] | undefined {\n    if (!this.totalsEnabled) return undefined;\n    const hidden = this.hiddenColumnNames();\n    const source = this.allFields.length ? this.allFields : ((this.gridConfig?.fields || []) as Field[]);\n    const aggregations = source\n      .filter(f => f?.name && !f.is_hidden && !hidden.has(f.name)\n        && GridComponent.TOTALLABLE_DATATYPES.has(String(f.datatype)))\n      .map(f => ({ func: String(f.aggregationFunction || 'sum'), field: f.name, alias: f.name }));\n    if (!aggregations.length) return undefined;\n    return [{ func: 'count', field: '1', alias: 'cnt' }, ...aggregations];\n  }\n\n  /**\n   * What actually goes out on the executegroup call. A hand-written\n   * `query_aggregations` wins verbatim — it is the escape hatch for aggregates\n   * the design panel cannot express, and pages that already rely on it must not\n   * change behaviour.\n   */\n  private groupAggregations(): any[] | undefined {\n    return this.parseQueryAggregations() ?? this.buildTotalsAggregations();\n  }\n\n  /**\n   * Fetch the total rows when the group call could not carry the aggregations.\n   *\n   * A query grid types its columns from the first page of results, so on a cold\n   * load the executegroup call goes out before the grid knows which columns are\n   * numeric. Once it does, the totals are fetched on their own — the grand total\n   * from an ungrouped pass, the subtotals from a grouped one that only patches\n   * `RowGroup.subtotal`. Keyed on the aggregation list so this fires once per\n   * change, not on every page of rows.\n   */\n  private syncQueryTotals(): void {\n    if (this.getProperty('data_source') !== 'query') return;\n    const aggregations = this.groupAggregations();\n    const key = JSON.stringify(aggregations ?? null);\n    if (key === this.lastTotalsKey) return;\n    this.lastTotalsKey = key;\n    if (!Array.isArray(aggregations)) {\n      this.eruGrid.gridStore.setRowGrandTotal(null);\n      return;\n    }\n    const query = this.getProperty('query');\n    if (!query) return;\n    const componentId = this.component()?.id || '';\n    const payload = this.lastQueryPayload ?? this.buildQueryPayload();\n    const groupBy = (this.getProperty('query_group_by') || '').trim();\n    if (this.enableGrandTotal) {\n      this.store.requestDynamicData(componentId, 'fetch_query_group_data', {\n        query, payload, group_by: '', group_order_by: [], aggregations, totals_only: true,\n      });\n    }\n    if (groupBy && this.enableRowSubtotals) {\n      this.store.requestDynamicData(componentId, 'fetch_query_group_data', {\n        query, payload, group_by: groupBy, group_order_by: this.groupOrderBy, aggregations, subtotals_only: true,\n      });\n    }\n  }\n\n  /**\n   * Settle the grand-total row after a group-list response.\n   *\n   * With no group-by the list is a single row covering everything, so it is\n   * already the grand total — no second call. With a group-by it is one row per\n   * group, and the grand total needs the same query aggregated over all rows,\n   * which is one more executegroup with an empty group_by. That extra trip only\n   * happens when the grand-total row is actually switched on.\n   */\n  private applyQueryGrandTotal(payload: any, groups: RowGroup[], aggregations: any[] | undefined): void {\n    // The group call carried these, so the catch-up pass has nothing to add.\n    this.lastTotalsKey = JSON.stringify(aggregations ?? null);\n    if (!this.totalsEnabled || !Array.isArray(aggregations)) {\n      this.eruGrid.gridStore.setRowGrandTotal(null);\n      return;\n    }\n    const grouped = !!(payload?.group_by || '').trim();\n    if (!grouped) {\n      this.eruGrid.gridStore.setRowGrandTotal(groups[0]?.subtotal ?? null);\n      return;\n    }\n    if (!this.enableGrandTotal) {\n      this.eruGrid.gridStore.setRowGrandTotal(null);\n      return;\n    }\n    this.store.requestDynamicData(this.component()?.id || '', 'fetch_query_group_data', {\n      query: payload?.query,\n      payload: payload?.payload,\n      group_by: '',\n      group_order_by: [],\n      aggregations,\n      totals_only: true,\n    });\n  }\n\n  /**\n   * Settle the grand-total row after an entity group response.\n   *\n   * processo maps the entity group call into RowGroup[] itself, subtotals\n   * included, so there is nothing to re-map here. Ungrouped, the single group\n   * covers every row and its subtotal is the grand total. Grouped, the grand\n   * total would need the same second pass the query source makes — but the\n   * entity group call goes through one shared request/response signal in\n   * processo, which cannot carry two in flight, so it is left unset rather than\n   * shown wrong.\n   */\n  private applyEntityGrandTotal(payload: any, groups: RowGroup[]): void {\n    if (!this.totalsEnabled || !this.enableGrandTotal) {\n      this.eruGrid.gridStore.setRowGrandTotal(null);\n      return;\n    }\n    const grouped = !!String(payload?.group_by || '').trim();\n    this.eruGrid.gridStore.setRowGrandTotal(grouped ? null : (groups[0]?.subtotal ?? null));\n  }\n\n  /**\n   * Read the aggregate columns out of one executegroup row. Keys are the column\n   * names the aggregations were aliased to, so the result drops straight into\n   * `RowGroup.subtotal` / `setRowGrandTotal()`. `cnt` is left out — it is the\n   * row count, not a measure, and would print in the first numeric column.\n   */\n  /**\n   * Ask the server for the aggregates the grid's formatting rules need.\n   *\n   * A separate call from the totals one on purpose: `buildTotalsAggregations`\n   * builds its list from column config and its response drives the visible\n   * grand-total row, so folding min/max/percentile into it would surface\n   * measures in that row the author never configured. Ungrouped, because these\n   * describe the whole column.\n   */\n  private requestColumnStats(requests: any[] | null): void {\n    if (!requests || !requests.length) {\n      this.eruGrid?.gridStore.setColumnStats({});\n      this.lastColumnStatsKey = '';\n      return;\n    }\n    const key = JSON.stringify(requests);\n    if (key === this.lastColumnStatsKey) return;\n    const componentId = this.component()?.id || '';\n    const dataSource = this.getProperty('data_source');\n\n    if (dataSource === 'query') {\n      const query = this.getProperty('query');\n      if (!query) return;\n      this.lastColumnStatsKey = key;\n      this.store.requestDynamicData(componentId, 'fetch_query_group_data', {\n        query,\n        payload: this.lastQueryPayload ?? this.buildQueryPayload(),\n        group_by: '',\n        group_order_by: [],\n        aggregations: requests,\n        stats_only: true,\n      });\n      return;\n    }\n\n    const entityName = this.getProperty('entity_name');\n    if (!entityName) return;\n    this.lastColumnStatsKey = key;\n    this.store.requestDynamicData(componentId, 'fetch_entity_group_data', {\n      entity_name: entityName,\n      group_by: '',\n      group_order_by: [],\n      currentKey: '',\n      nestingType: '',\n      stats_only: true,\n      aggregations: requests,\n    });\n  }\n\n  /** Map the single aggregate row onto the alias->value map the grid reads. */\n  private applyColumnStats(rows: any, aggregations: any[] | undefined): void {\n    const row = Array.isArray(rows) ? rows[0] : rows;\n    const src = (row?.entity_data && typeof row.entity_data === 'object') ? row.entity_data : row;\n    const stats: Record<string, number> = {};\n    for (const aggregation of aggregations || []) {\n      const alias = aggregation?.alias;\n      if (!alias) continue;\n      const value = src?.[alias];\n      if (value === null || value === undefined || value === '' || isNaN(Number(value))) continue;\n      stats[alias] = Number(value);\n    }\n    this.eruGrid?.gridStore.setColumnStats(stats);\n  }\n\n  private totalsFromRow(row: any, aggregations: any[] | undefined): Record<string, number> | undefined {\n    if (!Array.isArray(aggregations) || !row) return undefined;\n    const src = (row?.entity_data && typeof row.entity_data === 'object') ? row.entity_data : row;\n    const totals: Record<string, number> = {};\n    for (const aggregation of aggregations) {\n      const alias = aggregation?.alias;\n      if (!alias || alias === 'cnt') continue;\n      const value = src?.[alias];\n      if (value === null || value === undefined || value === '' || isNaN(Number(value))) continue;\n      totals[alias] = Number(value);\n    }\n    return Object.keys(totals).length ? totals : undefined;\n  }\n\n  /** Parse the `query_aggregations` JSON property into an array (or undefined). */\n  private parseQueryAggregations(): any {\n    const raw = this.getProperty('query_aggregations');\n    if (!raw || typeof raw !== 'string' || !raw.trim()) return undefined;\n    try {\n      const parsed = JSON.parse(raw);\n      return Array.isArray(parsed) ? parsed : undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  private extractQueryRows(data: any): any[] {\n    const path = this.getProperty('query_result_path');\n    let node: any = data;\n    if (path && typeof path === 'string' && path.trim()) {\n      const segments = path.split('.').map(s => s.trim()).filter(s => s !== '');\n      for (const seg of segments) {\n        if (node == null) break;\n        node = node[/^\\d+$/.test(seg) ? Number(seg) : seg];\n      }\n    }\n    if (Array.isArray(node)) return node;\n    if (node && typeof node === 'object') return [node];\n    return Array.isArray(data) ? data : (data?.entity_data || []);\n  }\n\n  /**\n   * Build the query payload from the static JSON property merged with the\n   * selected state/page payload fields (state:* / page:* tokens resolved live).\n   */\n  private buildQueryPayload(): Record<string, any> {\n    let base: Record<string, any> = {};\n    const raw = this.getProperty('query_payload_static');\n    if (raw && typeof raw === 'string' && raw.trim()) {\n      try {\n        const parsed = JSON.parse(raw);\n        if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) base = parsed;\n      } catch {\n        // ignore invalid JSON — fall back to {}\n      }\n    }\n    const fields = this.getProperty('query_payload_fields') || [];\n    return { ...base, ...this.resolveApiPayload(fields) };\n  }\n\n  /**\n   * eru-grid's multi-column sort, in the order the user built it: `[\"pn\", \"-da\"]`\n   * — a leading `-` means descending. The grid keeps this as UI state only and\n   * never reorders rows itself, so the query has to apply it; it rides the\n   * execute-query call as `qsort`.\n   *\n   * Distinct from the `group_order_by` property, which orders the group list on\n   * the executegroup call and is authored in the panel. Row ordering and group\n   * ordering are separate settings and never share a payload key.\n   */\n  private gridSortColumns(): string[] {\n    const sort = this.eruGrid?.gridStore?.sortColumns?.();\n    return Array.isArray(sort) ? sort.filter((s: any) => typeof s === 'string' && s) : [];\n  }\n\n  /**\n   * Resolve `state:<key>` / `page:<path>` payload-field tokens into a\n   * {key: value} object using the logic evaluator. Mirrors the page-ref pattern.\n   */\n  private resolveApiPayload(fields: string[]): Record<string, any> {\n    if (!Array.isArray(fields) || fields.length === 0) return {};\n    const out: Record<string, any> = {};\n    for (const f of fields) {\n      const parsed = parsePayloadField(f);\n      if (!parsed) continue;\n      const { source, path, key } = parsed;\n      // See the note on PageRefComponent's copy: `app` belongs here too.\n      const placeholder = source === 'state' ? `@state.${path}`\n        : source === 'page' ? `@page.${path}`\n          : source === 'app' ? `@app.${path}`\n            : '';\n      if (!placeholder) continue;\n      out[key] = this.logicEvaluator.evaluateValue(placeholder, this.component()?.pageId);\n    }\n    return out;\n  }\n\n  // Override to add component-specific properties\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'data_source',\n        type: 'select',\n        label: 'Data Source',\n        category: 'data',\n        section: 'Source',\n        default_value: 'query',\n        options: [\n          { label: 'Query', value: 'query' },\n          { label: 'Function', value: 'function' },\n          { label: 'Nested Entity', value: 'nested_entity' },\n          { label: 'Entity', value: 'entity' },\n          { label: 'Page Field', value: 'page_field' },\n          { label: 'State', value: 'state' }\n        ],\n        description: 'Select the data source for the grid'\n      },\n      {\n        key: 'entity_name',\n        type: 'select',\n        dynamic_options: 'ds_entity_name',\n        label: 'Entity',\n        category: 'data',\n        section: 'Source',\n        default_value: '',\n        description: 'Select entity',\n        visible_if: {\n          key: 'data_source',\n          in: ['entity', 'nested_entity']\n        },\n        on_value_change: (value: string, _oldValue: string) => {\n          this.store.requestDynamicData(this.component()?.id || '', 'ds_fields', value);\n          this.store.requestDynamicData(this.component()?.id || '', 'ds_group_fields', value);\n        }\n      },\n      {\n        key: 'entity_id_field',\n        type: 'text',\n        label: 'Entity Id Column',\n        category: 'data',\n        section: 'Source',\n        default_value: '',\n        description: 'Which key in each row holds the record id (e.g. entity_id — the query must select it). Needed for cells to save automatically; without it columns stay read-only, unless the grid handles On Cell Edit itself.',\n        width: 'full',\n        visible_if: {\n          key: 'data_source',\n          in: ['query', 'function', 'page_field', 'state']\n        }\n      },\n      {\n        key: 'array_field',\n        type: 'text',\n        label: 'Array Field / State Key',\n        category: 'data',\n        section: 'Source',\n        default_value: '',\n        description: 'Name/path of the page-data field (Page Field) or state key (State) holding a JSON array of row objects. Supports dotted paths, e.g. program_data.charges.',\n        visible_if: {\n          key: 'data_source',\n          in: ['page_field', 'state']\n        }\n      },\n      {\n        key: 'query',\n        type: 'autocomplete',\n        dynamic_options: 'queries',\n        label: 'Query',\n        category: 'data',\n        section: 'Source',\n        default_value: '',\n        visible_if: {\n          key: 'data_source',\n          in: ['query']\n        }\n      },\n      {\n        key: 'function_name',\n        type: 'autocomplete',\n        dynamic_options: 'functions',\n        label: 'Function',\n        category: 'data',\n        section: 'Source',\n        default_value: '',\n        description: 'Eru function executed to fetch the rows. It is called once and its result rendered whole — the server-side grouping and per-group paging the Query source uses do not apply.',\n        visible_if: {\n          key: 'data_source',\n          in: ['function']\n        }\n      },\n      {\n        key: 'query_result_path',\n        type: 'text',\n        label: 'Result Path',\n        category: 'data',\n        section: 'Source',\n        default_value: '',\n        visible_if: {\n          key: 'data_source',\n          in: ['query', 'function']\n        }\n      },\n      {\n        key: 'query_payload_fields',\n        type: 'payload_fields',\n        dynamic_options: 'ds_page_ref_payload_fields',\n        label: 'Payload Fields',\n        category: 'data',\n        section: 'Source',\n        width: 'full',\n        default_value: [],\n        description: 'Pick state vars / page-data fields of the page. The query receives {field_name: value} for each entry. Type \"= other_name\" alongside an entry to send it under a different key.',\n        visible_if: {\n          key: 'data_source',\n          in: ['query', 'function']\n        }\n      },\n      {\n        key: 'query_payload_static',\n        type: 'textarea',\n        label: 'Static Payload (JSON)',\n        category: 'data',\n        section: 'Source',\n        default_value: '',\n        visible_if: {\n          key: 'data_source',\n          in: ['query', 'function']\n        }\n      },\n      {\n        key: 'query_group_by',\n        type: 'text',\n        label: 'Group By Field (enables grouping + pagination)',\n        category: 'data',\n        section: 'Source',\n        default_value: '',\n        description: 'Optional. A field name to group by. When set, the grid runs the SAME Query via the executegroup route to get the group list, then paginates each group by re-running the Query with { qfilter, qlimit, qskip }.',\n        visible_if: {\n          key: 'data_source',\n          in: ['query']\n        }\n      },\n      {\n        key: 'query_aggregations',\n        type: 'textarea',\n        label: 'Aggregations (JSON)',\n        category: 'data',\n        section: 'Source',\n        default_value: '',\n        visible_if: {\n          key: 'data_source',\n          in: ['query']\n        }\n      },\n      {\n        key: 'fields',\n        type: 'multiselect',\n        dynamic_options: 'ds_fields',\n        label: 'Grid Columns',\n        category: 'data',\n        section: 'Columns',\n        default_value: '',\n        visible_if: [\n          { key: 'data_source', in: ['entity', 'nested_entity'] },\n          { key: 'view_mode', notEquals: 'board' }\n        ],\n        visible_operator: 'all'\n      },\n      {\n        key: 'column_overrides',\n        type: 'text',\n        label: 'Column Overrides',\n        category: 'data',\n        section: 'Columns',\n        visible: false,\n        responsive: false,\n        default_value: {},\n      },\n      {\n        key: 'hide_columns',\n        type: 'multiselect',\n        dynamic_options: 'ds_grid_columns',\n        label: 'Hide Columns',\n        category: 'data',\n        section: 'Columns',\n        responsive: true,\n        default_value: []\n      },\n      {\n        key: 'hide_columns_manual',\n        type: 'text',\n        label: 'Hide Columns (manual)',\n        category: 'data',\n        section: 'Columns',\n        responsive: true,\n        default_value: '',\n        description: 'Comma-separated column names to hide. Use for nested-page (page field / state) grids whose columns are unknown until the parent query loads.'\n      },\n      {\n        key: 'group_by',\n        type: 'select',\n        dynamic_options: 'ds_group_fields',\n        label: 'Group By',\n        category: 'data',\n        section: 'Grouping & Paging',\n        default_value: '',\n        visible_if: {\n          key: 'data_source',\n          in: ['entity', 'nested_entity']\n        }\n      },\n      {\n        key: 'group_order_by',\n        type: 'text',\n        label: 'Group Order By',\n        category: 'data',\n        section: 'Grouping & Paging',\n        default_value: '',\n        description: 'Field name the groups themselves are ordered by. Sent with the group fetch as group_order_by (always an array; blank sends []). Free text rather than a field picker because a query source names its own result columns, not data-model fields.',\n        visible_if: {\n          key: 'data_source',\n          in: ['entity', 'nested_entity', 'query']\n        }\n      },\n      {\n        key: 'row_count_state_key',\n        type: 'text',\n        label: 'Row Count → State Key',\n        category: 'data',\n        section: 'Grouping & Paging',\n        default_value: '',\n      },\n      {\n        key: 'page_size',\n        type: 'number',\n        label: 'Page Size',\n        category: 'data',\n        section: 'Grouping & Paging',\n        default_value: null,\n        min: 1,\n        description: 'Rows fetched per lazy page (per group). Leave blank to use the grid default (50).'\n      },\n      {\n        key: 'pivot_rows',\n        type: 'text',\n        label: 'Pivot Rows',\n        category: 'data',\n        section: 'Pivot',\n        default_value: '',\n        responsive: false,\n        description: 'Comma-separated field names grouped down the left as pivot row dimensions.',\n        width: 'full',\n        visible_if: { key: 'view_mode', equals: 'pivot' }\n      },\n      {\n        key: 'pivot_cols',\n        type: 'text',\n        label: 'Pivot Columns',\n        category: 'data',\n        section: 'Pivot',\n        default_value: '',\n        responsive: false,\n        description: 'Comma-separated field names spread across the top as pivot column dimensions.',\n        width: 'full',\n        visible_if: { key: 'view_mode', equals: 'pivot' }\n      },\n      {\n        key: 'pivot_aggregations',\n        type: 'pivot_aggregations',\n        label: 'Values (Aggregations)',\n        category: 'data',\n        section: 'Pivot',\n        default_value: '',\n        responsive: false,\n        description: 'Fields to aggregate at each row/column intersection, with the aggregation function.',\n        width: 'full',\n        visible_if: { key: 'view_mode', equals: 'pivot' }\n      },\n      {\n        key: 'view_mode',\n        type: 'select',\n        label: 'View Mode',\n        category: 'layout',\n        section: 'Grid',\n        default_value: 'table',\n        options: [\n          { label: 'Table', value: 'table' },\n          { label: 'Board', value: 'board' },\n          { label: 'Pivot', value: 'pivot' }\n        ],\n        description: 'How rows are rendered: standard table, kanban-style board with cards, or pivot table. Asked for a board, a kanban, a card view, or \"show them as cards\"? That is this property set to board - a table is not a board. A board reads far narrower than a table, so it is also what fits beside a detail pane.'\n      },\n      {\n        key: 'preset',\n        type: 'select',\n        label: 'Theme Preset',\n        category: 'layout',\n        section: 'Grid',\n        default_value: 'default',\n        options: [\n          { label: 'Default', value: 'default' },\n          { label: 'Modern', value: 'modern' },\n          { label: 'Compact', value: 'compact' },\n          { label: 'Bold', value: 'bold' },\n          { label: 'Financial', value: 'financial' },\n          { label: 'Elevated', value: 'elevated' },\n          { label: 'Custom', value: 'custom' }\n        ],\n        description: 'Built-in look & feel. Structure (row/column lines, row heights) and colours are managed by the preset — switch to Custom to edit them.'\n      },\n      {\n        key: 'gridHeight',\n        type: 'number',\n        label: 'Grid Height',\n        category: 'layout',\n        section: 'Grid',\n        default_value: 370,\n        min: 0,\n        max: 1000,\n        description: 'Cap on the grid height in pixels. Set to 0 to size the grid to its content — no cap and no minimum, so a grid with few rows or cards ends right after them.'\n      },\n      {\n        key: 'headerRowHeight',\n        type: 'number',\n        label: 'Header Row Height',\n        category: 'layout',\n        section: 'Grid',\n        default_value: 36,\n        min: 20,\n        max: 100,\n        description: 'Height of the header row in pixels. Managed by the theme preset — switch to Custom to edit.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'dataRowHeight',\n        type: 'number',\n        label: 'Data Row Height',\n        category: 'layout',\n        section: 'Grid',\n        default_value: 32,\n        min: 20,\n        max: 100,\n        description: 'Height of data rows in pixels. Managed by the theme preset — switch to Custom to edit.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'showColumnLines',\n        type: 'boolean',\n        label: 'Show Column Lines',\n        category: 'layout',\n        section: 'Grid',\n        default_value: true,\n        description: 'Display vertical lines between columns. Managed by the theme preset — switch to Custom to edit.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'showRowLines',\n        type: 'boolean',\n        label: 'Show Row Lines',\n        category: 'layout',\n        section: 'Grid',\n        default_value: true,\n        description: 'Display horizontal lines between rows. Managed by the theme preset — switch to Custom to edit.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'cursor_on_hover',\n        type: 'select',\n        label: 'Cursor On Hover',\n        category: 'layout',\n        section: 'Grid',\n        default_value: '',\n        options: [\n          { label: 'Default', value: '' },\n          { label: 'Pointer (clickable)', value: 'pointer' },\n          { label: 'Auto', value: 'auto' },\n          { label: 'Crosshair', value: 'crosshair' },\n          { label: 'Move', value: 'move' },\n          { label: 'Grab', value: 'grab' },\n          { label: 'Not Allowed', value: 'not-allowed' },\n          { label: 'Help', value: 'help' },\n          { label: 'Text', value: 'text' }\n        ],\n        description: 'CSS cursor shown when hovering over a table/pivot row or board card'\n      },\n      {\n        key: 'freezeHeader',\n        type: 'boolean',\n        label: 'Freeze Header',\n        category: 'layout',\n        section: 'Freeze',\n        default_value: true,\n        description: 'Freeze the header row'\n      },\n      {\n        key: 'freezeField',\n        type: 'text',\n        label: 'Freeze Field',\n        category: 'layout',\n        section: 'Freeze',\n        default_value: '',\n        description: 'Field name to freeze (for row dimension)'\n      },\n      {\n        key: 'freezeGrandTotal',\n        type: 'boolean',\n        label: 'Freeze Grand Total',\n        category: 'layout',\n        section: 'Freeze',\n        default_value: true,\n        description: 'Freeze the grand total row'\n      },\n      {\n        key: 'card_page_id',\n        type: 'select',\n        dynamic_options: 'ds_page_name',\n        label: 'Card Layout Page',\n        category: 'layout',\n        section: 'Board View',\n        default_value: '',\n        description: 'Page whose layout draws ONE card in board view. This is how a board gets a designed card rather than the plain built-in one, so author a small page for it and point this at that page whenever the card should look like anything in particular. Blank falls back to the built-in default card.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_column_header',\n        type: 'boolean',\n        label: 'Column Header',\n        category: 'layout',\n        section: 'Board View',\n        default_value: true,\n        responsive: true,\n        description: 'On: each board column shows its header bar above the cards — the group title and the \"3 of 12\" count chip. Off: the cards start at the top of the column and the group titles go with the bar.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_column_min_width',\n        type: 'number',\n        label: 'Column Min Width (px)',\n        category: 'layout',\n        section: 'Board View',\n        default_value: 300,\n        min: 120,\n        responsive: true,\n        description: 'Minimum width of each Kanban column. Smaller values pack more columns per row. With Wrap Columns on, the board fits as many as the width allows and wraps the rest; with it off, this is the width each column holds while the row scrolls sideways. Set per viewport.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_column_max_width',\n        type: 'number',\n        label: 'Column Max Width (px)',\n        category: 'layout',\n        section: 'Board View',\n        default_value: '',\n        min: 120,\n        responsive: true,\n        description: 'Widest a Kanban column may grow. Leave blank to let columns share all the available width — which is why a board filtered to one group stretches that column edge to edge. Set per viewport.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_column_height',\n        type: 'number',\n        label: 'Column Height (px)',\n        category: 'layout',\n        section: 'Board View',\n        default_value: 420,\n        min: 0,\n        responsive: true,\n        description: 'Cap on each Kanban column\\'s height; its cards scroll vertically once they exceed it. Set to 0 for no cap — the column ends right after its last card. Set per viewport.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'wrap_columns',\n        type: 'boolean',\n        label: 'Wrap Columns',\n        category: 'layout',\n        section: 'Board View',\n        default_value: true,\n        responsive: true,\n        description: 'On: columns that no longer fit wrap onto the next row, so a narrow viewport stacks them one below another. Off: every column stays on one row and the board scrolls horizontally — usually what you want on wide viewports. Set per viewport.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_card_height',\n        type: 'number',\n        label: 'Card Height (px)',\n        category: 'layout',\n        section: 'Board View',\n        default_value: 132,\n        description: 'Fixed pixel height of each board card — must match the height the card layout actually renders.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_card_gap',\n        type: 'number',\n        label: 'Card Gap (px)',\n        category: 'layout',\n        section: 'Board View',\n        default_value: 8,\n        min: 0,\n        description: 'Extra vertical gap in pixels between board cards, on top of the Card Padding gutter each card already has.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_card_padding',\n        type: 'number',\n        label: 'Card Padding (px)',\n        category: 'layout',\n        section: 'Board View',\n        default_value: 8,\n        min: 0,\n        description: 'Gutter between each card and the edge of its slot, equal on all four sides. The column surface shows through it. Added around Card Height, so the card still renders at its configured height.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_card_bg',\n        type: 'color',\n        label: 'Card Background',\n        category: 'layout',\n        section: 'Board View',\n        default_value: '',\n        description: 'Background colour of every board card (token or custom). Unlike Surface Container, this paints the cards only — the column and its group header keep their own colour. Blank = default.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_card_hover_bg',\n        type: 'color',\n        label: 'Card Hover Background',\n        category: 'layout',\n        section: 'Board View',\n        default_value: '',\n        description: 'Background tint when hovering a board card (token or custom). Shows through cards with a transparent background. Blank = default.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_card_selected_bg',\n        type: 'color',\n        label: 'Card Selected Background',\n        category: 'layout',\n        section: 'Board View',\n        default_value: '',\n        description: 'Background tint of the active (last-clicked) board card. Blank = default.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_card_selected_outline',\n        type: 'color',\n        label: 'Card Selected Outline',\n        category: 'layout',\n        section: 'Board View',\n        default_value: '',\n        description: 'Outline/ring colour of the active board card — stays visible over opaque custom cards. Blank = default.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_count_text_color',\n        type: 'color',\n        label: 'Column Count Text',\n        category: 'layout',\n        section: 'Board View',\n        default_value: '',\n        description: 'Text colour of the \"3 of 12\" chip in each board column header. Blank = default.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'board_count_bg',\n        type: 'color',\n        label: 'Column Count Background',\n        category: 'layout',\n        section: 'Board View',\n        default_value: '',\n        description: 'Background colour of the \"3 of 12\" chip in each board column header. Blank = default.',\n        visible_if: { key: 'view_mode', equals: 'board' }\n      },\n      {\n        key: 'token_primary',\n        type: 'color',\n        label: 'Token: Primary',\n        category: 'layout',\n        section: 'Design Tokens',\n        width: 'full',\n        default_value: '',\n        description: 'Grid primary colour (selection, accents). Switch preset to Custom to edit; blank = grid default.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'token_on_primary',\n        type: 'color',\n        label: 'Token: On Primary',\n        category: 'layout',\n        section: 'Design Tokens',\n        width: 'full',\n        default_value: '',\n        description: 'Foreground colour on primary surfaces. Switch preset to Custom to edit; blank = grid default.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'token_surface',\n        type: 'color',\n        label: 'Token: Surface (row bg)',\n        category: 'layout',\n        section: 'Design Tokens',\n        width: 'full',\n        default_value: '',\n        description: 'Base grid surface — the row background. Switch preset to Custom to edit; blank = grid default.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'token_surface_container',\n        type: 'color',\n        label: 'Token: Surface Container (header bg)',\n        category: 'layout',\n        section: 'Design Tokens',\n        width: 'full',\n        default_value: '',\n        description: 'Header / container surface — the header background. Switch preset to Custom to edit; blank = grid default.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'token_surface_container_high',\n        type: 'color',\n        label: 'Token: Surface Container High',\n        category: 'layout',\n        section: 'Design Tokens',\n        width: 'full',\n        default_value: '',\n        description: 'Elevated surface (hover/selected rows). Switch preset to Custom to edit; blank = grid default.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'token_header_color',\n        type: 'color',\n        label: 'Token: Header Text',\n        category: 'layout',\n        section: 'Design Tokens',\n        width: 'full',\n        default_value: '',\n        description: 'Header text colour. Switch preset to Custom to edit; blank = falls back to row text colour.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'token_on_surface',\n        type: 'color',\n        label: 'Token: On Surface (row text)',\n        category: 'layout',\n        section: 'Design Tokens',\n        width: 'full',\n        default_value: '',\n        description: 'Row text colour (header falls back to this unless Header Text is set). Switch preset to Custom to edit; blank = grid default.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'token_on_surface_variant',\n        type: 'color',\n        label: 'Token: On Surface Variant',\n        category: 'layout',\n        section: 'Design Tokens',\n        width: 'full',\n        default_value: '',\n        description: 'Secondary text / icons. Switch preset to Custom to edit; blank = grid default.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'token_outline',\n        type: 'color',\n        label: 'Token: Outline',\n        category: 'layout',\n        section: 'Design Tokens',\n        width: 'full',\n        default_value: '',\n        description: 'Borders / grid lines. Switch preset to Custom to edit; blank = grid default.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'token_outline_variant',\n        type: 'color',\n        label: 'Token: Outline Variant',\n        category: 'layout',\n        section: 'Design Tokens',\n        width: 'full',\n        default_value: '',\n        description: 'Subtle borders / dividers. Switch preset to Custom to edit; blank = grid default.',\n        disable_if: { key: 'preset', notEquals: 'custom' }\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: true,\n        description: 'Allow editing of grid cells'\n      },\n      {\n        key: 'select_first_row',\n        type: 'boolean',\n        label: 'Select First Row',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: false,\n        description: 'On load, select the first row and fire the row selection event'\n      },\n      {\n        key: 'rowSelection',\n        type: 'boolean',\n        label: 'Row Selection',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: true,\n        description: 'Allow selection of entire rows'\n      },\n      {\n        key: 'cellSelection',\n        type: 'boolean',\n        label: 'Cell Selection',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: true,\n        description: 'Allow selection of individual cells'\n      },\n      {\n        key: 'allowSelection',\n        type: 'boolean',\n        label: 'Allow Selection',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: false,\n        description: 'Allow selection of grid elements'\n      },\n      {\n        key: 'emit_selected_rows',\n        type: 'boolean',\n        label: 'Send Selected Rows in Event',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: false,\n        description: 'Include every selected record in On Selection Change as selection.selected_rows. Leave off when selection.selected_ids is enough — a wide entity copies every field of every selected row into the payload and into page state.',\n        visible_if: { key: 'allowSelection', equals: true }\n      },\n      {\n        key: 'columnResizable',\n        type: 'boolean',\n        label: 'Column Resizable',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: false,\n        description: 'Allow resizing of columns'\n      },\n      {\n        key: 'columnReorderable',\n        type: 'boolean',\n        label: 'Column Reorderable',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: true,\n        description: 'Allow reordering of columns'\n      },\n      {\n        key: 'filtering',\n        type: 'boolean',\n        label: 'Filtering',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: true,\n        description: 'Enable filtering functionality'\n      },\n      {\n        key: 'sortable',\n        type: 'boolean',\n        label: 'Sortable',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: true,\n        description: 'Enable column sorting'\n      },\n      {\n        key: 'sortBar',\n        type: 'boolean',\n        label: 'Sort Bar',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: false,\n        description: 'Show sort bar above the grid'\n      },\n      {\n        key: 'groupBar',\n        type: 'boolean',\n        label: 'Group Bar',\n        category: 'behavior',\n        section: 'Interaction',\n        default_value: false,\n        description: 'Show group bar above the grid'\n      },\n      {\n        key: 'action_column',\n        type: 'boolean',\n        label: 'Action Column',\n        category: 'behavior',\n        section: 'Row Actions',\n        default_value: false,\n        description: 'Add a column of row actions, alongside the entity/query columns. Configure the actions themselves on the Events tab as \"Custom Action\".'\n      },\n      {\n        key: 'action_position',\n        type: 'select',\n        label: 'Action Position',\n        category: 'behavior',\n        section: 'Row Actions',\n        default_value: 'after',\n        options: [\n          { label: 'First Column', value: 'before' },\n          { label: 'Last Column', value: 'after' }\n        ],\n        description: 'Where the action column sits. \"First\" places it after the selection checkbox when selection is enabled.',\n        visible_if: { key: 'action_column', equals: true }\n      },\n      {\n        key: 'action_display_type',\n        type: 'select',\n        label: 'Action Display',\n        category: 'behavior',\n        section: 'Row Actions',\n        default_value: 'icons',\n        options: [\n          { label: 'Filled Icons', value: 'icons' },\n          { label: 'Outlined Icons', value: 'icons_outlined' },\n          { label: 'Kebab Menu', value: 'kebab' }\n        ],\n        description: 'Show the actions as icons side by side — filled or outlined, the same icons in either case — or as one kebab opening a menu of icon + name.',\n        visible_if: { key: 'action_column', equals: true }\n      },\n      {\n        key: 'enableRowSubtotals',\n        type: 'boolean',\n        label: 'Subtotal Row',\n        category: 'behavior',\n        section: 'Subtotals & Grand Totals',\n        default_value: true,\n        description: 'Add a subtotal row under each group. Table mode computes it server-side from the numeric columns; pivot computes it in the browser.'\n      },\n      {\n        key: 'subtotalPosition',\n        type: 'select',\n        label: 'Subtotal Row Position',\n        category: 'behavior',\n        section: 'Subtotals & Grand Totals',\n        default_value: 'after',\n        options: [\n          { label: 'Before', value: 'before' },\n          { label: 'After', value: 'after' }\n        ],\n        description: 'Whether each group\\'s subtotal row sits above or below its rows'\n      },\n      {\n        key: 'enableColumnSubtotals',\n        type: 'boolean',\n        label: 'Subtotal Column (pivot)',\n        category: 'behavior',\n        section: 'Subtotals & Grand Totals',\n        default_value: true,\n        description: 'Add a subtotal COLUMN per column dimension. Pivot only — a table has no column dimensions to total across.',\n        visible_if: { key: 'view_mode', equals: 'pivot' }\n      },\n      {\n        key: 'subtotalPositionColumn',\n        type: 'select',\n        label: 'Subtotal Column Position (pivot)',\n        category: 'behavior',\n        section: 'Subtotals & Grand Totals',\n        default_value: 'after',\n        options: [\n          { label: 'Before', value: 'before' },\n          { label: 'After', value: 'after' }\n        ],\n        description: 'Where the pivot subtotal column sits relative to the columns it totals',\n        visible_if: { key: 'view_mode', equals: 'pivot' }\n      },\n      {\n        key: 'subtotalLabel',\n        type: 'text',\n        label: 'Subtotal Label',\n        category: 'behavior',\n        section: 'Subtotals & Grand Totals',\n        default_value: 'Subtotal',\n        description: 'Label for subtotal rows/columns'\n      },\n      {\n        key: 'enableGrandTotal',\n        type: 'boolean',\n        label: 'Grand Total Row',\n        category: 'behavior',\n        section: 'Subtotals & Grand Totals',\n        default_value: true,\n        description: 'Add one grand-total row over every row the grid covers. Table mode computes it server-side; pivot computes it in the browser.'\n      },\n      {\n        key: 'grandTotalPosition',\n        type: 'select',\n        label: 'Grand Total Row Position',\n        category: 'behavior',\n        section: 'Subtotals & Grand Totals',\n        default_value: 'before',\n        options: [\n          { label: 'Before', value: 'before' },\n          { label: 'After', value: 'after' }\n        ],\n        description: 'Whether the grand-total row sits above the first group or below the last'\n      },\n      {\n        key: 'enableColumnGrandTotal',\n        type: 'boolean',\n        label: 'Grand Total Column (pivot)',\n        category: 'behavior',\n        section: 'Subtotals & Grand Totals',\n        default_value: true,\n        description: 'Add a grand-total COLUMN across every column dimension. Pivot only.',\n        visible_if: { key: 'view_mode', equals: 'pivot' }\n      },\n      {\n        key: 'grandTotalPositionColumn',\n        type: 'select',\n        label: 'Grand Total Column Position (pivot)',\n        category: 'behavior',\n        section: 'Subtotals & Grand Totals',\n        default_value: 'after',\n        options: [\n          { label: 'Before', value: 'before' },\n          { label: 'After', value: 'after' }\n        ],\n        description: 'Where the pivot grand-total column sits',\n        visible_if: { key: 'view_mode', equals: 'pivot' }\n      },\n      {\n        key: 'replaceZeroValue',\n        type: 'text',\n        label: 'Replace Zero Value',\n        category: 'behavior',\n        section: 'Subtotals & Grand Totals',\n        default_value: '',\n        description: 'Text to display instead of zero values'\n      },\n      {\n        key: 'refresh_icon',\n        type: 'boolean',\n        label: 'Show Refresh Icon',\n        category: 'behavior',\n        default_value: false,\n        description: 'Show a refresh icon in the grid\\'s primary colour, in the first group header or above the grid when the group bar is off. Clicking it reloads the grid, the same as the Refresh Grid action.'\n      },\n      {\n        key: 'excel_download',\n        type: 'boolean',\n        label: 'Enable Excel Download',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: false,\n        description: 'Enable excel export for this grid and forward the excel style config to eru-grid'\n      },\n      {\n        key: 'excel_download_icon',\n        type: 'boolean',\n        label: 'Show Excel Icon',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: true,\n        description: 'Show the built-in excel icon above the grid. Turn off to keep export enabled but trigger it from your own button with the Download Grid action.',\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'response_key',\n        type: 'text',\n        label: 'Response Key',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: '',\n        description: 'Top-level wrapper key of the download payload (e.g. Results). Blank uses the grid default.',\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'header_fill_color',\n        type: 'color',\n        label: 'Header: Fill Colour',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: '',\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'header_fill_type',\n        type: 'select',\n        label: 'Header: Fill Type',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: 'pattern',\n        options: [\n          { label: 'Pattern', value: 'pattern' },\n          { label: 'Gradient', value: 'gradient' }\n        ],\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'header_fill_pattern',\n        type: 'number',\n        label: 'Header: Fill Pattern',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: 1,\n        min: 0,\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'header_font_family',\n        type: 'text',\n        label: 'Header: Font Family',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: '',\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'header_font_size',\n        type: 'number',\n        label: 'Header: Font Size',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: 9,\n        min: 1,\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'header_font_bold',\n        type: 'boolean',\n        label: 'Header: Bold',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: true,\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'header_font_color',\n        type: 'color',\n        label: 'Header: Font Colour',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: '',\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'header_border_type',\n        type: 'select',\n        label: 'Header: Border Type',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: '',\n        options: [\n          { label: 'None', value: '' },\n          { label: 'All', value: 'all' },\n          { label: 'Top', value: 'top' },\n          { label: 'Bottom', value: 'bottom' },\n          { label: 'Left', value: 'left' },\n          { label: 'Right', value: 'right' }\n        ],\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'header_border_color',\n        type: 'color',\n        label: 'Header: Border Colour',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: '',\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'header_border_style',\n        type: 'number',\n        label: 'Header: Border Style',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: 1,\n        min: 0,\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'data_fill_color',\n        type: 'color',\n        label: 'Data: Fill Colour',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: '',\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'data_fill_type',\n        type: 'select',\n        label: 'Data: Fill Type',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: 'pattern',\n        options: [\n          { label: 'Pattern', value: 'pattern' },\n          { label: 'Gradient', value: 'gradient' }\n        ],\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'data_fill_pattern',\n        type: 'number',\n        label: 'Data: Fill Pattern',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: 1,\n        min: 0,\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'data_font_family',\n        type: 'text',\n        label: 'Data: Font Family',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: '',\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'data_font_size',\n        type: 'number',\n        label: 'Data: Font Size',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: 9,\n        min: 1,\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'data_font_bold',\n        type: 'boolean',\n        label: 'Data: Bold',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: false,\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'data_font_color',\n        type: 'color',\n        label: 'Data: Font Colour',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: '',\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'data_border_type',\n        type: 'select',\n        label: 'Data: Border Type',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: '',\n        options: [\n          { label: 'None', value: '' },\n          { label: 'All', value: 'all' },\n          { label: 'Top', value: 'top' },\n          { label: 'Bottom', value: 'bottom' },\n          { label: 'Left', value: 'left' },\n          { label: 'Right', value: 'right' }\n        ],\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'data_border_color',\n        type: 'color',\n        label: 'Data: Border Colour',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: '',\n        visible_if: { key: 'excel_download', equals: true }\n      },\n      {\n        key: 'data_border_style',\n        type: 'number',\n        label: 'Data: Border Style',\n        category: 'behavior',\n        section: 'Excel Download',\n        default_value: 1,\n        min: 0,\n        visible_if: { key: 'excel_download', equals: true }\n      },\n    ]\n  };\n\n  override ngOnInit(): void {\n    super.ngOnInit();\n    // Excel colours are design tokens resolved to hex when the config is built,\n    // so a theme switch after load would otherwise export the previous theme's\n    // colours. The host app flips the theme by swapping classes/attributes on\n    // html/body, which no signal exposes — watch for it and re-push the config.\n    if (typeof MutationObserver === 'undefined' || typeof document === 'undefined') return;\n    this.themeObserver = new MutationObserver(() => {\n      if (!this.isGridInitialized() || !this.enableExcelDownload) return;\n      this.gridConfig = this.buildGridConfig();\n      this.eruGrid?.gridService?.set_table_configuration(this.gridConfig);\n    });\n    const options = { attributes: true, attributeFilter: ['class', 'style', 'data-theme'] };\n    this.themeObserver.observe(document.documentElement, options);\n    this.themeObserver.observe(document.body, options);\n  }\n\n  override ngOnDestroy(): void {\n    this.themeObserver?.disconnect();\n    this.themeObserver = undefined;\n    if (this.queryDispatchTimer) clearTimeout(this.queryDispatchTimer);\n    super.ngOnDestroy();\n  }\n}\n","<div class=\"eru-grid-wrapper\" [class]=\"classes()\" [ngStyle]=\"combinedStyles()\">\n  <div class=\"grid-container\">\n    <div class=\"grid-section\">\n      <eru-grid #eruGrid\n        [gridConfig]=\"gridConfig\"\n        [boardCardHeight]=\"boardCardHeight\"\n        [boardCardGap]=\"boardCardGap\"\n        [boardCardPadding]=\"boardCardPadding\"\n        [boardCardTemplate]=\"resolvedBoardTemplate(cardTpl)\"\n        [cellTemplate]=\"resolvedCellTemplate(cellTpl)\"\n        (rowSelect)=\"onRowSelect($event)\"\n        (actionClick)=\"onGridActionClick($event)\">\n      </eru-grid>\n    </div>\n  </div>\n</div>\n\n<!-- Cell template for a `page` column — eru-grid invokes it per row for every\n     column whose datatype is 'page', handing back the column that carries the\n     page id. The same card host as a board card, scoped to one cell; instanceKey\n     is the column name so two page columns on one row keep distinct ids. -->\n<ng-template #cellTpl let-row let-column=\"column\" let-columns=\"columns\">\n  <eru-grid-card-host\n    [row]=\"row\"\n    [columns]=\"columns\"\n    [cardPageId]=\"column?.cell_page_id || ''\"\n    [instanceKey]=\"column?.name || ''\">\n  </eru-grid-card-host>\n</ng-template>\n\n<!-- Custom board-card template — used only when view_mode='board' AND a card_page_id is configured.\n     eru-grid invokes this template for each row; the host component owns the per-card\n     RowDataContext so descendants resolve `value_source: 'field'` against the row data. -->\n<ng-template #cardTpl let-row let-columns=\"columns\" let-group=\"group\">\n  <eru-grid-card-host\n    [row]=\"row\"\n    [columns]=\"columns\"\n    [group]=\"group\"\n    [cardPageId]=\"cardPageId\"\n    [cardHeight]=\"boardCardHeight\">\n  </eru-grid-card-host>\n</ng-template>\n\n\n","/**\n * Turning a query's tabular result into chart marks.\n *\n * The charts used to take one column for the label and one for the value and\n * plot the rows as they arrived, which only works when the query has already\n * grouped. Real result sets are wide and long — one row per transaction, many\n * columns — so the chart has to do the grouping itself.\n *\n * The vocabulary is the grid's pivot vocabulary on purpose (see the\n * `pivot_rows` / `pivot_cols` / `pivot_aggregations` properties on\n * `grid.component.ts`): a dimension is what a grid pivot puts down the left, a\n * split is what it spreads across the top, and a measure is one of its values\n * with its aggregation function. A page author who has configured a pivot grid\n * already knows how to configure a chart.\n */\n\nimport { parseValueList } from './json.util';\n\nexport type ChartAggregation = 'sum' | 'count' | 'avg' | 'min' | 'max' | 'first' | 'none';\n\nexport interface ChartDimension {\n  name: string;\n  label?: string;\n  /** Column a click on this dimension's marks drills into. Blank: no drill. */\n  drill_into?: string;\n  /** Label for the drilled-to level; falls back to that column's own label. */\n  drill_label?: string;\n  /** Top-N cap for the drilled-to level. */\n  drill_top_n?: number;\n  /** Query to run for the drilled-to level. Query-sourced drills only. */\n  drill_query?: string;\n  /**\n   * Payload key the clicked categories are sent under when the drill re-queries.\n   * Absent, this dimension's own column name is used.\n   */\n  drill_filter_field?: string;\n  /** Entity holding the colour-bearing field. Blank uses the page's entity. */\n  color_entity?: string;\n  /**\n   * Entity field whose option colours paint this dimension's marks. Blank uses\n   * the dimension's own column, which is the usual case — a `ds` dimension takes\n   * the `ds` field's status colours with nothing to configure.\n   */\n  color_field?: string;\n  /**\n   * Per-value colour overrides for THIS dimension, as `Value=#hex` pairs or\n   * `{value, color}` rows. Per dimension because every dimension is a different\n   * column: the values under deal status share nothing with those under risk.\n   */\n  value_colors?: any;\n  /**\n   * Highest N categories to plot for THIS dimension, rest clubbed into 'Others'.\n   * Per dimension because cardinality is a property of the column: deal status\n   * may have twenty values worth capping while deal type has three. Absent plots\n   * every category.\n   */\n  top_n?: number;\n}\n\nexport interface ChartMeasure {\n  name: string;\n  label?: string;\n  aggregation?: ChartAggregation;\n  /** Entity holding the field whose number format this measure follows. */\n  format_entity?: string;\n  /**\n   * Field whose `decimal` / `seperator` / `dynamic_number` / `symbol` this\n   * measure formats by. Blank uses the measure's own column, so an amount column\n   * already formatted as currency in the model needs nothing configured.\n   */\n  format_field?: string;\n  /** Inline overrides for when the model carries no format. */\n  symbol?: string;\n  decimal?: any;\n  seperator?: string;\n  dynamic_number?: boolean;\n  display_number_as?: 'lacs' | 'mn';\n}\n\n/** The rows behind one category, kept so a drill click can hand a record back. */\nexport interface ChartGroup {\n  category: string;\n  rows: any[];\n}\n\nexport interface ChartSeries {\n  name: string;\n  data: (number | null)[];\n  /** Value of the split-by column this series stands for; null when unsplit. */\n  split_value: string | null;\n  /** Rows behind each category of this series, aligned with `data`. */\n  cell_rows: any[][];\n}\n\nexport interface ChartDataset {\n  categories: string[];\n  groups: ChartGroup[];\n  series: ChartSeries[];\n  /**\n   * The categories clubbed into the \"Others\" mark, when a top-N cut was made.\n   * Carried so a drill on Others can filter by the real categories behind it —\n   * nothing can be filtered by the literal label 'Others'.\n   */\n  others_categories: string[];\n}\n\nexport type ChartSort = 'none' | 'category_asc' | 'category_desc' | 'value_asc' | 'value_desc';\n\n/** One step taken in a drill: which category, under which dimension. */\nexport interface ChartDrillStep {\n  /** Dimension whose mark was clicked — the one on screen at the time. */\n  dimension: string;\n  /** The dimension now displayed as a result of this step. */\n  into: ChartDimension;\n  /** The clicked mark's label; 'Others' when the clubbed mark was clicked. */\n  category: string;\n  /**\n   * Categories this step actually selects. One entry normally; every clubbed\n   * category when 'Others' was clicked, since nothing matches that label.\n   */\n  categories: string[];\n  /** Payload key to send `categories` under when a level re-queries. */\n  filter_field?: string;\n  /**\n   * Whether this step was answered by its own query rather than by narrowing the\n   * rows already held. Recorded per step because a chain can mix the two: a\n   * same-data step can sit under a queried one and vice versa.\n   */\n  via_query: boolean;\n}\n\n\nexport interface ChartAggregateOptions {\n  split_by?: string | null;\n  sort?: ChartSort;\n  /**\n   * Plot only the highest N categories by measure and club the remainder into a\n   * single 'Others' mark, so N = 5 draws 6. 0 or absent plots every category.\n   */\n  top_n?: number;\n}\n\nexport const CHART_AGGREGATIONS: ChartAggregation[] = ['sum', 'count', 'avg', 'min', 'max', 'first', 'none'];\n\n/** Label for the mark that carries everything below the top-N cut. */\nexport const CHART_OTHERS_LABEL = 'Others';\n\n/**\n * A column's value on a row. Dotted paths are resolved so a nested result\n * (`customer.region`) can be a dimension, the same as the grid allows.\n */\nexport function resolveChartValue(row: any, path: string): any {\n  if (!row || !path) return undefined;\n  if (path in row) return row[path];\n  return path.split('.').reduce((acc: any, part: string) => (acc == null ? acc : acc[part]), row);\n}\n\n/**\n * A row's category under one dimension, in the exact form\n * `aggregateChartData` groups by.\n *\n * Exported so a drill can filter rows by a category it was handed back: doing\n * that with a raw `row[dim] === category` comparison misses every value the\n * grouping coerced — a number, a date, a null that became '(blank)'.\n */\nexport function chartCategoryValue(row: any, dimension: string): string {\n  return displayValue(resolveChartValue(row, dimension));\n}\n\n/**\n * Dimensions as authored.\n *\n * Accepts the editor's array of objects, a JSON string of the same (what a\n * page saved through the JSON panel carries), and a plain comma-separated list\n * of column names — that last form is what the grid's `pivot_rows` uses, and\n * accepting it means an author can paste one into the other.\n */\nexport function parseChartDimensions(raw: any): ChartDimension[] {\n  return parseList(raw).map((item: any) => {\n    if (typeof item === 'string') return { name: item.trim(), label: item.trim() };\n    return {\n      name: String(item?.name ?? '').trim(),\n      label: item?.label || undefined,\n      top_n: parsePositiveInt(item?.top_n),\n      drill_into: item?.drill_into ? String(item.drill_into).trim() : undefined,\n      drill_label: item?.drill_label || undefined,\n      drill_top_n: parsePositiveInt(item?.drill_top_n),\n      drill_query: item?.drill_query ? String(item.drill_query).trim() : undefined,\n      drill_filter_field: item?.drill_filter_field || undefined,\n      color_entity: item?.color_entity ? String(item.color_entity).trim() : undefined,\n      color_field: item?.color_field ? String(item.color_field).trim() : undefined,\n      value_colors: item?.value_colors ?? undefined\n    };\n  }).filter(d => !!d.name);\n}\n\n/** A top-N entry as authored: blank, 0 and junk all mean \"no cap\". */\nexport function parsePositiveInt(value: any): number | undefined {\n  if (value === null || value === undefined || value === '') return undefined;\n  const num = Math.floor(Number(value));\n  return isNaN(num) || num <= 0 ? undefined : num;\n}\n\nexport function parseChartMeasures(raw: any): ChartMeasure[] {\n  return parseList(raw).map((item: any) => {\n    if (typeof item === 'string') {\n      // \"amount:sum\" — the shorthand a comma-separated list can carry.\n      const [name, fn] = item.split(':');\n      return { name: (name || '').trim(), aggregation: normalizeAggregation(fn) };\n    }\n    return {\n      name: String(item?.name ?? '').trim(),\n      label: item?.label || undefined,\n      aggregation: normalizeAggregation(item?.aggregation ?? item?.aggregationFunction),\n      format_entity: item?.format_entity ? String(item.format_entity).trim() : undefined,\n      format_field: item?.format_field ? String(item.format_field).trim() : undefined,\n      symbol: item?.symbol || undefined,\n      decimal: item?.decimal ?? undefined,\n      seperator: item?.seperator || undefined,\n      dynamic_number: item?.dynamic_number === true || item?.dynamic_number === 'true' ? true : undefined,\n      display_number_as: item?.display_number_as || undefined\n    };\n  }).filter(m => !!m.name);\n}\n\n/** The label a selector shows for a dimension or measure. */\nexport function chartMeasureLabel(measure: ChartMeasure | null): string {\n  if (!measure) return '';\n  if (measure.label) return measure.label;\n  const fn = measure.aggregation || 'sum';\n  return fn === 'none' || fn === 'first' ? measure.name : `${fn.toUpperCase()}(${measure.name})`;\n}\n\nexport function chartDimensionLabel(dimension: ChartDimension | null): string {\n  if (!dimension) return '';\n  return dimension.label || dimension.name;\n}\n\n/**\n * Group `rows` by one dimension and reduce one measure per group.\n *\n * When `split_by` names a column, one series is produced per distinct value of\n * that column — the chart equivalent of a pivot's column dimension. Otherwise\n * there is a single series named after the measure.\n *\n * Categories keep first-seen order unless a sort is asked for, so a query that\n * already ordered its rows (by month, say) plots in that order rather than\n * alphabetically.\n */\nexport function aggregateChartData(\n  rows: any[],\n  dimension: ChartDimension | null,\n  measure: ChartMeasure | null,\n  options: ChartAggregateOptions = {}\n): ChartDataset {\n  const empty: ChartDataset = { categories: [], groups: [], series: [], others_categories: [] };\n  if (!Array.isArray(rows) || rows.length === 0 || !dimension?.name) return empty;\n\n  const splitBy = (options.split_by || '').trim();\n  const categories: string[] = [];\n  const groupRows = new Map<string, any[]>();\n  const splitValues: string[] = [];\n  // category -> split value -> rows\n  const cells = new Map<string, Map<string, any[]>>();\n\n  for (const row of rows) {\n    if (!row || typeof row !== 'object') continue;\n    const category = displayValue(resolveChartValue(row, dimension.name));\n    if (!groupRows.has(category)) {\n      groupRows.set(category, []);\n      categories.push(category);\n      cells.set(category, new Map<string, any[]>());\n    }\n    groupRows.get(category)!.push(row);\n\n    const split = splitBy ? displayValue(resolveChartValue(row, splitBy)) : '';\n    if (splitBy && !splitValues.includes(split)) splitValues.push(split);\n    const bucket = cells.get(category)!;\n    if (!bucket.has(split)) bucket.set(split, []);\n    bucket.get(split)!.push(row);\n  }\n\n  const ordered = sortCategories(categories, groupRows, measure, options.sort || 'none');\n\n  // Top N by measure, everything below the cut clubbed into one 'Others' mark.\n  // Ranking is always by measure descending — \"top\" means top by value, whatever\n  // display order the author asked for — but the categories that survive keep\n  // that display order, and Others is drawn last.\n  const top_n = options.top_n && options.top_n > 0 ? Math.floor(options.top_n) : 0;\n  let kept = ordered;\n  let clubbed: string[] = [];\n  // Only club when it actually folds more than one category away: replacing a\n  // single category with a mark labelled 'Others' costs information and saves\n  // no space.\n  if (top_n > 0 && ordered.length > top_n + 1) {\n    const ranked = [...ordered].sort((a, b) =>\n      (reduceRows(groupRows.get(b) ?? [], measure) ?? 0) - (reduceRows(groupRows.get(a) ?? [], measure) ?? 0));\n    const top = new Set(ranked.slice(0, top_n));\n    kept = ordered.filter(c => top.has(c));\n    clubbed = ordered.filter(c => !top.has(c));\n  }\n\n  const seriesKeys = splitBy ? (splitValues.length ? splitValues : ['']) : [''];\n  const series: ChartSeries[] = seriesKeys.map(key => {\n    const cellRows = kept.map(category => cells.get(category)?.get(key) ?? []);\n    // Others reduces over the union of the clubbed rows rather than combining\n    // their per-category results, so an avg is the average of the whole\n    // remainder and not an average of averages.\n    if (clubbed.length > 0) {\n      cellRows.push(clubbed.flatMap(c => cells.get(c)?.get(key) ?? []));\n    }\n    return {\n      name: splitBy ? key : chartMeasureLabel(measure),\n      split_value: splitBy ? key : null,\n      data: cellRows.map(bucket => reduceRows(bucket, measure)),\n      cell_rows: cellRows\n    };\n  });\n\n  const groups: ChartGroup[] = kept.map(category => ({ category, rows: groupRows.get(category) ?? [] }));\n  if (clubbed.length > 0) {\n    groups.push({ category: CHART_OTHERS_LABEL, rows: clubbed.flatMap(c => groupRows.get(c) ?? []) });\n  }\n\n  return {\n    categories: clubbed.length > 0 ? [...kept, CHART_OTHERS_LABEL] : kept,\n    groups,\n    series,\n    others_categories: clubbed\n  };\n}\n\n/** Reduce one bucket of rows to the measure's single number. */\nexport function reduceRows(rows: any[], measure: ChartMeasure | null): number | null {\n  const fn = measure?.aggregation || 'sum';\n  const name = measure?.name || '';\n\n  if (fn === 'count') {\n    // Count the rows that actually carry the measure — a count over a column\n    // that is null on half the rows is asking how many have it. With no column\n    // named, every row counts.\n    if (!name) return rows.length;\n    return rows.filter(row => {\n      const v = resolveChartValue(row, name);\n      return v !== null && v !== undefined && v !== '';\n    }).length;\n  }\n\n  const numbers: number[] = [];\n  for (const row of rows) {\n    const raw = resolveChartValue(row, name);\n    if (raw === null || raw === undefined || raw === '') continue;\n    const num = Number(raw);\n    if (!isNaN(num)) numbers.push(num);\n  }\n\n  // 'none' and 'first' are the pre-aggregated case: the query already grouped\n  // and the column holds the finished number, so nothing should be summed.\n  if (fn === 'none' || fn === 'first') return numbers.length > 0 ? numbers[0] : null;\n\n  if (numbers.length === 0) return null;\n  switch (fn) {\n    case 'avg': return numbers.reduce((a, b) => a + b, 0) / numbers.length;\n    case 'min': return Math.min(...numbers);\n    case 'max': return Math.max(...numbers);\n    case 'sum':\n    default: return numbers.reduce((a, b) => a + b, 0);\n  }\n}\n\nfunction sortCategories(\n  categories: string[],\n  groupRows: Map<string, any[]>,\n  measure: ChartMeasure | null,\n  sort: ChartSort\n): string[] {\n  if (sort === 'none') return categories;\n  const list = [...categories];\n  if (sort === 'category_asc') return list.sort((a, b) => a.localeCompare(b));\n  if (sort === 'category_desc') return list.sort((a, b) => b.localeCompare(a));\n  // Value sorts rank on the measure over the whole category, not per split —\n  // otherwise the ordering would change with whichever series happened to be\n  // drawn first.\n  const totals = new Map<string, number>();\n  for (const category of list) {\n    totals.set(category, reduceRows(groupRows.get(category) ?? [], measure) ?? 0);\n  }\n  return list.sort((a, b) => sort === 'value_asc'\n    ? (totals.get(a)! - totals.get(b)!)\n    : (totals.get(b)! - totals.get(a)!));\n}\n\nfunction parseList(raw: any): any[] {\n  return parseValueList(raw);\n}\n\nfunction normalizeAggregation(value: any): ChartAggregation {\n  const fn = String(value || '').toLowerCase() as ChartAggregation;\n  return CHART_AGGREGATIONS.includes(fn) ? fn : 'sum';\n}\n\n/**\n * A dimension value as a category label. Everything becomes a string because\n * ECharts keys its category axis by string, and null has to be visible rather\n * than collapsing into the empty label.\n */\nfunction displayValue(value: any): string {\n  if (value === null || value === undefined || value === '') return '(blank)';\n  if (value instanceof Date) return value.toISOString().slice(0, 10);\n  if (typeof value === 'object') return JSON.stringify(value);\n  return String(value);\n}\n\n// ---------------------------------------------------------------------------\n// ECharts option overrides\n//\n// The panel exposes the handful of options most charts need. Everything else\n// ECharts supports is reachable through a path/value list, so an author who\n// knows the library is never blocked waiting for a property to be added.\n// ---------------------------------------------------------------------------\n\nexport interface ChartOptionOverride {\n  /** Dotted path into the ECharts option, e.g. `xAxis.axisLabel.rotate`. */\n  path: string;\n  /** Value as authored; JSON when it parses, otherwise the raw string. */\n  value: any;\n}\n\n/**\n * Overrides as authored. A value is run through JSON.parse first so `true`, `12`,\n * `\"#fff\"` and `{\"fontSize\":14}` all arrive as the type ECharts expects, falling\n * back to the plain string for bare words like `dashed`.\n */\nexport function parseChartOptionOverrides(raw: any): ChartOptionOverride[] {\n  return parseList(raw).map((item: any) => {\n    const path = String(item?.path ?? '').trim();\n    const authored = item?.value;\n    return { path, value: coerceOverrideValue(authored) };\n  }).filter(o => !!o.path);\n}\n\nfunction coerceOverrideValue(value: any): any {\n  if (typeof value !== 'string') return value;\n  const trimmed = value.trim();\n  if (trimmed === '') return '';\n  try {\n    return JSON.parse(trimmed);\n  } catch {\n    return trimmed;\n  }\n}\n\n/**\n * Apply overrides to a built option, in order.\n *\n * Mutates a copy, never the caller's object. A numeric path segment addresses an\n * array slot — `series.0.label.show` — which is how anything inside a series is\n * reached. Missing intermediates are created, choosing an array or an object\n * from the next segment so `series.0` does not silently build `{\"0\": …}`.\n */\nexport function applyChartOptionOverrides(\n  option: Record<string, any>,\n  overrides: ChartOptionOverride[]\n): Record<string, any> {\n  if (!overrides.length) return option;\n  let root: any = { ...option };\n  for (const override of overrides) {\n    const segments = override.path.split('.').map(s => s.trim()).filter(Boolean);\n    if (segments.length === 0) continue;\n    root = setAtPath(root, segments, override.value);\n  }\n  return root;\n}\n\n/**\n * Set one path, copying every node on the way down so an override cannot mutate\n * an object the chart still holds a reference to.\n *\n * A numeric segment addresses an array slot — `series.0.label.show`. A `*`\n * segment applies the rest of the path to every element, which is how a split\n * chart with one series per value is reached without naming each index:\n * `series.*.barWidth`. Missing intermediates are created, choosing an array or\n * an object from the next segment so `series.0` does not build `{\"0\": …}`.\n */\nfunction setAtPath(node: any, segments: (string | number)[], value: any): any {\n  const [head, ...rest] = segments;\n\n  if (head === '*') {\n    if (!Array.isArray(node)) return node;\n    return rest.length === 0\n      ? node.map(() => value)\n      : node.map(entry => setAtPath(cloneNode(entry, rest[0]), rest, value));\n  }\n\n  const key = indexOrKey(String(head));\n  const copy = Array.isArray(node) ? [...node] : { ...(node ?? {}) };\n  if (rest.length === 0) {\n    copy[key as any] = value;\n    return copy;\n  }\n  copy[key as any] = setAtPath(cloneNode(copy[key as any], rest[0]), rest, value);\n  return copy;\n}\n\n/** An existing node to descend into, or a fresh one shaped by the next segment. */\nfunction cloneNode(existing: any, nextSegment: string | number): any {\n  if (existing !== undefined && existing !== null && typeof existing === 'object') {\n    return Array.isArray(existing) ? [...existing] : { ...existing };\n  }\n  const nextIsIndex = nextSegment === '*' || typeof indexOrKey(String(nextSegment)) === 'number';\n  return nextIsIndex ? [] : {};\n}\n\nfunction indexOrKey(segment: string): string | number {\n  return /^\\d+$/.test(segment) ? Number(segment) : segment;\n}\n\n/** One value→colour row: a category as plotted, and the colour to paint it. */\nexport interface ChartValueColor {\n  value: string;\n  color: string;\n}\n\nexport function parseChartValueColors(raw: any): ChartValueColor[] {\n  return parseList(raw).map((item: any) => {\n    // `Proposal=#22c55e` / `Proposal: green` — one text box per dimension beats a\n    // list editor nested inside a list editor.\n    if (typeof item === 'string') {\n      const at = item.search(/[=:]/);\n      if (at < 0) return { value: '', color: '' };\n      return { value: item.slice(0, at).trim(), color: item.slice(at + 1).trim() };\n    }\n    return {\n      value: String(item?.value ?? '').trim(),\n      color: String(item?.color ?? '').trim()\n    };\n  }).filter(r => !!r.value && !!r.color);\n}\n\n/**\n * Value→colour pairs out of an entity field's own definition.\n *\n * A status field stores `open_status` / `close_status`, a tag or select field\n * stores `options`; both hold `{name|label, color}` — the same shapes the status\n * and tag components read. Pulling from here is what makes a chart agree with\n * every badge and cell showing the same value.\n */\nexport function entityFieldValueColors(field: any): ChartValueColor[] {\n  if (!field) return [];\n  const out: ChartValueColor[] = [];\n  const collect = (raw: any) => {\n    let parsed = raw;\n    if (typeof raw === 'string') {\n      try { parsed = JSON.parse(raw); } catch { return; }\n    }\n    if (!Array.isArray(parsed)) return;\n    for (const option of parsed) {\n      const value = String(option?.name ?? option?.label ?? option ?? '').trim();\n      const color = typeof option === 'object' ? String(option?.color ?? '').trim() : '';\n      if (value && color) out.push({ value, color });\n    }\n  };\n  collect(field.open_status);\n  collect(field.close_status);\n  collect(field.options);\n  return out;\n}\n\n/**\n * ECharts label formatter for a label-content choice.\n *\n * `{b}` is the category, `{c}` the value and `{d}` the share of the total —\n * percent is only meaningful where ECharts computes one, so a caller that has no\n * total (a bar or line) should not offer the percent choices.\n */\nexport function chartLabelFormatter(content: string): string | undefined {\n  switch (content) {\n    case 'name': return '{b}';\n    case 'value': return '{c}';\n    case 'percent': return '{d}%';\n    case 'name_value': return '{b}: {c}';\n    case 'name_percent': return '{b}: {d}%';\n    case 'value_percent': return '{c} ({d}%)';\n    case 'name_value_percent': return '{b}: {c} ({d}%)';\n    default: return undefined;\n  }\n}\n","import { Directive, computed, effect, signal, untracked } from '@angular/core';\nimport { PropertySchema } from '../../models';\nimport type * as echarts from 'echarts/core';\nimport { BaseComponent } from '../base-component';\nimport { formatNumberValue, numberFormatSpec } from '../../utils/number-format.util';\nimport {\n  CHART_OTHERS_LABEL,\n  ChartDataset,\n  ChartDrillStep,\n  ChartDimension,\n  ChartMeasure,\n  ChartSort,\n  aggregateChartData,\n  chartDimensionLabel,\n  chartMeasureLabel,\n  applyChartOptionOverrides,\n  chartCategoryValue,\n  chartLabelFormatter,\n  entityFieldValueColors,\n  parseChartDimensions,\n  parseChartOptionOverrides,\n  parseChartMeasures,\n  parseChartValueColors\n} from '../../utils/chart-data.util';\n\n/** Which mark the user clicked, for the drill payload. */\nexport type ChartKind = 'pie' | 'bar' | 'line';\n\n/**\n * Drill support shared by the pie, bar and line charts.\n *\n * ECharts raises one `click` per rendered mark — a pie slice, a bar, a line's\n * symbol — and hands back which series and which index it was. That is all a\n * drill needs, so the charts do not have to hit-test anything themselves.\n *\n * The payload deliberately mirrors the grid's 'On Drill' (see\n * `grid.component.ts`): the record goes in `entity_data` and the click detail is\n * namespaced under a single `drill` key, so a handler written for one reads the\n * same way for the other and `set-from-payload` paths stay stable.\n */\n@Directive()\nexport abstract class ChartBaseComponent extends BaseComponent {\n  override componentEvents = [\n    { label: 'On Drill', value: 'on_drill' }\n  ];\n\n  protected readonly containerStyles = computed<Record<string, string>>(() => {\n    this.component();\n    const styles: Record<string, string> = {};\n    const sizes: [string, string][] = [\n      ['width', 'width'],\n      ['height', 'height'],\n      ['minWidth', 'min-width'],\n      ['minHeight', 'min-height'],\n    ];\n    for (const [key, cssKey] of sizes) {\n      const value = this.getProperty(key);\n      if (value === undefined || value === null) continue;\n      const text = String(value).trim();\n      if (text) styles[cssKey] = text;\n    }\n    return styles;\n  });\n\n  /**\n   * The rows the chart was plotted from, in plot order.\n   *\n   * Held so a click can hand back the record behind the mark rather than only\n   * its label and height — that record is what a drill target filters by. The\n   * series data itself cannot serve: by the time it reaches ECharts it has been\n   * reduced to a name and a number, and every other column is gone.\n   */\n  protected sourceRows: any[] = [];\n\n  /**\n   * Rows behind each plotted cell, as `[seriesIndex][dataIndex]`.\n   *\n   * A split-by chart draws one series per split value, so the category index\n   * alone no longer identifies a bucket — 'North' in the 'Q1' column is a\n   * different set of rows from 'South' in the same column. Populated only on\n   * the aggregated path; `sourceRows` still answers for the flat one.\n   */\n  protected sourceCells: any[][][] = [];\n\n  /**\n   * The rows currently plotted — already filtered to the drill level in view.\n   * Each chart's mapping reads this.\n   */\n  protected lastRows: any[] = [];\n\n  /**\n   * The unfiltered rows at the top of the drill, kept separately from\n   * `lastRows` so stepping back up does not need a refetch.\n   */\n  protected baseRows: any[] = [];\n\n  /** Rows fetched per drill level, when the drill re-queries. */\n  private levelRows = new Map<number, any[]>();\n\n  /** Which drill level the in-flight fetch is for; null means the base rows. */\n  private pendingLevel: number | null = null;\n\n  private drillPathSig = signal<ChartDrillStep[]>([]);\n\n  /**\n   * Id of the in-flight designer preview fetch, so the response effect in each\n   * chart can tell its own reply from another component's.\n   */\n  protected lastRequestId = signal<string | null>(null);\n\n  /** Guards against double-binding when a chart re-initialises. */\n  private drillBound = false;\n\n  /** Watches html/body for the host app's theme swap. */\n  private themeObserver?: MutationObserver;\n  private themeMedia?: MediaQueryList;\n  private themeMediaListener?: () => void;\n  /** Resolved colours the chart last drew with, so a redraw is only done if needed. */\n  private lastThemeFingerprint: string | null = null;\n\n  protected bindChartDrill(chart: echarts.ECharts, kind: ChartKind): void {\n    if (this.drillBound) return;\n    this.drillBound = true;\n    chart.on('click', (params: any) => this.onChartDrill(params, kind));\n  }\n\n  /**\n   * A mark was clicked.\n   *\n   * Ignores clicks that are not on a data mark — a legend entry, an axis label\n   * and the title all raise `click` too, and none of them identifies a record.\n   */\n  private onChartDrill(params: any, kind: ChartKind): void {\n    if (this.store.editMode()) return;\n    if (this.isComponentDisabled()) return;\n    if (params?.componentType !== 'series') return;\n\n    const row = this.rowForIndex(params.dataIndex, params.seriesIndex);\n    const groupedRows = this.rowsForIndex(params.dataIndex, params.seriesIndex);\n    const entityName = this.component()?.entityName\n      || this.store.getPageEntityName(this.component()?.pageId || '')\n      || '';\n\n    this.emitEvent(\n      'on_drill',\n      {\n        category: params.name,\n        value: this.numericValue(params),\n        series_name: params.seriesName\n      },\n      undefined,\n      {\n        entity_id: row?.entity_id ?? '',\n        entity_data: row?.entity_data ?? row ?? {},\n        entity_name: entityName,\n        // Namespaced exactly as the grid's drill is, so a handler can address\n        // `drill.category` / `drill.value` from set-from-payload and it cannot\n        // collide with the record's own fields.\n        context: {\n          drill: {\n            chart_type: kind,\n            // The clicked mark's label — a slice name, or an x-axis category.\n            category: params.name ?? null,\n            value: this.numericValue(params),\n            series_name: params.seriesName ?? null,\n            series_index: params.seriesIndex ?? null,\n            data_index: params.dataIndex ?? null,\n            // Share of the total, for a pie. Null everywhere else, rather than\n            // absent, so a handler's path resolves either way.\n            percent: params.percent ?? null,\n            // Which dimension and measure the chart was showing when clicked —\n            // with the selectors above the chart the answer changes at runtime,\n            // so a handler cannot read it off the saved configuration.\n            dimension: this.selectedDimension()?.name ?? null,\n            dimension_label: chartDimensionLabel(this.selectedDimension()),\n            measure: this.selectedMeasure()?.name ?? null,\n            measure_label: chartMeasureLabel(this.selectedMeasure()),\n            aggregation: this.selectedMeasure()?.aggregation ?? null,\n            // The split-by column's value for this mark, when the chart splits.\n            split_by: (this.getProperty('split_by') || '').trim() || null,\n            split_value: this.splitValueFor(params.seriesIndex),\n            // How many source rows the clicked mark aggregates. A drill target\n            // that re-queries wants to know it is opening 40 records, not one.\n            row_count: groupedRows.length,\n            // A click on the clubbed mark cannot be filtered by the literal\n            // label 'Others', so hand back the categories behind it for an\n            // IN-style filter.\n            depth: this.drillDepth(),\n            is_others: params.name === CHART_OTHERS_LABEL,\n            others_categories: params.name === CHART_OTHERS_LABEL\n              ? (this.lastDataset?.others_categories ?? [])\n              : [],\n            // The whole source row, for filtering by a column that was never\n            // plotted.\n            row: row?.entity_data ?? row ?? null\n          }\n        }\n      }\n    );\n\n    // Inline drill runs alongside the event rather than instead of it, so a page\n    // that already reacts to 'On Drill' keeps working.\n    if (this.inlineDrillEnabled()) this.stepIntoDrill(params);\n  }\n\n\n  /**\n   * Rows for a chart fed from a page state variable.\n   *\n   * The alternative — the chart's own `query` property — sends the query name\n   * and a `transform` string to the server and plots whatever comes back, so a\n   * chart has to restate a fetch the page has usually already made. Reading\n   * state instead lets one `on_load` call-query feed several charts, and reuses\n   * the page's existing update-state plumbing rather than a second path.\n   *\n   * Called from each chart's constructor, which is an injection context.\n   */\n  protected watchStateRows(): void {\n    effect(() => {\n      if ((this.getProperty('value_source') || 'query') !== 'state') return;\n      const key = this.getProperty('state_key');\n      if (!key) return;\n      const pageId = this.component()?.pageId;\n      const dataKey = this.dataKey();\n      const state = pageId\n        ? this.store.getComputedPageStateFor(pageId, dataKey || undefined)\n        : this.store.computedPageState();\n      const rows = state?.[key];\n      if (!Array.isArray(rows) || rows.length === 0) return;\n      // Belt and braces against the freeze this effect once caused: anything\n      // downstream that writes back to the component would re-trigger this\n      // effect, and without a guard the second pass does the same work again\n      // and never settles. Re-applying identical rows is always a no-op.\n      const signature = JSON.stringify(rows);\n      if (signature === this.lastAppliedRows) return;\n      this.lastAppliedRows = signature;\n      untracked(() => this.setBaseRows(rows));\n    });\n  }\n\n  /** Serialised form of the rows last handed to the chart. */\n  private lastAppliedRows: string | null = null;\n\n  /** The `query#transform` last asked for, so the same fetch is not repeated. */\n  private lastQueryFingerprint: string | null = null;\n\n  /**\n   * Rows for a chart fed by its own saved query.\n   *\n   * The fetch used to be triggered only by the property panel's\n   * `on_value_change`, which fires when an author edits the query — so at\n   * runtime nothing ever asked for the rows and the chart drew its authored\n   * placeholder instead. `store.queryData()` did not save it either: that map is\n   * only filled as a side effect of some other component happening to fetch the\n   * same query.\n   *\n   * Called from each chart's constructor, which is an injection context.\n   */\n  protected watchQueryRows(): void {\n    effect(() => {\n      if ((this.getProperty('value_source') || 'query') !== 'query') return;\n      const query = this.getProperty('query');\n      if (!query) return;\n      const transform = this.getProperty('transformData') || '';\n      untracked(() => this.requestQueryRows(query, transform));\n    });\n  }\n\n  /**\n   * Ask the host for this chart's query rows. Shared by the load-time effect and\n   * the panel's on_value_change so an author's edit and the effect that observes\n   * it cannot both fire the same fetch.\n   */\n  protected requestQueryRows(query: string, transform: string): void {\n    // Refuse an empty or non-query-sourced fetch. BaseComponent fires\n    // `on_value_change` for every property on init (see base-component.ts), so\n    // every chart — including ones fed from page state — used to send a fetch\n    // with a blank query name on load.\n    const name = (query || '').trim();\n    if (!name) return;\n    if ((this.getProperty('value_source') || 'query') !== 'query') return;\n    const fingerprint = `${name}#${transform}`;\n    if (fingerprint === this.lastQueryFingerprint) return;\n    this.lastQueryFingerprint = fingerprint;\n    this.pendingLevel = null;\n\n    // `fetch_query_data`, not `ds_fetch_query`, for three reasons the grid\n    // already relies on: the host runs it straight through the saved query's\n    // eru-ql execute endpoint (`ds_fetch_query` goes via an eru-func\n    // `query_fetch` route that answered 400 here); the host resolves each\n    // request on its own rather than through one shared query-request slot, so\n    // two charts on a page cannot overwrite each other; and it is already\n    // bridged out of a shell mount by runtime-canvas.\n    const payload: Record<string, any> = {};\n    if (transform) payload['transform'] = transform;\n    this.lastRequestId.set(this.store.requestDynamicData(\n      this.component()?.id || '', 'fetch_query_data', { query: name, payload }));\n  }\n\n  /** The function name last asked for, so the same fetch is not repeated. */\n  private lastFunctionFingerprint: string | null = null;\n\n  /**\n   * Rows for a chart fed by an eru function.\n   *\n   * The function is executed once and whatever it answers with is unwrapped by\n   * `extractQueryRows`, exactly as a query response is — so Result Path works\n   * the same way for both.\n   *\n   * Called from each chart's constructor, which is an injection context.\n   */\n  protected watchFunctionRows(): void {\n    effect(() => {\n      if ((this.getProperty('value_source') || 'query') !== 'function') return;\n      const functionName = this.getProperty('function_name');\n      if (!functionName) return;\n      untracked(() => this.requestFunctionRows(functionName));\n    });\n  }\n\n  /** Ask the host to run this chart's function. Mirrors requestQueryRows. */\n  protected requestFunctionRows(functionName: string): void {\n    const name = (functionName || '').trim();\n    if (!name) return;\n    // BaseComponent fires on_value_change for every property on init, so guard\n    // against a chart on another source sending a fetch it never wanted.\n    if ((this.getProperty('value_source') || 'query') !== 'function') return;\n    if (name === this.lastFunctionFingerprint) return;\n    this.lastFunctionFingerprint = name;\n    this.pendingLevel = null;\n    this.lastRequestId.set(this.store.requestDynamicData(\n      this.component()?.id || '', 'fetch_function_data', { function: name, payload: {} }));\n  }\n\n  /**\n   * Rows out of a saved query's response.\n   *\n   * The endpoint does not always answer with a bare array — a result is often\n   * nested under the query's own name — so unwrap the same way the grid does,\n   * with `query_result_path` as the explicit override when a response nests\n   * deeper than one level.\n   */\n  protected extractQueryRows(data: any): any[] {\n    const path = this.getProperty('query_result_path');\n    let node: any = data;\n    if (path && typeof path === 'string' && path.trim()) {\n      for (const seg of path.split('.').map((x: string) => x.trim()).filter(Boolean)) {\n        if (node == null) break;\n        node = node[/^\\d+$/.test(seg) ? Number(seg) : seg];\n      }\n      if (Array.isArray(node)) return node;\n      return node && typeof node === 'object' ? [node] : [];\n    }\n    // eru-ql answers with one envelope per statement, each keyed by its result\n    // set — `[{ Results: [ …rows ] }]`. Unwrap by that key rather than by\n    // \"first array found\": a row can itself hold an array column (a deal's\n    // owners, say), and picking that would plot the column instead of the rows.\n    const unwrap = (value: any): any[] | null => {\n      if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n      for (const key of ChartBaseComponent.RESULT_KEYS) {\n        const inner = (value as any)[key];\n        if (Array.isArray(inner)) return inner;\n      }\n      return null;\n    };\n    if (Array.isArray(node)) {\n      return (node.length === 1 ? unwrap(node[0]) : null) ?? node;\n    }\n    return unwrap(node) ?? (node && typeof node === 'object' ? [node] : []);\n  }\n\n  /** Keys a saved query's response wraps its row array in. */\n  private static readonly RESULT_KEYS = ['Results', 'results', 'result', 'rows', 'data'];\n\n  /** Hand rows to the chart's own mapping (its `updateChartData`). */\n  protected abstract applyRows(rows: any[]): void;\n\n  /** The chart's authored static rows. Overridden by each chart. */\n  protected staticRows(): any[] {\n    return [];\n  }\n\n  // ---------------------------------------------------------------------------\n  // Inline drill\n  //\n  // A click on a mark narrows the chart in place instead of navigating away.\n  // The levels are their own ordered list, NOT the `dimensions` list: those are\n  // alternative slicings offered in the selector (status, risk, type) and none\n  // of them sits under another, whereas a drill is a hierarchy.\n  //\n  // Level 0 is whatever the chart is showing when clicked — so a drill behaves\n  // the same whichever dimension the viewer picked — and each step records the\n  // dimension it filtered on, which is what lets the breadcrumb walk back.\n  // ---------------------------------------------------------------------------\n\n  readonly inlineDrillEnabled = computed(() => this.getProperty('inline_drill') === true);\n\n  readonly drillPath = computed<ChartDrillStep[]>(() => this.drillPathSig());\n  readonly drillDepth = computed(() => this.drillPathSig().length);\n\n  /** Crumbs for the trail above the chart; index is the depth to return to. */\n  readonly drillCrumbs = computed(() => [\n    { label: 'All', index: 0 },\n    ...this.drillPathSig().map((step, i) => ({ label: step.category, index: i + 1 }))\n  ]);\n\n  /**\n   * The dimension actually plotted: the selector's pick at the top, the drill\n   * level's own dimension once drilled.\n   */\n  protected activeDimension(): ChartDimension | null {\n    const path = this.drillPathSig();\n    return path.length === 0 ? this.selectedDimension() : path[path.length - 1].into;\n  }\n\n  /**\n   * The measure never changes on the way down. A drill answers \"what is this\n   * total made of\", so re-measuring mid-drill would compare unlike numbers and\n   * the parent's slice would stop accounting for its children.\n   */\n  protected activeMeasure(): ChartMeasure | null {\n    return this.selectedMeasure();\n  }\n\n  /**\n   * The dimension a click on `from` opens, or null when it defines no drill.\n   *\n   * The target inherits the drill configuration of its own entry in the\n   * dimensions list when it has one, which is what lets a drill run deeper than\n   * one level without a separate chain to maintain: ds → an, and if `an` is also\n   * a dimension with a drill of its own, the next click keeps going.\n   */\n  protected drillTargetFor(from: ChartDimension | null): ChartDimension | null {\n    const name = (from?.drill_into || '').trim();\n    if (!name) return null;\n    const configured = this.chartDimensions().find(d => d.name === name);\n    return {\n      name,\n      label: from?.drill_label || configured?.label || name,\n      top_n: from?.drill_top_n ?? configured?.top_n,\n      drill_into: configured?.drill_into,\n      drill_label: configured?.drill_label,\n      drill_top_n: configured?.drill_top_n,\n      drill_query: configured?.drill_query,\n      drill_filter_field: configured?.drill_filter_field,\n      color_entity: configured?.color_entity,\n      color_field: configured?.color_field,\n      value_colors: configured?.value_colors\n    };\n  }\n\n  /**\n   * Rows for the level in view, resolved one step at a time so a chain can mix\n   * the two kinds of step: a queried level stands on its own (the server already\n   * answered for the whole path), a same-data level narrows the level above it.\n   */\n  protected currentRows(): any[] {\n    return this.rowsAtDepth(this.drillDepth());\n  }\n\n  private rowsAtDepth(depth: number): any[] {\n    if (depth <= 0) return this.unfilteredRows();\n    const step = this.drillPathSig()[depth - 1];\n    if (!step) return this.unfilteredRows();\n    if (step.via_query) return this.levelRows.get(depth) ?? [];\n    return this.rowsAtDepth(depth - 1)\n      .filter(row => step.categories.includes(chartCategoryValue(row, step.dimension)));\n  }\n\n  private unfilteredRows(): any[] {\n    if (this.baseRows.length > 0) return this.baseRows;\n    return this.hasLiveSource() ? [] : this.staticRows();\n  }\n\n  /**\n   * New rows arrived for the top of the chart. Any drill path is abandoned: its\n   * steps describe categories from the previous result set.\n   */\n  protected setBaseRows(rows: any[]): void {\n    this.baseRows = Array.isArray(rows) ? rows : [];\n    this.levelRows.clear();\n    this.drillPathSig.set([]);\n    this.applyCurrentRows();\n  }\n\n  protected applyCurrentRows(): void {\n    this.applyRows(this.currentRows());\n  }\n\n  /** Step one level down from the clicked mark. */\n  private stepIntoDrill(params: any): void {\n    const from = this.activeDimension();\n    if (!from?.name) return;\n    const into = this.drillTargetFor(from);\n    if (!into) return;                     // this dimension defines no drill\n\n    const category = String(params?.name ?? '');\n    // 'Others' is a label, not a value — narrow by the categories it stands for.\n    const categories = category === CHART_OTHERS_LABEL\n      ? (this.lastDataset?.others_categories ?? [])\n      : [category];\n    if (categories.length === 0) return;\n\n    // A Drill Query on the dimension being left means this level re-queries;\n    // without one the rows already held are simply narrowed.\n    const via_query = !!(from.drill_query || '').trim();\n    this.drillPathSig.set([\n      ...this.drillPathSig(),\n      { dimension: from.name, into, category, categories, filter_field: from.drill_filter_field, via_query }\n    ]);\n\n    if (via_query) this.fetchDrillLevel(this.drillDepth());\n    else this.applyCurrentRows();\n  }\n\n  /** Jump back to a depth from the breadcrumb. */\n  onDrillCrumb(index: number): void {\n    if (index >= this.drillDepth() || index < 0) return;\n    const trimmed = this.drillPathSig().slice(0, index);\n    this.drillPathSig.set(trimmed);\n    const step = trimmed[index - 1];\n    if (step?.via_query && !this.levelRows.has(index)) {\n      this.fetchDrillLevel(index);\n      return;\n    }\n    this.applyCurrentRows();\n  }\n\n  /**\n   * Fetch one drill level's own query, carrying every category clicked on the\n   * way down so the level below is filtered by the whole path, not just the last\n   * click. A clubbed 'Others' step sends its categories as an array for the\n   * query to match with IN.\n   */\n  private fetchDrillLevel(level: number): void {\n    const step = this.drillPathSig()[level - 1];\n    const query = (this.chartDimensions().find(d => d.name === step?.dimension)?.drill_query || '').trim();\n    if (!query) {\n      // No query on this level — fall back to narrowing the rows in hand.\n      this.applyCurrentRows();\n      return;\n    }\n    const payload: Record<string, any> = {};\n    for (const step of this.drillPathSig().slice(0, level)) {\n      const key = step.filter_field || step.dimension;\n      payload[key] = step.categories.length === 1 ? step.categories[0] : step.categories;\n    }\n    this.pendingLevel = level;\n    this.lastRequestId.set(this.store.requestDynamicData(\n      this.component()?.id || '', 'fetch_query_data', { query, payload }));\n  }\n\n  /**\n   * Route a query response to whatever asked for it — the chart's own query, or\n   * one drill level's. Shared here because all three charts had an identical\n   * copy of this effect.\n   */\n  protected watchQueryResponses(): void {\n    effect(() => {\n      const requestId = this.lastRequestId();\n      if (!requestId) return;\n      const responses = this.store.dynamicDataResponses();\n      if (!responses.has(requestId)) return;\n      const data = responses.get(requestId);\n      if (data === undefined || data === null) return;\n      untracked(() => {\n        const rows = this.extractQueryRows(data);\n        const level = this.pendingLevel;\n        this.pendingLevel = null;\n        if (level === null) {\n          this.setBaseRows(rows);\n          return;\n        }\n        this.levelRows.set(level, rows);\n        this.applyCurrentRows();\n      });\n    });\n  }\n\n  /**\n   * Where a chart takes its rows from. Spread into each chart's own schema so\n   * the three offer the same choice in the same words.\n   */\n  protected chartSourceSchema(): PropertySchema[] {\n    return [\n      {\n        key: 'value_source',\n        type: 'select',\n        label: 'Value Source',\n        category: 'data',\n        default_value: 'query',\n        options: [\n          { value: 'query', label: 'Query' },\n          { value: 'function', label: 'Function' },\n          { value: 'state', label: 'Page State' },\n          { value: 'static', label: 'Static Data' }\n        ],\n        description: 'Run this chart\\'s own query or function, plot a page state variable, or use the static data below'\n      },\n      {\n        key: 'state_key',\n        type: 'select',\n        label: 'State Variable',\n        category: 'data',\n        dynamic_options: 'ds_page_state_vars',\n        visible_if: { key: 'value_source', equals: 'state' },\n        description: 'Variable holding an array of rows — e.g. filled by an on_load call-query'\n      },\n      // Deliberately adjacent to Value Source: it is the field that reveals\n      // these, and an author who picks Query looks for the query name right\n      // underneath rather than below the whole mapping section.\n      {\n        key: 'query',\n        type: 'autocomplete',\n        dynamic_options: 'queries',\n        label: 'Query',\n        category: 'data',\n        default_value: '',\n        visible_if: { key: 'value_source', equals: 'query' },\n        description: 'Saved query whose result rows this chart plots',\n        on_value_change: (value: string) => {\n          this.requestQueryRows(value, this.getProperty('transformData') || '');\n        }\n      },\n      {\n        key: 'function_name',\n        type: 'autocomplete',\n        dynamic_options: 'functions',\n        label: 'Function',\n        category: 'data',\n        default_value: '',\n        visible_if: { key: 'value_source', equals: 'function' },\n        description: 'Eru function executed to fetch the rows this chart plots',\n        on_value_change: (value: string) => {\n          this.requestFunctionRows(value);\n        }\n      },\n      {\n        key: 'query_result_path',\n        type: 'text',\n        label: 'Result Path (advanced)',\n        category: 'data',\n        default_value: '',\n        visible_if: { key: 'value_source', in: ['query', 'function'] },\n        description: 'Dotted path to the row array inside the response. Leave empty — a bare array, or one wrapped in a Results envelope, is found automatically.'\n      },\n      {\n        key: 'transformData',\n        type: 'text',\n        label: 'Transform Data (advanced)',\n        category: 'data',\n        default_value: '',\n        visible_if: { key: 'value_source', equals: 'query' },\n        description: 'Optional server-side transform passed with the query. Leave empty — Dimensions and Measures shape the rows here.',\n        on_value_change: (value: string) => {\n          this.requestQueryRows(this.getProperty('query') || '', value);\n        }\n      }\n    ];\n  }\n\n  // ---------------------------------------------------------------------------\n  // Dimensions and measures\n  //\n  // A query hands the chart a wide table — one row per record, many columns.\n  // The chart names one column as the dimension to group down and one as the\n  // measure to reduce, exactly as the pivot grid does, and does the grouping\n  // itself. Several of each may be configured; the first is what draws, and the\n  // selectors above the chart switch between them.\n  // ---------------------------------------------------------------------------\n\n  /** Dimension picked in the selector. Empty means \"whatever is first\". */\n  private dimensionOverride = signal<string>('');\n  private measureOverride = signal<string>('');\n\n  readonly chartDimensions = computed<ChartDimension[]>(() =>\n    parseChartDimensions(this.getProperty('dimensions')));\n\n  readonly chartMeasures = computed<ChartMeasure[]>(() =>\n    parseChartMeasures(this.getProperty('measures')));\n\n  /**\n   * Falls back to the first configured entry rather than holding an index: the\n   * author can reorder or delete entries in the panel while a chart is\n   * selected, and an index would then point at a different column.\n   */\n  readonly selectedDimension = computed<ChartDimension | null>(() => {\n    const list = this.chartDimensions();\n    const chosen = this.dimensionOverride();\n    return list.find(d => d.name === chosen) ?? list[0] ?? null;\n  });\n\n  readonly selectedMeasure = computed<ChartMeasure | null>(() => {\n    const list = this.chartMeasures();\n    const chosen = this.measureOverride();\n    return list.find(m => m.name === chosen) ?? list[0] ?? null;\n  });\n\n  readonly selectedDimensionName = computed(() => this.selectedDimension()?.name ?? '');\n  readonly selectedMeasureName = computed(() => this.selectedMeasure()?.name ?? '');\n\n  /** Whether the selector row should be offered at all. */\n  readonly showChartSelectors = computed(() =>\n    this.getProperty('show_selectors') !== false\n    && (this.chartDimensions().length > 1 || this.chartMeasures().length > 1));\n\n  /**\n   * True once a dimension is configured. The charts keep their original\n   * single-column mapping (`nameKey`/`valueKey`, `xAxisKey`/`yAxisKey`) for\n   * pages saved before this existed, so the two paths have to be told apart.\n   */\n  protected hasChartMapping(): boolean {\n    return !!this.activeDimension()?.name;\n  }\n\n  /**\n   * Whether rows are due to arrive from a query or page state.\n   *\n   * Charts fall back to their authored static data when nothing live is\n   * configured, which is what makes a freshly dropped chart previewable. Once a\n   * query or state key IS configured that fallback is wrong: it painted the\n   * placeholder while the fetch was still in flight, so the chart showed\n   * invented categories that no drill or selector could explain.\n   */\n  protected hasLiveSource(): boolean {\n    const source = this.getProperty('value_source') || 'query';\n    if (source === 'query') return !!this.getProperty('query');\n    if (source === 'state') return !!this.getProperty('state_key');\n    return false;\n  }\n\n  onDimensionSelected(name: string): void {\n    this.dimensionOverride.set(name);\n    // Picking a slicing by hand leaves the drill: the path's steps filter on the\n    // dimension that was on screen, which is no longer the one being shown.\n    this.drillPathSig.set([]);\n    this.replot();\n  }\n\n  onMeasureSelected(name: string): void {\n    this.measureOverride.set(name);\n    this.replot();\n  }\n\n  /** Re-run the chart's own mapping over the rows it already holds. */\n  protected replot(): void {\n    this.applyCurrentRows();\n  }\n\n  /**\n   * Group and reduce `rows` for the current dimension/measure, and record what\n   * each mark was built from so a drill click can hand the records back.\n   */\n  protected buildDataset(rows: any[]): ChartDataset {\n    const dataset = aggregateChartData(\n      rows,\n      this.activeDimension(),\n      this.activeMeasure(),\n      {\n        split_by: this.getProperty('split_by') || '',\n        sort: (this.getProperty('sort_by') || 'none') as ChartSort,\n        top_n: this.resolvedTopN()\n      }\n    );\n    this.sourceCells = dataset.series.map(series => series.cell_rows);\n    this.sourceRows = dataset.groups.map(group => group.rows[0] ?? null);\n    this.lastDataset = dataset;\n    return dataset;\n  }\n\n  /**\n   * The top-N cap in force. Held per dimension rather than per chart: cardinality\n   * belongs to the column, so the cap that suits an eight-stage status is wrong\n   * for a three-value type. Undefined plots every category.\n   */\n  protected resolvedTopN(): number | undefined {\n    return this.activeDimension()?.top_n;\n  }\n\n  /** The dataset last plotted, for the drill payload's split value. */\n  protected lastDataset: ChartDataset | null = null;\n\n  /** The split column's value for a series, for the drill payload. */\n  private splitValueFor(seriesIndex: any): string | null {\n    if (typeof seriesIndex !== 'number') return null;\n    return this.lastDataset?.series[seriesIndex]?.split_value ?? null;\n  }\n\n  // ---------------------------------------------------------------------------\n  // Appearance\n  //\n  // The options authors reach for constantly get their own property; everything\n  // else ECharts supports is reachable through the path/value list, so knowing\n  // the library is enough and no one has to wait for a property to be added.\n  // ---------------------------------------------------------------------------\n\n  /**\n   * The legend block for a chart whose natural default is `fallback`.\n   * `default` keeps each chart's established look, so existing pages do not\n   * shift when this property appears.\n   */\n  protected legendOption(fallback: 'none' | 'top' | 'bottom' | 'left' | 'right'): Record<string, any> {\n    const configured = String(this.getProperty('legend_position') || 'default');\n    const position = configured === 'default' ? fallback : configured;\n    if (position === 'none') return { show: false };\n    const gap = this.legendGap();\n    const textStyle = this.fontSize('legend_font_size') ? { fontSize: this.fontSize('legend_font_size') } : undefined;\n    const common = { show: true, padding: gap, ...(textStyle ? { textStyle } : {}) };\n    if (position === 'left' || position === 'right') {\n      return { ...common, orient: 'vertical', [position]: gap, top: 'middle' };\n    }\n    return { ...common, orient: 'horizontal', [position]: gap, left: 'center' };\n  }\n\n  /** Series colours, when the author has named a palette. */\n  protected paletteOption(): string[] | undefined {\n    const raw = String(this.getProperty('color_palette') || '').trim();\n    if (!raw) return undefined;\n    const colors = raw.split(',').map(c => this.resolveThemeColor(c.trim())).filter(Boolean);\n    return colors.length > 0 ? colors : undefined;\n  }\n\n  /**\n   * The label block for a chart's marks.\n   *\n   * `default` keeps the chart's established look; a named position both turns\n   * labels on and says where they go, so there is no second \"show\" switch to\n   * contradict it. A page saved with the old `show_data_labels` boolean is still\n   * honoured.\n   */\n  protected dataLabelOption(default_show: boolean, default_position: string): Record<string, any> {\n    const configured = String(this.getProperty('data_label_position') || 'default');\n    const content = String(this.getProperty('data_label_content') || '');\n    // A formatting callback when one is needed, else ECharts' own token string.\n    const formatter = this.labelFormatterFor(content) ?? chartLabelFormatter(content);\n    const size = this.fontSize('label_font_size');\n    const extras = {\n      ...(formatter ? { formatter } : {}),\n      ...(size ? { fontSize: size } : {})\n    };\n    if (configured === 'none') return { show: false };\n    if (configured !== 'default') return { show: true, position: configured, ...extras };\n    const legacy = this.getProperty('show_data_labels');\n    return { show: legacy === true ? true : default_show, position: default_position, ...extras };\n  }\n\n  /** Title block, so all three charts size and place it the same way. */\n  protected titleOption(text: string): Record<string, any> {\n    const size = this.fontSize('title_font_size');\n    return {\n      text,\n      left: 'center',\n      textStyle: { fontSize: size ?? 16, fontWeight: 'bold' }\n    };\n  }\n\n  /**\n   * Colour per plotted category.\n   *\n   * The data model already says what colour a status or tag is, and a chart that\n   * picks its own palette contradicts every badge and grid cell showing the same\n   * value. Author rows win over the model so a one-off can still be forced.\n   */\n  protected valueColors(): Record<string, string> {\n    const map: Record<string, string> = {};\n    const dimension = this.activeDimension();\n\n    // Layered least- to most-specific, later writes winning: the chart-wide\n    // pairs are the fallback, then the dimension's field colours, then its own\n    // pairs. There is deliberately no chart-wide *field*: dimensions are\n    // different columns, so one field cannot describe them all.\n    for (const row of parseChartValueColors(this.getProperty('value_colors'))) {\n      map[row.value] = this.resolveThemeColor(row.color);\n    }\n\n    if (dimension?.name) {\n      // The dimension's own column is its default source, so `ds` picks up the\n      // `ds` field's status colours with nothing configured. A column that\n      // defines none simply leaves the chart-wide colours standing.\n      const fieldName = (dimension.color_field || '').trim() || dimension.name;\n      const entityName = (dimension.color_entity || '').trim();\n      for (const row of entityFieldValueColors(this.entityFieldDefinition(fieldName, entityName))) {\n        map[row.value] = this.resolveThemeColor(row.color);\n      }\n      for (const row of parseChartValueColors(dimension.value_colors)) {\n        map[row.value] = this.resolveThemeColor(row.color);\n      }\n    }\n    return map;\n  }\n\n  /**\n   * A field's definition, for its option colours. An empty entity falls back to\n   * the page's own, which is what `getEntityField` already does.\n   */\n  private entityFieldDefinition(fieldName: string, entityName = ''): any {\n    if (!fieldName) return null;\n    return this.store.getEntityField(fieldName, entityName) as any;\n  }\n\n  /**\n   * Redraw when the theme changes, so a token-coloured chart follows it.\n   *\n   * Two triggers are needed. The host app swaps classes/attributes on html/body,\n   * which no signal exposes — hence the observer, the same one the grid uses. But\n   * this theme's tokens are `light-dark(...)` pairs, so a change of the OS colour\n   * scheme repaints every token with no DOM mutation at all; only the media query\n   * sees that one.\n   *\n   * Called from each chart's constructor.\n   */\n  protected watchThemeChanges(): void {\n    if (typeof document === 'undefined') return;\n    const redraw = () => {\n      // Colours are resolved into the option at build time, so only a change in\n      // what they resolve TO is worth a redraw. Without this guard every\n      // unrelated class toggle on body would rebuild the chart.\n      if (!this.themeColorsChanged()) return;\n      this.applyCurrentRows();\n    };\n\n    if (typeof MutationObserver !== 'undefined') {\n      this.themeObserver = new MutationObserver(redraw);\n      const options = { attributes: true, attributeFilter: ['class', 'style', 'data-theme'] };\n      this.themeObserver.observe(document.documentElement, options);\n      if (document.body) this.themeObserver.observe(document.body, options);\n    }\n\n    if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {\n      this.themeMedia = window.matchMedia('(prefers-color-scheme: dark)');\n      this.themeMediaListener = redraw;\n      this.themeMedia.addEventListener?.('change', this.themeMediaListener);\n    }\n\n    // Baseline the colours once the component's inputs are in place, so the very\n    // first theme switch already counts as a change.\n    queueMicrotask(() => {\n      try {\n        this.lastThemeFingerprint = this.themeFingerprint();\n      } catch {\n        this.lastThemeFingerprint = null;\n      }\n    });\n  }\n\n  /** The resolved colours this chart is currently drawing with. */\n  private themeFingerprint(): string {\n    return JSON.stringify([this.paletteOption() ?? [], this.valueColors()]);\n  }\n\n  /**\n   * Whether the colours this chart actually uses now resolve differently.\n   * Fingerprints the resolved values rather than the theme itself, so a chart\n   * coloured entirely in literal hex never redraws.\n   *\n   * The baseline is taken when the watch is installed, not on the first\n   * mutation — treating the first mutation as the baseline swallowed the first\n   * theme switch after load, which is the only one most people try.\n   */\n  private themeColorsChanged(): boolean {\n    let fingerprint: string;\n    try {\n      fingerprint = this.themeFingerprint();\n    } catch {\n      return true;\n    }\n    const previous = this.lastThemeFingerprint;\n    this.lastThemeFingerprint = fingerprint;\n    // No baseline (it threw at install time) — redraw rather than risk staleness.\n    return previous === null ? true : previous !== fingerprint;\n  }\n\n  override ngOnDestroy(): void {\n    this.themeObserver?.disconnect();\n    this.themeObserver = undefined;\n    if (this.themeMedia && this.themeMediaListener) {\n      this.themeMedia.removeEventListener?.('change', this.themeMediaListener);\n    }\n    this.themeMedia = undefined;\n    this.themeMediaListener = undefined;\n    super.ngOnDestroy();\n  }\n\n  /**\n   * A design token resolved to a literal colour.\n   *\n   * ECharts draws on a canvas, and canvas cannot read CSS variables: handed\n   * `var(--studio-primary)` it silently paints black. Nor can it parse what the\n   * token actually holds — this theme stores `light-dark(oklch(…), oklch(…))`,\n   * which canvas also rejects. Letting the browser compute it on a probe element\n   * is what turns either into the `rgb(…)` canvas understands, and probing inside\n   * this chart's own element means a scoped override still applies.\n   */\n  protected resolveThemeColor(color: string): string {\n    const value = String(color ?? '').trim();\n    if (!value || !value.includes('var(')) return value;\n    const host: HTMLElement = this.elementRef?.nativeElement ?? document.body;\n    const probe = document.createElement('span');\n    probe.style.color = value;\n    probe.style.display = 'none';\n    host.appendChild(probe);\n    const resolved = getComputedStyle(probe).color;\n    probe.remove();\n    return resolved || value;\n  }\n\n  /** Whether any value colouring is configured at all. */\n  protected hasValueColors(): boolean {\n    return Object.keys(this.valueColors()).length > 0;\n  }\n\n\n\n  /**\n   * Paint mapped colours onto plotted items. Each item carries its own\n   * `itemStyle`, which is how ECharts colours by value rather than by series.\n   */\n  protected withValueColors<T extends { name?: string; value?: any }>(items: T[]): any[] {\n    const map = this.valueColors();\n    if (Object.keys(map).length === 0) return items;\n    return items.map(item => {\n      const color = map[String(item?.name ?? '')];\n      return color ? { ...item, itemStyle: { ...(item as any).itemStyle, color } } : item;\n    });\n  }\n\n  /**\n   * Formats the measure in view — for labels, tooltips and the value axis.\n   *\n   * The format comes from the data model first (the measure's own column unless\n   * another is named), with the measure row's own settings as the override. Same\n   * rule the number and currency fields follow, through the same helper, so a\n   * currency column reads identically on a chart, a field and a grid.\n   */\n  protected measureFormatter(): (value: any) => string {\n    const measure = this.activeMeasure();\n    if (!measure?.name) return (value: any) => String(value ?? '');\n    const fieldName = (measure.format_field || '').trim() || measure.name;\n    const field = this.entityFieldDefinition(fieldName, (measure.format_entity || '').trim());\n    const spec = numberFormatSpec(field, {\n      symbol: measure.symbol,\n      decimals: measure.decimal,\n      seperator: measure.seperator,\n      dynamic_number: measure.dynamic_number,\n      display_number_as: measure.display_number_as,\n      negative_display: this.getProperty('negative_display')\n    });\n    return (value: any) => formatNumberValue(value, spec);\n  }\n\n  /**\n   * A label callback that prints the chosen content with the measure formatted.\n   *\n   * A function rather than ECharts' `{c}` token because the token prints the raw\n   * number — the whole point of mapping a format is that 12881829 reads as\n   * ₹ 1.29 Cr.\n   */\n  protected labelFormatterFor(content: string): ((params: any) => string) | undefined {\n    const format = this.measureFormatter();\n    switch (content) {\n      case 'name': return (p: any) => String(p?.name ?? '');\n      case 'value': return (p: any) => format(p?.value);\n      case 'percent': return (p: any) => `${p?.percent ?? ''}%`;\n      case 'name_value': return (p: any) => `${p?.name ?? ''}: ${format(p?.value)}`;\n      case 'name_percent': return (p: any) => `${p?.name ?? ''}: ${p?.percent ?? ''}%`;\n      case 'value_percent': return (p: any) => `${format(p?.value)} (${p?.percent ?? ''}%)`;\n      default: return undefined;\n    }\n  }\n\n  /** Value-axis tick formatter, so the axis agrees with the labels. */\n  protected axisValueFormatter(): (value: any) => string {\n    return this.measureFormatter();\n  }\n\n  /** Title / label / legend text sizing. 0 or blank leaves the ECharts default. */\n  protected fontSize(key: 'title_font_size' | 'label_font_size' | 'legend_font_size'): number | undefined {\n    const size = Number(this.getProperty(key));\n    return isNaN(size) || size <= 0 ? undefined : size;\n  }\n\n  /** Padding that keeps the legend off the plot. */\n  protected legendGap(): number {\n    const gap = Number(this.getProperty('legend_gap'));\n    return isNaN(gap) || gap < 0 ? 8 : gap;\n  }\n\n  /** The legend's resolved side, for callers that must lay out around it. */\n  protected legendSide(fallback: string): string {\n    const configured = String(this.getProperty('legend_position') || 'default');\n    return configured === 'default' ? fallback : configured;\n  }\n\n  /** Axis split lines — what \"gridlines\" means to a reader, unlike `grid.show`. */\n  protected showGridlines(): boolean {\n    return this.getProperty('show_gridlines') !== false;\n  }\n\n  /**\n   * Last step before handing an option to ECharts: apply the author's path/value\n   * overrides. Applied last on purpose — an override should be able to beat any\n   * property the panel set.\n   */\n  protected withExtraOptions(option: Record<string, any>): Record<string, any> {\n    return applyChartOptionOverrides(\n      option, parseChartOptionOverrides(this.getProperty('extra_options')));\n  }\n\n  /**\n   * Appearance properties every chart offers. `include_axes` is false for the\n   * pie, which has no axes to draw lines on or labels to rotate.\n   */\n  protected chartAppearanceSchema(options: {\n    include_axes?: boolean;\n    label_positions?: { value: string; label: string }[];\n    label_contents?: { value: string; label: string }[];\n  } = {}): PropertySchema[] {\n    const include_axes = options.include_axes !== false;\n    const axis: PropertySchema[] = include_axes ? [\n      {\n        key: 'show_gridlines',\n        type: 'boolean',\n        label: 'Show Gridlines',\n        category: 'behavior',\n        default_value: true,\n        description: 'Horizontal split lines behind the marks'\n      },\n      {\n        key: 'axis_label_rotate',\n        type: 'number',\n        label: 'Axis Label Rotation',\n        category: 'behavior',\n        default_value: 0,\n        min: -90,\n        max: 90,\n        description: 'Degrees to rotate the category labels — useful when they overlap'\n      }\n    ] : [];\n\n    return [\n      {\n        key: 'legend_position',\n        type: 'select',\n        label: 'Legend',\n        category: 'behavior',\n        default_value: 'default',\n        options: [\n          { value: 'default', label: 'Default' },\n          { value: 'none', label: 'Hidden' },\n          { value: 'top', label: 'Top' },\n          { value: 'bottom', label: 'Bottom' },\n          { value: 'left', label: 'Left' },\n          { value: 'right', label: 'Right' }\n        ],\n        description: 'Where the legend sits, or Hidden to drop it'\n      },\n      {\n        key: 'data_label_position',\n        type: 'select',\n        label: 'Data Labels',\n        category: 'behavior',\n        default_value: 'default',\n        options: [\n          { value: 'default', label: 'Default' },\n          { value: 'none', label: 'Hidden' },\n          ...(options.label_positions || [])\n        ],\n        description: 'Where each mark\\'s value is printed, or Hidden to drop the labels'\n      },\n      {\n        key: 'data_label_content',\n        type: 'select',\n        label: 'Data Label Shows',\n        category: 'behavior',\n        default_value: '',\n        options: [\n          { value: '', label: 'Default' },\n          ...(options.label_contents || [])\n        ],\n        description: 'What each label prints — the category, its value, its share of the total, or a combination'\n      },\n      {\n        key: 'legend_gap',\n        type: 'number',\n        label: 'Legend Gap',\n        category: 'behavior',\n        default_value: 8,\n        min: 0,\n        description: 'Space in pixels between the legend and the plot, on every side'\n      },\n      {\n        key: 'negative_display',\n        type: 'select',\n        label: 'Negative Numbers',\n        category: 'behavior',\n        default_value: 'as_is',\n        options: [\n          { value: 'as_is', label: 'As is', preview: '-1,234.10' },\n          { value: 'colored_abs', label: 'No sign', preview: '1,234.10' },\n          { value: 'parentheses', label: 'In brackets', preview: '(1,234.10)' }\n        ],\n        description: 'How a negative measure reads in labels, tooltips and the value axis. The colour the field and tile controls paint with is not offered here: an ECharts label takes its colour from its series, not from the value.',\n        responsive: false\n      },\n      {\n        key: 'title_font_size',\n        type: 'number',\n        label: 'Title Font Size',\n        category: 'behavior',\n        default_value: 0,\n        min: 0,\n        description: 'Pixels. 0 keeps the default.'\n      },\n      {\n        key: 'label_font_size',\n        type: 'number',\n        label: 'Label Font Size',\n        category: 'behavior',\n        default_value: 0,\n        min: 0,\n        description: 'Size of the data labels. 0 keeps the default.'\n      },\n      {\n        key: 'legend_font_size',\n        type: 'number',\n        label: 'Legend Font Size',\n        category: 'behavior',\n        default_value: 0,\n        min: 0,\n        description: 'Pixels. 0 keeps the default.'\n      },\n      ...axis,\n      {\n        key: 'color_palette',\n        type: 'text',\n        label: 'Colour Palette',\n        category: 'behavior',\n        default_value: '',\n        width: 'full',\n        description: 'Comma-separated colours used in order, e.g. #5470c6, #91cc75, #fac858. Empty uses the ECharts palette.'\n      },\n      {\n        key: 'value_colors',\n        type: 'chart_value_colors',\n        label: 'Colours By Value',\n        category: 'behavior',\n        default_value: '',\n        responsive: false,\n        width: 'full',\n        description: 'Chart-wide fallback, used for any value a dimension does not colour itself.'\n      },\n      {\n        key: 'extra_options',\n        type: 'chart_extra_options',\n        label: 'ECharts Options (advanced)',\n        category: 'behavior',\n        default_value: '',\n        responsive: false,\n        width: 'full',\n        description: 'Any other ECharts option, as a path and a value. Values are read as JSON when they parse. Applied last, so they override the properties above. Use * for every series: series.*.barWidth = 40%. Examples — backgroundColor = #fafafa · series.*.showBackground = true · series.*.backgroundStyle.color = rgba(0,0,0,0.06) · yAxis.max = 100 · legend.icon = circle · tooltip.trigger = item. Note most styling lives under series, not at the top level.'\n      }\n    ];\n  }\n\n  /**\n   * The dimension / measure configuration, shared by all three charts.\n   *\n   * `include_split` is false for the pie: a pie has one ring, so a second\n   * dimension across the top has nowhere to go.\n   */\n  protected chartMappingSchema(include_split = true): PropertySchema[] {\n    const split: PropertySchema[] = include_split ? [\n      {\n        key: 'split_by',\n        type: 'text',\n        label: 'Split By (Series)',\n        category: 'data',\n        default_value: '',\n        width: 'full',\n        description: 'Optional column that splits each category into one series per distinct value — the pivot\\'s column dimension.'\n      }\n    ] : [];\n\n    return [\n      {\n        key: 'dimensions',\n        type: 'chart_dimensions',\n        label: 'Dimensions',\n        category: 'data',\n        default_value: '',\n        responsive: false,\n        width: 'full',\n        description: 'Columns to group the rows by. The first draws by default; add more to offer a selector above the chart. Top N caps a dimension to its highest N categories and clubs the rest into one \"Others\" mark — 5 draws 6; blank plots all. Drill Into names the column a click on that dimension opens, and the drill keeps the same measure throughout.'\n      },\n      {\n        key: 'measures',\n        type: 'chart_measures',\n        label: 'Measures',\n        category: 'data',\n        default_value: '',\n        responsive: false,\n        width: 'full',\n        description: 'Columns to aggregate per group, with the aggregation function. The first draws by default. Use \"none\" when the query already aggregated.'\n      },\n      ...split,\n      {\n        key: 'inline_drill',\n        type: 'boolean',\n        label: 'Inline Drill',\n        category: 'data',\n        default_value: false,\n        description: 'Clicking a mark narrows this chart in place, with a trail above it to walk back. Each Dimension row says what it drills into; a Drill Query there re-queries that level, and no query narrows the rows already loaded. The On Drill event still fires either way.'\n      },\n      {\n        key: 'sort_by',\n        type: 'select',\n        label: 'Sort Categories',\n        category: 'data',\n        default_value: 'none',\n        options: [\n          { value: 'none', label: 'As returned' },\n          { value: 'category_asc', label: 'Category A → Z' },\n          { value: 'category_desc', label: 'Category Z → A' },\n          { value: 'value_desc', label: 'Value high → low' },\n          { value: 'value_asc', label: 'Value low → high' }\n        ],\n        description: 'Order of the plotted categories'\n      },\n      {\n        key: 'show_selectors',\n        type: 'boolean',\n        label: 'Show Dimension/Measure Selector',\n        category: 'behavior',\n        default_value: true,\n        description: 'Show the pickers above the chart when more than one dimension or measure is configured'\n      }\n    ];\n  }\n\n  private rowForIndex(index: any, seriesIndex?: any): any {\n    if (typeof index !== 'number' || index < 0) return null;\n    if (typeof seriesIndex === 'number' && this.sourceCells[seriesIndex]) {\n      const bucket = this.sourceCells[seriesIndex][index];\n      if (Array.isArray(bucket)) return bucket[0] ?? null;\n    }\n    return this.sourceRows[index] ?? null;\n  }\n\n  /** Every row behind the clicked mark, not just the representative one. */\n  private rowsForIndex(index: any, seriesIndex?: any): any[] {\n    if (typeof index !== 'number' || index < 0) return [];\n    if (typeof seriesIndex === 'number' && this.sourceCells[seriesIndex]) {\n      const bucket = this.sourceCells[seriesIndex][index];\n      if (Array.isArray(bucket)) return bucket;\n    }\n    const row = this.sourceRows[index];\n    return row ? [row] : [];\n  }\n\n  /**\n   * The number behind the mark. A bar or line point arrives as a bare number,\n   * a pie slice as `{name, value}`, so `params.value` alone is not enough.\n   */\n  private numericValue(params: any): number | null {\n    const raw = params?.value;\n    if (typeof raw === 'number') return raw;\n    if (raw && typeof raw === 'object' && 'value' in raw) {\n      const inner = Number((raw as any).value);\n      return isNaN(inner) ? null : inner;\n    }\n    const coerced = Number(raw);\n    return isNaN(coerced) ? null : coerced;\n  }\n}\n","import { Component, input, output } from '@angular/core';\nimport { ChartDimension, ChartMeasure, chartDimensionLabel, chartMeasureLabel } from '../../utils/chart-data.util';\n\n/**\n * The dimension / measure pickers drawn above a chart.\n *\n * Only shown when there is a choice to make: with one dimension and one measure\n * the chart has nothing to switch between and the row would be chrome. Native\n * selects rather than Material ones — this sits inside the plotted card at\n * runtime, and a mat-form-field's density and ripple fight the chart's own\n * padding for no gain on a two-item list.\n */\n@Component({\n  selector: 'eru-chart-selectors',\n  standalone: true,\n  template: `\n    @if (crumbs().length > 1) {\n      <!-- A drill with no way back leaves the viewer stranded, so the trail is\n           part of the control row rather than an optional extra. -->\n      <nav class=\"chart-drill-trail\">\n        @for (crumb of crumbs(); track crumb.index; let last = $last) {\n          @if (last) {\n            <span class=\"chart-crumb is-current\">{{ crumb.label }}</span>\n          } @else {\n            <button type=\"button\" class=\"chart-crumb\" (click)=\"crumbClick.emit(crumb.index)\">{{ crumb.label }}</button>\n            <span class=\"chart-crumb-sep\">›</span>\n          }\n        }\n      </nav>\n    }\n    @if (showDimension() || measures().length > 1) {\n      <div class=\"chart-selectors\">\n        @if (showDimension()) {\n          <label class=\"chart-selector\">\n            <span class=\"chart-selector-label\">By</span>\n            <select class=\"chart-selector-input\" [value]=\"selectedDimension()\"\n                    (change)=\"dimensionChange.emit($any($event.target).value)\">\n              @for (d of dimensions(); track d.name) {\n                <option [value]=\"d.name\">{{ label(d) }}</option>\n              }\n            </select>\n          </label>\n        }\n        @if (measures().length > 1) {\n          <label class=\"chart-selector\">\n            <span class=\"chart-selector-label\">Measure</span>\n            <select class=\"chart-selector-input\" [value]=\"selectedMeasure()\"\n                    (change)=\"measureChange.emit($any($event.target).value)\">\n              @for (m of measures(); track m.name) {\n                <option [value]=\"m.name\">{{ measureLabel(m) }}</option>\n              }\n            </select>\n          </label>\n        }\n      </div>\n    }\n  `,\n  styleUrl: './chart-selectors.component.scss'\n})\nexport class ChartSelectorsComponent {\n  dimensions = input<ChartDimension[]>([]);\n  measures = input<ChartMeasure[]>([]);\n  selectedDimension = input<string>('');\n  selectedMeasure = input<string>('');\n  crumbs = input<{ label: string; index: number }[]>([]);\n\n  dimensionChange = output<string>();\n  measureChange = output<string>();\n  crumbClick = output<number>();\n\n  /**\n   * Offer the slicing picker only at the top of a drill: below it the level\n   * decides what is grouped, so the dropdown would contradict the chart.\n   */\n  showDimension(): boolean {\n    return this.dimensions().length > 1 && this.crumbs().length <= 1;\n  }\n\n  label(dimension: ChartDimension): string {\n    return chartDimensionLabel(dimension);\n  }\n\n  measureLabel(measure: ChartMeasure): string {\n    return chartMeasureLabel(measure);\n  }\n}\n","import { Component, OnInit, OnDestroy, effect, untracked } from '@angular/core';\n\nimport { PropertySchema } from '../../models';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { ChartBaseComponent } from '../chart-base/chart-base.component';\nimport { ChartSelectorsComponent } from '../chart-base/chart-selectors.component';\nimport * as echarts from 'echarts/core';\nimport { LineChart } from 'echarts/charts';\nimport {\n  TitleComponent,\n  TooltipComponent,\n  GridComponent,\n  DatasetComponent,\n  TransformComponent,\n  LegendComponent\n} from 'echarts/components';\nimport { LabelLayout, UniversalTransition } from 'echarts/features';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { NgxEchartsModule, provideEchartsCore } from 'ngx-echarts';\n\necharts.use([\n  TitleComponent,\n  TooltipComponent,\n  GridComponent,\n  DatasetComponent,\n  TransformComponent,\n  LegendComponent,\n  LineChart,\n  LabelLayout,\n  UniversalTransition,\n  CanvasRenderer,\n]);\n\n@Component({\n  selector: 'eru-line-chart',\n  standalone: true,\n  imports: [NgxEchartsModule, ChartSelectorsComponent],\n  providers: [provideEchartsCore({ echarts })],\n  template: `\n    <div\n      class=\"chart-container\"\n      [class]=\"classes()\"\n      [style]=\"containerStyles()\"\n      eruBaseComponent>\n      @if (showChartSelectors() || drillDepth() > 0) {\n        <eru-chart-selectors\n          [dimensions]=\"chartDimensions()\"\n          [measures]=\"chartMeasures()\"\n          [selectedDimension]=\"selectedDimensionName()\"\n          [selectedMeasure]=\"selectedMeasureName()\"\n          [crumbs]=\"drillCrumbs()\"\n          (dimensionChange)=\"onDimensionSelected($event)\"\n          (measureChange)=\"onMeasureSelected($event)\"\n          (crumbClick)=\"onDrillCrumb($event)\">\n        </eru-chart-selectors>\n      }\n      <div echarts\n           [options]=\"chartOptions\"\n           [initOpts]=\"initOptions\"\n           (chartInit)=\"onChartInit($event)\"\n           class=\"chart-content\">\n      </div>\n    </div>\n  `,\n  styleUrl: './line-chart.component.scss'\n})\nexport class LineChartComponent extends ChartBaseComponent implements OnInit, OnDestroy {\n  chartInstance!: echarts.ECharts;\n  chartOptions: echarts.EChartsCoreOption = {};\n  initOptions = {\n    renderer: 'canvas' as const,\n    useDirtyRect: false\n  };\n\n  constructor() {\n    super();\n\n    // Watch for property changes and update chart\n    effect(() => {\n      const component = this.component();\n      if (component) {\n        setTimeout(() => this.updateChart(), 0);\n      }\n    });\n\n    effect(() => {\n      const queryData = this.store.queryData();\n      untracked(() => {\n        if (!queryData) return;\n        const query = this.getProperty('query');\n        if (!query) return;\n\n        const chartData = queryData.get(query);\n        if (!chartData) return;\n\n        this.updateChartData(chartData);\n      });\n    });\n\n    // Plot a page state variable when configured to.\n    this.watchStateRows();\n    // Fetch this chart's own saved query on load, and route every query\n    // response — the chart's own and each drill level's.\n    this.watchQueryRows();\n    this.watchFunctionRows();\n    this.watchQueryResponses();\n    // Redraw when the theme changes so token colours follow it.\n    this.watchThemeChanges();\n  }\n\n\n  protected applyRows(rows: any[]): void {\n    this.updateChartData(rows);\n  }\n\n  override ngOnInit(): void {\n    super.ngOnInit();\n    this.updateChart();\n  }\n\n  override ngOnDestroy(): void {\n    if (this.chartInstance) {\n      this.chartInstance.dispose();\n    }\n    super.ngOnDestroy();\n  }\n\n  onChartInit(chart: echarts.ECharts): void {\n    this.chartInstance = chart;\n    this.bindChartDrill(chart, 'line');\n  }\n\n  private parseJsonData(jsonString: string, fallback: any[]): any[] {\n    try {\n      return JSON.parse(jsonString);\n    } catch (error) {\n      console.warn('Failed to parse JSON data:', jsonString, error);\n      return fallback;\n    }\n  }\n\n  /** Axis and series mapped from live rows — see the note in the pie chart:\n   *  writing these back through setProperty() is a no-op at runtime. */\n  private mappedX: any[] | null = null;\n  private mappedSeries: any[] | null = null;\n\n  protected updateChartData(chartData: any): void {\n    // Kept so a selector change can re-plot without re-fetching.\n    this.lastRows = Array.isArray(chartData) ? chartData : [];\n    // Kept so a drill click can hand back the record behind the mark.\n    this.sourceRows = Array.isArray(chartData) ? chartData : [];\n    if (Array.isArray(chartData) && this.hasChartMapping()) {\n      // Grouping happens in updateChart(), against whatever rows are held at\n      // the time — so changing the dimension, the measure or the sort order\n      // re-plots without another fetch.\n      this.updateChart();\n      return;\n    }\n    if (chartData instanceof Object) {\n      const lineColor = this.getProperty('lineColor') || '#5470c6';\n      const areaOpacity = parseFloat(this.getProperty('areaOpacity')) || 0.3;\n      let seriesData: any[] = [];\n      let xAxisData: any[] = [];\n\n      // If chartData is an array, we handle it differently (one series)\n      if (Array.isArray(chartData)) {\n        let xArray: any[] = [];\n        let yArray: any[] = [];\n        chartData.forEach((item: any) => {\n          xArray.push(item[this.getProperty('xAxisKey') || '']);\n          yArray.push(item[this.getProperty('yAxisKey') || '']);\n        });\n        xAxisData = xArray;\n        seriesData.push({\n          name: 'Data',\n          type: 'line',\n          data: yArray,\n          smooth: true,\n          lineStyle: {\n            color: lineColor,\n            width: 2\n          },\n          itemStyle: {\n            color: lineColor\n          },\n          areaStyle: {\n            color: lineColor,\n            opacity: areaOpacity\n          }\n        });\n      } else {\n        // Multi-series from object\n        Object.entries(chartData).forEach(([key, value]: any) => {\n          let xArray: any[] = [];\n          let yArray: any[] = [];\n          if (value instanceof Array) {\n            value.forEach((subValue: any) => {\n              xArray.push(subValue[this.getProperty('xAxisKey') || '']);\n              yArray.push(subValue[this.getProperty('yAxisKey') || '']);\n            });\n            xAxisData = Array.from(new Set([...xAxisData, ...xArray]));\n            seriesData.push({\n              name: key,\n              type: 'line',\n              data: yArray,\n              smooth: true,\n              lineStyle: {\n                width: 2\n              },\n              areaStyle: {\n                opacity: areaOpacity\n              }\n            });\n          }\n        });\n      }\n      this.mappedX = xAxisData;\n      this.mappedSeries = seriesData;\n      // Deliberately NOT written back to the component's properties. Doing so\n      // mutates the component signal that watchStateRows() reads, so the effect\n      // re-ran on its own write and spun forever — the designer froze as soon as\n      // a chart was selected. The mapping lives in the mapped* fields instead,\n      // which updateChart() reads directly; the stored properties stay as the\n      // authored fallback.\n      this.updateChart()\n    }\n  }\n\n  /** See the note on the bar chart's mappingRows(). */\n  private mappingRows(): any[] {\n    if (this.lastRows.length > 0) return this.lastRows;\n    // A live source is configured, or a drill has narrowed to nothing — either\n    // way the authored static rows are not a stand-in.\n    if (this.hasLiveSource() || this.drillDepth() > 0) return [];\n    return this.staticRows();\n  }\n\n  protected override staticRows(): any[] {\n    const rows = this.parseJsonData(this.getProperty('data') || '[]', []);\n    return Array.isArray(rows) ? rows : [];\n  }\n\n  /**\n   * One line per series of the grouped dataset. A Split By column gives a line\n   * per split value; without one there is a single line for the measure.\n   */\n  private mapDataset(rows: any[]): void {\n    const lineColor = this.getProperty('lineColor') || '#5470c6';\n    const areaOpacity = parseFloat(this.getProperty('areaOpacity')) || 0.3;\n    const dataset = this.buildDataset(rows);\n    const multi = dataset.series.length > 1;\n    this.mappedX = dataset.categories;\n    const smooth = this.getProperty('line_smooth') !== false;\n    const label = this.dataLabelOption(false, 'top');\n    this.mappedSeries = dataset.series.map(series => ({\n      name: series.name,\n      type: 'line',\n      data: series.data,\n      smooth,\n      label,\n      // One line takes the configured colour; several take the palette, or\n      // every line would be drawn the same and the legend would say nothing.\n      lineStyle: multi ? { width: 2 } : { color: lineColor, width: 2 },\n      itemStyle: multi ? {} : { color: lineColor },\n      areaStyle: multi ? { opacity: areaOpacity } : { color: lineColor, opacity: areaOpacity }\n    }));\n  }\n\n  private updateChart(): void {\n    // Re-group on every update rather than caching the mapping — see the note\n    // on the bar chart's updateChart().\n    if (this.hasChartMapping()) {\n      // No rows yet — leave whatever is plotted alone rather than blanking the\n      // chart, which is what an empty dataset would do.\n      const rows = this.mappingRows();\n      if (rows.length > 0) this.mapDataset(rows);\n    }\n    const title = this.getProperty('title') || 'Line Chart';\n    // See the note on the pie: the Jan..Jun placeholder is for an unconfigured\n    // chart, not a stand-in for rows still in flight.\n    const live = this.hasLiveSource();\n    const xAxisData = this.mappedX ?? (live ? [] : this.parseJsonData(this.getProperty('xAxisData') || '[\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\"]', []));\n    const seriesData = this.mappedSeries ?? (live ? [] : this.parseJsonData(this.getProperty('seriesData') || '[120, 200, 150, 80, 70, 110]', []));\n    const showGrid = this.getProperty('showGrid') !== false;\n    const showTooltip = this.getProperty('showTooltip') !== false;\n\n    const palette = this.paletteOption();\n\n    this.chartOptions = this.withExtraOptions({\n      title: this.titleOption(title),\n      ...(palette ? { color: palette } : {}),\n      tooltip: {\n        show: showTooltip,\n        trigger: 'axis',\n        valueFormatter: (value: any) => this.measureFormatter()(value)\n      },\n      legend: this.legendOption('bottom'),\n      grid: {\n        show: showGrid,\n        left: '3%',\n        right: '4%',\n        bottom: '10%',\n        containLabel: true\n      },\n      xAxis: {\n        type: 'category',\n        data: xAxisData,\n        axisTick: {\n          alignWithLabel: true\n        },\n        axisLabel: { rotate: Number(this.getProperty('axis_label_rotate')) || 0 }\n      },\n      yAxis: {\n        type: 'value',\n        splitLine: { show: this.showGridlines() },\n        axisLabel: { formatter: (value: any) => this.axisValueFormatter()(value) }\n      },\n      series: seriesData\n    });\n    if (this.chartInstance) {\n      // notMerge: the whole option is rebuilt on every update, and ECharts'\n      // default merge kept the previous categories on the axis — a chart\n      // switched from its placeholder data to the query's went on showing\n      // Jan..Jun under the real values. The [options] input merges the same\n      // way, which is why the binding alone was not enough.\n      this.chartInstance.setOption(this.chartOptions, true);\n    }\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      ...this.chartSourceSchema(),\n      ...this.chartMappingSchema(),\n      ...this.chartAppearanceSchema({\n        label_positions: [\n          { value: 'top', label: 'Above point' },\n          { value: 'bottom', label: 'Below point' }\n        ],\n        label_contents: [\n          { value: 'value', label: 'Value' },\n          { value: 'name', label: 'Category' },\n          { value: 'name_value', label: 'Category + value' }\n        ]\n      }),\n      {\n        key: 'title',\n        type: 'text',\n        label: 'Chart Title',\n        category: 'content',\n        default_value: 'Line Chart',\n        description: 'Title displayed at the top of the chart'\n      },\n      {\n        key: 'xAxisKey',\n        type: 'text',\n        label: 'X-Axis Key (legacy)',\n        category: 'content',\n        description: 'Ignored once Dimensions are configured. Kept for pages saved before dimensions/measures existed.',\n        default_value: '',\n        on_value_change: (value: string, oldValue: string) => {\n          const chartData = this.store.getQueryData(value);\n          if (!chartData) return\n          this.updateChartData(chartData);\n        }\n      },\n      {\n        key: 'yAxisKey',\n        type: 'text',\n        label: 'Y-Axis Key (legacy)',\n        category: 'content',\n        description: 'Ignored once Measures are configured. Kept for pages saved before dimensions/measures existed.',\n        default_value: '',\n        on_value_change: (value: string, oldValue: string) => {\n          const chartData = this.store.getQueryData(value);\n          if (!chartData) return\n          this.updateChartData(chartData);\n        }\n      },\n      {\n        key: 'data',\n        type: 'textarea',\n        label: 'Static Rows',\n        category: 'content',\n        default_value: '',\n        width: 'full',\n        description: 'JSON array of row objects, used with Dimensions/Measures when Value Source is Static.'\n      },\n      {\n        key: 'xAxisData',\n        type: 'text',\n        label: 'X-Axis Data',\n        category: 'content',\n        default_value: '[\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\"]',\n        description: 'JSON array of X-axis labels'\n      },\n      {\n        key: 'seriesData',\n        type: 'text',\n        label: 'Series Data',\n        category: 'content',\n        default_value: '[120, 200, 150, 80, 70, 110]',\n        description: 'JSON array of data values'\n      },\n      {\n        key: 'showGrid',\n        type: 'boolean',\n        label: 'Show Plot Border',\n        category: 'behavior',\n        default_value: true,\n        description: 'Draws the box around the plot area (ECharts grid.show). For the lines behind the marks use Show Gridlines.'\n      },\n      {\n        key: 'showTooltip',\n        type: 'boolean',\n        label: 'Show Tooltip',\n        category: 'behavior',\n        default_value: true,\n        description: 'Whether to show tooltips on hover'\n      },\n      {\n        key: 'lineColor',\n        type: 'text',\n        label: 'Line Color',\n        category: 'behavior',\n        default_value: '#5470c6',\n        description: 'Color of the line and points'\n      },\n      {\n        key: 'line_smooth',\n        type: 'boolean',\n        label: 'Smooth Line',\n        category: 'behavior',\n        default_value: true,\n        description: 'Curve the line between points instead of joining them straight'\n      },\n      {\n        key: 'areaOpacity',\n        type: 'number',\n        label: 'Area Opacity',\n        category: 'behavior',\n        default_value: 0.3,\n        min: 0,\n        max: 1,\n        step: 0.1,\n        description: 'Opacity of the filled area under the line'\n      },\n      {\n        key: 'width',\n        type: 'text',\n        label: 'Width',\n        category: 'layout',\n        default_value: '400px',\n        description: 'Width of the chart container'\n      },\n      {\n        key: 'height',\n        type: 'text',\n        label: 'Height',\n        category: 'layout',\n        default_value: '300px',\n        description: 'Height of the chart container'\n      },\n      {\n        key: 'minWidth',\n        type: 'text',\n        label: 'Min Width',\n        category: 'layout',\n        default_value: '200px',\n        description: 'Minimum width of the chart container'\n      },\n      {\n        key: 'minHeight',\n        type: 'text',\n        label: 'Min Height',\n        category: 'layout',\n        default_value: '200px',\n        description: 'Minimum height of the chart container'\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): any {\n    return {\n      title: 'Line Chart',\n      xAxisData: '[\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\"]',\n      seriesData: '[120, 200, 150, 80, 70, 110]',\n      showGrid: true,\n      showTooltip: true,\n      lineColor: '#5470c6',\n      areaOpacity: 0.3,\n      width: '400px',\n      height: '300px',\n      minWidth: '200px',\n      minHeight: '200px'\n    };\n  }\n}","import { Component, OnInit, OnDestroy, effect, untracked } from '@angular/core';\n\nimport { PropertySchema } from '../../models';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { ChartBaseComponent } from '../chart-base/chart-base.component';\nimport { ChartSelectorsComponent } from '../chart-base/chart-selectors.component';\nimport * as echarts from 'echarts/core';\nimport { BarChart } from 'echarts/charts';\nimport {\n  TitleComponent,\n  TooltipComponent,\n  GridComponent,\n  DatasetComponent,\n  TransformComponent,\n} from 'echarts/components';\nimport { LabelLayout, UniversalTransition } from 'echarts/features';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { NgxEchartsModule, provideEchartsCore } from 'ngx-echarts';\n\necharts.use([\n  TitleComponent,\n  TooltipComponent,\n  GridComponent,\n  DatasetComponent,\n  TransformComponent,\n  BarChart,\n  LabelLayout,\n  UniversalTransition,\n  CanvasRenderer,\n]);\n\n@Component({\n  selector: 'eru-bar-chart',\n  standalone: true,\n  imports: [NgxEchartsModule, ChartSelectorsComponent],\n  providers: [provideEchartsCore({ echarts })],\n  template: `\n    <div\n      class=\"chart-container\"\n      [class]=\"classes()\"\n      [style]=\"containerStyles()\"\n      eruBaseComponent>\n      @if (showChartSelectors() || drillDepth() > 0) {\n        <eru-chart-selectors\n          [dimensions]=\"chartDimensions()\"\n          [measures]=\"chartMeasures()\"\n          [selectedDimension]=\"selectedDimensionName()\"\n          [selectedMeasure]=\"selectedMeasureName()\"\n          [crumbs]=\"drillCrumbs()\"\n          (dimensionChange)=\"onDimensionSelected($event)\"\n          (measureChange)=\"onMeasureSelected($event)\"\n          (crumbClick)=\"onDrillCrumb($event)\">\n        </eru-chart-selectors>\n      }\n      <div echarts\n           [options]=\"chartOptions\"\n           [initOpts]=\"initOptions\"\n           (chartInit)=\"onChartInit($event)\"\n           class=\"chart-content\">\n      </div>\n    </div>\n  `,\n  styleUrl: './bar-chart.component.scss'\n})\nexport class BarChartComponent extends ChartBaseComponent implements OnInit, OnDestroy {\n  chartInstance!: echarts.ECharts;\n  chartOptions: echarts.EChartsCoreOption = {};\n  initOptions = {\n    renderer: 'canvas' as const,\n    useDirtyRect: false\n  };\n\n  constructor() {\n    super();\n    // Watch for property changes and update chart\n    effect(() => {\n      const component = this.component();\n      if (component) {\n        setTimeout(() => this.updateChart(), 0);\n      }\n    });\n    effect(() => {\n      const queryData = this.store.queryData();\n      untracked(() => {\n        if (!queryData) return;\n        const query = this.getProperty('query');\n        if (!query) return;\n\n        const chartData = queryData.get(query);\n        if (!chartData) return;\n\n        this.updateChartData(chartData);\n      });\n    });\n\n    // Plot a page state variable when configured to.\n    this.watchStateRows();\n    // Fetch this chart's own saved query on load, and route every query\n    // response — the chart's own and each drill level's.\n    this.watchQueryRows();\n    this.watchFunctionRows();\n    this.watchQueryResponses();\n    // Redraw when the theme changes so token colours follow it.\n    this.watchThemeChanges();\n  }\n\n\n  protected applyRows(rows: any[]): void {\n    this.updateChartData(rows);\n  }\n\n  override ngOnInit(): void {\n    super.ngOnInit();\n    this.updateChart();\n  }\n\n  override ngOnDestroy(): void {\n    if (this.chartInstance) {\n      this.chartInstance.dispose();\n    }\n    super.ngOnDestroy();\n  }\n\n  onChartInit(chart: echarts.ECharts): void {\n    this.chartInstance = chart;\n    this.bindChartDrill(chart, 'bar');\n  }\n\n  private parseJsonData(jsonString: string, fallback: any[]): any[] {\n    try {\n      return JSON.parse(jsonString);\n    } catch (error) {\n      console.warn('Failed to parse JSON data:', jsonString, error);\n      return fallback;\n    }\n  }\n\n  /** Axis and series mapped from live rows — see the note in the pie chart:\n   *  writing these back through setProperty() is a no-op at runtime. */\n  private mappedX: any[] | null = null;\n  private mappedY: any[] | null = null;\n  /** One entry per series when a Split By column fans the categories out. */\n  private mappedSeries: { name: string; data: (number | null)[] }[] | null = null;\n\n  protected updateChartData(chartData: any): void {\n    // Kept so a selector change, or an edit to any mapping property, can\n    // re-plot without re-fetching. The chart is a view over rows it holds.\n    this.lastRows = Array.isArray(chartData) ? chartData : [];\n    // Kept so a drill click can hand back the record behind the mark.\n    this.sourceRows = Array.isArray(chartData) ? chartData : [];\n    if (chartData instanceof Array) {\n      if (this.hasChartMapping()) {\n        // Grouping happens in updateChart(), against whatever rows are held at\n        // the time — so changing the dimension, the measure or the sort order\n        // re-plots without another fetch.\n        this.updateChart();\n        return;\n      }\n\n      this.mappedSeries = null;\n      let xArray: any[] = [];\n      let yArray: any[] = [];\n      chartData.forEach((item: any) => {\n        xArray.push(item[this.getProperty('xAxisKey') || '']);\n        yArray.push(item[this.getProperty('yAxisKey') || '']);\n      })\n      this.mappedX = xArray;\n      this.mappedY = yArray;\n      // Deliberately NOT written back to the component's properties. Doing so\n      // mutates the component signal that watchStateRows() reads, so the effect\n      // re-ran on its own write and spun forever — the designer froze as soon as\n      // a chart was selected. The mapping lives in the mapped* fields instead,\n      // which updateChart() reads directly; the stored properties stay as the\n      // authored fallback.\n      this.updateChart()\n    }\n  }\n\n  /**\n   * The rows to group: whatever a query or page state last delivered, falling\n   * back to the authored static rows so the designer previews a chart with\n   * dimensions the same way it will draw at runtime.\n   */\n  private mappingRows(): any[] {\n    if (this.lastRows.length > 0) return this.lastRows;\n    // A live source is configured, or a drill has narrowed to nothing — either\n    // way the authored static rows are not a stand-in.\n    if (this.hasLiveSource() || this.drillDepth() > 0) return [];\n    return this.staticRows();\n  }\n\n  protected override staticRows(): any[] {\n    const rows = this.parseJsonData(this.getProperty('data') || '[]', []);\n    return Array.isArray(rows) ? rows : [];\n  }\n\n  private updateChart(): void {\n    // Re-group on every update rather than caching the mapping: an author\n    // editing the dimension, the aggregation or the sort in the panel has to\n    // see the chart follow, and the rows are already in hand.\n    const mappingRows = this.hasChartMapping() ? this.mappingRows() : [];\n    if (mappingRows.length > 0) {\n      const dataset = this.buildDataset(mappingRows);\n      this.mappedX = dataset.categories;\n      this.mappedSeries = dataset.series.map(series => ({ name: series.name, data: series.data }));\n      this.mappedY = dataset.series[0]?.data ?? [];\n    }\n    const title = this.getProperty('title') || 'Bar Chart';\n    // See the note on the pie: the Jan..Jun placeholder is for an unconfigured\n    // chart, not a stand-in for rows still in flight.\n    const live = this.hasLiveSource();\n    const xAxisData = this.mappedX ?? (live ? [] : this.parseJsonData(this.getProperty('xAxisData') || '[\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\"]', []));\n    const seriesData = this.mappedY ?? (live ? [] : this.parseJsonData(this.getProperty('seriesData') || '[120, 200, 150, 80, 70, 110]', []));\n    const showGrid = this.getProperty('showGrid') !== false;\n    const showTooltip = this.getProperty('showTooltip') !== false;\n    const barColor = this.getProperty('barColor') || '#5470c6';\n    const stacked = this.getProperty('stack_series') === true;\n\n    // A Split By column produces one bar series per split value; ECharts picks\n    // the colours from its palette then, because a single configured barColor\n    // would paint every series the same and the legend would be useless.\n    const label = this.dataLabelOption(false, 'top');\n    const series = (this.mappedSeries && this.mappedSeries.length > 1)\n      ? this.mappedSeries.map(s => ({\n          name: s.name,\n          type: 'bar',\n          stack: stacked ? 'total' : undefined,\n          data: s.data,\n          label,\n          itemStyle: { borderRadius: stacked ? 0 : [4, 4, 0, 0] }\n        }))\n      : [{\n          name: this.mappedSeries?.[0]?.name || 'Data',\n          type: 'bar',\n          // Per-category colours only make sense on a single series — with a\n          // Split By the colour already carries the series, and overriding it by\n          // category would make the legend a lie.\n          data: this.hasValueColors()\n            ? this.withValueColors((xAxisData as any[]).map((name, i) => ({ name, value: seriesData[i] })))\n            : seriesData,\n          label,\n          itemStyle: {\n            color: barColor,\n            borderRadius: [4, 4, 0, 0]\n          }\n        }];\n\n    const palette = this.paletteOption();\n    const multi = (this.mappedSeries?.length ?? 0) > 1;\n    const horizontal = this.getProperty('bar_orientation') === 'horizontal';\n    const categoryAxis = {\n      type: 'category',\n      data: xAxisData,\n      axisTick: { alignWithLabel: true },\n      axisLabel: { rotate: Number(this.getProperty('axis_label_rotate')) || 0 }\n    };\n    const valueAxis = {\n      type: 'value',\n      splitLine: { show: this.showGridlines() },\n      axisLabel: { formatter: (value: any) => this.axisValueFormatter()(value) }\n    };\n\n    this.chartOptions = this.withExtraOptions({\n      title: this.titleOption(title),\n      ...(palette ? { color: palette } : {}),\n      tooltip: {\n        show: showTooltip,\n        trigger: 'axis',\n        valueFormatter: (value: any) => this.measureFormatter()(value)\n      },\n      grid: {\n        show: showGrid,\n        left: '3%',\n        right: '4%',\n        bottom: '3%',\n        containLabel: true\n      },\n      // Horizontal simply swaps which axis carries the categories — ECharts draws\n      // the bars along whichever axis is the value one.\n      xAxis: horizontal ? valueAxis : categoryAxis,\n      yAxis: horizontal ? categoryAxis : valueAxis,\n      // A legend naming one series called 'Data' tells the reader nothing, so it\n      // only appears by default once a Split By produces several.\n      legend: this.legendOption(multi ? 'bottom' : 'none'),\n      series\n    });\n    if (this.chartInstance) {\n      // notMerge: the whole option is rebuilt on every update, and ECharts'\n      // default merge kept the previous categories on the axis — a chart\n      // switched from its placeholder data to the query's went on showing\n      // Jan..Jun under the real values. The [options] input merges the same\n      // way, which is why the binding alone was not enough.\n      this.chartInstance.setOption(this.chartOptions, true);\n    }\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      ...this.chartSourceSchema(),\n      ...this.chartMappingSchema(),\n      ...this.chartAppearanceSchema({\n        label_positions: [\n          { value: 'top', label: 'Outside end' },\n          { value: 'inside', label: 'Inside bar' }\n        ],\n        label_contents: [\n          { value: 'value', label: 'Value' },\n          { value: 'name', label: 'Category' },\n          { value: 'name_value', label: 'Category + value' }\n        ]\n      }),\n      {\n        key: 'title',\n        type: 'text',\n        label: 'Chart Title',\n        category: 'content',\n        default_value: 'Bar Chart',\n        description: 'Title displayed at the top of the chart'\n      },\n      {\n        key: 'xAxisKey',\n        type: 'text',\n        label: 'X-Axis Key (legacy)',\n        category: 'content',\n        description: 'Ignored once Dimensions are configured. Kept for pages saved before dimensions/measures existed.',\n        default_value: '',\n        on_value_change: (value: string, oldValue: string) => {\n          const chartData = this.store.getQueryData(value);\n          if (!chartData) return\n          this.updateChartData(chartData);\n        }\n      },\n      {\n        key: 'yAxisKey',\n        type: 'text',\n        label: 'Y-Axis Key (legacy)',\n        category: 'content',\n        description: 'Ignored once Measures are configured. Kept for pages saved before dimensions/measures existed.',\n        default_value: '',\n        on_value_change: (value: string, oldValue: string) => {\n          const chartData = this.store.getQueryData(value);\n          if (!chartData) return\n          this.updateChartData(chartData);\n        }\n      },\n      {\n        key: 'data',\n        type: 'textarea',\n        label: 'Static Rows',\n        category: 'content',\n        default_value: '',\n        width: 'full',\n        description: 'JSON array of row objects, used with Dimensions/Measures when Value Source is Static.'\n      },\n      {\n        key: 'xAxisData',\n        type: 'text',\n        label: 'X-Axis Data',\n        category: 'content',\n        default_value: '[\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\"]',\n        description: 'JSON array of X-axis labels'\n      },\n      {\n        key: 'seriesData',\n        type: 'text',\n        label: 'Series Data',\n        category: 'content',\n        default_value: '[120, 200, 150, 80, 70, 110]',\n        description: 'JSON array of data values'\n      },\n      {\n        key: 'showGrid',\n        type: 'boolean',\n        label: 'Show Plot Border',\n        category: 'behavior',\n        default_value: true,\n        description: 'Draws the box around the plot area (ECharts grid.show). For the lines behind the marks use Show Gridlines.'\n      },\n      {\n        key: 'showTooltip',\n        type: 'boolean',\n        label: 'Show Tooltip',\n        category: 'behavior',\n        default_value: true,\n        description: 'Whether to show tooltips on hover'\n      },\n      {\n        key: 'bar_orientation',\n        type: 'select',\n        label: 'Orientation',\n        category: 'behavior',\n        default_value: 'vertical',\n        options: [\n          { value: 'vertical', label: 'Vertical (columns)' },\n          { value: 'horizontal', label: 'Horizontal (bars)' }\n        ],\n        description: 'Horizontal reads better when category names are long'\n      },\n      {\n        key: 'stack_series',\n        type: 'boolean',\n        label: 'Stack Series',\n        category: 'behavior',\n        default_value: false,\n        description: 'Stack the Split By series on top of each other instead of side by side'\n      },\n      {\n        key: 'barColor',\n        type: 'text',\n        label: 'Bar Color',\n        category: 'behavior',\n        default_value: '#5470c6',\n        description: 'Color of the bars'\n      },\n      {\n        key: 'width',\n        type: 'text',\n        label: 'Width',\n        category: 'layout',\n        default_value: '400px',\n        description: 'Width of the chart container'\n      },\n      {\n        key: 'height',\n        type: 'text',\n        label: 'Height',\n        category: 'layout',\n        default_value: '300px',\n        description: 'Height of the chart container'\n      },\n      {\n        key: 'minWidth',\n        type: 'text',\n        label: 'Min Width',\n        category: 'layout',\n        default_value: '200px',\n        description: 'Minimum width of the chart container'\n      },\n      {\n        key: 'minHeight',\n        type: 'text',\n        label: 'Min Height',\n        category: 'layout',\n        default_value: '200px',\n        description: 'Minimum height of the chart container'\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): any {\n    return {\n      title: 'Bar Chart',\n      xAxisData: '[\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\"]',\n      seriesData: '[120, 200, 150, 80, 70, 110]',\n      showGrid: true,\n      showTooltip: true,\n      barColor: '#5470c6',\n      width: '400px',\n      height: '300px',\n      minWidth: '200px',\n      minHeight: '200px'\n    };\n  }\n}","import { Component, OnInit, OnDestroy, effect, untracked } from '@angular/core';\n\nimport { PropertySchema } from '../../models';\nimport { BaseComponent, StyleSchema } from '../base-component';\nimport { ChartBaseComponent } from '../chart-base/chart-base.component';\nimport { ChartSelectorsComponent } from '../chart-base/chart-selectors.component';\nimport * as echarts from 'echarts/core';\nimport { PieChart } from 'echarts/charts';\nimport {\n  TitleComponent,\n  TooltipComponent,\n  LegendComponent,\n  DatasetComponent,\n  TransformComponent,\n} from 'echarts/components';\nimport { LabelLayout, UniversalTransition } from 'echarts/features';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { NgxEchartsModule, provideEchartsCore } from 'ngx-echarts';\n\necharts.use([\n  TitleComponent,\n  TooltipComponent,\n  LegendComponent,\n  DatasetComponent,\n  TransformComponent,\n  PieChart,\n  LabelLayout,\n  UniversalTransition,\n  CanvasRenderer,\n]);\n\n@Component({\n  selector: 'eru-pie-chart',\n  standalone: true,\n  imports: [NgxEchartsModule, ChartSelectorsComponent],\n  providers: [provideEchartsCore({ echarts })],\n  template: `\n    <div\n      class=\"chart-container\"\n      [class]=\"classes()\"\n      [style]=\"containerStyles()\"\n      eruBaseComponent>\n      @if (showChartSelectors() || drillDepth() > 0) {\n        <eru-chart-selectors\n          [dimensions]=\"chartDimensions()\"\n          [measures]=\"chartMeasures()\"\n          [selectedDimension]=\"selectedDimensionName()\"\n          [selectedMeasure]=\"selectedMeasureName()\"\n          [crumbs]=\"drillCrumbs()\"\n          (dimensionChange)=\"onDimensionSelected($event)\"\n          (measureChange)=\"onMeasureSelected($event)\"\n          (crumbClick)=\"onDrillCrumb($event)\">\n        </eru-chart-selectors>\n      }\n      <div echarts\n           [options]=\"chartOptions\"\n           [initOpts]=\"initOptions\"\n           (chartInit)=\"onChartInit($event)\"\n           class=\"chart-content\">\n      </div>\n    </div>\n  `,\n  styleUrl: './pie-chart.component.scss'\n})\nexport class PieChartComponent extends ChartBaseComponent implements OnInit, OnDestroy {\n  chartInstance!: echarts.ECharts;\n  chartOptions: echarts.EChartsCoreOption = {};\n  initOptions = {\n    renderer: 'canvas' as const,\n    useDirtyRect: false\n  };\n\n  constructor() {\n    super();\n\n    // Watch for property changes and update chart\n    effect(() => {\n      const component = this.component();\n      if (component) {\n        setTimeout(() => this.updateChart(), 0);\n      }\n    });\n    effect(() => {\n      const queryData = this.store.queryData();\n      untracked(() => {\n        if (!queryData) return;\n        const query = this.getProperty('query');\n        if (!query) return;\n\n        const chartData = queryData.get(query);\n        if (!chartData) return;\n\n        this.updateChartData(chartData);\n      });\n    });\n\n    // Plot a page state variable when configured to.\n    this.watchStateRows();\n    // Fetch this chart's own saved query on load, and route every query\n    // response — the chart's own and each drill level's.\n    this.watchQueryRows();\n    this.watchFunctionRows();\n    this.watchQueryResponses();\n    // Redraw when the theme changes so token colours follow it.\n    this.watchThemeChanges();\n  }\n\n\n  protected applyRows(rows: any[]): void {\n    this.updateChartData(rows);\n  }\n\n  override ngOnInit(): void {\n    super.ngOnInit();\n    this.updateChart();\n  }\n\n  override ngOnDestroy(): void {\n    if (this.chartInstance) {\n      this.chartInstance.dispose();\n    }\n    super.ngOnDestroy();\n  }\n\n  onChartInit(chart: echarts.ECharts): void {\n    this.chartInstance = chart;\n    this.bindChartDrill(chart, 'pie');\n  }\n\n  private parseJsonData(jsonString: string, fallback: any[]): any[] {\n    try {\n      return JSON.parse(jsonString);\n    } catch (error) {\n      console.warn('Failed to parse JSON data:', jsonString, error);\n      return fallback;\n    }\n  }\n\n  /**\n   * Slices mapped from live rows.\n   *\n   * Held here rather than written back through `setProperty('data', …)`: that\n   * write goes to the component's stored properties, which is a no-op at\n   * runtime, so `updateChart()` read the untouched default straight back and\n   * every chart plotted its placeholder data instead of the query's.\n   */\n  private mappedSlices: any[] | null = null;\n\n  protected updateChartData(chartData: any): void {\n    // Kept so a selector change can re-plot without re-fetching.\n    this.lastRows = Array.isArray(chartData) ? chartData : [];\n    // Kept so a drill click can hand back the record behind the mark.\n    this.sourceRows = Array.isArray(chartData) ? chartData : [];\n    if (chartData instanceof Array) {\n      if (this.hasChartMapping()) {\n        // Grouping happens in updateChart(), against whatever rows are held at\n        // the time — so changing the dimension, the measure or the sort order\n        // re-plots without another fetch.\n        this.updateChart();\n        return;\n      }\n\n      const nameKey = this.getProperty('nameKey') || '';\n      const valueKey = this.getProperty('valueKey') || '';\n\n      this.mappedSlices = chartData.map((item: any) => ({\n        name: item[nameKey],\n        value: item[valueKey]\n      }));\n      // Deliberately NOT written back to the component's properties. Doing so\n      // mutates the component signal that watchStateRows() reads, so the effect\n      // re-ran on its own write and spun forever — the designer froze as soon as\n      // a chart was selected. The mapping lives in the mapped* fields instead,\n      // which updateChart() reads directly; the stored properties stay as the\n      // authored fallback.\n      this.updateChart();\n    }\n  }\n\n  /**\n   * Rows either already carry `name`/`value` (what updateChartData writes back,\n   * and the designer default) or are raw result rows with `nameKey`/`valueKey`\n   * naming the columns to plot — the shape a page-generating agent emits in the\n   * static `data` property. Map the latter here, so static data does not have to\n   * come through updateChartData() to be plottable.\n   */\n  private toSeriesData(rows: any[]): any[] {\n    // A statically configured pie never passes through updateChartData(), so\n    // record its rows here too or its slices would drill with no record. Live\n    // rows win — they are already recorded and carry every column.\n    if (this.sourceRows.length === 0 && Array.isArray(rows) && rows.length > 0) {\n      this.sourceRows = rows;\n    }\n    const nameKey = this.getProperty('nameKey') || '';\n    const valueKey = this.getProperty('valueKey') || '';\n    if (!nameKey && !valueKey) return rows;\n    return rows.map((row: any) => {\n      if (!row || typeof row !== 'object') return row;\n      if ('name' in row && 'value' in row) return row;\n      return {\n        name: nameKey ? row[nameKey] : row['name'],\n        value: valueKey ? row[valueKey] : row['value']\n      };\n    });\n  }\n\n  /**\n   * The rows to group: whatever a query or page state last delivered, falling\n   * back to the authored static rows so the designer previews a chart with\n   * dimensions the same way it will draw at runtime.\n   */\n  private mappingRows(): any[] {\n    if (this.lastRows.length > 0) return this.lastRows;\n    // A live source is configured, or a drill has narrowed to nothing — either\n    // way the authored static rows are not a stand-in.\n    if (this.hasLiveSource() || this.drillDepth() > 0) return [];\n    return this.staticRows();\n  }\n\n  protected override staticRows(): any[] {\n    const rows = this.parseJsonData(this.getProperty('data') || '[]', []);\n    return Array.isArray(rows) ? rows : [];\n  }\n\n  /**\n   * Where the pie sits. ECharts centres it regardless of the legend, so a\n   * vertical legend overlaps the slice labels on that side; nudging the centre\n   * the other way is what buys the gap the reader expects.\n   */\n  private pieCenter(): [string, string] {\n    const gap = this.legendGap();\n    const shift = Math.min(18, 8 + gap / 2);\n    switch (this.legendSide('left')) {\n      case 'left': return [`${50 + shift}%`, '52%'];\n      case 'right': return [`${50 - shift}%`, '52%'];\n      case 'top': return ['50%', `${50 + shift / 2}%`];\n      case 'bottom': return ['50%', `${50 - shift / 2}%`];\n      default: return ['50%', '52%'];\n    }\n  }\n\n  private updateChart(): void {\n    // Re-group on every update rather than caching the mapping — see the note\n    // on the bar chart's updateChart().\n    const mappingRows = this.hasChartMapping() ? this.mappingRows() : [];\n    if (mappingRows.length > 0) {\n      const dataset = this.buildDataset(mappingRows);\n      this.mappedSlices = dataset.categories.map((category, i) => ({\n        name: category,\n        value: dataset.series[0]?.data[i] ?? 0\n      }));\n    }\n    const title = this.getProperty('title') || 'Pie Chart';\n    // The authored placeholder is for an unconfigured chart only. With a query\n    // or state key set, an empty ring is the honest picture while the rows load\n    // — the placeholder read as real data that nothing could account for.\n    const pieData = this.mappedSlices ?? (this.hasLiveSource()\n      ? []\n      : this.toSeriesData(this.parseJsonData(this.getProperty('data') || '[{\"name\": \"AA\", \"value\": 335}, {\"name\": \"BB\", \"value\": 310}, {\"name\": \"C\", \"value\": 234}, {\"name\": \"D\", \"value\": 135}]', [])));\n    const showTooltip = this.getProperty('showTooltip') !== false;\n    const radius = this.getProperty('radius') || '50%';\n\n    // A configured inner radius turns the pie into a donut, which is the most\n    // asked-for variation and not worth a separate component.\n    const innerRadius = String(this.getProperty('inner_radius') || '').trim();\n    const palette = this.paletteOption();\n\n    this.chartOptions = this.withExtraOptions({\n      title: this.titleOption(title),\n      ...(palette ? { color: palette } : {}),\n      tooltip: {\n        show: showTooltip,\n        trigger: 'item',\n        // Function rather than '{c}': the token prints the raw number, and the\n        // point of a mapped format is that it reads as ₹ 1.29 Cr.\n        formatter: (p: any) => `${p?.name ?? ''}: ${this.measureFormatter()(p?.value)} (${p?.percent ?? ''}%)`\n      },\n      // `showLegend: false` on an older page still hides it — see legendOption().\n      legend: this.getProperty('showLegend') === false ? { show: false } : this.legendOption('left'),\n      series: [{\n        name: 'Data',\n        type: 'pie',\n        radius: innerRadius ? [innerRadius, radius] : radius,\n        // Shift away from the legend so slice labels stop colliding with it.\n        center: this.pieCenter(),\n        label: this.dataLabelOption(true, 'outside'),\n        data: this.withValueColors(pieData),\n        emphasis: {\n          itemStyle: {\n            shadowBlur: 10,\n            shadowOffsetX: 0,\n            shadowColor: 'rgba(0, 0, 0, 0.5)'\n          }\n        }\n      }]\n    });\n    if (this.chartInstance) {\n      // notMerge: these components rebuild the whole option on every update, and\n      // ECharts' default merge kept the previous categories on the axis — a chart\n      // switched from its placeholder data to the query's went on showing\n      // Jan..Jun under the real values.\n      this.chartInstance.setOption(this.chartOptions, true);\n    }\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      ...this.chartSourceSchema(),\n      ...this.chartMappingSchema(false),\n      // A pie labels its slices by default, and its legend has always sat left.\n      ...this.chartAppearanceSchema({\n        include_axes: false,\n        label_positions: [\n          { value: 'outside', label: 'Outside slice' },\n          { value: 'inside', label: 'Inside slice' },\n          { value: 'center', label: 'Centre (donut)' }\n        ],\n        label_contents: [\n          { value: 'name', label: 'Category' },\n          { value: 'value', label: 'Value' },\n          { value: 'percent', label: 'Percent' },\n          { value: 'name_value', label: 'Category + value' },\n          { value: 'name_percent', label: 'Category + percent' },\n          { value: 'value_percent', label: 'Value + percent' }\n        ]\n      }),\n      {\n        key: 'title',\n        type: 'text',\n        label: 'Chart Title',\n        category: 'content',\n        default_value: 'Pie Chart',\n        description: 'Title displayed at the top of the chart'\n      },\n      {\n        key: 'nameKey',\n        type: 'text',\n        label: 'Name Key (legacy)',\n        category: 'content',\n        description: 'Ignored once Dimensions are configured. Kept for pages saved before dimensions/measures existed.',\n        default_value: 'name',\n        on_value_change: (value: string, oldValue: string) => {\n          const chartData = this.store.getQueryData(value);\n          if (!chartData) return\n          this.updateChartData(chartData);\n        }\n      },\n      {\n        key: 'valueKey',\n        type: 'text',\n        label: 'Value Key (legacy)',\n        category: 'content',\n        description: 'Ignored once Measures are configured. Kept for pages saved before dimensions/measures existed.',\n        default_value: 'value',\n        on_value_change: (value: string, oldValue: string) => {\n          const chartData = this.store.getQueryData(value);\n          if (!chartData) return\n          this.updateChartData(chartData);\n        }\n      },\n      {\n        key: 'data',\n        type: 'text',\n        label: 'Pie Data',\n        category: 'content',\n        default_value: '[{\"name\": \"A1\", \"value\": 335}, {\"name\": \"B\", \"value\": 310}, {\"name\": \"C\", \"value\": 234}, {\"name\": \"D\", \"value\": 135}]',\n        description: 'JSON array of pie chart data with name and value properties'\n      },\n      {\n        key: 'showTooltip',\n        type: 'boolean',\n        label: 'Show Tooltip',\n        category: 'behavior',\n        default_value: true,\n        description: 'Whether to show tooltips on hover'\n      },\n      {\n        key: 'inner_radius',\n        type: 'text',\n        label: 'Inner Radius (donut)',\n        category: 'layout',\n        default_value: '',\n        description: 'Set e.g. 40% to draw a donut instead of a full pie. Empty draws a pie.'\n      },\n      {\n        key: 'radius',\n        type: 'text',\n        label: 'Radius',\n        category: 'layout',\n        default_value: '50%',\n        description: 'Radius of the pie chart (percentage or pixel value)'\n      },\n      {\n        key: 'width',\n        type: 'text',\n        label: 'Width',\n        category: 'layout',\n        default_value: '400px',\n        description: 'Width of the chart container'\n      },\n      {\n        key: 'height',\n        type: 'text',\n        label: 'Height',\n        category: 'layout',\n        default_value: '300px',\n        description: 'Height of the chart container'\n      },\n      {\n        key: 'minWidth',\n        type: 'text',\n        label: 'Min Width',\n        category: 'layout',\n        default_value: '200px',\n        description: 'Minimum width of the chart container'\n      },\n      {\n        key: 'minHeight',\n        type: 'text',\n        label: 'Min Height',\n        category: 'layout',\n        default_value: '200px',\n        description: 'Minimum height of the chart container'\n      }\n    ];\n  }\n}","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  inject,\n  signal,\n  computed,\n  effect\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { BaseComponent } from '../base-component/base-component';\nimport { EruStudioStore } from '../../services/eru-studio.store';\nimport { ComponentSchemaService } from '../../services/component-schema.service';\nimport { FormValidationService } from '../../services/form-validation.service';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\nimport { EruPage, MasterDetailConfig } from '../../models';\n\n@Component({\n  selector: 'eru-page',\n  standalone: true,\n  providers: [EruStudioStore, ComponentSchemaService, FormValidationService, LogicEvaluatorService],\n  imports: [\n    CommonModule,\n    MatButtonModule,\n    MatIconModule,\n    MatFormFieldModule,\n    MatSelectModule,\n    MatDialogModule,\n    MatSidenavModule,\n    MatToolbarModule,\n    MatDividerModule,\n    MatProgressSpinnerModule,\n    MatTooltipModule\n  ],\n  templateUrl: './eru-page.component.html',\n  styleUrl: './eru-page.component.scss'\n})\nexport class EruPageComponent extends BaseComponent implements OnInit, OnDestroy {\n  @Input() targetPageId?: string;\n  @Input() displayMode: 'popup' | 'side_panel' | 'inline' = 'popup';\n  @Input() buttonText?: string;\n  @Input() buttonIcon?: string;\n  @Input() masterDetailConfig?: MasterDetailConfig;\n  @Input() dataContext?: Record<string, any>;\n  @Input() autoOpen?: boolean;\n\n  @Output() pageOpened = new EventEmitter<{ pageId: string; data: any }>();\n  @Output() pageClosed = new EventEmitter<string>();\n  @Output() dataChanged = new EventEmitter<{ pageId: string; data: any }>();\n\n  protected override store = inject(EruStudioStore);\n\n  // Component state\n  readonly isPageOpen = signal(false);\n  readonly availablePages = signal<EruPage[]>([]);\n  readonly selectedPageId = signal<string>('');\n  readonly isLoading = signal(false);\n\n  // Computed properties\n  readonly buttonDisplayText = computed(() => {\n    return this.buttonText || this.getButtonText();\n  });\n\n  readonly buttonDisplayIcon = computed(() => {\n    return this.buttonIcon || this.getButtonIcon();\n  });\n\n  readonly isDisabled = computed(() => {\n    return !this.selectedPageId() || this.isPageOpen();\n  });\n\n  readonly canOpenPage = computed(() => {\n    return this.selectedPageId() && !this.isPageOpen();\n  });\n\n  readonly currentPageTitle = computed(() => {\n    return this.getPageTitle(this.selectedPageId());\n  });\n\n\n  constructor() {\n    super();\n  }\n\n  override ngOnInit() {\n    // Load available pages once\n    this.loadAvailablePages();\n\n    // Set initial page selection\n    if (this.targetPageId) {\n      this.selectedPageId.set(this.targetPageId);\n    }\n\n    // Auto-open if configured\n    if (this.autoOpen && this.selectedPageId()) {\n      setTimeout(() => this.openPage(), 100);\n    }\n  }\n\n  override ngOnDestroy() {\n    // Cleanup if needed\n  }\n\n  /**\n   * Load available pages from the store\n   */\n  private loadAvailablePages(): void {\n    const currentPage = this.store.currentPage();\n    if (currentPage) {\n      this.availablePages.set([currentPage]);\n    }\n  }\n\n  /**\n   * Open the selected page\n   */\n  openPage(): void {\n    const pageId = this.selectedPageId();\n    if (!pageId || this.isPageOpen()) {\n      return;\n    }\n\n    this.isPageOpen.set(true);\n    this.pageOpened.emit({ pageId, data: this.dataContext });\n  }\n\n  /**\n   * Close the page\n   */\n  closePage(): void {\n    const pageId = this.selectedPageId();\n    if (pageId) {\n      this.isPageOpen.set(false);\n      this.pageClosed.emit(pageId);\n    }\n  }\n\n  /**\n   * Handle page selection change\n   */\n  onPageSelectionChange(pageId: string): void {\n    this.selectedPageId.set(pageId);\n  }\n\n  /**\n   * Handle display mode change\n   */\n  onDisplayModeChange(mode: 'popup' | 'side_panel' | 'inline'): void {\n    this.displayMode = mode;\n  }\n\n  /**\n   * Get button text based on context\n   */\n  private getButtonText(): string {\n    if (this.masterDetailConfig) {\n      return 'View Details';\n    }\n    return 'Open Page';\n  }\n\n  /**\n   * Get button icon based on context\n   */\n  private getButtonIcon(): string {\n    switch (this.displayMode) {\n      case 'popup':\n        return 'open_in_new';\n      case 'side_panel':\n        return 'open_in_full';\n      case 'inline':\n        return 'expand_more';\n      default:\n        return 'launch';\n    }\n  }\n\n  /**\n   * Get page title by ID\n   */\n  getPageTitle(pageId: string): string {\n    const page = this.availablePages().find(p => p.id === pageId);\n    return page?.name || 'Page';\n  }\n\n  /**\n   * Get default width based on display mode\n   */\n  private getDefaultWidth(): string {\n    switch (this.displayMode) {\n      case 'popup':\n        return '800px';\n      case 'side_panel':\n        return '400px';\n      case 'inline':\n        return '100%';\n      default:\n        return '800px';\n    }\n  }\n\n  /**\n   * Get default height based on display mode\n   */\n  private getDefaultHeight(): string {\n    switch (this.displayMode) {\n      case 'popup':\n        return '600px';\n      case 'side_panel':\n        return '100vh';\n      case 'inline':\n        return '400px';\n      default:\n        return '600px';\n    }\n  }\n\n  readonly displayModes: Array<{ value: string; label: string; icon: string }> = [\n    { value: 'popup', label: 'Popup', icon: 'open_in_new' },\n    { value: 'side_panel', label: 'Side Panel', icon: 'open_in_full' },\n    { value: 'inline', label: 'Inline', icon: 'expand_more' }\n  ];\n\n  /**\n   * Get data context keys for template\n   */\n  getDataContextKeys(): string[] {\n    return this.dataContext ? Object.keys(this.dataContext) : [];\n  }\n}\n","<div\n  class=\"eru-page-wrapper\"\n  [class]=\"classes()\"\n  [ngStyle]=\"combinedStyles()\"\n  >\n  <!-- Page Selection and Configuration -->\n  @if (!targetPageId) {\n    <div class=\"page-configuration\">\n      <mat-form-field appearance=\"outline\" class=\"page-select-field\">\n        <mat-label>Select Page</mat-label>\n        <mat-select\n          [value]=\"selectedPageId()\"\n          (selectionChange)=\"onPageSelectionChange($event.value)\"\n          [disabled]=\"isPageOpen()\"\n          >\n          @for (page of availablePages(); track page.id) {\n            <mat-option\n              [value]=\"page.id\"\n              >\n              {{ page.name }}\n            </mat-option>\n          }\n        </mat-select>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\" class=\"display-mode-field\">\n        <mat-label>Display Mode</mat-label>\n        <mat-select\n          [value]=\"displayMode\"\n          (selectionChange)=\"onDisplayModeChange($event.value)\"\n          [disabled]=\"isPageOpen()\"\n          >\n          @for (mode of displayModes; track mode.value) {\n            <mat-option\n              [value]=\"mode.value\"\n              >\n              <mat-icon>{{ mode.icon }}</mat-icon>\n              {{ mode.label }}\n            </mat-option>\n          }\n        </mat-select>\n      </mat-form-field>\n    </div>\n  }\n\n  <!-- Action Button -->\n  <div class=\"page-actions\">\n    <button\n      mat-raised-button\n      [color]=\"isPageOpen() ? 'warn' : 'primary'\"\n      [disabled]=\"isDisabled()\"\n      (click)=\"isPageOpen() ? closePage() : openPage()\"\n      class=\"page-action-button\"\n      [matTooltip]=\"isPageOpen() ? 'Close the open page' : 'Open the selected page'\"\n      >\n      <mat-icon>{{ buttonDisplayIcon() }}</mat-icon>\n      {{ isPageOpen() ? 'Close Page' : buttonDisplayText() }}\n    </button>\n\n    <!-- Master-Detail Configuration (if applicable) -->\n    @if (masterDetailConfig) {\n      <div class=\"master-detail-info\">\n        <mat-icon class=\"info-icon\">info</mat-icon>\n        <span class=\"info-text\">\n          Master-Detail: {{ masterDetailConfig.relationship_type }}\n        </span>\n      </div>\n    }\n  </div>\n\n  <!-- Page Status Indicator -->\n  @if (isPageOpen()) {\n    <div class=\"page-status\">\n      <mat-icon class=\"status-icon\">check_circle</mat-icon>\n      <span class=\"eru-status-text\">Page is open</span>\n    </div>\n  }\n\n  <!-- Data Context Display (if provided) -->\n  @if (dataContext && getDataContextKeys().length > 0) {\n    <div class=\"data-context\">\n      <h4>Data Context:</h4>\n      <pre class=\"context-data\">{{ dataContext | json }}</pre>\n    </div>\n  }\n\n  <!-- Page Content Display -->\n  @if (isPageOpen()) {\n    <div class=\"page-content\">\n      @switch (displayMode) {\n        <!-- Popup Mode -->\n        @case ('popup') {\n          <div class=\"popup-container\">\n            <div class=\"popup-content\">\n              <div class=\"popup-header\">\n                <h3>{{ currentPageTitle() }}</h3>\n                <button mat-icon-button (click)=\"closePage()\">\n                  <mat-icon>close</mat-icon>\n                </button>\n              </div>\n              <mat-divider></mat-divider>\n              <div class=\"popup-body\">\n                @if (isLoading()) {\n                  <div class=\"loading-container\">\n                    <mat-spinner diameter=\"40\"></mat-spinner>\n                    <p>Loading page...</p>\n                  </div>\n                }\n                @if (!isLoading()) {\n                  <div class=\"page-data\">\n                    <p>Page: {{ currentPageTitle() }}</p>\n                    @if (dataContext) {\n                      <p>Data: {{ dataContext | json }}</p>\n                    }\n                  </div>\n                }\n              </div>\n            </div>\n          </div>\n        }\n        <!-- Side Panel Mode -->\n        @case ('side_panel') {\n          <div class=\"side-panel-container\">\n            <div class=\"side-panel-content\">\n              <div class=\"side-panel-header\">\n                <h3>{{ currentPageTitle() }}</h3>\n                <button mat-icon-button (click)=\"closePage()\">\n                  <mat-icon>close</mat-icon>\n                </button>\n              </div>\n              <mat-divider></mat-divider>\n              <div class=\"side-panel-body\">\n                @if (isLoading()) {\n                  <div class=\"loading-container\">\n                    <mat-spinner diameter=\"40\"></mat-spinner>\n                    <p>Loading page...</p>\n                  </div>\n                }\n                @if (!isLoading()) {\n                  <div class=\"page-data\">\n                    <p>Page: {{ currentPageTitle() }}</p>\n                    @if (dataContext) {\n                      <p>Data: {{ dataContext | json }}</p>\n                    }\n                  </div>\n                }\n              </div>\n            </div>\n          </div>\n        }\n        <!-- Inline Mode -->\n        @case ('inline') {\n          <div class=\"inline-container\">\n            <div class=\"inline-content\">\n              <div class=\"inline-header\">\n                <h3>{{ currentPageTitle() }}</h3>\n                <button mat-icon-button (click)=\"closePage()\">\n                  <mat-icon>close</mat-icon>\n                </button>\n              </div>\n              <mat-divider></mat-divider>\n              <div class=\"inline-body\">\n                @if (isLoading()) {\n                  <div class=\"loading-container\">\n                    <mat-spinner diameter=\"40\"></mat-spinner>\n                    <p>Loading page...</p>\n                  </div>\n                }\n                @if (!isLoading()) {\n                  <div class=\"page-data\">\n                    <p>Page: {{ currentPageTitle() }}</p>\n                    @if (dataContext) {\n                      <p>Data: {{ dataContext | json }}</p>\n                    }\n                  </div>\n                }\n              </div>\n            </div>\n          </div>\n        }\n      }\n    </div>\n  }\n</div>\n","import { AfterViewInit, Component, ElementRef, EnvironmentInjector, Signal, ViewChild, inject } from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { EruComponent } from '../../models';\nimport { ComponentRegistryService } from '../../services/component-registry.service';\n\nexport interface PagePanelData {\n  title: string;\n  displayComponents: Signal<EruComponent[]>;\n  componentsReady: Signal<boolean>;\n  dynamicComponentInjector: EnvironmentInjector;\n  /** Hand the panel body back to the host reference so the nested page's\n   *  breakpoint follows the panel's width, not the browser window's. */\n  observeWidth?: (element: HTMLElement) => void;\n  onClose: () => void;\n}\n\n@Component({\n  selector: 'eru-page-ref-panel',\n  standalone: true,\n  imports: [CommonModule, NgComponentOutlet, MatIconModule, MatButtonModule, MatProgressSpinnerModule],\n  template: `\n    <div class=\"panel-header\">\n      <span class=\"panel-title\">{{ data.title }}</span>\n      <button mat-icon-button (click)=\"data.onClose()\">\n        <mat-icon>close</mat-icon>\n      </button>\n    </div>\n    <div class=\"panel-body\" #panelBody>\n      @if (!data.componentsReady()) {\n        <div class=\"panel-loading\">\n          <mat-spinner diameter=\"36\"></mat-spinner>\n        </div>\n      } @else {\n        @for (child of data.displayComponents(); track child.id) {\n          <ng-container\n            *ngComponentOutlet=\"getComponentClass(child.type);\n                                injector: data.dynamicComponentInjector;\n                                inputs: isContainer(child.type) ? {component: child, nestingLevel: 0} : {component: child}\" />\n        }\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: flex;\n      flex-direction: column;\n      /* The CDK overlay pane is itself a flex row, so without an explicit width\n         this host shrinks to its content and leaves a transparent gap between\n         the panel and the right edge of the pane. */\n      width: 100%;\n      flex: 1 1 auto;\n      height: 100%;\n      background: #fff;\n    }\n    .panel-header {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding: 12px 16px;\n      border-bottom: 1px solid rgba(0, 0, 0, 0.12);\n      flex-shrink: 0;\n    }\n    .panel-title {\n      font-size: 16px;\n      font-weight: 500;\n    }\n    .panel-body {\n      flex: 1;\n      overflow: auto;\n      padding: 16px;\n    }\n    .panel-loading {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      height: 100%;\n    }\n  `]\n})\nexport class PageRefPanelComponent implements AfterViewInit {\n  readonly data: PagePanelData = inject(MAT_DIALOG_DATA);\n  private componentRegistry = inject(ComponentRegistryService);\n\n  @ViewChild('panelBody') private panelBody?: ElementRef<HTMLElement>;\n\n  ngAfterViewInit(): void {\n    // The body is the box the nested page really gets — narrower than the\n    // overlay pane by its padding, and unrelated to the window width the store\n    // tracks. Reported once here; the host keeps watching it for resizes.\n    const element = this.panelBody?.nativeElement;\n    if (element) this.data.observeWidth?.(element);\n  }\n\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) return definition.component;\n    return (this.componentRegistry as any)['loadedComponents']?.get(type);\n  }\n\n  isContainer(type: string): boolean {\n    return type === 'flex_container' || type === 'grid_container' || type === 'card' || type === 'attachment' || type === 'page_ref';\n  }\n}\n","import { Component, input, inject, computed, signal, effect, untracked, EnvironmentInjector, createEnvironmentInjector, OnDestroy, Input } from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { EruComponent, PropertySchema, EruComponentProperties, EruPage, ComponentEventSubscription } from '../../models';\nimport { EruStudioStore } from '../../services/eru-studio.store';\nimport { ComponentRegistryService } from '../../services/component-registry.service';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../base-component';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\nimport { PageRefPanelComponent, PagePanelData } from './page-ref-panel.component';\nimport { BreakpointScopeService } from '../../services/breakpoint-scope.service';\nimport { normalizeDatatype } from 'eru-grid';\nimport { resolveJsonPath } from '../../utils/json.util';\nimport { parsePayloadField } from '../../utils/payload-field.util';\n\n/**\n * Page Component - A container component that can hold child components.\n * This component serves as a page section that allows page definitions to include\n * other components as children, similar to FlexContainerComponent.\n */\n@Component({\n    selector: 'eru-page-ref',\n    standalone: true,\n    imports: [CommonModule, NgComponentOutlet, MatIconModule, MatButtonModule, CanvasEventHandlerDirective],\n    templateUrl: './page.component.html',\n    styleUrl: './page.component.scss'\n})\nexport class PageRefComponent extends BaseComponent implements OnDestroy {\n\n    /**\n     * Width a side panel takes when nothing else decides it. Also the floor for\n     * an auto-sized one, and the fallback the pinned-panel body gutter uses.\n     */\n    private static readonly DEFAULT_SIDE_PANEL_WIDTH = '420px';\n    override componentEvents = [\n        { label: 'On API Success', value: 'on_api_success' },\n        { label: 'On API Error', value: 'on_api_error' }\n    ];\n\n    private static readonly EMPTY_ARRAY: any[] = [];\n\n    /** A value as an array, parsing JSON text — a query can return an array\n     *  column as a string. Null when it is neither. */\n    private static asArray(value: any): any[] | null {\n        if (Array.isArray(value)) return value;\n        if (typeof value !== 'string' || !value.trim().startsWith('[')) return null;\n        try {\n            const parsed = JSON.parse(value);\n            return Array.isArray(parsed) ? parsed : null;\n        } catch {\n            return null;\n        }\n    }\n    private componentRegistry = inject(ComponentRegistryService);\n    private readonly parentEnv = inject(EnvironmentInjector);\n    private readonly dialog = inject(MatDialog);\n    private readonly overlay = inject(Overlay);\n    private overlayRef: OverlayRef | null = null;\n\n    /**\n     * Breakpoint scope handed to the nested page's components, measured from\n     * the box this reference actually occupies — the inline slot, or the panel\n     * body once an overlay opens. The nested page keeps sharing this store, so\n     * this is the only thing that has to be scoped for a panel to lay itself\n     * out for its own width instead of the browser window's.\n     *\n     * Deliberately not conditional on edit mode: a reference's content is not\n     * authored from the host page (you open the nested page on its own to edit\n     * it, and there the toolbar's breakpoint applies), so the designer should\n     * show the same layout the reference will really render.\n     */\n    private readonly nestedBreakpointScope = new BreakpointScopeService();\n    private stopObservingWidth: (() => void) | null = null;\n\n    readonly dynamicComponentInjector = createEnvironmentInjector(\n        [\n            { provide: EruStudioStore, useValue: this.store },\n            { provide: LogicEvaluatorService, useValue: this.logicEvaluator },\n            { provide: BreakpointScopeService, useValue: this.nestedBreakpointScope }\n        ],\n        this.parentEnv\n    );\n\n    /**\n     * Signal-backed input for nesting level.\n     * Using @Input with a setter to avoid InputSignal brand mismatch issues in library consumers.\n     */\n    readonly nestingLevel = signal<number>(0);\n\n    @Input('nestingLevel')\n    set nestingLevelSetter(value: number) {\n        this.nestingLevel.set(value || 0);\n    }\n    readonly selectedComponent = this.store.selectedComponent;\n    readonly componentsReady = signal(false);\n\n    /**\n     * For popup / side_panel page_refs that are NOT auto_open, we don't\n     * fetch the target page def until the user actually opens the panel.\n     * Set to true on the first `openPanel` call and stays true (refetching\n     * after user closes is unnecessary — the def is the same).\n     */\n    private readonly hasBeenOpened = signal<boolean>(false);\n\n    readonly selectedPage = computed(() => this.getProperty('page') || '');\n    readonly selectedPageEntity = computed(() => this.getProperty('entity') || '');\n    readonly nestingType = computed(() => this.getProperty('nesting_type') || 'object');\n    readonly display_type = computed(() => this.getProperty('display_type') || 'inline');\n    readonly loopSource = computed(() => this.getProperty('loop_source') || 'data');\n    /**\n     * Key of the array inside the hosting record, for `nested_array`/\n     * `nested_object`. The Entity picker offers the nested page's entity name\n     * and the framework has always used that as the JSON key too, which only\n     * holds while the data is shaped by the data model. A record built by a\n     * query carries the alias the query chose (`txns`), so Array Field names it\n     * explicitly and falls back to the entity for every page authored so far.\n     */\n    readonly arrayFieldKey = computed<string>(() =>\n        String(this.getProperty('array_field') ?? '').trim() || this.selectedPageEntity());\n    readonly loopMatchFields = computed<string[]>(() => this.getProperty('loop_match_fields') || []);\n    // Key in each looped record whose value is the record's unique identifier\n    // (used as entity_id so edit/delete/save can target the record).\n    readonly entityIdKey = computed<string>(() => this.getProperty('entity_id_key') || '');\n    readonly dataSource = computed(() => this.getProperty('data_source') || 'auto');\n    readonly apiName = computed(() => this.getProperty('api_name') || '');\n    readonly functionName = computed(() => this.getProperty('function_name') || '');\n    readonly queryName = computed(() => this.getProperty('query_name') || '');\n    readonly apiPayloadFields = computed<string[]>(() => this.getProperty('api_payload_fields') || []);\n    readonly stateScope = computed<'page' | 'app'>(() => this.getProperty('state_scope') === 'app' ? 'app' : 'page');\n    readonly stateField = computed(() => (this.stateScope() === 'app'\n        ? this.getProperty('app_state_field')\n        : this.getProperty('state_field')) || '');\n    /** Fingerprint of the last applied state-source data (see the state effect). */\n    private lastStateSourceKey = '';\n    /** Nested page + refresh tick an inline ref last fired `on_load` for. */\n    private firedInlineOnLoadKey = '';\n\n    private lastOnLoadKey = signal<string>('');\n    private lastApiCallKey = signal<string>('');\n    private lastApiErrorReqId = signal<string | null>(null);\n    // Bumped by the `refresh-page-ref` action so the data-load effects re-run\n    // and re-fetch the nested page's data on demand.\n    private _refreshTick = signal(0);\n\n    private _loopApiData = signal<any[] | null>(null);\n    private _loopFieldData = signal<any[] | null>(null);\n    private _pageRefApiData = signal<any | null>(null);\n\n    private lastRequestIdMap = new Map<string, any>([\n        ['ds_page', signal<string | null>(null)],\n        ['ds_nestedpage_entity_name', signal<string | null>(null)],\n        ['ds_childpage_data', signal<string | null>(null)],\n        ['ds_loop_api', signal<string | null>(null)],\n        ['ds_loop_field', signal<string | null>(null)],\n        ['ds_page_ref_api', signal<string | null>(null)],\n        ['ds_page_ref_function', signal<string | null>(null)],\n        ['ds_page_ref_query', signal<string | null>(null)]\n    ]);\n\n    readonly activePageRefDataReqId = computed<string | null>(() => {\n        const source = this.dataSource();\n        if (source !== 'api' && source !== 'function' && source !== 'query') return null;\n        return this.lastRequestIdMap.get(`ds_page_ref_${source}`)();\n    });\n\n    readonly nestedPage = computed(() => {\n        //const requestId = this.lastRequestIdMap.get('ds_page').peek();\n        // We use computed reactivity on responses Map from store\n        const responses = this.store.dynamicDataResponses();\n        // Find most recent successful request for ds_page\n        const reqId = this.lastRequestIdMap.get('ds_page')();\n        if (reqId) {\n            return responses.get(reqId) || [];\n        }\n        return [];\n    });\n\n    readonly isPageLoading = computed(() => {\n        if (!this.selectedPage()) return false;\n        // Definition still fetching — always show ghost.\n        if (!(this.nestedPage() as any)?.page_def) return true;\n        // Definition is in but data may still be pending — keep ghost until\n        // the relevant fetch response arrives so consumers don't see a blank\n        // page between definition-ready and data-ready.\n        const responses = this.store.dynamicDataResponses();\n        const type = this.nestingType();\n        const ds = this.dataSource();\n        if (type === 'array' && ds === 'auto') {\n            const reqId = this.lastRequestIdMap.get('ds_childpage_data')();\n            if (reqId && !responses.has(reqId)) return true;\n        }\n        if ((ds === 'api' || ds === 'function' || ds === 'query') && (type === 'object' || type === 'array')) {\n            const reqId = this.lastRequestIdMap.get(`ds_page_ref_${ds}`)();\n            if (reqId && !responses.has(reqId)) return true;\n        }\n        if (type === 'nested_array' && this.loopSource() === 'api') {\n            const reqId = this.lastRequestIdMap.get('ds_loop_api')();\n            if (reqId && !responses.has(reqId)) return true;\n        }\n        return false;\n    });\n\n    readonly loopSourceData = computed<any[] | null>(() => {\n        const source = this.loopSource();\n        if (source === 'static') {\n            const raw = this.getProperty('loop_static_data') || '[]';\n            if (Array.isArray(raw)) return raw;\n            try {\n                const parsed = JSON.parse(raw);\n                return Array.isArray(parsed) ? parsed : null;\n            } catch { return null; }\n        }\n        if (source === 'api') {\n            return this._loopApiData();\n        }\n        if (source === 'field') {\n            return this._loopFieldData() || this.resolveFieldOptions();\n        }\n        return null;\n    });\n\n    readonly arrayData = computed(() => {\n        const type = this.nestingType();\n\n        if (type === 'nested_array') {\n            const key = this.arrayFieldKey();\n            // Inside a grid cell or board card the hosting record is the row,\n            // which the card host keeps in RowDataContext and never writes to\n            // page data — so the array has to be read from there. This is what\n            // makes a `page` column render one nested page per element of a\n            // row's array field.\n            const fromRow = PageRefComponent.asArray(this.rowFieldValue(key));\n            if (fromRow) return fromRow;\n            // Read the field off the record THIS page_ref is bound to. When the\n            // page_ref sits inside a looped record card its own dataKey is that\n            // card's row (\"0\"), and its page data lives under the nested page's\n            // id — reading the bare key against the outer current page returned\n            // nothing at all.\n            const pageId = this.component()?.pageId || undefined;\n            const rowKey = this.dataKey();\n            const fieldName = rowKey ? `${rowKey}.${key}` : key;\n            return this.store.getPageFieldData(fieldName, pageId) || PageRefComponent.EMPTY_ARRAY;\n        } else if (type === 'array') {\n            const pageId = this.selectedPage();\n            const pageData = this.store.getPageDataArray(pageId);\n            if (!pageData) {\n                return PageRefComponent.EMPTY_ARRAY;\n            };\n\n            if (Array.isArray(pageData)) {\n                return pageData.map((item) => item.entity_data);\n            }\n            return PageRefComponent.EMPTY_ARRAY\n        }\n        return PageRefComponent.EMPTY_ARRAY;\n    });\n\n    nestedPageComponents = computed<EruComponent[] | undefined>(() => {\n        return this.getNestedComponentsForIndex();\n    });\n\n    private getNestedComponentsForIndex(index?: number): EruComponent[] | undefined {\n        const nestedPageData = this.nestedPage();\n        const components = nestedPageData?.page_def?.components;\n        if (!components) return undefined;\n\n        const nestingType = this.nestingType();\n        const indexSuffix = index !== undefined ? `_${index}` : '';\n        const isLoopCard = index !== undefined;\n        // A nested_array's rows live inside the hosting record, not under a page\n        // id of their own, so its components stay on the page THIS page_ref is\n        // rendered from and carry that page_ref's row as their dataKey prefix.\n        // Both are empty for a page_ref on the outer page, which is the old\n        // behaviour.\n        const hostPageId = this.component()?.pageId || undefined;\n        const hostRowKey = this.dataKey() || undefined;\n        const markAsNested = (component: EruComponent, isRoot = false): EruComponent => ({\n            ...component,\n            id: `${component.id}${indexSuffix}`,\n            isNested: true,\n            pageId: (nestingType === 'object' || nestingType === 'array') ? this.selectedPage() : hostPageId,\n            dataKeyPrefix: (nestingType === 'object' || nestingType === 'array') ? undefined : hostRowKey,\n            nesting_type: nestingType as any,\n            index: index,\n            // The JSON key, not the entity name: it is what getDataKey builds a\n            // row path from and what the nested-array event payload indexes.\n            entityName: (nestingType === 'nested_array' || nestingType === 'nested_object')\n                ? this.arrayFieldKey()\n                : this.selectedPageEntity(),\n            styles: (isRoot && isLoopCard)\n                ? PageRefComponent.withoutViewportHeight(component.styles)\n                : component.styles,\n            events: component.events?.map(evt => ({\n                ...evt,\n                fieldNames: indexSuffix && this.isComponentIdAction(evt.action)\n                    ? evt.fieldNames?.map((f: string) => `${f}${indexSuffix}`)\n                    : evt.fieldNames\n            })),\n            children: component.children?.map(child => markAsNested(child))\n        });\n        return components.map((component: EruComponent) => markAsNested(component, true));\n    }\n\n    /**\n     * A looped record card is not a page, so the nested page's own full-height\n     * root sizing must not come along: a root authored `min-height: 100vh` (or\n     * `h-full`) claims a whole viewport PER RECORD, which is how two cards ended\n     * up 953px tall around 311px of content with the blank space read as a gap.\n     * Only viewport-relative heights and the full-height classes are dropped —\n     * every other authored style is left exactly as it is.\n     */\n    private static withoutViewportHeight(styles: any): any {\n        if (!styles || typeof styles !== 'object') return styles;\n        let changed = false;\n\n        const responsive = styles.responsive_styles;\n        let nextResponsive = responsive;\n        if (responsive && typeof responsive === 'object') {\n            nextResponsive = {};\n            for (const breakpoint of Object.keys(responsive)) {\n                const declarations = responsive[breakpoint];\n                if (!declarations || typeof declarations !== 'object') {\n                    nextResponsive[breakpoint] = declarations;\n                    continue;\n                }\n                const nextDeclarations: any = {};\n                for (const key of Object.keys(declarations)) {\n                    const value = declarations[key];\n                    if (/height/i.test(key) && /vh\\s*$/i.test(String(value))) {\n                        changed = true;\n                        continue;\n                    }\n                    nextDeclarations[key] = value;\n                }\n                nextResponsive[breakpoint] = nextDeclarations;\n            }\n        }\n\n        const classes = String(styles.classes ?? '');\n        const nextClasses = classes.split(/\\s+/)\n            .filter(cls => cls && cls !== 'h-full' && cls !== 'h-screen' && cls !== 'min-h-screen')\n            .join(' ');\n        if (nextClasses !== classes) changed = true;\n\n        if (!changed) return styles;\n        return { ...styles, classes: nextClasses, responsive_styles: nextResponsive };\n    }\n\n    /**\n     * Memo for the generated loop tree — see displayComponents.\n     */\n    private lastDisplay: { key: string; defs: any; value: EruComponent[] } | null = null;\n\n    readonly displayComponents = computed(() => {\n        const type = this.nestingType();\n        if (type === 'array' || type === 'nested_array') {\n            const data = this.arrayData();\n            if (!Array.isArray(data) || data.length === 0) return PageRefComponent.EMPTY_ARRAY;\n\n            // The generated cards are built from the nested page DEFINITION and\n            // the row index — never from the row's values, which the components\n            // read from page data as they render. Rebuilding them on every data\n            // write therefore changes nothing but the object identities, and\n            // those identities are what the view (and the effect below) react\n            // to: a field writing its value back into page data re-ran this\n            // computed, which handed the view a brand new tree, which mounted\n            // components that wrote again — Angular gave up with NG0103\n            // (infinite change detection) as soon as a nested loop had data.\n            // So return the same objects until something structural moves.\n            const defs = (this.nestedPage() as any)?.page_def?.components;\n            const key = [\n                type, data.length, this.selectedPage(), this.selectedPageEntity(), this.arrayFieldKey(),\n                this.dataKey(), this.component()?.pageId ?? '', this.nestingLevel(),\n                this.getProperty('loop_direction'), this.getProperty('loop_gap'), this.getProperty('loop_wrap'),\n                this.getProperty('loop_justify'), this.getProperty('loop_align'),\n                this.getProperty('loop_card_sizing'), this.getProperty('loop_card_width')\n            ].join('|');\n            const cached = this.lastDisplay;\n            if (cached && cached.key === key && cached.defs === defs) return cached.value;\n\n            const cards = data.map((_, index) =>\n                this.createRecordCard(index, this.getNestedComponentsForIndex(index) || []));\n            const value = [this.createFlexContainer(cards)];\n            this.lastDisplay = { key, defs, value };\n            return value;\n        }\n        return this.nestedPageComponents() || PageRefComponent.EMPTY_ARRAY;\n    });\n\n    private resolveFieldOptions(): any[] | null {\n        const fieldName = this.getProperty('loop_field');\n        if (!fieldName) return null;\n        const entityProp = this.selectedPageEntity();\n        const childEntity = entityProp.includes('#') ? entityProp.split('#')[1].split('.')[0] : entityProp.split('.')[0];\n        const field = this.store.getEntityField(fieldName, childEntity);\n        if (!field) return null;\n\n        const optionType = (field.option_type || '').toUpperCase();\n\n        if (normalizeDatatype(field.datatype) === 'status') {\n            const open = Array.isArray(field.open_status) ? field.open_status : (field.open_status ? JSON.parse(field.open_status) : []);\n            const close = Array.isArray(field.close_status) ? field.close_status : (field.close_status ? JSON.parse(field.close_status) : []);\n            return [...open, ...close].map(s => typeof s === 'string' ? { name: s } : s);\n        }\n\n        if (optionType === 'STATIC' || !optionType) {\n            if (Array.isArray(field.options)) {\n                return field.options.map(o => typeof o === 'string' ? { name: o } : o);\n            }\n            return null;\n        }\n\n        if (optionType === 'ENTITY_DATA') {\n            const componentId = this.component()?.id || '';\n            const payload = JSON.stringify({ entity_name: field.entity_name, field_name: field.field_name });\n            const existingReqId = this.lastRequestIdMap.get('ds_loop_field')();\n            if (!existingReqId) {\n                const reqId = this.store.requestDynamicData(componentId, 'ds_loop_field_entity', payload);\n                this.lastRequestIdMap.get('ds_loop_field').set(reqId);\n            }\n            return null;\n        }\n\n        if (optionType === 'API') {\n            const componentId = this.component()?.id || '';\n            const payload = JSON.stringify({ api_name: field.api_name, api_field: field.api_field });\n            const existingReqId = this.lastRequestIdMap.get('ds_loop_field')();\n            if (!existingReqId) {\n                const reqId = this.store.requestDynamicData(componentId, 'ds_loop_field_api', payload);\n                this.lastRequestIdMap.get('ds_loop_field').set(reqId);\n            }\n            return null;\n        }\n\n        return null;\n    }\n\n    private padPageDataArrayWithLoopSource(loopData: any[]): void {\n        const pageId = this.selectedPage();\n        const existing = this.store.getPageDataArray(pageId);\n        const matchFields = this.loopMatchFields();\n        const defaultRow = this.getDefaultRow();\n\n        const result = [...existing];\n        for (const raw of loopData) {\n            const template = this.normalizeLoopItem(raw);\n            const matched = matchFields.length > 0 && result.some(row =>\n                matchFields.every(field => row.entity_data?.[field] === template[field])\n            );\n            if (!matched) {\n                result.push({ entity_id: this.extractLoopRecordId(template), entity_data: { ...defaultRow, ...template } });\n            }\n        }\n\n        if (result.length !== existing.length) {\n            this.store.setPageDataArray(result, pageId);\n        }\n    }\n\n    private normalizeLoopItem(item: any): Record<string, any> {\n        const loopField = this.getProperty('loop_field');\n        if (loopField && this.loopSource() === 'field' && item.name !== undefined && !(loopField in item)) {\n            return { [loopField]: item.name, ...item };\n        }\n        return { ...item };\n    }\n\n    // Pull the record identifier out of a looped item using the configured\n    // Record Id Key (dot-path aware). Falls back to a plain entity_id/id on the\n    // item so records that already carry one still work.\n    private extractLoopRecordId(item: Record<string, any>): string {\n        const key = this.entityIdKey();\n        if (key) {\n            const v = this.resolvePayloadPath(item, key);\n            if (v !== undefined && v !== null && v !== '') return String(v);\n        }\n        const fallback = item?.['entity_id'] ?? item?.['id'];\n        return fallback !== undefined && fallback !== null ? String(fallback) : '';\n    }\n\n    private getDefaultRow(): Record<string, any> {\n        const entityProp = this.selectedPageEntity();\n        const childEntity = entityProp.includes('#') ? entityProp.split('#')[1].split('.')[0] : entityProp.split('.')[0];\n        const defaultRow: Record<string, any> = {};\n        if (childEntity) {\n            const fields = this.store.getEntityFields(childEntity);\n            fields.forEach(f => {\n                if (f.name && f.default !== undefined) {\n                    defaultRow[f.name] = f.default;\n                }\n            });\n        }\n        return defaultRow;\n    }\n\n    private padNestedArrayWithLoopSource(loopData: any[]): void {\n        const entityKey = this.selectedPageEntity();\n        if (!entityKey) return;\n        const existing = this.store.getPageFieldData(entityKey) || [];\n        const currentArray = Array.isArray(existing) ? existing : [];\n        const matchFields = this.loopMatchFields();\n        const defaultRow = this.getDefaultRow();\n\n        const result = [...currentArray];\n        for (const raw of loopData) {\n            const template = this.normalizeLoopItem(raw);\n            const matched = matchFields.length > 0 && result.some(row =>\n                matchFields.every(field => row[field] === template[field])\n            );\n            if (!matched) {\n                const recId = this.extractLoopRecordId(template);\n                // Surface the identifier as entity_id on the flat record so\n                // getPageRecord (nested_array path) can read it for edit/delete.\n                result.push({ ...defaultRow, ...template, ...(recId ? { entity_id: recId } : {}) });\n            }\n        }\n\n        if (result.length !== currentArray.length) {\n            const partialPageData: Partial<any> = { entity_data: { [entityKey]: result } };\n            this.store.updatePageData(partialPageData);\n        }\n    }\n\n    private createFlexContainer(children: EruComponent[]): EruComponent {\n        const containerId = `${this.component()?.id}_container`;\n        // Layout of the auto-generated loop container is driven by the page_ref's\n        // own (persisted) properties so it survives reloads and lets the user\n        // choose rows vs columns, the gap, and wrapping.\n        const gapProp = this.getProperty('loop_gap');\n        const gap = (gapProp === undefined || gapProp === null || gapProp === '' || isNaN(Number(gapProp)))\n            ? 20 : Number(gapProp);\n        const direction = this.getProperty('loop_direction') === 'row' ? 'row' : 'column';\n        const wrap = this.getProperty('loop_wrap') ? 'wrap' : 'nowrap';\n        // Alignment of the generated container is an author choice too: with\n        // content-sized cards, justify/align are the only way to say whether two\n        // cards sit together at the start, centre, or spread across the row.\n        const justify = this.getProperty('loop_justify') || 'flex-start';\n        const align = this.getProperty('loop_align') || 'stretch';\n        const generated: EruComponent = {\n            id: containerId,\n            type: 'flex_container',\n            properties: {\n                base: {\n                    flex_direction: direction,\n                    gap,\n                    layout_type: 'flex',\n                    justify_content: justify,\n                    align_items: align,\n                    flex_wrap: wrap\n                }\n            },\n            styles: {\n                // No height: the loop container is as tall as the records it\n                // holds. `h-full` here compounded with each card's own full-height\n                // root and stretched the list to the parent's height.\n                classes: 'w-full',\n                responsive_classes: {},\n                responsive_styles: {\n                    base: {\n                        width: '100%'\n                    }\n                },\n                custom: {}\n            },\n            children: children\n        } as EruComponent;\n        // Rebuilt from the current properties on every pass rather than returned\n        // as-is: the container is generated, and reusing the stored copy froze\n        // Loop Layout / Gap / Wrap at whatever they were when the first record\n        // arrived, so changing them did nothing until a reload.\n        const existing = this.store.findComponentById(containerId);\n        return existing ? { ...existing, ...generated } : generated;\n    }\n\n    /**\n     * One wrapper per looped record, so a nested page with more than one\n     * top-level component keeps its components together instead of interleaving\n     * them with the next record's as flat siblings of the loop container.\n     *\n     * It is also the only place a record can be given its share of the main\n     * axis. `width: 100%` is deliberate rather than a flex shorthand: the parent\n     * flex container already translates a full width into `flex-grow: 1;\n     * flex-basis: 0%; min-width: 0` when it lays out in a row, and into a plain\n     * width when it lays out in a column — which is exactly the reading wanted\n     * in each direction. Without it a card sized to its content and left the\n     * rest of the row empty.\n     */\n    private createRecordCard(index: number, children: EruComponent[]): EruComponent {\n        const width = this.loopCardWidth();\n        const isFull = width === '100%';\n        return {\n            id: `${this.component()?.id}_card_${index}`,\n            type: 'flex_container',\n            isNested: true,\n            index,\n            properties: {\n                base: {\n                    flex_direction: 'column',\n                    gap: 0,\n                    layout_type: 'flex',\n                    justify_content: 'flex-start',\n                    align_items: 'stretch',\n                    flex_wrap: 'nowrap'\n                }\n            },\n            styles: {\n                // `w-full` only while the card is meant to take its share of the\n                // row: kept alongside a content/fixed width it would win and the\n                // card would stretch anyway.\n                classes: isFull ? 'w-full' : '',\n                responsive_classes: {},\n                responsive_styles: {\n                    base: {\n                        width\n                    }\n                },\n                custom: {}\n            },\n            children\n        } as EruComponent;\n    }\n\n    /**\n     * Width handed to each looped record card, as the flex container reads it:\n     * `100%` becomes an equal share of the row, `auto` lets the card size to its\n     * own content, and anything else is pinned (flex-basis, no grow/shrink).\n     */\n    private loopCardWidth(): string {\n        const sizing = this.getProperty('loop_card_sizing') || 'fill';\n        if (sizing === 'content') return 'auto';\n        if (sizing === 'custom') {\n            const raw = String(this.getProperty('loop_card_width') ?? '').trim();\n            if (!raw) return '100%';\n            return /^\\d+(\\.\\d+)?$/.test(raw) ? `${raw}px` : raw;\n        }\n        return '100%';\n    }\n\n    protected isChildHovered = computed(() => {\n        const hoveredId = this.store.hoveredComponentId();\n        if (!hoveredId) return null;\n        const children = this.component().children;\n        if (!children) return null;\n        return children.find(c => c.id === hoveredId)?.id || null;\n    });\n\n    constructor() {\n        super();\n\n        // Consume a `refresh` action dispatched at this page_ref (via the\n        // `refresh-page-ref` event action) and reload its data by bumping the\n        // refresh tick, which re-runs the data-load effects below.\n        effect(() => {\n            const actions = this.store.componentActions();\n            const id = this.component()?.id;\n            if (!id) return;\n            const pending = actions.get(id);\n            if (pending && pending.action === 'refresh') {\n                this.store.consumeComponentAction(id);\n                untracked(() => {\n                    this.lastApiCallKey.set('');\n                    this.lastStateSourceKey = '';\n                    this._refreshTick.update(v => v + 1);\n                });\n            }\n        });\n\n        effect(() => {\n            this._refreshTick(); // re-run (and re-request) on refresh-page-ref\n            const pageId = this.selectedPage();\n            const entityProp = this.selectedPageEntity();\n            const type = this.nestingType();\n            const componentId = untracked(() => this.component()?.id);\n            const dt = this.display_type();\n            const autoOpen = !!this.getProperty('auto_open');\n            const opened = this.hasBeenOpened();\n\n\n            // Gate the fetch for closed overlay panels: a `popup` or\n            // `side_panel` page_ref with `auto_open: false` won't be\n            // visible until the user (or an action) opens it. Skipping\n            // the ds_page fetch here saves at least one round-trip plus\n            // downstream component instantiation on every page mount.\n            if ((dt === 'popup' || dt === 'side_panel') && !autoOpen && !opened) {\n                return;\n            }\n\n            if (componentId && pageId) {\n                const ds = this.dataSource();\n                untracked(() => {\n                    const reqId1 = this.store.requestDynamicData(componentId, 'ds_page', pageId);\n                    this.lastRequestIdMap.get('ds_page').set(reqId1);\n\n                    const reqId2 = this.store.requestDynamicData(componentId, 'ds_nestedpage_entity_name', pageId + '#' + type);\n                    this.lastRequestIdMap.get('ds_nestedpage_entity_name').set(reqId2);\n\n                    if (type === 'array' && ds === 'auto') {\n                        const reqId3 = this.store.requestDynamicData(componentId, 'ds_childpage_data', pageId + '##' + entityProp);\n                        this.lastRequestIdMap.get('ds_childpage_data').set(reqId3);\n                    }\n\n                    if (type === 'nested_array') {\n                        const loopApi = this.getProperty('loop_api');\n                        if (this.getProperty('loop_source') === 'api' && loopApi) {\n                            const reqId4 = this.store.requestDynamicData(componentId, 'ds_loop_api', loopApi);\n                            this.lastRequestIdMap.get('ds_loop_api').set(reqId4);\n                        }\n                    }\n\n                    if (entityProp) {\n                        const childEntity = entityProp.includes('#') ? entityProp.split('#')[1].split('.')[0] : entityProp.split('.')[0];\n                        if (childEntity) {\n                            const fields = this.store.getEntityFields(childEntity);\n                            this.store.setDynamicData('ds_nested_entity_fields', fields.map(f => ({ label: f.label || f.name, value: f.name })));\n                        }\n                    }\n                });\n            }\n        });\n\n        // Initialize the nested page's state in the store as soon as its page_def\n        // arrives. Without this, `@state.<key>` references in the nested page's\n        // components evaluate to undefined because `_pageState` only ever holds the\n        // outer page's state.\n        effect(() => {\n            const def = (this.nestedPage() as any)?.page_def;\n            const pageId = this.selectedPage();\n            // Initialize for ALL nesting types (object/array/nested_array): the\n            // nested page's declared state must exist in _pageState so that\n            // parent/child same-name linking can detect and share it — including\n            // for looped lists whose rows share a page-level selected_* var.\n            if (!def || !pageId) return;\n            untracked(() => {\n                this.store.initPageState({ ...def, id: pageId } as EruPage, pageId);\n            });\n        });\n\n        effect(() => {\n            const source = this.dataSource();\n            if (source !== 'api' && source !== 'function' && source !== 'query') return;\n            const type = this.nestingType();\n            if (type !== 'object' && type !== 'array') return;\n            const sourceName = source === 'api' ? this.apiName() : source === 'function' ? this.functionName() : this.queryName();\n            if (!sourceName) return;\n            const componentId = untracked(() => this.component()?.id);\n            const pageId = this.selectedPage();\n            if (!componentId || !pageId) return;\n\n            // Lazy-load for closed overlay panels: a `popup`/`side_panel` with\n            // `auto_open: false` shouldn't fetch its data until it's actually\n            // opened (mirrors the ds_page def gate). Reading hasBeenOpened()\n            // here makes this effect re-run — and fire the fetch — the moment\n            // the panel opens, and again on later payload changes while open.\n            const dt = this.display_type();\n            if ((dt === 'popup' || dt === 'side_panel') && !this.getProperty('auto_open') && !this.hasBeenOpened()) return;\n\n            const fields = this.apiPayloadFields();\n            const _stateTracker = this.store.computedPageState();\n            const _tick = this._refreshTick(); // force re-fetch on refresh-page-ref\n            const resolved = this.resolveApiPayload(fields);\n            if (resolved === null) return;\n\n            const fingerprint = JSON.stringify({ source, name: sourceName, payload: resolved, tick: _tick });\n            if (fingerprint === this.lastApiCallKey()) return;\n\n            const requestType = `ds_page_ref_${source}`;\n            const namePayload = source === 'api' ? { api_name: sourceName } : source === 'function' ? { function_name: sourceName } : { query_name: sourceName };\n\n            untracked(() => {\n                this.lastApiCallKey.set(fingerprint);\n                this.lastApiErrorReqId.set(null);\n                const reqId = this.store.requestDynamicData(componentId, requestType, { ...namePayload, payload: resolved, nesting_type: type });\n                this.lastRequestIdMap.get(requestType).set(reqId);\n            });\n        });\n\n        // Register the nested page's entity so components rendered inside the\n        // ref (inline or overlay) bind their fields against the NESTED page's\n        // entity instead of the outer page's (see store.getPageEntityName).\n        effect(() => {\n            const def = (this.nestedPage() as any)?.page_def;\n            if (!def?.id) return;\n            untracked(() => {\n                this.store.registerPageEntityName(def.id, def.entity_name || '');\n                this.store.registerNestedPageComponents(def.id, def.components);\n            });\n        });\n\n        // An inline ref has no \"open\" to hang on, so its unsourced on_load fires\n        // once the definition is in — and again on `refresh-page-ref`, which is\n        // the only way an author asks an inline ref to run again.\n        effect(() => {\n            const def = (this.nestedPage() as any)?.page_def;\n            const pageId = this.selectedPage();\n            const tick = this._refreshTick();\n            const ready = this.componentsReady();\n            if (!def || !pageId || !ready) return;\n            if (this.display_type() !== 'inline') return;\n            if (this.onLoadFiredByDataSource()) return;\n            const key = `${pageId}|${tick}`;\n            if (this.firedInlineOnLoadKey === key) return;\n            untracked(() => {\n                this.firedInlineOnLoadKey = key;\n                this.fireUnsourcedOnLoad();\n            });\n        });\n\n        effect(() => {\n            const type = this.nestingType();\n            if (type !== 'object' && type !== 'array') return;\n            const pageId = this.selectedPage();\n            if (!pageId) return;\n            const def = (this.nestedPage() as any)?.page_def;\n            if (!def) return;\n\n            // The mapping normally comes from this page_ref. When the page_ref\n            // declares no state source of its own, fall back to the nested\n            // page's own `data_source: 'state'` declaration — otherwise a page\n            // that renders correctly standalone (the store seeds it there, see\n            // EruStudioStore's constructor) comes up empty inside a page_ref.\n            const ownSource = this.dataSource() === 'state';\n            const defSource = def.data_source === 'state';\n            if (!ownSource && !defSource) return;\n\n            // App scope reads the root store's shared app state, so a page_ref\n            // can render data an action on another page parked there; page\n            // scope stays on the outer page's own state variables.\n            const scope: 'page' | 'app' = ownSource\n                ? this.stateScope()\n                : (def.state_scope === 'app' ? 'app' : 'page');\n            const stateField = (ownSource ? this.stateField() : (def.state_field || '')).trim();\n            if (!stateField) return;\n\n            const stateMap = scope === 'app' ? this.store.appState() : this.store.computedPageState();\n            let value = stateMap?.[stateField];\n            // Optional drill-down when the state value is a JSON object/array:\n            // walk the configured dotted path (JSON-string segments are parsed\n            // along the way, numeric segments index into arrays).\n            const statePath = (ownSource\n                ? (this.getProperty('state_result_path') || '')\n                : (def.state_result_path || '')).trim();\n            if (statePath) {\n                value = this.resolveValuePath(value, statePath);\n            }\n\n            // Only (re)apply when the resolved data actually changed. Without\n            // this, firing the nested page's on_load below can itself change\n            // state (e.g. an update-state event), which re-runs this effect\n            // synchronously and freezes the page in an infinite loop.\n            const _tick = this._refreshTick(); // force re-apply on refresh-page-ref\n            let fingerprint = '';\n            try {\n                fingerprint = JSON.stringify({ scope, stateField, statePath, value, tick: _tick });\n            } catch {\n                fingerprint = `${scope}|${stateField}|${statePath}|${String(value)}|${_tick}`;\n            }\n            if (fingerprint === this.lastStateSourceKey) return;\n            this.lastStateSourceKey = fingerprint;\n\n            untracked(() => {\n                if (type === 'object') {\n                    const record = this.normalizeObjectResponse(value);\n                    this._pageRefApiData.set(record);\n                    this.store.setPageData({ entity_id: record.entity_id, entity_data: record.entity_data } as any, pageId);\n                    this.firePageEvents('on_load', pageId, {\n                        entity_id: record.entity_id,\n                        entity_data: record.entity_data,\n                        entity_name: def?.entity_name\n                    });\n                } else {\n                    const items = this.normalizeArrayResponse(value);\n                    this._pageRefApiData.set(items);\n                    this.store.setPageDataArray(items, pageId);\n                    this.firePageEvents('on_load', pageId, {\n                        entity_id: '',\n                        entity_data: items,\n                        entity_name: def?.entity_name\n                    });\n                }\n            });\n        });\n\n        effect(() => {\n            const responses = this.store.dynamicDataResponses();\n            const reqId = this.activePageRefDataReqId();\n            if (!reqId) return;\n            const response = responses.get(reqId);\n            if (response === undefined) return;\n            const pageId = this.selectedPage();\n            const type = this.nestingType();\n            if (!pageId) return;\n            const def = (this.nestedPage() as any)?.page_def;\n\n            const componentId = this.component()?.id;\n            // For a query source, drill into the configured result path (e.g.\n            // eru-ql's \"0.Results\") before normalizing — the raw response is\n            // wrapped like [{ Results: [...] }] and would otherwise be treated as\n            // an empty record.\n            const data = this.dataSource() === 'query' ? this.applyQueryResultPath(response) : response;\n            untracked(() => {\n                if (type === 'object') {\n                    const record = this.normalizeObjectResponse(Array.isArray(data) ? data[0] : data);\n                    this._pageRefApiData.set(record);\n                    this.store.setPageData({ entity_id: record.entity_id, entity_data: record.entity_data } as any, pageId);\n                    const objPayload = {\n                        entity_id: record.entity_id,\n                        entity_data: record.entity_data,\n                        entity_name: def?.entity_name\n                    };\n                    if (def) this.firePageEvents('on_load', pageId, objPayload);\n                    if (componentId) this.store.processExternalEvent(componentId, 'on_api_success', undefined, objPayload);\n                } else if (type === 'array') {\n                    const items = this.normalizeArrayResponse(data);\n                    this._pageRefApiData.set(items);\n                    this.store.setPageDataArray(items, pageId);\n                    const arrPayload = {\n                        entity_id: '',\n                        entity_data: items,\n                        entity_name: def?.entity_name\n                    };\n                    if (def) this.firePageEvents('on_load', pageId, arrPayload);\n                    if (componentId) this.store.processExternalEvent(componentId, 'on_api_success', undefined, arrPayload);\n                }\n            });\n        });\n\n        effect(() => {\n            const requests = this.store.dynamicDataRequests();\n            const reqId = this.activePageRefDataReqId();\n            if (!reqId) return;\n            const req = requests.get(reqId);\n            if (!req || req.status !== 'error') return;\n            const pageId = this.selectedPage();\n            if (!pageId) return;\n            if (this.lastApiErrorReqId() === reqId) return;\n            const componentId = this.component()?.id;\n            if (!componentId) return;\n\n            const def = (this.nestedPage() as any)?.page_def;\n            untracked(() => {\n                this.lastApiErrorReqId.set(reqId);\n                this.store.processExternalEvent(componentId, 'on_api_error', undefined, {\n                    entity_id: '',\n                    entity_data: { error: (req as any).error ?? null },\n                    entity_name: def?.entity_name\n                });\n            });\n        });\n\n        effect(() => {\n            const nestedComponents = this.displayComponents();\n\n            untracked(() => {\n                const updateChildren = (components: EruComponent[]) => {\n                    if (this.component().children !== components) {\n                        setTimeout(() => { this.component().children = components; });\n                    }\n                };\n\n                if (!nestedComponents || nestedComponents.length === 0) {\n                    if (this.componentsReady() !== true) this.componentsReady.set(true);\n                    updateChildren(nestedComponents);\n                    return;\n                }\n\n                const allLoaded = nestedComponents.every((child: any) => this.getComponentClass(child.type));\n\n                if (allLoaded) {\n                    if (this.componentsReady() !== true) this.componentsReady.set(true);\n                } else {\n                    if (this.componentsReady() !== false) this.componentsReady.set(false);\n                    Promise.all(\n                        nestedComponents.map((child: any) =>\n                            this.componentRegistry.getComponentClassAsync(child.type)\n                        )\n                    ).then(() => {\n                        this.componentsReady.set(true);\n                    });\n                }\n\n                updateChildren(nestedComponents);\n            });\n        });\n\n        effect(() => {\n            const responses = this.store.dynamicDataResponses() || new Map<string, any>();\n            if (responses.size === 0) return;\n\n            const requests = this.store.pendingData();\n            untracked(() => {\n                requests.forEach(request => {\n                    if (request.type === 'ds_nestedpage_entity_name') {\n                        const entities = responses.get(request.requestId);\n                        if (entities) {\n                            this.store.setDynamicData('ds_nestedpage_entity_name', entities);\n                            this.store.removePendingData(request.requestId);\n                            return;\n                        }\n                    }\n                });\n            });\n        });\n\n        effect(() => {\n            const responses = this.store.dynamicDataResponses();\n            const reqId = this.lastRequestIdMap.get('ds_loop_api')();\n            if (!reqId) return;\n            const response = responses.get(reqId);\n            if (!response) return;\n            untracked(() => {\n                const data = Array.isArray(response) ? response\n                    : Array.isArray(response?.entity_data) ? response.entity_data\n                        : null;\n                if (data) {\n                    this._loopApiData.set(data);\n                }\n            });\n        });\n\n        effect(() => {\n            const responses = this.store.dynamicDataResponses();\n            const reqId = this.lastRequestIdMap.get('ds_loop_field')();\n            if (!reqId) return;\n            const response = responses.get(reqId);\n            if (!response) return;\n            untracked(() => {\n                let data: any[] | null = null;\n                if (Array.isArray(response)) {\n                    data = response;\n                } else if (Array.isArray(response?.entity_data)) {\n                    data = response.entity_data.map((item: any) => typeof item === 'object' ? item : { name: item });\n                } else if (Array.isArray(response?.org)) {\n                    data = response.org;\n                }\n                if (data) {\n                    this._loopFieldData.set(data);\n                }\n            });\n        });\n\n        effect(() => {\n            const loopData = this.loopSourceData();\n            if (!loopData || loopData.length === 0) return;\n            const type = this.nestingType();\n            const pageId = this.selectedPage();\n            const currentArray = type === 'array' ? this.store.getPageDataArray(pageId) : null;\n            untracked(() => {\n                if (type === 'array') {\n                    this.padPageDataArrayWithLoopSource(loopData);\n                } else if (type === 'nested_array') {\n                    this.padNestedArrayWithLoopSource(loopData);\n                }\n            });\n        });\n\n        // Auto-open the side panel once the referenced page definition has loaded.\n        // Only fires for display_type='side_panel' + auto_open=true, outside edit mode,\n        // and only once per component lifetime (we tear down via ngOnDestroy).\n        effect(() => {\n            if (this.store.editMode()) return;\n            if (this.display_type() !== 'side_panel') return;\n            if (!this.getProperty('auto_open')) return;\n            const def = (this.nestedPage() as any)?.page_def;\n            if (!def) return;\n            if (this.overlayRef) return;\n            untracked(() => this.openPanel());\n        });\n\n        // An inline reference lays out inside this component's own box, so that\n        // is the width its nested page must resolve against. Overlay references\n        // re-point the scope at the panel body when it opens.\n        effect(() => {\n            const displayType = this.display_type();\n            untracked(() => {\n                if (displayType === 'inline') {\n                    this.observeNestedWidth(this.elementRef?.nativeElement as HTMLElement);\n                }\n            });\n        });\n\n        // Listen for toggle/open/close actions dispatched at this component's id\n        // (e.g. from a button's `toggle-side-panel` event).\n        effect(() => {\n            const actions = this.store.componentActions();\n            const id = this.component()?.id;\n            if (!id) return;\n            const pending = actions.get(id);\n            if (!pending) return;\n            this.store.consumeComponentAction(id);\n            if (this.display_type() !== 'side_panel' && this.display_type() !== 'popup') return;\n            untracked(() => {\n                if (pending.action === 'toggle-side-panel') {\n                    this.openPanel();\n                } else if (pending.action === 'open-side-panel') {\n                    if (!this.overlayRef) this.openPanel();\n                } else if (pending.action === 'close-side-panel') {\n                    if (this.overlayRef) this.openPanel();\n                }\n            });\n        });\n    }\n\n    override ngOnDestroy() {\n        this.stopObservingWidth?.();\n        this.stopObservingWidth = null;\n        this.overlayRef?.dispose();\n        document.body.classList.remove('eru-has-pinned-side-panel');\n            document.body.style.removeProperty('--eru-side-panel-width');\n    }\n\n    /**\n     * Point the nested page's breakpoint scope at whichever box currently holds\n     * it. Inline that is this component's own element; for a popup or side panel\n     * it is the overlay's body, which lives in a different DOM tree and only\n     * exists while the panel is open.\n     */\n    private observeNestedWidth(element: HTMLElement | null | undefined): void {\n        this.stopObservingWidth?.();\n        this.stopObservingWidth = this.nestedBreakpointScope.observe(element);\n    }\n\n    /**\n     * Whether the nested page loops an array laid out as columns.\n     *\n     * This is the case a fixed panel width cannot serve: the panel holds N cards\n     * in a row, so the width it needs is a property of the data, not of the\n     * design. Anything else has one card's worth of content and a fixed width is\n     * the right answer.\n     */\n    private loopsSideBySide(): boolean {\n        const nesting = this.getProperty('nesting_type') || 'object';\n        if (nesting !== 'array' && nesting !== 'nested_array') return false;\n        return this.getProperty('loop_direction') === 'row';\n    }\n\n    /** The author's Panel Width, trimmed. Blank means \"decide for me\". */\n    private authoredPanelWidth(): string {\n        return String(this.getProperty('panel_width') ?? '').trim();\n    }\n\n    openPanel(): void {\n        if (this.store.editMode()) return;\n        // First open: flip the gate so the deferred ds_page fetch effect\n        // fires (see the gate near the top of `constructor`'s effect).\n        if (!this.hasBeenOpened()) {\n            this.hasBeenOpened.set(true);\n        }\n        if (this.display_type() === 'popup') {\n            this.openPopup();\n        } else if (this.display_type() === 'side_panel') {\n            this.openSidePanel();\n        }\n    }\n\n    private openPopup(): void {\n        const componentId = this.component()?.id;\n        const panelData: PagePanelData = {\n            title: this.resolvedPanelTitle(),\n            displayComponents: this.displayComponents,\n            componentsReady: this.componentsReady,\n            dynamicComponentInjector: this.dynamicComponentInjector,\n            observeWidth: (el: HTMLElement) => this.observeNestedWidth(el),\n            onClose: () => { }\n        };\n\n        const authored = this.authoredPanelWidth();\n        const dialogRef = this.dialog.open(PageRefPanelComponent, {\n            width: authored || '80vw',\n            // An authored width is a decision, so it is not then capped at 900px.\n            maxWidth: authored ? '95vw' : '900px',\n            height: '80vh',\n            data: panelData\n        });\n\n        if (componentId) this.store.setSidePanelOpenState(componentId, true);\n        panelData.onClose = () => dialogRef.close();\n        dialogRef.afterClosed().subscribe(() => {\n            if (componentId) this.store.setSidePanelOpenState(componentId, false);\n        });\n        this.fireUnsourcedOnLoad();\n    }\n\n    private openSidePanel(): void {\n        const componentId = this.component()?.id;\n        if (this.overlayRef) {\n            this.overlayRef.dispose();\n            this.overlayRef = null;\n            document.body.classList.remove('eru-has-pinned-side-panel');\n            document.body.style.removeProperty('--eru-side-panel-width');\n            if (componentId) this.store.setSidePanelOpenState(componentId, false);\n            return;\n        }\n\n        const autoOpen = !!this.getProperty('auto_open');\n\n        const closePanel = () => {\n            this.stopObservingWidth?.();\n            this.stopObservingWidth = null;\n            this.overlayRef?.dispose();\n            this.overlayRef = null;\n            document.body.classList.remove('eru-has-pinned-side-panel');\n            document.body.style.removeProperty('--eru-side-panel-width');\n            if (componentId) this.store.setSidePanelOpenState(componentId, false);\n        };\n\n        const panelData: PagePanelData = {\n            title: this.resolvedPanelTitle(),\n            displayComponents: this.displayComponents,\n            componentsReady: this.componentsReady,\n            dynamicComponentInjector: this.dynamicComponentInjector,\n            observeWidth: (el: HTMLElement) => this.observeNestedWidth(el),\n            onClose: closePanel\n        };\n\n        // Width, in order of authority: what the author typed; else, for an array\n        // looped as columns, the cards themselves (`auto`, floored at the fixed\n        // width so an empty or intrinsically-narrow row is not a sliver, and\n        // capped so it can never cover the page it was opened from); else the\n        // fixed default.\n        const authored = this.authoredPanelWidth();\n        const autoSized = !authored && this.loopsSideBySide();\n        this.overlayRef = this.overlay.create({\n            // \"Always open\" mode: no backdrop so the rest of the page stays interactive,\n            // and we don't auto-dispose on outside clicks.\n            hasBackdrop: !autoOpen,\n            backdropClass: autoOpen ? '' : 'cdk-overlay-dark-backdrop',\n            panelClass: autoOpen ? ['eru-side-panel-overlay', 'eru-side-panel-pinned'] : 'eru-side-panel-overlay',\n            positionStrategy: this.overlay.position().global().right('0').top('0'),\n            height: '100vh',\n            width: authored || (autoSized ? 'auto' : PageRefComponent.DEFAULT_SIDE_PANEL_WIDTH),\n            minWidth: autoSized ? PageRefComponent.DEFAULT_SIDE_PANEL_WIDTH : undefined,\n            maxWidth: '95vw',\n            disposeOnNavigation: false\n        });\n\n        if (autoOpen) document.body.classList.add('eru-has-pinned-side-panel');\n        if (componentId) this.store.setSidePanelOpenState(componentId, true);\n\n        const injector = createEnvironmentInjector(\n            [{ provide: MAT_DIALOG_DATA, useValue: panelData }],\n            this.parentEnv\n        );\n\n        const portal = new ComponentPortal(PageRefPanelComponent, null, injector as any);\n        this.overlayRef.attach(portal);\n        // A pinned panel reserves its width as a body gutter, which used to be a\n        // hardcoded 420px in studio.scss — so any other width overlapped the page\n        // or left a gap. An auto-sized panel is only measurable once attached.\n        if (autoOpen) {\n            const measured = autoSized\n                ? `${this.overlayRef.overlayElement?.offsetWidth || 0}px`\n                : (authored || PageRefComponent.DEFAULT_SIDE_PANEL_WIDTH);\n            document.body.style.setProperty('--eru-side-panel-width', measured);\n        }\n        if (!autoOpen) {\n            this.overlayRef.backdropClick().subscribe(closePanel);\n        }\n        this.fireUnsourcedOnLoad();\n    }\n\n    private resolvedPanelTitle(): string {\n        const def = (this.nestedPage() as any)?.page_def;\n        return def?.title || def?.name || this.selectedPage() || '';\n    }\n\n    panelTriggerLabel(): string {\n        return this.resolvedPanelTitle();\n    }\n\n    onDragOver(event: DragEvent) {\n        event.preventDefault();\n        event.dataTransfer!.dropEffect = 'move';\n        const target = event.target as HTMLElement;\n        const pageChild = target.closest('.page-child');\n        if (pageChild) {\n            const childId = pageChild.getAttribute('data-component-id');\n            if (childId && this.store.dragState().is_dragging) {\n                this.store.setHoveredComponentId(childId);\n            }\n        }\n    }\n\n    selectComponent(event: MouseEvent, component: EruComponent) {\n        if (!this.store.editMode()) return;\n        event.stopPropagation();\n        this.store.setSelectedComponent(component);\n    }\n\n    onComponentDragStart(event: DragEvent, component: EruComponent) {\n        event.stopPropagation();\n        const dragData = { type: 'move', component_id: component.id };\n        event.dataTransfer!.effectAllowed = 'move';\n        event.dataTransfer!.setData('application/json', JSON.stringify(dragData));\n        this.store.startDrag(component);\n    }\n\n    onComponentDragEnd(event: DragEvent) {\n        event.stopPropagation();\n        this.store.endDrag();\n    }\n\n    onComponentMouseEnter(event: MouseEvent, component: EruComponent) {\n        event.preventDefault();\n        event.stopPropagation();\n        this.store.setHoveredComponentId(component.id);\n    }\n\n    onComponentMouseLeave(event: MouseEvent) {\n        event.preventDefault();\n        event.stopPropagation();\n        this.store.setHoveredComponentId(null);\n    }\n\n    onCanvasMouseOver(event: MouseEvent, component: EruComponent) {\n        event.preventDefault();\n        event.stopPropagation();\n        const target = event.target as HTMLElement;\n        if (target.getAttribute('data-component-id') === component.id) {\n            this.store.setHoveredComponentId(component.id);\n        }\n    }\n\n    isContainer(type: string): boolean {\n        return type === 'flex_container' || type === 'grid_container' || type === 'card' || type === 'attachment' || type === 'page_ref';\n    }\n\n    hasCustomComponent(type: string): boolean {\n        const definition = this.componentRegistry.getComponent(type);\n        return !!definition?.component;\n    }\n\n    getComponentClass(type: string): any {\n        const definition = this.componentRegistry.getComponent(type);\n        if (definition?.component) return definition.component;\n        return (this.componentRegistry as any)['loadedComponents']?.get(type);\n    }\n\n    getZIndex(level: number): number {\n        return 1 + (level * 10);\n    }\n\n    /**\n     * Whether a data source already fires the nested page's `on_load`.\n     *\n     * The two data-arrival paths below fire it as they apply their record, so a\n     * ref that fetches or reads state is covered. A ref with neither — the\n     * nested page fetches its own data in its own `on_load` — had nothing at\n     * all firing it: the page worked opened directly (RuntimeCanvas fires it on\n     * mount) and was silent inside a page_ref.\n     */\n    private readonly onLoadFiredByDataSource = computed<boolean>(() => {\n        const source = this.dataSource();\n        if (source === 'api' || source === 'function' || source === 'query' || source === 'state') return true;\n        return (this.nestedPage() as any)?.page_def?.data_source === 'state';\n    });\n\n    /**\n     * Fire `on_load` for a nested page no data source speaks for. A panel fires\n     * on every open, not once per mount: the payload an on_load action sends is\n     * read when it runs, and a panel is usually reopened precisely because the\n     * state behind it changed.\n     */\n    private fireUnsourcedOnLoad(): void {\n        if (this.store.editMode()) return;\n        if (this.onLoadFiredByDataSource()) return;\n        const def = (this.nestedPage() as any)?.page_def;\n        const pageId = this.selectedPage();\n        if (!def || !pageId) return;\n        const record = this.store.getPageData(pageId);\n        this.firePageEvents('on_load', pageId, {\n            entity_id: record?.entity_id || '',\n            entity_data: record?.entity_data || {},\n            entity_name: def.entity_name || ''\n        });\n    }\n\n    private firePageEvents(eventType: string, nestedPageId: string, payload: { entity_id: string; entity_data: any; entity_name?: string }): void {\n        const def = (this.nestedPage() as any)?.page_def;\n        const events: ComponentEventSubscription[] | undefined = def?.events;\n        if (!events || events.length === 0) return;\n        const matching = events.filter(e => e.event === eventType);\n        if (matching.length === 0) return;\n\n        const enrichedPayload = {\n            entity_id: payload.entity_id || '',\n            entity_data: payload.entity_data || {},\n            entity_name: payload.entity_name || def?.entity_name || ''\n        };\n\n        for (const sub of matching) {\n            if (sub.validate_before_action) {\n                if (!enrichedPayload.entity_id) continue;\n                const requiredFields = sub.validate_field_names || [];\n                const hasAllRequired = requiredFields.every(fname => {\n                    const v = enrichedPayload.entity_data?.[fname];\n                    return v !== undefined && v !== null && v !== '';\n                });\n                if (!hasAllRequired) continue;\n            }\n            const subCopy: any = { ...sub, payload: { ...enrichedPayload } };\n            subCopy._originPageId = nestedPageId;\n            subCopy._originDataKey = '';\n\n            if (sub.action === 'update-state' && sub.state_key && sub.state_formula) {\n                const formula = sub.state_formula;\n                if (formula.fn === 'expr' && formula.expr) {\n                    const newVal = this.logicEvaluator.evaluateValue(formula.expr, nestedPageId);\n                    this.store.setPageStateValue(sub.state_key, newVal, nestedPageId);\n                } else if (formula.fn === 'set-from-payload') {\n                    const path = formula.payload_path || '';\n                    const newVal = this.resolvePayloadPath(enrichedPayload, path);\n                    this.store.setPageStateValue(sub.state_key, newVal, nestedPageId);\n                } else {\n                    this.store.updateStateWithFormula(sub.state_key, formula, nestedPageId);\n                }\n            }\n\n            this.store.setComponentEventEmitted(this.component().id, eventType, subCopy);\n        }\n    }\n\n    private resolveApiPayload(fields: string[]): Record<string, any> | null {\n        if (!fields || fields.length === 0) return {};\n        const out: Record<string, any> = {};\n        for (const f of fields) {\n            const parsed = parsePayloadField(f);\n            if (!parsed) continue;\n            const { source, path, key } = parsed;\n            // `app` is here too: the picker offers app-state options and the\n            // store's own builder has always handled them, but these two\n            // dropped anything that was not state/page — so an app-state\n            // payload field configured in the panel never reached the request.\n            const placeholder = source === 'state' ? `@state.${path}`\n                : source === 'page' ? `@page.${path}`\n                    : source === 'app' ? `@app.${path}`\n                        : '';\n            if (!placeholder) continue;\n            out[key] = this.logicEvaluator.evaluateValue(placeholder);\n        }\n        return out;\n    }\n\n    // Drill into the query response using the configured `query_result_path`\n    // (e.g. \"0.Results\"). Falls back to the raw response when the path is blank\n    // or resolves to nothing, so a mistyped path never blanks the panel worse\n    // than the raw response would.\n    private applyQueryResultPath(response: any): any {\n        const path = (this.getProperty('query_result_path') || '').trim();\n        if (!path) return response;\n        const extracted = this.resolvePayloadPath(response, path);\n        return extracted === undefined || extracted === null ? response : extracted;\n    }\n\n    // Walk a dotted path into a state value (state_result_path). Unlike the\n    // plain payload walk, segments that land on JSON strings are parsed so the\n    // path can cross stringified boundaries, and a stringified object/array\n    // leaf is parsed so the object/array nesting types can consume it.\n    private resolveValuePath(value: any, path: string): any {\n        return resolveJsonPath(value, path);\n    }\n\n    private normalizeObjectResponse(response: any): { entity_id: string; entity_data: Record<string, any> } {\n        if (response && typeof response === 'object' && !Array.isArray(response)) {\n            if ('entity_data' in response) {\n                return { entity_id: response.entity_id ?? '', entity_data: response.entity_data ?? {} };\n            }\n            return { entity_id: response.entity_id ?? '', entity_data: response };\n        }\n        return { entity_id: '', entity_data: {} };\n    }\n\n    private normalizeArrayResponse(response: any): Array<{ entity_id: string; entity_data: Record<string, any> }> {\n        let list: any[];\n        if (Array.isArray(response)) {\n            list = response;\n        } else if (Array.isArray(response?.entity_data)) {\n            list = response.entity_data;\n        } else if (response && typeof response === 'object') {\n            list = [response];\n        } else {\n            list = [];\n        }\n        return list.map((item: any) => {\n            if (item && typeof item === 'object' && 'entity_data' in item) {\n                return { entity_id: item.entity_id ?? '', entity_data: item.entity_data ?? {} };\n            }\n            return { entity_id: item?.entity_id ?? '', entity_data: item ?? {} };\n        });\n    }\n\n    private isComponentIdAction(action: string): boolean {\n        return ['hide-component', 'show-component', 'start-loading', 'stop-loading',\n            'enable-component', 'disable-component', 'start-timer', 'stop-timer'].includes(action);\n    }\n\n    protected override getPropertySchema(): PropertySchema[] {\n        return [\n            {\n                key: 'display_type',\n                type: 'select',\n                label: 'Display Type',\n                category: 'content',\n                default_value: 'inline',\n                options: [\n                    { label: 'Inline', value: 'inline' },\n                    { label: 'Popup', value: 'popup' },\n                    { label: 'Side Panel', value: 'side_panel' }\n                ],\n                responsive: false,\n                width: 'full'\n            },\n            {\n                key: 'panel_width',\n                type: 'text',\n                label: 'Panel Width',\n                category: 'content',\n                default_value: '',\n                responsive: false,\n                width: 'full',\n                description: 'Any CSS width — 420px, 50vw, 40%. Leave blank for the default: 420px for a side panel, 80vw (max 900px) for a popup. A side panel looping an array side by side sizes itself to the cards instead.',\n                visible_if: { key: 'display_type', in: ['popup', 'side_panel'] }\n            },\n            {\n                key: 'auto_open',\n                type: 'boolean',\n                label: 'Always Open',\n                category: 'content',\n                default_value: false,\n                description: 'Open the side panel by default (no backdrop, no click-to-open). Side Panel only.',\n                visible_if: { key: 'display_type', equals: 'side_panel' }\n            },\n            {\n                key: 'page',\n                type: 'select',\n                label: 'Page',\n                category: 'content',\n                default_value: '',\n                description: 'Select a page to nest within this component',\n                dynamic_options: 'ds_page_name',\n                responsive: false,\n                width: 'full',\n                on_value_change: (value: string, oldValue: string) => {\n                    const nestingType = this.getProperty('nesting_type') || 'object';\n                    const componentId = this.component()?.id;\n                    if (componentId) {\n                        const reqId1 = this.store.requestDynamicData(componentId, 'ds_nestedpage_entity_name', value + '#' + nestingType);\n                        this.lastRequestIdMap.get('ds_nestedpage_entity_name').set(reqId1);\n\n                        const reqId2 = this.store.requestDynamicData(componentId, 'ds_page', value);\n                        this.lastRequestIdMap.get('ds_page').set(reqId2);\n                    }\n                }\n            },\n            {\n                key: 'nesting_type',\n                type: 'select',\n                label: 'Nesting Type',\n                category: 'content',\n                default_value: 'object',\n                options: [\n                    { label: 'None', value: 'none' },\n                    { label: 'Object', value: 'object' },\n                    { label: 'Array', value: 'array' },\n                    { label: 'Nested Object', value: 'nested_object' },\n                    { label: 'Nested Array', value: 'nested_array' }\n                ],\n                responsive: false,\n                width: 'full',\n                on_value_change: (value: string, oldValue: string) => {\n                    const pageId = this.getProperty('page');\n                    const componentId = this.component()?.id;\n                    if (pageId && componentId) {\n                        const reqId = this.store.requestDynamicData(componentId, 'ds_nestedpage_entity_name', pageId + '#' + value);\n                        this.lastRequestIdMap.get('ds_nestedpage_entity_name').set(reqId);\n                    }\n                }\n            },\n            {\n                key: 'entity',\n                type: 'select',\n                label: 'Entity',\n                category: 'content',\n                default_value: '',\n                description: 'Select an entity to nest within this component',\n                dynamic_options: 'ds_nestedpage_entity_name',\n                responsive: false,\n                width: 'full',\n                on_value_change: (value: string) => {\n                    if (!value) return;\n                    const childEntity = value.includes('#') ? value.split('#')[1].split('.')[0] : value.split('.')[0];\n                    if (childEntity) {\n                        const fields = this.store.getEntityFields(childEntity);\n                        this.store.setDynamicData('ds_nested_entity_fields', fields.map(f => ({ label: f.label || f.name, value: f.name })));\n                    }\n                }\n            },\n            {\n                key: 'data_source',\n                type: 'select',\n                label: 'Data Source',\n                category: 'data',\n                default_value: 'auto',\n                options: [\n                    { label: 'Auto (Child Entity)', value: 'auto' },\n                    { label: 'API', value: 'api' },\n                    { label: 'Function', value: 'function' },\n                    { label: 'Query', value: 'query' },\n                    { label: 'State', value: 'state' }\n                ],\n                responsive: false,\n                width: 'full',\n                description: 'How the nested page receives its data. \"Auto\" loads child entity by parent entity_id; \"API\"/\"Function\"/\"Query\" call the selected source and use its response; \"State\" reads from a state field of the outer page (object expects single record, array expects array of records).',\n                visible_if: { key: 'nesting_type', in: ['object', 'array'] }\n            },\n            {\n                key: 'api_name',\n                type: 'select',\n                label: 'API Name',\n                category: 'data',\n                default_value: '',\n                dynamic_options: 'apis',\n                responsive: false,\n                width: 'full',\n                description: 'API that returns the nested page data.',\n                visible_if: { key: 'data_source', equals: 'api' }\n            },\n            {\n                key: 'function_name',\n                type: 'autocomplete',\n                label: 'Function Name',\n                category: 'data',\n                default_value: '',\n                dynamic_options: 'functions',\n                responsive: false,\n                width: 'full',\n                description: 'Function that returns the nested page data.',\n                visible_if: { key: 'data_source', equals: 'function' }\n            },\n            {\n                key: 'query_name',\n                type: 'autocomplete',\n                label: 'Query Name',\n                category: 'data',\n                default_value: '',\n                dynamic_options: 'queries',\n                responsive: false,\n                width: 'full',\n                description: 'Query that returns the nested page data.',\n                visible_if: { key: 'data_source', equals: 'query' }\n            },\n            {\n                key: 'query_result_path',\n                type: 'text',\n                label: 'Result Path',\n                category: 'data',\n                default_value: '',\n                responsive: false,\n                width: 'full',\n                description: 'Path into the query response to the record/array (e.g. 0.Results for eru-ql). Leave blank to use the raw response.',\n                visible_if: { key: 'data_source', equals: 'query' }\n            },\n            {\n                key: 'api_payload_fields',\n                type: 'payload_fields',\n                label: 'Payload Fields',\n                category: 'data',\n                default_value: [],\n                dynamic_options: 'ds_page_ref_payload_fields',\n                responsive: false,\n                width: 'full',\n                description: 'Pick state vars / page-data fields of the outer page. The API/Function/Query receives {field_name: value} for each selected entry. Type \"= other_name\" alongside an entry to send it under a different key.',\n                visible_if: { key: 'data_source', in: ['api', 'function', 'query'] }\n            },\n            {\n                key: 'state_scope',\n                type: 'select',\n                label: 'State Scope',\n                category: 'data',\n                default_value: 'page',\n                options: [\n                    { label: 'Page State', value: 'page' },\n                    { label: 'App State (shared, survives navigation)', value: 'app' }\n                ],\n                responsive: false,\n                width: 'full',\n                description: 'Where the state field lives. \"Page State\" reads a state variable of the outer page; \"App State\" reads the shared app state a previous page/action wrote.',\n                visible_if: { key: 'data_source', equals: 'state' }\n            },\n            {\n                key: 'state_field',\n                type: 'select',\n                label: 'State Field',\n                category: 'data',\n                default_value: '',\n                dynamic_options: 'ds_page_state_vars',\n                responsive: false,\n                width: 'full',\n                description: 'State field of the outer page that holds the nested page data. For object, value should be a record; for array, value should be an array of records.',\n                visible_operator: 'all',\n                visible_if: [\n                    { key: 'data_source', equals: 'state' },\n                    { key: 'state_scope', notEquals: 'app' }\n                ]\n            },\n            {\n                key: 'app_state_field',\n                type: 'autocomplete',\n                label: 'App State Key',\n                category: 'data',\n                default_value: '',\n                dynamic_options: 'ds_app_state_vars',\n                responsive: false,\n                width: 'full',\n                description: 'App state key that holds the nested page data. Suggestions list the keys currently in app state; type a key that has not been written yet.',\n                visible_operator: 'all',\n                visible_if: [\n                    { key: 'data_source', equals: 'state' },\n                    { key: 'state_scope', equals: 'app' }\n                ]\n            },\n            {\n                key: 'state_result_path',\n                type: 'text',\n                label: 'State Path',\n                category: 'data',\n                default_value: '',\n                responsive: false,\n                width: 'full',\n                description: 'Path inside the state field\\'s value to the record/array when it is a JSON object (e.g. program_data.changes or 0.items). Leave blank to use the value as-is.',\n                visible_if: { key: 'data_source', equals: 'state' }\n            },\n            {\n                key: 'array_field',\n                type: 'text',\n                label: 'Array Field',\n                category: 'data',\n                default_value: '',\n                responsive: false,\n                width: 'full',\n                description: 'Key of the array inside the hosting record, when it differs from the entity name (e.g. a query alias like \"txns\"). Leave blank to use the Entity.',\n                visible_if: { key: 'nesting_type', in: ['nested_array', 'nested_object'] }\n            },\n            {\n                key: 'loop_source',\n                type: 'select',\n                label: 'Loop Source',\n                category: 'data',\n                default_value: 'data',\n                options: [\n                    { label: 'Child Entity Data', value: 'data' },\n                    { label: 'Static', value: 'static' },\n                    { label: 'API', value: 'api' },\n                    { label: 'Entity Field', value: 'field' }\n                ],\n                responsive: false,\n                width: 'full',\n                visible_if: { key: 'nesting_type', equals: 'nested_array' }\n            },\n            {\n                key: 'loop_static_data',\n                type: 'textarea',\n                label: 'Static Loop Data (JSON)',\n                category: 'data',\n                default_value: '[]',\n                width: 'full',\n                responsive: false,\n                visible_if: { key: 'loop_source', equals: 'static' }\n            },\n            {\n                key: 'loop_api',\n                type: 'text',\n                label: 'Loop API',\n                category: 'data',\n                default_value: '',\n                responsive: false,\n                width: 'full',\n                visible_if: { key: 'loop_source', equals: 'api' }\n            },\n            {\n                key: 'loop_field',\n                type: 'select',\n                label: 'Field',\n                category: 'data',\n                default_value: '',\n                dynamic_options: 'ds_nested_entity_fields',\n                responsive: false,\n                width: 'full',\n                visible_if: { key: 'loop_source', equals: 'field' }\n            },\n            {\n                key: 'loop_match_fields',\n                type: 'multiselect',\n                label: 'Match Fields',\n                category: 'data',\n                default_value: [],\n                dynamic_options: 'ds_nested_entity_fields',\n                responsive: false,\n                width: 'full',\n                visible_if: { key: 'loop_source', notEquals: 'data' }\n            },\n            {\n                key: 'entity_id_key',\n                type: 'text',\n                label: 'Record Id Key',\n                category: 'data',\n                default_value: '',\n                responsive: false,\n                width: 'full',\n                description: 'Key in each looped record that holds its unique identifier. Bundle the record id inside the object under this key; it becomes the row entity_id so edit/delete/save can identify the record. Supports a dot path (e.g. meta.id).',\n                visible_if: { key: 'nesting_type', in: ['array', 'nested_array'] }\n            },\n            {\n                key: 'loop_direction',\n                type: 'select',\n                label: 'Loop Layout',\n                category: 'content',\n                default_value: 'column',\n                options: [\n                    { label: 'Rows (stacked)', value: 'column' },\n                    { label: 'Columns (side by side)', value: 'row' }\n                ],\n                responsive: false,\n                width: 'full',\n                description: 'How the looped record cards are arranged in the auto-generated container.',\n                visible_if: { key: 'nesting_type', in: ['array', 'nested_array'] }\n            },\n            {\n                key: 'loop_gap',\n                type: 'number',\n                label: 'Loop Gap (px)',\n                category: 'content',\n                default_value: 20,\n                min: 0,\n                max: 100,\n                step: 1,\n                responsive: false,\n                width: 'full',\n                description: 'Gap between looped record cards.',\n                visible_if: { key: 'nesting_type', in: ['array', 'nested_array'] }\n            },\n            {\n                key: 'loop_wrap',\n                type: 'boolean',\n                label: 'Wrap Cards',\n                category: 'content',\n                default_value: false,\n                responsive: false,\n                width: 'full',\n                description: 'Allow record cards to wrap onto multiple lines.',\n                visible_if: { key: 'nesting_type', in: ['array', 'nested_array'] }\n            },\n            {\n                key: 'loop_justify',\n                type: 'select',\n                label: 'Loop Justify',\n                category: 'content',\n                default_value: 'flex-start',\n                options: [\n                    { label: 'Start', value: 'flex-start' },\n                    { label: 'Center', value: 'center' },\n                    { label: 'End', value: 'flex-end' },\n                    { label: 'Space Between', value: 'space-between' },\n                    { label: 'Space Around', value: 'space-around' },\n                    { label: 'Space Evenly', value: 'space-evenly' }\n                ],\n                responsive: false,\n                width: 'full',\n                description: 'How the record cards are distributed along the loop direction. Only bites once cards are content or fixed width.',\n                visible_if: { key: 'nesting_type', in: ['array', 'nested_array'] }\n            },\n            {\n                key: 'loop_align',\n                type: 'select',\n                label: 'Loop Align',\n                category: 'content',\n                default_value: 'stretch',\n                options: [\n                    { label: 'Stretch', value: 'stretch' },\n                    { label: 'Start', value: 'flex-start' },\n                    { label: 'Center', value: 'center' },\n                    { label: 'End', value: 'flex-end' }\n                ],\n                responsive: false,\n                width: 'full',\n                description: 'Alignment of the record cards across the loop direction (card heights in a row layout).',\n                visible_if: { key: 'nesting_type', in: ['array', 'nested_array'] }\n            },\n            {\n                key: 'loop_card_sizing',\n                type: 'select',\n                label: 'Card Sizing',\n                category: 'content',\n                default_value: 'fill',\n                options: [\n                    { label: 'Fill (equal share)', value: 'fill' },\n                    { label: 'Fit Content', value: 'content' },\n                    { label: 'Fixed Width', value: 'custom' }\n                ],\n                responsive: false,\n                width: 'full',\n                description: 'Fill splits the row equally between cards; Fit Content and Fixed Width size each card independently so Loop Justify controls the spacing.',\n                visible_if: { key: 'nesting_type', in: ['array', 'nested_array'] }\n            },\n            {\n                key: 'loop_card_width',\n                type: 'text',\n                label: 'Card Width',\n                category: 'content',\n                default_value: '',\n                responsive: false,\n                width: 'full',\n                description: 'Width of each record card, e.g. 320, 320px, 30%. A plain number is read as pixels.',\n                visible_if: [\n                    { key: 'nesting_type', in: ['array', 'nested_array'] },\n                    { key: 'loop_card_sizing', equals: 'custom' }\n                ]\n            },\n            {\n                key: 'description',\n                type: 'textarea',\n                label: 'Description',\n                category: 'content',\n                default_value: '',\n                description: 'Description of this nested page reference',\n                width: 'full',\n                responsive: false\n            }\n        ];\n    }\n}\n","<div class=\"page-ref-container\"\n    [class.is-overlay-ref]=\"display_type() === 'popup' || display_type() === 'side_panel'\"\n    [class.has-content]=\"display_type() === 'inline' && !!selectedPage() && !isPageLoading() && !!nestedPageComponents()\"\n    eruCanvasEventHandler [attr.data-container-id]=\"component().id\"\n    [attr.data-component-id]=\"component().id\" [attr.data-nesting-level]=\"nestingLevel()\"\n    [style.z-index]=\"getZIndex(nestingLevel())\" (dragover)=\"onDragOver($event)\">\n\n    @if (display_type() === 'inline') {\n    @if (!selectedPage()) {\n    <div class=\"page-ref-placeholder\">\n        <div class=\"page-ref-icon\">\n            <mat-icon>article</mat-icon>\n        </div>\n        <div class=\"page-ref-label\">\n            <span class=\"no-page\">Page Container - Drop components here</span>\n        </div>\n        <div class=\"page-ref-hint\">\n            Nested Page Reference\n        </div>\n    </div>\n    } @else if (isPageLoading() || !nestedPageComponents()) {\n    <div class=\"page-ref-skeleton\">\n        <div class=\"skeleton-bar wide\"></div>\n        <div class=\"skeleton-bar medium\"></div>\n        <div class=\"skeleton-bar short\"></div>\n    </div>\n    } @else {\n    @for (child of displayComponents(); track child.id) {\n    <div class=\"page-child w-full\" [class.selected]=\"selectedComponent()?.id === child.id\"\n        [class.hovered-drop-target]=\"isChildHovered() === child.id\"\n        [attr.data-container-id]=\"isContainer(child.type) ? child.id : null\" [attr.data-component-id]=\"child.id\"\n        [attr.data-nesting-level]=\"nestingLevel() + 1\" [style.z-index]=\"getZIndex(nestingLevel() + 1)\" draggable=\"true\"\n        (mouseenter)=\"onComponentMouseEnter($event, child)\" (mouseleave)=\"onComponentMouseLeave($event)\"\n        (mouseover)=\"onCanvasMouseOver($event, child)\" (dragstart)=\"onComponentDragStart($event, child)\"\n        (dragend)=\"onComponentDragEnd($event)\" (click)=\"selectComponent($event, child)\">\n        <ng-container\n            *ngComponentOutlet=\"getComponentClass(child.type);\n                                    injector: dynamicComponentInjector;\n                                    inputs: isContainer(child.type) ? {component: child, nestingLevel: nestingLevel() + 1} : {component: child}\" />\n    </div>\n    }\n    }\n    }\n</div>","import { Component, input, inject, computed, signal, effect, EnvironmentInjector, createEnvironmentInjector, untracked } from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { EruComponent, PropertySchema } from '../../models';\nimport { ComponentRegistryService } from '../../services/component-registry.service';\nimport { EruStudioStore } from '../../services/eru-studio.store';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../base-component';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\n\n/**\n * Widget Component - A component that can host a dynamically loaded widget.\n * Similar to PageRefComponent, it fetches a widget definition based on selection.\n */\n@Component({\n    selector: 'eru-widget',\n    standalone: true,\n    imports: [CommonModule, NgComponentOutlet, MatIconModule, CanvasEventHandlerDirective],\n    templateUrl: './widget.component.html',\n    styleUrl: './widget.component.scss'\n})\nexport class WidgetComponent extends BaseComponent {\n    private componentRegistry = inject(ComponentRegistryService);\n    private readonly parentEnv = inject(EnvironmentInjector);\n    readonly dynamicComponentInjector = createEnvironmentInjector(\n        [\n            { provide: EruStudioStore, useValue: this.store },\n            { provide: LogicEvaluatorService, useValue: this.logicEvaluator }\n        ],\n        this.parentEnv\n    );\n\n    readonly nestingLevel = input<number>(0);\n    readonly selectedComponent = this.store.selectedComponent;\n    readonly componentsReady = signal(false);\n\n    readonly selectedWidget = computed(() => this.getProperty('widget') || '');\n    private lastRequestId = signal<string | null>(null);\n\n    readonly nestedWidgetData = computed(() => {\n        const requestId = this.lastRequestId();\n        if (requestId) {\n            const response = this.store.getDynamicDataResponse(requestId);\n            if (response) return response;\n        }\n        // Fallback or while pending\n        return null;\n    });\n\n    readonly displayComponents = computed(() => {\n        const widgetDef = this.nestedWidgetData();\n        if (!widgetDef || !widgetDef.page_def?.components) return [];\n\n        const components = widgetDef.page_def.components;\n        const markAsNested = (component: EruComponent): EruComponent => ({\n            ...component,\n            id: component.id,\n            isNested: true,\n            pageId: this.selectedWidget(),\n            children: component.children?.map(markAsNested)\n        });\n\n        return components.map(markAsNested);\n    });\n\n    constructor() {\n        super();\n\n        effect(() => {\n            const widgetId = this.selectedWidget();\n            const componentId = this.component()?.id;\n            if (widgetId && componentId) {\n                untracked(() => {\n                    const requestId = this.store.requestDynamicData(componentId, 'ds_widget', widgetId);\n                    this.lastRequestId.set(requestId);\n                });\n            }\n        });\n\n        effect(() => {\n            const nestedComponents = this.displayComponents();\n\n            if (!nestedComponents || nestedComponents.length === 0) {\n                this.componentsReady.set(false);\n                return;\n            }\n\n            const allLoaded = nestedComponents.every((child: any) => this.getComponentClass(child.type));\n\n            if (allLoaded) {\n                this.componentsReady.set(true);\n            } else {\n                this.componentsReady.set(false);\n                Promise.all(\n                    nestedComponents.map((child: any) =>\n                        this.componentRegistry.getComponentClassAsync(child.type)\n                    )\n                ).then(() => {\n                    this.componentsReady.set(true);\n                });\n            }\n        });\n    }\n\n    selectComponent(event: MouseEvent, component: EruComponent) {\n        if (!this.store.editMode()) {\n            return;\n        }\n        event.stopPropagation();\n        this.store.setSelectedComponent(component);\n    }\n\n    onComponentMouseEnter(event: MouseEvent, component: EruComponent) {\n        event.preventDefault();\n        event.stopPropagation();\n        this.store.setHoveredComponentId(component.id);\n    }\n\n    onComponentMouseLeave(event: MouseEvent) {\n        event.preventDefault();\n        event.stopPropagation();\n        this.store.setHoveredComponentId(null);\n    }\n\n    isContainer(type: string): boolean {\n        return type === 'flex_container' || type === 'grid_container' || type === 'card' || type === 'attachment' || type === 'page_ref' || type === 'eru-widget';\n    }\n\n    getComponentClass(type: string): any {\n        const definition = this.componentRegistry.getComponent(type);\n        if (definition?.component) {\n            return definition.component;\n        }\n        return (this.componentRegistry as any)['loadedComponents']?.get(type);\n    }\n\n    getZIndex(level: number): number {\n        return 1 + (level * 10);\n    }\n\n    getChildStyles(child: EruComponent): any {\n        if (!this.checkVisibility(child)) {\n            return { display: 'none' };\n        }\n        return {};\n    }\n\n    // Property schema for this component\n    protected override getComponentPropertySchema(): PropertySchema[] {\n        return [\n            {\n                key: 'widget',\n                type: 'select',\n                label: 'Widget',\n                category: 'content',\n                default_value: '',\n                description: 'Select a widget to display',\n                dynamic_options: 'ds_widget_name',\n                responsive: false,\n                width: 'full',\n                on_value_change: (value: string, oldValue: string) => {\n                    const requestId = this.store.requestDynamicData(this.component()?.id || '', 'ds_widget', value);\n                    this.lastRequestId.set(requestId);\n                }\n            },\n            {\n                key: 'description',\n                type: 'textarea',\n                label: 'Description',\n                category: 'content',\n                default_value: '',\n                description: 'Description of this widget',\n                width: 'full',\n                responsive: false\n            }\n        ];\n    }\n}\n","<div class=\"widget-container\" eruCanvasEventHandler [attr.data-container-id]=\"component().id\"\n    [attr.data-component-id]=\"component().id\" [attr.data-nesting-level]=\"nestingLevel()\"\n    [style.z-index]=\"getZIndex(nestingLevel())\">\n\n    @if (!displayComponents() || displayComponents().length === 0) {\n    <div class=\"widget-placeholder\">\n        <div class=\"widget-icon\">\n            <mat-icon>widgets</mat-icon>\n        </div>\n        <div class=\"widget-label\">\n            @if (selectedWidget()) {\n            <span class=\"widget-name\">{{ selectedWidget() }}</span>\n            } @else {\n            <span class=\"no-widget\">Widget Container - Select a widget in properties</span>\n            }\n        </div>\n        <div class=\"widget-hint\">\n            Dynamic Widget Reference\n        </div>\n    </div>\n    } @else if (componentsReady()) {\n    @for (child of displayComponents(); track child.id) {\n    <div class=\"widget-child\" [class.selected]=\"selectedComponent()?.id === child.id\" [ngStyle]=\"getChildStyles(child)\"\n        [attr.data-container-id]=\"isContainer(child.type) ? child.id : null\" [attr.data-component-id]=\"child.id\"\n        [attr.data-nesting-level]=\"nestingLevel() + 1\" [style.z-index]=\"getZIndex(nestingLevel() + 1)\"\n        (mouseenter)=\"onComponentMouseEnter($event, child)\" (mouseleave)=\"onComponentMouseLeave($event)\"\n        (click)=\"selectComponent($event, child)\">\n        <ng-container\n            *ngComponentOutlet=\"getComponentClass(child.type);\n                                 injector: dynamicComponentInjector;\n                                 inputs: isContainer(child.type) ? {component: child, nestingLevel: nestingLevel() + 1} : {component: child}\" />\n    </div>\n    }\n    } @else {\n    <div class=\"widget-loading\">\n        <mat-icon class=\"spinning\">sync</mat-icon>\n        <span>Loading widget...</span>\n    </div>\n    }\n</div>","import { Component, Input, ElementRef, ViewChild, OnInit, AfterViewInit, OnDestroy, signal } from '@angular/core';\n\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\n\ninterface PanelSize {\n  width: number;\n  height: number;\n}\n\ninterface PanelPosition {\n  x: number;\n  y: number;\n}\n\n@Component({\n  selector: 'eru-floating-panel',\n  standalone: true,\n  imports: [MatCardModule, MatIconModule, MatButtonModule],\n  templateUrl: './floating-panel.component.html',\n  styleUrl: './floating-panel.component.scss'\n})\nexport class FloatingPanelComponent implements OnInit, AfterViewInit, OnDestroy {\n  @Input() panelId: string = '';\n  @Input() title: string = 'Panel';\n  @Input() initialSize: PanelSize = { width: 300, height: 400 };\n  @Input() initialPosition: PanelPosition = { x: 20, y: 60 };\n\n  @ViewChild('panelContainer') panelContainer!: ElementRef;\n\n  size: PanelSize = { width: 0, height: 0 };\n  position: PanelPosition = { x: 0, y: 0 };\n  isMinimized: boolean = false;\n  private originalHeight: number = 0;\n\n  // Mouse drag properties\n  private isDragging: boolean = false;\n  private offsetX: number = 0;\n  private offsetY: number = 0;\n  private mouseMoveHandler?: (e: MouseEvent) => void;\n  private mouseUpHandler?: (e: MouseEvent) => void;\n\n  ngOnInit() {\n    this.size = { ...this.initialSize };\n    this.position = { ...this.initialPosition };\n    this.originalHeight = this.initialSize.height;\n  }\n\n  ngAfterViewInit() {\n    // Set initial position\n    this.panelContainer.nativeElement.style.position = 'fixed';\n    this.panelContainer.nativeElement.style.left = `${this.position.x}px`;\n    this.panelContainer.nativeElement.style.top = `${this.position.y}px`;\n    this.panelContainer.nativeElement.style.cursor = 'grab';\n  }\n\n  ngOnDestroy() {\n    // Clean up event listeners\n    if (this.mouseMoveHandler) {\n      document.removeEventListener('mousemove', this.mouseMoveHandler);\n    }\n    if (this.mouseUpHandler) {\n      document.removeEventListener('mouseup', this.mouseUpHandler);\n    }\n  }\n\n  onMouseDown(event: MouseEvent) {\n    // Only allow dragging from the header area\n    if (!event.target || !(event.target as HTMLElement).closest('.panel-header')) {\n      return;\n    }\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    // Bring this panel to front\n    this.bringToFront();\n\n    this.isDragging = true;\n\n    // Calculate offset from mouse to panel position\n    const rect = this.panelContainer.nativeElement.getBoundingClientRect();\n    this.offsetX = event.clientX - rect.left;\n    this.offsetY = event.clientY - rect.top;\n\n    // Set visual feedback\n    this.panelContainer.nativeElement.style.cursor = 'grabbing';\n    this.panelContainer.nativeElement.classList.add('dragging');\n\n    // Disable pointer events on canvas components during drag\n    this.disableCanvasPointerEvents();\n\n    // Add global event listeners\n    this.mouseMoveHandler = (e: MouseEvent) => this.onMouseMove(e);\n    this.mouseUpHandler = (e: MouseEvent) => this.onMouseUp(e);\n\n    document.addEventListener('mousemove', this.mouseMoveHandler);\n    document.addEventListener('mouseup', this.mouseUpHandler);\n  }\n\n  private onMouseMove(event: MouseEvent) {\n    if (!this.isDragging) return;\n\n    // Calculate new position\n    const newX = event.clientX - this.offsetX;\n    const newY = event.clientY - this.offsetY;\n\n    // Apply bounds checking\n    const clampedX = Math.max(0, Math.min(newX, window.innerWidth - this.size.width));\n    const clampedY = Math.max(0, Math.min(newY, window.innerHeight - 40));\n\n    // Update position\n    this.position.x = clampedX;\n    this.position.y = clampedY;\n    this.panelContainer.nativeElement.style.left = `${clampedX}px`;\n    this.panelContainer.nativeElement.style.top = `${clampedY}px`;\n  }\n\n  private onMouseUp(event: MouseEvent) {\n    if (!this.isDragging) return;\n\n    this.isDragging = false;\n\n    // Reset visual feedback\n    this.panelContainer.nativeElement.style.cursor = 'grab';\n    this.panelContainer.nativeElement.classList.remove('dragging');\n\n    // Re-enable pointer events on canvas components\n    this.enableCanvasPointerEvents();\n\n    // Remove global event listeners\n    if (this.mouseMoveHandler) {\n      document.removeEventListener('mousemove', this.mouseMoveHandler);\n      this.mouseMoveHandler = undefined;\n    }\n    if (this.mouseUpHandler) {\n      document.removeEventListener('mouseup', this.mouseUpHandler);\n      this.mouseUpHandler = undefined;\n    }\n  }\n\n  toggleMinimize() {\n    this.isMinimized = !this.isMinimized;\n\n    if (this.isMinimized) {\n      // Store the current height before minimizing\n      this.originalHeight = this.size.height;\n      // Set height to just the header height (approximately 60px)\n      this.size.height = 60;\n    } else {\n      // Restore the original height\n      this.size.height = this.originalHeight;\n    }\n  }\n\n  /*   closePanel() {\n      this.isVisible.set(false);\n    }\n  \n    showPanel() {\n      this.isVisible.set(true);\n    } */\n\n  private disableCanvasPointerEvents() {\n    // Disable pointer events on canvas components during drag\n    const canvasComponents = document.querySelectorAll('.canvas-component');\n    canvasComponents.forEach((component: Element) => {\n      (component as HTMLElement).style.pointerEvents = 'none';\n    });\n  }\n\n  private enableCanvasPointerEvents() {\n    // Re-enable pointer events on canvas components after drag\n    const canvasComponents = document.querySelectorAll('.canvas-component');\n    canvasComponents.forEach((component: Element) => {\n      (component as HTMLElement).style.pointerEvents = '';\n    });\n  }\n\n  private bringToFront() {\n    // Remove selected class from all panels\n    const allPanels = document.querySelectorAll('.floating-panel');\n    allPanels.forEach(panel => {\n      panel.classList.remove('selected');\n    });\n\n    // Add selected class to this panel\n    this.panelContainer.nativeElement.classList.add('selected');\n  }\n}","<div #panelContainer class=\"floating-panel\" [class.minimized]=\"isMinimized\" [style.width.px]=\"size.width\"\n  [style.height.px]=\"size.height\" [style.--panel-height.px]=\"size.height\" (mousedown)=\"onMouseDown($event)\">\n  <mat-card class=\"panel-card\">\n    <!-- Panel Header with Drag Handle -->\n    <div #dragHandle class=\"panel-header\">\n      <div class=\"drag-handle-icon\">\n        <mat-icon>drag_indicator</mat-icon>\n      </div>\n      <h3 class=\"panel-title\">{{ title }}</h3>\n      <div class=\"panel-actions\">\n        <button mat-icon-button (click)=\"toggleMinimize()\">\n          <mat-icon>{{ isMinimized ? 'expand_more' : 'expand_less' }}</mat-icon>\n        </button>\n        <!-- <button mat-icon-button (click)=\"closePanel()\">\n          <mat-icon>close</mat-icon>\n        </button> -->\n      </div>\n    </div>\n\n    <!-- Panel Content -->\n    <div class=\"panel-content\" [style.opacity]=\"isMinimized ? '0' : '1'\" [style.height]=\"isMinimized ? '0' : '100%'\"\n      [style.overflow]=\"isMinimized ? 'hidden' : 'auto'\">\n      <ng-content></ng-content>\n    </div>\n\n  </mat-card>\n</div>","import { ChangeDetectionStrategy, Component, computed, input, output, signal } from '@angular/core';\n\nimport { MatIconModule } from '@angular/material/icon';\nimport { EruComponent } from '../../models';\n\n@Component({\n  selector: 'eru-layer-tree-item',\n  standalone: true,\n  imports: [MatIconModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './layer-tree-item.component.html',\n  styleUrl: './layer-tree-item.component.scss'\n})\nexport class LayerTreeItemComponent {\n  component = input.required<EruComponent>();\n  level = input<number>(0);\n  selectedId = input<string | null>(null);\n  hoveredId = input<string | null>(null);\n  forceExpanded = input<boolean>(false);\n\n  componentSelected = output<EruComponent>();\n  componentDeleted = output<string>();\n  dragStarted = output<{ event: DragEvent; component: EruComponent }>();\n  draggedOver = output<{ event: DragEvent; component: EruComponent }>();\n  dragLeft = output<DragEvent>();\n  dropped = output<{ event: DragEvent; component: EruComponent }>();\n  dragEnded = output<DragEvent>();\n  expandToggled = output<void>();\n\n  private userExpanded = signal<boolean | null>(null);\n\n  readonly expanded = computed(() => {\n    if (this.forceExpanded()) return true;\n    const user = this.userExpanded();\n    if (user !== null) return user;\n    return this.level() === 0;\n  });\n\n  toggleExpand(): void {\n    const current = this.expanded();\n    this.userExpanded.set(!current);\n    this.expandToggled.emit();\n  }\n\n  hasChildren(): boolean {\n    const children = this.component().children;\n    return !!(children && children.length > 0);\n  }\n\n  canDelete(): boolean {\n    if (this.component().isNested) {\n      return false;\n    }\n    return this.component().id !== 'root-container';\n  }\n\n  getIcon(): string {\n    const type = this.component().type;\n    const icons: Record<string, string> = {\n      text: 'text_fields',\n      button: 'smart_button',\n      image: 'image',\n      flex_container: 'view_column',\n      grid_container: 'grid_view',\n      custom_card: 'credit_card'\n    };\n    return icons[type] || 'widgets';\n  }\n\n  isContainer(): boolean {\n    const type = this.component().type;\n    return type === 'flex_container' || type === 'grid_container';\n  }\n\n  getName(): string {\n    return this.component().properties?.base?.name || '';\n  }\n\n  onSelect(event: Event): void {\n    event.stopPropagation();\n    this.componentSelected.emit(this.component());\n  }\n\n  onDelete(event: Event): void {\n    event.stopPropagation();\n    this.componentDeleted.emit(this.component().id);\n  }\n\n  onDragStart(event: DragEvent): void {\n    this.dragStarted.emit({ event, component: this.component() });\n  }\n\n  onDragOver(event: DragEvent): void {\n    this.draggedOver.emit({ event, component: this.component() });\n  }\n\n  onDragLeave(event: DragEvent): void {\n    this.dragLeft.emit(event);\n  }\n\n  onDrop(event: DragEvent): void {\n    this.dropped.emit({ event, component: this.component() });\n  }\n\n  onDragEnd(event: DragEvent): void {\n    this.dragEnded.emit(event);\n  }\n}\n","<div class=\"layer-tree-item\">\n  <div\n    class=\"layer-content\"\n    [class.selected]=\"selectedId() === component().id\"\n    [class.hovered]=\"hoveredId() === component().id\"\n    [class.eru-container]=\"isContainer()\"\n    [style.padding-left.px]=\"level() * 16\"\n    draggable=\"true\"\n    (click)=\"onSelect($event)\"\n    (dragstart)=\"onDragStart($event)\"\n    (dragover)=\"onDragOver($event)\"\n    (dragleave)=\"onDragLeave($event)\"\n    (drop)=\"onDrop($event)\"\n    (dragend)=\"onDragEnd($event)\">\n\n    @if (hasChildren()) {\n      <button\n        type=\"button\"\n        class=\"icon-btn expand-btn\"\n        (click)=\"toggleExpand(); $event.stopPropagation()\">\n        <mat-icon>{{ expanded() ? 'expand_more' : 'chevron_right' }}</mat-icon>\n      </button>\n    } @else {\n      <div class=\"expand-placeholder\"></div>\n    }\n\n    <mat-icon class=\"layer-icon\">{{ getIcon() }}</mat-icon>\n\n    <span class=\"layer-name\">{{ component().type }}</span>\n    @if (getName()) {\n      <span class=\"layer-prop-name\">{{ getName() }}</span>\n    }\n\n    <span class=\"layer-id\">{{ component().id }}</span>\n\n    <div class=\"layer-actions\">\n      @if (canDelete()) {\n        <button\n          type=\"button\"\n          class=\"icon-btn eru-action-btn delete-btn\"\n          (click)=\"onDelete($event)\"\n          title=\"Delete\">\n          <mat-icon>delete</mat-icon>\n        </button>\n      }\n    </div>\n  </div>\n\n  @if (hasChildren() && expanded()) {\n    <div class=\"layer-children\">\n      @for (child of component().children; track child.id) {\n        <eru-layer-tree-item\n          [component]=\"child\"\n          [level]=\"level() + 1\"\n          [selectedId]=\"selectedId()\"\n          [hoveredId]=\"hoveredId()\"\n          [forceExpanded]=\"forceExpanded()\"\n          (componentSelected)=\"componentSelected.emit($event)\"\n          (componentDeleted)=\"componentDeleted.emit($event)\"\n          (dragStarted)=\"dragStarted.emit($event)\"\n          (draggedOver)=\"draggedOver.emit($event)\"\n          (dragLeft)=\"dragLeft.emit($event)\"\n          (dropped)=\"dropped.emit($event)\"\n          (dragEnded)=\"dragEnded.emit($event)\"\n          (expandToggled)=\"expandToggled.emit()\">\n        </eru-layer-tree-item>\n      }\n    </div>\n  }\n</div>\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, OnDestroy, computed, effect, inject, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { EruStudioStore } from '../../services';\nimport { EruComponent } from '../../models';\nimport { LayerTreeItemComponent } from '../layer-tree-item/layer-tree-item.component';\n\n@Component({\n  selector: 'eru-layers-panel',\n  standalone: true,\n  imports: [FormsModule, MatIconModule, MatFormFieldModule, MatInputModule, LayerTreeItemComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './layers-panel.component.html',\n  styleUrl: './layers-panel.component.scss'\n})\nexport class LayersPanelComponent implements AfterViewInit, OnDestroy {\n  private store = inject(EruStudioStore);\n\n  readonly treeViewport = viewChild<ElementRef<HTMLDivElement>>('treeViewport');\n  readonly treeEl = viewChild<ElementRef<HTMLDivElement>>('tree');\n  readonly hscrollEl = viewChild<ElementRef<HTMLDivElement>>('hscroll');\n  readonly hspacerEl = viewChild<ElementRef<HTMLDivElement>>('hspacer');\n  readonly hscrollVisible = signal(false);\n\n  private resizeObserver: ResizeObserver | null = null;\n  private hscrollListener: ((e: Event) => void) | null = null;\n  private syncRafHandle: number | null = null;\n\n  readonly components = this.store.currentPageComponents;\n  readonly selectedComponent = this.store.selectedComponent;\n  readonly hoveredLayerId = signal<string | null>(null);\n  readonly searchTerm = signal<string>('');\n\n  readonly filteredComponents = computed<EruComponent[]>(() => {\n    const term = this.searchTerm().trim().toLowerCase();\n    const roots = this.components();\n    if (!term) return roots;\n    const result: EruComponent[] = [];\n    for (const root of roots) {\n      const filtered = this.filterNode(root, term);\n      if (filtered) result.push(filtered);\n    }\n    return result;\n  });\n\n  private filterNode(component: EruComponent, term: string): EruComponent | null {\n    const selfMatches = this.nodeMatches(component, term);\n    const filteredChildren: EruComponent[] = [];\n    for (const child of component.children || []) {\n      const filteredChild = this.filterNode(child, term);\n      if (filteredChild) filteredChildren.push(filteredChild);\n    }\n    if (!selfMatches && filteredChildren.length === 0) return null;\n    return { ...component, children: filteredChildren };\n  }\n\n  private nodeMatches(component: EruComponent, term: string): boolean {\n    if ((component.type || '').toLowerCase().includes(term)) return true;\n    if ((component.id || '').toLowerCase().includes(term)) return true;\n    const name = component.properties?.base?.name;\n    if (name && String(name).toLowerCase().includes(term)) return true;\n    return false;\n  }\n\n  private draggedComponentId: string | null = null;\n\n  /**\n   * Name shown on the page row: the page's title, its name, else a neutral\n   * label — a page saved without either should still be selectable.\n   */\n  readonly pageLabel = computed(() => {\n    const page = this.store.currentPage();\n    return page?.title?.trim() || page?.name?.trim() || 'Page';\n  });\n\n  /**\n   * Clear the component selection, which is what makes the properties panel\n   * fall back to the page's own properties.\n   */\n  selectPage(): void {\n    this.store.setSelectedComponent(null);\n  }\n\n  selectComponent(component: EruComponent): void {\n    this.store.setSelectedComponent(component);\n  }\n\n  deleteComponent(componentId: string): void {\n    if (componentId === 'root-container') {\n      return;\n    }\n    this.store.deleteComponent(componentId);\n  }\n\n  onDragStart(event: DragEvent, component: EruComponent): void {\n    this.draggedComponentId = component.id;\n    event.dataTransfer!.effectAllowed = 'move';\n    event.dataTransfer!.setData('application/json', JSON.stringify({\n      type: 'move',\n      component_id: component.id,\n      source: 'layers'\n    }));\n    this.store.startDrag(component);\n  }\n\n  onDragOver(event: DragEvent, component: EruComponent): void {\n    event.preventDefault();\n    event.stopPropagation();\n\n    if (this.draggedComponentId && this.draggedComponentId !== component.id) {\n      this.hoveredLayerId.set(component.id);\n      event.dataTransfer!.dropEffect = 'move';\n    }\n  }\n\n  onDragLeave(event: DragEvent): void {\n    event.stopPropagation();\n    this.hoveredLayerId.set(null);\n  }\n\n  onDrop(event: DragEvent, targetComponent: EruComponent): void {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const dragData = event.dataTransfer!.getData('application/json');\n    if (!dragData) return;\n\n    try {\n      const data = JSON.parse(dragData);\n      if (data.type === 'move' && data.component_id) {\n        this.moveComponentBeforeTarget(data.component_id, targetComponent.id);\n      }\n    } catch (error) {\n      console.error('Error parsing drag data:', error);\n    }\n\n    this.hoveredLayerId.set(null);\n    this.draggedComponentId = null;\n    this.store.endDrag();\n  }\n\n  onDragEnd(event: DragEvent): void {\n    event.stopPropagation();\n    this.hoveredLayerId.set(null);\n    this.draggedComponentId = null;\n    this.store.endDrag();\n  }\n\n  clearSearch(): void {\n    this.searchTerm.set('');\n  }\n\n  onExpandToggled(): void {\n    this.scheduleSync();\n  }\n\n  private scheduleSync(): void {\n    if (this.syncRafHandle !== null) return;\n    this.syncRafHandle = requestAnimationFrame(() => {\n      this.syncRafHandle = null;\n      this.runSync();\n    });\n  }\n\n  private runSync(): void {\n    const tree = this.treeEl()?.nativeElement;\n    const hscroll = this.hscrollEl()?.nativeElement;\n    const hspacer = this.hspacerEl()?.nativeElement;\n    const viewport = this.treeViewport()?.nativeElement;\n    if (!tree || !hscroll || !hspacer) return;\n    const contentWidth = tree.scrollWidth;\n    const viewportWidth = viewport?.clientWidth ?? 0;\n    hspacer.style.width = contentWidth + 'px';\n    const needsScroll = contentWidth > viewportWidth + 1;\n    if (this.hscrollVisible() !== needsScroll) {\n      this.hscrollVisible.set(needsScroll);\n    }\n    if (!needsScroll) {\n      tree.style.transform = 'translateX(0px)';\n      hscroll.scrollLeft = 0;\n    }\n  }\n\n  constructor() {\n    effect(() => {\n      this.filteredComponents();\n      this.searchTerm();\n      this.scheduleSync();\n    });\n  }\n\n  ngAfterViewInit(): void {\n    const tree = this.treeEl()?.nativeElement;\n    const hscroll = this.hscrollEl()?.nativeElement;\n    const viewport = this.treeViewport()?.nativeElement;\n    if (!tree || !hscroll) return;\n\n    this.resizeObserver = new ResizeObserver(() => this.scheduleSync());\n    if (viewport) this.resizeObserver.observe(viewport);\n\n    this.hscrollListener = () => {\n      tree.style.transform = `translateX(${-hscroll.scrollLeft}px)`;\n    };\n    hscroll.addEventListener('scroll', this.hscrollListener, { passive: true });\n\n    this.scheduleSync();\n  }\n\n  ngOnDestroy(): void {\n    this.resizeObserver?.disconnect();\n    if (this.syncRafHandle !== null) {\n      cancelAnimationFrame(this.syncRafHandle);\n      this.syncRafHandle = null;\n    }\n    const hscroll = this.hscrollEl()?.nativeElement;\n    if (hscroll && this.hscrollListener) {\n      hscroll.removeEventListener('scroll', this.hscrollListener);\n    }\n  }\n\n  private moveComponentBeforeTarget(sourceId: string, targetId: string): void {\n    this.store.moveComponentBeforeTarget(sourceId, targetId);\n  }\n}\n","<div class=\"layers-panel\">\n  <div class=\"layers-search\">\n    <mat-icon class=\"search-icon\">search</mat-icon>\n    <input\n      type=\"text\"\n      class=\"eru-search-input\"\n      placeholder=\"Search by type, name or id\"\n      [ngModel]=\"searchTerm()\"\n      (ngModelChange)=\"searchTerm.set($event)\" />\n    @if (searchTerm()) {\n      <button\n        type=\"button\"\n        class=\"clear-btn\"\n        (click)=\"clearSearch()\"\n        title=\"Clear search\">\n        <mat-icon>close</mat-icon>\n      </button>\n    }\n  </div>\n\n  <!-- The page itself, as the root of the tree. Selecting a component replaces\n       the properties panel with that component's properties, and before this\n       row there was nothing to click to get back to the page's own — the panel\n       falls back to page properties only when the selection is null. -->\n  <div\n    class=\"page-row\"\n    [class.selected]=\"!selectedComponent()\"\n    (click)=\"selectPage()\"\n    title=\"Select the page to edit its properties\">\n    <mat-icon class=\"page-row-icon\">web</mat-icon>\n    <span class=\"page-row-name\">{{ pageLabel() }}</span>\n    <span class=\"page-row-tag\">page</span>\n  </div>\n\n  @if (components().length === 0) {\n    <div class=\"empty-state\">\n      <mat-icon>layers</mat-icon>\n      <h3>No Components</h3>\n      <p>Add components to see the layer hierarchy</p>\n    </div>\n  } @else if (filteredComponents().length === 0) {\n    <div class=\"empty-state empty-state-small\">\n      <mat-icon>search_off</mat-icon>\n      <p>No components match \"{{ searchTerm() }}\"</p>\n    </div>\n  } @else {\n    <div class=\"layers-tree-viewport\" #treeViewport>\n      <div class=\"layers-tree\" #tree>\n        @for (component of filteredComponents(); track component.id) {\n          <eru-layer-tree-item\n            [component]=\"component\"\n            [level]=\"0\"\n            [selectedId]=\"selectedComponent()?.id || null\"\n            [hoveredId]=\"hoveredLayerId()\"\n            [forceExpanded]=\"!!searchTerm()\"\n            (componentSelected)=\"selectComponent($event)\"\n            (componentDeleted)=\"deleteComponent($event)\"\n            (dragStarted)=\"onDragStart($event.event, $event.component)\"\n            (draggedOver)=\"onDragOver($event.event, $event.component)\"\n            (dragLeft)=\"onDragLeave($event)\"\n            (dropped)=\"onDrop($event.event, $event.component)\"\n            (dragEnded)=\"onDragEnd($event)\"\n            (expandToggled)=\"onExpandToggled()\">\n          </eru-layer-tree-item>\n        }\n      </div>\n    </div>\n    <div class=\"layers-hscroll\" [class.visible]=\"hscrollVisible()\" #hscroll>\n      <div class=\"layers-hscroll-spacer\" #hspacer></div>\n    </div>\n  }\n</div>\n","import { Component } from '@angular/core';\n\n\n@Component({\n  selector: 'eru-assets-panel',\n  standalone: true,\n  imports: [],\n  templateUrl: './assets-panel.component.html',\n  styleUrl: './assets-panel.component.scss'\n})\nexport class AssetsPanelComponent {}\n","<div class=\"text-center py-8 text-gray-500\">\n  <div class=\"text-4xl mb-4\">🖼️</div>\n  <h3 class=\"text-lg font-medium mb-2\">Assets</h3>\n  <p class=\"text-sm\">Images and files will appear here</p>\n</div>\n","import { Component, inject, computed, signal } from '@angular/core';\n\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { FormsModule } from '@angular/forms';\nimport { ComponentRegistryService, EruStudioStore } from '../../services';\nimport { LayersPanelComponent } from '../layers-panel/layers-panel.component';\nimport { AssetsPanelComponent } from '../assets-panel/assets-panel.component';\n\n@Component({\n  selector: 'eru-component-palette',\n  standalone: true,\n  imports: [\n    MatTabsModule,\n    MatIconModule,\n    MatButtonModule,\n    MatExpansionModule,\n    MatFormFieldModule,\n    MatInputModule,\n    FormsModule,\n    LayersPanelComponent,\n    AssetsPanelComponent\n],\n  templateUrl: './component-palette.component.html',\n  styleUrl: './component-palette.component.scss'\n})\nexport class ComponentPaletteComponent {\n  private store = inject(EruStudioStore);\n  private componentRegistry = inject(ComponentRegistryService);\n\n  readonly ui = this.store.ui;\n  readonly searchQuery = signal('');\n\n  readonly selectedTabIndex = computed(() => {\n    const tabMap = { components: 0, layers: 1, assets: 2 };\n    return tabMap[this.ui().selected_tab] || 0;\n  });\n\n  readonly componentCategories = computed(() => {\n    const query = this.searchQuery().trim();\n\n    if (query) {\n      const searchResults = this.componentRegistry.searchComponents(query);\n      if (searchResults.length === 0) {\n        return [];\n      }\n      return [{\n        name: 'search',\n        label: `Search Results (${searchResults.length})`,\n        icon: 'search',\n        components: searchResults,\n        expanded: true\n      }];\n    }\n\n    const categoryMap = this.componentRegistry.getAllCategories();\n\n    return Array.from(categoryMap.entries()).map(([category, components]) => ({\n      name: category,\n      label: this.getCategoryLabel(category),\n      icon: this.getCategoryIcon(category),\n      components: components,\n      expanded: category === 'basic'\n    }));\n  });\n\n  onSearchChange(query: string): void {\n    this.searchQuery.set(query);\n  }\n\n  clearSearch(): void {\n    this.searchQuery.set('');\n  }\n\n  onTabChange(event: any): void {\n    const tabNames = ['components', 'layers', 'assets'] as const;\n    this.store.setSelectedTab(tabNames[event.index]);\n  }\n\n  private getCategoryLabel(category: string): string {\n    const labels = {\n      basic: 'Basic',\n      layout: 'Layout',\n      form: 'Forms',\n      data: 'Data',\n      navigation: 'Navigation',\n      media: 'Media',\n      eru: 'Eru Components',\n      loading: 'Loading'\n    };\n    return labels[category as keyof typeof labels] || category;\n  }\n\n  private getCategoryIcon(category: string): string {\n    const icons = {\n      basic: 'widgets',\n      layout: 'view_module',\n      form: 'assignment',\n      data: 'table_chart',\n      navigation: 'menu',\n      media: 'image',\n      eru: 'apps',\n      loading: 'blur_on'\n    };\n    return icons[category as keyof typeof icons] || 'folder';\n  }\n\n  onDragStart(event: DragEvent, component: any): void {\n    if (event.dataTransfer) {\n      event.dataTransfer.setData('application/json', JSON.stringify({\n        type: 'component',\n        component_type: component.type,\n        component_definition: component\n      }));\n      event.dataTransfer.effectAllowed = 'move';\n    }\n    this.store.startDrag({ type: 'component', component_type: component.type });\n  }\n\n  onDragEnd(): void {\n    this.store.endDrag();\n  }\n}\n","<div class=\"component-palette-container\">\n  <!-- Header -->\n  <!-- Tabs -->\n  <mat-tab-group class=\"tab-group\" [selectedIndex]=\"selectedTabIndex()\" (selectedTabChange)=\"onTabChange($event)\">\n    <!-- Components Tab -->\n    <mat-tab label=\"List\">\n      <div class=\"p-4\">\n        <!-- Search Bar -->\n        <mat-form-field appearance=\"outline\" class=\"w-full mb-4\">\n          <mat-label>Search components</mat-label>\n          <input\n            matInput\n            [value]=\"searchQuery()\"\n            (input)=\"onSearchChange($any($event.target).value)\"\n            placeholder=\"Type to search...\">\n          <mat-icon matPrefix>search</mat-icon>\n          @if (searchQuery()) {\n            <button mat-icon-button matSuffix (click)=\"clearSearch()\">\n              <mat-icon>close</mat-icon>\n            </button>\n          }\n        </mat-form-field>\n\n        <!-- Component Categories -->\n        @if (componentCategories().length === 0) {\n          <div class=\"no-results\">\n            <mat-icon>search_off</mat-icon>\n            <p>No components found for \"{{ searchQuery() }}\"</p>\n          </div>\n        } @else {\n          <mat-accordion multi=\"true\">\n          @for (category of componentCategories(); track category.name) {\n            <mat-expansion-panel [expanded]=\"category.expanded\">\n              <mat-expansion-panel-header >\n                <mat-panel-title class=\"flex items-center gap-2\">\n                  <mat-icon class=\"text-sm\">{{ category.icon }}</mat-icon>\n                  <span class=\"font-semibold text-sm\">{{ category.label }}</span>\n                  <span class=\"font-normal text-sm\">({{ category.components.length }})</span>\n                </mat-panel-title>\n              </mat-expansion-panel-header>\n\n              <!-- Component List -->\n              <div style=\"display: grid; grid-template-columns: repeat(1, 1fr); gap: 4px pt-4\">\n                @for (component of category.components; track component.type) {\n                  <div\n                    draggable=\"true\"\n                    (dragstart)=\"onDragStart($event, component)\"\n                    (dragend)=\"onDragEnd()\"\n                    class=\"component-grid-item flex items-center gap-2 p-2 hover:bg-gray-100 rounded cursor-pointer\"\n                    [title]=\"component.name\"\n                  >\n                    <mat-icon class=\"text-sm\">{{ component.icon }}</mat-icon>\n                    <span class=\"font-normal text-sm\">{{ component.name }}</span>\n                  </div>\n                }\n              </div>\n            </mat-expansion-panel>\n          }\n          </mat-accordion>\n        }\n      </div>\n    </mat-tab>\n\n    <!-- Layers Tab -->\n    <mat-tab label=\"Layers\">\n      <div class=\"tab-content-fill\">\n        <eru-layers-panel />\n      </div>\n    </mat-tab>\n\n    <!-- Assets Tab -->\n    <mat-tab label=\"Assets\">\n      <div class=\"p-4\">\n        <eru-assets-panel />\n      </div>\n    </mat-tab>\n  </mat-tab-group>\n</div>\n","import { Component, input, output, computed, inject, signal, ElementRef, ViewChild, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatAutocompleteModule, MatAutocompleteSelectedEvent, MatAutocompleteTrigger } from '@angular/material/autocomplete';\nimport { EruStudioStore } from '../../services/eru-studio.store';\nimport { EruComponent } from '../../models';\n\n@Component({\n    selector: 'eru-logic-editor',\n    standalone: true,\n    imports: [\n        CommonModule,\n        FormsModule,\n        ReactiveFormsModule,\n        MatFormFieldModule,\n        MatInputModule,\n        MatAutocompleteModule\n    ],\n    template: `\n    <mat-form-field appearance=\"outline\" class=\"w-full logic-editor-field\">\n      <mat-label>{{ label() }}</mat-label>\n      <textarea\n        matInput\n        [formControl]=\"control\"\n        [placeholder]=\"placeholder()\"\n        (input)=\"onInput($event)\"\n        (keydown)=\"onKeyDown($event)\"\n        #inputField\n        rows=\"2\"\n      ></textarea>\n      \n      <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelected($event)\">\n        @for (option of filteredOptions(); track option) {\n          <mat-option [value]=\"option\">\n            {{ option }}\n          </mat-option>\n        }\n      </mat-autocomplete>\n\n      <!-- Invisible trigger for autocomplete -->\n      <input\n        type=\"text\"\n        class=\"hidden-trigger\"\n        [matAutocomplete]=\"auto\"\n        #trigger=\"matAutocompleteTrigger\"\n        #triggerInput\n        style=\"width: 0; height: 0; visibility: hidden; position: absolute;\"\n      >\n      \n      @if (description()) {\n        <mat-hint>{{ description() }}</mat-hint>\n      }\n    </mat-form-field>\n  `,\n    styles: [`\n    .logic-editor-field {\n      width: 100%;\n      font-family: 'Roboto Mono', monospace;\n      font-size: 12px;\n    }\n    textarea {\n      resize: vertical;\n      min-height: 40px;\n    }\n    .text-primary-600 {\n      color: #2563eb;\n    }\n  `]\n})\nexport class LogicEditorComponent {\n    private store = inject(EruStudioStore);\n\n    readonly value = input<string>('');\n    readonly label = input<string>('Logic Expression');\n    readonly placeholder = input<string>(\"e.g. @type == 'Personal'\");\n    readonly description = input<string>('');\n    readonly valueChange = output<string>();\n\n    @ViewChild('inputField') inputField!: ElementRef<HTMLTextAreaElement>;\n    @ViewChild('triggerInput') triggerInputElement!: ElementRef<HTMLInputElement>;\n    @ViewChild(MatAutocompleteTrigger) autocompleteTrigger!: MatAutocompleteTrigger;\n\n    control = new FormControl('');\n\n    // Available component names for autocomplete\n    private allComponentNames = computed(() => {\n        const components = this.store.currentPageComponents();\n        const names = new Set<string>();\n\n        const extractNames = (comps: EruComponent[]) => {\n            comps.forEach(c => {\n                const name = c.properties?.base?.name;\n                if (name) names.add(name);\n                if (c.children) extractNames(c.children);\n            });\n        };\n\n        extractNames(components);\n        return Array.from(names).sort();\n    });\n\n    filteredOptions = signal<string[]>([]);\n    private mentionStartIndex = -1;\n    private capturedCaretPos = -1;\n    private mentionType: 'field' | 'operator' | 'conjunction' = 'field';\n\n    private readonly categories: Record<string, string[]> = {\n        'drop_down': ['in', 'not in', 'includes', 'does not include', 'is null', 'is not null'],\n        'textbox': ['is', 'is not', 'contains', 'does not contain', 'in', 'not in', 'includes', 'does not include', 'is null', 'is not null'],\n        'checkbox': ['is selected', 'is not selected', 'is null', 'is not null'],\n        'number': ['=', '<>', '<', '<=', '>', '>=', 'is null', 'is not null', 'between'],\n        'date': ['between', 'is', 'is not', 'is after', 'is after or equal', 'is before', 'is before or equal', 'is null', 'is not null']\n    };\n\n    // Available component info (name and type)\n    private allComponentsInfo = computed(() => {\n        const components = this.store.currentPageComponents();\n        const info = new Map<string, string>();\n\n        const extract = (comps: EruComponent[]) => {\n            comps.forEach(c => {\n                const name = c.properties?.base?.name;\n                if (name) info.set(name, c.type);\n                if (c.children) extract(c.children);\n            });\n        };\n\n        extract(components);\n        return info;\n    });\n\n    // Page-level state variables, offered in the @ dropdown as `state.<key>`\n    // (e.g. @state.program_data). Nested paths like @state.program_data.sts are\n    // typed by the user and resolved at evaluation time.\n    private stateVariableNames = computed(() => {\n        const page: any = this.store.currentPage?.();\n        const st = page?.state;\n        if (!Array.isArray(st)) return [];\n        return st\n            .map((s: any) => s?.key)\n            .filter((k: any) => typeof k === 'string' && k.length > 0)\n            .map((k: string) => `state.${k}`);\n    });\n\n    /**\n     * Entity metadata attributes, offered as `entity.<attr>` for the page's own\n     * entity and `entities.<name>.<attr>` for any other. Built from the keys the\n     * backend actually shipped on each entity rather than a fixed list, so a new\n     * flag is offered the moment the process metadata carries it. `fields` is\n     * skipped — it is the column array, not a scalar worth comparing against.\n     */\n    private entityAttributeNames = computed(() => {\n        const entities = this.store.entities();\n        if (!entities.length) return [];\n        const scalarKeys = (e: any) =>\n            Object.keys(e || {}).filter(k => k !== 'fields' && k !== 'tabs');\n\n        const out: string[] = [];\n        const pageEntityName = this.store.currentPage?.()?.entity_name || '';\n        const pageEntity = entities.find(e => e.name === pageEntityName);\n        if (pageEntity) {\n            scalarKeys(pageEntity).forEach(k => out.push(`entity.${k}`));\n        }\n        entities.forEach(e => {\n            if (!e?.name) return;\n            scalarKeys(e).forEach(k => out.push(`entities.${e.name}.${k}`));\n        });\n        return out;\n    });\n\n    private getTypeCategory(compType: string): string {\n        switch (compType) {\n            case 'select':\n            case 'multiselect':\n                return 'drop_down';\n            case 'checkbox':\n                return 'checkbox';\n            case 'number_input':\n                return 'number';\n            case 'datepicker':\n            case 'datetime_picker':\n            case 'time_picker':\n                return 'date';\n            default:\n                return 'textbox';\n        }\n    }\n\n    constructor() {\n        // Sync external value to control\n        effect(() => {\n            const val = this.value();\n            if (val !== this.control.value) {\n                this.control.setValue(val, { emitEvent: false });\n            }\n        });\n\n        // Handle internal value changes\n        this.control.valueChanges.subscribe(val => {\n            this.valueChange.emit(val || '');\n        });\n    }\n\n    private showAutocomplete() {\n        if (this.filteredOptions().length > 0) {\n            this.autocompleteTrigger.openPanel();\n        } else {\n            this.autocompleteTrigger.closePanel();\n        }\n    }\n\n    onInput(event: any) {\n        const textarea = this.inputField.nativeElement;\n        const caretPos = textarea.selectionStart;\n        const text = textarea.value;\n        const textBeforeCaret = text.substring(0, caretPos);\n\n        // 1. Scenario: Typing a field (@...)\n        const lastAtIndex = textBeforeCaret.lastIndexOf('@');\n        if (lastAtIndex !== -1) {\n            const partAfterAt = textBeforeCaret.substring(lastAtIndex + 1);\n            if (!partAfterAt.includes(' ')) {\n                this.mentionType = 'field';\n                this.mentionStartIndex = lastAtIndex;\n                this.capturedCaretPos = caretPos;\n                const filterValue = partAfterAt.toLowerCase();\n                const fields = [...Array.from(this.allComponentsInfo().keys()), ...this.stateVariableNames(), ...this.entityAttributeNames()].sort();\n                this.filteredOptions.set(fields.filter(f => f.toLowerCase().includes(filterValue)));\n                this.showAutocomplete();\n                return;\n            }\n        }\n\n        // 2. Scenario: Typing an operator (after @field_name )\n        const operatorMatch = textBeforeCaret.match(/@([a-zA-Z0-9_.]+)\\s+([a-zA-Z<>!=]*)$/);\n        if (operatorMatch) {\n            const fieldName = operatorMatch[1];\n            const partialOp = operatorMatch[2].toLowerCase();\n            const compType = this.allComponentsInfo().get(fieldName) || 'textbox';\n            const category = this.getTypeCategory(compType);\n            const operators = this.categories[category] || this.categories['textbox'];\n\n\n            this.mentionType = 'operator';\n            this.mentionStartIndex = caretPos - partialOp.length;\n            this.capturedCaretPos = caretPos;\n            this.filteredOptions.set(operators.filter(o => o.toLowerCase().includes(partialOp)));\n            this.showAutocomplete();\n            return;\n        }\n\n        // 3. Scenario: Typing a conjunction (AND/OR)\n        const conjunctionMatch = textBeforeCaret.match(/('\\s*|true\\s*|false\\s*|[0-9]\\s*|null\\s*|selected\\s*)\\s+([a-zA-Z]*)$/i);\n        if (conjunctionMatch) {\n            const partial = conjunctionMatch[2].toLowerCase();\n            this.mentionType = 'conjunction';\n            this.mentionStartIndex = caretPos - partial.length;\n            this.capturedCaretPos = caretPos;\n            this.filteredOptions.set(['AND', 'OR'].filter(c => c.toLowerCase().includes(partial)));\n            this.showAutocomplete();\n            return;\n        }\n\n        this.autocompleteTrigger.closePanel();\n        this.mentionStartIndex = -1;\n    }\n\n    onKeyDown(event: KeyboardEvent) {\n        // If autocomplete is open, let it handle navigation keys\n        if (this.autocompleteTrigger.panelOpen) {\n            const key = event.key;\n            if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter' || key === 'Tab' || key === 'Escape') {\n\n                // Special case: Up arrow on the first option closes the panel and returns focus to textarea\n                if (key === 'ArrowUp') {\n                    const activeOption = this.autocompleteTrigger.autocomplete.options.find(opt => opt.active);\n                    const firstOption = this.autocompleteTrigger.autocomplete.options.first;\n                    if (activeOption === firstOption) {\n                        this.autocompleteTrigger.closePanel();\n                        return;\n                    }\n                }\n\n                event.preventDefault();\n                event.stopPropagation();\n\n                // Create a synthetic event to proxy to the hidden input\n                const proxyEvent = new KeyboardEvent('keydown', {\n                    key: event.key,\n                    code: event.code,\n                    keyCode: event.keyCode,\n                    which: event.which,\n                    bubbles: true,\n                    cancelable: true\n                });\n\n                this.triggerInputElement.nativeElement.dispatchEvent(proxyEvent);\n                return;\n            }\n        }\n    }\n\n    onSelected(event: MatAutocompleteSelectedEvent) {\n        let selectedValue = event.option.value;\n        const textarea = this.inputField.nativeElement;\n        const text = this.control.value || '';\n\n        if (this.mentionStartIndex !== -1 && this.capturedCaretPos !== -1) {\n            const before = text.substring(0, this.mentionStartIndex);\n            const after = text.substring(this.capturedCaretPos);\n\n            const prefix = this.mentionType === 'field' ? '@' : '';\n            let suffix = ' ';\n            let selectionOffset = -1;\n            let selectionLength = 0;\n\n            // Special handling for 'between' operator to auto-populate placeholders\n            if (this.mentionType === 'operator' && selectedValue === 'between') {\n                selectedValue = \"between val1 AND val2\";\n                selectionOffset = before.length + \"between \".length;\n                selectionLength = \"val1\".length;\n            }\n\n            const newText = before + prefix + selectedValue + suffix + after;\n\n            this.control.setValue(newText);\n\n            // Set caret position after the inserted item\n            setTimeout(() => {\n                textarea.focus();\n\n                if (selectionOffset !== -1) {\n                    // Highlight the first placeholder (val1)\n                    textarea.setSelectionRange(selectionOffset, selectionOffset + selectionLength);\n                } else {\n                    const newPos = before.length + prefix.length + selectedValue.length + suffix.length;\n                    textarea.setSelectionRange(newPos, newPos);\n                }\n\n                // If we just added a field, trigger operator suggestions immediately\n                if (this.mentionType === 'field') {\n                    this.onInput({});\n                }\n            });\n        }\n\n        this.mentionStartIndex = -1;\n        this.capturedCaretPos = -1;\n    }\n}\n","import { Component, input, output, computed, signal } from '@angular/core';\nimport { parsePayloadField } from '../../utils/payload-field.util';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatChipsModule, MatChipInputEvent } from '@angular/material/chips';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SelectOption } from '../../models';\n\n/**\n * Picker for the `source:path` strings an action sends as its payload.\n *\n * A plain multi-select cannot express app state: app state has no declared\n * schema — a key exists only because an `update-state` action wrote it — so at\n * design time the key an author wants to send may not exist anywhere yet. This\n * accepts free text for that case and stores it as `app:<key>`, which\n * `EruStudioStore.resolveApiPayloadFields` already resolves at runtime (and\n * drops when the key is absent).\n */\n@Component({\n  selector: 'eru-payload-fields-picker',\n  standalone: true,\n  imports: [\n    MatFormFieldModule,\n    MatInputModule,\n    MatChipsModule,\n    MatAutocompleteModule,\n    MatIconModule,\n    MatTooltipModule\n  ],\n  templateUrl: './payload-fields-picker.component.html',\n  styleUrl: './payload-fields-picker.component.scss'\n})\nexport class PayloadFieldsPickerComponent {\n  readonly value = input<string[]>([]);\n  readonly options = input<SelectOption[]>([]);\n  readonly label = input<string>('');\n  readonly placeholder = input<string>('Select or type an app state key');\n  readonly disabled = input<boolean>(false);\n  readonly valueChange = output<string[]>();\n\n  protected typed = signal<string>('');\n\n  private readonly selected = computed(() => new Set(this.value() || []));\n\n  /**\n   * What has been typed, split into the alias being named and the text still\n   * searching for a field.\n   *\n   * Authors write the rename the way it reads — `entity_id = ` and then pick\n   * the variable — so once the `=` was typed the whole string was matched\n   * against the options, nothing matched, and the list went empty exactly when\n   * it was needed. The alias is held aside and only the remainder searches.\n   *\n   * Either order is accepted: the side carrying a `source:path` is the field,\n   * the other is the alias. On selection it is stored field-first.\n   */\n  private readonly parsedInput = computed<{ alias: string; query: string }>(() => {\n    const raw = this.typed();\n    const eq = raw.lastIndexOf('=');\n    if (eq < 0) return { alias: '', query: raw.trim() };\n    const before = raw.substring(0, eq).trim();\n    const after = raw.substring(eq + 1).trim();\n    // The half that names a source is the field; the other half is the alias.\n    if (before.includes(':')) return { alias: after, query: before };\n    if (after.includes(':')) return { alias: before, query: after };\n    // Neither half is written `source:path`, which is the ordinary case: the\n    // list labels variables by bare key, so that is what an author types. Let a\n    // known variable name settle which side is which, so `rff_params = params`\n    // reads as it looks instead of searching for a variable called 'params'\n    // and silently keeping the original key.\n    if (this.namesOption(before) && !this.namesOption(after)) return { alias: after, query: before };\n    return { alias: before, query: after };\n  });\n\n  /** Whether typed text names a listed variable — by its key or its label. */\n  private namesOption(text: string): boolean {\n    const t = text.trim().toLowerCase();\n    if (!t) return false;\n    return (this.options() || []).some(o => {\n      const value = String(o.value);\n      return value.substring(value.indexOf(':') + 1).toLowerCase() === t\n        || String(o.label).toLowerCase() === t;\n    });\n  }\n\n  /** Unselected known options, narrowed to what the author has typed. */\n  protected readonly filtered = computed<SelectOption[]>(() => {\n    const chosen = this.selected();\n    const q = this.parsedInput().query.toLowerCase();\n    return (this.options() || [])\n      .filter(o => !chosen.has(String(o.value)))\n      .filter(o => !q\n        || String(o.value).toLowerCase().includes(q)\n        || String(o.label).toLowerCase().includes(q));\n  });\n\n  /**\n   * `app:<key>` for typed text that matches no known option, so an app state\n   * variable that does not exist yet can still be named. A typed `source:path`\n   * is kept verbatim; a bare word is treated as an app state key, since state\n   * and page keys are all listable at design time and app keys are not.\n   */\n  protected readonly newField = computed<string | null>(() => {\n    const { alias, query } = this.parsedInput();\n    if (!query) return null;\n    // A query that names a listed variable is that variable — offering an\n    // `app:` twin of it alongside the real option only invites picking the one\n    // that resolves to nothing.\n    if (this.namesOption(query)) return null;\n    const field = this.withAlias(query.includes(':') ? query : `app:${query}`, alias);\n    if (this.selected().has(field)) return null;\n    if ((this.options() || []).some(o => String(o.value).toLowerCase() === field.toLowerCase())) return null;\n    return field;\n  });\n\n  /** Store the rename field-first, whichever way round it was typed. */\n  private withAlias(field: string, alias: string): string {\n    return alias ? `${field}=${alias}` : field;\n  }\n\n  protected chipLabel(field: string): string {\n    const known = (this.options() || []).find(o => String(o.value) === field);\n    if (known) return known.label;\n    // `source:path=alias` — show the alias, since the key the payload is sent\n    // under is the thing an author is checking when they look at the chip.\n    const parsed = parsePayloadField(field);\n    if (parsed) {\n      const renamed = parsed.key !== parsed.path.split('.').pop();\n      const label = renamed ? `${parsed.path} → ${parsed.key}` : parsed.path;\n      return parsed.source === 'app' ? `${label} (app state)` : label;\n    }\n    const idx = field.indexOf(':');\n    const key = idx < 0 ? field : field.substring(idx + 1);\n    return `${key} (app state)`;\n  }\n\n  protected add(field: string | null): void {\n    if (!field || this.disabled()) return;\n    // A field picked from the list carries no alias of its own, so the one\n    // being typed alongside it is applied here.\n    const withAlias = field.includes('=') ? field : this.withAlias(field, this.parsedInput().alias);\n    this.typed.set('');\n    if (this.selected().has(withAlias)) return;\n    this.valueChange.emit([...(this.value() || []), withAlias]);\n  }\n\n  protected addTyped(event: MatChipInputEvent): void {\n    const field = this.newField();\n    event.chipInput?.clear();\n    this.add(field);\n  }\n\n  protected remove(field: string): void {\n    if (this.disabled()) return;\n    this.valueChange.emit((this.value() || []).filter(f => f !== field));\n  }\n}\n","<mat-form-field appearance=\"outline\" class=\"payload-fields-picker\">\n  @if (label()) {\n  <mat-label>{{ label() }}</mat-label>\n  }\n  <mat-chip-grid #chipGrid [disabled]=\"disabled()\">\n    @for (field of value(); track field) {\n    <mat-chip-row (removed)=\"remove(field)\" [disabled]=\"disabled()\" [matTooltip]=\"field\"\n      matTooltipPosition=\"above\">\n      {{ chipLabel(field) }}\n      <button matChipRemove [disabled]=\"disabled()\" [attr.aria-label]=\"'Remove ' + chipLabel(field)\">\n        <mat-icon>cancel</mat-icon>\n      </button>\n    </mat-chip-row>\n    }\n  </mat-chip-grid>\n  <input [matChipInputFor]=\"chipGrid\" [matAutocomplete]=\"payloadFieldAuto\" [value]=\"typed()\"\n    (input)=\"typed.set($any($event.target).value)\" (matChipInputTokenEnd)=\"addTyped($event)\"\n    [disabled]=\"disabled()\" [placeholder]=\"placeholder()\">\n  <mat-autocomplete #payloadFieldAuto=\"matAutocomplete\" (optionSelected)=\"add($event.option.value)\">\n    @for (option of filtered(); track option.value) {\n    <mat-option [value]=\"option.value\">{{ option.label }}</mat-option>\n    }\n    @if (newField()) {\n    <mat-option [value]=\"newField()\">Add \"{{ newField() }}\"</mat-option>\n    }\n  </mat-autocomplete>\n</mat-form-field>\n","import { untracked, Component, input, output, computed, inject, OnInit, effect, signal } from '@angular/core';\n\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { entityFieldValueColors, parseChartValueColors } from '../../utils/chart-data.util';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { PropertySchema, SelectOption, ColorRange } from '../../models';\nimport { MenuItemDef, STRUCTURAL_ITEM_KINDS, parseMenuItems } from '../../utils/menu-item.util';\nimport { EruStudioStore } from '../../services';\nimport { LogicEditorComponent } from '../logic-editor/logic-editor.component';\nimport { PayloadFieldsPickerComponent } from '../payload-fields-picker/payload-fields-picker.component';\n@Component({\n  selector: 'eru-property-editor',\n  standalone: true,\n  imports: [\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatSlideToggleModule,\n    MatRadioModule,\n    MatAutocompleteModule,\n    MatDatepickerModule,\n    MatNativeDateModule,\n    LogicEditorComponent,\n    PayloadFieldsPickerComponent\n  ],\n  templateUrl: './property-editor.component.html',\n  styleUrl: './property-editor.component.scss'\n})\nexport class PropertyEditorComponent implements OnInit {\n  protected store = inject(EruStudioStore);\n  readonly schema = input.required<PropertySchema>();\n  readonly value = input<any>();\n  readonly componentId = input<string | undefined>();\n  readonly disabled = input<boolean>(false);\n  readonly valueChange = output<any>();\n\n  protected autocompleteInputValue = signal<string>('');\n  private lastRequestId = signal<string | null>(null);\n  private lastRequestKey = signal<string | null>(null);\n\n  readonly colorRangeFields: { key: 'color' | 'background'; label: string }[] = [\n    { key: 'color', label: 'Text' },\n    { key: 'background', label: 'Fill' }\n  ];\n\n  readonly colorTokens = [\n    { label: 'Primary', value: 'var(--studio-primary)' },\n    { label: 'On Primary', value: 'var(--studio-on-primary)' },\n    { label: 'Primary Container', value: 'var(--studio-primary-container)' },\n    { label: 'On Primary Container', value: 'var(--studio-on-primary-container)' },\n    { label: 'Secondary', value: 'var(--studio-secondary)' },\n    { label: 'On Secondary', value: 'var(--studio-on-secondary)' },\n    { label: 'Secondary Container', value: 'var(--studio-secondary-container)' },\n    { label: 'On Secondary Container', value: 'var(--studio-on-secondary-container)' },\n    { label: 'Tertiary', value: 'var(--studio-tertiary)' },\n    { label: 'On Tertiary', value: 'var(--studio-on-tertiary)' },\n    { label: 'Tertiary Container', value: 'var(--studio-tertiary-container)' },\n    { label: 'On Tertiary Container', value: 'var(--studio-on-tertiary-container)' },\n    { label: 'Surface', value: 'var(--studio-surface)' },\n    { label: 'Surface Variant', value: 'var(--studio-surface-variant)' },\n    { label: 'Surface Container', value: 'var(--studio-surface-container)' },\n    { label: 'Surface Container High', value: 'var(--studio-surface-container-high)' },\n    { label: 'On Surface', value: 'var(--studio-on-surface)' },\n    { label: 'On Surface Variant', value: 'var(--studio-on-surface-variant)' },\n    { label: 'Outline', value: 'var(--studio-outline)' },\n    { label: 'Outline Variant', value: 'var(--studio-outline-variant)' },\n    { label: 'Error', value: 'var(--studio-error)' },\n    { label: 'Error Container', value: 'var(--studio-error-container)' },\n    { label: 'Base Surface (white/dark)', value: 'var(--studio-base-surface)' },\n    { label: 'Base On Surface (black/light)', value: 'var(--studio-base-on-surface)' },\n    { label: 'Base Border', value: 'var(--studio-base-border)' },\n  ];\n\n  /** Extract a `var(--studio-*)` token from a plain token value or a\n   *  color-mix(in srgb, <token> N%, transparent) wrapper. Null if not a token. */\n  private extractToken(v: any): string | null {\n    if (typeof v !== 'string') return null;\n    const s = v.trim();\n    if (s.startsWith('var(--studio-')) return s;\n    const m = s.match(/^color-mix\\(\\s*in\\s+srgb\\s*,\\s*(var\\(--studio-[^)]+\\))\\s+[\\d.]+%\\s*,\\s*transparent\\s*\\)$/i);\n    return m ? m[1] : null;\n  }\n\n  readonly isTokenColor = computed(() => this.extractToken(this.value()) !== null);\n\n  /** The token to preselect in the token dropdown ('' when custom). */\n  readonly tokenSelectValue = computed(() => this.extractToken(this.value()) || '');\n\n  readonly hexColorValue = computed(() => {\n    const v = this.value();\n    if (!v || (typeof v === 'string' && (v.startsWith('var(') || v.startsWith('color-mix')))) return '#000000';\n    const rgba = this.parseColor(v);\n    return rgba ? this.toHex(rgba.r, rgba.g, rgba.b) : '#000000';\n  });\n\n  /** Current alpha as a 0–100 percentage (100 = fully opaque). */\n  readonly alphaValue = computed(() => {\n    const v = this.value();\n    const mix = typeof v === 'string' && v.match(/color-mix\\(.+\\s([\\d.]+)%\\s*,\\s*transparent\\s*\\)\\s*$/i);\n    if (mix) return Math.max(0, Math.min(100, Math.round(Number(mix[1]))));\n    if (!v || (typeof v === 'string' && v.startsWith('var('))) return 100;\n    const rgba = this.parseColor(v);\n    return rgba ? Math.round(rgba.a * 100) : 100;\n  });\n\n  private parseColor(v: any): { r: number; g: number; b: number; a: number } | null {\n    if (typeof v !== 'string') return null;\n    const s = v.trim();\n    const rgbaMatch = s.match(/^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)$/i);\n    if (rgbaMatch) {\n      return {\n        r: Math.min(255, Math.round(Number(rgbaMatch[1]))),\n        g: Math.min(255, Math.round(Number(rgbaMatch[2]))),\n        b: Math.min(255, Math.round(Number(rgbaMatch[3]))),\n        a: rgbaMatch[4] !== undefined ? Math.max(0, Math.min(1, Number(rgbaMatch[4]))) : 1\n      };\n    }\n    let hex = s.replace('#', '');\n    if (hex.length === 3) hex = hex.split('').map(c => c + c).join('');\n    if (hex.length === 6 || hex.length === 8) {\n      const r = parseInt(hex.slice(0, 2), 16);\n      const g = parseInt(hex.slice(2, 4), 16);\n      const b = parseInt(hex.slice(4, 6), 16);\n      const a = hex.length === 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1;\n      if (![r, g, b].some(isNaN)) return { r, g, b, a };\n    }\n    return null;\n  }\n\n  private toHex(r: number, g: number, b: number): string {\n    const h = (n: number) => n.toString(16).padStart(2, '0');\n    return `#${h(r)}${h(g)}${h(b)}`;\n  }\n\n  /** Emit a color, using rgba() only when there is real transparency. */\n  private emitColor(r: number, g: number, b: number, a: number): void {\n    if (a >= 1) {\n      this.valueChange.emit(this.toHex(r, g, b));\n    } else {\n      const alpha = Math.round(a * 100) / 100;\n      this.valueChange.emit(`rgba(${r},${g},${b},${alpha})`);\n    }\n  }\n\n  /** Token color with optional opacity via color-mix (theme-reactive). */\n  private composeTokenColor(token: string, a: number): string {\n    if (a >= 1) return token;\n    return `color-mix(in srgb, ${token} ${Math.round(a * 100)}%, transparent)`;\n  }\n\n  onColorHexChange(event: any): void {\n    const rgba = this.parseColor(event.target.value) || { r: 0, g: 0, b: 0, a: 1 };\n    const a = this.alphaValue() / 100;\n    this.emitColor(rgba.r, rgba.g, rgba.b, a);\n  }\n\n  onOpacityChange(event: any): void {\n    const pct = Math.max(0, Math.min(100, Number(event.target.value)));\n    const token = this.extractToken(this.value());\n    if (token) {\n      this.valueChange.emit(this.composeTokenColor(token, pct / 100));\n      return;\n    }\n    const rgba = this.parseColor(this.value()) || { r: 0, g: 0, b: 0, a: 1 };\n    this.emitColor(rgba.r, rgba.g, rgba.b, pct / 100);\n  }\n\n  onColorTokenChange(tokenValue: string): void {\n    const a = this.alphaValue() / 100;\n    if (tokenValue) {\n      this.valueChange.emit(this.composeTokenColor(tokenValue, a));\n    } else {\n      const rgba = this.parseColor(this.hexColorValue()) || { r: 0, g: 0, b: 0, a: 1 };\n      this.emitColor(rgba.r, rgba.g, rgba.b, a);\n    }\n  }\n\n  readonly widthClass = computed(() => {\n    const width = this.schema().width;\n    return (width === 2 || width === 'full') ? 'span-2' : 'span-1';\n  });\n\n  readonly options = computed(() => {\n    const dynamicOptions = this.schema().dynamic_options;\n    const componentId = this.componentId();\n\n    const responses = this.store.dynamicDataResponses();\n    if (dynamicOptions) {\n      if (componentId) {\n        // 1. Check our own tracked request\n        const currentReqId = this.lastRequestId();\n        if (currentReqId && this.lastRequestKey() === dynamicOptions) {\n          const response = responses.get(currentReqId);\n          if (Array.isArray(response)) return response;\n        }\n\n        // 2. Check any existing request for this component+type (e.g. made by the host component itself)\n        const allRequests = this.store.dynamicDataRequests();\n        for (const [reqId, req] of allRequests.entries()) {\n          if (req.componentId === componentId && req.type === dynamicOptions) {\n            const resp = responses.get(reqId);\n            if (Array.isArray(resp)) return resp;\n            // Request exists but response not yet available — wait, don't wipe it\n            return [];\n          }\n        }\n      }\n\n      // 3. Global lookup\n      const globalData = this.store.getDynamicData(dynamicOptions);\n      if (globalData && Array.isArray(globalData)) return globalData;\n\n      // 4. Legacy global response keyed by type name\n      const globalResponse = responses.get(dynamicOptions);\n      if (globalResponse && Array.isArray(globalResponse)) return globalResponse;\n\n      // 5. No existing request found — make one\n      if (componentId) {\n        untracked(() => {\n          if (this.lastRequestKey() !== dynamicOptions) {\n            const reqId = this.store.requestDynamicData(componentId, dynamicOptions, '');\n            this.lastRequestId.set(reqId);\n            this.lastRequestKey.set(dynamicOptions);\n          }\n        });\n      }\n\n      return [];\n    } else {\n      return this.schema().options || [];\n    }\n  });\n\n  /** Request id for the saved-query list this editor's nested pickers need. */\n  private queryListRequestId = signal<string | null>(null);\n\n  /**\n   * Saved queries, for the Drill Query picker inside the dimensions editor.\n   *\n   * The `options` computed above only resolves the schema's OWN\n   * `dynamic_options`; a list editor needs a second source for a field nested in\n   * one of its rows. Usually free: the chart's own Query property has already\n   * asked for the same list on this component.\n   */\n  readonly queryOptions = computed<SelectOption[]>(() => {\n    if (this.schema().type !== 'chart_dimensions') return [];\n    const responses = this.store.dynamicDataResponses();\n\n    const global = this.store.getDynamicData('queries');\n    if (Array.isArray(global) && global.length > 0) return global;\n\n    const own = this.queryListRequestId();\n    if (own) {\n      const response = responses.get(own);\n      if (Array.isArray(response)) return response;\n    }\n\n    for (const [reqId, req] of this.store.dynamicDataRequests().entries()) {\n      if (req.type === 'queries') {\n        const resp = responses.get(reqId);\n        if (Array.isArray(resp)) return resp;\n      }\n    }\n\n    const componentId = this.componentId();\n    if (componentId && !own) {\n      untracked(() => this.queryListRequestId.set(\n        this.store.requestDynamicData(componentId, 'queries', '')));\n    }\n    return [];\n  });\n\n  /**\n   * A stored drill query the fetched list does not contain — a renamed or deleted\n   * query, or a list that has not arrived yet. Rendered as its own option so the\n   * row never displays a value it is not actually holding.\n   */\n  queryOptionMissing(value: string | undefined | null): boolean {\n    if (!value) return false;\n    return !this.queryOptions().some(o => o.value === value);\n  }\n\n  filteredOptions = computed(() => {\n    const inputText = this.autocompleteInputValue();\n    const opts = this.options();\n\n    if (!opts || opts.length === 0) {\n      return opts || [];\n    }\n\n    if (!inputText || inputText.trim() === '') {\n      return opts;\n    }\n\n    const filterValue = inputText.toLowerCase();\n    return opts.filter((option: SelectOption) =>\n      option.label?.toLowerCase().includes(filterValue) ||\n      String(option.value).toLowerCase().includes(filterValue)\n    );\n  });\n  /*   private dynamicDataRequestValue(dynamicDataType: string) {\n      if (dynamicDataType === 'ds_nestedpage_entity_name') {\n        return this.store.selectedComponent()?.properties?.base?.['page']\n      }\n      return '';\n    } */\n  getDisplayValue(value: any): string {\n    if (!value) return '';\n    const opts = this.options();\n    const option = opts?.find((opt: SelectOption) => opt.value === value);\n    return option ? option.label : String(value);\n  }\n\n  readonly selectedPreviewOption = computed<SelectOption | null>(() => {\n    const selected = this.options().find((opt: SelectOption) => opt.value === this.value());\n    return selected?.preview ? selected : null;\n  });\n\n  trackByOption(index: number, option: SelectOption): string {\n    return `${index}_${option.label || ''}_${String(option.value ?? '')}`;\n  }\n\n  /**\n   * True when what has been typed matches no option, so the list can offer to\n   * add it. A dynamic list is a suggestion, not a closed set — a query or field\n   * being wired up may not exist on the server yet.\n   */\n  readonly isNewAutocompleteValue = computed(() => {\n    const text = this.autocompleteInputValue().trim();\n    if (!text) return false;\n    return !this.options().some((o: SelectOption) =>\n      String(o.value) === text || (o.label || '') === text);\n  });\n\n  /**\n   * Text shown for the stored value. Option lists are frequently\n   * `{ value: 'cust_name', label: 'Customer Name' }`, so the input has to be\n   * driven by this rather than by the raw value — bound straight to the value it\n   * showed the stored key (an entity/field name) instead of the label the\n   * dropdown had been showing.\n   */\n  private syncAutocompleteDisplay(): void {\n    const currentValue = this.value();\n    untracked(() => this.autocompleteInputValue.set(\n      currentValue === undefined || currentValue === null ? '' : this.getDisplayValue(currentValue)));\n  }\n\n  constructor() {\n    effect(() => {\n      // Depends on the option list too: it usually arrives after the panel has\n      // rendered, and until it does getDisplayValue has nothing to map with, so\n      // the field would sit on the raw value forever.\n      this.value();\n      this.options();\n      this.syncAutocompleteDisplay();\n    });\n    // Effect to handle dynamic data requests\n    /*  effect(() => {\n       const dynamicOptions = this.schema().dynamic_options;\n       if (dynamicOptions) {\n         const dynamicData = this.store.getDynamicData(dynamicOptions);\n         if (!dynamicData) {\n           // Request the data\n           this.store.setDynamicDataRequest(dynamicOptions, dynamicOptions);\n           \n           // Set up a retry mechanism\n           let retries = 0;\n           const maxRetries = 3;\n           const checkInterval = setInterval(() => {\n             const dynamicData = this.store.getDynamicData(dynamicOptions);\n             if (dynamicData) {\n               clearInterval(checkInterval);\n               this._options.set(dynamicData);\n               this._optionsLoaded.set(true);\n             } else {\n               retries++;\n               if (retries >= maxRetries) {\n                 clearInterval(checkInterval);\n                 this._options.set([]);\n                 this._optionsLoaded.set(false);\n               }\n             }\n           }, 1000);\n         } else {\n           this._options.set(dynamicData);\n         }\n       }\n     }); */\n  }\n\n  ngOnInit(): void {\n    const currentValue = this.value();\n    if (currentValue !== undefined && currentValue !== null) {\n      this.autocompleteInputValue.set(this.getDisplayValue(currentValue));\n    }\n  }\n\n  getTextareaValue(): string {\n    const val = this.value();\n    if (typeof val === 'object' && val !== null) {\n      return JSON.stringify(val, null, 2);\n    }\n    return val || '';\n  }\n\n  onInputChange(event: any): void {\n    let value = event.target.value;\n    if (this.schema().type === 'textarea') {\n      try {\n        if ((value.trim().startsWith('[') && value.trim().endsWith(']')) ||\n          (value.trim().startsWith('{') && value.trim().endsWith('}'))) {\n          value = JSON.parse(value);\n        }\n      } catch (e) {\n        // Keep as string if parsing fails\n      }\n    }\n    this.valueChange.emit(value);\n  }\n\n  onNumberChange(event: any): void {\n    const numValue = parseFloat(event.target.value);\n    this.valueChange.emit(isNaN(numValue) ? 0 : numValue);\n  }\n\n  onValueChange(value: any): void {\n    this.valueChange.emit(value);\n  }\n\n  /** Date properties are stored as yyyy-MM-dd — a plain, locale-independent\n   *  string the components can parse back without a timezone shift. */\n  onDateChange(event: any): void {\n    const date: Date | null = event?.value ?? null;\n    if (!date || isNaN(date.getTime())) {\n      this.valueChange.emit('');\n      return;\n    }\n    const yyyy = date.getFullYear();\n    const mm = String(date.getMonth() + 1).padStart(2, '0');\n    const dd = String(date.getDate()).padStart(2, '0');\n    this.valueChange.emit(`${yyyy}-${mm}-${dd}`);\n  }\n\n  onBooleanChange(event: any): void {\n    this.valueChange.emit(event.checked);\n  }\n\n  onMultiselectChange(values: any[]): void {\n    this.valueChange.emit(values);\n  }\n\n  getMultiselectValue(): any[] {\n    const currentValue = this.value();\n    if (Array.isArray(currentValue)) {\n      return currentValue;\n    } else if (currentValue !== undefined && currentValue !== null) {\n      return [currentValue];\n    } else {\n      return [];\n    }\n  }\n\n  /**\n   * Typing only filters the list — it does not commit. Emitting per keystroke\n   * fought the display sync above, which rewrites the box to the matched\n   * option's label; the half-typed text was replaced under the cursor.\n   */\n  onAutocompleteInput(event: any): void {\n    this.autocompleteInputValue.set(event.target.value);\n  }\n\n  /** Commit free text on blur/Enter, mapping a typed label back to its value. */\n  onAutocompleteCommit(event: any): void {\n    const text = String(event.target.value ?? '');\n    const match = this.options().find((o: SelectOption) => (o.label || '') === text);\n    this.valueChange.emit(match ? match.value : text);\n  }\n\n  onAutocompleteSelection(event: any): void {\n    const selectedValue = event.option.value;\n    this.autocompleteInputValue.set(this.getDisplayValue(selectedValue));\n    this.valueChange.emit(selectedValue);\n  }\n\n  getStatusOptions(): { label: string; color: string;[key: string]: any }[] {\n    const val = this.value();\n    if (!val) return [];\n    let list: any[];\n    if (typeof val === 'string') {\n      try { list = JSON.parse(val); } catch { return []; }\n    } else if (Array.isArray(val)) {\n      list = val;\n    } else {\n      return [];\n    }\n    if (!Array.isArray(list)) return [];\n    // An option's text is `label` when the component authored the list itself,\n    // but `name` when it comes from the data model. Only `label` was read, so a\n    // priority/status mapped to a model field showed its colours with every name\n    // blank. The original keys are kept so writing back does not drop `name`.\n    return list.map(o => (o && typeof o === 'object')\n      ? { ...o, label: o.label ?? o.name ?? '' }\n      : { label: String(o ?? ''), color: '' });\n  }\n\n  addStatusOption(event: any): void {\n    const label = event.target.value?.trim();\n    if (!label) return;\n    const defaultColor = this.schema().description?.includes('close') ? '#EF4444' : '#22C55E';\n    const options = [...this.getStatusOptions(), { label, color: defaultColor }];\n    event.target.value = '';\n    this.valueChange.emit(options);\n  }\n\n  removeStatusOption(index: number): void {\n    const options = this.getStatusOptions().filter((_, i) => i !== index);\n    this.valueChange.emit(options);\n  }\n\n  onStatusColorChange(index: number, event: any): void {\n    const options = [...this.getStatusOptions()];\n    options[index] = { ...options[index], color: event.target.value };\n    this.valueChange.emit(options);\n  }\n\n  /**\n   * Tab titles, stored as one comma-separated string so pages authored before\n   * this editor keep working. Every write goes back out in the same shape.\n   */\n  getTabsList(): string[] {\n    const val = this.value();\n    const parts = Array.isArray(val) ? val : String(val ?? '').split(',');\n    return parts.map((tab: any) => String(tab ?? '').trim()).filter((tab: string) => tab.length > 0);\n  }\n\n  addTab(event: any): void {\n    const label = this.cleanTabLabel(event.target.value);\n    if (!label) return;\n    event.target.value = '';\n    this.emitTabs([...this.getTabsList(), label]);\n  }\n\n  removeTab(index: number): void {\n    this.emitTabs(this.getTabsList().filter((_, i) => i !== index));\n  }\n\n  moveTab(index: number, offset: number): void {\n    const tabs = this.getTabsList();\n    const target = index + offset;\n    if (target < 0 || target >= tabs.length) return;\n    [tabs[index], tabs[target]] = [tabs[target], tabs[index]];\n    this.emitTabs(tabs);\n  }\n\n  /**\n   * Fires on commit (blur / Enter), not per keystroke: the tabs component\n   * reconciles its content containers against this list, so a half-typed title\n   * must never reach it.\n   */\n  onTabRename(index: number, event: any): void {\n    const tabs = this.getTabsList();\n    const label = this.cleanTabLabel(event.target.value);\n    // Blank is a no-op rather than a delete — removing a tab is the X button,\n    // which is the only place the tab's content is knowingly discarded.\n    if (!label || label === tabs[index]) {\n      event.target.value = tabs[index] ?? '';\n      return;\n    }\n    tabs[index] = label;\n    this.emitTabs(tabs);\n  }\n\n  private cleanTabLabel(value: any): string {\n    return String(value ?? '').replace(/,/g, ' ').trim();\n  }\n\n  private emitTabs(tabs: string[]): void {\n    this.valueChange.emit(tabs.join(', '));\n  }\n\n  readonly menuItemKinds: SelectOption[] = [\n    { label: 'Item', value: 'item' },\n    { label: 'Divider', value: 'divider' }\n  ];\n\n  readonly menuItemRoles: SelectOption[] = [\n    { label: 'Menu Item', value: 'menuitem' },\n    { label: 'Radio', value: 'menuitemradio' },\n    { label: 'Checkbox', value: 'menuitemcheckbox' }\n  ];\n\n  readonly toolbarItemKinds: SelectOption[] = [\n    { label: 'Button', value: 'button' },\n    { label: 'Icon Button', value: 'icon_button' },\n    { label: 'Menu', value: 'menu' },\n    { label: 'Title', value: 'title' },\n    { label: 'Text', value: 'text' },\n    { label: 'Spacer', value: 'spacer' },\n    { label: 'Divider', value: 'divider' }\n  ];\n\n  /** Material 3 button appearances, the `matButton` input's own values. */\n  readonly itemButtonVariants: SelectOption[] = [\n    { label: 'Text', value: 'text' },\n    { label: 'Filled', value: 'filled' },\n    { label: 'Elevated', value: 'elevated' },\n    { label: 'Outlined', value: 'outlined' },\n    { label: 'Tonal', value: 'tonal' }\n  ];\n\n  readonly itemColors: SelectOption[] = [\n    { label: 'Default', value: '' },\n    { label: 'Primary', value: 'primary' },\n    { label: 'Accent', value: 'accent' },\n    { label: 'Warn', value: 'warn' }\n  ];\n\n  /** Deepest submenu an author can nest to. Material itself has no limit; this\n   *  is what stays readable in a one-column property panel. */\n  private readonly maxItemLevel = 3;\n\n  /** Kinds that hold nothing of their own — no label, icon or action. */\n  private readonly structuralItemKinds = STRUCTURAL_ITEM_KINDS;\n\n  getItemList(): MenuItemDef[] {\n    return parseMenuItems(this.value());\n  }\n\n  isStructuralItem(item: MenuItemDef): boolean {\n    return this.structuralItemKinds.includes(item.kind);\n  }\n\n  /** A toolbar Menu, or anything nested under one, takes menu-item fields\n   *  rather than toolbar-item fields. */\n  isNestedItem(item: MenuItemDef): boolean {\n    return (item.level ?? 0) > 0;\n  }\n\n  addItem(kind: string): void {\n    const items = this.getItemList();\n    items.push({\n      id: `item_${crypto.randomUUID().slice(0, 8)}`,\n      kind,\n      label: this.structuralItemKinds.includes(kind) ? '' : 'New Item',\n      icon: '',\n      value: '',\n      level: 0\n    });\n    this.valueChange.emit(items);\n  }\n\n  removeItem(index: number): void {\n    const items = this.getItemList();\n    if (!items[index]) return;\n    // A submenu's entries go with the item that opened them, the way removing\n    // a tab takes its content.\n    items.splice(index, this.itemBlockLength(items, index));\n    this.valueChange.emit(items);\n  }\n\n  onItemChange(index: number, key: string, value: any): void {\n    const items = this.getItemList();\n    if (!items[index]) return;\n    items[index] = { ...items[index], [key]: value };\n    this.valueChange.emit(items);\n  }\n\n  /**\n   * Move an item together with everything nested under it, swapping with the\n   * whole sibling block on that side. Swapping single rows would let a parent\n   * cross into its own submenu.\n   */\n  moveItem(index: number, offset: number): void {\n    const items = this.getItemList();\n    if (!items[index]) return;\n    const length = this.itemBlockLength(items, index);\n\n    if (offset < 0) {\n      const level = items[index].level ?? 0;\n      let previous = index - 1;\n      while (previous >= 0 && (items[previous].level ?? 0) > level) previous--;\n      if (previous < 0) return;\n      const block = items.splice(index, length);\n      items.splice(previous, 0, ...block);\n    } else {\n      const next = index + length;\n      if (next >= items.length) return;\n      const nextLength = this.itemBlockLength(items, next);\n      const block = items.splice(index, length);\n      items.splice(index + nextLength, 0, ...block);\n    }\n    this.valueChange.emit(items);\n  }\n\n  /**\n   * Indent an item under the row above it (or pull it back out), carrying its\n   * own nested entries with it so the shape of the submenu is preserved.\n   */\n  indentItem(index: number, delta: number): void {\n    const items = this.getItemList();\n    if (!items[index]) return;\n    const current = items[index].level ?? 0;\n    const target = Math.min(Math.max(0, current + delta), this.maxIndentFor(items, index));\n    if (target === current) return;\n    const shift = target - current;\n    const length = this.itemBlockLength(items, index);\n    for (let i = index; i < index + length; i++) {\n      items[i] = { ...items[i], level: Math.max(0, (items[i].level ?? 0) + shift) };\n    }\n    this.valueChange.emit(items);\n  }\n\n  canIndentItem(index: number, delta: number): boolean {\n    const items = this.getItemList();\n    if (!items[index]) return false;\n    const current = items[index].level ?? 0;\n    return delta < 0 ? current > 0 : current < this.maxIndentFor(items, index);\n  }\n\n  /**\n   * One deeper than the row above — a gap would orphan the item — and no\n   * deeper than that row itself when it is a separator, which holds nothing.\n   */\n  private maxIndentFor(items: MenuItemDef[], index: number): number {\n    if (index === 0) return 0;\n    const previous = items[index - 1];\n    const previousLevel = previous.level ?? 0;\n    if (this.structuralItemKinds.includes(previous.kind)) {\n      return Math.min(previousLevel, this.maxItemLevel);\n    }\n    return Math.min(previousLevel + 1, this.maxItemLevel);\n  }\n\n  /** The item at `index` plus every row nested under it. */\n  private itemBlockLength(items: MenuItemDef[], index: number): number {\n    const level = items[index].level ?? 0;\n    let length = 1;\n    while (index + length < items.length && (items[index + length].level ?? 0) > level) length++;\n    return length;\n  }\n\n  getColorRanges(): ColorRange[] {\n    const val = this.value();\n    if (!val) return [];\n    if (typeof val === 'string') {\n      try { return JSON.parse(val); } catch { return []; }\n    }\n    if (Array.isArray(val)) return val;\n    return [];\n  }\n\n  /** Bounds come from the schema so a percentage property (progress) can pin\n   *  0–100 while a general number property stays unconstrained. */\n  readonly rangeMin = computed(() => this.schema().min);\n  readonly rangeMax = computed(() => this.schema().max);\n\n  addColorRange(): void {\n    const ranges = this.getColorRanges();\n    const last = ranges.length ? ranges[ranges.length - 1] : null;\n    const lastTo = last && last.to !== null && last.to !== undefined ? Number(last.to) : null;\n    const from = lastTo !== null && !isNaN(lastTo) ? lastTo + 1 : this.rangeMin() ?? 0;\n    this.valueChange.emit([...ranges, { from, to: this.rangeMax() ?? null, color: '#22C55E' }]);\n  }\n\n  removeColorRange(index: number): void {\n    this.valueChange.emit(this.getColorRanges().filter((_, i) => i !== index));\n  }\n\n  /** Blank clears the bound, which makes that side open-ended. */\n  onColorRangeChange(index: number, key: 'from' | 'to', event: any): void {\n    const ranges = [...this.getColorRanges()];\n    const raw = String(event.target.value ?? '').trim();\n    if (raw === '') {\n      ranges[index] = { ...ranges[index], [key]: null };\n    } else {\n      let num = Number(raw);\n      if (isNaN(num)) return;\n      const min = this.rangeMin();\n      const max = this.rangeMax();\n      if (min !== undefined) num = Math.max(min, num);\n      if (max !== undefined) num = Math.min(max, num);\n      ranges[index] = { ...ranges[index], [key]: num };\n    }\n    this.valueChange.emit(ranges);\n  }\n\n  // ---- Per-range colours (theme token or hex/rgba) --------------------------\n\n  private rangeColorValue(index: number, field: 'color' | 'background'): string {\n    return this.getColorRanges()[index]?.[field] || '';\n  }\n\n  isRangeToken(index: number, field: 'color' | 'background'): boolean {\n    return this.extractToken(this.rangeColorValue(index, field)) !== null;\n  }\n\n  rangeTokenValue(index: number, field: 'color' | 'background'): string {\n    return this.extractToken(this.rangeColorValue(index, field)) || '';\n  }\n\n  rangeHexValue(index: number, field: 'color' | 'background'): string {\n    const v = this.rangeColorValue(index, field);\n    if (!v || v.startsWith('var(') || v.startsWith('color-mix')) return '#000000';\n    const rgba = this.parseColor(v);\n    return rgba ? this.toHex(rgba.r, rgba.g, rgba.b) : '#000000';\n  }\n\n  rangePreview(index: number, field: 'color' | 'background'): string {\n    return this.rangeColorValue(index, field) || 'transparent';\n  }\n\n  private emitRangeColor(index: number, field: 'color' | 'background', color: string | undefined): void {\n    const ranges = [...this.getColorRanges()];\n    const next: ColorRange = { ...ranges[index] };\n    if (color) next[field] = color; else delete next[field];\n    ranges[index] = next;\n    this.valueChange.emit(ranges);\n  }\n\n  onRangeTokenChange(index: number, field: 'color' | 'background', tokenValue: string): void {\n    if (tokenValue === '__none__') {\n      this.emitRangeColor(index, field, undefined);\n      return;\n    }\n    if (tokenValue) {\n      this.emitRangeColor(index, field, tokenValue);\n      return;\n    }\n    this.emitRangeColor(index, field, this.rangeHexValue(index, field));\n  }\n\n  onRangeHexChange(index: number, field: 'color' | 'background', event: any): void {\n    this.emitRangeColor(index, field, event.target.value);\n  }\n\n  readonly aggFunctions = ['sum', 'count', 'avg', 'min', 'max'];\n\n  getPivotAggregations(): { name: string; aggregationFunction: string; label?: string; showSubtotals?: boolean }[] {\n    const val = this.value();\n    if (!val) return [];\n    if (typeof val === 'string') {\n      try { return JSON.parse(val); } catch { return []; }\n    }\n    if (Array.isArray(val)) return val;\n    return [];\n  }\n\n  addPivotAggregation(): void {\n    this.valueChange.emit([\n      ...this.getPivotAggregations(),\n      { name: '', aggregationFunction: 'sum', label: '', showSubtotals: true }\n    ]);\n  }\n\n  removePivotAggregation(index: number): void {\n    this.valueChange.emit(this.getPivotAggregations().filter((_, i) => i !== index));\n  }\n\n  onPivotAggChange(index: number, key: 'name' | 'aggregationFunction' | 'label' | 'showSubtotals', value: any): void {\n    const aggs = [...this.getPivotAggregations()];\n    aggs[index] = { ...aggs[index], [key]: value };\n    this.valueChange.emit(aggs);\n  }\n\n  // Cascading-dropdown pairs (`df_fields`). Same shape the data model stores on\n  // an entity field, so a select that inherits its option config from the model\n  // and one configured here in the panel read through the same code path.\n  getDependentFields(): { def: string; dpef: string }[] {\n    const val = this.value();\n    if (!val) return [];\n    if (typeof val === 'string') {\n      try { return JSON.parse(val); } catch { return []; }\n    }\n    if (Array.isArray(val)) return val;\n    return [];\n  }\n\n  addDependentField(): void {\n    this.valueChange.emit([...this.getDependentFields(), { def: '', dpef: '' }]);\n  }\n\n  removeDependentField(index: number): void {\n    this.valueChange.emit(this.getDependentFields().filter((_, i) => i !== index));\n  }\n\n  onDependentFieldChange(index: number, key: 'def' | 'dpef', value: any): void {\n    const pairs = [...this.getDependentFields()];\n    pairs[index] = { ...pairs[index], [key]: String(value ?? '') };\n    this.valueChange.emit(pairs);\n  }\n\n  // A chart offers 'none' on top of the pivot's functions: a query that already\n  // grouped hands back the finished number, and summing it again would double\n  // every value that shares a category.\n  readonly chartAggFunctions = ['sum', 'count', 'avg', 'min', 'max', 'none'];\n\n  getChartDimensions(): any[] {\n    return this.parseListValue();\n  }\n\n  addChartDimension(): void {\n    this.valueChange.emit([...this.getChartDimensions(), { name: '', label: '' }]);\n  }\n\n  removeChartDimension(index: number): void {\n    this.valueChange.emit(this.getChartDimensions().filter((_, i) => i !== index));\n  }\n\n  onChartDimensionChange(index: number, key: string, value: any): void {\n    const list = [...this.getChartDimensions()];\n    // A blank cap means \"no cap\" — stored as undefined rather than 0 or '' so a\n    // cleared box really does plot every category. Covers the drilled-to level's\n    // cap too, hence the suffix test rather than an exact key.\n    const next = key.endsWith('top_n')\n      ? (value === '' || value === null || Number(value) <= 0 ? undefined : Math.floor(Number(value)))\n      : value;\n    list[index] = { ...list[index], [key]: next };\n    this.valueChange.emit(list);\n  }\n\n  /**\n   * Entities for the colour-source picker. Read straight off the store — the data\n   * model is already loaded there, so this needs no dynamic-data round trip.\n   */\n  colorEntityOptions(): { value: string; label: string }[] {\n    const entities: any[] = (this.store.getEntities() as any[]) || [];\n    return [\n      { value: '', label: 'Page entity' },\n      ...entities\n        .filter(e => !!e?.name)\n        .map(e => ({ value: e.name, label: e.label || e.name }))\n    ];\n  }\n\n  /**\n   * Fields of the chosen entity, the colour-bearing ones marked.\n   *\n   * Nothing is hidden — a field with no options today may gain them — but the\n   * ones that actually carry colours are the point of the picker, so they say so.\n   */\n  colorFieldOptions(entityName: string | undefined): { value: string; label: string }[] {\n    const entity = (entityName || '').trim() || this.store.currentPage()?.entity_name || '';\n    const fields: any[] = (this.store.getEntityFields(entity) as any[]) || [];\n    return [\n      { value: '', label: 'This dimension\\'s column' },\n      ...fields.filter(f => !!f?.name).map(f => ({\n        value: f.name,\n        label: entityFieldValueColors(f).length > 0\n          ? `${f.label || f.name} — has colours`\n          : (f.label || f.name)\n      }))\n    ];\n  }\n\n  /**\n   * Fields of an entity for the measure's format source. Numeric ones are marked:\n   * a measure follows a number or currency column's decimals, grouping, symbol\n   * and scale, and those are the fields that carry them.\n   */\n  formatFieldOptions(entityName: string | undefined): { value: string; label: string }[] {\n    const entity = (entityName || '').trim() || this.store.currentPage()?.entity_name || '';\n    const fields: any[] = (this.store.getEntityFields(entity) as any[]) || [];\n    const numeric = (f: any) => ['currency', 'number', 'decimal'].includes(String(f?.datatype || '').toLowerCase())\n      || f?.decimal !== undefined || f?.symbol !== undefined || f?.seperator !== undefined;\n    return [\n      { value: '', label: 'This measure\\'s column' },\n      ...fields.filter(f => !!f?.name).map(f => ({\n        value: f.name,\n        label: numeric(f) ? `${f.label || f.name} — numeric` : (f.label || f.name)\n      }))\n    ];\n  }\n\n  /** A stored colour that is a design token rather than a literal hex. */\n  isTokenColour(color: string | undefined): boolean {\n    return !!color && String(color).trim().startsWith('var(');\n  }\n\n  /** The hex to show in a swatch; tokens fall back to a neutral so it is editable. */\n  hexOfColour(color: string | undefined): string {\n    const value = String(color ?? '').trim();\n    return /^#[0-9a-f]{3,8}$/i.test(value) ? value : '#5470C6';\n  }\n\n  /**\n   * The chart-wide colour overrides, as chips.\n   *\n   * Same shape and same UI as a dimension's own overrides — a colour is picked,\n   * not typed, at either level.\n   */\n  getValueColors(): { value: string; color: string }[] {\n    return parseChartValueColors(this.value());\n  }\n\n  addValueColor(event: any): void {\n    const value = String(event?.target?.value ?? '').trim();\n    if (!value) return;\n    event.target.value = '';\n    this.valueChange.emit([...this.getValueColors(), { value, color: '#5470C6' }]);\n  }\n\n  removeValueColor(index: number): void {\n    this.valueChange.emit(this.getValueColors().filter((_, i) => i !== index));\n  }\n\n  onValueColorChange(index: number, color: string): void {\n    const rows = [...this.getValueColors()];\n    rows[index] = { ...rows[index], color };\n    this.valueChange.emit(rows);\n  }\n\n  /**\n   * A dimension's manual colour overrides as chips.\n   *\n   * Stored back as `{value, color}` rows rather than the old `Value=#hex` text:\n   * a colour is picked, not typed. The parser still reads the text form, so\n   * pages authored that way keep working.\n   */\n  dimensionColors(dimension: any): { value: string; color: string }[] {\n    return parseChartValueColors(dimension?.value_colors);\n  }\n\n  addDimensionColor(index: number, event: any): void {\n    const value = String(event?.target?.value ?? '').trim();\n    if (!value) return;\n    const rows = this.dimensionColors(this.getChartDimensions()[index]);\n    event.target.value = '';\n    this.onChartDimensionChange(index, 'value_colors', [...rows, { value, color: '#5470C6' }]);\n  }\n\n  removeDimensionColor(index: number, colorIndex: number): void {\n    const rows = this.dimensionColors(this.getChartDimensions()[index]);\n    this.onChartDimensionChange(index, 'value_colors', rows.filter((_, i) => i !== colorIndex));\n  }\n\n  onDimensionColorChange(index: number, colorIndex: number, color: string): void {\n    const rows = [...this.dimensionColors(this.getChartDimensions()[index])];\n    rows[colorIndex] = { ...rows[colorIndex], color };\n    this.onChartDimensionChange(index, 'value_colors', rows);\n  }\n\n  getChartExtraOptions(): { path?: string; value?: any }[] {\n    return this.parseListValue();\n  }\n\n  addChartExtraOption(): void {\n    this.valueChange.emit([...this.getChartExtraOptions(), { path: '', value: '' }]);\n  }\n\n  removeChartExtraOption(index: number): void {\n    this.valueChange.emit(this.getChartExtraOptions().filter((_, i) => i !== index));\n  }\n\n  onChartExtraOptionChange(index: number, key: 'path' | 'value', value: any): void {\n    const list = [...this.getChartExtraOptions()];\n    list[index] = { ...list[index], [key]: value };\n    this.valueChange.emit(list);\n  }\n\n  getChartMeasures(): any[] {\n    return this.parseListValue();\n  }\n\n  addChartMeasure(): void {\n    this.valueChange.emit([...this.getChartMeasures(), { name: '', aggregation: 'sum', label: '' }]);\n  }\n\n  removeChartMeasure(index: number): void {\n    this.valueChange.emit(this.getChartMeasures().filter((_, i) => i !== index));\n  }\n\n  onChartMeasureChange(index: number, key: string, value: any): void {\n    const list = [...this.getChartMeasures()];\n    // A cleared override must fall back to the model, so store blank as\n    // undefined rather than '' — numberFormatSpec treats both as absent, but\n    // undefined keeps the saved page free of empty keys.\n    const next = value === '' ? undefined : value;\n    list[index] = { ...list[index], [key]: next };\n    this.valueChange.emit(list);\n  }\n\n  /**\n   * A list-valued property as an array. Pages saved through the JSON panel keep\n   * it as a JSON string, so both forms have to read the same.\n   */\n  private parseListValue(): any[] {\n    const val = this.value();\n    if (!val) return [];\n    if (Array.isArray(val)) return val;\n    if (typeof val === 'string') {\n      try {\n        const parsed = JSON.parse(val);\n        return Array.isArray(parsed) ? parsed : [];\n      } catch {\n        return [];\n      }\n    }\n    return [];\n  }\n}\n","<div [class.property-editor]=\"true\" [class]=\"widthClass()\">\n  @switch (schema().type) {\n  @case ('text') {\n  <mat-form-field appearance=\"outline\">\n    <mat-label>{{ schema().label }}</mat-label>\n    <input matInput [value]=\"value() || ''\" (input)=\"onInputChange($event)\" [placeholder]=\"schema().description || ''\"\n      [disabled]=\"disabled()\" />\n    <!--  @if (schema().description) {\n          <mat-hint>{{ schema().description }}</mat-hint>\n        } -->\n  </mat-form-field>\n  }\n\n  @case ('textarea') {\n  <mat-form-field appearance=\"outline\">\n    <mat-label>{{ schema().label }}</mat-label>\n    <textarea matInput [value]=\"getTextareaValue()\" (input)=\"onInputChange($event)\"\n      [placeholder]=\"schema().description || ''\" rows=\"3\" [disabled]=\"disabled()\"></textarea>\n    @if (schema().description) {\n    <mat-hint>{{ schema().description }}</mat-hint>\n    }\n  </mat-form-field>\n  }\n\n  @case ('number') {\n  <mat-form-field appearance=\"outline\">\n    <mat-label>{{ schema().label }}</mat-label>\n    <input matInput type=\"number\" [value]=\"value() || 0\" (input)=\"onNumberChange($event)\"\n      [placeholder]=\"schema().description || ''\" [disabled]=\"disabled()\" />\n    <!--  @if (schema().description) {\n          <mat-hint>{{ schema().description }}</mat-hint>\n        } -->\n  </mat-form-field>\n  }\n\n  @case ('select') {\n  <mat-form-field appearance=\"outline\">\n    <mat-label>{{ schema().label }}</mat-label>\n    <mat-select [value]=\"value()\" (valueChange)=\"onValueChange($event)\" [disabled]=\"disabled()\">\n      @if (selectedPreviewOption(); as selected) {\n        <mat-select-trigger>\n          <span class=\"option-preview\" [style.color]=\"selected.preview_color || null\">{{ selected.preview }}</span>\n        </mat-select-trigger>\n      }\n      @for (option of options(); track trackByOption($index, option)) {\n      <mat-option [value]=\"option.value\">\n        @if (option.preview) {\n        <span class=\"option-preview\" [style.color]=\"option.preview_color || null\">{{ option.preview }}</span>\n        } @else {\n        {{ option.label }}\n        }\n      </mat-option>\n      }\n    </mat-select>\n    <!--  @if (schema().description) {\n          <mat-hint>{{ schema().description }}</mat-hint>\n        } -->\n  </mat-form-field>\n  }\n\n  @case ('boolean') {\n  <div class=\"flex items-center space-x-3\">\n    <mat-slide-toggle [checked]=\"!!value()\" (change)=\"onBooleanChange($event)\"\n      [disabled]=\"disabled()\"></mat-slide-toggle>\n    <label class=\"text-xs font-medium text-gray-500\">{{ schema().label }}</label>\n  </div>\n  <!-- @if (schema().description) {\n        <div class=\"text-xs text-gray-500 mt-1\">{{ schema().description }}</div>\n      } -->\n  }\n\n  @case ('color') {\n  <div class=\"color-property\">\n    <label class=\"color-label\">{{ schema().label }}</label>\n    <div class=\"color-row\">\n      <mat-form-field appearance=\"outline\" class=\"color-token-field\">\n        <mat-select [value]=\"tokenSelectValue()\" (valueChange)=\"onColorTokenChange($event)\" [disabled]=\"disabled()\">\n          <mat-option value=\"\">Custom hex</mat-option>\n          @for (token of colorTokens; track token.value) {\n            <mat-option [value]=\"token.value\">\n              <span class=\"token-swatch\" [style.background-color]=\"token.value\"></span>\n              {{ token.label }}\n            </mat-option>\n          }\n        </mat-select>\n      </mat-form-field>\n      @if (!isTokenColor()) {\n        <input class=\"color-hex-input\" type=\"color\" [value]=\"hexColorValue()\" (input)=\"onColorHexChange($event)\" [disabled]=\"disabled()\" />\n      } @else {\n        <span class=\"token-preview\" [style.background]=\"value()\"></span>\n      }\n    </div>\n    <div class=\"color-opacity-row\">\n      <span class=\"color-opacity-label\">Opacity</span>\n      <input class=\"color-opacity-slider\" type=\"range\" min=\"0\" max=\"100\" step=\"1\"\n        [value]=\"alphaValue()\" (input)=\"onOpacityChange($event)\" [disabled]=\"disabled()\" />\n      <span class=\"color-opacity-value\">{{ alphaValue() }}%</span>\n    </div>\n  </div>\n  }\n  @case ('radio') {\n  <div [class]=\"schema().width === 'full' ? 'col-span-2' : ''\" class=\"w-full flex flex-col items-center\">\n    <label class=\"text-sm font-medium text-gray-700 mb-2 block w-full text-left\">{{ schema().label }}</label>\n    <mat-radio-group [value]=\"value()\" (change)=\"onValueChange($event.value)\" [disabled]=\"disabled()\"\n      class=\"w-full flex justify-start\"\n      [class]=\"schema().orientation === 'horizontal' ? 'flex-row space-x-4' : 'flex-col space-y-2'\">\n      @for (option of options(); track trackByOption($index, option)) {\n      <mat-radio-button [value]=\"option.value\">{{ option.label }}</mat-radio-button>\n      }\n    </mat-radio-group>\n  </div>\n  }\n\n  @case ('multiselect') {\n  <mat-form-field appearance=\"outline\">\n    <mat-label>{{ schema().label }}</mat-label>\n    <mat-select [value]=\"getMultiselectValue()\" (valueChange)=\"onMultiselectChange($event)\" [disabled]=\"disabled()\"\n      multiple>\n      @for (option of options(); track trackByOption($index, option)) {\n      <mat-option [value]=\"option.value\">{{ option.label }}</mat-option>\n      }\n    </mat-select>\n    @if (schema().description) {\n    <mat-hint>{{ schema().description }}</mat-hint>\n    }\n  </mat-form-field>\n  }\n\n  @case ('payload_fields') {\n  <eru-payload-fields-picker [value]=\"getMultiselectValue()\" [options]=\"options()\" [label]=\"schema().label\"\n    [disabled]=\"disabled()\" (valueChange)=\"onMultiselectChange($event)\" />\n  @if (schema().description) {\n  <div class=\"payload-fields-hint\">{{ schema().description }}</div>\n  }\n  }\n\n  @case ('autocomplete') {\n  <mat-form-field appearance=\"outline\">\n    <mat-label>{{ schema().label }}</mat-label>\n    <input matInput [value]=\"autocompleteInputValue()\" (input)=\"onAutocompleteInput($event)\"\n      (change)=\"onAutocompleteCommit($event)\" [matAutocomplete]=\"auto\"\n      [placeholder]=\"schema().description || 'Select or type a value'\" [disabled]=\"disabled()\" />\n    <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onAutocompleteSelection($event)\">\n      @for (option of filteredOptions(); track trackByOption($index, option)) {\n      <mat-option [value]=\"option.value\">{{ option.label }}</mat-option>\n      }\n      @if (isNewAutocompleteValue()) {\n      <mat-option [value]=\"autocompleteInputValue()\">Add \"{{ autocompleteInputValue() }}\"</mat-option>\n      }\n    </mat-autocomplete>\n  </mat-form-field>\n  }\n\n  @case ('logic_editor') {\n  <eru-logic-editor [value]=\"value()\" [label]=\"schema().label\" [description]=\"schema().description || ''\"\n    (valueChange)=\"onValueChange($event)\">\n  </eru-logic-editor>\n  }\n\n  @case ('status_options') {\n  <div class=\"status-options-editor\">\n    <label class=\"status-options-label\">{{ schema().label }}</label>\n    <div class=\"status-chips\">\n      @for (opt of getStatusOptions(); track $index; let i = $index) {\n        <div class=\"status-chip\">\n          <input type=\"color\" class=\"status-chip-dot\" [value]=\"opt.color || '#9CA3AF'\"\n            (input)=\"onStatusColorChange(i, $event)\" title=\"Change color\" />\n          <span class=\"status-chip-label\">{{ opt.label }}</span>\n          <button class=\"status-chip-remove\" (click)=\"removeStatusOption(i)\" title=\"Remove\">&times;</button>\n        </div>\n      }\n    </div>\n    <input class=\"status-add-input\" type=\"text\" [placeholder]=\"schema().description || 'Add status...'\"\n      (keydown.enter)=\"addStatusOption($event)\" />\n  </div>\n  }\n\n  @case ('tabs_list') {\n  <div class=\"tabs-list-editor\">\n    <label class=\"tabs-list-label\">{{ schema().label }}</label>\n    @for (tab of getTabsList(); track $index; let i = $index; let first = $first; let last = $last) {\n      <div class=\"tab-row\">\n        <span class=\"tab-row-index\">{{ i + 1 }}</span>\n        <input class=\"tab-row-input\" type=\"text\" [value]=\"tab\"\n          (change)=\"onTabRename(i, $event)\" [disabled]=\"disabled()\"\n          title=\"Rename this tab. Its content stays with it.\" />\n        <button class=\"tab-row-btn\" (click)=\"moveTab(i, -1)\" [disabled]=\"disabled() || first\"\n          title=\"Move up\">&uarr;</button>\n        <button class=\"tab-row-btn\" (click)=\"moveTab(i, 1)\" [disabled]=\"disabled() || last\"\n          title=\"Move down\">&darr;</button>\n        <button class=\"tab-row-remove\" (click)=\"removeTab(i)\" [disabled]=\"disabled()\"\n          title=\"Remove this tab and everything on it\">&times;</button>\n      </div>\n    }\n    <input class=\"tab-add-input\" type=\"text\" placeholder=\"Add tab — press Enter\"\n      (keydown.enter)=\"addTab($event)\" [disabled]=\"disabled()\" />\n  </div>\n  }\n\n\n  @case ('menu_items') {\n  <div class=\"item-list-editor\">\n    <label class=\"item-list-label\">{{ schema().label }}</label>\n    @for (item of getItemList(); track item.id; let i = $index) {\n      <div class=\"item-row\" [style.margin-left.px]=\"(item.level || 0) * 12\">\n        <div class=\"item-row-line\">\n          <select class=\"item-kind\" (change)=\"onItemChange(i, 'kind', $any($event.target).value)\" [disabled]=\"disabled()\">\n            @for (k of menuItemKinds; track k.value) {\n              <option [value]=\"k.value\" [selected]=\"k.value === item.kind\">{{ k.label }}</option>\n            }\n          </select>\n          @if (!isStructuralItem(item)) {\n            <input class=\"item-input\" type=\"text\" placeholder=\"Label\" [value]=\"item.label || ''\"\n              (change)=\"onItemChange(i, 'label', $any($event.target).value)\" [disabled]=\"disabled()\" />\n          }\n          <button class=\"item-btn\" (click)=\"indentItem(i, -1)\" [disabled]=\"disabled() || !canIndentItem(i, -1)\"\n            title=\"Out of the submenu above\">&larr;</button>\n          <button class=\"item-btn\" (click)=\"indentItem(i, 1)\" [disabled]=\"disabled() || !canIndentItem(i, 1)\"\n            title=\"Into a submenu under the item above\">&rarr;</button>\n          <button class=\"item-btn\" (click)=\"moveItem(i, -1)\" [disabled]=\"disabled()\" title=\"Move up\">&uarr;</button>\n          <button class=\"item-btn\" (click)=\"moveItem(i, 1)\" [disabled]=\"disabled()\" title=\"Move down\">&darr;</button>\n          <button class=\"item-remove\" (click)=\"removeItem(i)\" [disabled]=\"disabled()\"\n            title=\"Remove this item and its submenu\">&times;</button>\n        </div>\n        @if (!isStructuralItem(item)) {\n          <div class=\"item-row-line\">\n            <input class=\"item-input\" type=\"text\" placeholder=\"Icon\" [value]=\"item.icon || ''\"\n              (change)=\"onItemChange(i, 'icon', $any($event.target).value)\" [disabled]=\"disabled()\"\n              title=\"Material icon name, e.g. content_copy\" />\n            <input class=\"item-input\" type=\"text\" placeholder=\"Value sent on select\" [value]=\"item.value || ''\"\n              (change)=\"onItemChange(i, 'value', $any($event.target).value)\" [disabled]=\"disabled()\"\n              title=\"What On Menu Item Select carries. Falls back to the item id.\" />\n            <label class=\"item-check\" title=\"Disable this item\">\n              <input type=\"checkbox\" [checked]=\"!!item.disabled\" [disabled]=\"disabled()\"\n                (change)=\"onItemChange(i, 'disabled', $any($event.target).checked)\" /> Off\n            </label>\n          </div>\n          <div class=\"item-row-line\">\n            <select class=\"item-select\" (change)=\"onItemChange(i, 'role', $any($event.target).value)\"\n              [disabled]=\"disabled()\" title=\"ARIA role for this item\">\n              @for (r of menuItemRoles; track r.value) {\n                <option [value]=\"r.value\" [selected]=\"r.value === (item.role || 'menuitem')\">{{ r.label }}</option>\n              }\n            </select>\n            <input class=\"item-input\" type=\"text\" placeholder=\"Visible if — expression\" [value]=\"item.visible_if || ''\"\n              (change)=\"onItemChange(i, 'visible_if', $any($event.target).value)\" [disabled]=\"disabled()\"\n              title=\"Leave blank to always show. Hidden when the expression cannot be evaluated.\" />\n          </div>\n        }\n      </div>\n    }\n    <div class=\"item-add-row\">\n      <button class=\"item-add\" (click)=\"addItem('item')\" [disabled]=\"disabled()\">+ Item</button>\n      <button class=\"item-add\" (click)=\"addItem('divider')\" [disabled]=\"disabled()\">+ Divider</button>\n    </div>\n    @if (schema().description) {\n      <span class=\"item-list-hint\">{{ schema().description }}</span>\n    }\n  </div>\n  }\n\n  @case ('toolbar_items') {\n  <div class=\"item-list-editor\">\n    <label class=\"item-list-label\">{{ schema().label }}</label>\n    @for (item of getItemList(); track item.id; let i = $index) {\n      <div class=\"item-row\" [style.margin-left.px]=\"(item.level || 0) * 12\">\n        <div class=\"item-row-line\">\n          <select class=\"item-kind\" (change)=\"onItemChange(i, 'kind', $any($event.target).value)\" [disabled]=\"disabled()\">\n            @if (isNestedItem(item)) {\n              @for (k of menuItemKinds; track k.value) {\n                <option [value]=\"k.value\" [selected]=\"k.value === item.kind\">{{ k.label }}</option>\n              }\n            } @else {\n              @for (k of toolbarItemKinds; track k.value) {\n                <option [value]=\"k.value\" [selected]=\"k.value === item.kind\">{{ k.label }}</option>\n              }\n            }\n          </select>\n          @if (!isStructuralItem(item)) {\n            <input class=\"item-input\" type=\"text\" placeholder=\"Label\" [value]=\"item.label || ''\"\n              (change)=\"onItemChange(i, 'label', $any($event.target).value)\" [disabled]=\"disabled()\" />\n          }\n          <button class=\"item-btn\" (click)=\"indentItem(i, -1)\" [disabled]=\"disabled() || !canIndentItem(i, -1)\"\n            title=\"Out of the menu above\">&larr;</button>\n          <button class=\"item-btn\" (click)=\"indentItem(i, 1)\" [disabled]=\"disabled() || !canIndentItem(i, 1)\"\n            title=\"Into the menu opened by the item above\">&rarr;</button>\n          <button class=\"item-btn\" (click)=\"moveItem(i, -1)\" [disabled]=\"disabled()\" title=\"Move left / up\">&uarr;</button>\n          <button class=\"item-btn\" (click)=\"moveItem(i, 1)\" [disabled]=\"disabled()\" title=\"Move right / down\">&darr;</button>\n          <button class=\"item-remove\" (click)=\"removeItem(i)\" [disabled]=\"disabled()\"\n            title=\"Remove this item and anything under it\">&times;</button>\n        </div>\n        @if (!isStructuralItem(item)) {\n          <div class=\"item-row-line\">\n            <input class=\"item-input\" type=\"text\" placeholder=\"Icon\" [value]=\"item.icon || ''\"\n              (change)=\"onItemChange(i, 'icon', $any($event.target).value)\" [disabled]=\"disabled()\"\n              title=\"Material icon name, e.g. save\" />\n            @if (item.kind !== 'title' && item.kind !== 'text') {\n              <input class=\"item-input\" type=\"text\" placeholder=\"Value sent on action\" [value]=\"item.value || ''\"\n                (change)=\"onItemChange(i, 'value', $any($event.target).value)\" [disabled]=\"disabled()\"\n                title=\"What On Toolbar Action carries. Falls back to the item id.\" />\n              <label class=\"item-check\" title=\"Disable this item\">\n                <input type=\"checkbox\" [checked]=\"!!item.disabled\" [disabled]=\"disabled()\"\n                  (change)=\"onItemChange(i, 'disabled', $any($event.target).checked)\" /> Off\n              </label>\n            }\n          </div>\n          @if (item.kind === 'button' || item.kind === 'icon_button' || item.kind === 'menu') {\n            <div class=\"item-row-line\">\n              @if (item.kind !== 'icon_button') {\n                <select class=\"item-select\" (change)=\"onItemChange(i, 'variant', $any($event.target).value)\"\n                  [disabled]=\"disabled()\" title=\"Material button appearance\">\n                  @for (v of itemButtonVariants; track v.value) {\n                    <option [value]=\"v.value\" [selected]=\"v.value === (item.variant || 'text')\">{{ v.label }}</option>\n                  }\n                </select>\n              }\n              <select class=\"item-select\" (change)=\"onItemChange(i, 'color', $any($event.target).value)\"\n                [disabled]=\"disabled()\" title=\"Colour for this control\">\n                @for (c of itemColors; track c.value) {\n                  <option [value]=\"c.value\" [selected]=\"c.value === (item.color || '')\">{{ c.label }}</option>\n                }\n              </select>\n              <input class=\"item-input item-input-narrow\" type=\"number\" min=\"1\" placeholder=\"row\" [value]=\"item.row ?? ''\"\n                (change)=\"onItemChange(i, 'row', $any($event.target).value)\" [disabled]=\"disabled()\"\n                title=\"Toolbar row this item sits on. Used only when Multi Row is on.\" />\n            </div>\n          }\n          <div class=\"item-row-line\">\n            @if (!isNestedItem(item)) {\n              <input class=\"item-input\" type=\"text\" placeholder=\"Tooltip\" [value]=\"item.tooltip || ''\"\n                (change)=\"onItemChange(i, 'tooltip', $any($event.target).value)\" [disabled]=\"disabled()\" />\n            }\n            <input class=\"item-input\" type=\"text\" placeholder=\"Visible if — expression\" [value]=\"item.visible_if || ''\"\n              (change)=\"onItemChange(i, 'visible_if', $any($event.target).value)\" [disabled]=\"disabled()\"\n              title=\"Leave blank to always show. Hidden when the expression cannot be evaluated.\" />\n          </div>\n        }\n      </div>\n    }\n    <div class=\"item-add-row\">\n      <button class=\"item-add\" (click)=\"addItem('button')\" [disabled]=\"disabled()\">+ Button</button>\n      <button class=\"item-add\" (click)=\"addItem('icon_button')\" [disabled]=\"disabled()\">+ Icon</button>\n      <button class=\"item-add\" (click)=\"addItem('menu')\" [disabled]=\"disabled()\">+ Menu</button>\n      <button class=\"item-add\" (click)=\"addItem('title')\" [disabled]=\"disabled()\">+ Title</button>\n      <button class=\"item-add\" (click)=\"addItem('spacer')\" [disabled]=\"disabled()\">+ Spacer</button>\n      <button class=\"item-add\" (click)=\"addItem('divider')\" [disabled]=\"disabled()\">+ Divider</button>\n    </div>\n    @if (schema().description) {\n      <span class=\"item-list-hint\">{{ schema().description }}</span>\n    }\n  </div>\n  }\n\n  @case ('color_ranges') {\n  <div class=\"color-ranges-editor\">\n    <label class=\"color-ranges-label\">{{ schema().label }}</label>\n    @for (r of getColorRanges(); track $index; let i = $index) {\n      <div class=\"color-range-row\">\n        <div class=\"color-range-bounds\">\n          <input class=\"color-range-num\" type=\"number\" [min]=\"rangeMin()\" [max]=\"rangeMax()\"\n            [value]=\"r.from ?? ''\" placeholder=\"min\"\n            (change)=\"onColorRangeChange(i, 'from', $event)\" [disabled]=\"disabled()\"\n            title=\"Lower bound (inclusive). Leave blank for no lower limit.\" />\n          <span class=\"color-range-dash\">&ndash;</span>\n          <input class=\"color-range-num\" type=\"number\" [min]=\"rangeMin()\" [max]=\"rangeMax()\"\n            [value]=\"r.to ?? ''\" placeholder=\"max\"\n            (change)=\"onColorRangeChange(i, 'to', $event)\" [disabled]=\"disabled()\"\n            title=\"Upper bound (inclusive). Leave blank for no upper limit.\" />\n          <button class=\"color-range-remove\" (click)=\"removeColorRange(i)\" [disabled]=\"disabled()\"\n            title=\"Remove range\">&times;</button>\n        </div>\n        @for (field of colorRangeFields; track field.key) {\n          <div class=\"color-range-color\">\n            <span class=\"color-range-color-label\">{{ field.label }}</span>\n            <select class=\"color-range-token\" [value]=\"rangeTokenValue(i, field.key)\"\n              (change)=\"onRangeTokenChange(i, field.key, $any($event.target).value)\" [disabled]=\"disabled()\">\n              <option value=\"__none__\">None</option>\n              <option value=\"\">Custom hex</option>\n              @for (token of colorTokens; track token.value) {\n                <option [value]=\"token.value\">{{ token.label }}</option>\n              }\n            </select>\n            @if (isRangeToken(i, field.key)) {\n              <span class=\"color-range-preview\" [style.background]=\"rangePreview(i, field.key)\"></span>\n            } @else {\n              <input class=\"color-range-dot\" type=\"color\" [value]=\"rangeHexValue(i, field.key)\"\n                (input)=\"onRangeHexChange(i, field.key, $event)\" [disabled]=\"disabled()\" />\n            }\n          </div>\n        }\n      </div>\n    }\n    <button class=\"color-range-add\" (click)=\"addColorRange()\" [disabled]=\"disabled()\">+ Add range</button>\n  </div>\n  }\n\n\n  @case ('pivot_aggregations') {\n  <div class=\"pivot-aggs-editor\">\n    <label class=\"pivot-aggs-label\">{{ schema().label }}</label>\n    @for (a of getPivotAggregations(); track $index; let i = $index) {\n      <div class=\"pivot-agg-row\">\n        <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Field\" [value]=\"a.name || ''\"\n          (input)=\"onPivotAggChange(i, 'name', $event.target.value)\" [disabled]=\"disabled()\" />\n        <mat-form-field appearance=\"outline\" class=\"pivot-agg-fn\">\n          <mat-select [value]=\"a.aggregationFunction || 'sum'\" (valueChange)=\"onPivotAggChange(i, 'aggregationFunction', $event)\"\n            [disabled]=\"disabled()\">\n            @for (fn of aggFunctions; track fn) {\n            <mat-option [value]=\"fn\">{{ fn }}</mat-option>\n            }\n          </mat-select>\n        </mat-form-field>\n        <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Label\" [value]=\"a.label || ''\"\n          (input)=\"onPivotAggChange(i, 'label', $event.target.value)\" [disabled]=\"disabled()\" />\n        <label class=\"pivot-agg-sub\" title=\"Show subtotals\">\n          <input type=\"checkbox\" [checked]=\"a.showSubtotals !== false\"\n            (change)=\"onPivotAggChange(i, 'showSubtotals', $event.target.checked)\" [disabled]=\"disabled()\" />\n        </label>\n        <button class=\"pivot-agg-remove\" (click)=\"removePivotAggregation(i)\" [disabled]=\"disabled()\" title=\"Remove\">&times;</button>\n      </div>\n    }\n    <button class=\"pivot-agg-add\" (click)=\"addPivotAggregation()\" [disabled]=\"disabled()\">+ Add value</button>\n    @if (schema().description) {\n    <span class=\"pivot-aggs-hint\">{{ schema().description }}</span>\n    }\n  </div>\n  }\n\n\n  @case ('dependent_fields') {\n  <div class=\"pivot-aggs-editor\">\n    <label class=\"pivot-aggs-label\">{{ schema().label }}</label>\n    @for (p of getDependentFields(); track $index; let i = $index) {\n      <div class=\"pivot-agg-row\">\n        <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"This page's field\" [value]=\"p.def || ''\"\n          (input)=\"onDependentFieldChange(i, 'def', $event.target.value)\" [disabled]=\"disabled()\"\n          title=\"Field on this record whose value scopes the list (e.g. ind)\" />\n        <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Source key\" [value]=\"p.dpef || ''\"\n          (input)=\"onDependentFieldChange(i, 'dpef', $event.target.value)\" [disabled]=\"disabled()\"\n          title=\"Key in the option source to filter on. Blank reuses the field name (API sources only).\" />\n        <button class=\"pivot-agg-remove\" (click)=\"removeDependentField(i)\" [disabled]=\"disabled()\" title=\"Remove\">&times;</button>\n      </div>\n    }\n    <button class=\"pivot-agg-add\" (click)=\"addDependentField()\" [disabled]=\"disabled()\">+ Add dependency</button>\n    @if (schema().description) {\n    <span class=\"pivot-aggs-hint\">{{ schema().description }}</span>\n    }\n  </div>\n  }\n\n\n  @case ('chart_dimensions') {\n  <div class=\"pivot-aggs-editor\">\n    <label class=\"pivot-aggs-label\">{{ schema().label }}</label>\n    @for (d of getChartDimensions(); track $index; let i = $index) {\n      <div class=\"drill-level\">\n        <div class=\"drill-level-head\">\n          <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Column\" [value]=\"d.name || ''\"\n            (input)=\"onChartDimensionChange(i, 'name', $event.target.value)\" [disabled]=\"disabled()\" />\n          <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Label\" [value]=\"d.label || ''\"\n            (input)=\"onChartDimensionChange(i, 'label', $event.target.value)\" [disabled]=\"disabled()\" />\n          <input class=\"pivot-agg-num\" type=\"number\" min=\"0\" placeholder=\"Top N\" title=\"Top N for this dimension — rest clubbed as Others. Blank shows all.\"\n            [value]=\"d.top_n ?? ''\"\n            (input)=\"onChartDimensionChange(i, 'top_n', $event.target.value)\" [disabled]=\"disabled()\" />\n          <button class=\"pivot-agg-remove\" (click)=\"removeChartDimension(i)\" [disabled]=\"disabled()\" title=\"Remove\">&times;</button>\n        </div>\n        <div class=\"drill-level-head\">\n          <span class=\"drill-level-caption\">Drill into</span>\n          <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Column a click opens\" [value]=\"d.drill_into || ''\"\n            (input)=\"onChartDimensionChange(i, 'drill_into', $event.target.value)\" [disabled]=\"disabled()\" />\n          <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Drill label\" [value]=\"d.drill_label || ''\"\n            (input)=\"onChartDimensionChange(i, 'drill_label', $event.target.value)\" [disabled]=\"disabled()\" />\n          <input class=\"pivot-agg-num\" type=\"number\" min=\"0\" placeholder=\"Top N\" title=\"Top N for the drilled-to level\"\n            [value]=\"d.drill_top_n ?? ''\"\n            (input)=\"onChartDimensionChange(i, 'drill_top_n', $event.target.value)\" [disabled]=\"disabled()\" />\n        </div>\n        <div class=\"drill-level-head\">\n          <span class=\"drill-level-caption\">Colours</span>\n          <!-- Selected via `selected` on the options: the data model can land after\n               first render, and a select bound by value would show the wrong row. -->\n          <select class=\"pivot-agg-select pivot-agg-select-wide\"\n            (change)=\"onChartDimensionChange(i, 'color_entity', $any($event.target).value)\"\n            [disabled]=\"disabled()\" title=\"Entity holding the colour-bearing field\">\n            @for (e of colorEntityOptions(); track e.value) {\n            <option [value]=\"e.value\" [selected]=\"e.value === (d.color_entity || '')\">{{ e.label }}</option>\n            }\n          </select>\n          <select class=\"pivot-agg-select pivot-agg-select-wide\"\n            (change)=\"onChartDimensionChange(i, 'color_field', $any($event.target).value)\"\n            [disabled]=\"disabled()\" title=\"Field whose option colours paint this dimension\">\n            @for (f of colorFieldOptions(d.color_entity); track f.value) {\n            <option [value]=\"f.value\" [selected]=\"f.value === (d.color_field || '')\">{{ f.label }}</option>\n            }\n          </select>\n        </div>\n        <div class=\"drill-level-head\">\n          <span class=\"drill-level-caption\">Override</span>\n          <div class=\"value-color-list\">\n            @for (vc of dimensionColors(d); track $index; let j = $index) {\n              <div class=\"value-color-row\">\n                <span class=\"value-color-label\" [title]=\"vc.value\">{{ vc.value }}</span>\n                <select class=\"color-range-token\" [value]=\"isTokenColour(vc.color) ? vc.color : ''\"\n                  (change)=\"onDimensionColorChange(i, j, $any($event.target).value || hexOfColour(vc.color))\" [disabled]=\"disabled()\">\n                  <option value=\"\">Custom hex</option>\n                  @for (token of colorTokens; track token.value) {\n                    <option [value]=\"token.value\">{{ token.label }}</option>\n                  }\n                </select>\n                @if (isTokenColour(vc.color)) {\n                  <span class=\"color-range-preview\" [style.background]=\"vc.color\"></span>\n                } @else {\n                  <input class=\"color-range-dot\" type=\"color\" [value]=\"hexOfColour(vc.color)\"\n                    (input)=\"onDimensionColorChange(i, j, $any($event.target).value)\" [disabled]=\"disabled()\" />\n                }\n                <button class=\"pivot-agg-remove\" (click)=\"removeDimensionColor(i, j)\" [disabled]=\"disabled()\" title=\"Remove\">&times;</button>\n              </div>\n            }\n          </div>\n          <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Category value, then Enter\"\n            (keydown.enter)=\"addDimensionColor(i, $event)\" [disabled]=\"disabled()\"\n            title=\"Type the category exactly as it is plotted; pick its colour on the row that appears\" />\n        </div>\n        @if (d.drill_into) {\n          <div class=\"drill-level-head\">\n            <!-- `selected` on the options, not `value` on the select: the query list\n                 arrives asynchronously, so a select bound by value renders before it\n                 has any options, silently falls back to the first one, and then\n                 reports \"no query\" for a row that has one stored. -->\n            <select class=\"pivot-agg-select pivot-agg-select-wide\"\n              (change)=\"onChartDimensionChange(i, 'drill_query', $any($event.target).value)\" [disabled]=\"disabled()\"\n              title=\"Blank narrows the rows already loaded; a query re-runs that level\">\n              <option value=\"\" [selected]=\"!d.drill_query\">Same data (no query)</option>\n              @if (queryOptionMissing(d.drill_query)) {\n              <option [value]=\"d.drill_query\" [selected]=\"true\">{{ d.drill_query }}</option>\n              }\n              @for (o of queryOptions(); track o.value) {\n              <option [value]=\"o.value\" [selected]=\"o.value === d.drill_query\">{{ o.label }}</option>\n              }\n            </select>\n            <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Filter field (defaults to this column)\" [value]=\"d.drill_filter_field || ''\"\n              (input)=\"onChartDimensionChange(i, 'drill_filter_field', $event.target.value)\" [disabled]=\"disabled()\" />\n          </div>\n        }\n      </div>\n    }\n    <button class=\"pivot-agg-add\" (click)=\"addChartDimension()\" [disabled]=\"disabled()\">+ Add dimension</button>\n    @if (schema().description) {\n    <span class=\"pivot-aggs-hint\">{{ schema().description }}</span>\n    }\n  </div>\n  }\n\n\n  @case ('chart_measures') {\n  <div class=\"pivot-aggs-editor\">\n    <label class=\"pivot-aggs-label\">{{ schema().label }}</label>\n    @for (m of getChartMeasures(); track $index; let i = $index) {\n      <div class=\"drill-level\">\n        <div class=\"drill-level-head\">\n          <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Column\" [value]=\"m.name || ''\"\n            (input)=\"onChartMeasureChange(i, 'name', $event.target.value)\" [disabled]=\"disabled()\" />\n          <select class=\"pivot-agg-select\"\n            (change)=\"onChartMeasureChange(i, 'aggregation', $any($event.target).value)\" [disabled]=\"disabled()\">\n            @for (fn of chartAggFunctions; track fn) {\n            <option [value]=\"fn\" [selected]=\"fn === (m.aggregation || 'sum')\">{{ fn }}</option>\n            }\n          </select>\n          <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Label\" [value]=\"m.label || ''\"\n            (input)=\"onChartMeasureChange(i, 'label', $event.target.value)\" [disabled]=\"disabled()\" />\n          <button class=\"pivot-agg-remove\" (click)=\"removeChartMeasure(i)\" [disabled]=\"disabled()\" title=\"Remove\">&times;</button>\n        </div>\n        <div class=\"drill-level-head\">\n          <span class=\"drill-level-caption\">Format</span>\n          <select class=\"pivot-agg-select pivot-agg-select-wide\"\n            (change)=\"onChartMeasureChange(i, 'format_entity', $any($event.target).value)\"\n            [disabled]=\"disabled()\" title=\"Entity holding the field whose number format to follow\">\n            @for (e of colorEntityOptions(); track e.value) {\n            <option [value]=\"e.value\" [selected]=\"e.value === (m.format_entity || '')\">{{ e.label }}</option>\n            }\n          </select>\n          <select class=\"pivot-agg-select pivot-agg-select-wide\"\n            (change)=\"onChartMeasureChange(i, 'format_field', $any($event.target).value)\"\n            [disabled]=\"disabled()\" title=\"Field whose decimals, grouping, symbol and scale this measure follows\">\n            @for (f of formatFieldOptions(m.format_entity); track f.value) {\n            <option [value]=\"f.value\" [selected]=\"f.value === (m.format_field || '')\">{{ f.label }}</option>\n            }\n          </select>\n        </div>\n        <div class=\"drill-level-head\">\n          <span class=\"drill-level-caption\">Override</span>\n          <input class=\"pivot-agg-num\" type=\"text\" placeholder=\"₹\" [value]=\"m.symbol || ''\"\n            (input)=\"onChartMeasureChange(i, 'symbol', $event.target.value)\" [disabled]=\"disabled()\" title=\"Symbol\" />\n          <input class=\"pivot-agg-num\" type=\"number\" min=\"0\" placeholder=\"Dec\" [value]=\"m.decimal ?? ''\"\n            (input)=\"onChartMeasureChange(i, 'decimal', $event.target.value)\" [disabled]=\"disabled()\" title=\"Decimal places\" />\n          <select class=\"pivot-agg-select\"\n            (change)=\"onChartMeasureChange(i, 'seperator', $any($event.target).value)\" [disabled]=\"disabled()\" title=\"Digit grouping\">\n            <option value=\"\" [selected]=\"!m.seperator\">Grouping</option>\n            <option value=\"none\" [selected]=\"m.seperator === 'none'\">10000000</option>\n            <option value=\"thousands\" [selected]=\"m.seperator === 'thousands'\">1,00,00,000</option>\n            <option value=\"western\" [selected]=\"m.seperator === 'western'\">10,000,000</option>\n          </select>\n          <select class=\"pivot-agg-select\"\n            (change)=\"onChartMeasureChange(i, 'display_number_as', $any($event.target).value)\" [disabled]=\"disabled()\" title=\"Abbreviate large numbers\">\n            <option value=\"\" [selected]=\"!m.display_number_as\">Full</option>\n            <option value=\"lacs\" [selected]=\"m.display_number_as === 'lacs'\">L / Cr</option>\n            <option value=\"mn\" [selected]=\"m.display_number_as === 'mn'\">k / mn / bn</option>\n          </select>\n        </div>\n      </div>\n    }\n    <button class=\"pivot-agg-add\" (click)=\"addChartMeasure()\" [disabled]=\"disabled()\">+ Add measure</button>\n    @if (schema().description) {\n    <span class=\"pivot-aggs-hint\">{{ schema().description }}</span>\n    }\n  </div>\n  }\n\n\n  @case ('chart_value_colors') {\n  <div class=\"status-options-editor\">\n    <label class=\"status-options-label\">{{ schema().label }}</label>\n    @for (vc of getValueColors(); track $index; let i = $index) {\n      <div class=\"value-color-row\">\n        <span class=\"value-color-label\" [title]=\"vc.value\">{{ vc.value }}</span>\n        <!-- Same control as the colour-range rows: a design token, or a hex of\n             your own. A token keeps the chart in step with the theme. -->\n        <select class=\"color-range-token\" [value]=\"isTokenColour(vc.color) ? vc.color : ''\"\n          (change)=\"onValueColorChange(i, $any($event.target).value || hexOfColour(vc.color))\" [disabled]=\"disabled()\">\n          <option value=\"\">Custom hex</option>\n          @for (token of colorTokens; track token.value) {\n            <option [value]=\"token.value\">{{ token.label }}</option>\n          }\n        </select>\n        @if (isTokenColour(vc.color)) {\n          <span class=\"color-range-preview\" [style.background]=\"vc.color\"></span>\n        } @else {\n          <input class=\"color-range-dot\" type=\"color\" [value]=\"hexOfColour(vc.color)\"\n            (input)=\"onValueColorChange(i, $any($event.target).value)\" [disabled]=\"disabled()\" />\n        }\n        <button class=\"pivot-agg-remove\" (click)=\"removeValueColor(i)\" [disabled]=\"disabled()\" title=\"Remove\">&times;</button>\n      </div>\n    }\n    <input class=\"status-add-input\" type=\"text\" placeholder=\"Category value, then Enter\"\n      (keydown.enter)=\"addValueColor($event)\" [disabled]=\"disabled()\"\n      title=\"Type the category exactly as it is plotted; pick its colour on the row that appears\" />\n    @if (schema().description) {\n    <span class=\"pivot-aggs-hint\">{{ schema().description }}</span>\n    }\n  </div>\n  }\n\n\n  @case ('chart_extra_options') {\n  <div class=\"pivot-aggs-editor\">\n    <label class=\"pivot-aggs-label\">{{ schema().label }}</label>\n    @for (o of getChartExtraOptions(); track $index; let i = $index) {\n      <div class=\"pivot-agg-row\">\n        <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Option path\" [value]=\"o.path || ''\"\n          (input)=\"onChartExtraOptionChange(i, 'path', $event.target.value)\" [disabled]=\"disabled()\" />\n        <input class=\"pivot-agg-input\" type=\"text\" placeholder=\"Value\" [value]=\"o.value ?? ''\"\n          (input)=\"onChartExtraOptionChange(i, 'value', $event.target.value)\" [disabled]=\"disabled()\" />\n        <button class=\"pivot-agg-remove\" (click)=\"removeChartExtraOption(i)\" [disabled]=\"disabled()\" title=\"Remove\">&times;</button>\n      </div>\n    }\n    <button class=\"pivot-agg-add\" (click)=\"addChartExtraOption()\" [disabled]=\"disabled()\">+ Add option</button>\n    @if (schema().description) {\n    <span class=\"pivot-aggs-hint\">{{ schema().description }}</span>\n    }\n  </div>\n  }\n\n\n  @case ('date') {\n  <mat-form-field appearance=\"outline\">\n    <mat-label>{{ schema().label }}</mat-label>\n    <input matInput [matDatepicker]=\"propertyPicker\" [value]=\"value() || ''\"\n      (dateChange)=\"onDateChange($event)\" [placeholder]=\"schema().description || ''\" [disabled]=\"disabled()\" readonly />\n    <mat-datepicker-toggle matIconSuffix [for]=\"propertyPicker\"></mat-datepicker-toggle>\n    <mat-datepicker #propertyPicker></mat-datepicker>\n  </mat-form-field>\n  }\n\n  @default {\n  <mat-form-field appearance=\"outline\">\n    <mat-label>{{ schema().label }}</mat-label>\n    <input matInput [value]=\"value() || ''\" (input)=\"onInputChange($event)\"\n      [placeholder]=\"'Enter ' + schema().label.toLowerCase()\" [disabled]=\"disabled()\" />\n    <!--  @if (schema().description) {\n          <mat-hint>{{ schema().description }}</mat-hint>\n        } -->\n  </mat-form-field>\n  }\n  }\n</div>","import { Component, inject, computed, effect, signal, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n// The set of field attributes the data model owns. Shared with eru-grid rather\n// than redeclared, so the panel can never disagree with the grid about which\n// keys are inherited.\nimport { INHERITED_FIELD_KEYS } from 'eru-grid';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { FormsModule } from '@angular/forms';\nimport { EruStudioStore, ComponentRegistryService, PropertyToTailwindService, ComponentSchemaService } from '../../services';\nimport { PropertyEditorComponent } from '../property-editor/property-editor.component';\nimport { PayloadFieldsPickerComponent } from '../payload-fields-picker/payload-fields-picker.component';\nimport { EruPage, EruComponent, PropertySchema, PropertyCategory, TailwindBreakpoint, VisibilityRule, ComponentEventSubscription, ValidationRule, Entity, EntityField, UpdateStateFormula, NavParam } from '../../models';\nimport { StyleSchema } from '../base-component/base-component';\n\n@Component({\n  selector: 'eru-properties-panel',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatTabsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatSliderModule,\n    MatButtonModule,\n    MatIconModule,\n    MatDividerModule,\n    MatChipsModule,\n    MatSlideToggleModule,\n    MatAutocompleteModule,\n    MatTooltipModule,\n    FormsModule,\n    PropertyEditorComponent,\n    PayloadFieldsPickerComponent\n  ],\n  templateUrl: './properties-panel.component.html',\n  styleUrl: './properties-panel.component.scss'\n})\nexport class PropertiesPanelComponent {\n  private store = inject(EruStudioStore);\n  private registry = inject(ComponentRegistryService);\n  private tailwindService = inject(PropertyToTailwindService);\n  private schemaService = inject(ComponentSchemaService);\n\n  readonly selectedComponent = this.store.selectedComponent;\n  readonly currentPage = this.store.currentPage;\n  readonly currentBreakpoint = computed(() => this.store.viewport().breakpoint as TailwindBreakpoint | 'base');\n  readonly entities = computed(() => this.store.getEntities());\n\n  entityInputControl = signal<string>('');\n  filteredEntities = computed(() => {\n    const inputValue = this.entityInputControl().toLowerCase();\n    const allEntities = this.entities();\n\n    if (!inputValue) {\n      return allEntities;\n    }\n\n    return allEntities.filter((entity: Entity) => {\n      const name = (entity.name || '').toLowerCase();\n      const displayName = (entity.display_name || '').toLowerCase();\n      return name.includes(inputValue) || displayName.includes(inputValue);\n    });\n  });\n\n  readonly componentDefinition = computed(() => {\n    const component = this.selectedComponent();\n    if (!component) return null;\n\n    return this.registry.getComponent(component.type);\n  });\n\n  readonly propertySchema = computed(() => {\n    const component = this.selectedComponent();\n    if (!component) return [];\n\n    // Get dynamic schema from ComponentSchemaService\n    return this.schemaService.getPropertySchema(component.type);\n  });\n\n  readonly styleSchema = computed(() => {\n    const component = this.selectedComponent();\n\n    if (!component) return [];\n\n    // Get dynamic style schema\n    return this.schemaService.getStyleSchema(component.type);\n  });\n\n  // Computed signal to check if schema is loading\n  readonly isSchemaLoading = computed(() => {\n    const component = this.selectedComponent();\n    if (!component) return false;\n\n    return !this.schemaService.isComponentRegistered(component.type)();\n  });\n\n  constructor() {\n    effect(() => {\n      const component = this.selectedComponent();\n      if (component) {\n        const isRegistered = this.schemaService.isComponentRegistered(component.type);\n\n        if (!isRegistered()) {\n          const definition = this.registry.getComponent(component.type);\n          if (definition?.component?.prototype) {\n            const proto = definition.component.prototype;\n            const propertySchema = proto.getPropertySchema?.call(proto) || proto.getComponentPropertySchema?.call(proto) || [];\n            const styleSchema = proto.getStyleSchema?.call(proto) || proto.getComponentStyleSchema?.call(proto) || [];\n            const events = proto.componentEvents || [];\n            if (propertySchema.length > 0 || styleSchema.length > 0) {\n              this.schemaService.registerComponentSchema(component.type, propertySchema, styleSchema, events);\n            }\n          }\n        }\n\n        // Load existing event subscriptions\n        this._eventSubscriptions.set(component.events || []);\n        // Load existing validation rules\n        this._validationRules.set(component.validation_rules || []);\n        // Reset the transient background image-mode marker ONLY when the\n        // selected component actually changes (by id). This effect also fires\n        // when the current component's styles are edited (new object emitted);\n        // resetting then would wipe the marker the instant the user picks\n        // Image and setBgFillMode writes a style.\n        if (this._lastSelectedId !== component.id) {\n          this._lastSelectedId = component.id;\n          this.bgImageMode.set(false);\n        }\n      } else {\n        // Clear event subscriptions when no component is selected\n        this._eventSubscriptions.set([]);\n        // Clear validation rules when no component is selected\n        this._validationRules.set([]);\n        this._lastSelectedId = null;\n        this.bgImageMode.set(false);\n      }\n    });\n\n    effect(() => {\n      const currentReqId = this._lastReqIdPages();\n      if (currentReqId) {\n        const response = this.store.getDynamicDataResponse(currentReqId);\n        if (response) {\n          untracked(() => this._availablePages.set(response));\n        }\n        return;\n      }\n      const globalData = this.store.getDynamicData('ds_all_page_name');\n      if (globalData) {\n        untracked(() => this._availablePages.set(globalData));\n        return;\n      }\n      untracked(() => {\n        const reqId = this.store.requestDynamicData(this.PANEL_ID, 'ds_all_page_name', '');\n        this._lastReqIdPages.set(reqId);\n      });\n    });\n\n    // Effect to sync entity input control with current page entity\n    effect(() => {\n      const page = this.currentPage();\n      if (page) {\n        this.entityInputControl.set(page.entity_name || '');\n        this.store.setDynamicData('entity_field_name', this.store.getEntityFields(page.entity_name || '').map((field: EntityField) => ({ label: field.label, value: field.name })));\n        const children = this.store.getEntities() || [];\n        this.store.setDynamicData('ds_entity_name', children.map((ent: any) => ({ label: ent.display_name || ent.name, value: ent.name })));\n      }\n    });\n  }\n\n  getPropertyCategories(): PropertyCategory[] {\n    const schemas = this.propertySchema();\n    const categories = new Set<PropertyCategory>();\n    schemas.forEach((schema: PropertySchema) => { if (schema.visible !== false) categories.add(schema.category); });\n    const order: PropertyCategory[] = ['content', 'data', 'layout', 'behavior', 'events'];\n    return order.filter(cat => categories.has(cat));\n  }\n\n  getPropertiesByCategory(category: PropertyCategory): PropertySchema[] {\n    return this.propertySchema().filter((schema: PropertySchema) => schema.category === category && schema.visible !== false);\n  }\n\n  /**\n   * The visible properties of a category, each carrying the sub-heading to draw\n   * above it (null when it continues the previous one). Computed here rather\n   * than in the template because the heading depends on the *previous visible*\n   * property — a `visible_if` that hides the first member of a section has to\n   * move the heading onto whichever member survives.\n   */\n  getPropertyRows(category: PropertyCategory): { schema: PropertySchema; section: string | null }[] {\n    const rows: { schema: PropertySchema; section: string | null }[] = [];\n    let previous: string | undefined;\n    for (const schema of this.getPropertiesByCategory(category)) {\n      if (!this.isPropertyVisible(schema)) continue;\n      rows.push({ schema, section: schema.section && schema.section !== previous ? schema.section : null });\n      previous = schema.section;\n    }\n    return rows;\n  }\n\n  getStyleCategories(): string[] {\n    const schemas = this.styleSchema();\n    const categories = new Set<string>();\n    schemas.forEach((schema: StyleSchema) => categories.add(schema.category));\n    const order = ['layout', 'style', 'typography', 'spacing', 'border', 'background'];\n    return order.filter(cat => categories.has(cat));\n  }\n\n  getStylesByCategory(category: string): StyleSchema[] {\n    return this.styleSchema().filter((schema: StyleSchema) => schema.category === category);\n  }\n\n  /**\n   * The entity field the selected component is bound to, or null when it is\n   * unbound. Mirrors BaseComponent.fieldValue() so the panel resolves the same\n   * field the component itself reads from.\n   */\n  private readonly boundEntityField = computed<Record<string, any> | null>(() => {\n    const component = this.selectedComponent();\n    if (!component) return null;\n    const fieldName = component.properties?.['base']?.['name'];\n    if (!fieldName) return null;\n    const entityName = this.store.getPageEntityName(component.pageId || '');\n    return (this.store.getEntityField(fieldName, entityName) as Record<string, any>) || null;\n  });\n\n  /**\n   * Property keys whose studio name differs from the data-model key, with the\n   * transform needed to show the model's value in the panel's control. Every\n   * other inherited key matches by name and needs neither.\n   */\n  private static readonly INHERITED_ALIASES: Record<string, { modelKey: string; toDisplay?: (v: any) => any }> = {\n    // The model owns the field default; studio's control is `default_value`.\n    default_value: { modelKey: 'default' },\n    // The model's `name` is what studio stores as the bound field's own name.\n    entity_field_name: { modelKey: 'name' },\n    // A select's static list is an options array in the model and a\n    // comma-separated string in the panel's textarea.\n    static_options: {\n      modelKey: 'options',\n      toDisplay: (v: any) => Array.isArray(v)\n        ? v\n          .map((o: any) => (o && typeof o === 'object') ? (o.name ?? o.label ?? o.value ?? '') : o)\n          .filter((o: any) => o !== undefined && o !== null && String(o).length > 0)\n          .join(',')\n        : v\n    }\n  };\n\n  /**\n   * Value to show for an inherited property, or undefined when the property is\n   * not inherited (unbound component, or a key the data model does not own).\n   *\n   * This is what lets the panel stop *copying* model values into the page. The\n   * control is already locked by disable_if for these keys; previously the only\n   * way to show the real value was to write it into the component's stored\n   * properties on bind, which left the page holding a snapshot that drifted as\n   * soon as the data model changed. Reading it here instead means the model\n   * stays the single source of truth and the panel still shows the truth.\n   */\n  private static readonly SEEDED_KEYS: readonly string[] = [\n    'storage_name', 'folder_name', 'default_upload',\n  ];\n\n  /** The component's own stored value for a key, ignoring any inheritance. */\n  private storedPropertyValue(key: string): any {\n    const stored = this.selectedComponent()?.properties?.['base']?.[key];\n    return stored === null || stored === '' ? undefined : stored;\n  }\n\n  /**\n   * The field a tag's option list comes from: `options_from_field` when the\n   * author pointed it at another field, otherwise the one it is bound to.\n   */\n  private optionsSourceField(): Record<string, any> | null {\n    const component = this.selectedComponent();\n    const borrowed = String(component?.properties?.['base']?.['options_from_field'] || '').trim();\n    if (!borrowed) return this.boundEntityField();\n    const entityName = this.store.getPageEntityName(component?.pageId || '');\n    return (this.store.getEntityField(borrowed, entityName) as Record<string, any>) || null;\n  }\n\n  /**\n   * `open_status` + `close_status` as the single list the options editor draws.\n   * Entries keep the model's `name`, which the editor already reads alongside\n   * `label`, so nothing is lost writing back.\n   */\n  private statusGroupsAsOptions(field: Record<string, any>): any[] {\n    const out: any[] = [];\n    const seen = new Set<string>();\n    const collect = (raw: any, fallback: string) => {\n      let parsed = raw;\n      if (typeof parsed === 'string') {\n        try { parsed = JSON.parse(parsed); } catch { return; }\n      }\n      if (!Array.isArray(parsed)) return;\n      for (const option of parsed) {\n        const name = String(\n          (typeof option === 'string' ? option : (option?.name ?? option?.label)) ?? ''\n        ).trim();\n        if (!name || seen.has(name)) continue;\n        seen.add(name);\n        out.push({ name, color: (typeof option === 'object' && option?.color) || fallback });\n      }\n    };\n    collect(field['open_status'], '#22C55E');\n    collect(field['close_status'], '#EF4444');\n    return out;\n  }\n\n  private inheritedPropertyValue(key: string): any {\n    // Resolved before the bound-field guard below, because both cases this\n    // covers can apply with nothing bound: a status field keeps its values in\n    // open_status/close_status rather than `options`, and `options_from_field`\n    // borrows another field's list entirely. Without this the panel kept\n    // showing the component's placeholder list while the page rendered the\n    // field's — the control and the canvas disagreeing about the same list.\n    if (key === 'options') {\n      const source = this.optionsSourceField();\n      if (source) {\n        if (source['open_status'] || source['close_status']) {\n          const merged = this.statusGroupsAsOptions(source);\n          if (merged.length > 0) return merged;\n        }\n        const borrowed = source['options'];\n        if (Array.isArray(borrowed) && borrowed.length > 0) return borrowed;\n      }\n    }\n    const field = this.boundEntityField();\n    if (!field) return undefined;\n    // `editable` means two different things either side of this boundary. On a\n    // control it is \"does a double click open the editor\"; in the data model it\n    // is the rollup-override toggle — whether a derived-from-child value may be\n    // typed over — and it is stored false for ordinary fields, \"can users edit\n    // this\" being `can_edit`. Inheriting it showed the Editable switch off for\n    // fields that are perfectly editable, while the runtime read the component's\n    // own property and let the user edit: the panel said one thing and the page\n    // did another. The runtime does not inherit this key, so neither does the\n    // panel. (The grid draws the same distinction in entityFieldEditable().)\n    if (key === 'editable') return undefined;\n    // An attachment's upload destination is seeded by the field, not owned by\n    // it: the runtime resolves these property-first (propertyOrModel), so once\n    // the component carries its own value the panel has to show that value —\n    // masking it with the model's would leave the override invisible while the\n    // page uploaded somewhere else.\n    if (PropertiesPanelComponent.SEEDED_KEYS.includes(key) &&\n        this.storedPropertyValue(key) !== undefined) {\n      return undefined;\n    }\n    const alias = PropertiesPanelComponent.INHERITED_ALIASES[key];\n    const modelKey = alias?.modelKey ?? key;\n    if (!INHERITED_FIELD_KEYS.includes(modelKey)) return undefined;\n    const raw = field[modelKey];\n    if (raw === undefined || raw === null || raw === '') return undefined;\n    return alias?.toDisplay ? alias.toDisplay(raw) : raw;\n  }\n\n  readonly currentPropertyValue = computed(() => {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    const schema = this.propertySchema();\n    // Read here so the closure re-evaluates when the binding changes.\n    this.boundEntityField();\n    if (!component) return (key: string) => undefined;\n\n    return (key: string) => {\n      const inherited = this.inheritedPropertyValue(key);\n      if (inherited !== undefined) return inherited;\n\n      const propertySchema = schema.find((s: PropertySchema) => s.key === key);\n      if (propertySchema?.responsive === true) {\n        return this.tailwindService.getPropertyValueForBreakpoint(\n          component.properties as any,\n          key,\n          breakpoint,\n          true\n        );\n      }\n      const baseProps = component.properties['base'];\n      return baseProps?.[key];\n    };\n  });\n\n  // True when the current breakpoint has its own stored value for a property.\n  // Includes 'base' so the clear button is offered there too — clearing a base\n  // value resets the property (there's no lower layer to inherit from).\n  readonly hasBreakpointOverride = computed(() => {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    if (!component) return (_key: string) => false;\n    return (key: string) => {\n      const bp = component.properties?.[breakpoint];\n      return !!bp && Object.prototype.hasOwnProperty.call(bp, key);\n    };\n  });\n\n  // True when a responsive property is showing the value inherited from 'base'\n  // because the current (non-base) breakpoint has none of its own.\n  readonly isInheritedFromBase = computed(() => {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    const schema = this.propertySchema();\n    if (!component || breakpoint === 'base') return (_key: string) => false;\n    return (key: string) => {\n      const propertySchema = schema.find((s: PropertySchema) => s.key === key);\n      if (propertySchema?.responsive !== true) return false;\n      const bp = component.properties?.[breakpoint];\n      if (bp && Object.prototype.hasOwnProperty.call(bp, key)) return false;\n      return component.properties?.['base']?.[key] !== undefined;\n    };\n  });\n\n  clearBreakpointOverride(propertyName: string): void {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    if (!component) return;\n    this.store.clearComponentPropertyAtBreakpoint(component.id, propertyName, breakpoint);\n  }\n\n  /**\n   * Which half of a read-only display the Typography group is editing.\n   *\n   * A view-mode control draws two pieces of text — its label and its value —\n   * and the Styles tab owns the VALUE. Rather than doubling the group with a\n   * second set of Font Size / Text Color / Font Weight controls, the same\n   * controls are repointed: on 'label' every typography key is stored and read\n   * with a `label_` prefix, which is what `BaseComponent.displayLabelStyles()`\n   * renders. Same pattern as the Solid / Gradient / Image switch on\n   * `background_color`, one group up.\n   */\n  readonly styleTarget = signal<'value' | 'label'>('value');\n\n  private readonly resetStyleTargetOnSelection = effect(() => {\n    // Selecting another component resets the switch. A sticky target is how an\n    // author ends up editing a label and wondering why the value never changes.\n    this.selectedComponent()?.id;\n    untracked(() => this.styleTarget.set('value'));\n  });\n\n  /** Style keys the target switch applies to — the Typography group. */\n  private static readonly TARGETABLE_STYLE_KEYS = new Set<string>([\n    'font_size', 'color', 'font_weight', 'font_family',\n    'letter_spacing', 'text_align', 'text_transform',\n  ]);\n\n  /**\n   * The stored key for a style control, given the active target. Anything\n   * outside the typography set is never prefixed, so switching the target\n   * cannot silently repoint padding or a background.\n   */\n  private targetedStyleKey(key: string): string {\n    return this.styleTarget() === 'label'\n      && PropertiesPanelComponent.TARGETABLE_STYLE_KEYS.has(key)\n      ? `label_${key}`\n      : key;\n  }\n\n  /**\n   * Whether the target switch is offered at all: only for a control that\n   * actually draws a label, which is the ones declaring a `label` property.\n   * A container, grid or chart has no second piece of text to point at.\n   */\n  readonly supportsLabelTarget = computed<boolean>(() =>\n    this.propertySchema().some((s: PropertySchema) => s.key === 'label'));\n\n  setStyleTarget(target: 'value' | 'label'): void {\n    this.styleTarget.set(target);\n  }\n\n  readonly currentStyleValue = computed(() => {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    const target = this.styleTarget();\n\n    if (!component) return (key: string) => undefined;\n\n    // Create a function that captures the current component and breakpoint\n    return (key: string) => {\n      return this.tailwindService.getPropertyValueForBreakpoint(\n        component.styles.responsive_styles,\n        this.targetedStyleKey(key),\n        breakpoint,\n        true\n      );\n    };\n  });\n\n  updateProperty(propertyName: string, value: any) {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    if (component) {\n      const schema = this.propertySchema().find((s: PropertySchema) => s.key === propertyName);\n\n      if (schema?.on_value_change) {\n        const oldValue = this.currentPropertyValue()(propertyName);\n        schema.on_value_change(value, oldValue);\n      }\n      /* var entityField = undefined;\n      if (propertyName === 'page') {\n        const pageEntity = this.store.getComponentProperty('entity_name');\n        this.store.setComponentDynamicDataRequest(component.id, 'ds_nestedpage_entity_name', value + '#' + pageEntity);\n      } else if (propertyName === 'name') {\n        entityField = this.store.getEntityField(value);\n      } */\n      if (schema?.responsive === false) {\n        this.store.updateComponentPropertyAtBreakpoint(component.id, propertyName, value, 'base');\n        /* if (entityField) {\n          this.store.updateComponentPropertyAtBreakpoint(component.id, 'option_type', entityField.option_type, 'base');\n          this.store.updateComponentPropertyAtBreakpoint(component.id, 'static_options', entityField.options?.join(',') || '', 'base');\n          this.store.updateComponentPropertyAtBreakpoint(component.id, 'api_name', entityField.api_name, 'base');\n          this.store.updateComponentPropertyAtBreakpoint(component.id, 'entity_name', entityField.entity_name, 'base');\n          this.store.updateComponentPropertyAtBreakpoint(component.id, 'entity_field_name', entityField.name, 'base');\n          const children = this.store.getEntities() || [];\n          this.store.setDynamicData('ds_entity_name', children.map((ent: any) => ({ label: ent.display_name || ent.name, value: ent.name })));\n        } */\n      } else {\n        this.store.updateComponentPropertyAtBreakpoint(component.id, propertyName, value, breakpoint);\n      }\n    }\n  }\n\n  updateStyleProperty(propertyName: string, event: Event) {\n    const target = event.target as HTMLInputElement;\n    const value = target.value;\n\n    const component = this.selectedComponent();\n    if (component) {\n      this.store.updateComponentStyle(component.id, propertyName, value);\n    }\n  }\n\n  updateStylePropertyAtBreakpoint(propertyName: string, value: any) {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    if (component) {\n      this.store.updateStylePropertyAtBreakpoint(component.id, this.targetedStyleKey(propertyName), value, breakpoint);\n    }\n  }\n\n  clearStylePropertyAtBreakpoint(propertyName: string) {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    if (component) {\n      this.store.clearStylePropertyAtBreakpoint(component.id, this.targetedStyleKey(propertyName), breakpoint);\n    }\n  }\n\n  /** True when the current (non-base) breakpoint has its own value for a style\n   *  key — i.e. a \"remove this override, inherit base\" action is meaningful. */\n  // True when the current breakpoint has its own stored value for a style key.\n  // Includes 'base' so the clear button is offered there too (clearing a base\n  // style removes it entirely, reverting to the component default).\n  readonly hasStyleBreakpointOverride = computed(() => {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    const target = this.styleTarget();\n    if (!component) return (_key: string) => false;\n    return (key: string) => {\n      const bp = component.styles?.responsive_styles?.[breakpoint];\n      return !!bp && Object.prototype.hasOwnProperty.call(bp, this.targetedStyleKey(key));\n    };\n  });\n\n  // ---- Background gradient (background-only) --------------------------------\n  private readonly GRADIENT_KEY = 'background';\n\n  bgIsGradient(): boolean {\n    const v = this.currentStyleValue()(this.GRADIENT_KEY);\n    return typeof v === 'string' && v.includes('linear-gradient');\n  }\n\n  private parseGradient(): { angle: number; c1: string; c2: string } {\n    const v = this.currentStyleValue()(this.GRADIENT_KEY);\n    const fallback = { angle: 135, c1: 'var(--studio-primary)', c2: 'var(--studio-primary-container)' };\n    if (typeof v !== 'string') return fallback;\n    const m = v.match(/^linear-gradient\\(\\s*([\\d.]+)deg\\s*,\\s*(.+?)\\s+0%\\s*,\\s*(.+?)\\s+100%\\s*\\)$/i);\n    if (!m) return fallback;\n    return { angle: Number(m[1]), c1: m[2].trim(), c2: m[3].trim() };\n  }\n\n  private writeGradient(g: { angle: number; c1: string; c2: string }): void {\n    this.updateStylePropertyAtBreakpoint(\n      this.GRADIENT_KEY,\n      `linear-gradient(${g.angle}deg, ${g.c1} 0%, ${g.c2} 100%)`\n    );\n  }\n\n  setBgFillMode(mode: string): void {\n    if (mode === 'gradient') {\n      this.bgImageMode.set(false);\n      this.clearBgImage();\n      if (!this.bgIsGradient()) this.writeGradient(this.parseGradient());\n    } else if (mode === 'image') {\n      // Image wins over the gradient shorthand (which would otherwise mask\n      // background-image). Seed sensible defaults so the preview looks right\n      // as soon as a resource is picked.\n      this.clearStylePropertyAtBreakpoint(this.GRADIENT_KEY);\n      this.bgImageMode.set(true);\n      if (!this.currentStyleValue()('background_size')) this.updateStylePropertyAtBreakpoint('background_size', 'cover');\n      if (!this.currentStyleValue()('background_position')) this.updateStylePropertyAtBreakpoint('background_position', 'center');\n      if (!this.currentStyleValue()('background_repeat')) this.updateStylePropertyAtBreakpoint('background_repeat', 'no-repeat');\n    } else {\n      // back to solid: drop the gradient key AND any background image so\n      // background_color applies.\n      this.bgImageMode.set(false);\n      this.clearStylePropertyAtBreakpoint(this.GRADIENT_KEY);\n      this.clearBgImage();\n    }\n  }\n\n  // ---- Background image (background-only) -----------------------------------\n  readonly bgImageMode = signal(false);\n  private _lastSelectedId: string | null = null;\n\n  bgIsImage(): boolean {\n    return this.bgImageMode() || !!this.currentStyleValue()('background_image');\n  }\n\n  getBgImage(): string {\n    return this.currentStyleValue()('background_image') || '';\n  }\n\n  setBgImage(value: string): void {\n    if (value) {\n      this.updateStylePropertyAtBreakpoint('background_image', value);\n    } else {\n      this.clearStylePropertyAtBreakpoint('background_image');\n    }\n  }\n\n  private clearBgImage(): void {\n    this.clearStylePropertyAtBreakpoint('background_image');\n    this.clearStylePropertyAtBreakpoint('background_size');\n    this.clearStylePropertyAtBreakpoint('background_position');\n    this.clearStylePropertyAtBreakpoint('background_repeat');\n  }\n\n  getBgImageOption(key: string, fallback: string): string {\n    return this.currentStyleValue()(key) || fallback;\n  }\n\n  setBgImageOption(key: string, value: string): void {\n    this.updateStylePropertyAtBreakpoint(key, value);\n  }\n\n  readonly bgSizeOptions = [\n    { label: 'Cover', value: 'cover' },\n    { label: 'Contain', value: 'contain' },\n    { label: 'Auto', value: 'auto' },\n    { label: 'Stretch', value: '100% 100%' }\n  ];\n  readonly bgPositionOptions = [\n    { label: 'Center', value: 'center' },\n    { label: 'Top', value: 'top' },\n    { label: 'Bottom', value: 'bottom' },\n    { label: 'Left', value: 'left' },\n    { label: 'Right', value: 'right' },\n    { label: 'Top Left', value: 'top left' },\n    { label: 'Top Right', value: 'top right' },\n    { label: 'Bottom Left', value: 'bottom left' },\n    { label: 'Bottom Right', value: 'bottom right' }\n  ];\n  readonly bgRepeatOptions = [\n    { label: 'No Repeat', value: 'no-repeat' },\n    { label: 'Repeat', value: 'repeat' },\n    { label: 'Repeat X', value: 'repeat-x' },\n    { label: 'Repeat Y', value: 'repeat-y' }\n  ];\n\n  private lastRequestIdImages = signal<string | null>(null);\n  readonly availableImages = computed(() => {\n    const dynamicOptions = 'ds_images';\n    const requesterId = this.selectedComponent()?.id || this.PANEL_ID;\n    this.store.dynamicDataResponses();\n    const currentReqId = this.lastRequestIdImages();\n    if (currentReqId) {\n      const response = this.store.getDynamicDataResponse(currentReqId);\n      if (Array.isArray(response)) return response;\n    }\n    const dynamicData = this.store.getDynamicData(dynamicOptions);\n    if (dynamicData && Array.isArray(dynamicData)) return dynamicData;\n    untracked(() => {\n      const reqId = this.store.requestDynamicData(requesterId, dynamicOptions, '');\n      this.lastRequestIdImages.set(reqId);\n    });\n    return [];\n  });\n\n  bgImagePreview(): string {\n    const img = this.getBgImage();\n    return img ? `url(${img})` : '';\n  }\n\n  getGradientAngle(): number {\n    return this.parseGradient().angle;\n  }\n\n  setGradientAngle(v: any): void {\n    const angle = Math.max(0, Math.min(360, Number(v) || 0));\n    this.writeGradient({ ...this.parseGradient(), angle });\n  }\n\n  private gradientStop(i: 1 | 2): string {\n    const g = this.parseGradient();\n    return i === 1 ? g.c1 : g.c2;\n  }\n\n  isGradientStopToken(i: 1 | 2): boolean {\n    return this.extractToken(this.gradientStop(i)) !== null;\n  }\n\n  getGradientStopToken(i: 1 | 2): string {\n    return this.extractToken(this.gradientStop(i)) || '';\n  }\n\n  getGradientStopHex(i: 1 | 2): string {\n    const rgba = this.parseColor(this.gradientStop(i));\n    return rgba ? this.toHex(rgba.r, rgba.g, rgba.b) : '#000000';\n  }\n\n  setGradientStopToken(i: 1 | 2, tokenValue: string): void {\n    const g = this.parseGradient();\n    const color = tokenValue || this.getGradientStopHex(i) || '#000000';\n    this.writeGradient(i === 1 ? { ...g, c1: color } : { ...g, c2: color });\n  }\n\n  setGradientStopHex(i: 1 | 2, hex: string): void {\n    const g = this.parseGradient();\n    this.writeGradient(i === 1 ? { ...g, c1: hex } : { ...g, c2: hex });\n  }\n\n  gradientPreview(): string {\n    const g = this.parseGradient();\n    return `linear-gradient(${g.angle}deg, ${g.c1} 0%, ${g.c2} 100%)`;\n  }\n\n  readonly styleColorTokens = [\n    { label: 'Primary', value: 'var(--studio-primary)' },\n    { label: 'On Primary', value: 'var(--studio-on-primary)' },\n    { label: 'Primary Container', value: 'var(--studio-primary-container)' },\n    { label: 'On Primary Container', value: 'var(--studio-on-primary-container)' },\n    { label: 'Secondary', value: 'var(--studio-secondary)' },\n    { label: 'On Secondary', value: 'var(--studio-on-secondary)' },\n    { label: 'Secondary Container', value: 'var(--studio-secondary-container)' },\n    { label: 'On Secondary Container', value: 'var(--studio-on-secondary-container)' },\n    { label: 'Tertiary', value: 'var(--studio-tertiary)' },\n    { label: 'On Tertiary', value: 'var(--studio-on-tertiary)' },\n    { label: 'Tertiary Container', value: 'var(--studio-tertiary-container)' },\n    { label: 'On Tertiary Container', value: 'var(--studio-on-tertiary-container)' },\n    { label: 'Surface', value: 'var(--studio-surface)' },\n    { label: 'Surface Variant', value: 'var(--studio-surface-variant)' },\n    { label: 'Surface Container', value: 'var(--studio-surface-container)' },\n    { label: 'On Surface', value: 'var(--studio-on-surface)' },\n    { label: 'On Surface Variant', value: 'var(--studio-on-surface-variant)' },\n    { label: 'Outline', value: 'var(--studio-outline)' },\n    { label: 'Outline Variant', value: 'var(--studio-outline-variant)' },\n    { label: 'Error', value: 'var(--studio-error)' },\n    { label: 'Error Container', value: 'var(--studio-error-container)' },\n    { label: 'Base Surface (white/dark)', value: 'var(--studio-base-surface)' },\n    { label: 'Base On Surface (black/light)', value: 'var(--studio-base-on-surface)' },\n    { label: 'Base Border', value: 'var(--studio-base-border)' },\n  ];\n\n  /** Extract a `var(--studio-*)` token from a plain token value or a\n   *  color-mix(in srgb, <token> N%, transparent) wrapper. Null if not a token. */\n  private extractToken(v: any): string | null {\n    if (typeof v !== 'string') return null;\n    const s = v.trim();\n    if (s.startsWith('var(--studio-')) return s;\n    const m = s.match(/^color-mix\\(\\s*in\\s+srgb\\s*,\\s*(var\\(--studio-[^)]+\\))\\s+[\\d.]+%\\s*,\\s*transparent\\s*\\)$/i);\n    return m ? m[1] : null;\n  }\n\n  isStyleTokenColor(key: string): boolean {\n    return this.extractToken(this.currentStyleValue()(key)) !== null;\n  }\n\n  /** The token to preselect in the token dropdown ('' when custom). */\n  getStyleTokenValue(key: string): string {\n    return this.extractToken(this.currentStyleValue()(key)) || '';\n  }\n\n  getStyleHexColor(key: string, defaultValue: string): string {\n    const v = this.currentStyleValue()(key);\n    if (!v || (typeof v === 'string' && (v.startsWith('var(') || v.startsWith('color-mix')))) {\n      const dv = defaultValue || '#000000';\n      const parsed = this.parseColor(dv);\n      return parsed ? this.toHex(parsed.r, parsed.g, parsed.b) : '#000000';\n    }\n    const rgba = this.parseColor(v);\n    return rgba ? this.toHex(rgba.r, rgba.g, rgba.b) : (defaultValue || '#000000');\n  }\n\n  /** Current alpha of a style color as a 0–100 percentage (100 = opaque). */\n  getStyleAlpha(key: string, defaultValue: string): number {\n    const v = this.currentStyleValue()(key);\n    const mix = typeof v === 'string' && v.match(/color-mix\\(.+\\s([\\d.]+)%\\s*,\\s*transparent\\s*\\)\\s*$/i);\n    if (mix) return Math.max(0, Math.min(100, Math.round(Number(mix[1]))));\n    if (typeof v === 'string' && v.startsWith('var(')) return 100;\n    const src = (!v) ? (defaultValue || '') : v;\n    const rgba = this.parseColor(src);\n    return rgba ? Math.round(rgba.a * 100) : 100;\n  }\n\n  updateStyleColorHex(key: string, hexInput: string): void {\n    const rgba = this.parseColor(hexInput) || { r: 0, g: 0, b: 0, a: 1 };\n    const a = this.getStyleAlpha(key, '') / 100;\n    this.updateStylePropertyAtBreakpoint(key, this.composeColor(rgba.r, rgba.g, rgba.b, a));\n  }\n\n  updateStyleOpacity(key: string, pctInput: string): void {\n    const pct = Math.max(0, Math.min(100, Number(pctInput)));\n    const token = this.getStyleTokenValue(key);\n    if (token) {\n      this.updateStylePropertyAtBreakpoint(key, this.composeTokenColor(token, pct / 100));\n      return;\n    }\n    const rgba = this.parseColor(this.getStyleHexColor(key, '#000000')) || { r: 0, g: 0, b: 0, a: 1 };\n    this.updateStylePropertyAtBreakpoint(key, this.composeColor(rgba.r, rgba.g, rgba.b, pct / 100));\n  }\n\n  private composeColor(r: number, g: number, b: number, a: number): string {\n    if (a >= 1) return this.toHex(r, g, b);\n    return `rgba(${r},${g},${b},${Math.round(a * 100) / 100})`;\n  }\n\n  /** Token color with optional opacity via color-mix (theme-reactive). */\n  private composeTokenColor(token: string, a: number): string {\n    if (a >= 1) return token;\n    return `color-mix(in srgb, ${token} ${Math.round(a * 100)}%, transparent)`;\n  }\n\n  private parseColor(v: any): { r: number; g: number; b: number; a: number } | null {\n    if (typeof v !== 'string') return null;\n    const s = v.trim();\n    const m = s.match(/^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)$/i);\n    if (m) {\n      return {\n        r: Math.min(255, Math.round(Number(m[1]))),\n        g: Math.min(255, Math.round(Number(m[2]))),\n        b: Math.min(255, Math.round(Number(m[3]))),\n        a: m[4] !== undefined ? Math.max(0, Math.min(1, Number(m[4]))) : 1\n      };\n    }\n    let hex = s.replace('#', '');\n    if (hex.length === 3) hex = hex.split('').map(c => c + c).join('');\n    if (hex.length === 6 || hex.length === 8) {\n      const r = parseInt(hex.slice(0, 2), 16);\n      const g = parseInt(hex.slice(2, 4), 16);\n      const b = parseInt(hex.slice(4, 6), 16);\n      const a = hex.length === 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1;\n      if (![r, g, b].some(isNaN)) return { r, g, b, a };\n    }\n    return null;\n  }\n\n  private toHex(r: number, g: number, b: number): string {\n    const h = (n: number) => n.toString(16).padStart(2, '0');\n    return `#${h(r)}${h(g)}${h(b)}`;\n  }\n\n  onStyleColorTokenChange(key: string, tokenValue: string): void {\n    const a = this.getStyleAlpha(key, '') / 100;\n    if (tokenValue) {\n      this.updateStylePropertyAtBreakpoint(key, this.composeTokenColor(tokenValue, a));\n    } else {\n      const rgba = this.parseColor(this.getStyleHexColor(key, '#000000')) || { r: 0, g: 0, b: 0, a: 1 };\n      this.updateStylePropertyAtBreakpoint(key, this.composeColor(rgba.r, rgba.g, rgba.b, a));\n    }\n  }\n\n\n  readonly paddingValue = computed(() => {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    if (!component) return undefined;\n\n    const styleProperties = component.styles.responsive_styles?.[breakpoint];\n    if (styleProperties && styleProperties['padding'] !== undefined) {\n      return styleProperties['padding'];\n    }\n\n    if (breakpoint !== 'base') {\n      const baseStyleProperties = component.styles.responsive_styles?.['base'];\n      if (baseStyleProperties && baseStyleProperties['padding'] !== undefined) {\n        return baseStyleProperties['padding'];\n      }\n    }\n\n    return undefined;\n  });\n\n  readonly marginValue = computed(() => {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    if (!component) return undefined;\n\n    const styleProperties = component.styles.responsive_styles?.[breakpoint];\n    if (styleProperties && styleProperties['margin'] !== undefined) {\n      return styleProperties['margin'];\n    }\n\n    if (breakpoint !== 'base') {\n      const baseStyleProperties = component.styles.responsive_styles?.['base'];\n      if (baseStyleProperties && baseStyleProperties['margin'] !== undefined) {\n        return baseStyleProperties['margin'];\n      }\n    }\n\n    return undefined;\n  });\n\n  readonly gapValue = computed(() => {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    if (!component) return undefined;\n\n    const styleProperties = component.styles.responsive_styles?.[breakpoint];\n    if (styleProperties && styleProperties['gap'] !== undefined) {\n      return styleProperties['gap'];\n    }\n\n    if (breakpoint !== 'base') {\n      const baseStyleProperties = component.styles.responsive_styles?.['base'];\n      if (baseStyleProperties && baseStyleProperties['gap'] !== undefined) {\n        return baseStyleProperties['gap'];\n      }\n    }\n\n    return undefined;\n  });\n\n  readonly borderValue = computed(() => {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    if (!component) return undefined;\n\n    const styleProperties = component.styles.responsive_styles?.[breakpoint];\n    if (styleProperties && styleProperties['border'] !== undefined) {\n      return String(styleProperties['border']);\n    }\n    if (breakpoint !== 'base') {\n      const baseStyleProperties = component.styles.responsive_styles?.['base'];\n      if (baseStyleProperties && baseStyleProperties['border'] !== undefined) {\n        return String(baseStyleProperties['border']);\n      }\n    }\n    return undefined;\n  });\n\n  readonly roundedValue = computed(() => {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    if (!component) return undefined;\n\n    const styleProperties = component.styles.responsive_styles?.[breakpoint];\n    if (styleProperties && styleProperties['rounded'] !== undefined) {\n      return styleProperties['rounded'];\n    }\n\n    if (breakpoint !== 'base') {\n      const baseStyleProperties = component.styles.responsive_styles?.['base'];\n      if (baseStyleProperties && baseStyleProperties['rounded'] !== undefined) {\n        return baseStyleProperties['rounded'];\n      }\n    }\n\n    return undefined;\n  });\n\n  readonly shadowValue = computed(() => {\n    const component = this.selectedComponent();\n    const breakpoint = this.currentBreakpoint();\n    if (!component) return undefined;\n\n    const styleProperties = component.styles.responsive_styles?.[breakpoint];\n    if (styleProperties && styleProperties['shadow'] !== undefined) {\n      return styleProperties['shadow'];\n    }\n\n    if (breakpoint !== 'base') {\n      const baseStyleProperties = component.styles.responsive_styles?.['base'];\n      if (baseStyleProperties && baseStyleProperties['shadow'] !== undefined) {\n        return baseStyleProperties['shadow'];\n      }\n    }\n\n    return undefined;\n  });\n  getResponsiveClasses() {\n    const component = this.selectedComponent();\n    if (component) {\n      return component?.styles.responsive_classes[this.currentBreakpoint()] || '';\n    }\n    return '';\n  }\n  updateResponsiveClasses(value: string) {\n    const component = this.selectedComponent();\n    if (component) {\n      this.store.updateResponsiveClasses(component.id, this.currentBreakpoint(), value);\n    }\n  }\n  updateCommonClasses(value: string) {\n    const component = this.selectedComponent();\n    if (component) {\n      this.store.updateComponentStyle(component.id, 'classes', value);\n    }\n  }\n\n  customStyleEntries = computed<{ key: string; value: any }[]>(() => {\n    const component = this.selectedComponent();\n    const custom = component?.styles?.custom || {};\n    return Object.keys(custom).map(k => ({ key: k, value: custom[k] }));\n  });\n\n  addCustomStyle() {\n    const component = this.selectedComponent();\n    if (!component) return;\n    const existing = component.styles?.custom || {};\n    let base = 'newProperty';\n    let key = base;\n    let i = 1;\n    while (key in existing) { key = `${base}${i++}`; }\n    this.store.setCustomStyle(component.id, key, '');\n  }\n\n  updateCustomStyleKey(oldKey: string, newKey: string) {\n    const component = this.selectedComponent();\n    if (!component) return;\n    this.store.renameCustomStyleKey(component.id, oldKey, newKey);\n  }\n\n  updateCustomStyleValue(key: string, value: string) {\n    const component = this.selectedComponent();\n    if (!component) return;\n    this.store.setCustomStyle(component.id, key, value);\n  }\n\n  removeCustomStyle(key: string) {\n    const component = this.selectedComponent();\n    if (!component) return;\n    this.store.removeCustomStyle(component.id, key);\n  }\n\n  // Style keys sitting in responsive_styles that no schema control edits. They\n  // are written by the JSON editor, imports and agents, and without this list\n  // they are invisible in the panel even though the renderer may apply them.\n  // Resolution mirrors the schema controls: values fall back to base, and\n  // `overridden` marks the keys this breakpoint sets itself.\n  // `renderable` is false when the CSS converter drops the key entirely.\n  otherStyleEntries = computed<{ key: string; value: any; renderable: boolean; overridden: boolean }[]>(() => {\n    const component = this.selectedComponent();\n    if (!component) return [];\n    const responsive = component.styles?.responsive_styles || {};\n    const breakpoint = this.currentBreakpoint();\n    const known = new Set(this.styleSchema().map((schema: StyleSchema) => schema.key));\n\n    const keys = new Set<string>();\n    Object.keys(responsive['base'] || {}).forEach(key => keys.add(key));\n    Object.keys(responsive[breakpoint] || {}).forEach(key => keys.add(key));\n\n    return Array.from(keys)\n      .filter(key => !known.has(key))\n      .map(key => ({\n        key,\n        value: this.tailwindService.getPropertyValueForBreakpoint(responsive, key, breakpoint),\n        renderable: this.tailwindService.isRenderableStyleKey(key),\n        overridden: responsive[breakpoint]?.[key] !== undefined\n      }));\n  });\n\n  addOtherStyle() {\n    const component = this.selectedComponent();\n    if (!component) return;\n    const existing = component.styles?.responsive_styles?.[this.currentBreakpoint()] || {};\n    const base = 'new_property';\n    let key = base;\n    let i = 1;\n    while (key in existing) { key = `${base}_${i++}`; }\n    this.updateStylePropertyAtBreakpoint(key, '');\n  }\n\n  // Renaming touches whichever breakpoint actually owns the key, so renaming an\n  // inherited value edits base rather than forking a copy onto this breakpoint.\n  updateOtherStyleKey(oldKey: string, newKey: string) {\n    const component = this.selectedComponent();\n    if (!component) return;\n    const breakpoint = this.currentBreakpoint();\n    const owner = component.styles?.responsive_styles?.[breakpoint]?.[oldKey] !== undefined ? breakpoint : 'base';\n    this.store.renameStylePropertyAtBreakpoint(component.id, oldKey, newKey, owner);\n  }\n\n  updateOtherStyleValue(key: string, value: string) {\n    this.updateStylePropertyAtBreakpoint(key, value);\n  }\n\n  // Same ownership rule as the rename: delete where the key actually lives, so\n  // removing an inherited value is not a silent no-op on this breakpoint.\n  removeOtherStyle(key: string) {\n    const component = this.selectedComponent();\n    if (!component) return;\n    const breakpoint = this.currentBreakpoint();\n    if (component.styles?.responsive_styles?.[breakpoint]?.[key] !== undefined) {\n      this.store.clearStylePropertyAtBreakpoint(component.id, key, breakpoint);\n      return;\n    }\n    this.store.clearStylePropertyAtBreakpoint(component.id, key, 'base');\n  }\n\n  deleteComponent() {\n    const component = this.selectedComponent();\n    if (component) {\n      this.store.deleteComponent(component.id);\n    }\n  }\n\n  readonly copiedId = signal<string | null>(null);\n\n  copyId(id: string): void {\n    if (!id) return;\n    const done = () => {\n      this.copiedId.set(id);\n      setTimeout(() => {\n        if (this.copiedId() === id) this.copiedId.set(null);\n      }, 1500);\n    };\n    const clip = (navigator as any)?.clipboard;\n    if (clip?.writeText) {\n      clip.writeText(id).then(done).catch(() => this.fallbackCopy(id, done));\n    } else {\n      this.fallbackCopy(id, done);\n    }\n  }\n\n  private fallbackCopy(text: string, done: () => void): void {\n    try {\n      const ta = document.createElement('textarea');\n      ta.value = text;\n      ta.style.position = 'fixed';\n      ta.style.opacity = '0';\n      document.body.appendChild(ta);\n      ta.select();\n      document.execCommand('copy');\n      ta.remove();\n      done();\n    } catch {\n      // clipboard unavailable — ignore\n    }\n  }\n\n  // Determine if a property should be visible based on schema.visible_if\n  isPropertyVisible(schema: PropertySchema): boolean {\n    const visibility = schema.visible_if;\n    if (!visibility) {\n      return true;\n    }\n\n    const component = this.selectedComponent();\n    if (!component) return true;\n\n    const operator = schema.visible_operator || 'all';\n    const rules: VisibilityRule[] = Array.isArray(visibility) ? visibility : [visibility];\n    const propertyValueGetter = this.currentPropertyValue();\n    const schemaList = this.propertySchema();\n\n    const evalRule = (rule: VisibilityRule): boolean => {\n      const dependencySchema = schemaList.find((s: PropertySchema) => s.key === rule.key);\n      let current: any;\n      if (dependencySchema) {\n        current = propertyValueGetter(rule.key);\n        if (current === undefined || current === null || current === '') {\n          current = dependencySchema.default_value;\n        }\n      } else {\n        const breakpoint = this.currentBreakpoint();\n        const props = component.properties?.[breakpoint] || {};\n        const baseProps = component.properties?.['base'] || {};\n        current = props[rule.key] ?? baseProps[rule.key];\n      }\n\n      if (rule.equals !== undefined && current !== rule.equals) return false;\n      if (rule.notEquals !== undefined && current === rule.notEquals) return false;\n      if (rule.in && Array.isArray(rule.in) && !rule.in.includes(current)) return false;\n      if (rule.notIn && Array.isArray(rule.notIn) && rule.notIn.includes(current)) return false;\n      return true;\n    };\n\n    const results = rules.map(evalRule);\n    if (operator === 'any') return results.some(Boolean);\n    if (operator === 'none') return results.every((r) => !r);\n    return results.every(Boolean); // 'all'\n  }\n\n  isPropertyEditable(schema: PropertySchema): boolean {\n    if (schema.responsive === true) {\n      return true;\n    }\n    return this.currentBreakpoint() === 'base';\n  }\n\n  // Determine if a property should be disabled based on schema.disable_if\n  isPropertyDisabled(schema: PropertySchema): boolean {\n    if (this.selectedComponent()?.isNested) {\n      return true;\n    }\n    const editable = this.isPropertyEditable(schema);\n    if (!editable) return true;\n\n    const disableRules = schema.disable_if;\n    if (!disableRules) {\n      return false;\n    }\n\n    const component = this.selectedComponent();\n    if (!component) return false;\n\n    const operator = schema.disable_operator || 'all';\n    const rules = Array.isArray(disableRules) ? disableRules : [disableRules];\n    const propertyValueGetter = this.currentPropertyValue();\n\n    const evalRule = (rule: any): boolean => {\n      // If the rule has an evaluate function, use it\n      if (rule.evaluate && typeof rule.evaluate === 'function') {\n        const result = rule.evaluate(propertyValueGetter);\n        return result;\n      }\n\n\n      // Otherwise, use key-based comparison like VisibilityRule\n      if (!rule.key) return false;\n\n      const current = propertyValueGetter(rule.key);\n\n      if (rule.equals !== undefined && current !== rule.equals) return false;\n      if (rule.notEquals !== undefined && current === rule.notEquals) return false;\n      if (rule.in && Array.isArray(rule.in) && !rule.in.includes(current)) return false;\n      if (rule.notIn && Array.isArray(rule.notIn) && rule.notIn.includes(current)) return false;\n      return true;\n    };\n\n    const results = rules.map(evalRule);\n    if (operator === 'any') return results.some(Boolean);\n    if (operator === 'none') return results.every((r) => !r);\n    return results.every(Boolean); // 'all'\n  }\n\n\n  isFormField(): boolean {\n    const component = this.selectedComponent();\n    if (!component) return false;\n    const identifier = this.currentPropertyValue()('identifier');\n    return identifier === true;\n  }\n\n  // Event subscription management\n  private _eventSubscriptions = signal<ComponentEventSubscription[]>([]);\n  readonly eventSubscriptions = this._eventSubscriptions.asReadonly();\n\n  readonly availableEvents = computed(() => {\n    const component = this.selectedComponent();\n    if (!component) return [];\n\n    // Get component events from the schema service\n    const componentEvents = this.schemaService.getComponentEvents(component.type);\n\n    // Value Change belongs to the component, not to its type: it is offered only\n    // for one marked as a Form Field, and that is a per-component property. The\n    // registered schema is cached per type by whichever instance rendered first,\n    // so it cannot answer this — reading the flag here is what makes the option\n    // appear the moment the toggle is flipped, instead of only after a save and\n    // reload, and keeps two components of the same type from sharing an answer.\n    const offersValueChange = !!component.properties?.base?.identifier;\n    const events = componentEvents.filter(e => e.value !== 'valueChange');\n    return offersValueChange\n      ? [...events, { label: 'Value Change', value: 'valueChange' }]\n      : events;\n  });\n\n  readonly availablePayloadFields = computed(() => {\n    const data = this.store.getDynamicData('ds_page_ref_payload_fields');\n    return Array.isArray(data) ? data : [];\n  });\n\n  /**\n   * Column / aggregation keys an 'On Drill' subscription can name, supplied by\n   * the selected grid.\n   *\n   * Offered as autocomplete suggestions rather than a fixed dropdown: a grid\n   * bound to a page field or state has no columns until the parent query\n   * returns, so at design time the list can legitimately be empty and the\n   * author still has to be able to type the key. Same reason 'Hide Columns'\n   * carries a manual text fallback.\n   */\n  private lastRequestIdDrillKeys = signal<string | null>(null);\n  readonly availableDrillKeys = computed(() => {\n    const dynamicOptions = 'ds_grid_drill_keys';\n    const requesterId = this.selectedComponent()?.id;\n    if (!requesterId) return [];\n\n    this.store.dynamicDataResponses();\n    const currentReqId = this.lastRequestIdDrillKeys();\n    if (currentReqId) {\n      const response = this.store.getDynamicDataResponse(currentReqId);\n      if (response) return response;\n    }\n\n    const dynamicData = this.store.getDynamicData(dynamicOptions);\n    if (dynamicData) return dynamicData;\n    untracked(() => {\n      const reqId = this.store.requestDynamicData(requesterId, dynamicOptions, '');\n      this.lastRequestIdDrillKeys.set(reqId);\n    });\n    return [];\n  });\n\n  /** Suggestions narrowed to what the author has typed so far. */\n  filteredDrillKeys(typed: string | undefined): { label: string; value: string }[] {\n    const all = this.availableDrillKeys() as { label: string; value: string }[];\n    const q = (typed || '').trim().toLowerCase();\n    if (!q) return all;\n    return all.filter(o =>\n      String(o.value).toLowerCase().includes(q) || String(o.label).toLowerCase().includes(q));\n  }\n\n  //readonly availableApis = computed(() => this.store.apis());\n  private lastRequestIdApis = signal<string | null>(null);\n  readonly availableApis = computed(() => {\n    const dynamicOptions = 'apis';\n    const requesterId = this.selectedComponent()?.id || this.PANEL_ID;\n\n    const currentReqId = this.lastRequestIdApis();\n    if (currentReqId) {\n      const response = this.store.getDynamicDataResponse(currentReqId);\n      if (response) return response;\n    }\n\n    const dynamicData = this.store.getDynamicData(dynamicOptions);\n    if (dynamicData) {\n      return dynamicData;\n    } else {\n      untracked(() => {\n        const reqId = this.store.requestDynamicData(requesterId, dynamicOptions, '');\n        this.lastRequestIdApis.set(reqId);\n      });\n    }\n    return [];\n  });\n\n  private lastRequestIdFunctions = signal<string | null>(null);\n  readonly availableFunctions = computed(() => {\n    const dynamicOptions = 'functions';\n    const requesterId = this.selectedComponent()?.id || this.PANEL_ID;\n\n    this.store.dynamicDataResponses();\n    const currentReqId = this.lastRequestIdFunctions();\n    if (currentReqId) {\n      const response = this.store.getDynamicDataResponse(currentReqId);\n      if (response) return response;\n    }\n\n    const dynamicData = this.store.getDynamicData(dynamicOptions);\n    if (dynamicData) {\n      return dynamicData;\n    } else if (!currentReqId) {\n      untracked(() => {\n        const reqId = this.store.requestDynamicData(requesterId, dynamicOptions, '');\n        this.lastRequestIdFunctions.set(reqId);\n      });\n    }\n    return [];\n  });\n\n  private lastRequestIdQueries = signal<string | null>(null);\n  readonly availableQueries = computed(() => {\n    const dynamicOptions = 'queries';\n    const requesterId = this.selectedComponent()?.id || this.PANEL_ID;\n\n    this.store.dynamicDataResponses();\n    const currentReqId = this.lastRequestIdQueries();\n    if (currentReqId) {\n      const response = this.store.getDynamicDataResponse(currentReqId);\n      if (response) return response;\n    }\n\n    const dynamicData = this.store.getDynamicData(dynamicOptions);\n    if (dynamicData) {\n      return dynamicData;\n    } else if (!currentReqId) {\n      untracked(() => {\n        const reqId = this.store.requestDynamicData(requesterId, dynamicOptions, '');\n        this.lastRequestIdQueries.set(reqId);\n      });\n    }\n    return [];\n  });\n\n  /**\n   * Function suggestions narrowed to what the author has typed. Offered as\n   * autocomplete rather than a fixed dropdown so a function that does not\n   * exist on the server yet can still be named here and written later.\n   */\n  filteredFunctions(typed: string | undefined): { label: string; value: string }[] {\n    const all = (this.availableFunctions() || []) as { label: string; value: string }[];\n    const q = (typed || '').trim().toLowerCase();\n    if (!q) return all;\n    return all.filter(o =>\n      String(o.value).toLowerCase().includes(q) || String(o.label).toLowerCase().includes(q));\n  }\n\n  /** True when the typed name matches no known function, so 'Add \"x\"' is offered. */\n  isNewFunctionName(typed: string | undefined): boolean {\n    const name = (typed || '').trim();\n    if (!name) return false;\n    const all = (this.availableFunctions() || []) as { label: string; value: string }[];\n    return !all.some(o => String(o.value).toLowerCase() === name.toLowerCase());\n  }\n\n  /**\n   * Query suggestions narrowed to what the author has typed. Offered as\n   * autocomplete rather than a fixed dropdown so a query that does not exist\n   * on the server yet can still be named here and written later.\n   */\n  filteredQueries(typed: string | undefined): { label: string; value: string }[] {\n    const all = (this.availableQueries() || []) as { label: string; value: string }[];\n    const q = (typed || '').trim().toLowerCase();\n    if (!q) return all;\n    return all.filter(o =>\n      String(o.value).toLowerCase().includes(q) || String(o.label).toLowerCase().includes(q));\n  }\n\n  /** True when the typed name matches no known query, so 'Add \"x\"' is offered. */\n  isNewQueryName(typed: string | undefined): boolean {\n    const name = (typed || '').trim();\n    if (!name) return false;\n    const all = (this.availableQueries() || []) as { label: string; value: string }[];\n    return !all.some(o => String(o.value).toLowerCase() === name.toLowerCase());\n  }\n\n  private readonly PANEL_ID = '__properties_panel__';\n  private _lastReqIdPages = signal<string | null>(null);\n  private _availablePages = signal<any[]>([]);\n  readonly availablePages = this._availablePages.asReadonly();\n\n  readonly availableFields = computed(() => {\n    const page = this.currentPage();\n    if (!page) return [];\n\n    const fieldMap = new Map<string, string>();\n    const processComponents = (comps: EruComponent[]) => {\n      comps.forEach(c => {\n        const name = c.properties?.base?.['name'] || c.properties?.md?.['name'] || c.properties?.sm?.['name'] || c.properties?.lg?.['name'] || c.properties?.xl?.['name'] || c.properties?.['2xl']?.['name'];\n        if (name) {\n          fieldMap.set(name, name);\n        }\n        if (c.children) {\n          processComponents(c.children);\n        }\n      });\n    };\n    processComponents(page.components);\n\n    if (page.entity_name) {\n      const entityFields = this.store.getEntityFields(page.entity_name) || [];\n      entityFields.forEach(f => {\n        if (f.name && !fieldMap.has(f.name)) {\n          fieldMap.set(f.name, f.label || f.name);\n        }\n      });\n    }\n\n    return Array.from(fieldMap.entries()).map(([value, label]) => ({ label, value }));\n  });\n\n  // Source list for the \"Set from Field\" formula: individual fields PLUS the\n  // whole page record (entity_data object) and the record id (entity_id).\n  // Kept separate from availableFields so these specials only appear as\n  // read sources, never as write targets (e.g. the Update Value / set-field\n  // action's field picker).\n  readonly stateSourceFields = computed(() => [\n    { label: 'Whole Record + Id (entity_id + entity_data)', value: '$record' },\n    { label: 'Whole Record (entity_data)', value: '$entity_data' },\n    { label: 'Record Id (entity_id)', value: '$entity_id' },\n    ...this.availableFields()\n  ]);\n\n  readonly availableComponents = computed(() => {\n    const page = this.currentPage();\n    if (!page) return [];\n\n    const result: { label: string, value: string }[] = [];\n    const seen = new Set<string>();\n    const collect = (comps: EruComponent[]) => {\n      comps.forEach(c => {\n        const label = c.properties?.base?.['label'] || c.properties?.base?.['name'] || c.type;\n        if (!seen.has(c.id)) {\n          seen.add(c.id);\n          result.push({ label: `${label} (${c.id.slice(-6)})`, value: c.id });\n        }\n        if (c.children) collect(c.children);\n      });\n    };\n    collect(page.components);\n    return result;\n  });\n\n  readonly availableSteppers = computed(() => {\n    const page = this.currentPage();\n    if (!page) return [];\n\n    const result: { label: string, value: string }[] = [];\n    const collect = (comps: EruComponent[]) => {\n      comps.forEach(c => {\n        if (c.type === 'sidebar_stepper' || c.type === 'stepper') {\n          const label = c.properties?.base?.['label'] || c.properties?.base?.['name'] || c.type;\n          result.push({ label: `${label} (${c.id.slice(-6)})`, value: c.id });\n        }\n        if (c.children) collect(c.children);\n      });\n    };\n    collect(page.components);\n    return result;\n  });\n\n  readonly availableTabGroups = computed(() => {\n    const page = this.currentPage();\n    if (!page) return [];\n\n    const result: { label: string, value: string }[] = [];\n    const collect = (comps: EruComponent[]) => {\n      comps.forEach(c => {\n        if (c.type === 'tabs') {\n          const label = c.properties?.base?.['label'] || c.properties?.base?.['name'] || c.type;\n          result.push({ label: `${label} (${c.id.slice(-6)})`, value: c.id });\n        }\n        if (c.children) collect(c.children);\n      });\n    };\n    collect(page.components);\n    return result;\n  });\n\n  /**\n   * Every tab title on the page, labelled by the group it belongs to. The\n   * action stores the title rather than a position, so renaming a tab in one\n   * place does not silently repoint an action at its neighbour.\n   */\n  readonly availableTabNames = computed(() => {\n    const page = this.currentPage();\n    if (!page) return [];\n\n    const result: { label: string, value: string }[] = [];\n    const seen = new Set<string>();\n    const collect = (comps: EruComponent[]) => {\n      comps.forEach(c => {\n        if (c.type === 'tabs') {\n          const raw = c.properties?.base?.['tabs'];\n          const titles = Array.isArray(raw) ? raw : String(raw ?? '').split(',');\n          titles\n            .map((t: any) => String(t ?? '').trim())\n            .filter((t: string) => t.length > 0)\n            .forEach((t: string) => {\n              if (seen.has(t)) return;\n              seen.add(t);\n              result.push({ label: t, value: t });\n            });\n        }\n        if (c.children) collect(c.children);\n      });\n    };\n    collect(page.components);\n    return result;\n  });\n\n  readonly availableGrids = computed(() => {\n    const page = this.currentPage();\n    if (!page) return [];\n\n    const result: { label: string, value: string }[] = [];\n    const collect = (comps: EruComponent[]) => {\n      comps.forEach(c => {\n        if (c.type === 'grid') {\n          const label = c.properties?.base?.['label'] || c.properties?.base?.['name'] || c.type;\n          result.push({ label: `${label} (${c.id.slice(-6)})`, value: c.id });\n        }\n        if (c.children) collect(c.children);\n      });\n    };\n    collect(page.components);\n    return result;\n  });\n\n  readonly availableSidePanels = computed(() => {\n    const page = this.currentPage();\n    if (!page) return [];\n\n    const result: { label: string, value: string }[] = [];\n    const collect = (comps: EruComponent[]) => {\n      comps.forEach(c => {\n        if (c.type === 'page_ref') {\n          const displayType = c.properties?.base?.['display_type'];\n          if (displayType === 'side_panel' || displayType === 'popup') {\n            // Label with a human name + the page_ref's OWN component id (which is\n            // what's shown in Layers and what the action targets). Do NOT fall\n            // back to the referenced `page` id — that's a different id the user\n            // can't locate, which is exactly what caused the confusion here.\n            const friendly = c.properties?.base?.['label'] || c.properties?.base?.['name'] || c.properties?.base?.['description'] || c.type;\n            result.push({ label: `${friendly} — ${c.id}`, value: c.id });\n          }\n        }\n        if (c.children) collect(c.children);\n      });\n    };\n    collect(page.components);\n    return result;\n  });\n\n  // All page_ref components on the page (any display type: inline, side_panel,\n  // popup) — targets for the refresh-page-ref action, which reloads the ref.\n  readonly availablePageRefs = computed(() => {\n    const page = this.currentPage();\n    if (!page) return [];\n    const result: { label: string, value: string }[] = [];\n    const collect = (comps: EruComponent[]) => {\n      comps.forEach(c => {\n        if (c.type === 'page_ref') {\n          const friendly = c.properties?.base?.['label'] || c.properties?.base?.['name'] || c.properties?.base?.['description'] || c.type;\n          result.push({ label: `${friendly} — ${c.id}`, value: c.id });\n        }\n        if (c.children) collect(c.children);\n      });\n    };\n    collect(page.components);\n    return result;\n  });\n\n  addEventSubscription(): void {\n    const newSubscription: ComponentEventSubscription = {\n      id: `event_${Date.now()}`,\n      event: 'click',\n      action: 'no-action'\n    };\n    this._eventSubscriptions.update(subscriptions => [...subscriptions, newSubscription]);\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  removeEventSubscription(index: number): void {\n    this._eventSubscriptions.update(subscriptions =>\n      subscriptions.filter((_, i) => i !== index)\n    );\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  updateEventSubscription(index: number, field: keyof ComponentEventSubscription, value: any): void {\n    this._eventSubscriptions.update(subscriptions => {\n      const updated = [...subscriptions];\n      updated[index] = { ...updated[index], [field]: value };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  // --- navigate-to-page nav params -------------------------------------------\n  // Each row is one query param carried to the target page. The param name\n  // should match a state variable declared there; the target seeds that\n  // variable from the URL on mount.\n\n  addNavParam(index: number): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const params = [...(updated[index].nav_params || []), { param: '', value_expression: '' } as NavParam];\n      updated[index] = { ...updated[index], nav_params: params };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  updateNavParam(index: number, paramIndex: number, key: keyof NavParam, value: any): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const params = [...(updated[index].nav_params || [])];\n      params[paramIndex] = { ...params[paramIndex], [key]: value };\n      updated[index] = { ...updated[index], nav_params: params };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  removeNavParam(index: number, paramIndex: number): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const params = [...(updated[index].nav_params || [])];\n      params.splice(paramIndex, 1);\n      updated[index] = { ...updated[index], nav_params: params };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  // --- extra payload values ---------------------------------------------------\n  // Each row adds one key to the payload the action fires with, resolved from an\n  // expression. The event can only report what the component knows; this is how\n  // page state and page data ride along with it.\n\n  addPayloadExtra(index: number): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const extras = [...(updated[index].payload_extras || []), { param: '', value_expression: '' } as NavParam];\n      updated[index] = { ...updated[index], payload_extras: extras };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  updatePayloadExtra(index: number, extraIndex: number, key: keyof NavParam, value: any): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const extras = [...(updated[index].payload_extras || [])];\n      extras[extraIndex] = { ...extras[extraIndex], [key]: value };\n      updated[index] = { ...updated[index], payload_extras: extras };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  removePayloadExtra(index: number, extraIndex: number): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const extras = [...(updated[index].payload_extras || [])];\n      extras.splice(extraIndex, 1);\n      updated[index] = { ...updated[index], payload_extras: extras };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  addPageNavParam(index: number): void {\n    this.updatePageEvents(events => {\n      const params = [...(events[index].nav_params || []), { param: '', value_expression: '' } as NavParam];\n      events[index] = { ...events[index], nav_params: params };\n    });\n  }\n\n  updatePageNavParam(index: number, paramIndex: number, key: keyof NavParam, value: any): void {\n    this.updatePageEvents(events => {\n      const params = [...(events[index].nav_params || [])];\n      params[paramIndex] = { ...params[paramIndex], [key]: value };\n      events[index] = { ...events[index], nav_params: params };\n    });\n  }\n\n  removePageNavParam(index: number, paramIndex: number): void {\n    this.updatePageEvents(events => {\n      const params = [...(events[index].nav_params || [])];\n      params.splice(paramIndex, 1);\n      events[index] = { ...events[index], nav_params: params };\n    });\n  }\n\n  addOnSuccessAction(eventIndex: number): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const current = updated[eventIndex];\n      const actions = [...(current.on_success || [])];\n      actions.push({ id: `os_${Date.now()}`, event: '', action: 'no-action' } as ComponentEventSubscription);\n      updated[eventIndex] = { ...current, on_success: actions };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  removeOnSuccessAction(eventIndex: number, actionIndex: number): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const current = updated[eventIndex];\n      const actions = [...(current.on_success || [])];\n      actions.splice(actionIndex, 1);\n      updated[eventIndex] = { ...current, on_success: actions };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  updateOnSuccessAction(eventIndex: number, actionIndex: number, key: string, value: any): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const current = updated[eventIndex];\n      const actions = [...(current.on_success || [])];\n      actions[actionIndex] = { ...actions[actionIndex], [key]: value };\n      updated[eventIndex] = { ...current, on_success: actions };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  addOnErrorAction(eventIndex: number): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const current = updated[eventIndex];\n      const actions = [...(current.on_error || [])];\n      actions.push({ id: `oe_${Date.now()}`, event: '', action: 'no-action' } as ComponentEventSubscription);\n      updated[eventIndex] = { ...current, on_error: actions };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  removeOnErrorAction(eventIndex: number, actionIndex: number): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const current = updated[eventIndex];\n      const actions = [...(current.on_error || [])];\n      actions.splice(actionIndex, 1);\n      updated[eventIndex] = { ...current, on_error: actions };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  updateOnErrorAction(eventIndex: number, actionIndex: number, key: string, value: any): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const current = updated[eventIndex];\n      const actions = [...(current.on_error || [])];\n      actions[actionIndex] = { ...actions[actionIndex], [key]: value };\n      updated[eventIndex] = { ...current, on_error: actions };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  // Only user-defined state variables are updatable — system variables\n  // (org_id, process_id, org_process_id, user_id, user_access) are injected\n  // from the runtime context and must not be offered as update-state targets.\n  readonly pageStateKeys = computed(() => {\n    const sysKeys = new Set(EruStudioStore.SYSTEM_STATE_KEYS);\n    return Object.keys(this.store.computedPageState()).filter(k => !sysKeys.has(k));\n  });\n\n  updateStateFormulaFn(index: number, fn: string): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const existing = updated[index].state_formula || {} as UpdateStateFormula;\n      updated[index] = { ...updated[index], state_formula: { ...existing, fn: fn as UpdateStateFormula['fn'] } };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  updateStateFormulaParam(index: number, param: keyof UpdateStateFormula, value: any): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const existing = updated[index].state_formula || {} as UpdateStateFormula;\n      updated[index] = { ...updated[index], state_formula: { ...existing, [param]: value } };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  updateNestedStateFormulaFn(eventIndex: number, actionIndex: number, branch: 'on_success' | 'on_error', fn: string): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const current = updated[eventIndex];\n      const actions = [...((current as any)[branch] || [])];\n      const existing = (actions[actionIndex] as any).state_formula || {} as UpdateStateFormula;\n      actions[actionIndex] = { ...actions[actionIndex], state_formula: { ...existing, fn: fn as UpdateStateFormula['fn'] } };\n      updated[eventIndex] = { ...current, [branch]: actions };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  updateNestedStateFormulaParam(eventIndex: number, actionIndex: number, branch: 'on_success' | 'on_error', param: keyof UpdateStateFormula, value: any): void {\n    this._eventSubscriptions.update(subs => {\n      const updated = [...subs];\n      const current = updated[eventIndex];\n      const actions = [...((current as any)[branch] || [])];\n      const existing = (actions[actionIndex] as any).state_formula || {} as UpdateStateFormula;\n      actions[actionIndex] = { ...actions[actionIndex], state_formula: { ...existing, [param]: value } };\n      updated[eventIndex] = { ...current, [branch]: actions };\n      return updated;\n    });\n    this.saveEventSubscriptionsToComponent();\n  }\n\n  private saveEventSubscriptionsToComponent(): void {\n    const component = this.selectedComponent();\n    if (!component) return;\n\n    this.store.updateComponent(component.id, {\n      events: this._eventSubscriptions()\n    });\n  }\n\n  updatePageName(name: string): void {\n    const page = this.currentPage();\n    if (page) {\n      this.store.updatePage({ name });\n    }\n  }\n\n  updatePageTitle(title: string): void {\n    const page = this.currentPage();\n    if (page) {\n      this.store.updatePage({ title });\n    }\n  }\n\n  updatePageDataSource(value: 'none' | 'state'): void {\n    if (!this.currentPage()) return;\n    this.store.updatePage({ data_source: value });\n  }\n\n  updatePageStateScope(value: 'page' | 'app'): void {\n    if (!this.currentPage()) return;\n    // The field list differs per scope, so a scope change invalidates the pick.\n    this.store.updatePage({ state_scope: value, state_field: '' });\n  }\n\n  updatePageStateField(value: string): void {\n    if (!this.currentPage()) return;\n    this.store.updatePage({ state_field: value });\n  }\n\n  updatePageStateResultPath(value: string): void {\n    if (!this.currentPage()) return;\n    this.store.updatePage({ state_result_path: value });\n  }\n\n  /** State variables declared on this page, for the page-scope field picker. */\n  readonly pageStateVarOptions = computed<string[]>(() =>\n    (this.currentPage()?.state || []).map(sv => sv.key).filter(Boolean));\n\n  /** Keys currently present in app state, for the app-scope field picker. */\n  readonly appStateKeyOptions = computed<string[]>(() =>\n    Object.keys(this.store.appState() || {}).sort());\n\n  updatePageEntityInput(value: string): void {\n    this.entityInputControl.set(value);\n  }\n\n  onEntityOptionSelected(entityName: string): void {\n    this.entityInputControl.set(entityName);\n    this.updatePageEntity(entityName);\n  }\n\n  onEntityInputBlur(): void {\n    const inputValue = this.entityInputControl().trim();\n    if (inputValue) {\n      this.updatePageEntity(inputValue);\n    }\n  }\n\n  updatePageEntity(entityName: string): void {\n    const page = this.currentPage();\n    if (page) {\n      this.store.updatePage({ entity_name: entityName });\n    }\n  }\n\n  readonly pageEventSubscriptions = computed(() => {\n    const page = this.currentPage();\n    return page?.events || [];\n  });\n\n  readonly pageLifecycleEvents: { label: string; value: string }[] = [\n    { label: 'On Load', value: 'on_load' }\n  ];\n\n  isPredefinedPageEvent(value: string | undefined): boolean {\n    // '' means the user just picked \"Custom Signal…\" (onPageEventTypeChange\n    // clears the event so they can type the signal name) — treating it as\n    // predefined here would hide the Signal Name input and blank the Event\n    // select, making custom signals impossible to configure.\n    if (value === '') return false;\n    if (!value) return true;\n    return this.pageLifecycleEvents.some(e => e.value === value);\n  }\n\n  onPageEventTypeChange(index: number, value: string): void {\n    if (value === '__custom__') {\n      this.updatePageEventSubscription(index, 'event', '');\n    } else {\n      this.updatePageEventSubscription(index, 'event', value);\n    }\n  }\n\n  addPageEventSubscription(): void {\n    const page = this.currentPage();\n    if (!page) return;\n    const newEvent: ComponentEventSubscription = {\n      id: `page_event_${Date.now()}`,\n      event: 'on_load',\n      action: 'no-action' as any\n    };\n    const events = [...(page.events || []), newEvent];\n    this.store.updatePage({ events });\n  }\n\n  updatePageEventSubscription(index: number, field: string, value: any): void {\n    const page = this.currentPage();\n    if (!page) return;\n    const events = [...(page.events || [])];\n    events[index] = { ...events[index], [field]: value };\n    this.store.updatePage({ events });\n  }\n\n  removePageEventSubscription(index: number): void {\n    const page = this.currentPage();\n    if (!page) return;\n    const events = [...(page.events || [])];\n    events.splice(index, 1);\n    this.store.updatePage({ events });\n  }\n\n  private updatePageEvents(mutator: (events: ComponentEventSubscription[]) => void): void {\n    const page = this.currentPage();\n    if (!page) return;\n    const events = [...(page.events || [])];\n    mutator(events);\n    this.store.updatePage({ events });\n  }\n\n  addPageOnSuccessAction(eventIndex: number): void {\n    this.updatePageEvents(events => {\n      const current = events[eventIndex];\n      const actions = [...(current.on_success || [])];\n      actions.push({ id: `os_${Date.now()}`, event: '', action: 'no-action' } as ComponentEventSubscription);\n      events[eventIndex] = { ...current, on_success: actions };\n    });\n  }\n\n  removePageOnSuccessAction(eventIndex: number, actionIndex: number): void {\n    this.updatePageEvents(events => {\n      const current = events[eventIndex];\n      const actions = [...(current.on_success || [])];\n      actions.splice(actionIndex, 1);\n      events[eventIndex] = { ...current, on_success: actions };\n    });\n  }\n\n  updatePageOnSuccessAction(eventIndex: number, actionIndex: number, key: string, value: any): void {\n    this.updatePageEvents(events => {\n      const current = events[eventIndex];\n      const actions = [...(current.on_success || [])];\n      actions[actionIndex] = { ...actions[actionIndex], [key]: value };\n      events[eventIndex] = { ...current, on_success: actions };\n    });\n  }\n\n  addPageOnErrorAction(eventIndex: number): void {\n    this.updatePageEvents(events => {\n      const current = events[eventIndex];\n      const actions = [...(current.on_error || [])];\n      actions.push({ id: `oe_${Date.now()}`, event: '', action: 'no-action' } as ComponentEventSubscription);\n      events[eventIndex] = { ...current, on_error: actions };\n    });\n  }\n\n  removePageOnErrorAction(eventIndex: number, actionIndex: number): void {\n    this.updatePageEvents(events => {\n      const current = events[eventIndex];\n      const actions = [...(current.on_error || [])];\n      actions.splice(actionIndex, 1);\n      events[eventIndex] = { ...current, on_error: actions };\n    });\n  }\n\n  updatePageOnErrorAction(eventIndex: number, actionIndex: number, key: string, value: any): void {\n    this.updatePageEvents(events => {\n      const current = events[eventIndex];\n      const actions = [...(current.on_error || [])];\n      actions[actionIndex] = { ...actions[actionIndex], [key]: value };\n      events[eventIndex] = { ...current, on_error: actions };\n    });\n  }\n\n  updatePageStateFormulaFn(index: number, fn: string): void {\n    this.updatePageEvents(events => {\n      const existing = events[index].state_formula || {} as UpdateStateFormula;\n      events[index] = { ...events[index], state_formula: { ...existing, fn: fn as UpdateStateFormula['fn'] } };\n    });\n  }\n\n  updatePageStateFormulaParam(index: number, param: keyof UpdateStateFormula, value: any): void {\n    this.updatePageEvents(events => {\n      const existing = events[index].state_formula || {} as UpdateStateFormula;\n      events[index] = { ...events[index], state_formula: { ...existing, [param]: value } };\n    });\n  }\n\n  updatePageNestedStateFormulaFn(eventIndex: number, actionIndex: number, branch: 'on_success' | 'on_error', fn: string): void {\n    this.updatePageEvents(events => {\n      const current = events[eventIndex];\n      const actions = [...((current as any)[branch] || [])];\n      const existing = (actions[actionIndex] as any).state_formula || {} as UpdateStateFormula;\n      actions[actionIndex] = { ...actions[actionIndex], state_formula: { ...existing, fn: fn as UpdateStateFormula['fn'] } };\n      events[eventIndex] = { ...current, [branch]: actions };\n    });\n  }\n\n  updatePageNestedStateFormulaParam(eventIndex: number, actionIndex: number, branch: 'on_success' | 'on_error', param: keyof UpdateStateFormula, value: any): void {\n    this.updatePageEvents(events => {\n      const current = events[eventIndex];\n      const actions = [...((current as any)[branch] || [])];\n      const existing = (actions[actionIndex] as any).state_formula || {} as UpdateStateFormula;\n      actions[actionIndex] = { ...actions[actionIndex], state_formula: { ...existing, [param]: value } };\n      events[eventIndex] = { ...current, [branch]: actions };\n    });\n  }\n\n  // Validation rules management\n  private _validationRules = signal<ValidationRule[]>([]);\n  readonly validationRules = this._validationRules.asReadonly();\n\n  private getDefaultErrorMessage(ruleType: ValidationRule['type'], value?: any): string {\n    const messages: Record<ValidationRule['type'], string> = {\n      'required': 'This field is required',\n      'min': `Minimum value is ${value || 0}`,\n      'max': `Maximum value is ${value || 0}`,\n      'minLength': `Minimum length is ${value || 0} characters`,\n      'maxLength': `Maximum length is ${value || 0} characters`,\n      'pattern': 'Invalid format',\n      'email': 'Invalid email address',\n      'custom': 'Validation failed'\n    };\n    return messages[ruleType] || 'Invalid value';\n  }\n\n  addValidationRule(): void {\n    const newRule: ValidationRule = {\n      type: 'required',\n      message: this.getDefaultErrorMessage('required')\n    };\n    this._validationRules.update(rules => [...rules, newRule]);\n    this.saveValidationRulesToComponent();\n  }\n\n  removeValidationRule(index: number): void {\n    this._validationRules.update(rules =>\n      rules.filter((_, i) => i !== index)\n    );\n    this.saveValidationRulesToComponent();\n  }\n\n  updateValidationRule(index: number, field: keyof ValidationRule, value: any): void {\n    this._validationRules.update(rules => {\n      const updated = [...rules];\n      const currentRule = updated[index];\n\n      if (field === 'type') {\n        const oldDefaultMessage = this.getDefaultErrorMessage(currentRule.type, currentRule.value);\n        const newDefaultMessage = this.getDefaultErrorMessage(value, currentRule.value);\n        const shouldUpdateMessage = !currentRule.message || currentRule.message === oldDefaultMessage;\n\n        updated[index] = {\n          ...currentRule,\n          type: value,\n          message: shouldUpdateMessage ? newDefaultMessage : currentRule.message,\n          value: ['required', 'email'].includes(value) ? undefined : currentRule.value\n        };\n      } else {\n        updated[index] = { ...currentRule, [field]: value };\n        if (field === 'value') {\n          const currentDefault = this.getDefaultErrorMessage(currentRule.type, value);\n          if (!currentRule.message || currentRule.message === this.getDefaultErrorMessage(currentRule.type, currentRule.value)) {\n            updated[index].message = currentDefault;\n          }\n        }\n      }\n      return updated;\n    });\n    this.saveValidationRulesToComponent();\n  }\n\n  needsValue(type: string): boolean {\n    return ['min', 'max', 'minLength', 'maxLength', 'pattern', 'custom'].includes(type);\n  }\n\n  private saveValidationRulesToComponent(): void {\n    const component = this.selectedComponent();\n    if (!component) return;\n\n    this.store.updateComponent(component.id, {\n      validation_rules: this._validationRules()\n    });\n  }\n\n  trimAndFilter(v: string) {\n    return v.trim() !== '';\n  }\n}\n","<div class=\"properties-panel\">\n  @if (selectedComponent(); as component) {\n  <div class=\"component-header\">\n    <div class=\"component-info\">\n      <h3>{{ componentDefinition()?.name || (component.type | titlecase) }}</h3>\n      <div class=\"component-meta\">\n        <span class=\"component-id-row\">\n          <span class=\"component-id\">{{ component.id }}</span>\n          <button type=\"button\" class=\"copy-id-btn\" (click)=\"copyId(component.id)\"\n            [title]=\"copiedId() === component.id ? 'Copied!' : 'Copy ID'\">\n            <mat-icon>{{ copiedId() === component.id ? 'check' : 'content_copy' }}</mat-icon>\n          </button>\n        </span>\n        <span class=\"component-dates\">\n          Created: {{ component.created_at | date:'short' }}\n        </span>\n        <span class=\"component-dates\">\n          Updated: {{ component.updated_at | date:'short' }}\n        </span>\n      </div>\n      <mat-chip-set class=\"breakpoint-indicator\">\n        <mat-chip>\n          <mat-icon>devices</mat-icon>\n          Editing: {{ currentBreakpoint() | uppercase }}\n        </mat-chip>\n      </mat-chip-set>\n    </div>\n    @if (!component.isNested) {\n    <button mat-icon-button color=\"warn\" (click)=\"deleteComponent()\" title=\"Delete Component\">\n      <mat-icon>delete</mat-icon>\n    </button>\n    }\n  </div>\n\n  <mat-tab-group class=\"properties-tab-group\">\n    <mat-tab label=\"Properties\">\n      <div class=\"tab-content\">\n        @if (isSchemaLoading()) {\n        <div class=\"loading-properties\">\n          <mat-icon>hourglass_empty</mat-icon>\n          <p>Loading component properties...</p>\n          <p class=\"hint\">Component type: {{ component.type }}</p>\n        </div>\n        } @else if (propertySchema().length > 0) {\n        @for (category of getPropertyCategories(); track category) {\n        <div class=\"property-group\">\n          <h4>{{ category | titlecase }}</h4>\n          <div class=\"property-grid\">\n            @for (row of getPropertyRows(category); track $index) {\n            @let schema = row.schema;\n            @if (row.section) {\n            <div class=\"property-section-label\">{{ row.section }}</div>\n            }\n            <div class=\"property-item\" [class.width-2]=\"schema.width === 2\" [class.width-full]=\"schema.width === 'full'\"\n              [class.width-half]=\"schema.width === 'half'\" [class.width-half]=\"schema.width === 1\"\n              [class.inherited-from-base]=\"isInheritedFromBase()(schema.key)\"\n              style=\"position:relative;\">\n              <eru-property-editor [schema]=\"schema\"\n                [value]=\"currentPropertyValue()(schema.key) ?? schema.default_value\"\n                [componentId]=\"selectedComponent()?.id\" [disabled]=\"isPropertyDisabled(schema)\"\n                (valueChange)=\"updateProperty(schema.key, $event)\">\n              </eru-property-editor>\n              @if (hasBreakpointOverride()(schema.key)) {\n              <button mat-icon-button class=\"clear-breakpoint-override-btn\" type=\"button\"\n                (click)=\"clearBreakpointOverride(schema.key)\"\n                [title]=\"currentBreakpoint() === 'base' ? 'Clear value (reset to default)' : ('Clear ' + currentBreakpoint() + ' override (inherit from base)')\"\n                style=\"position:absolute;top:0;right:0;width:28px;height:28px;line-height:28px;\">\n                <mat-icon style=\"font-size:16px;width:16px;height:16px;\">replay</mat-icon>\n              </button>\n              } @else if (isInheritedFromBase()(schema.key)) {\n              <span class=\"inherited-from-base-badge\"\n                [title]=\"'Inherited from base — set a value here to create a ' + currentBreakpoint() + ' override'\"\n                style=\"position:absolute;top:4px;right:4px;\">\n                <mat-icon style=\"font-size:14px;width:14px;height:14px;\">link</mat-icon>\n              </span>\n              }\n            </div>\n            }\n          </div>\n        </div>\n        }\n        } @else {\n        <div class=\"no-properties\">\n          <mat-icon>settings</mat-icon>\n          <p>No editable properties defined for this component</p>\n          <p class=\"hint\">Component type: {{ component.type }}</p>\n        </div>\n        }\n      </div>\n    </mat-tab>\n\n    <mat-tab label=\"Styles\">\n      <div class=\"tab-content\">\n        @if (isSchemaLoading()) {\n        <div class=\"loading-properties\">\n          <mat-icon>hourglass_empty</mat-icon>\n          <p>Loading component styles...</p>\n          <p class=\"hint\">Component type: {{ component.type }}</p>\n        </div>\n        } @else if (styleSchema().length > 0) {\n        @for (category of getStyleCategories(); track category) {\n        <div class=\"property-group\">\n          <h4>{{ category | titlecase }}</h4>\n          <!-- Which piece of text the typography controls edit. A read-only\n               display draws a label and a value; these controls own the value,\n               and the switch repoints the same ones at the label rather than\n               doubling the group. Only shown where there IS a label. -->\n          @if (category === 'typography' && supportsLabelTarget()) {\n          <div class=\"style-target-toggle\">\n            <button type=\"button\" [class.active]=\"styleTarget() === 'value'\"\n              (click)=\"setStyleTarget('value')\">Value</button>\n            <button type=\"button\" [class.active]=\"styleTarget() === 'label'\"\n              (click)=\"setStyleTarget('label')\">Label</button>\n          </div>\n          }\n          <div class=\"property-grid\">\n            @for (schema of getStylesByCategory(category); track $index) {\n            <div class=\"property-item\" [class.width-2]=\"schema.width === 2\" [class.width-full]=\"schema.width === 'full'\"\n              [class.width-half]=\"schema.width === 'half'\" [class.width-half]=\"schema.width === 1\"\n              style=\"position:relative;\">\n              @if (schema.key === 'background_color') {\n              <div class=\"bg-fill-toggle\">\n                <button type=\"button\" [class.active]=\"!bgIsGradient() && !bgIsImage()\" (click)=\"setBgFillMode('solid')\"\n                  [disabled]=\"!!component.isNested\">Solid</button>\n                <button type=\"button\" [class.active]=\"bgIsGradient()\" (click)=\"setBgFillMode('gradient')\"\n                  [disabled]=\"!!component.isNested\">Gradient</button>\n                <button type=\"button\" [class.active]=\"bgIsImage()\" (click)=\"setBgFillMode('image')\"\n                  [disabled]=\"!!component.isNested\">Image</button>\n              </div>\n              }\n              @if (schema.key === 'background_color' && bgIsGradient()) {\n              <div class=\"gradient-editor\">\n                <div class=\"gradient-preview\" [style.background]=\"gradientPreview()\"></div>\n                <div class=\"style-opacity-row\">\n                  <span class=\"style-opacity-label\">Angle</span>\n                  <input class=\"style-opacity-slider\" type=\"range\" min=\"0\" max=\"360\" step=\"1\"\n                    [value]=\"getGradientAngle()\" (input)=\"setGradientAngle($any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" />\n                  <span class=\"style-opacity-value\">{{ getGradientAngle() }}&deg;</span>\n                </div>\n                @for (stop of [1, 2]; track stop) {\n                <div class=\"style-color-row\">\n                  <mat-form-field appearance=\"outline\" class=\"style-color-token-field\">\n                    <mat-label>{{ stop === 1 ? 'From' : 'To' }}</mat-label>\n                    <mat-select [value]=\"getGradientStopToken($any(stop))\"\n                      (valueChange)=\"setGradientStopToken($any(stop), $event)\" [disabled]=\"!!component.isNested\">\n                      <mat-option value=\"\">Custom</mat-option>\n                      @for (token of styleColorTokens; track token.value) {\n                      <mat-option [value]=\"token.value\">\n                        <span class=\"style-token-swatch\" [style.background-color]=\"token.value\"></span>\n                        {{ token.label }}\n                      </mat-option>\n                      }\n                    </mat-select>\n                  </mat-form-field>\n                  @if (!isGradientStopToken($any(stop))) {\n                  <input class=\"style-color-hex-input\" type=\"color\" [value]=\"getGradientStopHex($any(stop))\"\n                    (input)=\"setGradientStopHex($any(stop), $any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" />\n                  } @else {\n                  <span class=\"style-token-preview\" [style.background]=\"getGradientStopToken($any(stop))\"></span>\n                  }\n                </div>\n                }\n              </div>\n              } @else if (schema.key === 'background_color' && bgIsImage()) {\n              <div class=\"bg-image-editor\">\n                @if (bgImagePreview()) {\n                <div class=\"bg-image-preview\" [style.background-image]=\"bgImagePreview()\"\n                  [style.background-size]=\"getBgImageOption('background_size', 'cover')\"\n                  [style.background-position]=\"getBgImageOption('background_position', 'center')\"\n                  [style.background-repeat]=\"getBgImageOption('background_repeat', 'no-repeat')\"></div>\n                }\n                <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                  <mat-label>Image</mat-label>\n                  <mat-select [value]=\"getBgImage()\" (valueChange)=\"setBgImage($event)\"\n                    [disabled]=\"!!component.isNested\">\n                    <mat-option value=\"\">None</mat-option>\n                    @for (img of availableImages(); track img.value) {\n                    <mat-option [value]=\"img.value\">{{ img.label || img.value }}</mat-option>\n                    }\n                  </mat-select>\n                </mat-form-field>\n                <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                  <mat-label>Size</mat-label>\n                  <mat-select [value]=\"getBgImageOption('background_size', 'cover')\"\n                    (valueChange)=\"setBgImageOption('background_size', $event)\" [disabled]=\"!!component.isNested\">\n                    @for (opt of bgSizeOptions; track opt.value) {\n                    <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\n                    }\n                  </mat-select>\n                </mat-form-field>\n                <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                  <mat-label>Position</mat-label>\n                  <mat-select [value]=\"getBgImageOption('background_position', 'center')\"\n                    (valueChange)=\"setBgImageOption('background_position', $event)\" [disabled]=\"!!component.isNested\">\n                    @for (opt of bgPositionOptions; track opt.value) {\n                    <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\n                    }\n                  </mat-select>\n                </mat-form-field>\n                <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                  <mat-label>Repeat</mat-label>\n                  <mat-select [value]=\"getBgImageOption('background_repeat', 'no-repeat')\"\n                    (valueChange)=\"setBgImageOption('background_repeat', $event)\" [disabled]=\"!!component.isNested\">\n                    @for (opt of bgRepeatOptions; track opt.value) {\n                    <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\n                    }\n                  </mat-select>\n                </mat-form-field>\n              </div>\n              } @else {\n              @switch (schema.type) {\n              @case ('color') {\n              <div class=\"style-color-row\">\n                <mat-form-field appearance=\"outline\" class=\"style-color-token-field\">\n                  <mat-label>{{ schema.label }}</mat-label>\n                  <mat-select [value]=\"getStyleTokenValue(schema.key)\"\n                    (valueChange)=\"onStyleColorTokenChange(schema.key, $event)\"\n                    [disabled]=\"!!component.isNested\">\n                    <mat-option value=\"\">Custom</mat-option>\n                    @for (token of styleColorTokens; track token.value) {\n                      <mat-option [value]=\"token.value\">\n                        <span class=\"style-token-swatch\" [style.background-color]=\"token.value\"></span>\n                        {{ token.label }}\n                      </mat-option>\n                    }\n                  </mat-select>\n                </mat-form-field>\n                @if (!isStyleTokenColor(schema.key)) {\n                  <input class=\"style-color-hex-input\" type=\"color\"\n                    [value]=\"getStyleHexColor(schema.key, schema.default_value)\"\n                    (input)=\"updateStyleColorHex(schema.key, $any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" />\n                } @else {\n                  <span class=\"style-token-preview\" [style.background]=\"currentStyleValue()(schema.key)\"></span>\n                }\n              </div>\n              @if (!component.isNested) {\n                <div class=\"style-opacity-row\">\n                  <span class=\"style-opacity-label\">Opacity</span>\n                  <input class=\"style-opacity-slider\" type=\"range\" min=\"0\" max=\"100\" step=\"1\"\n                    [value]=\"getStyleAlpha(schema.key, schema.default_value)\"\n                    (input)=\"updateStyleOpacity(schema.key, $any($event.target).value)\" />\n                  <span class=\"style-opacity-value\">{{ getStyleAlpha(schema.key, schema.default_value) }}%</span>\n                </div>\n              }\n              }\n              @case ('number') {\n              <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                <mat-label>{{ schema.label }}</mat-label>\n                <input matInput type=\"number\" [value]=\"currentStyleValue()(schema.key) || schema.default_value\"\n                  (change)=\"updateStylePropertyAtBreakpoint(schema.key, $any($event.target).value)\"\n                  [placeholder]=\"schema.default_value\" [min]=\"schema.min\" [max]=\"schema.max\" [step]=\"schema.step\"\n                  [disabled]=\"!!component.isNested\">\n              </mat-form-field>\n              }\n              @case ('select') {\n              <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                <mat-label>{{ schema.label }}</mat-label>\n                <mat-select [value]=\"currentStyleValue()(schema.key) || schema.default_value\"\n                  (valueChange)=\"updateStylePropertyAtBreakpoint(schema.key, $any($event))\"\n                  [disabled]=\"!!component.isNested\">\n                  @if (schema.options) {\n                  @for (option of schema.options; track option.value) {\n                  <mat-option [value]=\"option.value\">{{ option.label }}</mat-option>\n                  }\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n              @case ('boolean') {\n              <div class=\"boolean-control\">\n                <mat-slide-toggle [checked]=\"currentStyleValue()(schema.key) || schema.default_value\"\n                  (change)=\"updateStylePropertyAtBreakpoint(schema.key, $event.checked)\"\n                  [disabled]=\"!!component.isNested\">\n                  {{ schema.label }}\n                </mat-slide-toggle>\n              </div>\n              }\n              @case ('text') {\n              <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                <mat-label>{{ schema.label }}</mat-label>\n                <input matInput type=\"text\" [value]=\"currentStyleValue()(schema.key) || schema.default_value\"\n                  (change)=\"updateStylePropertyAtBreakpoint(schema.key, $any($event.target).value)\"\n                  [placeholder]=\"schema.placeholder || schema.default_value\"\n                  [disabled]=\"!!component.isNested\">\n              </mat-form-field>\n              }\n              }\n              }\n              @if (hasStyleBreakpointOverride()(schema.key) && !component.isNested) {\n              <button mat-icon-button class=\"clear-breakpoint-override-btn\" type=\"button\"\n                (click)=\"clearStylePropertyAtBreakpoint(schema.key)\"\n                [title]=\"currentBreakpoint() === 'base' ? 'Clear value (reset to default)' : ('Clear ' + currentBreakpoint() + ' override (inherit from base)')\"\n                style=\"position:absolute;top:0;right:0;width:28px;height:28px;line-height:28px;z-index:2;\">\n                <mat-icon style=\"font-size:16px;width:16px;height:16px;\">replay</mat-icon>\n              </button>\n              }\n            </div>\n            }\n          </div>\n        </div>\n        }\n        } @else {\n        <div class=\"no-properties\">\n          <mat-icon>palette</mat-icon>\n          <p>No editable styles defined for this component</p>\n          <p class=\"hint\">Component type: {{ component.type }}</p>\n        </div>\n        }\n\n        <!-- Advanced CSS Classes Section -->\n        <div class=\"property-group\">\n          <h4>CSS Classes</h4>\n          <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n            <mat-label>Breakpoints Classes</mat-label>\n            <input matInput [value]=\"getResponsiveClasses()\"\n              (input)=\"updateResponsiveClasses($any($event.target).value)\"\n              [disabled]=\"!!component.isNested\">\n            <mat-hint>Breakpoint specific CSS class names</mat-hint>\n          </mat-form-field>\n        </div>\n\n        <div class=\"mt-2 property-group\">\n          <div class=\"custom-styles-header\">\n            <h4>Other Styles <span class=\"advanced-tag\">no control</span></h4>\n            @if (!component.isNested) {\n            <button mat-stroked-button color=\"primary\" type=\"button\" (click)=\"addOtherStyle()\" class=\"add-custom-style-btn\">\n              <mat-icon>add</mat-icon>\n              Add\n            </button>\n            }\n          </div>\n          <p class=\"custom-styles-hint\">\n            Style keys on this component that no control above edits. Editing writes to the\n            <code>{{ currentBreakpoint() }}</code> breakpoint. Use snake_case keys (e.g. <code>box_shadow</code>,\n            <code>letter_spacing</code>).\n          </p>\n          @if (otherStyleEntries().length > 0) {\n          <div class=\"custom-styles-list\">\n            @for (entry of otherStyleEntries(); track entry.key) {\n            <div class=\"custom-style-row\" [class.unrendered-style-row]=\"!entry.renderable\">\n              <mat-form-field appearance=\"outline\" class=\"custom-style-key\">\n                <mat-label>{{ entry.overridden ? 'Property' : 'Property (base)' }}</mat-label>\n                <input matInput [value]=\"entry.key\"\n                  (change)=\"updateOtherStyleKey(entry.key, $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\"\n                  placeholder=\"box_shadow\">\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"custom-style-value\">\n                <mat-label>Value</mat-label>\n                <input matInput [value]=\"entry.value ?? ''\"\n                  (input)=\"updateOtherStyleValue(entry.key, $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\"\n                  placeholder=\"4px 0 24px -14px rgba(0,0,0,0.13)\">\n              </mat-form-field>\n              @if (!entry.renderable) {\n              <mat-icon class=\"unrendered-style-icon\"\n                matTooltip=\"Not applied — the renderer has no CSS mapping for this key\">warning</mat-icon>\n              }\n              @if (!component.isNested) {\n              <button mat-icon-button color=\"warn\" type=\"button\" (click)=\"removeOtherStyle(entry.key)\" title=\"Remove\">\n                <mat-icon>delete</mat-icon>\n              </button>\n              }\n            </div>\n            }\n          </div>\n          } @else {\n          <p class=\"custom-styles-empty\">No unmapped styles on this breakpoint.</p>\n          }\n        </div>\n\n        @if(currentBreakpoint() == 'base') {\n        <div class=\"mt-2 property-group\">\n          <h4>Common CSS Classes</h4>\n          <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n            <mat-label>Common Classes (All Breakpoints)</mat-label>\n            <input matInput [value]=\"component.styles.classes || ''\"\n              (input)=\"updateCommonClasses($any($event.target).value)\"\n              [disabled]=\"!!component.isNested\">\n            <mat-hint>Space-separated CSS class names applied to all breakpoints</mat-hint>\n          </mat-form-field>\n        </div>\n\n        <div class=\"mt-2 property-group\">\n          <div class=\"custom-styles-header\">\n            <h4>Custom Styles <span class=\"advanced-tag\">advanced</span></h4>\n            @if (!component.isNested) {\n            <button mat-stroked-button color=\"primary\" type=\"button\" (click)=\"addCustomStyle()\" class=\"add-custom-style-btn\">\n              <mat-icon>add</mat-icon>\n              Add\n            </button>\n            }\n          </div>\n          <p class=\"custom-styles-hint\">\n            Raw CSS overrides applied to all breakpoints. Use camelCase keys (e.g. <code>backgroundImage</code>, <code>boxShadow</code>). Bypasses the responsive style system.\n          </p>\n          @if (customStyleEntries().length > 0) {\n          <div class=\"custom-styles-list\">\n            @for (entry of customStyleEntries(); track entry.key) {\n            <div class=\"custom-style-row\">\n              <mat-form-field appearance=\"outline\" class=\"custom-style-key\">\n                <mat-label>Property</mat-label>\n                <input matInput [value]=\"entry.key\"\n                  (change)=\"updateCustomStyleKey(entry.key, $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\"\n                  placeholder=\"backgroundImage\">\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"custom-style-value\">\n                <mat-label>Value</mat-label>\n                <input matInput [value]=\"entry.value ?? ''\"\n                  (input)=\"updateCustomStyleValue(entry.key, $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\"\n                  placeholder=\"linear-gradient(...)\">\n              </mat-form-field>\n              @if (!component.isNested) {\n              <button mat-icon-button color=\"warn\" type=\"button\" (click)=\"removeCustomStyle(entry.key)\" title=\"Remove\">\n                <mat-icon>delete</mat-icon>\n              </button>\n              }\n            </div>\n            }\n          </div>\n          }\n        </div>\n        }\n      </div>\n    </mat-tab>\n\n    <mat-tab label=\"Events\">\n      <div class=\"tab-content\">\n        <div class=\"events-header\">\n          <h4>Event Subscriptions</h4>\n          @if (!component.isNested) {\n          <button mat-raised-button color=\"primary\" (click)=\"addEventSubscription()\" class=\"add-event-btn\">\n            Add Event\n          </button>\n          }\n        </div>\n\n        @if (eventSubscriptions().length > 0) {\n        <div class=\"events-list\">\n          @for (subscription of eventSubscriptions(); track subscription.id + '_' + $index; let i = $index) {\n          <div class=\"event-card\">\n            <div class=\"event-header\">\n              <mat-form-field appearance=\"outline\" class=\"event-select\">\n                <mat-label>Event</mat-label>\n                <mat-select [value]=\"subscription.event\" (valueChange)=\"updateEventSubscription(i, 'event', $event)\"\n                  [disabled]=\"!!component.isNested\">\n                  @for (event of availableEvents(); track event.value) {\n                  <mat-option [value]=\"event.value\">{{ event.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              @if (!component.isNested) {\n              <button mat-icon-button color=\"warn\" (click)=\"removeEventSubscription(i)\" class=\"remove-btn\"\n                title=\"Remove Event\">\n                <mat-icon>delete</mat-icon>\n              </button>\n              }\n            </div>\n\n            <div class=\"event-config\">\n              <!-- Grid row action: the icon this subscription puts in the grid's\n                   action column. The rest of the card is what runs on click. -->\n              @if (subscription.event === 'custom_action') {\n              <div class=\"custom-action-config\">\n                <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"api-select\">\n                  <mat-label>Action Name</mat-label>\n                  <input matInput [value]=\"subscription.action_name || ''\"\n                    (change)=\"updateEventSubscription(i, 'action_name', $any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" placeholder=\"e.g. Approve\">\n                </mat-form-field>\n                <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"api-select\">\n                  <mat-label>Action Icon</mat-label>\n                  <input matInput [value]=\"subscription.action_icon || ''\"\n                    (change)=\"updateEventSubscription(i, 'action_icon', $any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" placeholder=\"material icon, e.g. check_circle\">\n                </mat-form-field>\n                <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"api-select\">\n                  <mat-label>Visible Condition</mat-label>\n                  <input matInput [value]=\"subscription.action_visible_condition || ''\"\n                    (change)=\"updateEventSubscription(i, 'action_visible_condition', $any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" placeholder=\"&#64;status is not 'closed' AND &#64;amount > 1000\">\n                </mat-form-field>\n                <div class=\"custom-action-hint\">\n                  Name is the icon's tooltip (its label in a kebab menu).\n                  <strong>Reuse the same name on another Custom Action to run several actions from one\n                    icon</strong> — they draw a single icon and all run on click, top to bottom, and only the\n                  first icon and condition you fill in are used.\n                  The condition is evaluated per row against that row's columns — blank means always visible.\n                </div>\n              </div>\n              }\n              <!-- Grid drill: which column's cells become links and drill here.\n                   Free text with suggestions, because a page-field/state grid\n                   has no known columns until its parent query returns. -->\n              @if (subscription.event === 'on_drill') {\n              <div class=\"custom-action-config\">\n                <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"api-select\">\n                  <mat-label>Column / Aggregation Key</mat-label>\n                  <input matInput [value]=\"subscription.drill_column || ''\"\n                    [matAutocomplete]=\"drillAuto\"\n                    (input)=\"updateEventSubscription(i, 'drill_column', $any($event.target).value)\"\n                    (change)=\"updateEventSubscription(i, 'drill_column', $any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" placeholder=\"e.g. deal_amount\">\n                  <mat-autocomplete #drillAuto=\"matAutocomplete\"\n                    (optionSelected)=\"updateEventSubscription(i, 'drill_column', $event.option.value)\">\n                    @for (opt of filteredDrillKeys(subscription.drill_column); track opt.value) {\n                    <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\n                    }\n                  </mat-autocomplete>\n                </mat-form-field>\n                <div class=\"custom-action-hint\">\n                  Cells in this column render as links and drill on click, in view mode only.\n                  In pivot view name the <strong>aggregation</strong> instead — that is the cell that drills.\n                  <strong>Reuse the same key on another On Drill to run several actions from one\n                    link.</strong>\n                  The payload carries the row plus <code>drill.column_value</code>,\n                  <code>drill.column_name</code> and, in pivot, <code>drill.pivot_path</code>.\n                </div>\n              </div>\n              <div class=\"nav-params-editor\">\n                <div class=\"nav-params-header\">\n                  <span class=\"nav-params-title\">Extra Payload</span>\n                  <button mat-icon-button type=\"button\" (click)=\"addPayloadExtra(i)\"\n                    [disabled]=\"!!component.isNested\" matTooltip=\"Add a page-state or page-data value to the payload\">\n                    <mat-icon>add</mat-icon>\n                  </button>\n                </div>\n                @for (px of subscription.payload_extras || []; track $index) {\n                <div class=\"nav-param-row\">\n                  <mat-form-field appearance=\"outline\" class=\"api-select\">\n                    <mat-label>Payload Key</mat-label>\n                    <input matInput [value]=\"px.param ?? ''\"\n                      (change)=\"updatePayloadExtra(i, $index, 'param', $any($event.target).value)\"\n                      [disabled]=\"!!component.isNested\" placeholder=\"fd\">\n                  </mat-form-field>\n                  <mat-form-field appearance=\"outline\" class=\"api-select\">\n                    <mat-label>Value Expression</mat-label>\n                    <input matInput [value]=\"px.value_expression ?? ''\"\n                      (change)=\"updatePayloadExtra(i, $index, 'value_expression', $any($event.target).value)\"\n                      [disabled]=\"!!component.isNested\" placeholder=\"&#64;state.fd\">\n                  </mat-form-field>\n                  <button mat-icon-button type=\"button\" (click)=\"removePayloadExtra(i, $index)\"\n                    [disabled]=\"!!component.isNested\">\n                    <mat-icon>delete</mat-icon>\n                  </button>\n                </div>\n                }\n                <div class=\"nav-params-hint\">\n                  Add page state, page data or another column of the clicked row — each lands on the\n                  payload as <code>extras.&lt;key&gt;</code>, goes out with a Call Query/Function, and is\n                  readable by <strong>Set From Payload</strong>. Expressions take a leading\n                  <code>&#64;</code>: <code>&#64;state.fd</code>, <code>&#64;app.x</code>,\n                  <code>&#64;page.x</code>, and <code>&#64;column.referrer_name</code> for a column of\n                  the drilled row (a bare <code>&#64;referrer_name</code> works too, but falls back to\n                  page data when the row has no such column). Leave the expression blank to send a\n                  fixed value.\n                  With <strong>Navigate To Page</strong>, every payload value — row columns,\n                  <code>column_name</code>, <code>column_value</code> and these extras — seeds the\n                  target page's state variable of the same name. Nothing to declare: the target picks\n                  up only the keys it has, so name the state variable there to receive it.\n                </div>\n              </div>\n              }\n              <mat-form-field appearance=\"outline\" class=\"action-select\">\n                <mat-label>Action</mat-label>\n                <mat-select [value]=\"subscription.action\" (valueChange)=\"updateEventSubscription(i, 'action', $event)\"\n                  [disabled]=\"!!component.isNested\">\n                  <mat-option value=\"no-action\">No Action</mat-option>\n                  <mat-option value=\"call-function\">Call Function</mat-option>\n                  <mat-option value=\"call-query\">Call Query</mat-option>\n                  <mat-option value=\"fetch-page-data\">Fetch Page Data</mat-option>\n                  <mat-option value=\"save-page-data\">Save Page Data</mat-option>\n                  <mat-option value=\"hide-fields\">Hide Fields</mat-option>\n                  <mat-option value=\"unhide-fields\">Unhide Fields</mat-option>\n                  <mat-option value=\"start-loading\">Start Loading</mat-option>\n                  <mat-option value=\"stop-loading\">Stop Loading</mat-option>\n                  <mat-option value=\"hide-component\">Hide Component</mat-option>\n                  <mat-option value=\"show-component\">Show Component</mat-option>\n                  <mat-option value=\"disable-field\">Disable Field</mat-option>\n                  <mat-option value=\"enable-field\">Enable Field</mat-option>\n                  <mat-option value=\"update-state\">Update State</mat-option>\n                  <mat-option value=\"set-field\">Update Value</mat-option>\n                  <mat-option value=\"update-property\">Update Property</mat-option>\n                  <mat-option value=\"enable-component\">Enable Component</mat-option>\n                  <mat-option value=\"disable-component\">Disable Component</mat-option>\n                  <mat-option value=\"start-timer\">Start Timer</mat-option>\n                  <mat-option value=\"stop-timer\">Stop Timer</mat-option>\n                  <mat-option value=\"refresh-grid\">Refresh Grid</mat-option>\n                  <mat-option value=\"download-grid\">Download Grid</mat-option>\n                  <mat-option value=\"refresh-page-ref\">Refresh Page Ref</mat-option>\n                  <mat-option value=\"set-active-tab\">Set Active Tab</mat-option>\n                  <mat-option value=\"toggle-side-panel\">Toggle Side Panel</mat-option>\n                  <mat-option value=\"open-side-panel\">Open Side Panel</mat-option>\n                  <mat-option value=\"close-side-panel\">Close Side Panel</mat-option>\n                  <mat-option value=\"step-forward\">Step Forward</mat-option>\n                  <mat-option value=\"step-back\">Step Back</mat-option>\n                  <mat-option value=\"emit-to-parent\">Emit to Parent</mat-option>\n                  <mat-option value=\"navigate-to-page\">Navigate to Page</mat-option>\n                  <mat-option value=\"set-page-data\">Set Page Data</mat-option>\n                  <mat-option value=\"clear-page-data\">Clear Page Data</mat-option>\n                  <mat-option value=\"clear-all-page-data\">Clear All Page Data</mat-option>\n                  <mat-option value=\"download-file\">Download File</mat-option>\n                </mat-select>\n              </mat-form-field>\n\n              @if (subscription.action !== 'no-action') {\n              <div class=\"boolean-control\">\n                <mat-slide-toggle [checked]=\"!!subscription.validate_before_action\"\n                  (change)=\"updateEventSubscription(i, 'validate_before_action', $event.checked)\"\n                  [disabled]=\"!!component.isNested\">\n                  Validate Before Action\n                </mat-slide-toggle>\n              </div>\n              @if (subscription.validate_before_action) {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Validate Fields (leave empty for whole page)</mat-label>\n                <mat-select [value]=\"subscription.validate_field_names || []\"\n                  (valueChange)=\"updateEventSubscription(i, 'validate_field_names', $event)\" multiple\n                  [disabled]=\"!!component.isNested\">\n                  @for (field of availableFields(); track field.value) {\n                  <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n              }\n\n              @if (subscription.action === 'call-function' || subscription.action === 'call-query' || subscription.action === 'fetch-page-data' || subscription.action === 'save-page-data') {\n\n              @if (subscription.action === 'fetch-page-data') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>API Name</mat-label>\n                <mat-select [value]=\"subscription.apiName\"\n                  (valueChange)=\"updateEventSubscription(i, 'apiName', $event)\"\n                  [disabled]=\"!!component.isNested\">\n                  @for (api of availableApis(); track api.value) {\n                  <mat-option [value]=\"api.value\">{{ api.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              <eru-payload-fields-picker label=\"API Payload Fields\"\n                [value]=\"subscription.api_payload_fields || []\" [options]=\"availablePayloadFields()\"\n                [disabled]=\"!!component.isNested\"\n                (valueChange)=\"updateEventSubscription(i, 'api_payload_fields', $event)\" />\n              }\n\n              @if (subscription.action === 'call-function') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Function Name</mat-label>\n                <input matInput [value]=\"subscription.function_name || ''\" [matAutocomplete]=\"functionAuto\"\n                  (input)=\"updateEventSubscription(i, 'function_name', $any($event.target).value)\"\n                  (change)=\"updateEventSubscription(i, 'function_name', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\" placeholder=\"Select or type a function name\">\n                <mat-autocomplete #functionAuto=\"matAutocomplete\"\n                  (optionSelected)=\"updateEventSubscription(i, 'function_name', $event.option.value)\">\n                  @for (fn of filteredFunctions(subscription.function_name); track fn.value) {\n                  <mat-option [value]=\"fn.value\">{{ fn.label }}</mat-option>\n                  }\n                  @if (isNewFunctionName(subscription.function_name)) {\n                  <mat-option [value]=\"subscription.function_name\">Add \"{{ subscription.function_name }}\"</mat-option>\n                  }\n                </mat-autocomplete>\n              </mat-form-field>\n              <eru-payload-fields-picker label=\"Function Payload Fields\"\n                [value]=\"subscription.api_payload_fields || []\" [options]=\"availablePayloadFields()\"\n                [disabled]=\"!!component.isNested\"\n                (valueChange)=\"updateEventSubscription(i, 'api_payload_fields', $event)\" />\n              }\n\n              @if (subscription.action === 'call-query') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Query Name</mat-label>\n                <input matInput [value]=\"subscription.query_name || ''\" [matAutocomplete]=\"queryAuto\"\n                  (input)=\"updateEventSubscription(i, 'query_name', $any($event.target).value)\"\n                  (change)=\"updateEventSubscription(i, 'query_name', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\" placeholder=\"Select or type a query name\">\n                <mat-autocomplete #queryAuto=\"matAutocomplete\"\n                  (optionSelected)=\"updateEventSubscription(i, 'query_name', $event.option.value)\">\n                  @for (q of filteredQueries(subscription.query_name); track q.value) {\n                  <mat-option [value]=\"q.value\">{{ q.label }}</mat-option>\n                  }\n                  @if (isNewQueryName(subscription.query_name)) {\n                  <mat-option [value]=\"subscription.query_name\">Add \"{{ subscription.query_name }}\"</mat-option>\n                  }\n                </mat-autocomplete>\n              </mat-form-field>\n              <eru-payload-fields-picker label=\"Query Payload Fields\"\n                [value]=\"subscription.api_payload_fields || []\" [options]=\"availablePayloadFields()\"\n                [disabled]=\"!!component.isNested\"\n                (valueChange)=\"updateEventSubscription(i, 'api_payload_fields', $event)\" />\n              }\n\n              @if (subscription.action === 'save-page-data') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Page (payload source)</mat-label>\n                <mat-select [value]=\"subscription.page_id\"\n                  (valueChange)=\"updateEventSubscription(i, 'page_id', $event)\"\n                  [disabled]=\"!!component.isNested\">\n                  @for (page of availablePages(); track page.value) {\n                  <mat-option [value]=\"page.value\">{{ page.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n\n              @if (subscription.action === 'call-function' || subscription.action === 'call-query' || subscription.action === 'fetch-page-data' || subscription.action === 'save-page-data') {\n              <div class=\"error-config-section\" style=\"display:flex;flex-direction:column;gap:4px;margin-bottom:8px;\">\n                <mat-form-field appearance=\"outline\">\n                  <mat-label>Error Field (response key)</mat-label>\n                  <input matInput [value]=\"subscription.error_field ?? ''\"\n                    (change)=\"updateEventSubscription(i, 'error_field', $any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" />\n                </mat-form-field>\n                <mat-form-field appearance=\"outline\">\n                  <mat-label>Error State Key (page state)</mat-label>\n                  <input matInput [value]=\"subscription.error_state_key ?? ''\"\n                    (change)=\"updateEventSubscription(i, 'error_state_key', $any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" />\n                </mat-form-field>\n                <mat-form-field appearance=\"outline\">\n                  <mat-label>Success Message (notification)</mat-label>\n                  <input matInput [value]=\"subscription.success_message ?? ''\"\n                    (change)=\"updateEventSubscription(i, 'success_message', $any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" placeholder=\"Leave blank for no notification\" />\n                </mat-form-field>\n                <mat-form-field appearance=\"outline\">\n                  <mat-label>Error Message (notification)</mat-label>\n                  <input matInput [value]=\"subscription.error_message ?? ''\"\n                    (change)=\"updateEventSubscription(i, 'error_message', $any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" placeholder=\"Leave blank for no notification\" />\n                </mat-form-field>\n              </div>\n              }\n\n              <div class=\"on-success-section\">\n                <div class=\"on-success-header\">\n                  <span class=\"on-success-label\">On Success</span>\n                  @if (!component.isNested) {\n                  <button mat-icon-button (click)=\"addOnSuccessAction(i)\" class=\"add-action-btn\" title=\"Add action\">\n                    <mat-icon>add</mat-icon>\n                  </button>\n                  }\n                </div>\n                @for (action of subscription.on_success || []; track $index; let j = $index) {\n                  <div class=\"on-success-action\">\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.action\" (valueChange)=\"updateOnSuccessAction(i, j, 'action', $event)\"\n                        [disabled]=\"!!component.isNested\">\n                        <mat-option value=\"hide-fields\">Hide Fields</mat-option>\n                        <mat-option value=\"unhide-fields\">Unhide Fields</mat-option>\n                        <mat-option value=\"disable-field\">Disable Field</mat-option>\n                        <mat-option value=\"enable-field\">Enable Field</mat-option>\n                        <mat-option value=\"set-field\">Update Value</mat-option>\n                        <mat-option value=\"update-property\">Update Property</mat-option>\n                        <mat-option value=\"update-state\">Update State</mat-option>\n                        <mat-option value=\"hide-component\">Hide Component</mat-option>\n                        <mat-option value=\"show-component\">Show Component</mat-option>\n                        <mat-option value=\"enable-component\">Enable Component</mat-option>\n                        <mat-option value=\"disable-component\">Disable Component</mat-option>\n                        <mat-option value=\"start-timer\">Start Timer</mat-option>\n                        <mat-option value=\"stop-timer\">Stop Timer</mat-option>\n                        <mat-option value=\"stop-loading\">Stop Loading</mat-option>\n                        <mat-option value=\"call-function\">Call Function</mat-option>\n                        <mat-option value=\"call-query\">Call Query</mat-option>\n                        <mat-option value=\"refresh-grid\">Refresh Grid</mat-option>\n                        <mat-option value=\"download-grid\">Download Grid</mat-option>\n                        <mat-option value=\"refresh-page-ref\">Refresh Page Ref</mat-option>\n                        <mat-option value=\"set-active-tab\">Set Active Tab</mat-option>\n                        <mat-option value=\"toggle-side-panel\">Toggle Side Panel</mat-option>\n                        <mat-option value=\"open-side-panel\">Open Side Panel</mat-option>\n                        <mat-option value=\"close-side-panel\">Close Side Panel</mat-option>\n                        <mat-option value=\"emit-to-parent\">Emit to Parent</mat-option>\n                        <mat-option value=\"navigate-to-page\">Navigate to Page</mat-option>\n                        <mat-option value=\"set-page-data\">Set Page Data</mat-option>\n                        <mat-option value=\"clear-page-data\">Clear Page Data</mat-option>\n                        <mat-option value=\"clear-all-page-data\">Clear All Page Data</mat-option>\n                        <mat-option value=\"download-file\">Download File</mat-option>\n                      </mat-select>\n                    </mat-form-field>\n                    @if (action.action === 'navigate-to-page') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.page_id\" (valueChange)=\"updateOnSuccessAction(i, j, 'page_id', $event)\" [disabled]=\"!!component.isNested\">\n                          @for (page of availablePages(); track page.value) {\n                            <mat-option [value]=\"page.value\">{{ page.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'hide-fields' || action.action === 'unhide-fields' || action.action === 'disable-field' || action.action === 'enable-field') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnSuccessAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (field of availableFields(); track field.value) {\n                            <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'hide-component' || action.action === 'show-component' || action.action === 'enable-component' || action.action === 'disable-component' || action.action === 'start-timer' || action.action === 'stop-timer' || action.action === 'stop-loading') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnSuccessAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (comp of availableComponents(); track comp.value) {\n                            <mat-option [value]=\"comp.value\">{{ comp.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'refresh-grid' || action.action === 'download-grid') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnSuccessAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (grid of availableGrids(); track grid.value) {\n                            <mat-option [value]=\"grid.value\">{{ grid.label }}</mat-option>\n                          }\n                          </mat-select>\n                          </mat-form-field>\n                          }\n                          @if (action.action === 'refresh-page-ref') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnSuccessAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (ref of availablePageRefs(); track ref.value) {\n                            <mat-option [value]=\"ref.value\">{{ ref.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'set-active-tab') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Target Tabs</mat-label>\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnSuccessAction(i, j, 'fieldNames', $event)\" multiple>\n                          @for (t of availableTabGroups(); track t.value) {\n                            <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Tab</mat-label>\n                        <input matInput [value]=\"action.value ?? ''\" [matAutocomplete]=\"tabNameAuto\"\n                          (input)=\"updateOnSuccessAction(i, j, 'value', $any($event.target).value)\"\n                          (change)=\"updateOnSuccessAction(i, j, 'value', $any($event.target).value)\"\n                          placeholder=\"Tab title or index\">\n                        <mat-autocomplete #tabNameAuto=\"matAutocomplete\"\n                          (optionSelected)=\"updateOnSuccessAction(i, j, 'value', $event.option.value)\">\n                          @for (t of availableTabNames(); track t.value) {\n                            <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                          }\n                        </mat-autocomplete>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'toggle-side-panel' || action.action === 'open-side-panel' || action.action === 'close-side-panel') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnSuccessAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (panel of availableSidePanels(); track panel.value) {\n                            <mat-option [value]=\"panel.value\">{{ panel.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'step-forward' || action.action === 'step-back') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnSuccessAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (s of availableSteppers(); track s.value) {\n                            <mat-option [value]=\"s.value\">{{ s.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'download-file') {\n                      <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>File From</mat-label>\n                          <mat-select [value]=\"action.file_source || 'response'\" (valueChange)=\"updateOnSuccessAction(i, j, 'file_source', $event)\" [disabled]=\"!!component.isNested\">\n                            <mat-option value=\"response\">API Response / Event Payload</mat-option>\n                            <mat-option value=\"state\">Page State</mat-option>\n                            <mat-option value=\"app_state\">App State (shared, survives navigation)</mat-option>\n                            <mat-option value=\"page_data\">Page Data</mat-option>\n                          </mat-select>\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Base64 Path</mat-label>\n                          <input matInput [value]=\"action.file_path ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'file_path', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"e.g. data.file_content\" />\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>File Type</mat-label>\n                          <input matInput [value]=\"action.file_type ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'file_type', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"pdf, xlsx or application/pdf\" />\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>File Type Path (optional)</mat-label>\n                          <input matInput [value]=\"action.file_type_path ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'file_type_path', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"e.g. data.content_type\" />\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>File Name (optional)</mat-label>\n                          <input matInput [value]=\"action.file_name ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'file_name', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"statement\" />\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>File Name Path (optional)</mat-label>\n                          <input matInput [value]=\"action.file_name_path ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'file_name_path', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"e.g. data.file_name\" />\n                        </mat-form-field>\n                      </div>\n                    }\n                    @if (action.action === 'emit-to-parent') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'state_key', $any($event.target).value)\" placeholder=\"Signal Name\" [disabled]=\"!!component.isNested\" />\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'set-field') {\n                      <div class=\"event-config-row\">\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-select [value]=\"action.state_key\" (valueChange)=\"updateOnSuccessAction(i, j, 'state_key', $event)\" [disabled]=\"!!component.isNested\">\n                            @for (field of availableFields(); track field.value) {\n                              <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                            }\n                          </mat-select>\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <input matInput [value]=\"action.value ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'value', $any($event.target).value)\" placeholder=\"Value\" [disabled]=\"!!component.isNested\" />\n                        </mat-form-field>\n                      </div>\n                    }\n                    @if (action.action === 'update-property') {\n                      <div class=\"event-config-row\">\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnSuccessAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                            @for (comp of availableComponents(); track comp.value) {\n                              <mat-option [value]=\"comp.value\">{{ comp.label }}</mat-option>\n                            }\n                          </mat-select>\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <input matInput [value]=\"action.property_key ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'property_key', $any($event.target).value)\" placeholder=\"Property\" [disabled]=\"!!component.isNested\" />\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <input matInput [value]=\"action.value ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'value', $any($event.target).value)\" placeholder=\"Value\" [disabled]=\"!!component.isNested\" />\n                        </mat-form-field>\n                      </div>\n                    }\n                    @if (action.action === 'call-function') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <input matInput [value]=\"action.function_name || ''\" [matAutocomplete]=\"successFunctionAuto\"\n                          (input)=\"updateOnSuccessAction(i, j, 'function_name', $any($event.target).value)\"\n                          (change)=\"updateOnSuccessAction(i, j, 'function_name', $any($event.target).value)\"\n                          [disabled]=\"!!component.isNested\" placeholder=\"Function Name\">\n                        <mat-autocomplete #successFunctionAuto=\"matAutocomplete\"\n                          (optionSelected)=\"updateOnSuccessAction(i, j, 'function_name', $event.option.value)\">\n                          @for (fn of filteredFunctions(action.function_name); track fn.value) {\n                            <mat-option [value]=\"fn.value\">{{ fn.label }}</mat-option>\n                          }\n                          @if (isNewFunctionName(action.function_name)) {\n                            <mat-option [value]=\"action.function_name\">Add \"{{ action.function_name }}\"</mat-option>\n                          }\n                        </mat-autocomplete>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'call-query') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <input matInput [value]=\"action.query_name || ''\" [matAutocomplete]=\"successQueryAuto\"\n                          (input)=\"updateOnSuccessAction(i, j, 'query_name', $any($event.target).value)\"\n                          (change)=\"updateOnSuccessAction(i, j, 'query_name', $any($event.target).value)\"\n                          [disabled]=\"!!component.isNested\" placeholder=\"Query Name\">\n                        <mat-autocomplete #successQueryAuto=\"matAutocomplete\"\n                          (optionSelected)=\"updateOnSuccessAction(i, j, 'query_name', $event.option.value)\">\n                          @for (q of filteredQueries(action.query_name); track q.value) {\n                            <mat-option [value]=\"q.value\">{{ q.label }}</mat-option>\n                          }\n                          @if (isNewQueryName(action.query_name)) {\n                            <mat-option [value]=\"action.query_name\">Add \"{{ action.query_name }}\"</mat-option>\n                          }\n                        </mat-autocomplete>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'call-function' || action.action === 'call-query') {\n                      <eru-payload-fields-picker class=\"action-select-sm\" placeholder=\"Payload Fields\"\n                        [value]=\"action.api_payload_fields || []\" [options]=\"availablePayloadFields()\"\n                        [disabled]=\"!!component.isNested\"\n                        (valueChange)=\"updateOnSuccessAction(i, j, 'api_payload_fields', $event)\" />\n                    }\n                    @if (action.action === 'update-state') {\n                      <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Scope</mat-label>\n                          <mat-select [value]=\"action.state_scope || 'page'\" (valueChange)=\"updateOnSuccessAction(i, j, 'state_scope', $event)\" [disabled]=\"!!component.isNested\">\n                            <mat-option value=\"page\">Page State</mat-option>\n                            <mat-option value=\"app\">App State (shared, survives navigation)</mat-option>\n                          </mat-select>\n                        </mat-form-field>\n                        @if (action.state_scope === 'app') {\n                        <!-- Typed, not picked: app state has no declarations to\n                             list — a key exists only because an action wrote it. -->\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>App State Key</mat-label>\n                          <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'state_key', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"selected_invoice\" />\n                        </mat-form-field>\n                        } @else {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>State Key</mat-label>\n                          <mat-select [value]=\"action.state_key\" (valueChange)=\"updateOnSuccessAction(i, j, 'state_key', $event)\" [disabled]=\"!!component.isNested\">\n                            @for (key of pageStateKeys(); track key) {\n                              <mat-option [value]=\"key\">{{ key }}</mat-option>\n                            }\n                          </mat-select>\n                          @if (pageStateKeys().length === 0) {\n                          <mat-hint>This page declares no state variables — add one in the Page State panel first.</mat-hint>\n                          }\n                        </mat-form-field>\n                        }\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Formula</mat-label>\n                          <mat-select [value]=\"action.state_formula?.fn\" (valueChange)=\"updateNestedStateFormulaFn(i, j, 'on_success', $event)\" [disabled]=\"!!component.isNested\">\n                            <mat-option value=\"set\">Set Value</mat-option>\n                            <mat-option value=\"increment\">Increment</mat-option>\n                            <mat-option value=\"decrement\">Decrement</mat-option>\n                            <mat-option value=\"toggle\">Toggle</mat-option>\n                            <mat-option value=\"reset\">Reset to Initial</mat-option>\n                            <mat-option value=\"set-from-field\">Set from Field</mat-option>\n                            <mat-option value=\"set-from-payload\">Set from Event Payload</mat-option>\n                            <mat-option value=\"expr\">Expression</mat-option>\n                          </mat-select>\n                        </mat-form-field>\n                        @if (action.state_formula?.fn === 'set') {\n                          <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                            <mat-label>Value</mat-label>\n                            <input matInput [value]=\"action.state_formula?.value ?? ''\" (change)=\"updateNestedStateFormulaParam(i, j, 'on_success', 'value', $any($event.target).value)\" [disabled]=\"!!component.isNested\" />\n                          </mat-form-field>\n                        }\n                        @if (action.state_formula?.fn === 'increment' || action.state_formula?.fn === 'decrement') {\n                          <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                            <mat-label>By</mat-label>\n                            <input matInput type=\"number\" [value]=\"action.state_formula?.by ?? 1\" (change)=\"updateNestedStateFormulaParam(i, j, 'on_success', 'by', +$any($event.target).value)\" [disabled]=\"!!component.isNested\" />\n                          </mat-form-field>\n                        }\n                        @if (action.state_formula?.fn === 'set-from-field') {\n                          <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                            <mat-label>Field</mat-label>\n                            <mat-select [value]=\"action.state_formula?.field\" (valueChange)=\"updateNestedStateFormulaParam(i, j, 'on_success', 'field', $event)\" [disabled]=\"!!component.isNested\">\n                              @for (field of stateSourceFields(); track field.value) {\n                                <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                              }\n                            </mat-select>\n                          </mat-form-field>\n                        }\n                        @if (action.state_formula?.fn === 'set-from-payload') {\n                          <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                            <mat-label>Payload Path</mat-label>\n                            <input matInput [value]=\"action.state_formula?.payload_path ?? ''\" (change)=\"updateNestedStateFormulaParam(i, j, 'on_success', 'payload_path', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"e.g. entity_data.foo\" />\n                          </mat-form-field>\n                        }\n                        @if (action.state_formula?.fn === 'expr') {\n                          <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                            <mat-label>Expression</mat-label>\n                            <input matInput [value]=\"action.state_formula?.expr ?? ''\" (change)=\"updateNestedStateFormulaParam(i, j, 'on_success', 'expr', $any($event.target).value)\" [disabled]=\"!!component.isNested\" />\n                            <mat-hint><code>&#64;state.key</code> page state · <code>&#64;app.key</code> app state · <code>&#64;page.entity_data.field</code> page data</mat-hint>\n                          </mat-form-field>\n                        }\n                      </div>\n                    }\n                    @if (!component.isNested) {\n                    @if (action.action === 'set-page-data') {\n                    <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Record From</mat-label>\n                        <mat-select [value]=\"action.record_source || 'event'\" (valueChange)=\"updateOnSuccessAction(i, j, 'record_source', $event)\">\n                          <mat-option value=\"event\">API Response / Event Payload</mat-option>\n                          <mat-option value=\"state\">Page State</mat-option>\n                          <mat-option value=\"app_state\">App State (shared, survives navigation)</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n                      @if ((action.record_source || 'event') === 'state') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>State Key</mat-label>\n                        <mat-select [value]=\"action.state_key ?? ''\" (valueChange)=\"updateOnSuccessAction(i, j, 'state_key', $event)\">\n                          @for (key of pageStateKeys(); track key) {\n                          <mat-option [value]=\"key\">{{ key }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                      }\n                      @if (action.record_source === 'app_state') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>App State Key</mat-label>\n                        <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'state_key', $any($event.target).value)\" placeholder=\"selected_program\" />\n                      </mat-form-field>\n                      }\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Path (optional)</mat-label>\n                        <input matInput [value]=\"action.record_path ?? ''\" (change)=\"updateOnSuccessAction(i, j, 'record_path', $any($event.target).value)\" placeholder=\"e.g. get_txn.0\" />\n                      </mat-form-field>\n                      <div class=\"nav-params-hint\">\n                        Writes this page's record from the call's response. <strong>Path</strong> drills into it — a query\n                        answering {{ '{' }} get_txn: [ ... ] {{ '}' }} needs <code>get_txn.0</code> to reach the row; without one the\n                        whole response is written and the page's fields stay empty. A row of\n                        {{ '{' }} entity_id, entity_data {{ '}' }} sets both; any other object becomes the page's fields.\n                      </div>\n                    </div>\n                    }\n                    <button mat-icon-button (click)=\"removeOnSuccessAction(i, j)\" class=\"remove-action-btn\">\n                      <mat-icon>close</mat-icon>\n                    </button>\n                    }\n                  </div>\n                }\n              </div>\n\n              <div class=\"on-success-section on-error-section\">\n                <div class=\"on-success-header\">\n                  <span class=\"on-success-label on-error-label\">On Error</span>\n                  @if (!component.isNested) {\n                  <button mat-icon-button (click)=\"addOnErrorAction(i)\" class=\"add-action-btn\" title=\"Add error action\">\n                    <mat-icon>add</mat-icon>\n                  </button>\n                  }\n                </div>\n                @for (action of subscription.on_error || []; track $index; let j = $index) {\n                  <div class=\"on-success-action\">\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.action\" (valueChange)=\"updateOnErrorAction(i, j, 'action', $event)\" [disabled]=\"!!component.isNested\">\n                        <mat-option value=\"hide-fields\">Hide Fields</mat-option>\n                        <mat-option value=\"unhide-fields\">Unhide Fields</mat-option>\n                        <mat-option value=\"disable-field\">Disable Field</mat-option>\n                        <mat-option value=\"enable-field\">Enable Field</mat-option>\n                        <mat-option value=\"set-field\">Update Value</mat-option>\n                        <mat-option value=\"update-property\">Update Property</mat-option>\n                        <mat-option value=\"update-state\">Update State</mat-option>\n                        <mat-option value=\"hide-component\">Hide Component</mat-option>\n                        <mat-option value=\"show-component\">Show Component</mat-option>\n                        <mat-option value=\"enable-component\">Enable Component</mat-option>\n                        <mat-option value=\"disable-component\">Disable Component</mat-option>\n                        <mat-option value=\"stop-loading\">Stop Loading</mat-option>\n                        <mat-option value=\"call-function\">Call Function</mat-option>\n                        <mat-option value=\"call-query\">Call Query</mat-option>\n                        <mat-option value=\"refresh-grid\">Refresh Grid</mat-option>\n                        <mat-option value=\"download-grid\">Download Grid</mat-option>\n                        <mat-option value=\"refresh-page-ref\">Refresh Page Ref</mat-option>\n                        <mat-option value=\"set-active-tab\">Set Active Tab</mat-option>\n                        <mat-option value=\"toggle-side-panel\">Toggle Side Panel</mat-option>\n                        <mat-option value=\"open-side-panel\">Open Side Panel</mat-option>\n                        <mat-option value=\"close-side-panel\">Close Side Panel</mat-option>\n                        <mat-option value=\"emit-to-parent\">Emit to Parent</mat-option>\n                        <mat-option value=\"navigate-to-page\">Navigate to Page</mat-option>\n                        <mat-option value=\"set-page-data\">Set Page Data</mat-option>\n                        <mat-option value=\"clear-page-data\">Clear Page Data</mat-option>\n                        <mat-option value=\"clear-all-page-data\">Clear All Page Data</mat-option>\n                        <mat-option value=\"download-file\">Download File</mat-option>\n                      </mat-select>\n                    </mat-form-field>\n                    @if (action.action === 'navigate-to-page') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.page_id\" (valueChange)=\"updateOnErrorAction(i, j, 'page_id', $event)\" [disabled]=\"!!component.isNested\">\n                          @for (page of availablePages(); track page.value) {\n                            <mat-option [value]=\"page.value\">{{ page.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'hide-fields' || action.action === 'unhide-fields' || action.action === 'disable-field' || action.action === 'enable-field') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnErrorAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (field of availableFields(); track field.value) {\n                            <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'hide-component' || action.action === 'show-component' || action.action === 'enable-component' || action.action === 'disable-component' || action.action === 'stop-loading') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnErrorAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (comp of availableComponents(); track comp.value) {\n                            <mat-option [value]=\"comp.value\">{{ comp.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'refresh-grid' || action.action === 'download-grid') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnErrorAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (grid of availableGrids(); track grid.value) {\n                            <mat-option [value]=\"grid.value\">{{ grid.label }}</mat-option>\n                          }\n                          </mat-select>\n                          </mat-form-field>\n                          }\n                          @if (action.action === 'refresh-page-ref') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnErrorAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (ref of availablePageRefs(); track ref.value) {\n                            <mat-option [value]=\"ref.value\">{{ ref.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'set-active-tab') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Target Tabs</mat-label>\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnErrorAction(i, j, 'fieldNames', $event)\" multiple>\n                          @for (t of availableTabGroups(); track t.value) {\n                            <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Tab</mat-label>\n                        <input matInput [value]=\"action.value ?? ''\" [matAutocomplete]=\"tabNameAuto\"\n                          (input)=\"updateOnErrorAction(i, j, 'value', $any($event.target).value)\"\n                          (change)=\"updateOnErrorAction(i, j, 'value', $any($event.target).value)\"\n                          placeholder=\"Tab title or index\">\n                        <mat-autocomplete #tabNameAuto=\"matAutocomplete\"\n                          (optionSelected)=\"updateOnErrorAction(i, j, 'value', $event.option.value)\">\n                          @for (t of availableTabNames(); track t.value) {\n                            <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                          }\n                        </mat-autocomplete>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'toggle-side-panel' || action.action === 'open-side-panel' || action.action === 'close-side-panel') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnErrorAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (panel of availableSidePanels(); track panel.value) {\n                            <mat-option [value]=\"panel.value\">{{ panel.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'step-forward' || action.action === 'step-back') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnErrorAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                          @for (s of availableSteppers(); track s.value) {\n                            <mat-option [value]=\"s.value\">{{ s.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'download-file') {\n                      <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>File From</mat-label>\n                          <mat-select [value]=\"action.file_source || 'response'\" (valueChange)=\"updateOnErrorAction(i, j, 'file_source', $event)\" [disabled]=\"!!component.isNested\">\n                            <mat-option value=\"response\">API Response / Event Payload</mat-option>\n                            <mat-option value=\"state\">Page State</mat-option>\n                            <mat-option value=\"app_state\">App State (shared, survives navigation)</mat-option>\n                            <mat-option value=\"page_data\">Page Data</mat-option>\n                          </mat-select>\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Base64 Path</mat-label>\n                          <input matInput [value]=\"action.file_path ?? ''\" (change)=\"updateOnErrorAction(i, j, 'file_path', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"e.g. data.file_content\" />\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>File Type</mat-label>\n                          <input matInput [value]=\"action.file_type ?? ''\" (change)=\"updateOnErrorAction(i, j, 'file_type', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"pdf, xlsx or application/pdf\" />\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>File Type Path (optional)</mat-label>\n                          <input matInput [value]=\"action.file_type_path ?? ''\" (change)=\"updateOnErrorAction(i, j, 'file_type_path', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"e.g. data.content_type\" />\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>File Name (optional)</mat-label>\n                          <input matInput [value]=\"action.file_name ?? ''\" (change)=\"updateOnErrorAction(i, j, 'file_name', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"statement\" />\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>File Name Path (optional)</mat-label>\n                          <input matInput [value]=\"action.file_name_path ?? ''\" (change)=\"updateOnErrorAction(i, j, 'file_name_path', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"e.g. data.file_name\" />\n                        </mat-form-field>\n                      </div>\n                    }\n                    @if (action.action === 'emit-to-parent') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updateOnErrorAction(i, j, 'state_key', $any($event.target).value)\" placeholder=\"Signal Name\" [disabled]=\"!!component.isNested\" />\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'set-field') {\n                      <div class=\"event-config-row\">\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-select [value]=\"action.state_key\" (valueChange)=\"updateOnErrorAction(i, j, 'state_key', $event)\" [disabled]=\"!!component.isNested\">\n                            @for (field of availableFields(); track field.value) {\n                              <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                            }\n                          </mat-select>\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <input matInput [value]=\"action.value ?? ''\" (change)=\"updateOnErrorAction(i, j, 'value', $any($event.target).value)\" placeholder=\"Value\" [disabled]=\"!!component.isNested\" />\n                        </mat-form-field>\n                      </div>\n                    }\n                    @if (action.action === 'update-property') {\n                      <div class=\"event-config-row\">\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updateOnErrorAction(i, j, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                            @for (comp of availableComponents(); track comp.value) {\n                              <mat-option [value]=\"comp.value\">{{ comp.label }}</mat-option>\n                            }\n                          </mat-select>\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <input matInput [value]=\"action.property_key ?? ''\" (change)=\"updateOnErrorAction(i, j, 'property_key', $any($event.target).value)\" placeholder=\"Property\" [disabled]=\"!!component.isNested\" />\n                        </mat-form-field>\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <input matInput [value]=\"action.value ?? ''\" (change)=\"updateOnErrorAction(i, j, 'value', $any($event.target).value)\" placeholder=\"Value\" [disabled]=\"!!component.isNested\" />\n                        </mat-form-field>\n                      </div>\n                    }\n                    @if (action.action === 'call-function') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <input matInput [value]=\"action.function_name || ''\" [matAutocomplete]=\"errorFunctionAuto\"\n                          (input)=\"updateOnErrorAction(i, j, 'function_name', $any($event.target).value)\"\n                          (change)=\"updateOnErrorAction(i, j, 'function_name', $any($event.target).value)\"\n                          [disabled]=\"!!component.isNested\" placeholder=\"Function Name\">\n                        <mat-autocomplete #errorFunctionAuto=\"matAutocomplete\"\n                          (optionSelected)=\"updateOnErrorAction(i, j, 'function_name', $event.option.value)\">\n                          @for (fn of filteredFunctions(action.function_name); track fn.value) {\n                            <mat-option [value]=\"fn.value\">{{ fn.label }}</mat-option>\n                          }\n                          @if (isNewFunctionName(action.function_name)) {\n                            <mat-option [value]=\"action.function_name\">Add \"{{ action.function_name }}\"</mat-option>\n                          }\n                        </mat-autocomplete>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'call-query') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <input matInput [value]=\"action.query_name || ''\" [matAutocomplete]=\"errorQueryAuto\"\n                          (input)=\"updateOnErrorAction(i, j, 'query_name', $any($event.target).value)\"\n                          (change)=\"updateOnErrorAction(i, j, 'query_name', $any($event.target).value)\"\n                          [disabled]=\"!!component.isNested\" placeholder=\"Query Name\">\n                        <mat-autocomplete #errorQueryAuto=\"matAutocomplete\"\n                          (optionSelected)=\"updateOnErrorAction(i, j, 'query_name', $event.option.value)\">\n                          @for (q of filteredQueries(action.query_name); track q.value) {\n                            <mat-option [value]=\"q.value\">{{ q.label }}</mat-option>\n                          }\n                          @if (isNewQueryName(action.query_name)) {\n                            <mat-option [value]=\"action.query_name\">Add \"{{ action.query_name }}\"</mat-option>\n                          }\n                        </mat-autocomplete>\n                      </mat-form-field>\n                    }\n                    @if (action.action === 'call-function' || action.action === 'call-query') {\n                      <eru-payload-fields-picker class=\"action-select-sm\" placeholder=\"Payload Fields\"\n                        [value]=\"action.api_payload_fields || []\" [options]=\"availablePayloadFields()\"\n                        [disabled]=\"!!component.isNested\"\n                        (valueChange)=\"updateOnErrorAction(i, j, 'api_payload_fields', $event)\" />\n                    }\n                    @if (action.action === 'update-state') {\n                      <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Scope</mat-label>\n                          <mat-select [value]=\"action.state_scope || 'page'\" (valueChange)=\"updateOnErrorAction(i, j, 'state_scope', $event)\" [disabled]=\"!!component.isNested\">\n                            <mat-option value=\"page\">Page State</mat-option>\n                            <mat-option value=\"app\">App State (shared, survives navigation)</mat-option>\n                          </mat-select>\n                        </mat-form-field>\n                        @if (action.state_scope === 'app') {\n                        <!-- Typed, not picked: app state has no declarations to\n                             list — a key exists only because an action wrote it. -->\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>App State Key</mat-label>\n                          <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updateOnErrorAction(i, j, 'state_key', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"selected_invoice\" />\n                        </mat-form-field>\n                        } @else {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>State Key</mat-label>\n                          <mat-select [value]=\"action.state_key\" (valueChange)=\"updateOnErrorAction(i, j, 'state_key', $event)\" [disabled]=\"!!component.isNested\">\n                            @for (key of pageStateKeys(); track key) {\n                              <mat-option [value]=\"key\">{{ key }}</mat-option>\n                            }\n                          </mat-select>\n                          @if (pageStateKeys().length === 0) {\n                          <mat-hint>This page declares no state variables — add one in the Page State panel first.</mat-hint>\n                          }\n                        </mat-form-field>\n                        }\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Formula</mat-label>\n                          <mat-select [value]=\"action.state_formula?.fn\" (valueChange)=\"updateNestedStateFormulaFn(i, j, 'on_error', $event)\" [disabled]=\"!!component.isNested\">\n                            <mat-option value=\"set\">Set Value</mat-option>\n                            <mat-option value=\"increment\">Increment</mat-option>\n                            <mat-option value=\"decrement\">Decrement</mat-option>\n                            <mat-option value=\"toggle\">Toggle</mat-option>\n                            <mat-option value=\"reset\">Reset to Initial</mat-option>\n                            <mat-option value=\"set-from-field\">Set from Field</mat-option>\n                            <mat-option value=\"set-from-payload\">Set from Event Payload</mat-option>\n                            <mat-option value=\"expr\">Expression</mat-option>\n                          </mat-select>\n                        </mat-form-field>\n                        @if (action.state_formula?.fn === 'set') {\n                          <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                            <mat-label>Value</mat-label>\n                            <input matInput [value]=\"action.state_formula?.value ?? ''\" (change)=\"updateNestedStateFormulaParam(i, j, 'on_error', 'value', $any($event.target).value)\" [disabled]=\"!!component.isNested\" />\n                          </mat-form-field>\n                        }\n                        @if (action.state_formula?.fn === 'increment' || action.state_formula?.fn === 'decrement') {\n                          <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                            <mat-label>By</mat-label>\n                            <input matInput type=\"number\" [value]=\"action.state_formula?.by ?? 1\" (change)=\"updateNestedStateFormulaParam(i, j, 'on_error', 'by', +$any($event.target).value)\" [disabled]=\"!!component.isNested\" />\n                          </mat-form-field>\n                        }\n                        @if (action.state_formula?.fn === 'set-from-field') {\n                          <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                            <mat-label>Field</mat-label>\n                            <mat-select [value]=\"action.state_formula?.field\" (valueChange)=\"updateNestedStateFormulaParam(i, j, 'on_error', 'field', $event)\" [disabled]=\"!!component.isNested\">\n                              @for (field of stateSourceFields(); track field.value) {\n                                <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                              }\n                            </mat-select>\n                          </mat-form-field>\n                        }\n                        @if (action.state_formula?.fn === 'set-from-payload') {\n                          <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                            <mat-label>Payload Path</mat-label>\n                            <input matInput [value]=\"action.state_formula?.payload_path ?? ''\" (change)=\"updateNestedStateFormulaParam(i, j, 'on_error', 'payload_path', $any($event.target).value)\" [disabled]=\"!!component.isNested\" placeholder=\"e.g. error.message\" />\n                          </mat-form-field>\n                        }\n                        @if (action.state_formula?.fn === 'expr') {\n                          <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                            <mat-label>Expression</mat-label>\n                            <input matInput [value]=\"action.state_formula?.expr ?? ''\" (change)=\"updateNestedStateFormulaParam(i, j, 'on_error', 'expr', $any($event.target).value)\" [disabled]=\"!!component.isNested\" />\n                            <mat-hint><code>&#64;state.key</code> page state · <code>&#64;app.key</code> app state · <code>&#64;page.entity_data.field</code> page data</mat-hint>\n                          </mat-form-field>\n                        }\n                      </div>\n                    }\n                    @if (!component.isNested) {\n                    @if (action.action === 'set-page-data') {\n                    <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Record From</mat-label>\n                        <mat-select [value]=\"action.record_source || 'event'\" (valueChange)=\"updateOnErrorAction(i, j, 'record_source', $event)\">\n                          <mat-option value=\"event\">API Response / Event Payload</mat-option>\n                          <mat-option value=\"state\">Page State</mat-option>\n                          <mat-option value=\"app_state\">App State (shared, survives navigation)</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n                      @if ((action.record_source || 'event') === 'state') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>State Key</mat-label>\n                        <mat-select [value]=\"action.state_key ?? ''\" (valueChange)=\"updateOnErrorAction(i, j, 'state_key', $event)\">\n                          @for (key of pageStateKeys(); track key) {\n                          <mat-option [value]=\"key\">{{ key }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                      }\n                      @if (action.record_source === 'app_state') {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>App State Key</mat-label>\n                        <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updateOnErrorAction(i, j, 'state_key', $any($event.target).value)\" placeholder=\"selected_program\" />\n                      </mat-form-field>\n                      }\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Path (optional)</mat-label>\n                        <input matInput [value]=\"action.record_path ?? ''\" (change)=\"updateOnErrorAction(i, j, 'record_path', $any($event.target).value)\" placeholder=\"e.g. get_txn.0\" />\n                      </mat-form-field>\n                      <div class=\"nav-params-hint\">\n                        Writes this page's record from the call's response. <strong>Path</strong> drills into it — a query\n                        answering {{ '{' }} get_txn: [ ... ] {{ '}' }} needs <code>get_txn.0</code> to reach the row; without one the\n                        whole response is written and the page's fields stay empty. A row of\n                        {{ '{' }} entity_id, entity_data {{ '}' }} sets both; any other object becomes the page's fields.\n                      </div>\n                    </div>\n                    }\n                    <button mat-icon-button (click)=\"removeOnErrorAction(i, j)\" class=\"remove-action-btn\">\n                      <mat-icon>close</mat-icon>\n                    </button>\n                    }\n                  </div>\n                }\n              </div>\n              }\n\n              @if (subscription.action === 'hide-fields' || subscription.action === 'unhide-fields') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Field Names</mat-label>\n                <mat-select [value]=\"subscription.fieldNames || []\"\n                  (valueChange)=\"updateEventSubscription(i, 'fieldNames', $event)\" multiple\n                  [disabled]=\"!!component.isNested\">\n                  @for (field of availableFields(); track field.value) {\n                  <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n\n              @if (subscription.action === 'start-loading' || subscription.action === 'stop-loading' || subscription.action === 'hide-component' || subscription.action === 'show-component') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Target Components</mat-label>\n                <mat-select [value]=\"subscription.fieldNames || []\"\n                  (valueChange)=\"updateEventSubscription(i, 'fieldNames', $event)\" multiple\n                  [disabled]=\"!!component.isNested\">\n                  @for (comp of availableComponents(); track comp.value) {\n                  <mat-option [value]=\"comp.value\">{{ comp.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n\n              @if (subscription.action === 'disable-field' || subscription.action === 'enable-field') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Field Names</mat-label>\n                <mat-select [value]=\"subscription.fieldNames || []\"\n                  (valueChange)=\"updateEventSubscription(i, 'fieldNames', $event)\" multiple\n                  [disabled]=\"!!component.isNested\">\n                  @for (field of availableFields(); track field.value) {\n                  <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n\n              @if (subscription.action === 'enable-component' || subscription.action === 'disable-component' || subscription.action === 'start-timer' || subscription.action === 'stop-timer') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Target Components</mat-label>\n                <mat-select [value]=\"subscription.fieldNames || []\"\n                  (valueChange)=\"updateEventSubscription(i, 'fieldNames', $event)\" multiple\n                  [disabled]=\"!!component.isNested\">\n                  @for (comp of availableComponents(); track comp.value) {\n                  <mat-option [value]=\"comp.value\">{{ comp.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n\n              @if (subscription.action === 'refresh-grid' || subscription.action === 'download-grid') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Target Grids</mat-label>\n                <mat-select [value]=\"subscription.fieldNames || []\"\n                  (valueChange)=\"updateEventSubscription(i, 'fieldNames', $event)\" multiple\n                  [disabled]=\"!!component.isNested\">\n                  @for (grid of availableGrids(); track grid.value) {\n                  <mat-option [value]=\"grid.value\">{{ grid.label }}</mat-option>\n                  }\n                  </mat-select>\n                  </mat-form-field>\n                  }\n                  @if (subscription.action === 'refresh-page-ref') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Target Page Refs</mat-label>\n                <mat-select [value]=\"subscription.fieldNames || []\"\n                  (valueChange)=\"updateEventSubscription(i, 'fieldNames', $event)\" multiple\n                  [disabled]=\"!!component.isNested\">\n                  @for (ref of availablePageRefs(); track ref.value) {\n                  <mat-option [value]=\"ref.value\">{{ ref.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n\n              @if (subscription.action === 'set-active-tab') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Target Tabs</mat-label>\n                <mat-select [value]=\"subscription.fieldNames || []\"\n                  (valueChange)=\"updateEventSubscription(i, 'fieldNames', $event)\" multiple [disabled]=\"!!component.isNested\">\n                  @for (t of availableTabGroups(); track t.value) {\n                  <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Tab</mat-label>\n                <input matInput [value]=\"subscription.value ?? ''\" [matAutocomplete]=\"tabNameSubAuto\"\n                  (input)=\"updateEventSubscription(i, 'value', $any($event.target).value)\"\n                  (change)=\"updateEventSubscription(i, 'value', $any($event.target).value)\" [disabled]=\"!!component.isNested\"\n                  placeholder=\"Tab title or index\">\n                <mat-autocomplete #tabNameSubAuto=\"matAutocomplete\"\n                  (optionSelected)=\"updateEventSubscription(i, 'value', $event.option.value)\">\n                  @for (t of availableTabNames(); track t.value) {\n                  <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                  }\n                </mat-autocomplete>\n              </mat-form-field>\n              }\n              @if (subscription.action === 'toggle-side-panel' || subscription.action === 'open-side-panel' || subscription.action === 'close-side-panel') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Target Side Panel</mat-label>\n                <mat-select [value]=\"subscription.fieldNames || []\"\n                  (valueChange)=\"updateEventSubscription(i, 'fieldNames', $event)\" multiple\n                  [disabled]=\"!!component.isNested\">\n                  @for (panel of availableSidePanels(); track panel.value) {\n                  <mat-option [value]=\"panel.value\">{{ panel.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n\n              @if (subscription.action === 'step-forward' || subscription.action === 'step-back') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Target Stepper</mat-label>\n                <mat-select [value]=\"subscription.fieldNames || []\"\n                  (valueChange)=\"updateEventSubscription(i, 'fieldNames', $event)\" multiple\n                  [disabled]=\"!!component.isNested\">\n                  @for (s of availableSteppers(); track s.value) {\n                  <mat-option [value]=\"s.value\">{{ s.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n\n              @if (subscription.action === 'emit-to-parent') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Signal Name</mat-label>\n                <input matInput [value]=\"subscription.state_key ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'state_key', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\">\n              </mat-form-field>\n              }\n\n              @if (subscription.action === 'navigate-to-page') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Target Page</mat-label>\n                <mat-select [value]=\"subscription.page_id\"\n                  (valueChange)=\"updateEventSubscription(i, 'page_id', $event)\"\n                  [disabled]=\"!!component.isNested\">\n                  @for (page of availablePages(); track page.value) {\n                  <mat-option [value]=\"page.value\">{{ page.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Route Param Name (default: view)</mat-label>\n                <input matInput [value]=\"subscription.state_key ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'state_key', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\" placeholder=\"view\">\n              </mat-form-field>\n              <div class=\"nav-params-editor\">\n                <div class=\"nav-params-header\">\n                  <span class=\"nav-params-title\">Pass to Target Page</span>\n                  <button mat-icon-button type=\"button\" (click)=\"addNavParam(i)\"\n                    [disabled]=\"!!component.isNested\" matTooltip=\"Add a param carried to the target page\">\n                    <mat-icon>add</mat-icon>\n                  </button>\n                </div>\n                @for (np of subscription.nav_params || []; track $index) {\n                <div class=\"nav-param-row\">\n                  <mat-form-field appearance=\"outline\" class=\"api-select\">\n                    <mat-label>Target State Key</mat-label>\n                    <input matInput [value]=\"np.param ?? ''\"\n                      (change)=\"updateNavParam(i, $index, 'param', $any($event.target).value)\"\n                      [disabled]=\"!!component.isNested\" placeholder=\"company_id\">\n                  </mat-form-field>\n                  <mat-form-field appearance=\"outline\" class=\"api-select\">\n                    <mat-label>Value Expression</mat-label>\n                    <input matInput [value]=\"np.value_expression ?? ''\"\n                      (change)=\"updateNavParam(i, $index, 'value_expression', $any($event.target).value)\"\n                      [disabled]=\"!!component.isNested\" placeholder=\"&#64;state.selected_id\">\n                  </mat-form-field>\n                  <mat-slide-toggle [checked]=\"np.encode === 'json'\"\n                    (change)=\"updateNavParam(i, $index, 'encode', $event.checked ? 'json' : undefined)\"\n                    [disabled]=\"!!component.isNested\"\n                    matTooltip=\"Send as JSON. Scalars are preferred — use app state for large values.\">JSON</mat-slide-toggle>\n                  <button mat-icon-button type=\"button\" (click)=\"removeNavParam(i, $index)\"\n                    [disabled]=\"!!component.isNested\">\n                    <mat-icon>delete</mat-icon>\n                  </button>\n                </div>\n                }\n                <div class=\"nav-params-hint\">\n                  Each param becomes a URL query param and seeds the same-named state variable on the\n                  target page — so it survives refresh and Back. The firing event's payload is already\n                  offered to the target by name; name a param here only to override that, or to put the\n                  value in the address.\n                </div>\n              </div>\n              }\n\n              @if (subscription.action === 'set-field') {\n              <div class=\"event-config-row\">\n                <mat-form-field appearance=\"outline\" class=\"api-select\">\n                  <mat-label>Field Name</mat-label>\n                  <mat-select [value]=\"subscription.state_key\"\n                    (valueChange)=\"updateEventSubscription(i, 'state_key', $event)\"\n                    [disabled]=\"!!component.isNested\">\n                    @for (field of availableFields(); track field.value) {\n                    <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                    }\n                  </mat-select>\n                </mat-form-field>\n                <mat-form-field appearance=\"outline\" class=\"api-select\">\n                  <mat-label>Value</mat-label>\n                  <input matInput [value]=\"subscription.value ?? ''\"\n                    (change)=\"updateEventSubscription(i, 'value', $any($event.target).value)\"\n                    [disabled]=\"!!component.isNested\" />\n                </mat-form-field>\n              </div>\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Value Expression (optional)</mat-label>\n                <textarea matInput rows=\"2\" [value]=\"subscription.value_expression ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'value_expression', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\"\n                  placeholder=\"e.g. @view == 'kanban' ? 'board' : 'table'\"></textarea>\n                <mat-hint>Overrides Value when set. Reference fields with &#64;name.</mat-hint>\n              </mat-form-field>\n              }\n\n              @if (subscription.action === 'update-property') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Target Components</mat-label>\n                <mat-select [value]=\"subscription.fieldNames || []\"\n                  (valueChange)=\"updateEventSubscription(i, 'fieldNames', $event)\" multiple\n                  [disabled]=\"!!component.isNested\">\n                  @for (comp of availableComponents(); track comp.value) {\n                  <mat-option [value]=\"comp.value\">{{ comp.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Property Name</mat-label>\n                <input matInput [value]=\"subscription.property_key ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'property_key', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\" placeholder=\"e.g. label\" />\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Property Value</mat-label>\n                <input matInput [value]=\"subscription.value ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'value', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\" />\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Value Expression (optional)</mat-label>\n                <textarea matInput rows=\"2\" [value]=\"subscription.value_expression ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'value_expression', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\"\n                  placeholder=\"e.g. @view == 'kanban' ? 'board' : 'table'\"></textarea>\n                <mat-hint>Overrides Property Value when set. Reference fields with &#64;name.</mat-hint>\n              </mat-form-field>\n              }\n\n              @if (subscription.action === 'download-file') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>File From</mat-label>\n                <mat-select [value]=\"subscription.file_source || 'response'\" (valueChange)=\"updateEventSubscription(i, 'file_source', $event)\" [disabled]=\"!!component.isNested\">\n                  <mat-option value=\"response\">API Response / Event Payload</mat-option>\n                  <mat-option value=\"state\">Page State</mat-option>\n                  <mat-option value=\"app_state\">App State (shared, survives navigation)</mat-option>\n                  <mat-option value=\"page_data\">Page Data</mat-option>\n                </mat-select>\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Base64 Path</mat-label>\n                <input matInput [value]=\"subscription.file_path ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'file_path', $any($event.target).value)\" [disabled]=\"!!component.isNested\"\n                  placeholder=\"e.g. data.file_content\">\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>File Type</mat-label>\n                <input matInput [value]=\"subscription.file_type ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'file_type', $any($event.target).value)\" [disabled]=\"!!component.isNested\"\n                  placeholder=\"pdf, xlsx or application/pdf\">\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>File Type Path (optional)</mat-label>\n                <input matInput [value]=\"subscription.file_type_path ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'file_type_path', $any($event.target).value)\" [disabled]=\"!!component.isNested\"\n                  placeholder=\"e.g. data.content_type\">\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>File Name (optional)</mat-label>\n                <input matInput [value]=\"subscription.file_name ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'file_name', $any($event.target).value)\" [disabled]=\"!!component.isNested\"\n                  placeholder=\"statement\">\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>File Name Path (optional)</mat-label>\n                <input matInput [value]=\"subscription.file_name_path ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'file_name_path', $any($event.target).value)\" [disabled]=\"!!component.isNested\"\n                  placeholder=\"e.g. data.file_name\">\n              </mat-form-field>\n              <div class=\"nav-params-hint\">\n                Saves a base64 string as a file — for an API that hands the document back as a JSON\n                attribute instead of streaming it. Put this on <strong>On Success</strong> of the Call\n                Function / Call Query that fetches it and point <strong>Base64 Path</strong> at the\n                attribute (<code>data.file_content</code>); a <code>data:&lt;mime&gt;;base64,</code>\n                prefix is stripped. <strong>File Type</strong> takes a MIME type or a bare extension and\n                supplies the extension when the name has none. The <em>Path</em> variants read the type\n                and name out of the same source and win over the fixed values.\n              </div>\n              }\n\n              @if (subscription.action === 'set-page-data') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Record From</mat-label>\n                <mat-select [value]=\"subscription.record_source || 'event'\"\n                  (valueChange)=\"updateEventSubscription(i, 'record_source', $event)\"\n                  [disabled]=\"!!component.isNested\">\n                  <mat-option value=\"event\">Event Payload (the record the event carries)</mat-option>\n                  <mat-option value=\"state\">Page State</mat-option>\n                  <mat-option value=\"app_state\">App State (shared, survives navigation)</mat-option>\n                </mat-select>\n              </mat-form-field>\n              @if ((subscription.record_source || 'event') === 'state') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>State Key</mat-label>\n                <mat-select [value]=\"subscription.state_key ?? ''\"\n                  (valueChange)=\"updateEventSubscription(i, 'state_key', $event)\"\n                  [disabled]=\"!!component.isNested\">\n                  @for (key of pageStateKeys(); track key) {\n                  <mat-option [value]=\"key\">{{ key }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n              @if (subscription.record_source === 'app_state') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>App State Key</mat-label>\n                <input matInput [value]=\"subscription.state_key ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'state_key', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\" placeholder=\"selected_program\">\n              </mat-form-field>\n              }\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Path (optional)</mat-label>\n                <input matInput [value]=\"subscription.record_path ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'record_path', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\"\n                  placeholder=\"e.g. extras.program_id\">\n              </mat-form-field>\n              <div class=\"nav-params-hint\">\n                Writes this page's record, so a later Save / Fetch / Delete on the page carries its\n                <code>entity_id</code> and edits the selected row instead of inserting a new one.\n                <strong>Event Payload</strong> takes the record the event already carries — a grid\n                <em>On Row Select</em> hands over the selected row as\n                {{ '{' }} entity_id, entity_data {{ '}' }}, so nothing else needs configuring.\n                Point it at a state variable instead when the record was parked there: one holding\n                {{ '{' }} entity_id, entity_data {{ '}' }} sets both, one holding just the id sets the\n                id and leaves the page's fields untouched. <strong>Path</strong> drills into the\n                chosen source when the value sits inside it.\n              </div>\n              }\n              @if (subscription.action === 'update-state') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Scope</mat-label>\n                <mat-select [value]=\"subscription.state_scope || 'page'\"\n                  (valueChange)=\"updateEventSubscription(i, 'state_scope', $event)\"\n                  [disabled]=\"!!component.isNested\">\n                  <mat-option value=\"page\">Page State</mat-option>\n                  <mat-option value=\"app\">App State (shared, survives navigation)</mat-option>\n                </mat-select>\n              </mat-form-field>\n              @if (subscription.state_scope === 'app') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>App State Key</mat-label>\n                <input matInput [value]=\"subscription.state_key ?? ''\"\n                  (change)=\"updateEventSubscription(i, 'state_key', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\" placeholder=\"selected_company\">\n              </mat-form-field>\n              } @else {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>State Key</mat-label>\n                <mat-select [value]=\"subscription.state_key\"\n                  (valueChange)=\"updateEventSubscription(i, 'state_key', $event)\"\n                  [disabled]=\"!!component.isNested\">\n                  @for (key of pageStateKeys(); track key) {\n                  <mat-option [value]=\"key\">{{ key }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Formula</mat-label>\n                <mat-select [value]=\"subscription.state_formula?.fn\"\n                  (valueChange)=\"updateStateFormulaFn(i, $event)\"\n                  [disabled]=\"!!component.isNested\">\n                  <mat-option value=\"set\">Set Value</mat-option>\n                  <mat-option value=\"increment\">Increment</mat-option>\n                  <mat-option value=\"decrement\">Decrement</mat-option>\n                  <mat-option value=\"toggle\">Toggle</mat-option>\n                  <mat-option value=\"reset\">Reset to Initial</mat-option>\n                  <mat-option value=\"set-from-field\">Set from Field</mat-option>\n                  <mat-option value=\"set-from-payload\">Set from Event Payload</mat-option>\n                  <mat-option value=\"expr\">Expression</mat-option>\n                </mat-select>\n              </mat-form-field>\n              @if (subscription.state_formula?.fn === 'set') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Value</mat-label>\n                <input matInput [value]=\"subscription.state_formula?.value ?? ''\"\n                  (change)=\"updateStateFormulaParam(i, 'value', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\" />\n              </mat-form-field>\n              }\n              @if (subscription.state_formula?.fn === 'increment' || subscription.state_formula?.fn === 'decrement') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>By</mat-label>\n                <input matInput type=\"number\" [value]=\"subscription.state_formula?.by ?? 1\"\n                  (change)=\"updateStateFormulaParam(i, 'by', +$any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\" />\n              </mat-form-field>\n              }\n              @if (subscription.state_formula?.fn === 'set-from-field') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Field</mat-label>\n                <mat-select [value]=\"subscription.state_formula?.field\"\n                  (valueChange)=\"updateStateFormulaParam(i, 'field', $event)\"\n                  [disabled]=\"!!component.isNested\">\n                  @for (field of stateSourceFields(); track field.value) {\n                  <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n              }\n              @if (subscription.state_formula?.fn === 'set-from-payload') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Payload Path</mat-label>\n                <input matInput [value]=\"subscription.state_formula?.payload_path ?? ''\"\n                  (change)=\"updateStateFormulaParam(i, 'payload_path', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\"\n                  placeholder=\"e.g. entity_data.foo.bar\" />\n              </mat-form-field>\n              }\n              @if (subscription.state_formula?.fn === 'expr') {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Expression</mat-label>\n                <input matInput [value]=\"subscription.state_formula?.expr ?? ''\"\n                  (change)=\"updateStateFormulaParam(i, 'expr', $any($event.target).value)\"\n                  [disabled]=\"!!component.isNested\" />\n                <mat-hint><code>&#64;state.key</code> page state · <code>&#64;app.key</code> app state · <code>&#64;page.entity_data.field</code> page data</mat-hint>\n              </mat-form-field>\n              }\n              }\n            </div>\n          </div>\n          }\n        </div>\n        } @else {\n        <div class=\"no-events\">\n          <mat-icon>event_available</mat-icon>\n          <p>No event subscriptions configured</p>\n          <p class=\"hint\">Click \"Add Event\" to create your first event subscription</p>\n        </div>\n        }\n      </div>\n    </mat-tab>\n\n    @if (isFormField()) {\n    <mat-tab label=\"Validation\">\n      <div class=\"tab-content\">\n        <div class=\"events-header\">\n          <h4>Validation Rules</h4>\n          <button mat-raised-button color=\"primary\" (click)=\"addValidationRule()\" class=\"add-event-btn\">\n            Add Rule\n          </button>\n        </div>\n\n        @if (validationRules().length > 0) {\n        <div class=\"events-list\">\n          @for (rule of validationRules(); track $index; let i = $index) {\n          <div class=\"event-card\">\n            <div class=\"event-header\">\n              <mat-form-field appearance=\"outline\" class=\"event-select\">\n                <mat-label>Rule Type</mat-label>\n                <mat-select [value]=\"rule.type\" (valueChange)=\"updateValidationRule(i, 'type', $event)\">\n                  <mat-option value=\"required\">Required</mat-option>\n                  <mat-option value=\"min\">Min Value</mat-option>\n                  <mat-option value=\"max\">Max Value</mat-option>\n                  <mat-option value=\"minLength\">Min Length</mat-option>\n                  <mat-option value=\"maxLength\">Max Length</mat-option>\n                  <mat-option value=\"pattern\">Pattern (Regex)</mat-option>\n                  <mat-option value=\"email\">Email</mat-option>\n                  <mat-option value=\"custom\">Custom</mat-option>\n                </mat-select>\n              </mat-form-field>\n              <button mat-icon-button color=\"warn\" (click)=\"removeValidationRule(i)\" class=\"remove-btn\"\n                title=\"Remove Rule\">\n                <mat-icon>delete</mat-icon>\n              </button>\n            </div>\n\n            <div class=\"event-config\">\n              @if (needsValue(rule.type)) {\n              <mat-form-field appearance=\"outline\" class=\"action-select\">\n                <mat-label>Value</mat-label>\n                <input matInput type=\"text\" [value]=\"rule.value || ''\"\n                  (input)=\"updateValidationRule(i, 'value', $any($event.target).value)\"\n                  [placeholder]=\"rule.type === 'pattern' ? 'Regex pattern' : 'Enter value'\">\n              </mat-form-field>\n              }\n\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Error Message</mat-label>\n                <input matInput type=\"text\" [value]=\"rule.message || ''\"\n                  (input)=\"updateValidationRule(i, 'message', $any($event.target).value)\"\n                  placeholder=\"Enter error message\">\n              </mat-form-field>\n            </div>\n          </div>\n          }\n        </div>\n        } @else {\n        <div class=\"no-events\">\n          <mat-icon>verified</mat-icon>\n          <p>No validation rules configured</p>\n          <p class=\"hint\">Click \"Add Rule\" to create your first validation rule</p>\n        </div>\n        }\n      </div>\n    </mat-tab>\n    }\n\n  </mat-tab-group>\n  } @else {\n  @if (currentPage(); as page) {\n  <div class=\"component-header\">\n    <div class=\"component-info\">\n      <h3>Page Properties</h3>\n      <div class=\"component-meta\">\n        <span class=\"component-id-row\">\n          <span class=\"component-id\">{{ page.id }}</span>\n          <button type=\"button\" class=\"copy-id-btn\" (click)=\"copyId(page.id)\"\n            [title]=\"copiedId() === page.id ? 'Copied!' : 'Copy ID'\">\n            <mat-icon>{{ copiedId() === page.id ? 'check' : 'content_copy' }}</mat-icon>\n          </button>\n        </span>\n      </div>\n      <mat-chip-set class=\"breakpoint-indicator\">\n        <mat-chip>\n          <mat-icon>devices</mat-icon>\n          Editing: {{ currentBreakpoint() | uppercase }}\n        </mat-chip>\n      </mat-chip-set>\n    </div>\n  </div>\n\n  <mat-tab-group class=\"properties-tab-group\">\n    <mat-tab label=\"Page\">\n      <div class=\"tab-content\">\n        <div class=\"property-group\">\n          <h4>Page Information</h4>\n          <div class=\"property-grid\">\n            <div class=\"property-item width-full\">\n              <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                <mat-label>Name</mat-label>\n                <input matInput type=\"text\" [value]=\"page.name\" (input)=\"updatePageName($any($event.target).value)\">\n              </mat-form-field>\n            </div>\n            <div class=\"property-item width-full\">\n              <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                <mat-label>Title</mat-label>\n                <input matInput type=\"text\" [value]=\"page.title || ''\"\n                  (input)=\"updatePageTitle($any($event.target).value)\">\n              </mat-form-field>\n            </div>\n            <div class=\"property-item width-full\">\n              <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                <mat-label>Entity</mat-label>\n                <input matInput [value]=\"entityInputControl()\"\n                  (input)=\"updatePageEntityInput($any($event.target).value)\" (blur)=\"onEntityInputBlur()\"\n                  [matAutocomplete]=\"entityAuto\" placeholder=\"Type to search or add new entity\">\n                <mat-autocomplete #entityAuto=\"matAutocomplete\"\n                  (optionSelected)=\"onEntityOptionSelected($event.option.value)\">\n                  @if (filteredEntities().length > 0) {\n                  @for (entity of filteredEntities(); track entity.name) {\n                  <mat-option [value]=\"entity.name || ''\">\n                    {{ entity.display_name || entity.name }}\n                  </mat-option>\n                  }\n                  } @else if (entityInputControl().trim()) {\n                  <mat-option [value]=\"entityInputControl()\">\n                    Add \"{{ entityInputControl() }}\"\n                  </mat-option>\n                  }\n                </mat-autocomplete>\n                <mat-hint>Select an existing entity or type to add a new one</mat-hint>\n              </mat-form-field>\n            </div>\n          </div>\n        </div>\n\n        <!-- Seed this page's data from a state variable when it is opened on\n             its own. Inside a page_ref the mount point supplies the data, so\n             these settings are ignored there. -->\n        <div class=\"property-group\">\n          <h4>Data Source</h4>\n          <div class=\"property-grid\">\n            <div class=\"property-item width-full\">\n              <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                <mat-label>Data Source</mat-label>\n                <mat-select [value]=\"page.data_source || 'none'\"\n                  (valueChange)=\"updatePageDataSource($event)\">\n                  <mat-option value=\"none\">None</mat-option>\n                  <mat-option value=\"state\">State variable</mat-option>\n                </mat-select>\n                <mat-hint>Used when this page is opened directly (navigate-to-page, deep link).\n                  A page_ref that mounts this page supplies the data itself.</mat-hint>\n              </mat-form-field>\n            </div>\n\n            @if (page.data_source === 'state') {\n            <div class=\"property-item width-full\">\n              <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                <mat-label>Scope</mat-label>\n                <mat-select [value]=\"page.state_scope || 'page'\"\n                  (valueChange)=\"updatePageStateScope($event)\">\n                  <mat-option value=\"page\">Page State</mat-option>\n                  <mat-option value=\"app\">App State (survives navigation)</mat-option>\n                </mat-select>\n              </mat-form-field>\n            </div>\n\n            <div class=\"property-item width-full\">\n              <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                <mat-label>State Variable</mat-label>\n                <input matInput [value]=\"page.state_field || ''\"\n                  (change)=\"updatePageStateField($any($event.target).value)\"\n                  [matAutocomplete]=\"stateFieldAuto\" placeholder=\"e.g. selected_cp\">\n                <mat-autocomplete #stateFieldAuto=\"matAutocomplete\"\n                  (optionSelected)=\"updatePageStateField($event.option.value)\">\n                  @for (key of (page.state_scope === 'app' ? appStateKeyOptions() : pageStateVarOptions()); track key) {\n                  <mat-option [value]=\"key\">{{ key }}</mat-option>\n                  }\n                </mat-autocomplete>\n                <mat-hint>Its value becomes this page's data — fields bind to it as Page Data Field.</mat-hint>\n              </mat-form-field>\n            </div>\n\n            <div class=\"property-item width-full\">\n              <mat-form-field appearance=\"outline\" class=\"eru-full-width\">\n                <mat-label>State Path</mat-label>\n                <input matInput [value]=\"page.state_result_path || ''\"\n                  (change)=\"updatePageStateResultPath($any($event.target).value)\"\n                  placeholder=\"e.g. data.0\">\n                <mat-hint>Optional dotted path into the value before it is used.</mat-hint>\n              </mat-form-field>\n            </div>\n            }\n          </div>\n        </div>\n      </div>\n    </mat-tab>\n\n    <mat-tab label=\"Page Events\">\n      <div class=\"tab-content\">\n        <div class=\"property-group\">\n          <div class=\"property-group-header\">\n            <h4>Event Handlers</h4>\n            <button mat-icon-button (click)=\"addPageEventSubscription()\" title=\"Add page event handler\">\n              <mat-icon>add</mat-icon>\n            </button>\n          </div>\n          @for (subscription of pageEventSubscriptions(); track subscription.id + '_' + $index; let i = $index) {\n          <div class=\"event-subscription-card\">\n            <div class=\"event-config-row\">\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Event</mat-label>\n                <mat-select [value]=\"isPredefinedPageEvent(subscription.event) ? subscription.event : '__custom__'\"\n                  (valueChange)=\"onPageEventTypeChange(i, $event)\">\n                  @for (evt of pageLifecycleEvents; track evt.value) {\n                  <mat-option [value]=\"evt.value\">{{ evt.label }}</mat-option>\n                  }\n                  <mat-option value=\"__custom__\">Custom Signal…</mat-option>\n                </mat-select>\n              </mat-form-field>\n              @if (!isPredefinedPageEvent(subscription.event)) {\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Signal Name</mat-label>\n                <input matInput [value]=\"subscription.event\"\n                  (change)=\"updatePageEventSubscription(i, 'event', $any($event.target).value)\">\n              </mat-form-field>\n              }\n              <mat-form-field appearance=\"outline\" class=\"api-select\">\n                <mat-label>Action</mat-label>\n                <mat-select [value]=\"subscription.action\"\n                  (valueChange)=\"updatePageEventSubscription(i, 'action', $event)\">\n                  <mat-option value=\"call-function\">Call Function</mat-option>\n                  <mat-option value=\"call-query\">Call Query</mat-option>\n                  <mat-option value=\"fetch-page-data\">Fetch Page Data</mat-option>\n                  <mat-option value=\"update-state\">Update State</mat-option>\n                  <mat-option value=\"refresh-grid\">Refresh Grid</mat-option>\n                  <mat-option value=\"download-grid\">Download Grid</mat-option>\n                  <mat-option value=\"refresh-page-ref\">Refresh Page Ref</mat-option>\n                  <mat-option value=\"set-active-tab\">Set Active Tab</mat-option>\n                  <mat-option value=\"toggle-side-panel\">Toggle Side Panel</mat-option>\n                  <mat-option value=\"open-side-panel\">Open Side Panel</mat-option>\n                  <mat-option value=\"close-side-panel\">Close Side Panel</mat-option>\n                  <mat-option value=\"hide-component\">Hide Component</mat-option>\n                  <mat-option value=\"show-component\">Show Component</mat-option>\n                  <mat-option value=\"start-loading\">Start Loading</mat-option>\n                  <mat-option value=\"stop-loading\">Stop Loading</mat-option>\n                  <mat-option value=\"enable-component\">Enable Component</mat-option>\n                  <mat-option value=\"disable-component\">Disable Component</mat-option>\n                  <mat-option value=\"hide-fields\">Hide Fields</mat-option>\n                  <mat-option value=\"unhide-fields\">Unhide Fields</mat-option>\n                  <mat-option value=\"start-timer\">Start Timer</mat-option>\n                  <mat-option value=\"stop-timer\">Stop Timer</mat-option>\n                  <mat-option value=\"step-forward\">Step Forward</mat-option>\n                  <mat-option value=\"step-back\">Step Back</mat-option>\n                  <mat-option value=\"navigate-to-page\">Navigate to Page</mat-option>\n                  <mat-option value=\"set-page-data\">Set Page Data</mat-option>\n                  <mat-option value=\"clear-page-data\">Clear Page Data</mat-option>\n                  <mat-option value=\"clear-all-page-data\">Clear All Page Data</mat-option>\n                  <mat-option value=\"download-file\">Download File</mat-option>\n                </mat-select>\n              </mat-form-field>\n              <button mat-icon-button (click)=\"removePageEventSubscription(i)\" class=\"remove-action-btn\">\n                <mat-icon>close</mat-icon>\n              </button>\n            </div>\n            @if (subscription.action !== 'no-action') {\n            <div class=\"boolean-control\">\n              <mat-slide-toggle [checked]=\"!!subscription.validate_before_action\"\n                (change)=\"updatePageEventSubscription(i, 'validate_before_action', $event.checked)\">\n                Validate Before Action\n              </mat-slide-toggle>\n            </div>\n            @if (subscription.validate_before_action) {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Required Payload Fields (entity_id always required)</mat-label>\n              <mat-select [value]=\"subscription.validate_field_names || []\"\n                (valueChange)=\"updatePageEventSubscription(i, 'validate_field_names', $event)\" multiple>\n                @for (field of availableFields(); track field.value) {\n                <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            }\n            }\n            @if (subscription.action === 'fetch-page-data') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>API Name</mat-label>\n              <mat-select [value]=\"subscription.apiName\"\n                (valueChange)=\"updatePageEventSubscription(i, 'apiName', $event)\">\n                @for (api of availableApis(); track api.value) {\n                <mat-option [value]=\"api.value\">{{ api.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            }\n            @if (subscription.action === 'call-function') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Function Name</mat-label>\n              <input matInput [value]=\"subscription.function_name || ''\" [matAutocomplete]=\"pageFunctionAuto\"\n                (input)=\"updatePageEventSubscription(i, 'function_name', $any($event.target).value)\"\n                (change)=\"updatePageEventSubscription(i, 'function_name', $any($event.target).value)\"\n                placeholder=\"Select or type a function name\">\n              <mat-autocomplete #pageFunctionAuto=\"matAutocomplete\"\n                (optionSelected)=\"updatePageEventSubscription(i, 'function_name', $event.option.value)\">\n                @for (fn of filteredFunctions(subscription.function_name); track fn.value) {\n                <mat-option [value]=\"fn.value\">{{ fn.label }}</mat-option>\n                }\n                @if (isNewFunctionName(subscription.function_name)) {\n                <mat-option [value]=\"subscription.function_name\">Add \"{{ subscription.function_name }}\"</mat-option>\n                }\n              </mat-autocomplete>\n            </mat-form-field>\n            <eru-payload-fields-picker label=\"Function Payload Fields\"\n              [value]=\"subscription.api_payload_fields || []\" [options]=\"availablePayloadFields()\"\n              (valueChange)=\"updatePageEventSubscription(i, 'api_payload_fields', $event)\" />\n            }\n            @if (subscription.action === 'call-query') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Query Name</mat-label>\n              <input matInput [value]=\"subscription.query_name || ''\" [matAutocomplete]=\"pageQueryAuto\"\n                (input)=\"updatePageEventSubscription(i, 'query_name', $any($event.target).value)\"\n                (change)=\"updatePageEventSubscription(i, 'query_name', $any($event.target).value)\"\n                placeholder=\"Select or type a query name\">\n              <mat-autocomplete #pageQueryAuto=\"matAutocomplete\"\n                (optionSelected)=\"updatePageEventSubscription(i, 'query_name', $event.option.value)\">\n                @for (q of filteredQueries(subscription.query_name); track q.value) {\n                <mat-option [value]=\"q.value\">{{ q.label }}</mat-option>\n                }\n                @if (isNewQueryName(subscription.query_name)) {\n                <mat-option [value]=\"subscription.query_name\">Add \"{{ subscription.query_name }}\"</mat-option>\n                }\n              </mat-autocomplete>\n            </mat-form-field>\n            <eru-payload-fields-picker label=\"Query Payload Fields\"\n              [value]=\"subscription.api_payload_fields || []\" [options]=\"availablePayloadFields()\"\n              (valueChange)=\"updatePageEventSubscription(i, 'api_payload_fields', $event)\" />\n            }\n            @if (subscription.action === 'call-function' || subscription.action === 'call-query' || subscription.action === 'fetch-page-data') {\n            <div class=\"error-config-section\" style=\"display:flex;flex-direction:column;gap:4px;margin-bottom:8px;\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Error Field (response key)</mat-label>\n                <input matInput [value]=\"subscription.error_field ?? ''\"\n                  (change)=\"updatePageEventSubscription(i, 'error_field', $any($event.target).value)\" />\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Error State Key (page state)</mat-label>\n                <input matInput [value]=\"subscription.error_state_key ?? ''\"\n                  (change)=\"updatePageEventSubscription(i, 'error_state_key', $any($event.target).value)\" />\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Success Message (notification)</mat-label>\n                <input matInput [value]=\"subscription.success_message ?? ''\"\n                  (change)=\"updatePageEventSubscription(i, 'success_message', $any($event.target).value)\"\n                  placeholder=\"Leave blank for no notification\" />\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Error Message (notification)</mat-label>\n                <input matInput [value]=\"subscription.error_message ?? ''\"\n                  (change)=\"updatePageEventSubscription(i, 'error_message', $any($event.target).value)\"\n                  placeholder=\"Leave blank for no notification\" />\n              </mat-form-field>\n            </div>\n\n            <div class=\"on-success-section\">\n              <div class=\"on-success-header\">\n                <span class=\"on-success-label\">On Success</span>\n                <button mat-icon-button (click)=\"addPageOnSuccessAction(i)\" class=\"add-action-btn\" title=\"Add action\">\n                  <mat-icon>add</mat-icon>\n                </button>\n              </div>\n              @for (action of subscription.on_success || []; track $index; let j = $index) {\n                <div class=\"on-success-action\">\n                  <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                    <mat-select [value]=\"action.action\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'action', $event)\">\n                      <mat-option value=\"hide-fields\">Hide Fields</mat-option>\n                      <mat-option value=\"unhide-fields\">Unhide Fields</mat-option>\n                      <mat-option value=\"disable-field\">Disable Field</mat-option>\n                      <mat-option value=\"enable-field\">Enable Field</mat-option>\n                      <mat-option value=\"set-field\">Update Value</mat-option>\n                      <mat-option value=\"update-state\">Update State</mat-option>\n                      <mat-option value=\"hide-component\">Hide Component</mat-option>\n                      <mat-option value=\"show-component\">Show Component</mat-option>\n                      <mat-option value=\"enable-component\">Enable Component</mat-option>\n                      <mat-option value=\"disable-component\">Disable Component</mat-option>\n                      <mat-option value=\"start-timer\">Start Timer</mat-option>\n                      <mat-option value=\"stop-timer\">Stop Timer</mat-option>\n                      <mat-option value=\"stop-loading\">Stop Loading</mat-option>\n                      <mat-option value=\"call-function\">Call Function</mat-option>\n                      <mat-option value=\"call-query\">Call Query</mat-option>\n                      <mat-option value=\"refresh-grid\">Refresh Grid</mat-option>\n                      <mat-option value=\"download-grid\">Download Grid</mat-option>\n                      <mat-option value=\"refresh-page-ref\">Refresh Page Ref</mat-option>\n                      <mat-option value=\"set-active-tab\">Set Active Tab</mat-option>\n                      <mat-option value=\"toggle-side-panel\">Toggle Side Panel</mat-option>\n                      <mat-option value=\"open-side-panel\">Open Side Panel</mat-option>\n                      <mat-option value=\"close-side-panel\">Close Side Panel</mat-option>\n                      <mat-option value=\"emit-to-parent\">Emit to Parent</mat-option>\n                      <mat-option value=\"navigate-to-page\">Navigate to Page</mat-option>\n                      <mat-option value=\"set-page-data\">Set Page Data</mat-option>\n                      <mat-option value=\"clear-page-data\">Clear Page Data</mat-option>\n                      <mat-option value=\"clear-all-page-data\">Clear All Page Data</mat-option>\n                      <mat-option value=\"download-file\">Download File</mat-option>\n                    </mat-select>\n                  </mat-form-field>\n                  @if (action.action === 'navigate-to-page') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.page_id\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'page_id', $event)\">\n                        @for (page of availablePages(); track page.value) {\n                          <mat-option [value]=\"page.value\">{{ page.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'hide-fields' || action.action === 'unhide-fields' || action.action === 'disable-field' || action.action === 'enable-field') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (field of availableFields(); track field.value) {\n                          <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'hide-component' || action.action === 'show-component' || action.action === 'enable-component' || action.action === 'disable-component' || action.action === 'start-timer' || action.action === 'stop-timer' || action.action === 'stop-loading') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (comp of availableComponents(); track comp.value) {\n                          <mat-option [value]=\"comp.value\">{{ comp.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'refresh-grid' || action.action === 'download-grid') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (grid of availableGrids(); track grid.value) {\n                          <mat-option [value]=\"grid.value\">{{ grid.label }}</mat-option>\n                        }\n                        </mat-select>\n                        </mat-form-field>\n                        }\n                        @if (action.action === 'refresh-page-ref') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (ref of availablePageRefs(); track ref.value) {\n                          <mat-option [value]=\"ref.value\">{{ ref.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'set-active-tab') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>Target Tabs</mat-label>\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (t of availableTabGroups(); track t.value) {\n                          <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>Tab</mat-label>\n                      <input matInput [value]=\"action.value ?? ''\" [matAutocomplete]=\"tabNameAuto\"\n                        (input)=\"updatePageOnSuccessAction(i, j, 'value', $any($event.target).value)\"\n                        (change)=\"updatePageOnSuccessAction(i, j, 'value', $any($event.target).value)\"\n                        placeholder=\"Tab title or index\">\n                      <mat-autocomplete #tabNameAuto=\"matAutocomplete\"\n                        (optionSelected)=\"updatePageOnSuccessAction(i, j, 'value', $event.option.value)\">\n                        @for (t of availableTabNames(); track t.value) {\n                          <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                        }\n                      </mat-autocomplete>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'toggle-side-panel' || action.action === 'open-side-panel' || action.action === 'close-side-panel') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (panel of availableSidePanels(); track panel.value) {\n                          <mat-option [value]=\"panel.value\">{{ panel.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'download-file') {\n                    <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>File From</mat-label>\n                        <mat-select [value]=\"action.file_source || 'response'\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'file_source', $event)\">\n                          <mat-option value=\"response\">API Response / Event Payload</mat-option>\n                          <mat-option value=\"state\">Page State</mat-option>\n                          <mat-option value=\"app_state\">App State (shared, survives navigation)</mat-option>\n                          <mat-option value=\"page_data\">Page Data</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Base64 Path</mat-label>\n                        <input matInput [value]=\"action.file_path ?? ''\" (change)=\"updatePageOnSuccessAction(i, j, 'file_path', $any($event.target).value)\" placeholder=\"e.g. data.file_content\" />\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>File Type</mat-label>\n                        <input matInput [value]=\"action.file_type ?? ''\" (change)=\"updatePageOnSuccessAction(i, j, 'file_type', $any($event.target).value)\" placeholder=\"pdf, xlsx or application/pdf\" />\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>File Type Path (optional)</mat-label>\n                        <input matInput [value]=\"action.file_type_path ?? ''\" (change)=\"updatePageOnSuccessAction(i, j, 'file_type_path', $any($event.target).value)\" placeholder=\"e.g. data.content_type\" />\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>File Name (optional)</mat-label>\n                        <input matInput [value]=\"action.file_name ?? ''\" (change)=\"updatePageOnSuccessAction(i, j, 'file_name', $any($event.target).value)\" placeholder=\"statement\" />\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>File Name Path (optional)</mat-label>\n                        <input matInput [value]=\"action.file_name_path ?? ''\" (change)=\"updatePageOnSuccessAction(i, j, 'file_name_path', $any($event.target).value)\" placeholder=\"e.g. data.file_name\" />\n                      </mat-form-field>\n                    </div>\n                  }\n                  @if (action.action === 'emit-to-parent') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updatePageOnSuccessAction(i, j, 'state_key', $any($event.target).value)\" placeholder=\"Signal Name\" />\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'set-field') {\n                    <div class=\"event-config-row\">\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.state_key\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'state_key', $event)\">\n                          @for (field of availableFields(); track field.value) {\n                            <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <input matInput [value]=\"action.value ?? ''\" (change)=\"updatePageOnSuccessAction(i, j, 'value', $any($event.target).value)\" placeholder=\"Value\" />\n                      </mat-form-field>\n                    </div>\n                  }\n                  @if (action.action === 'call-function') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <input matInput [value]=\"action.function_name || ''\" [matAutocomplete]=\"pageSuccessFunctionAuto\"\n                        (input)=\"updatePageOnSuccessAction(i, j, 'function_name', $any($event.target).value)\"\n                        (change)=\"updatePageOnSuccessAction(i, j, 'function_name', $any($event.target).value)\"\n                        placeholder=\"Function Name\">\n                      <mat-autocomplete #pageSuccessFunctionAuto=\"matAutocomplete\"\n                        (optionSelected)=\"updatePageOnSuccessAction(i, j, 'function_name', $event.option.value)\">\n                        @for (fn of filteredFunctions(action.function_name); track fn.value) {\n                          <mat-option [value]=\"fn.value\">{{ fn.label }}</mat-option>\n                        }\n                        @if (isNewFunctionName(action.function_name)) {\n                          <mat-option [value]=\"action.function_name\">Add \"{{ action.function_name }}\"</mat-option>\n                        }\n                      </mat-autocomplete>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'call-query') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <input matInput [value]=\"action.query_name || ''\" [matAutocomplete]=\"pageSuccessQueryAuto\"\n                        (input)=\"updatePageOnSuccessAction(i, j, 'query_name', $any($event.target).value)\"\n                        (change)=\"updatePageOnSuccessAction(i, j, 'query_name', $any($event.target).value)\"\n                        placeholder=\"Query Name\">\n                      <mat-autocomplete #pageSuccessQueryAuto=\"matAutocomplete\"\n                        (optionSelected)=\"updatePageOnSuccessAction(i, j, 'query_name', $event.option.value)\">\n                        @for (q of filteredQueries(action.query_name); track q.value) {\n                          <mat-option [value]=\"q.value\">{{ q.label }}</mat-option>\n                        }\n                        @if (isNewQueryName(action.query_name)) {\n                          <mat-option [value]=\"action.query_name\">Add \"{{ action.query_name }}\"</mat-option>\n                        }\n                      </mat-autocomplete>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'call-function' || action.action === 'call-query') {\n                    <eru-payload-fields-picker class=\"action-select-sm\" placeholder=\"Payload Fields\"\n                      [value]=\"action.api_payload_fields || []\" [options]=\"availablePayloadFields()\"\n                      (valueChange)=\"updatePageOnSuccessAction(i, j, 'api_payload_fields', $event)\" />\n                  }\n                  @if (action.action === 'update-state') {\n                    <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Scope</mat-label>\n                        <mat-select [value]=\"action.state_scope || 'page'\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'state_scope', $event)\">\n                          <mat-option value=\"page\">Page State</mat-option>\n                          <mat-option value=\"app\">App State (shared, survives navigation)</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n                      @if (action.state_scope === 'app') {\n                      <!-- Typed, not picked: app state has no declarations to\n                           list — a key exists only because an action wrote it. -->\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>App State Key</mat-label>\n                        <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updatePageOnSuccessAction(i, j, 'state_key', $any($event.target).value)\" placeholder=\"selected_invoice\" />\n                      </mat-form-field>\n                      } @else {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>State Key</mat-label>\n                        <mat-select [value]=\"action.state_key\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'state_key', $event)\">\n                          @for (key of pageStateKeys(); track key) {\n                            <mat-option [value]=\"key\">{{ key }}</mat-option>\n                          }\n                        </mat-select>\n                        @if (pageStateKeys().length === 0) {\n                        <mat-hint>This page declares no state variables — add one in the Page State panel first.</mat-hint>\n                        }\n                      </mat-form-field>\n                      }\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Formula</mat-label>\n                        <mat-select [value]=\"action.state_formula?.fn\" (valueChange)=\"updatePageNestedStateFormulaFn(i, j, 'on_success', $event)\">\n                          <mat-option value=\"set\">Set Value</mat-option>\n                          <mat-option value=\"increment\">Increment</mat-option>\n                          <mat-option value=\"decrement\">Decrement</mat-option>\n                          <mat-option value=\"toggle\">Toggle</mat-option>\n                          <mat-option value=\"reset\">Reset to Initial</mat-option>\n                          <mat-option value=\"set-from-field\">Set from Field</mat-option>\n                          <mat-option value=\"set-from-payload\">Set from Event Payload</mat-option>\n                          <mat-option value=\"expr\">Expression</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n                      @if (action.state_formula?.fn === 'set') {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Value</mat-label>\n                          <input matInput [value]=\"action.state_formula?.value ?? ''\" (change)=\"updatePageNestedStateFormulaParam(i, j, 'on_success', 'value', $any($event.target).value)\" />\n                        </mat-form-field>\n                      }\n                      @if (action.state_formula?.fn === 'increment' || action.state_formula?.fn === 'decrement') {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>By</mat-label>\n                          <input matInput type=\"number\" [value]=\"action.state_formula?.by ?? 1\" (change)=\"updatePageNestedStateFormulaParam(i, j, 'on_success', 'by', +$any($event.target).value)\" />\n                        </mat-form-field>\n                      }\n                      @if (action.state_formula?.fn === 'set-from-field') {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Field</mat-label>\n                          <mat-select [value]=\"action.state_formula?.field\" (valueChange)=\"updatePageNestedStateFormulaParam(i, j, 'on_success', 'field', $event)\">\n                            @for (field of stateSourceFields(); track field.value) {\n                              <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                            }\n                          </mat-select>\n                        </mat-form-field>\n                      }\n                      @if (action.state_formula?.fn === 'set-from-payload') {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Payload Path</mat-label>\n                          <input matInput [value]=\"action.state_formula?.payload_path ?? ''\" (change)=\"updatePageNestedStateFormulaParam(i, j, 'on_success', 'payload_path', $any($event.target).value)\" placeholder=\"e.g. entity_data.foo\" />\n                        </mat-form-field>\n                      }\n                      @if (action.state_formula?.fn === 'expr') {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Expression</mat-label>\n                          <input matInput [value]=\"action.state_formula?.expr ?? ''\" (change)=\"updatePageNestedStateFormulaParam(i, j, 'on_success', 'expr', $any($event.target).value)\" />\n                          <mat-hint><code>&#64;state.key</code> page state · <code>&#64;app.key</code> app state · <code>&#64;page.entity_data.field</code> page data</mat-hint>\n                        </mat-form-field>\n                      }\n                    </div>\n                  }\n                  @if (action.action === 'set-page-data') {\n                  <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>Record From</mat-label>\n                      <mat-select [value]=\"action.record_source || 'event'\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'record_source', $event)\">\n                        <mat-option value=\"event\">API Response / Event Payload</mat-option>\n                        <mat-option value=\"state\">Page State</mat-option>\n                        <mat-option value=\"app_state\">App State (shared, survives navigation)</mat-option>\n                      </mat-select>\n                    </mat-form-field>\n                    @if ((action.record_source || 'event') === 'state') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>State Key</mat-label>\n                      <mat-select [value]=\"action.state_key ?? ''\" (valueChange)=\"updatePageOnSuccessAction(i, j, 'state_key', $event)\">\n                        @for (key of pageStateKeys(); track key) {\n                        <mat-option [value]=\"key\">{{ key }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                    }\n                    @if (action.record_source === 'app_state') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>App State Key</mat-label>\n                      <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updatePageOnSuccessAction(i, j, 'state_key', $any($event.target).value)\" placeholder=\"selected_program\" />\n                    </mat-form-field>\n                    }\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>Path (optional)</mat-label>\n                      <input matInput [value]=\"action.record_path ?? ''\" (change)=\"updatePageOnSuccessAction(i, j, 'record_path', $any($event.target).value)\" placeholder=\"e.g. get_txn.0\" />\n                    </mat-form-field>\n                    <div class=\"nav-params-hint\">\n                      Writes this page's record from the call's response. <strong>Path</strong> drills into it — a query\n                      answering {{ '{' }} get_txn: [ ... ] {{ '}' }} needs <code>get_txn.0</code> to reach the row; without one the\n                      whole response is written and the page's fields stay empty. A row of\n                      {{ '{' }} entity_id, entity_data {{ '}' }} sets both; any other object becomes the page's fields.\n                    </div>\n                  </div>\n                  }\n                  <button mat-icon-button (click)=\"removePageOnSuccessAction(i, j)\" class=\"remove-action-btn\">\n                    <mat-icon>close</mat-icon>\n                  </button>\n                </div>\n              }\n            </div>\n\n            <div class=\"on-success-section on-error-section\">\n              <div class=\"on-success-header\">\n                <span class=\"on-success-label on-error-label\">On Error</span>\n                <button mat-icon-button (click)=\"addPageOnErrorAction(i)\" class=\"add-action-btn\" title=\"Add error action\">\n                  <mat-icon>add</mat-icon>\n                </button>\n              </div>\n              @for (action of subscription.on_error || []; track $index; let j = $index) {\n                <div class=\"on-success-action\">\n                  <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                    <mat-select [value]=\"action.action\" (valueChange)=\"updatePageOnErrorAction(i, j, 'action', $event)\">\n                      <mat-option value=\"hide-fields\">Hide Fields</mat-option>\n                      <mat-option value=\"unhide-fields\">Unhide Fields</mat-option>\n                      <mat-option value=\"disable-field\">Disable Field</mat-option>\n                      <mat-option value=\"enable-field\">Enable Field</mat-option>\n                      <mat-option value=\"set-field\">Update Value</mat-option>\n                      <mat-option value=\"update-state\">Update State</mat-option>\n                      <mat-option value=\"hide-component\">Hide Component</mat-option>\n                      <mat-option value=\"show-component\">Show Component</mat-option>\n                      <mat-option value=\"enable-component\">Enable Component</mat-option>\n                      <mat-option value=\"disable-component\">Disable Component</mat-option>\n                      <mat-option value=\"stop-loading\">Stop Loading</mat-option>\n                      <mat-option value=\"call-function\">Call Function</mat-option>\n                      <mat-option value=\"call-query\">Call Query</mat-option>\n                      <mat-option value=\"refresh-grid\">Refresh Grid</mat-option>\n                      <mat-option value=\"download-grid\">Download Grid</mat-option>\n                      <mat-option value=\"refresh-page-ref\">Refresh Page Ref</mat-option>\n                      <mat-option value=\"set-active-tab\">Set Active Tab</mat-option>\n                      <mat-option value=\"toggle-side-panel\">Toggle Side Panel</mat-option>\n                      <mat-option value=\"open-side-panel\">Open Side Panel</mat-option>\n                      <mat-option value=\"close-side-panel\">Close Side Panel</mat-option>\n                      <mat-option value=\"emit-to-parent\">Emit to Parent</mat-option>\n                      <mat-option value=\"navigate-to-page\">Navigate to Page</mat-option>\n                      <mat-option value=\"set-page-data\">Set Page Data</mat-option>\n                      <mat-option value=\"clear-page-data\">Clear Page Data</mat-option>\n                      <mat-option value=\"clear-all-page-data\">Clear All Page Data</mat-option>\n                      <mat-option value=\"download-file\">Download File</mat-option>\n                    </mat-select>\n                  </mat-form-field>\n                  @if (action.action === 'navigate-to-page') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.page_id\" (valueChange)=\"updatePageOnErrorAction(i, j, 'page_id', $event)\">\n                        @for (page of availablePages(); track page.value) {\n                          <mat-option [value]=\"page.value\">{{ page.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'hide-fields' || action.action === 'unhide-fields' || action.action === 'disable-field' || action.action === 'enable-field') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnErrorAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (field of availableFields(); track field.value) {\n                          <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'hide-component' || action.action === 'show-component' || action.action === 'enable-component' || action.action === 'disable-component' || action.action === 'stop-loading') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnErrorAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (comp of availableComponents(); track comp.value) {\n                          <mat-option [value]=\"comp.value\">{{ comp.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'refresh-grid' || action.action === 'download-grid') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnErrorAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (grid of availableGrids(); track grid.value) {\n                          <mat-option [value]=\"grid.value\">{{ grid.label }}</mat-option>\n                        }\n                        </mat-select>\n                        </mat-form-field>\n                        }\n                        @if (action.action === 'refresh-page-ref') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnErrorAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (ref of availablePageRefs(); track ref.value) {\n                          <mat-option [value]=\"ref.value\">{{ ref.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'set-active-tab') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>Target Tabs</mat-label>\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnErrorAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (t of availableTabGroups(); track t.value) {\n                          <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>Tab</mat-label>\n                      <input matInput [value]=\"action.value ?? ''\" [matAutocomplete]=\"tabNameAuto\"\n                        (input)=\"updatePageOnErrorAction(i, j, 'value', $any($event.target).value)\"\n                        (change)=\"updatePageOnErrorAction(i, j, 'value', $any($event.target).value)\"\n                        placeholder=\"Tab title or index\">\n                      <mat-autocomplete #tabNameAuto=\"matAutocomplete\"\n                        (optionSelected)=\"updatePageOnErrorAction(i, j, 'value', $event.option.value)\">\n                        @for (t of availableTabNames(); track t.value) {\n                          <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                        }\n                      </mat-autocomplete>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'toggle-side-panel' || action.action === 'open-side-panel' || action.action === 'close-side-panel') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-select [value]=\"action.fieldNames || []\" (valueChange)=\"updatePageOnErrorAction(i, j, 'fieldNames', $event)\" multiple>\n                        @for (panel of availableSidePanels(); track panel.value) {\n                          <mat-option [value]=\"panel.value\">{{ panel.label }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'download-file') {\n                    <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>File From</mat-label>\n                        <mat-select [value]=\"action.file_source || 'response'\" (valueChange)=\"updatePageOnErrorAction(i, j, 'file_source', $event)\">\n                          <mat-option value=\"response\">API Response / Event Payload</mat-option>\n                          <mat-option value=\"state\">Page State</mat-option>\n                          <mat-option value=\"app_state\">App State (shared, survives navigation)</mat-option>\n                          <mat-option value=\"page_data\">Page Data</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Base64 Path</mat-label>\n                        <input matInput [value]=\"action.file_path ?? ''\" (change)=\"updatePageOnErrorAction(i, j, 'file_path', $any($event.target).value)\" placeholder=\"e.g. data.file_content\" />\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>File Type</mat-label>\n                        <input matInput [value]=\"action.file_type ?? ''\" (change)=\"updatePageOnErrorAction(i, j, 'file_type', $any($event.target).value)\" placeholder=\"pdf, xlsx or application/pdf\" />\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>File Type Path (optional)</mat-label>\n                        <input matInput [value]=\"action.file_type_path ?? ''\" (change)=\"updatePageOnErrorAction(i, j, 'file_type_path', $any($event.target).value)\" placeholder=\"e.g. data.content_type\" />\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>File Name (optional)</mat-label>\n                        <input matInput [value]=\"action.file_name ?? ''\" (change)=\"updatePageOnErrorAction(i, j, 'file_name', $any($event.target).value)\" placeholder=\"statement\" />\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>File Name Path (optional)</mat-label>\n                        <input matInput [value]=\"action.file_name_path ?? ''\" (change)=\"updatePageOnErrorAction(i, j, 'file_name_path', $any($event.target).value)\" placeholder=\"e.g. data.file_name\" />\n                      </mat-form-field>\n                    </div>\n                  }\n                  @if (action.action === 'emit-to-parent') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updatePageOnErrorAction(i, j, 'state_key', $any($event.target).value)\" placeholder=\"Signal Name\" />\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'set-field') {\n                    <div class=\"event-config-row\">\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-select [value]=\"action.state_key\" (valueChange)=\"updatePageOnErrorAction(i, j, 'state_key', $event)\">\n                          @for (field of availableFields(); track field.value) {\n                            <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                          }\n                        </mat-select>\n                      </mat-form-field>\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <input matInput [value]=\"action.value ?? ''\" (change)=\"updatePageOnErrorAction(i, j, 'value', $any($event.target).value)\" placeholder=\"Value\" />\n                      </mat-form-field>\n                    </div>\n                  }\n                  @if (action.action === 'call-function') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <input matInput [value]=\"action.function_name || ''\" [matAutocomplete]=\"pageErrorFunctionAuto\"\n                        (input)=\"updatePageOnErrorAction(i, j, 'function_name', $any($event.target).value)\"\n                        (change)=\"updatePageOnErrorAction(i, j, 'function_name', $any($event.target).value)\"\n                        placeholder=\"Function Name\">\n                      <mat-autocomplete #pageErrorFunctionAuto=\"matAutocomplete\"\n                        (optionSelected)=\"updatePageOnErrorAction(i, j, 'function_name', $event.option.value)\">\n                        @for (fn of filteredFunctions(action.function_name); track fn.value) {\n                          <mat-option [value]=\"fn.value\">{{ fn.label }}</mat-option>\n                        }\n                        @if (isNewFunctionName(action.function_name)) {\n                          <mat-option [value]=\"action.function_name\">Add \"{{ action.function_name }}\"</mat-option>\n                        }\n                      </mat-autocomplete>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'call-query') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <input matInput [value]=\"action.query_name || ''\" [matAutocomplete]=\"pageErrorQueryAuto\"\n                        (input)=\"updatePageOnErrorAction(i, j, 'query_name', $any($event.target).value)\"\n                        (change)=\"updatePageOnErrorAction(i, j, 'query_name', $any($event.target).value)\"\n                        placeholder=\"Query Name\">\n                      <mat-autocomplete #pageErrorQueryAuto=\"matAutocomplete\"\n                        (optionSelected)=\"updatePageOnErrorAction(i, j, 'query_name', $event.option.value)\">\n                        @for (q of filteredQueries(action.query_name); track q.value) {\n                          <mat-option [value]=\"q.value\">{{ q.label }}</mat-option>\n                        }\n                        @if (isNewQueryName(action.query_name)) {\n                          <mat-option [value]=\"action.query_name\">Add \"{{ action.query_name }}\"</mat-option>\n                        }\n                      </mat-autocomplete>\n                    </mat-form-field>\n                  }\n                  @if (action.action === 'call-function' || action.action === 'call-query') {\n                    <eru-payload-fields-picker class=\"action-select-sm\" placeholder=\"Payload Fields\"\n                      [value]=\"action.api_payload_fields || []\" [options]=\"availablePayloadFields()\"\n                      (valueChange)=\"updatePageOnErrorAction(i, j, 'api_payload_fields', $event)\" />\n                  }\n                  @if (action.action === 'update-state') {\n                    <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Scope</mat-label>\n                        <mat-select [value]=\"action.state_scope || 'page'\" (valueChange)=\"updatePageOnErrorAction(i, j, 'state_scope', $event)\">\n                          <mat-option value=\"page\">Page State</mat-option>\n                          <mat-option value=\"app\">App State (shared, survives navigation)</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n                      @if (action.state_scope === 'app') {\n                      <!-- Typed, not picked: app state has no declarations to\n                           list — a key exists only because an action wrote it. -->\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>App State Key</mat-label>\n                        <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updatePageOnErrorAction(i, j, 'state_key', $any($event.target).value)\" placeholder=\"selected_invoice\" />\n                      </mat-form-field>\n                      } @else {\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>State Key</mat-label>\n                        <mat-select [value]=\"action.state_key\" (valueChange)=\"updatePageOnErrorAction(i, j, 'state_key', $event)\">\n                          @for (key of pageStateKeys(); track key) {\n                            <mat-option [value]=\"key\">{{ key }}</mat-option>\n                          }\n                        </mat-select>\n                        @if (pageStateKeys().length === 0) {\n                        <mat-hint>This page declares no state variables — add one in the Page State panel first.</mat-hint>\n                        }\n                      </mat-form-field>\n                      }\n                      <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                        <mat-label>Formula</mat-label>\n                        <mat-select [value]=\"action.state_formula?.fn\" (valueChange)=\"updatePageNestedStateFormulaFn(i, j, 'on_error', $event)\">\n                          <mat-option value=\"set\">Set Value</mat-option>\n                          <mat-option value=\"increment\">Increment</mat-option>\n                          <mat-option value=\"decrement\">Decrement</mat-option>\n                          <mat-option value=\"toggle\">Toggle</mat-option>\n                          <mat-option value=\"reset\">Reset to Initial</mat-option>\n                          <mat-option value=\"set-from-field\">Set from Field</mat-option>\n                          <mat-option value=\"set-from-payload\">Set from Event Payload</mat-option>\n                          <mat-option value=\"expr\">Expression</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n                      @if (action.state_formula?.fn === 'set') {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Value</mat-label>\n                          <input matInput [value]=\"action.state_formula?.value ?? ''\" (change)=\"updatePageNestedStateFormulaParam(i, j, 'on_error', 'value', $any($event.target).value)\" />\n                        </mat-form-field>\n                      }\n                      @if (action.state_formula?.fn === 'increment' || action.state_formula?.fn === 'decrement') {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>By</mat-label>\n                          <input matInput type=\"number\" [value]=\"action.state_formula?.by ?? 1\" (change)=\"updatePageNestedStateFormulaParam(i, j, 'on_error', 'by', +$any($event.target).value)\" />\n                        </mat-form-field>\n                      }\n                      @if (action.state_formula?.fn === 'set-from-field') {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Field</mat-label>\n                          <mat-select [value]=\"action.state_formula?.field\" (valueChange)=\"updatePageNestedStateFormulaParam(i, j, 'on_error', 'field', $event)\">\n                            @for (field of stateSourceFields(); track field.value) {\n                              <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                            }\n                          </mat-select>\n                        </mat-form-field>\n                      }\n                      @if (action.state_formula?.fn === 'set-from-payload') {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Payload Path</mat-label>\n                          <input matInput [value]=\"action.state_formula?.payload_path ?? ''\" (change)=\"updatePageNestedStateFormulaParam(i, j, 'on_error', 'payload_path', $any($event.target).value)\" placeholder=\"e.g. error.message\" />\n                        </mat-form-field>\n                      }\n                      @if (action.state_formula?.fn === 'expr') {\n                        <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                          <mat-label>Expression</mat-label>\n                          <input matInput [value]=\"action.state_formula?.expr ?? ''\" (change)=\"updatePageNestedStateFormulaParam(i, j, 'on_error', 'expr', $any($event.target).value)\" />\n                          <mat-hint><code>&#64;state.key</code> page state · <code>&#64;app.key</code> app state · <code>&#64;page.entity_data.field</code> page data</mat-hint>\n                        </mat-form-field>\n                      }\n                    </div>\n                  }\n                  @if (action.action === 'set-page-data') {\n                  <div class=\"event-config-row\" style=\"display:flex;flex-direction:column;gap:4px;width:100%;\">\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>Record From</mat-label>\n                      <mat-select [value]=\"action.record_source || 'event'\" (valueChange)=\"updatePageOnErrorAction(i, j, 'record_source', $event)\">\n                        <mat-option value=\"event\">API Response / Event Payload</mat-option>\n                        <mat-option value=\"state\">Page State</mat-option>\n                        <mat-option value=\"app_state\">App State (shared, survives navigation)</mat-option>\n                      </mat-select>\n                    </mat-form-field>\n                    @if ((action.record_source || 'event') === 'state') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>State Key</mat-label>\n                      <mat-select [value]=\"action.state_key ?? ''\" (valueChange)=\"updatePageOnErrorAction(i, j, 'state_key', $event)\">\n                        @for (key of pageStateKeys(); track key) {\n                        <mat-option [value]=\"key\">{{ key }}</mat-option>\n                        }\n                      </mat-select>\n                    </mat-form-field>\n                    }\n                    @if (action.record_source === 'app_state') {\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>App State Key</mat-label>\n                      <input matInput [value]=\"action.state_key ?? ''\" (change)=\"updatePageOnErrorAction(i, j, 'state_key', $any($event.target).value)\" placeholder=\"selected_program\" />\n                    </mat-form-field>\n                    }\n                    <mat-form-field appearance=\"outline\" class=\"action-select-sm\">\n                      <mat-label>Path (optional)</mat-label>\n                      <input matInput [value]=\"action.record_path ?? ''\" (change)=\"updatePageOnErrorAction(i, j, 'record_path', $any($event.target).value)\" placeholder=\"e.g. get_txn.0\" />\n                    </mat-form-field>\n                    <div class=\"nav-params-hint\">\n                      Writes this page's record from the call's response. <strong>Path</strong> drills into it — a query\n                      answering {{ '{' }} get_txn: [ ... ] {{ '}' }} needs <code>get_txn.0</code> to reach the row; without one the\n                      whole response is written and the page's fields stay empty. A row of\n                      {{ '{' }} entity_id, entity_data {{ '}' }} sets both; any other object becomes the page's fields.\n                    </div>\n                  </div>\n                  }\n                  <button mat-icon-button (click)=\"removePageOnErrorAction(i, j)\" class=\"remove-action-btn\">\n                    <mat-icon>close</mat-icon>\n                  </button>\n                </div>\n              }\n            </div>\n            }\n            @if (subscription.action === 'download-file') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>File From</mat-label>\n              <mat-select [value]=\"subscription.file_source || 'response'\" (valueChange)=\"updatePageEventSubscription(i, 'file_source', $event)\">\n                <mat-option value=\"response\">API Response / Event Payload</mat-option>\n                <mat-option value=\"state\">Page State</mat-option>\n                <mat-option value=\"app_state\">App State (shared, survives navigation)</mat-option>\n                <mat-option value=\"page_data\">Page Data</mat-option>\n              </mat-select>\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Base64 Path</mat-label>\n              <input matInput [value]=\"subscription.file_path ?? ''\"\n                (change)=\"updatePageEventSubscription(i, 'file_path', $any($event.target).value)\"\n                placeholder=\"e.g. data.file_content\">\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>File Type</mat-label>\n              <input matInput [value]=\"subscription.file_type ?? ''\"\n                (change)=\"updatePageEventSubscription(i, 'file_type', $any($event.target).value)\"\n                placeholder=\"pdf, xlsx or application/pdf\">\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>File Type Path (optional)</mat-label>\n              <input matInput [value]=\"subscription.file_type_path ?? ''\"\n                (change)=\"updatePageEventSubscription(i, 'file_type_path', $any($event.target).value)\"\n                placeholder=\"e.g. data.content_type\">\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>File Name (optional)</mat-label>\n              <input matInput [value]=\"subscription.file_name ?? ''\"\n                (change)=\"updatePageEventSubscription(i, 'file_name', $any($event.target).value)\"\n                placeholder=\"statement\">\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>File Name Path (optional)</mat-label>\n              <input matInput [value]=\"subscription.file_name_path ?? ''\"\n                (change)=\"updatePageEventSubscription(i, 'file_name_path', $any($event.target).value)\"\n                placeholder=\"e.g. data.file_name\">\n            </mat-form-field>\n            <div class=\"nav-params-hint\">\n              Saves a base64 string as a file — for an API that hands the document back as a JSON\n              attribute instead of streaming it. Put this on <strong>On Success</strong> of the Call\n              Function / Call Query that fetches it and point <strong>Base64 Path</strong> at the\n              attribute (<code>data.file_content</code>); a <code>data:&lt;mime&gt;;base64,</code>\n              prefix is stripped. <strong>File Type</strong> takes a MIME type or a bare extension and\n              supplies the extension when the name has none. The <em>Path</em> variants read the type\n              and name out of the same source and win over the fixed values.\n            </div>\n            }\n\n            @if (subscription.action === 'update-state') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Scope</mat-label>\n              <mat-select [value]=\"subscription.state_scope || 'page'\"\n                (valueChange)=\"updatePageEventSubscription(i, 'state_scope', $event)\">\n                <mat-option value=\"page\">Page State</mat-option>\n                <mat-option value=\"app\">App State (shared, survives navigation)</mat-option>\n              </mat-select>\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>State Key</mat-label>\n              <input matInput [value]=\"subscription.state_key ?? ''\"\n                (change)=\"updatePageEventSubscription(i, 'state_key', $any($event.target).value)\">\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Formula</mat-label>\n              <mat-select [value]=\"subscription.state_formula?.fn\"\n                (valueChange)=\"updatePageStateFormulaFn(i, $event)\">\n                <mat-option value=\"set\">Set Value</mat-option>\n                <mat-option value=\"increment\">Increment</mat-option>\n                <mat-option value=\"decrement\">Decrement</mat-option>\n                <mat-option value=\"toggle\">Toggle</mat-option>\n                <mat-option value=\"reset\">Reset to Initial</mat-option>\n                <mat-option value=\"set-from-field\">Set from Field</mat-option>\n                <mat-option value=\"set-from-payload\">Set from Event Payload</mat-option>\n                <mat-option value=\"expr\">Expression</mat-option>\n              </mat-select>\n            </mat-form-field>\n            @if (subscription.state_formula?.fn === 'set') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Value</mat-label>\n              <input matInput [value]=\"subscription.state_formula?.value ?? ''\"\n                (change)=\"updatePageStateFormulaParam(i, 'value', $any($event.target).value)\" />\n            </mat-form-field>\n            }\n            @if (subscription.state_formula?.fn === 'increment' || subscription.state_formula?.fn === 'decrement') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>By</mat-label>\n              <input matInput type=\"number\" [value]=\"subscription.state_formula?.by ?? 1\"\n                (change)=\"updatePageStateFormulaParam(i, 'by', +$any($event.target).value)\" />\n            </mat-form-field>\n            }\n            @if (subscription.state_formula?.fn === 'set-from-field') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Field</mat-label>\n              <mat-select [value]=\"subscription.state_formula?.field\"\n                (valueChange)=\"updatePageStateFormulaParam(i, 'field', $event)\">\n                @for (field of stateSourceFields(); track field.value) {\n                <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            }\n            @if (subscription.state_formula?.fn === 'set-from-payload') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Payload Path</mat-label>\n              <input matInput [value]=\"subscription.state_formula?.payload_path ?? ''\"\n                (change)=\"updatePageStateFormulaParam(i, 'payload_path', $any($event.target).value)\"\n                placeholder=\"e.g. entity_id or entity_data.foo\" />\n            </mat-form-field>\n            }\n            @if (subscription.state_formula?.fn === 'expr') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Expression</mat-label>\n              <input matInput [value]=\"subscription.state_formula?.expr ?? ''\"\n                (change)=\"updatePageStateFormulaParam(i, 'expr', $any($event.target).value)\" />\n              <mat-hint><code>&#64;state.key</code> page state · <code>&#64;app.key</code> app state · <code>&#64;page.entity_data.field</code> page data</mat-hint>\n            </mat-form-field>\n            }\n            }\n            @if (subscription.action === 'refresh-grid' || subscription.action === 'download-grid') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Target Grids</mat-label>\n              <mat-select [value]=\"subscription.fieldNames || []\"\n                (valueChange)=\"updatePageEventSubscription(i, 'fieldNames', $event)\" multiple>\n                @for (grid of availableGrids(); track grid.value) {\n                <mat-option [value]=\"grid.value\">{{ grid.label }}</mat-option>\n                }\n                </mat-select>\n                </mat-form-field>\n                }\n                @if (subscription.action === 'refresh-page-ref') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Target Page Refs</mat-label>\n              <mat-select [value]=\"subscription.fieldNames || []\"\n                (valueChange)=\"updatePageEventSubscription(i, 'fieldNames', $event)\" multiple>\n                @for (ref of availablePageRefs(); track ref.value) {\n                <mat-option [value]=\"ref.value\">{{ ref.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            }\n            @if (subscription.action === 'set-active-tab') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Target Tabs</mat-label>\n              <mat-select [value]=\"subscription.fieldNames || []\"\n                (valueChange)=\"updatePageEventSubscription(i, 'fieldNames', $event)\" multiple>\n                @for (t of availableTabGroups(); track t.value) {\n                <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Tab</mat-label>\n              <input matInput [value]=\"subscription.value ?? ''\" [matAutocomplete]=\"tabNameSubAuto\"\n                (input)=\"updatePageEventSubscription(i, 'value', $any($event.target).value)\"\n                (change)=\"updatePageEventSubscription(i, 'value', $any($event.target).value)\"\n                placeholder=\"Tab title or index\">\n              <mat-autocomplete #tabNameSubAuto=\"matAutocomplete\"\n                (optionSelected)=\"updatePageEventSubscription(i, 'value', $event.option.value)\">\n                @for (t of availableTabNames(); track t.value) {\n                <mat-option [value]=\"t.value\">{{ t.label }}</mat-option>\n                }\n              </mat-autocomplete>\n            </mat-form-field>\n            }\n            @if (subscription.action === 'toggle-side-panel' || subscription.action === 'open-side-panel' || subscription.action === 'close-side-panel') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Target Side Panel</mat-label>\n              <mat-select [value]=\"subscription.fieldNames || []\"\n                (valueChange)=\"updatePageEventSubscription(i, 'fieldNames', $event)\" multiple>\n                @for (panel of availableSidePanels(); track panel.value) {\n                <mat-option [value]=\"panel.value\">{{ panel.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            }\n            @if (subscription.action === 'navigate-to-page') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Target Page</mat-label>\n              <mat-select [value]=\"subscription.page_id\"\n                (valueChange)=\"updatePageEventSubscription(i, 'page_id', $event)\">\n                @for (page of availablePages(); track page.value) {\n                <mat-option [value]=\"page.value\">{{ page.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Route Param Name (default: view)</mat-label>\n              <input matInput [value]=\"subscription.state_key ?? ''\"\n                (change)=\"updatePageEventSubscription(i, 'state_key', $any($event.target).value)\" placeholder=\"view\">\n            </mat-form-field>\n            <div class=\"nav-params-editor\">\n              <div class=\"nav-params-header\">\n                <span class=\"nav-params-title\">Pass to Target Page</span>\n                <button mat-icon-button type=\"button\" (click)=\"addPageNavParam(i)\"\n                  matTooltip=\"Add a param carried to the target page\">\n                  <mat-icon>add</mat-icon>\n                </button>\n              </div>\n              @for (np of subscription.nav_params || []; track $index) {\n              <div class=\"nav-param-row\">\n                <mat-form-field appearance=\"outline\" class=\"api-select\">\n                  <mat-label>Target State Key</mat-label>\n                  <input matInput [value]=\"np.param ?? ''\"\n                    (change)=\"updatePageNavParam(i, $index, 'param', $any($event.target).value)\" placeholder=\"company_id\">\n                </mat-form-field>\n                <mat-form-field appearance=\"outline\" class=\"api-select\">\n                  <mat-label>Value Expression</mat-label>\n                  <input matInput [value]=\"np.value_expression ?? ''\"\n                    (change)=\"updatePageNavParam(i, $index, 'value_expression', $any($event.target).value)\"\n                    placeholder=\"&#64;state.selected_id\">\n                </mat-form-field>\n                <mat-slide-toggle [checked]=\"np.encode === 'json'\"\n                  (change)=\"updatePageNavParam(i, $index, 'encode', $event.checked ? 'json' : undefined)\"\n                  matTooltip=\"Send as JSON. Scalars are preferred — use app state for large values.\">JSON</mat-slide-toggle>\n                <button mat-icon-button type=\"button\" (click)=\"removePageNavParam(i, $index)\">\n                  <mat-icon>delete</mat-icon>\n                </button>\n              </div>\n              }\n              <div class=\"nav-params-hint\">\n                Each param becomes a URL query param and seeds the same-named state variable on the target page.\n              </div>\n            </div>\n            }\n            @if (subscription.action === 'step-forward' || subscription.action === 'step-back') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Target Stepper</mat-label>\n              <mat-select [value]=\"subscription.fieldNames || []\"\n                (valueChange)=\"updatePageEventSubscription(i, 'fieldNames', $event)\" multiple>\n                @for (s of availableSteppers(); track s.value) {\n                <mat-option [value]=\"s.value\">{{ s.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            }\n            @if (subscription.action === 'hide-component' || subscription.action === 'show-component' || subscription.action === 'start-loading' || subscription.action === 'stop-loading' || subscription.action === 'enable-component' || subscription.action === 'disable-component' || subscription.action === 'start-timer' || subscription.action === 'stop-timer') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Target Components</mat-label>\n              <mat-select [value]=\"subscription.fieldNames || []\"\n                (valueChange)=\"updatePageEventSubscription(i, 'fieldNames', $event)\" multiple>\n                @for (comp of availableComponents(); track comp.value) {\n                <mat-option [value]=\"comp.value\">{{ comp.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            }\n            @if (subscription.action === 'hide-fields' || subscription.action === 'unhide-fields') {\n            <mat-form-field appearance=\"outline\" class=\"api-select\">\n              <mat-label>Field Names</mat-label>\n              <mat-select [value]=\"subscription.fieldNames || []\"\n                (valueChange)=\"updatePageEventSubscription(i, 'fieldNames', $event)\" multiple>\n                @for (field of availableFields(); track field.value) {\n                <mat-option [value]=\"field.value\">{{ field.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            }\n          </div>\n          }\n          @if (pageEventSubscriptions().length === 0) {\n          <div class=\"no-properties\">\n            <p class=\"hint\">No page event handlers configured</p>\n          </div>\n          }\n        </div>\n      </div>\n    </mat-tab>\n  </mat-tab-group>\n  } @else {\n  <div class=\"tab-content\">\n    <div class=\"no-selection\">\n      <mat-icon>touch_app</mat-icon>\n      <h3>No page loaded</h3>\n      <p>Please load a project to edit page properties</p>\n    </div>\n  </div>\n  }\n  }\n</div>","import { Component, inject, effect, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { EruStudioStore } from '../../services';\n\n@Component({\n  selector: 'eru-json-editor-panel',\n  standalone: true,\n  imports: [FormsModule],\n  templateUrl: './json-editor-panel.component.html',\n  styleUrl: './json-editor-panel.component.scss'\n})\nexport class JsonEditorPanelComponent {\n  private store = inject(EruStudioStore);\n  readonly selectedComponent = this.store.selectedComponent;\n  jsonContent = '';\n\n  constructor() {\n    effect(() => {\n      const component = this.selectedComponent();\n      untracked(() => {\n        if (component) {\n          this.jsonContent = JSON.stringify(component, null, 2);\n        } else {\n          const page = this.store.currentPage();\n          this.jsonContent = JSON.stringify(page, null, 2);\n        }\n      });\n    });\n  }\n}\n","<div class=\"json-editor-container\">\n  <textarea\n    class=\"json-textarea\"\n    readonly\n    [value]=\"jsonContent\"\n    rows=\"20\">\n  </textarea>\n</div>\n","import { Component, inject, computed, signal, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { EruStudioStore } from '../../services';\nimport { PageStateVariable, StateFormula, StateFilter } from '../../models';\nimport { LogicEditorComponent } from '../logic-editor/logic-editor.component';\n\n@Component({\n  selector: 'eru-page-state-panel',\n  standalone: true,\n  imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatDividerModule, MatButtonToggleModule, LogicEditorComponent],\n  templateUrl: './page-state-panel.component.html',\n  styleUrl: './page-state-panel.component.scss'\n})\nexport class PageStatePanelComponent {\n  protected store = inject(EruStudioStore);\n\n  readonly currentPage = this.store.currentPage;\n  readonly stateVars = computed(() => this.currentPage()?.state || []);\n  readonly computedState = this.store.computedPageState;\n\n  /**\n   * Declaring, editing and deleting variables is authoring, so it belongs to\n   * edit mode. The panel itself opens in view mode as well — watching runtime\n   * values is exactly what it is for there — and simply shows them read-only.\n   */\n  readonly canEdit = this.store.editMode;\n\n  /**\n   * Which state this panel is showing. App state had no viewer at all — it is\n   * written by `update-state` with `state_scope: 'app'` and read as\n   * `@app.<key>`, so the only way to see what was in it was the sessionStorage\n   * blob in devtools.\n   */\n  readonly scope = signal<'page' | 'app'>('page');\n\n  constructor() {\n    // Leaving edit mode with a row open would hide its Save button and strand\n    // the buffer, so the editor closes with the mode.\n    effect(() => {\n      if (!this.canEdit()) this.editingIndex.set(null);\n    });\n  }\n\n  setScope(scope: 'page' | 'app'): void {\n    if (!scope || scope === this.scope()) return;\n    // Leaving an open editor behind would apply a page-state edit after the\n    // panel has switched away from it.\n    this.editingIndex.set(null);\n    this.scope.set(scope);\n  }\n\n  /**\n   * App state as a sorted key/value list.\n   *\n   * Read-only by design: unlike page state there is nothing to declare — the\n   * keys exist only because an action wrote them, so there is no schema to edit\n   * and an inline change here would be overwritten by the next write. It is\n   * window-wide and shared across every page in the process, which is exactly\n   * why seeing it matters when a value is not what a page expected.\n   */\n  readonly appStateVars = computed(() =>\n    Object.entries(this.store.appState() || {})\n      .map(([key, value]) => ({ key, value }))\n      .sort((a, b) => a.key.localeCompare(b.key))\n  );\n\n  /**\n   * Render a state value for display. Objects and arrays are the interesting\n   * case — a payload parked in state showed as \"[object Object]\", which tells\n   * the reader nothing about why their expression did not match.\n   */\n  formatValue(value: any): string {\n    if (value === null) return 'null';\n    if (value === undefined) return '';\n    if (typeof value === 'string') return value;\n    if (typeof value === 'object') {\n      try { return JSON.stringify(value); } catch { return String(value); }\n    }\n    return String(value);\n  }\n\n  /**\n   * Text put on the clipboard for a state value. Objects and arrays are\n   * pretty-printed rather than using the one-line `formatValue` form — what\n   * gets copied is usually pasted somewhere it needs to be read.\n   */\n  clipboardValue(value: any): string {\n    if (value === null) return 'null';\n    if (value === undefined) return '';\n    if (typeof value === 'string') return value;\n    if (typeof value === 'object') {\n      try { return JSON.stringify(value, null, 2); } catch { return String(value); }\n    }\n    return String(value);\n  }\n\n  // Which row most recently had its value copied, as `<scope>:<key>` so a page\n  // and a system variable of the same name do not both show the tick.\n  readonly copiedKey = signal<string | null>(null);\n\n  copyValue(scope: string, key: string, value: any): void {\n    const text = this.clipboardValue(value);\n    const marker = scope + ':' + key;\n    const done = () => {\n      this.copiedKey.set(marker);\n      setTimeout(() => {\n        if (this.copiedKey() === marker) this.copiedKey.set(null);\n      }, 1500);\n    };\n    const clip = (navigator as any)?.clipboard;\n    if (clip?.writeText) {\n      clip.writeText(text).then(done).catch(() => this.fallbackCopy(text, done));\n    } else {\n      this.fallbackCopy(text, done);\n    }\n  }\n\n  private fallbackCopy(text: string, done: () => void): void {\n    try {\n      const ta = document.createElement('textarea');\n      ta.value = text;\n      ta.style.position = 'fixed';\n      ta.style.opacity = '0';\n      document.body.appendChild(ta);\n      ta.select();\n      document.execCommand('copy');\n      ta.remove();\n      done();\n    } catch {\n      // clipboard unavailable — ignore\n    }\n  }\n\n  // System state vars (org_id, process_id, process_name, org_process_id, ...)\n  // provided by the host app at runtime. Shown read-only — cannot be edited or\n  // removed.\n  readonly systemStateVars = computed(() => {\n    const cs = this.computedState();\n    return EruStudioStore.SYSTEM_STATE_KEYS.map(key => ({ key, value: cs[key] ?? '' }));\n  });\n\n  readonly editingIndex = signal<number | null>(null);\n  readonly editBuffer = signal<PageStateVariable>({ key: '', initial: null });\n\n  addStateVar(): void {\n    const page = this.currentPage();\n    if (!page) return;\n    const newVar: PageStateVariable = { key: 'new_state_' + Date.now(), initial: null };\n    const updated = [...(page.state || []), newVar];\n    this.store.updatePage({ state: updated });\n    this.store.initPageState({ ...page, state: updated });\n    this.startEdit(updated.length - 1, newVar);\n  }\n\n  removeStateVar(index: number): void {\n    const page = this.currentPage();\n    if (!page) return;\n    const updated = (page.state || []).filter((_, i) => i !== index);\n    this.store.updatePage({ state: updated });\n  }\n\n  startEdit(index: number, sv: PageStateVariable): void {\n    this.editingIndex.set(index);\n    this.editBuffer.set(JSON.parse(JSON.stringify(sv)));\n  }\n\n  cancelEdit(): void {\n    this.editingIndex.set(null);\n  }\n\n  saveEdit(): void {\n    const page = this.currentPage();\n    const idx = this.editingIndex();\n    if (!page || idx === null) return;\n    const updated = [...(page.state || [])];\n    const edited = { ...this.editBuffer() };\n    updated[idx] = edited;\n    this.store.updatePage({ state: updated });\n    this.store.initPageState({ ...page, state: updated });\n    // The author just said what this variable starts at, so apply it now rather\n    // than letting the value already in runtime state win — initPageState alone\n    // would leave the panel showing the old value until the next page load.\n    this.store.applyStateInitial(edited.key, edited.initial);\n    this.editingIndex.set(null);\n  }\n\n  updateBuffer(field: keyof PageStateVariable, value: any): void {\n    this.editBuffer.update(b => ({ ...b, [field]: value }));\n  }\n\n  updateFormulaFn(fn: string): void {\n    this.editBuffer.update(b => ({\n      ...b,\n      formula: { ...(b.formula || {} as StateFormula), fn: fn as StateFormula['fn'] }\n    }));\n  }\n\n  getFilterExpr(): string {\n    const f = this.editBuffer().formula?.filter;\n    if (!f) return '';\n    const filters: StateFilter[] = Array.isArray(f) ? f : [f];\n    return filters.map(fl => {\n      const field = '@' + (fl.field || '');\n      if (fl.not_empty) return `${field} not empty`;\n      if (fl.in && fl.in.length > 0) return `${field} in (${fl.in.join(', ')})`;\n      if (fl.not_in && fl.not_in.length > 0) return `${field} not in (${fl.not_in.join(', ')})`;\n      if (fl.equals !== undefined) return `${field} is ${fl.equals}`;\n      return field;\n    }).join(' && ');\n  }\n\n  setFilterExpr(value: string): void {\n    if (!value || !value.trim()) {\n      this.updateFormulaField('filter', undefined);\n      return;\n    }\n    const parts = value.split('&&').map(s => s.trim()).filter(s => s);\n    const filters: StateFilter[] = [];\n    for (const part of parts) {\n      const match = part.match(/^@(\\S+)\\s+(.+)$/);\n      if (!match) continue;\n      const field = match[1];\n      const condition = match[2].trim();\n      if (condition === 'not empty') {\n        filters.push({ field, not_empty: true });\n      } else if (condition.startsWith('in (') && condition.endsWith(')')) {\n        const vals = condition.slice(4, -1).split(',').map(s => s.trim()).filter(s => s);\n        filters.push({ field, in: vals });\n      } else if (condition.startsWith('not in (') && condition.endsWith(')')) {\n        const vals = condition.slice(8, -1).split(',').map(s => s.trim()).filter(s => s);\n        filters.push({ field, not_in: vals });\n      } else if (condition.startsWith('is ')) {\n        filters.push({ field, equals: condition.slice(3).trim() });\n      }\n    }\n    this.updateFormulaField('filter', filters.length > 0 ? filters : undefined);\n  }\n\n  updateFormulaField(param: keyof StateFormula, value: any): void {\n    this.editBuffer.update(b => ({\n      ...b,\n      formula: { ...(b.formula || {} as StateFormula), [param]: value }\n    }));\n  }\n\n  clearFormula(): void {\n    this.editBuffer.update(b => {\n      const { formula, ...rest } = b;\n      return rest;\n    });\n  }\n\n  /**\n   * Arrays a formula can aggregate over besides the page's own records — every\n   * other declared state variable, offered as `state:<key>`. This is what makes\n   * a grid's checkbox selection summable: the grid writes `selected_rows` into\n   * state and the formula reads it back from there.\n   */\n  readonly formulaSourceStateVars = computed(() =>\n    this.stateVars()\n      .filter(v => v.key && v.key !== this.editBuffer().key)\n      .map(v => ({ value: `state:${v.key}`, label: `State: ${v.key}` }))\n  );\n\n  /**\n   * The `state:<key>[.<path>]` source split into its two authored halves — the\n   * dropdown picks the variable, the text field drills into it.\n   */\n  readonly formulaSourceKey = computed(() => {\n    const source = this.editBuffer().formula?.source;\n    if (!source || source === 'pageDataArray') return 'pageDataArray';\n    const key = source.slice('state:'.length).split('.').filter(Boolean)[0] || '';\n    return key ? `state:${key}` : 'pageDataArray';\n  });\n\n  readonly formulaSourcePath = computed(() => {\n    const source = this.editBuffer().formula?.source;\n    if (!source || source === 'pageDataArray') return '';\n    return source.slice('state:'.length).split('.').filter(Boolean).slice(1).join('.');\n  });\n\n  updateFormulaSourceKey(key: string): void {\n    if (key === 'pageDataArray') {\n      this.updateFormulaField('source', 'pageDataArray');\n      return;\n    }\n    const path = this.formulaSourcePath();\n    this.updateFormulaField('source', path ? `${key}.${path}` : key);\n  }\n\n  updateFormulaSourcePath(path: string): void {\n    const key = this.formulaSourceKey();\n    if (key === 'pageDataArray') return;\n    const clean = String(path || '').split('.').map(x => x.trim()).filter(Boolean).join('.');\n    this.updateFormulaField('source', clean ? `${key}.${clean}` : key);\n  }\n\n  readonly formulaFns = [\n    { value: 'count', label: 'Count' },\n    { value: 'sum', label: 'Sum' },\n    { value: 'avg', label: 'Average' },\n    { value: 'min', label: 'Min' },\n    { value: 'max', label: 'Max' },\n    { value: 'expr', label: 'Expression' }\n  ];\n}\n","<div class=\"state-panel\">\n  <div class=\"state-panel__header\">\n    <span class=\"state-panel__title\">\n      {{ scope() === 'app' ? 'App State Variables' : 'Page State Variables' }}\n    </span>\n    @if (scope() === 'page' && canEdit()) {\n    <button mat-icon-button (click)=\"addStateVar()\" title=\"Add State Variable\">\n      <mat-icon>add</mat-icon>\n    </button>\n    }\n  </div>\n\n  <mat-button-toggle-group class=\"state-panel__scope\" [value]=\"scope()\"\n    (change)=\"setScope($event.value)\" hideSingleSelectionIndicator>\n    <mat-button-toggle value=\"page\">Page</mat-button-toggle>\n    <mat-button-toggle value=\"app\">App</mat-button-toggle>\n  </mat-button-toggle-group>\n\n  @if (scope() === 'app') {\n  <!-- App state is window-wide and written only by `update-state` actions with\n       scope 'app', so there is nothing to declare and nothing to edit here. -->\n  <p class=\"state-panel__scope-note\">\n    Shared across every page in this process and kept for the session. Read-only —\n    set these with an <strong>Update State</strong> action scoped to App, and read them\n    as <code>&#64;app.key</code>.\n  </p>\n  @if (appStateVars().length === 0) {\n  <div class=\"state-panel__empty\">\n    <mat-icon>public</mat-icon>\n    <p>No app state set</p>\n    <p class=\"hint\">Values appear here once an Update State action writes them</p>\n  </div>\n  } @else {\n  <div class=\"state-panel__list\">\n    @for (av of appStateVars(); track av.key) {\n    <div class=\"state-var-row\">\n      <div class=\"state-var-display\">\n        <div class=\"state-var-info\">\n          <span class=\"state-var-key\">{{ av.key }}</span>\n          <span class=\"state-var-formula\">app</span>\n          <span class=\"state-var-value\" [title]=\"formatValue(av.value)\">= {{ formatValue(av.value) }}</span>\n        </div>\n        <div class=\"state-var-btns\">\n          <button mat-icon-button class=\"state-var-copy\" [class.copied]=\"copiedKey() === 'app:' + av.key\" (click)=\"copyValue('app', av.key, av.value)\"\n            [title]=\"copiedKey() === 'app:' + av.key ? 'Copied' : 'Copy value'\">\n            <mat-icon>{{ copiedKey() === 'app:' + av.key ? 'check' : 'content_copy' }}</mat-icon>\n          </button>\n          <mat-icon class=\"state-var-lock\" title=\"App state is read-only here\">lock</mat-icon>\n        </div>\n      </div>\n    </div>\n    }\n  </div>\n  }\n  } @else {\n\n  <div class=\"state-panel__list state-panel__system\">\n    @for (sv of systemStateVars(); track sv.key) {\n    <div class=\"state-var-row\">\n      <div class=\"state-var-display\">\n        <div class=\"state-var-info\">\n          <span class=\"state-var-key\">{{ sv.key }}</span>\n          <span class=\"state-var-formula\">system</span>\n          <span class=\"state-var-value\" [title]=\"formatValue(sv.value)\">= {{ formatValue(sv.value) }}</span>\n        </div>\n        <div class=\"state-var-btns\">\n          <button mat-icon-button class=\"state-var-copy\" [class.copied]=\"copiedKey() === 'system:' + sv.key\" (click)=\"copyValue('system', sv.key, sv.value)\"\n            [title]=\"copiedKey() === 'system:' + sv.key ? 'Copied' : 'Copy value'\">\n            <mat-icon>{{ copiedKey() === 'system:' + sv.key ? 'check' : 'content_copy' }}</mat-icon>\n          </button>\n          <mat-icon class=\"state-var-lock\" title=\"Provided by the host — not editable\">lock</mat-icon>\n        </div>\n      </div>\n    </div>\n    }\n  </div>\n\n  @if (stateVars().length === 0) {\n  <div class=\"state-panel__empty\">\n    <mat-icon>data_object</mat-icon>\n    <p>No state variables defined</p>\n    @if (canEdit()) {\n    <p class=\"hint\">Click + to add a state variable</p>\n    } @else {\n    <p class=\"hint\">Declare them in Edit Mode</p>\n    }\n  </div>\n  } @else {\n  <div class=\"state-panel__list\">\n    @for (sv of stateVars(); track sv.key; let i = $index) {\n    <div class=\"state-var-row\">\n      @if (canEdit() && editingIndex() === i) {\n      <div class=\"state-var-edit\">\n        <mat-form-field appearance=\"outline\" class=\"field-full\">\n          <mat-label>Key</mat-label>\n          <input matInput [ngModel]=\"editBuffer().key\" (ngModelChange)=\"updateBuffer('key', $event)\" />\n        </mat-form-field>\n        <mat-form-field appearance=\"outline\" class=\"field-full\" subscriptSizing=\"dynamic\">\n          <mat-label>Initial Value</mat-label>\n          <input matInput [ngModel]=\"editBuffer().initial\" (ngModelChange)=\"updateBuffer('initial', $event)\" />\n          <mat-hint>\n            A literal, or a date anchor: <code>&#64;current_date</code>, <code>&#64;first_day</code>,\n            <code>&#64;last_day</code> — each offsettable in days, e.g. <code>&#64;current_date - 7</code>.\n          </mat-hint>\n        </mat-form-field>\n\n        <div class=\"formula-section\">\n          <div class=\"formula-header\">\n            <span>Auto Formula (optional)</span>\n            @if (editBuffer().formula) {\n            <button mat-icon-button (click)=\"clearFormula()\" title=\"Remove formula\">\n              <mat-icon>close</mat-icon>\n            </button>\n            } @else {\n            <button mat-icon-button (click)=\"updateFormulaFn('count')\" title=\"Add formula\">\n              <mat-icon>add</mat-icon>\n            </button>\n            }\n          </div>\n          @if (editBuffer().formula) {\n          <mat-form-field appearance=\"outline\" class=\"field-full\">\n            <mat-label>Function</mat-label>\n            <mat-select [ngModel]=\"editBuffer().formula?.fn\" (ngModelChange)=\"updateFormulaFn($event)\">\n              @for (fn of formulaFns; track fn.value) {\n              <mat-option [value]=\"fn.value\">{{ fn.label }}</mat-option>\n              }\n            </mat-select>\n          </mat-form-field>\n          @if (editBuffer().formula?.fn !== 'expr') {\n          <mat-form-field appearance=\"outline\" class=\"field-full\">\n            <mat-label>Source</mat-label>\n            <mat-select [ngModel]=\"formulaSourceKey()\" (ngModelChange)=\"updateFormulaSourceKey($event)\">\n              <mat-option value=\"pageDataArray\">Page Data</mat-option>\n              @for (option of formulaSourceStateVars(); track option.value) {\n              <mat-option [value]=\"option.value\">{{ option.label }}</mat-option>\n              }\n            </mat-select>\n          </mat-form-field>\n          @if (formulaSourceKey() !== 'pageDataArray') {\n          <mat-form-field appearance=\"outline\" class=\"field-full\">\n            <mat-label>Source Path</mat-label>\n            <input matInput [ngModel]=\"formulaSourcePath()\" (ngModelChange)=\"updateFormulaSourcePath($event)\"\n              placeholder=\"e.g. selection.selected_rows\" />\n            <mat-hint>Leave blank if the variable is itself the array. Use a path when it holds an event payload.</mat-hint>\n          </mat-form-field>\n          }\n          }\n          @if (editBuffer().formula?.fn !== 'count' && editBuffer().formula?.fn !== 'expr') {\n          <mat-form-field appearance=\"outline\" class=\"field-full\">\n            <mat-label>Field</mat-label>\n            <input matInput [ngModel]=\"editBuffer().formula?.field\" (ngModelChange)=\"updateFormulaField('field', $event)\" />\n          </mat-form-field>\n          }\n          @if (editBuffer().formula?.fn !== 'expr') {\n          <eru-logic-editor\n            [value]=\"getFilterExpr()\"\n            label=\"Filter\"\n            description=\"Use @ to select fields. Operators: is, is not, contains, in, not empty\"\n            (valueChange)=\"setFilterExpr($event)\">\n          </eru-logic-editor>\n          }\n          @if (editBuffer().formula?.fn === 'expr') {\n          <mat-form-field appearance=\"outline\" class=\"field-full\" subscriptSizing=\"dynamic\">\n            <mat-label>Expression</mat-label>\n            <textarea matInput rows=\"3\" [ngModel]=\"editBuffer().formula?.value\"\n              (ngModelChange)=\"updateFormulaField('value', $event)\"\n              placeholder='e.g. &#64;qty * &#64;rate  —  or  {\"filter\": {\"v1\": &#64;app.pn, \"v2\": &#64;app.fa}}'></textarea>\n            <mat-hint>\n              <code>&#64;key</code> reads PAGE state; <code>&#64;app.key</code> reads APP state;\n              <code>&#64;page.entity_data.field</code> reads the page's record — a bare name\n              sees neither app state nor page data. Any JavaScript value can be returned, so an\n              object literal builds a JSON payload. <code>&#64;entities</code> gives the\n              process's entity list as an array.\n            </mat-hint>\n          </mat-form-field>\n          }\n          }\n        </div>\n\n        <div class=\"state-var-actions\">\n          <button mat-button (click)=\"cancelEdit()\">Cancel</button>\n          <button mat-flat-button color=\"primary\" (click)=\"saveEdit()\">Save</button>\n        </div>\n      </div>\n      } @else {\n      <div class=\"state-var-display\">\n        <div class=\"state-var-info\">\n          <span class=\"state-var-key\">{{ sv.key }}</span>\n          @if (sv.formula) {\n          <span class=\"state-var-formula\">{{ sv.formula.fn }}</span>\n          }\n          <span class=\"state-var-value\" [title]=\"formatValue(computedState()[sv.key] ?? sv.initial)\">=\n            {{ formatValue(computedState()[sv.key] ?? sv.initial) }}</span>\n        </div>\n        <div class=\"state-var-btns\">\n          <button mat-icon-button class=\"state-var-copy\" [class.copied]=\"copiedKey() === 'page:' + sv.key\"\n            (click)=\"copyValue('page', sv.key, computedState()[sv.key] ?? sv.initial)\"\n            [title]=\"copiedKey() === 'page:' + sv.key ? 'Copied' : 'Copy value'\">\n            <mat-icon>{{ copiedKey() === 'page:' + sv.key ? 'check' : 'content_copy' }}</mat-icon>\n          </button>\n          @if (canEdit()) {\n          <button mat-icon-button (click)=\"startEdit(i, sv)\" title=\"Edit\">\n            <mat-icon>edit</mat-icon>\n          </button>\n          <button mat-icon-button (click)=\"removeStateVar(i)\" title=\"Remove\">\n            <mat-icon>delete</mat-icon>\n          </button>\n          }\n        </div>\n      </div>\n      }\n    </div>\n    }\n  </div>\n  }\n  }\n</div>\n","import {\n  Component,\n  ElementRef,\n  EnvironmentInjector,\n  OnInit,\n  OnDestroy,\n  computed,\n  createEnvironmentInjector,\n  effect,\n  inject,\n  input,\n  output,\n  signal,\n  untracked,\n  HostListener,\n  Input\n} from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { EruStudioStore } from '../../services/eru-studio.store';\nimport { ComponentRegistryService } from '../../services/component-registry.service';\nimport { ComponentSchemaService } from '../../services/component-schema.service';\nimport { PropertyToTailwindService } from '../../services/property-to-tailwind.service';\nimport { FormValidationService } from '../../services/form-validation.service';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\nimport { EruComponent, EruPage, TailwindBreakpoint } from '../../models';\nimport { FloatingPanelComponent } from '../floating-panel/floating-panel.component';\nimport { ComponentPaletteComponent } from '../component-palette/component-palette.component';\nimport { PropertiesPanelComponent } from '../properties-panel/properties-panel.component';\nimport { JsonEditorPanelComponent } from '../json-editor-panel/json-editor-panel.component';\nimport { PageStatePanelComponent } from '../page-state-panel/page-state-panel.component';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { getBreakpointFromViewport } from '../../utils/breakpoint.util';\n@Component({\n  selector: 'eru-canvas',\n  standalone: true,\n  providers: [EruStudioStore, ComponentSchemaService, FormValidationService, LogicEvaluatorService],\n  imports: [\n    CommonModule,\n    MatButtonModule,\n    MatIconModule,\n    MatMenuModule,\n    MatDividerModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatCheckboxModule,\n    MatSliderModule,\n    MatTooltipModule,\n    MatDatepickerModule,\n    MatNativeDateModule,\n    A11yModule,\n    NgComponentOutlet,\n    FloatingPanelComponent,\n    ComponentPaletteComponent,\n    PropertiesPanelComponent,\n    JsonEditorPanelComponent,\n    PageStatePanelComponent\n  ],\n  templateUrl: './canvas.component.html',\n  styleUrl: './canvas.component.scss'\n})\nexport class CanvasComponent implements OnInit, OnDestroy {\n  public store = inject(EruStudioStore);\n  public componentRegistry = inject(ComponentRegistryService);\n  public schemaService = inject(ComponentSchemaService);\n  public tailwindService = inject(PropertyToTailwindService);\n  public formValidationService = inject(FormValidationService);\n  public logicEvaluator = inject(LogicEvaluatorService);\n  private readonly hostElement = inject(ElementRef);\n  protected pageId = computed(() => this.store.currentPage()?.id);\n  private readonly parentEnv = inject(EnvironmentInjector);\n  readonly dynamicComponentInjector = createEnvironmentInjector(\n    [\n      { provide: EruStudioStore, useValue: this.store },\n      { provide: ComponentSchemaService, useValue: this.schemaService },\n      { provide: FormValidationService, useValue: this.formValidationService },\n      { provide: LogicEvaluatorService, useValue: this.logicEvaluator }\n    ],\n    this.parentEnv\n  );\n  readonly componentsReady = signal(false);\n\n  /**\n   * Signal-backed input for initial entity ID.\n   * Using @Input with a setter to avoid InputSignal brand mismatch issues in library consumers.\n   */\n  readonly initialEntityId = signal<string>('');\n\n  @Input('initialEntityId')\n  set initialEntityIdSetter(value: string) {\n    this.initialEntityId.set(value || '');\n  }\n\n  // Output signal for save functionality\n  readonly savePage = output<EruPage>();\n  readonly publishPage = output<EruPage>();\n\n  private readonly pageDataIdentity = computed(() => {\n    const page = this.store.currentPage();\n    if (!page?.id) return '';\n    return JSON.stringify([page.id, page.entity_name || '', page.data_source || '']);\n  });\n\n  private readonly lastPageDataRequestId = signal<string | null>(null);\n  /** Page the in-flight ds_page_data fetch was issued for. A navigation can\n   *  land before the response does, and the record must not be applied to\n   *  whatever page happens to be current by then. */\n  private readonly pageDataRequestPageId = signal<string | null>(null);\n  private firedOnLoadPageId: string | null = null;\n  /* envInjector = createEnvironmentInjector(\n    [\n      importProvidersFrom(A11yModule),\n      ],\n    this.parentEnv\n  ); */\n\n  /** Last seen edit-mode value, so the effect below reacts to the transition. */\n  private wasEditMode = untracked(() => this.store.editMode());\n\n  /**\n   * The breakpoint the author was authoring against, parked while preview\n   * drives the breakpoint off the real window width.\n   *\n   * Coming back from preview used to leave the detected breakpoint in place on\n   * the grounds that it was \"the author's choice\" — but it is not: preview\n   * overwrote the author's choice on the way out. The author then carried on\n   * editing against, say, `xl`, where every responsive property they touched\n   * was written into an xl override and every one they read resolved to xl\n   * instead of base. `hide_columns` made that visible: a single Hidden tick at\n   * xl wrote a one-name xl array that shadowed the base list entirely, so all\n   * the other hidden columns reappeared.\n   */\n  private editBreakpoint: TailwindBreakpoint | 'base' | null = null;\n\n  constructor() {\n    // Turning edit mode OFF is a request to preview, and a preview should show\n    // the real device breakpoint. The designer renders this same canvas in both\n    // modes, so without this the author's `base` would carry into preview and\n    // misrepresent what a user actually sees. Coming back to edit restores the\n    // breakpoint the author left, so preview cannot silently move them onto an\n    // override layer.\n    effect(() => {\n      const editing = this.store.editMode();\n      untracked(() => {\n        if (this.wasEditMode && !editing) {\n          this.editBreakpoint = this.store.viewport().breakpoint;\n          this.updateBreakpointFromViewport();\n        } else if (!this.wasEditMode && editing && this.editBreakpoint) {\n          this.store.setBreakpoint(this.editBreakpoint as TailwindBreakpoint);\n          this.editBreakpoint = null;\n        }\n        this.wasEditMode = editing;\n      });\n    });\n\n    effect(async () => {\n      const comps = this.components();\n      if (comps && comps.length > 0) {\n        await Promise.all(\n          comps.map(comp => this.componentRegistry.getComponentClassAsync(comp.type))\n        );\n        this.componentsReady.set(true);\n      } else {\n        this.componentsReady.set(true);\n      }\n    });\n\n    effect(() => {\n      const entityId = this.initialEntityId();\n      // Depend on the page's identity, not the page object: every designer edit\n      // replaces currentPage(), and re-requesting ds_page_data here overwrote\n      // the record a set-page-data action had written.\n      const identity = this.pageDataIdentity();\n      if (!entityId || !identity) return;\n      untracked(() => {\n        const page = this.store.currentPage();\n        // A page that declares a state data source owns its data from state —\n        // fetching the entity record too would race it and win, blanking the\n        // seeded record.\n        if (!page?.id || page.data_source === 'state') return;\n        const payload = { entity_id: entityId, entity_name: page.entity_name || '' };\n        const reqId = this.store.requestDynamicData('canvas', 'ds_page_data', payload);\n        this.lastPageDataRequestId.set(reqId);\n        this.pageDataRequestPageId.set(page.id);\n      });\n    });\n\n    effect(() => {\n      const reqId = this.lastPageDataRequestId();\n      if (!reqId) return;\n      const responses = this.store.dynamicDataResponses();\n      const data = responses.get(reqId);\n      if (data) {\n        untracked(() => {\n          const requestedFor = this.pageDataRequestPageId();\n          // Drop a response whose page is no longer mounted here — applying it\n          // would overwrite the current page's data with another page's record.\n          if (!requestedFor || requestedFor === this.store.currentPage()?.id) {\n            this.store.setPageData(data, requestedFor || undefined);\n          }\n          this.store.removeDynamicDataRequest(reqId);\n          this.lastPageDataRequestId.set(null);\n          this.pageDataRequestPageId.set(null);\n        });\n      }\n    });\n\n    effect(() => {\n      const page = this.store.currentPage();\n      const ready = this.componentsReady();\n      if (!page?.id || !ready) return;\n      // A page that takes its record from state must have it before on_load\n      // fires — those events send the record as their payload. Reads a signal,\n      // so this effect re-runs the moment the record lands.\n      if (!this.store.isPageRecordSourceReady(page)) return;\n      if (this.firedOnLoadPageId === page.id) return;\n      untracked(() => {\n        this.firedOnLoadPageId = page.id;\n        this.store.fireOnLoadPageEvents(page);\n      });\n    });\n  }\n\n\n  readonly breakpoints = computed(() => [\n    { name: 'base', label: 'Base', width: 0, icon: 'web' },\n    { name: 'sm', label: 'Mobile', width: 640, icon: 'smartphone' },\n    { name: 'md', label: 'Tablet', width: 768, icon: 'tablet' },\n    { name: 'lg', label: 'Desktop', width: 1024, icon: 'laptop' },\n    { name: 'xl', label: 'Large Desktop', width: 1280, icon: 'desktop_windows' },\n    { name: '2xl', label: 'Extra Large', width: 1536, icon: 'tv' }\n  ]);\n\n  readonly currentBreakpoint = computed(() => this.store.viewport().breakpoint);\n  readonly currentZoom = signal(100);\n  /* readonly showGrid = signal(false); */\n  readonly components = this.store.currentPageComponents;\n  readonly selectedComponent = this.store.selectedComponent;\n  readonly editMode = this.store.editMode;\n  readonly showComponentPalette = signal(false);\n  readonly showPropertiesPanel = signal(false);\n  readonly showJsonEditor = signal(false);\n  readonly showPageStatePanel = signal(false);\n\n  getFormControlsDebugInfo(): any {\n    const page = this.store.currentPage();\n    if (!page) {\n      return { count: 0, pageId: null, controls: [] };\n    }\n\n    const form = this.formValidationService.getForm(page.id);\n    const formControls = this.formValidationService.getAllFormControlInfos(page.id);\n\n    return {\n      pageId: page.id,\n      formValid: form?.valid ?? false,\n      count: formControls.length,\n      controls: formControls.map(info => ({\n        componentId: info.componentId,\n        fieldName: info.fieldName || '(no name)',\n        value: info.control.value,\n        isValid: info.control.valid,\n        isTouched: info.control.touched,\n        isDirty: info.control.dirty,\n        hasErrors: !!info.control.errors,\n        errorKeys: info.control.errors ? Object.keys(info.control.errors) : []\n      }))\n    };\n  }\n\n  protected isComponentHovered = computed(() => {\n    const hoveredId = this.store.hoveredComponentId();\n    return (component_id: string | null) => hoveredId === component_id;\n  });\n\n  private draggedComponentId: string | null = null;\n\n  ngOnInit() {\n    // The designer opens on BASE, not on whatever the laptop's width maps to.\n    // Most authoring is done against base properties, and a per-breakpoint\n    // override is a deliberate act — so deriving the breakpoint from the device\n    // meant every page open, and every return to this tab (mat-tab-group\n    // recreates the body, re-running ngOnInit), silently dropped the author\n    // onto `xl` and quietly wrote their edits into an xl override.\n    // Note calculateBreakpointFromWidth cannot return 'base' at all; only the\n    // toolbar can select it, which is why this has to be set explicitly.\n    if (this.store.editMode()) {\n      this.store.setBreakpoint('base');\n      return;\n    }\n    this.updateBreakpointFromViewport();\n  }\n\n  ngOnDestroy() { }\n\n  @HostListener('window:resize')\n  onWindowResize() {\n    // Same reasoning: while authoring, the chosen breakpoint is the author's,\n    // and nudging the window must not overwrite it. Preview still tracks width.\n    if (this.store.editMode()) return;\n    this.updateBreakpointFromViewport();\n  }\n\n  @HostListener('window:keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent) {\n    if (!this.editMode()) return;\n    const target = event.target as HTMLElement;\n    if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) return;\n    const hostEl = this.hostElement.nativeElement as HTMLElement;\n    if (!hostEl.isConnected) return;\n    if (hostEl.closest('[inert],[aria-hidden=\"true\"]')) return;\n    if (typeof hostEl.checkVisibility === 'function' && !hostEl.checkVisibility()) return;\n\n    const selected = this.store.selectedComponent();\n\n    if ((event.key === 'Delete' || event.key === 'Backspace') && selected) {\n      event.preventDefault();\n      this.store.deleteComponent(selected.id);\n      this.store.setSelectedComponent(null);\n    } else if (event.key === 'z' && (event.ctrlKey || event.metaKey) && !event.shiftKey) {\n      event.preventDefault();\n      this.store.undo();\n    } else if ((event.key === 'z' && (event.ctrlKey || event.metaKey) && event.shiftKey) ||\n      (event.key === 'y' && (event.ctrlKey || event.metaKey))) {\n      event.preventDefault();\n      this.store.redo();\n    } else if (event.key === 'c' && (event.ctrlKey || event.metaKey) && selected) {\n      event.preventDefault();\n      this.store.setClipboard(selected);\n      localStorage.setItem('eru-studio-clipboard', JSON.stringify(selected));\n    } else if (event.key === 'v' && (event.ctrlKey || event.metaKey)) {\n      const stored = localStorage.getItem('eru-studio-clipboard');\n      if (!stored && !this.store.clipboard()) return;\n      event.preventDefault();\n      const clipboardItem: EruComponent = stored ? JSON.parse(stored) : this.store.clipboard()!;\n      const pasted = this.regenerateIds(clipboardItem);\n      let targetContainerId = 'root-container';\n      if (selected) {\n        const selectedDef = this.componentRegistry.getComponent(selected.type);\n        if (selectedDef?.allow_children) {\n          targetContainerId = selected.id;\n        } else {\n          targetContainerId = selected.parent_id ?? 'root-container';\n        }\n      }\n      const flatComponents = this.flattenComponents(this.components());\n      const container = flatComponents.find(c => c.id === targetContainerId);\n      const containerType = container?.type ?? 'flex_container';\n      if (!this.componentRegistry.canBeChild(pasted.type, containerType)) {\n        targetContainerId = 'root-container';\n      }\n      this.store.addComponentToContainer(targetContainerId, pasted);\n      this.store.setSelectedComponent(pasted);\n    } else if (event.key === 'd' && (event.ctrlKey || event.metaKey) && selected) {\n      event.preventDefault();\n      const duped = this.regenerateIds(selected);\n      const containerId = selected.parent_id ?? 'root-container';\n      this.store.addComponentToContainer(containerId, duped);\n      this.store.setSelectedComponent(duped);\n    }\n  }\n\n  private regenerateIds(component: EruComponent, oldParentId?: string, newParentId?: string): EruComponent {\n    const oldId = component.id;\n    let newId: string;\n    if (oldParentId && newParentId && oldId.startsWith(oldParentId)) {\n      newId = newParentId + oldId.slice(oldParentId.length);\n    } else {\n      newId = crypto.randomUUID();\n    }\n    const cloned: EruComponent = { ...JSON.parse(JSON.stringify(component)), id: newId };\n    if (cloned.children && cloned.children.length > 0) {\n      cloned.children = cloned.children.map(child => this.regenerateIds(child, oldId, newId));\n    }\n    return cloned;\n  }\n\n  private updateBreakpointFromViewport() {\n    const breakpoint = getBreakpointFromViewport();\n    if (this.store.viewport().breakpoint !== breakpoint) {\n      this.store.setBreakpoint(breakpoint);\n    }\n  }\n\n  setBreakpoint(breakpoint: string) {\n    this.store.setBreakpoint(breakpoint as any);\n  }\n\n  calculateBreakpointFromViewport(): string {\n    return getBreakpointFromViewport();\n  }\n\n  toggleEditMode() {\n    this.store.toggleEditMode();\n  }\n\n  onDragOver(event: DragEvent) {\n    event.preventDefault();\n    const dragData = event.dataTransfer!.types;\n    event.dataTransfer!.dropEffect = dragData.includes('application/json') ? 'move' : 'copy';\n\n    const target = event.target as HTMLElement;\n    const canvasComponent = target.closest('.canvas-component');\n\n    if (canvasComponent && !canvasComponent.classList.contains('canvas-viewport')) {\n      const componentId = canvasComponent.getAttribute('data-component-id');\n      if (componentId && this.store.dragState().is_dragging) {\n        this.store.setHoveredComponentId(componentId);\n      }\n    }\n  }\n\n\n  onDrop(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const dragData = event.dataTransfer!.getData('application/json');\n    if (!dragData) return;\n\n    try {\n      const data = JSON.parse(dragData);\n      if (data.type === 'component') {\n        let targetElement = event.target as HTMLElement;\n        let containerId: string | null = null;\n\n        while (targetElement && !containerId) {\n          containerId = targetElement.getAttribute('data-container-id');\n          if (containerId) break;\n          targetElement = targetElement.parentElement!;\n        }\n\n        if (!containerId) {\n          containerId = 'root-container';\n        }\n\n        const flatComponents = this.flattenComponents(this.components());\n        const container = flatComponents.find(c => c.id === containerId);\n        const containerType = container?.type || 'flex_container';\n\n        if (!this.componentRegistry.canBeChild(data.component_type, containerType)) {\n          this.store.endDrag();\n          return;\n        }\n\n        this.createComponentInContainer(data.component_type, event);\n      } else if (data.type === 'move' && data.component_id) {\n        this.moveComponentBeforeTarget(data.component_id);\n      }\n    } catch {\n      // ignore malformed drag data\n    }\n\n    this.draggedComponentId = null;\n    this.store.endDrag();\n  }\n\n  private flattenComponents(components: EruComponent[]): EruComponent[] {\n    const result: EruComponent[] = [];\n    for (const comp of components) {\n      result.push(comp);\n      if (comp.children && comp.children.length > 0) {\n        result.push(...this.flattenComponents(comp.children));\n      }\n    }\n    return result;\n  }\n\n  private moveComponentBeforeTarget(componentId: string) {\n    const targetId = this.store.hoveredComponentId();\n    if (!targetId) return;\n\n    const sourceComponent = this.findComponentRecursively(componentId);\n    const targetComponent = this.findComponentRecursively(targetId);\n\n    if (!sourceComponent || !targetComponent) return;\n\n    if (sourceComponent.parentId === targetComponent.parentId) {\n      this.moveComponentWithinContainer(componentId, targetId, sourceComponent.parentId);\n    } else {\n      this.moveComponentBetweenContainers(componentId, targetId, sourceComponent.parentId, targetComponent.parentId);\n    }\n  }\n\n  private findComponentRecursively(componentId: string, components: EruComponent[] = this.components(), parentId: string | null = null): { component: EruComponent, parentId: string | null } | null {\n    for (const component of components) {\n      if (component.id === componentId) {\n        return { component, parentId };\n      }\n\n      // Search in children if this is a container\n      if (component.children && component.children.length > 0) {\n        const found = this.findComponentRecursively(componentId, component.children, component.id);\n        if (found) {\n          return found;\n        }\n      }\n    }\n    return null;\n  }\n\n  private moveComponentWithinContainer(componentId: string, targetId: string, containerId: string | null) {\n    if (containerId === null) {\n      const allComponents = this.components();\n      const targetIndex = allComponents.findIndex(c => c.id === targetId);\n      if (targetIndex !== -1) {\n        this.store.moveComponentToIndex(componentId, targetIndex);\n      }\n    } else {\n      const container = this.findComponentRecursively(containerId);\n      if (container?.component.children) {\n        const children = [...container.component.children];\n        const sourceIndex = children.findIndex(c => c.id === componentId);\n        const targetIndex = children.findIndex(c => c.id === targetId);\n\n        if (sourceIndex !== -1 && targetIndex !== -1) {\n          const [movedComponent] = children.splice(sourceIndex, 1);\n          const insertIndex = sourceIndex < targetIndex ? targetIndex - 1 : targetIndex;\n          children.splice(insertIndex, 0, movedComponent);\n          this.store.updateComponent(containerId, { children });\n        }\n      }\n    }\n  }\n\n  private moveComponentBetweenContainers(componentId: string, targetId: string, sourceContainerId: string | null, targetContainerId: string | null) {\n    const sourceResult = this.findComponentRecursively(componentId);\n    if (!sourceResult) return;\n\n    const sourceComponent = sourceResult.component;\n\n    this.store.moveComponentToContainer(componentId, targetContainerId ?? 'root-container');\n  }\n\n  private createComponentInContainer(componentType: string, event: DragEvent) {\n    let targetElement = event.target as HTMLElement;\n    let containerId: string | null = null;\n\n    while (targetElement && !containerId) {\n      containerId = targetElement.getAttribute('data-container-id');\n      if (containerId) break;\n      targetElement = targetElement.parentElement!;\n    }\n\n    if (!containerId) {\n      containerId = 'root-container';\n    }\n\n    const componentDef = this.componentRegistry.getComponent(componentType);\n    if (!componentDef) return;\n\n    const componentId = crypto.randomUUID();\n\n    const defaultChildren: EruComponent[] = [];\n    if (componentType === 'expansion_panel') {\n      const makeFlexChild = (id: string): EruComponent => ({\n        id,\n        type: 'flex_container',\n        properties: {\n          base: {\n            name: '',\n            label: '',\n            identifier: false,\n            events: []\n          }\n        },\n        styles: {\n          classes: '',\n          responsive_classes: {},\n          responsive_styles: {},\n          custom: {}\n        },\n        children: [],\n        created_at: new Date().toISOString(),\n        updated_at: new Date().toISOString()\n      });\n      defaultChildren.push(makeFlexChild(`${componentId}-header`));\n      defaultChildren.push(makeFlexChild(`${componentId}-content`));\n    }\n\n    const component: EruComponent = {\n      id: componentId,\n      type: componentType,\n      properties: {\n        base: {\n          name: '',\n          label: '',\n          identifier: false,\n          events: []\n        }\n      },\n      styles: {\n        classes: '',\n        responsive_classes: {},\n        responsive_styles: {},\n        custom: {}\n      },\n      children: componentDef.allow_children ? defaultChildren : undefined,\n      created_at: new Date().toISOString(),\n      updated_at: new Date().toISOString()\n    };\n\n    this.store.addComponentToContainer(containerId, component);\n    this.store.setSelectedComponent(component);\n  }\n\n  selectComponent(event: MouseEvent, component: EruComponent) {\n    event.stopPropagation();\n    this.store.setSelectedComponent(component);\n  }\n\n  onComponentSelect(event: CustomEvent) {\n    if (!this.store.editMode()) return;\n    const componentId = event.detail.componentId;\n    const component = this.findComponentById(this.components(), componentId);\n    if (component) {\n      this.store.setSelectedComponent(component);\n    }\n  }\n\n  private findComponentById(components: EruComponent[], id: string): EruComponent | null {\n    for (const component of components) {\n      if (component.id === id) {\n        return component;\n      }\n      if (component.children) {\n        const found = this.findComponentById(component.children, id);\n        if (found) {\n          return found;\n        }\n      }\n    }\n    return null;\n  }\n\n\n  /*   deleteComponent(event: MouseEvent, componentId: string) {\n      event.stopPropagation();\n      this.store.deleteComponent(componentId);\n    } */\n\n  onCanvasClick(event: MouseEvent) {\n    event.stopPropagation();\n    this.store.setSelectedComponent(null);\n  }\n\n  getCanvasLayoutClass(): string {\n    return 'relative min-h-full';\n  }\n\n  getPropertyValue(component: EruComponent, key: string, defaultValue: any = ''): any {\n    const breakpoint = this.store.viewport().breakpoint as TailwindBreakpoint | 'base';\n    return this.tailwindService.getPropertyValueForBreakpoint(component.properties, key, breakpoint) ?? defaultValue;\n  }\n\n  getDataKey(component: EruComponent): string {\n    if (component?.isNested) {\n      const entityName = component.entityName || '';\n      // Row of the hosting page_ref when it is itself looped — see\n      // BaseComponent.getDataKey.\n      const prefix = component.dataKeyPrefix ? `${component.dataKeyPrefix}.` : '';\n      // nested_array is the one that uses main JSON prefixing logic\n      if (component.nesting_type === 'nested_array' && component.index !== undefined) {\n        return `${prefix}${entityName}.${component.index}`;\n      }\n      // If independent JSON (object/array), we might not need a prefix if the pageData itself is the entity's data\n      if (component.nesting_type === 'object' || component.nesting_type === 'array') {\n        if (component.nesting_type === 'array' && component.index !== undefined) {\n          // If it's an independent array, we still might need the index if the pageData.entity_data IS the array OR contains the array\n          // Let's assume for now that if it's an array nesting, we always want the index if provided.\n          // However, if it's an independent page data, the entityName might not be needed if it's already scoped.\n          return `${component.index}`;\n        }\n        return '';\n      }\n      return entityName;\n    }\n    return '';\n  }\n\n  isChildVisible(component: EruComponent): boolean {\n    const pageId = component.pageId || this.pageId() || '';\n    const pageOverrides = this.store.fieldVisibilityOverrides().get(pageId);\n\n    const dataKey = this.getDataKey(component);\n    const fieldName = this.getPropertyValue(component, 'name');\n    const visibilityKey = (dataKey && fieldName) ? `${dataKey}.${fieldName}` : fieldName;\n\n    if (pageOverrides && visibilityKey && pageOverrides.has(visibilityKey)) {\n      return pageOverrides.get(visibilityKey)!;\n    }\n\n\n    const visibility = this.getPropertyValue(component, 'visible', 'always');\n    if (!visibility || visibility === 'always') return true;\n    if (visibility === 'never') return false;\n    if (visibility === 'conditionally') {\n      const expression = this.getPropertyValue(component, 'visibility_conditions');\n      return this.logicEvaluator.evaluate(expression, component?.pageId, component?.id);\n    }\n    return true;\n  }\n\n  getChildStyles(component: EruComponent): any {\n    if (!this.isChildVisible(component)) {\n      return { display: 'none' };\n    }\n    return {};\n  }\n\n  /**\n   * Types that render their children themselves and therefore need the canvas\n   * contract passed down — a container id to drop into, and a nesting level.\n   *\n   * `attachment` is here for its panel-header slot. Without the nesting level\n   * the slot and everything in it computed their depth from 0, so an attachment\n   * sitting a few levels deep came out DEEPER than its own children, and the\n   * click handler — which picks the highest `data-nesting-level` containing the\n   * target — selected the attachment instead of the component inside the\n   * header. It only looked right at the top level, where the numbers happened\n   * to line up.\n   */\n  isContainer(type: string): boolean {\n    return type === 'flex_container' || type === 'grid_container' || type === 'card' || type === 'attachment';\n  }\n\n  onComponentDragStart(event: DragEvent, component: EruComponent) {\n    event.stopPropagation();\n    this.draggedComponentId = component.id;\n\n    const dragData = {\n      type: 'move',\n      component_id: component.id\n    };\n\n    event.dataTransfer!.effectAllowed = 'move';\n    event.dataTransfer!.setData('application/json', JSON.stringify(dragData));\n\n    const target = event.target as HTMLElement;\n    const ghostElement = target.cloneNode(true) as HTMLElement;\n    ghostElement.style.position = 'absolute';\n    ghostElement.style.top = '-9999px';\n    ghostElement.style.left = '-9999px';\n    ghostElement.style.width = target.offsetWidth + 'px';\n    ghostElement.style.opacity = '0.6';\n    ghostElement.style.background = '#e3f2fd';\n    ghostElement.style.border = '2px dashed var(--studio-primary, #1976d2)';\n    ghostElement.style.borderRadius = '4px';\n    ghostElement.style.padding = '8px';\n    document.body.appendChild(ghostElement);\n    event.dataTransfer!.setDragImage(ghostElement, 0, 0);\n    setTimeout(() => document.body.removeChild(ghostElement), 0);\n\n    this.store.startDrag(component);\n  }\n\n  onComponentMouseLeave(event: MouseEvent) {\n    event.stopPropagation();\n    this.draggedComponentId = null;\n    this.store.setHoveredComponentId(null);\n  }\n\n  onCanvasMouseOver(event: MouseEvent, component: EruComponent) {\n    event.preventDefault();\n    event.stopPropagation();\n    // Check if mouse is over the canvas background area (not over child components)\n    const target = event.target as HTMLElement;\n    // Only set hover to root-container if we're over the canvas background, not over child components\n    if (target.getAttribute('data-component-id') === component.id) {\n      this.store.setHoveredComponentId(component.id);\n    }\n  }\n  onComponentMouseEnter(event: MouseEvent, component: EruComponent) {\n    event.stopPropagation();\n    this.store.setHoveredComponentId(component.id);\n  }\n  onComponentDragEnd(event: DragEvent) {\n    event.stopPropagation();\n    this.draggedComponentId = null;\n    this.store.endDrag();\n  }\n\n  hasCustomComponent(type: string): boolean {\n    const definition = this.componentRegistry.getComponent(type);\n    return !!definition?.component;\n  }\n\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) {\n      return definition.component;\n    }\n    return this.componentRegistry.getLoadedComponent(type);\n  }\n\n  onSave() {\n    const currentPage = this.store.currentPage();\n    if (currentPage) {\n      this.savePage.emit(currentPage);\n    }\n  }\n\n  onPublish() {\n    const currentPage = this.store.currentPage();\n    if (currentPage) {\n      this.publishPage.emit(currentPage);\n    }\n  }\n\n  getZIndex(level: number): number {\n    // Base z-index is 1, each nesting level adds 10\n    // This ensures nested components appear above their parents\n    return 1 + (level * 10);\n  }\n\n  /*  debugComponent(component: EruComponent) {\n   } */\n}\n","<!-- Canvas Header -->\n<div class=\"canvas-header\">\n  <!--   <div class=\"canvas-header-left\">\n    <button mat-button [matMenuTriggerFor]=\"projectMenu\">\n      <mat-icon>folder</mat-icon>\n      Sample Project\n      <mat-icon>arrow_drop_down</mat-icon>\n    </button>\n    <mat-menu #projectMenu=\"matMenu\">\n      <button mat-menu-item>\n        <mat-icon>add</mat-icon>\n        New Project\n      </button>\n      <button mat-menu-item>\n        <mat-icon>folder_open</mat-icon>\n        Open Project\n      </button>\n      <mat-divider></mat-divider>\n      <button mat-menu-item>\n        <mat-icon>settings</mat-icon>\n        Project Settings\n      </button>\n    </mat-menu>\n\n    <mat-icon class=\"separator\">chevron_right</mat-icon>\n\n    <button mat-button [matMenuTriggerFor]=\"pageMenu\">\n      <mat-icon>description</mat-icon>\n      Home\n      <mat-icon>arrow_drop_down</mat-icon>\n    </button>\n    <mat-menu #pageMenu=\"matMenu\">\n      <button mat-menu-item>\n        <mat-icon>add</mat-icon>\n        New Page\n      </button>\n      <button mat-menu-item>\n        <mat-icon>edit</mat-icon>\n        Edit Page\n      </button>\n      <button mat-menu-item>\n        <mat-icon>copy</mat-icon>\n        Duplicate Page\n      </button>\n      <mat-divider></mat-divider>\n      <button mat-menu-item>\n        <mat-icon>delete</mat-icon>\n        Delete Page\n      </button>\n    </mat-menu>\n  </div> -->\n\n  <div class=\"canvas-header-center\">\n    <div class=\"viewport-controls\">\n\n      @for (breakpoint of breakpoints(); track breakpoint.name) {\n      <button mat-button [class.active]=\"currentBreakpoint() === breakpoint.name\"\n        (click)=\"setBreakpoint(breakpoint.name)\" [title]=\"breakpoint.label + ' (' + breakpoint.width + 'px)'\">\n        <mat-icon>{{ breakpoint.icon }}</mat-icon>\n        {{ breakpoint.name.toUpperCase() }}\n      </button>\n      }\n    </div>\n  </div>\n\n  <div class=\"canvas-header-right\">\n    <button mat-icon-button (click)=\"toggleEditMode()\" [color]=\"editMode() ? 'primary' : 'accent'\"\n      [matTooltip]=\"editMode() ? 'Switch to View Mode' : 'Switch to Edit Mode'\">\n      <mat-icon>{{ editMode() ? 'edit' : 'visibility' }}</mat-icon>\n    </button>\n    <button mat-icon-button color=\"primary\" (click)=\"onSave()\" matTooltip=\"Save Page\">\n      <mat-icon>save</mat-icon>\n    </button>\n    <button mat-icon-button color=\"primary\" (click)=\"onPublish()\" matTooltip=\"Publish Page\">\n      <mat-icon>publish</mat-icon>\n    </button>\n    @if (editMode()) {\n    <button mat-icon-button (click)=\"showComponentPalette.set(!showComponentPalette())\"\n      [color]=\"showComponentPalette() ? 'primary' : ''\" title=\"Components\">\n      <mat-icon>widgets</mat-icon>\n    </button>\n    <button mat-icon-button (click)=\"showPropertiesPanel.set(!showPropertiesPanel())\"\n      [color]=\"showPropertiesPanel() ? 'primary' : ''\" title=\"Properties\">\n      <mat-icon>tune</mat-icon>\n    </button>\n    <button mat-icon-button (click)=\"showJsonEditor.set(!showJsonEditor())\" [color]=\"showJsonEditor() ? 'primary' : ''\"\n      title=\"JSON Editor\">\n      <mat-icon>code</mat-icon>\n    </button>\n    }\n    <!-- Outside the edit-mode block on purpose: state is the thing you need to\n         watch while USING the page — a value that did not update, a formula that\n         did not fire — and switching to Edit Mode to look at it re-renders the\n         page and loses the runtime values you were trying to read. -->\n    <button mat-icon-button (click)=\"showPageStatePanel.set(!showPageStatePanel())\"\n      [color]=\"showPageStatePanel() ? 'primary' : ''\" title=\"Page State\">\n      <mat-icon>data_object</mat-icon>\n    </button>\n\n    <!--  <button mat-icon-button [matMenuTriggerFor]=\"settingsMenu\">\n      <mat-icon>more_vert</mat-icon>\n    </button>\n    <mat-menu #settingsMenu=\"matMenu\">\n      <button mat-menu-item (click)=\"showGrid.set(!showGrid())\">\n        <mat-icon>grid_on</mat-icon>\n        Toggle Grid\n      </button>\n      <button mat-menu-item>\n        <mat-icon>straighten</mat-icon>\n        Toggle Rulers\n      </button>\n      <button mat-menu-item>\n        <mat-icon>center_focus_strong</mat-icon>\n        Snap to Grid\n      </button>\n    </mat-menu> -->\n  </div>\n</div>\n\n<!-- Canvas Content Area -->\n<div class=\"canvas-content\">\n  <div class=\"canvas-viewport\" [class]=\"'viewport-' + currentBreakpoint()\" (drop)=\"onDrop($event)\"\n    (click)=\"onCanvasClick($event)\">\n    <!-- Canvas Background Grid -->\n    <!--  <div class=\"canvas-grid\" [class.visible]=\"showGrid()\"></div> -->\n\n    <!-- Page Content -->\n    <div class=\"page-content\" [class]=\"getCanvasLayoutClass()\"\n      [attr.data-container-id]=\"components().length > 0 && components()[0].id ? components()[0].id : 'root-container'\"\n      (component-select)=\"onComponentSelect($any($event))\">\n      @if (components().length === 0) {\n      <!-- Empty State -->\n      <div class=\"empty-state\" style=\"pointer-events: none;\">\n        <mat-icon class=\"empty-icon\">widgets</mat-icon>\n        <h2>Start building your page</h2>\n        <p>Drag components from the Components panel to begin designing</p>\n        <div class=\"layout-hint\">\n          <p><strong>Layout Options:</strong></p>\n          <p>• Drop <strong>Flex Container</strong> or <strong>Grid Container</strong> for organized layouts</p>\n          <p>• Drop components directly for free-form positioning</p>\n        </div>\n      </div>\n      } @else if (componentsReady()) {\n      @for (component of components(); track component.id; let idx = $index) {\n      <div class=\"canvas-component\" [class.design-mode]=\"editMode()\"\n        [class.selected]=\"selectedComponent()?.id === component.id\"\n        [class.hovered-drop-target]=\"isComponentHovered()(component.id)\" [ngStyle]=\"getChildStyles(component)\"\n        [attr.data-container-id]=\"isContainer(component.type) ? component.id : null\"\n        [attr.data-component-id]=\"component.id\" [attr.data-component-type]=\"component.type\"\n        [attr.data-nesting-level]=\"0\" [style.z-index]=\"getZIndex(0)\"\n        (mouseenter)=\"onComponentMouseEnter($event, component)\" (mouseleave)=\"onComponentMouseLeave($event)\"\n        (mouseover)=\"onCanvasMouseOver($event, component)\" (dragstart)=\"onComponentDragStart($event,component)\"\n        draggable=\"true\" (click)=\"selectComponent($event, component)\">\n        <ng-container\n          *ngComponentOutlet=\"getComponentClass(component.type);\n                                  injector: dynamicComponentInjector;\n                                  inputs: isContainer(component.type) ? {component: component, nestingLevel: 0} : {component: component}\" />\n        <!-- injector: envInjector -->\n        <!-- @if (selectedComponent()?.id === component.id) {\n              <div class=\"selection-overlay\">\n                <div class=\"selection-handles\">\n                  <div class=\"selection-handle top-left\"></div>\n                  <div class=\"selection-handle top-right\"></div>\n                  <div class=\"selection-handle bottom-left\"></div>\n                  <div class=\"selection-handle bottom-right\"></div>\n                </div>\n                <div class=\"component-toolbar\">\n                  <span class=\"drag-handle\" title=\"Drag to move\">\n                    <mat-icon>drag_indicator</mat-icon>\n                  </span>\n                  <span class=\"component-type\">{{ component.type }}</span>\n                  <button mat-icon-button (click)=\"deleteComponent($event, component.id)\">\n                    <mat-icon>delete</mat-icon>\n                  </button>\n                </div>\n              </div>\n            } -->\n      </div>\n      }\n      }\n    </div>\n  </div>\n</div>\n\n<!-- Floating Panels (Edit Mode Only) -->\n@if (editMode()) {\n@if (showComponentPalette()) {\n<eru-floating-panel panelId=\"component-palette\" title=\"Components\" [initialSize]=\"{width: 320, height: 600}\"\n  [initialPosition]=\"{x: 20, y: 60}\">\n  <eru-component-palette />\n</eru-floating-panel>\n}\n\n@if (showPropertiesPanel()) {\n<eru-floating-panel panelId=\"properties-panel\" title=\"Properties\" [initialSize]=\"{width: 350, height: 600}\"\n  [initialPosition]=\"{x: 360, y: 60}\">\n  <eru-properties-panel />\n</eru-floating-panel>\n}\n\n@if (showJsonEditor()) {\n<eru-floating-panel panelId=\"json-editor\" title=\"JSON Editor\" [initialSize]=\"{width: 350, height: 700}\"\n  [initialPosition]=\"{x: 730, y: 60}\">\n  <eru-json-editor-panel />\n</eru-floating-panel>\n}\n}\n\n<!-- Available in view mode too — see the toolbar button. The panel drops its\n     authoring controls there and shows values only. -->\n@if (showPageStatePanel()) {\n<eru-floating-panel panelId=\"page-state-panel\" title=\"Page State\" [initialSize]=\"{width: 380, height: 500}\"\n  [initialPosition]=\"{x: 1100, y: 60}\">\n  <eru-page-state-panel />\n</eru-floating-panel>\n}","import { ChangeDetectionStrategy, Component, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EruComponentProperties, PropertySchema, StyleProperties } from '../../models';\nimport { BaseComponent } from '../base-component';\n\n@Component({\n  selector: 'eru-ghost',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule],\n  templateUrl: './ghost.component.html',\n  styleUrl: './ghost.component.scss'\n})\nexport class GhostComponent extends BaseComponent {\n\n  protected readonly lines = computed(() => {\n    const count = this.getProperty('lines') ?? 3;\n    return Array.from({ length: count });\n  });\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'shape',\n        type: 'select',\n        label: 'Shape',\n        category: 'content',\n        default_value: 'rectangle',\n        options: [\n          { label: 'Rectangle', value: 'rectangle' },\n          { label: 'Circle', value: 'circle' },\n          { label: 'Text', value: 'text' },\n          { label: 'Avatar', value: 'avatar' },\n          { label: 'Button', value: 'button' },\n          { label: 'Card', value: 'card' }\n        ]\n      },\n      {\n        key: 'animation',\n        type: 'select',\n        label: 'Animation',\n        category: 'content',\n        default_value: 'pulse',\n        options: [\n          { label: 'Pulse', value: 'pulse' },\n          { label: 'Wave', value: 'wave' },\n          { label: 'None', value: 'none' }\n        ]\n      },\n      {\n        key: 'lines',\n        type: 'number',\n        label: 'Lines',\n        category: 'content',\n        default_value: 3,\n        min: 1,\n        max: 10,\n        visible_if: { key: 'shape', equals: 'text' }\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      shape: 'rectangle',\n      animation: 'pulse',\n      lines: 3\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      width: '100%',\n      height: 80\n    };\n  }\n}\n","@if (isComponentVisible()) {\n  <div\n    class=\"eru-ghost\"\n    [class]=\"'eru-ghost eru-ghost--' + getProperty('shape') + ' eru-ghost--anim-' + getProperty('animation') + ' ' + classes()\"\n    [ngStyle]=\"combinedStyles()\"\n  >\n    @if (getProperty('shape') === 'text') {\n      @for (line of lines(); track $index; let last = $last) {\n        <div class=\"eru-ghost__line\" [class.eru-ghost__line--short]=\"last\"></div>\n      }\n    } @else if (getProperty('shape') === 'card') {\n      <div class=\"eru-ghost__card-img\"></div>\n      <div class=\"eru-ghost__card-body\">\n        <div class=\"eru-ghost__line\"></div>\n        <div class=\"eru-ghost__line eru-ghost__line--short\"></div>\n      </div>\n    } @else if (getProperty('shape') === 'avatar') {\n      <div class=\"eru-ghost__avatar-circle\"></div>\n      <div class=\"eru-ghost__avatar-lines\">\n        <div class=\"eru-ghost__line\"></div>\n        <div class=\"eru-ghost__line eru-ghost__line--short\"></div>\n      </div>\n    }\n  </div>\n}\n","import { Component, ViewEncapsulation, signal, computed, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\n\n@Component({\n  selector: 'eru-email',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatInputModule\n  ],\n  templateUrl: './email.component.html',\n  styleUrl: './email.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class EmailComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"email-input\"]';\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  readonly displayValue = computed(() => {\n    const value = this.storeValue();\n    return value ?? '';\n  });\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"email-input\"]',\n      'blur': '[data-eru-blur-target=\"email-input\"]',\n      'click': '[data-eru-click-target=\"email-input\"]',\n      'input': '[data-eru-target=\"email-input\"]'\n    };\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onInputBlur(): void {\n    this.markControlAsTouched();\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: 'email@example.com',\n        width: 2\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view (on blur).'\n      },\n    ];\n  }\n}\n\n","<div [ngStyle]=\"combinedStyles()\">\n  @if (currentMode() === 'view') {\n  <div class=\"eru-email-display\" [ngStyle]=\"displayContainerStyles()\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n    data-eru-target=\"email-display\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label email-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    @if (displayValue()) {\n    <span class=\"email-display-value\" [ngStyle]=\"displayValueStyles()\">{{ displayValue() }}</span>\n    } @else {\n    <span class=\"email-display-empty\">&mdash;</span>\n    }\n  </div>\n  } @else {\n  <mat-form-field\n    [appearance]=\"getProperty('appearance')\"\n    [class]=\"classes()\"\n    class=\"eru-email-form-field\"\n    [class.eru-has-error]=\"validationErrors().length > 0\"\n    eruCanvasEventHandler>\n    <mat-label>{{ getProperty('label') }}</mat-label>\n    @if (formControl) {\n      <input\n        matInput\n        type=\"email\"\n        [placeholder]=\"getProperty('placeholder')\"\n        [required]=\"hasRequiredValidation()\"\n        [formControl]=\"formControl!\"\n        (blur)=\"onInputBlur()\"\n        data-eru-target=\"email-input\"\n        data-eru-focus-target=\"email-input\"\n        data-eru-blur-target=\"email-input\"\n        data-eru-click-target=\"email-input\">\n    } @else {\n      <input\n        matInput\n        type=\"email\"\n        [placeholder]=\"getProperty('placeholder')\"\n        [required]=\"hasRequiredValidation()\"\n        [disabled]=\"isComponentDisabled()\"\n        [value]=\"storeValue() ?? ''\"\n        (input)=\"onValueChange($any($event.target).value)\"\n        (blur)=\"onInputBlur()\"\n        data-eru-target=\"email-input\"\n        data-eru-focus-target=\"email-input\"\n        data-eru-blur-target=\"email-input\"\n        data-eru-click-target=\"email-input\">\n    }\n    @if (validationErrors().length > 0) {\n      <mat-error>{{ validationErrors()[0] }}</mat-error>\n    }\n  </mat-form-field>\n  }\n</div>\n","import { Component, computed, signal, effect, untracked, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\nimport { NumericInputDirective } from 'eru-grid';\n\n@Component({\n  selector: 'eru-number',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatInputModule\n  , NumericInputDirective],\n  templateUrl: './number.component.html',\n  styleUrl: './number.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class NumberComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"number-input\"]';\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"number-input\"]',\n      'blur': '[data-eru-blur-target=\"number-input\"]',\n      'click': '[data-eru-click-target=\"number-input\"]',\n      'input': '[data-eru-target=\"number-input\"]'\n    };\n  }\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  /** Page data holds the number, never the formatted text — see get_value(). */\n  override get_value(): any {\n    return this.numericStoreValue(this.reactiveFieldValue());\n  }\n\n  private readonly formattedValue = computed(() =>\n    this.formatNumericValue(this.get_value()));\n\n  override get_formatted_value(): string {\n    return this.formattedValue();\n  }\n\n  /** The input is `type=\"text\"`, so the control's value arrives as a string. */\n  protected override storeValueFor(controlValue: any): any {\n    return this.numericStoreValue(controlValue);\n  }\n\n  /** The no-form-control path writes through here instead of `valueChanges`. */\n  protected override onValueChange(newValue: any): void {\n    super.onValueChange(this.numericStoreValue(newValue));\n  }\n\n  // Colours from the configured value ranges, applied over anything set in the\n  // Styles tab. View mode only — an editable input tinted with a range colour\n  // reads as a validation state rather than a value. Null when no range\n  // matches, so the field keeps its normal appearance.\n  private readonly activeColorRange = computed(() => {\n    if (this.currentMode() !== 'view') return null;\n    // The numeric reading, or a range's bounds would be compared against text.\n    const value = this.get_value();\n    return this.matchColorRange(value);\n  });\n\n  readonly rangeColor = computed<string | null>(() => this.activeColorRange()?.color || null);\n\n  /**\n   * The negative colour for the value on screen, or null. Read through a signal\n   * so the display repaints when the value crosses zero.\n   *\n   * A Colour Range wins over this wherever both apply (see the template): a\n   * range is a rule the author wrote about this specific band of values, while\n   * the negative colour is a blanket rule about sign.\n   */\n  readonly negativeColor = computed<string | null>(() => this.negativeColorFor(this.get_value()));\n\n  readonly rangeBackground = computed<string | null>(() => this.activeColorRange()?.background || null);\n\n  /**\n   * The value's colour beats the component's Text Color: a Colour Range first,\n   * since it is a rule about this band of values, then the negative colour.\n   */\n  protected override valueColorOverride(): string | null {\n    return this.rangeColor() || this.negativeColor();\n  }\n\n  constructor() {\n    super();\n    // No rounding effect on the form control. `decimal` is DISPLAY precision —\n    // get_formatted_value() applies it through formatNumericValue for view mode.\n    // Applying it to the control put the rounded number in the one place the raw\n    // value is supposed to live: a stored 10.5 in a 0-decimal column opened for\n    // editing showing 11, and the next keystroke committed that 11.\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onInputBlur(): void {\n    this.markControlAsTouched();\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: '0',\n        width: 2\n      },\n      {\n        key: 'decimal',\n        type: 'number',\n        label: 'Decimal Places',\n        category: 'behavior',\n        default_value: 0,\n        min: 0,\n        max: 10,\n        responsive: false\n      },\n      {\n        key: 'seperator',\n        type: 'select',\n        label: 'Digit Grouping',\n        category: 'behavior',\n        default_value: '',\n        options: [\n          { value: '', label: 'Default (10,000,000)' },\n          { value: 'none', label: 'None (10000000)' },\n          { value: 'thousands', label: 'Indian (1,00,00,000)' },\n          { value: 'millions', label: 'Western (10,000,000)' }\n        ],\n        description: 'Digit grouping for the displayed value. Key and values match the data model, so a bound field groups the same way here and in a grid.',\n        responsive: false\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true\n      },\n      {\n        key: 'dynamic_number',\n        type: 'boolean',\n        label: 'Dynamic Number',\n        category: 'behavior',\n        default_value: false,\n        responsive: false\n      },\n      {\n        key: 'negative_display',\n        type: 'select',\n        label: 'Negative Numbers',\n        category: 'behavior',\n        default_value: 'as_is',\n        options: [\n          { value: 'as_is', label: 'As is', preview: '-1,234.10' },\n          { value: 'colored', label: 'Coloured', preview: '-1,234.10', preview_color: '#d32f2f' },\n          { value: 'colored_abs', label: 'Coloured, no sign', preview: '1,234.10', preview_color: '#d32f2f' },\n          { value: 'parentheses', label: 'Coloured, in brackets', preview: '(1,234.10)', preview_color: '#d32f2f' }\n        ],\n        description: 'How a negative value reads, the way a spreadsheet asks it. The last three paint the value in the colour below; only the sign and brackets differ.',\n        responsive: false\n      },\n      {\n        key: 'negative_color',\n        type: 'color',\n        label: 'Negative Colour',\n        category: 'behavior',\n        default_value: '#d32f2f',\n        description: 'Colour for negative values. A matching Colour Range wins over this, since a range is a rule about the specific value.',\n        visible_if: { key: 'negative_display', notEquals: 'as_is' },\n        responsive: false\n      },\n      {\n        key: 'display_number_as',\n        type: 'select',\n        label: 'Display Number As',\n        category: 'behavior',\n        default_value: '',\n        options: [\n          { value: '', label: 'From digit grouping' },\n          { value: 'lacs', label: 'In Lacs (k / L / Cr)' },\n          { value: 'mn', label: 'In Millions (k / mn / bn / tn)' }\n        ],\n        description: 'Which scale a value abbreviates on. Choosing one turns abbreviation on; leave it blank to follow Digit Grouping (Indian -> k/L/Cr, Western -> k/mn/bn/tn).',\n        responsive: false\n      },\n      {\n        key: 'color_ranges',\n        type: 'color_ranges',\n        label: 'Colour ranges (by value)',\n        category: 'content',\n        default_value: [],\n        width: 'full',\n        description: 'Colour the text and background when the value falls in a range. Applies in view mode only — an editable input is left untinted. Leave a bound blank for an open-ended range. Rows are checked top-down and the first match wins, so order matters. These colours override the Styles tab.'\n      }\n    ];\n  }\n}\n\n","<div [ngStyle]=\"combinedStyles()\"\n  [style.background-color]=\"rangeBackground()\"\n  [class.number-range-fill]=\"!!rangeBackground()\">\n  @if (currentMode() === 'view') {\n    <div\n      [class]=\"classes()\"\n      class=\"eru-number-display\" [ngStyle]=\"displayContainerStyles()\"\n      [class.eru-inline-editable]=\"canInlineEdit()\"\n      (dblclick)=\"onDisplayDoubleClick()\"\n      eruCanvasEventHandler\n      data-eru-target=\"number-input\"\n      data-eru-focus-target=\"number-input\"\n      data-eru-blur-target=\"number-input\"\n      data-eru-click-target=\"number-input\">\n      @if (getProperty('label')) {\n      <span class=\"eru-display-label number-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n      }\n      <span class=\"number-display-value\" [ngStyle]=\"displayValueStyles()\">{{ get_formatted_value() }}</span>\n    </div>\n  } @else {\n    <mat-form-field\n      [appearance]=\"getProperty('appearance')\"\n      [class]=\"classes()\"\n      class=\"eru-number-form-field\"\n      eruCanvasEventHandler>\n      <mat-label>{{ getProperty('label') }}</mat-label>\n      @if (formControl) {\n        <input\n          matInput\n          type=\"text\"\n          eruNumericInput\n          inputmode=\"decimal\"\n          [placeholder]=\"getProperty('placeholder')\"\n          [required]=\"hasRequiredValidation()\"\n          [formControl]=\"formControl!\"\n          (blur)=\"onInputBlur()\"\n          data-eru-target=\"number-input\"\n          data-eru-focus-target=\"number-input\"\n          data-eru-blur-target=\"number-input\"\n          data-eru-click-target=\"number-input\">\n      } @else {\n        <input\n          matInput\n          type=\"text\"\n          eruNumericInput\n          inputmode=\"decimal\"\n          [placeholder]=\"getProperty('placeholder')\"\n          [required]=\"hasRequiredValidation()\"\n          [disabled]=\"isComponentDisabled()\"\n          [value]=\"storeValue() ?? ''\"\n          (input)=\"onValueChange($any($event.target).value)\"\n          (blur)=\"onInputBlur()\"\n          data-eru-target=\"number-input\"\n          data-eru-focus-target=\"number-input\"\n          data-eru-blur-target=\"number-input\"\n          data-eru-click-target=\"number-input\">\n      }\n      @if (validationErrors().length > 0) {\n        <mat-error>{{ validationErrors()[0] }}</mat-error>\n      }\n    </mat-form-field>\n  }\n</div>\n","import { Component, computed, signal, effect, untracked, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\nimport { NumericInputDirective } from 'eru-grid';\n\n@Component({\n  selector: 'eru-currency',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatInputModule\n  , NumericInputDirective],\n  templateUrl: './currency.component.html',\n  styleUrl: './currency.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class CurrencyComponent extends BaseComponent {\n  override targetElementSelector = '[data-eru-target=\"currency-input\"]';\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"currency-input\"]',\n      'blur': '[data-eru-blur-target=\"currency-input\"]',\n      'click': '[data-eru-click-target=\"currency-input\"]',\n      'input': '[data-eru-target=\"currency-input\"]'\n    };\n  }\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  private resolveByPath(value: any, path: string): any {\n    if (!path) return value;\n    let obj = value;\n    if (typeof obj === 'string') {\n      try { obj = JSON.parse(obj); } catch { return value; }\n    }\n    if (obj === null || typeof obj !== 'object') return value;\n    const segments = path.replace(/\\[(\\w+)\\]/g, '.$1').split('.').filter(Boolean);\n    let current = obj;\n    for (const segment of segments) {\n      if (current === null || current === undefined) return '';\n      current = current[segment];\n    }\n    return current ?? '';\n  }\n\n  readonly resolvedValue = computed(() => {\n    const source = this.getProperty('value_source') || 'field';\n    const valuePath = this.getProperty('value_path') || '';\n\n    if (source === 'state') {\n      const stateKey = this.getProperty('state_key') || this.getProperty('name');\n      if (!stateKey) return '';\n      const pageId = this.component()?.pageId;\n      const dataKey = this.dataKey();\n      const state = pageId ? this.store.getComputedPageStateFor(pageId, dataKey || undefined) : this.store.computedPageState();\n      return this.resolveByPath(state[stateKey] ?? '', valuePath);\n    }\n\n    if (source === 'static') {\n      return this.getProperty('value') ?? '';\n    }\n\n    const base = this.reactiveFieldValue();\n    return this.resolveByPath(base ?? '', valuePath);\n  });\n\n  readonly displaySymbol = computed(() => {\n    const symField = this.modelOrProperty('symbol_field');\n    if (symField) {\n      const source = this.getProperty('value_source') || 'field';\n      let v: any;\n      if (source === 'state') {\n        // Resolve the symbol from the same state object as the value, so a\n        // sibling key (e.g. program_data.prg_ccy_symbol) is picked up.\n        const stateKey = this.getProperty('state_key') || this.getProperty('name');\n        const pageId = this.component()?.pageId;\n        const dataKey = this.dataKey();\n        const state = pageId ? this.store.getComputedPageStateFor(pageId, dataKey || undefined) : this.store.computedPageState();\n        v = this.resolveByPath(state[stateKey] ?? '', symField);\n      } else {\n        v = this.rowFieldValue(symField);\n        if (v === undefined || v === null || v === '') v = this.store.getPageFieldData(this.scopedFieldKey(symField), this.component()?.pageId);\n        if (v === undefined || v === null || v === '') {\n          const pageId = this.component()?.pageId;\n          const state = pageId ? this.store.getComputedPageStateFor(pageId, this.dataKey() || undefined) : this.store.computedPageState();\n          v = state[symField];\n        }\n      }\n      // A symbol is a short string. Anything object-shaped means the lookup\n      // missed its record, and String() on it renders '[object Object]' in\n      // front of the amount — fall through to the static symbol instead.\n      if (v !== undefined && v !== null && v !== '' && typeof v !== 'object') return String(v);\n    }\n    return this.modelOrProperty('symbol') || '';\n  });\n\n  // Colours from the configured value ranges, applied over anything set in the\n  // Styles tab. View mode only — an editable input tinted with a range colour\n  // reads as a validation state rather than a value. Null when no range\n  // matches, so the field keeps its normal appearance. Same behaviour as the\n  // number component, so a currency and a number field with the same bands\n  // paint identically.\n  private readonly activeColorRange = computed(() => {\n    if (this.currentMode() !== 'view') return null;\n    // The numeric reading, or a range's bounds would be compared against text.\n    return this.matchColorRange(this.get_value());\n  });\n\n  readonly rangeColor = computed<string | null>(() => this.activeColorRange()?.color || null);\n\n  /**\n   * The negative colour for the value on screen, or null. Read through a signal\n   * so the display repaints when the value crosses zero.\n   *\n   * A Colour Range wins over this wherever both apply (see the template): a\n   * range is a rule the author wrote about this specific band of values, while\n   * the negative colour is a blanket rule about sign.\n   */\n  readonly negativeColor = computed<string | null>(() => this.negativeColorFor(this.get_value()));\n\n  readonly rangeBackground = computed<string | null>(() => this.activeColorRange()?.background || null);\n\n  /**\n   * The value's colour beats the component's Text Color: a Colour Range first,\n   * since it is a rule about this band of values, then the negative colour.\n   */\n  protected override valueColorOverride(): string | null {\n    return this.rangeColor() || this.negativeColor();\n  }\n\n  // The input carries its own text-align (right, so digits line up), which beats\n  // the text_align inherited from the wrapper. Emit the configured value inline\n  // so the Styles tab wins in edit mode too, falling back to right when unset.\n  readonly inputTextAlign = computed<string>(() =>\n    this.getStylePropertyValue(this.component(), 'text_align', '') || 'right'\n  );\n\n  /**\n   * Page data holds the number — never the symbol-and-grouping text that\n   * get_formatted_value() produces. See BaseComponent.get_value().\n   */\n  override get_value(): any {\n    return this.numericStoreValue(this.resolvedValue());\n  }\n\n  private readonly formattedValue = computed(() => {\n    const value = this.get_value();\n    if (value === null || value === undefined || value === '') {\n      return '';\n    }\n    const numValue = Number(value);\n    if (isNaN(numValue)) return String(value);\n    const symbol = this.displaySymbol();\n    const prefix = symbol ? `${symbol} ` : '';\n    return `${prefix}${this.formatNumericValue(numValue)}`;\n  });\n\n  override get_formatted_value(): string {\n    return this.formattedValue();\n  }\n\n  /** The input is `type=\"text\"`, so the control's value arrives as a string. */\n  protected override storeValueFor(controlValue: any): any {\n    return this.numericStoreValue(controlValue);\n  }\n\n  /** The no-form-control path writes through here instead of `valueChanges`. */\n  protected override onValueChange(newValue: any): void {\n    super.onValueChange(this.numericStoreValue(newValue));\n  }\n\n  constructor() {\n    super();\n    // No rounding effect on the form control. `decimal` is DISPLAY precision —\n    // get_formatted_value() applies it through formatNumericValue for view mode.\n    // Applying it to the control put the rounded number in the one place the raw\n    // value is supposed to live: a stored 10.5 in a 0-decimal column opened for\n    // editing showing 11, and the next keystroke committed that 11.\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onInputBlur(): void {\n    this.markControlAsTouched();\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'value_source',\n        label: 'Value Source',\n        type: 'select',\n        category: 'content',\n        default_value: 'field',\n        options: [\n          { value: 'static', label: 'Static' },\n          { value: 'field', label: 'Page Data Field' },\n          { value: 'state', label: 'Page State' }\n        ]\n      },\n      {\n        key: 'state_key',\n        label: 'State Variable',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_page_state_vars',\n        visible_if: { key: 'value_source', equals: 'state' }\n      },\n      {\n        key: 'value_path',\n        label: 'Value Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        description: 'Dot/bracket path to extract from a JSON value (e.g. data.amount or items[0].value). Leave empty to use the value as is.',\n        visible_if: { key: 'value_source', in: ['field', 'state'] }\n      },\n      {\n        key: 'value',\n        label: 'Static Value',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        visible_if: { key: 'value_source', equals: 'static' }\n      },\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: '0.00',\n        width: 2\n      },\n      {\n        key: 'symbol_field',\n        type: 'autocomplete',\n        label: 'Currency Symbol Field',\n        category: 'content',\n        dynamic_options: 'entity_field_name',\n        default_value: '',\n        description: 'Take the currency symbol from a field value (e.g. a currency code). Type a field name if not in the list. Overrides the static symbol below.',\n        width: 2,\n        responsive: false\n      },\n      {\n        key: 'symbol',\n        type: 'text',\n        label: 'Currency Symbol',\n        category: 'content',\n        default_value: '',\n        description: 'Leave empty (along with the symbol field above) to render the value as a plain number with no symbol.',\n        width: 1,\n        responsive: false\n      },\n      {\n        key: 'decimal',\n        type: 'number',\n        label: 'Decimal Places',\n        category: 'behavior',\n        default_value: 2,\n        min: 0,\n        max: 10,\n        responsive: false\n      },\n      {\n        key: 'seperator',\n        type: 'select',\n        label: 'Digit Grouping',\n        category: 'behavior',\n        default_value: '',\n        options: [\n          { value: '', label: 'Default (10,000,000)' },\n          { value: 'none', label: 'None (10000000)' },\n          { value: 'thousands', label: 'Indian (1,00,00,000)' },\n          { value: 'millions', label: 'Western (10,000,000)' }\n        ],\n        description: 'Digit grouping for the displayed value. Key and values match the data model, so a bound field groups the same way here and in a grid.',\n        responsive: false\n      },\n      {\n        key: 'color_ranges',\n        type: 'color_ranges',\n        label: 'Colour ranges (by value)',\n        category: 'content',\n        default_value: [],\n        width: 'full',\n        description: 'Colour the text and background when the value falls in a range. Applies in view mode only — an editable input is left untinted. Leave a bound blank for an open-ended range. Rows are checked top-down and the first match wins, so order matters. These colours override the Styles tab.'\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true\n      },\n      {\n        key: 'dynamic_number',\n        type: 'boolean',\n        label: 'Dynamic Number',\n        category: 'behavior',\n        default_value: false,\n        responsive: false\n      },\n      {\n        key: 'negative_display',\n        type: 'select',\n        label: 'Negative Numbers',\n        category: 'behavior',\n        default_value: 'as_is',\n        options: [\n          { value: 'as_is', label: 'As is', preview: '-1,234.10' },\n          { value: 'colored', label: 'Coloured', preview: '-1,234.10', preview_color: '#d32f2f' },\n          { value: 'colored_abs', label: 'Coloured, no sign', preview: '1,234.10', preview_color: '#d32f2f' },\n          { value: 'parentheses', label: 'Coloured, in brackets', preview: '(1,234.10)', preview_color: '#d32f2f' }\n        ],\n        description: 'How a negative value reads, the way a spreadsheet asks it. The last three paint the value in the colour below; only the sign and brackets differ.',\n        responsive: false\n      },\n      {\n        key: 'negative_color',\n        type: 'color',\n        label: 'Negative Colour',\n        category: 'behavior',\n        default_value: '#d32f2f',\n        description: 'Colour for negative values. A matching Colour Range wins over this, since a range is a rule about the specific value.',\n        visible_if: { key: 'negative_display', notEquals: 'as_is' },\n        responsive: false\n      },\n      {\n        key: 'display_number_as',\n        type: 'select',\n        label: 'Display Number As',\n        category: 'behavior',\n        default_value: '',\n        options: [\n          { value: '', label: 'From digit grouping' },\n          { value: 'lacs', label: 'In Lacs (k / L / Cr)' },\n          { value: 'mn', label: 'In Millions (k / mn / bn / tn)' }\n        ],\n        description: 'Which scale a value abbreviates on. Choosing one turns abbreviation on; leave it blank to follow Digit Grouping (Indian -> k/L/Cr, Western -> k/mn/bn/tn).',\n        responsive: false\n      },\n    ];\n  }\n}\n\n","<div [ngStyle]=\"combinedStyles()\"\n  [style.background-color]=\"rangeBackground()\"\n  [class.currency-range-fill]=\"!!rangeBackground()\">\n  @if (currentMode() === 'view') {\n    <div\n      [class]=\"classes()\"\n      class=\"eru-currency-display\" [ngStyle]=\"displayContainerStyles()\"\n      [class.eru-inline-editable]=\"canInlineEdit()\"\n      (dblclick)=\"onDisplayDoubleClick()\"\n      eruCanvasEventHandler\n      data-eru-target=\"currency-input\"\n      data-eru-focus-target=\"currency-input\"\n      data-eru-blur-target=\"currency-input\"\n      data-eru-click-target=\"currency-input\">\n      @if (getProperty('label')) {\n      <span class=\"eru-display-label currency-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n      }\n      <span class=\"currency-display-value\" [ngStyle]=\"displayValueStyles()\">{{ get_formatted_value() }}</span>\n    </div>\n  } @else {\n    <mat-form-field\n      [appearance]=\"getProperty('appearance')\"\n      [class]=\"classes()\"\n      class=\"eru-currency-form-field\"\n      eruCanvasEventHandler>\n      <mat-label>{{ getProperty('label') }}</mat-label>\n      @if (displaySymbol()) {\n        <span matTextPrefix>{{ displaySymbol() }}</span>\n      }\n      @if (formControl) {\n        <input\n          matInput\n          type=\"text\"\n          eruNumericInput\n          inputmode=\"decimal\"\n          [style.text-align]=\"inputTextAlign()\"\n          [placeholder]=\"getProperty('placeholder')\"\n          [required]=\"hasRequiredValidation()\"\n          [formControl]=\"formControl!\"\n          (blur)=\"onInputBlur()\"\n          data-eru-target=\"currency-input\"\n          data-eru-focus-target=\"currency-input\"\n          data-eru-blur-target=\"currency-input\"\n          data-eru-click-target=\"currency-input\">\n      } @else {\n        <input\n          matInput\n          type=\"text\"\n          eruNumericInput\n          inputmode=\"decimal\"\n          [style.text-align]=\"inputTextAlign()\"\n          [placeholder]=\"getProperty('placeholder')\"\n          [required]=\"hasRequiredValidation()\"\n          [disabled]=\"isComponentDisabled()\"\n          [value]=\"storeValue() ?? ''\"\n          (input)=\"onValueChange($any($event.target).value)\"\n          (blur)=\"onInputBlur()\"\n          data-eru-target=\"currency-input\"\n          data-eru-focus-target=\"currency-input\"\n          data-eru-blur-target=\"currency-input\"\n          data-eru-click-target=\"currency-input\">\n      }\n      @if (validationErrors().length > 0) {\n        <mat-error>{{ validationErrors()[0] }}</mat-error>\n      }\n    </mat-form-field>\n  }\n</div>\n","import { Injectable } from '@angular/core';\nimport { NativeDateAdapter } from '@angular/material/core';\nimport { DATE_FORMATS, formatDateWithPattern, parseDateWithPattern } from 'eru-grid';\n\n// The canonical list lives in eru-grid so eru-studio, eru-grid and the processo\n// data model offer the same choices. Re-exported under the existing name so\n// callers here are unchanged.\nexport const DATE_FORMAT_OPTIONS = DATE_FORMATS;\n\n// Shared with eru-grid and processo, so a value saved in any casing resolves\n// the same way in all three.\nexport { normalizeDateFormat, normalizeDateTimeFormat } from 'eru-grid';\n\n@Injectable()\nexport class EruDateAdapter extends NativeDateAdapter {\n  private _dateFormat = 'dd-MM-yyyy';\n\n  setFormat(format: string): void {\n    this._dateFormat = format;\n  }\n\n  getFormat(): string {\n    return this._dateFormat;\n  }\n\n  override format(date: Date, _displayFormat: Object): string {\n    return this.formatDate(date, this._dateFormat);\n  }\n\n  override parse(value: any): Date | null {\n    if (typeof value === 'string' && value.length > 0) {\n      const parsed = this.parseDate(value, this._dateFormat);\n      if (parsed) return parsed;\n    }\n    return super.parse(value);\n  }\n\n  formatDate(date: Date, format: string): string {\n    // Shared token formatter: handles dd / MM / MMM / yyyy, and matches longer\n    // tokens first so MMM is not half-consumed by the MM rule.\n    return formatDateWithPattern(date, format);\n  }\n\n  toDateOnlyString(date: Date): string {\n    const year = date.getFullYear();\n    const month = String(date.getMonth() + 1).padStart(2, '0');\n    const day = String(date.getDate()).padStart(2, '0');\n    return `${year}-${month}-${day}`;\n  }\n\n  private parseDate(value: string, format: string): Date | null {\n    // Shared token parser: builds a regex from the pattern, so a month name and\n    // patterns using a space or comma parse as readily as a dashed numeric one.\n    return parseDateWithPattern(value, format);\n  }\n}\n\nexport function getEruDateFormats() {\n  return {\n    parse: {\n      dateInput: 'custom',\n    },\n    display: {\n      dateInput: 'custom',\n      monthYearLabel: { year: 'numeric', month: 'short' },\n      dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\n      monthYearA11yLabel: { year: 'numeric', month: 'long' },\n    },\n  };\n}\n","import { Component, ViewChild, ViewEncapsulation, effect, inject, signal, computed, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatDatepickerModule, MatDatepicker } from '@angular/material/datepicker';\nimport { DateAdapter, MAT_DATE_FORMATS, MatNativeDateModule } from '@angular/material/core';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\nimport { EruDateAdapter, DATE_FORMAT_OPTIONS, getEruDateFormats, normalizeDateFormat } from './eru-date-adapter';\nimport { formatDateWithPattern } from 'eru-grid';\n\n@Component({\n  selector: 'eru-date',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatInputModule,\n    MatDatepickerModule,\n    MatNativeDateModule\n  ],\n  providers: [\n    { provide: DateAdapter, useClass: EruDateAdapter },\n    { provide: MAT_DATE_FORMATS, useFactory: getEruDateFormats },\n  ],\n  templateUrl: './date.component.html',\n  styleUrl: './date.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class DateComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  @ViewChild('picker') datepicker!: MatDatepicker<Date>;\n\n  override targetElementSelector = '[data-eru-target=\"date-input\"]';\n\n  private dateAdapter = inject(DateAdapter) as EruDateAdapter;\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  /** The configured Default Date, resolved. Blank unless a Default Date anchor\n   *  is selected, so a non-date Default Value is never rendered as one. */\n  readonly defaultDatePreview = computed(() => {\n    if (!this.getProperty('default_value_mode')) return '';\n    return this.resolveDefaultValue() ?? '';\n  });\n\n  /**\n   * What the control shows. Page data wins once it holds a value, but the\n   * resolved Default Date fills in while it does not — which is what makes the\n   * configured default visible on the designer canvas (where nothing is ever\n   * written to page data) and on fields with no Name (no page-data slot to seed).\n   */\n  readonly controlValue = computed(() => this.controlValueFor(this.storeValue()) ?? '');\n\n  /**\n   * The store keeps `yyyy-MM-dd`, always — whatever `date_format` this control\n   * displays. The format is a presentation choice; letting it decide how the\n   * value is written means the same field persists as '17-09-2026' on one page\n   * and '2026-09-17' on another, and neither sorts or compares as a date.\n   *\n   * Every route in is canonicalised, not just the `Date` the picker hands over:\n   * a date TYPED into the input arrives as a string in the display format, and\n   * that used to be stored verbatim. `toDisplayDate` already knows all the\n   * shapes a value can arrive in, so it does the parsing.\n   *\n   * Unparseable input passes through untouched, so a half-typed date is not\n   * destroyed mid-edit. Converting the picker's `Date` here is also what stops\n   * it being announced as a UTC instant, which read as the previous day\n   * anywhere east of UTC.\n   */\n  protected override storeValueFor(controlValue: any): any {\n    if (controlValue === null || controlValue === undefined || controlValue === '') return controlValue;\n    const parsed = this.toDisplayDate(controlValue);\n    return parsed ? this.dateAdapter.toDateOnlyString(parsed) : controlValue;\n  }\n\n  /** The canonical `yyyy-MM-dd`, which is what page data and the save payload\n   *  carry. `get_formatted_value()` is the same value under `date_format`. */\n  override get_value(): any {\n    return this.storeValueFor(this.controlValue());\n  }\n\n  override get_formatted_value(): string {\n    return this.displayValue();\n  }\n\n  protected override controlValueFor(value: any): any {\n    // Only a value the picker can actually render counts as \"already set\". An\n    // unnamed field reads page data with an empty key, which yields the whole\n    // record list rather than a date — that must not suppress the default.\n    if (value instanceof Date) return value;\n    if (typeof value === 'number') return value;\n    if (typeof value === 'string' && value.trim() !== '') return value;\n    return this.defaultDatePreview() || '';\n  }\n\n  /**\n   * Text shown in view mode, formatted with the effective date format.\n   *\n   * Previously this returned the stored value verbatim — an ISO yyyy-MM-dd\n   * string — so view mode always looked like yyyy-mm-dd no matter what format\n   * was configured. Only the datepicker input was ever formatted, via the\n   * adapter, which made the setting appear to do nothing wherever a date was\n   * merely displayed.\n   */\n  readonly displayValue = computed(() => {\n    const raw = this.controlValue();\n    if (raw === null || raw === undefined || raw === '') return '';\n    const parsed = this.toDisplayDate(raw);\n    // Unparseable values are shown as-is rather than blanked, so bad data stays\n    // visible instead of silently disappearing.\n    return parsed ? formatDateWithPattern(parsed, this.effectiveDateFormat()) : String(raw);\n  });\n\n  /** Coerce a stored value to a Date: a Date, an epoch, an ISO string, or a\n   *  string already in the configured display format. */\n  private toDisplayDate(value: any): Date | null {\n    if (value instanceof Date) return isNaN(value.getTime()) ? null : value;\n    if (typeof value === 'number') {\n      const d = new Date(value);\n      return isNaN(d.getTime()) ? null : d;\n    }\n    if (typeof value !== 'string' || !value.trim()) return null;\n    const raw = value.trim();\n    const iso = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(raw);\n    if (iso) return new Date(Number(iso[1]), Number(iso[2]) - 1, Number(iso[3]));\n    const parsed = this.dateAdapter.parse(raw);\n    return (parsed instanceof Date && !isNaN(parsed.getTime())) ? parsed : null;\n  }\n\n  /**\n   * Display format: the component's own property wins, and the bound field's\n   * definition is the DEFAULT it falls back to.\n   *\n   * This deliberately inverts the usual inherited-key rule. How a date reads is\n   * a presentation choice belonging to the page, not a definition the model\n   * owns — the same field can legitimately show as MM-dd-yyyy on one page and\n   * dd-MM-yyyy on another. So the model seeds it and the author may override,\n   * rather than the model locking it. Normalised because the model stores the\n   * pattern uppercased.\n   */\n  readonly effectiveDateFormat = computed<string>(() => {\n    // Read the STORED property, not getProperty() — that substitutes the schema\n    // default, which would never be empty and so would never let the model's\n    // format through.\n    const own = normalizeDateFormat(this.getPropertyValue(this.component(), 'date_format', undefined));\n    if (own) return own;\n    return normalizeDateFormat((this.fieldValue() as any)?.date_format) || 'dd-MM-yyyy';\n  });\n\n  /**\n   * Weekdays the model allows picking, as 'Sun'..'Sat'. Empty means no\n   * restriction. Bound to the datepicker's filter so a field limited to\n   * business days cannot be given a weekend date on a page either.\n   */\n  readonly allowedDays = computed<string[]>(() => {\n    const raw = (this.fieldValue() as any)?.allow_days;\n    return Array.isArray(raw) ? raw.map((d: any) => String(d)) : [];\n  });\n\n  /** matDatepickerFilter: rejects a date whose weekday the model excludes. */\n  readonly dateFilter = computed(() => {\n    const allowed = this.allowedDays();\n    if (allowed.length === 0) return () => true;\n    const names = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n    const set = new Set(allowed);\n    return (d: Date | null) => !d || set.has(names[d.getDay()]);\n  });\n\n  constructor() {\n    super();\n    effect(() => {\n      this.dateAdapter.setFormat(this.effectiveDateFormat());\n    });\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  /**\n   * The seeded default is a relative rule, not a fixed date: an anchor\n   * (Current Date / First Day / Last Day of the month, or the Custom date typed\n   * in Default Value) shifted by the offset in days. Positive adds, negative\n   * subtracts — so Current Date with -7 is a week ago, First Day with +7 is the\n   * 8th. Emitted in the same yyyy-MM-dd form the picker writes. With no anchor\n   * selected the plain Default Value / data-model default applies as before.\n   */\n  protected override resolveDefaultValue(): any {\n    const anchorMode = this.getProperty('default_value_mode') || '';\n    if (!anchorMode) return super.resolveDefaultValue();\n    const anchor = this.anchorDate(anchorMode);\n    if (!anchor) return undefined;\n    // The offset shifts a relative anchor; a Custom date is already exact, so it\n    // is taken as-is (its offset field is hidden for the same reason).\n    if (anchorMode !== 'custom') {\n      const offset = Number(this.getProperty('default_value_offset_days'));\n      if (!isNaN(offset) && offset !== 0) {\n        anchor.setDate(anchor.getDate() + offset);\n      }\n    }\n    return this.dateAdapter.toDateOnlyString(anchor);\n  }\n\n  /** Resolve the anchor a default is measured from. Returns null when a Custom\n   *  anchor is selected but its date cannot be read. */\n  private anchorDate(mode: string): Date | null {\n    const today = new Date();\n    switch (mode) {\n      case 'current_date':\n        return new Date(today.getFullYear(), today.getMonth(), today.getDate());\n      case 'first_day':\n        return new Date(today.getFullYear(), today.getMonth(), 1);\n      case 'last_day':\n        return new Date(today.getFullYear(), today.getMonth() + 1, 0);\n      case 'custom':\n        // The Custom Default Date picker owns this; fall back to the generic\n        // Default Value property for grids/pages configured before it existed.\n        return this.parseCustomDate(this.getProperty('default_date_custom'))\n          ?? this.parseCustomDate(super.resolveDefaultValue());\n      default:\n        return null;\n    }\n  }\n\n  /** Accept a Custom default in the component's display format (as typed in the\n   *  panel) or as an ISO yyyy-MM-dd string. */\n  private parseCustomDate(value: any): Date | null {\n    if (value instanceof Date) return isNaN(value.getTime()) ? null : value;\n    if (typeof value !== 'string' || !value.trim()) return null;\n    const raw = value.trim();\n    const parsed = this.dateAdapter.parse(raw);\n    if (parsed instanceof Date && !isNaN(parsed.getTime())) return parsed;\n    const iso = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(raw);\n    if (iso) return new Date(Number(iso[1]), Number(iso[2]) - 1, Number(iso[3]));\n    return null;\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onInputBlur(): void {\n    this.markControlAsTouched();\n    if (this.datepicker?.opened) return;\n    this.resetToDefaultMode();\n  }\n\n  onPickerClosed(): void {\n    this.resetToDefaultMode();\n  }\n\n  private resetToDefaultMode(): void {\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  onDateChange(event: any): void {\n    const date = event.value as Date;\n    if (date) {\n      const date_string = this.dateAdapter.toDateOnlyString(date);\n      this.onValueChange(date_string);\n    } else {\n      this.onValueChange(null);\n    }\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"date-input\"]',\n      'blur': '[data-eru-blur-target=\"date-input\"]',\n      'click': '[data-eru-click-target=\"date-input\"]'\n    };\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: 'Select date',\n        width: 2\n      },\n      {\n        key: 'date_format',\n        type: 'select',\n        label: 'Date Format',\n        category: 'behavior',\n        default_value: '',\n        options: DATE_FORMAT_OPTIONS,\n        width: 2,\n        description: 'How the date reads on this page. Leave blank to use the bound field\\'s format; pick one to override it here.'\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view when done.'\n      },\n      {\n        key: 'default_value_mode',\n        type: 'select',\n        label: 'Default Date',\n        category: 'behavior',\n        default_value: '',\n        options: [\n          { value: '', label: 'None' },\n          { value: 'current_date', label: 'Current Date' },\n          { value: 'first_day', label: 'First Day of Month' },\n          { value: 'last_day', label: 'Last Day of Month' },\n          { value: 'custom', label: 'Custom' }\n        ],\n        description: 'Date to seed into this field on page load. Custom takes the date from the Custom Default Date picker; None keeps the plain Default Value behaviour. With Value Source = state the seeded date is written INTO the bound state variable, so a filter that feeds a query through api_payload_fields sends a real date before the user touches it - without a default the variable is \"\" on first load and the query is called with an empty value.'\n      },\n      {\n        key: 'default_date_custom',\n        type: 'date',\n        label: 'Custom Default Date',\n        category: 'behavior',\n        default_value: '',\n        description: 'The fixed date to seed into this field.',\n        visible_if: { key: 'default_value_mode', equals: 'custom' }\n      },\n      {\n        key: 'default_value_offset_days',\n        type: 'number',\n        label: 'Default Date Offset (days)',\n        category: 'behavior',\n        default_value: null,\n        description: 'Days shifted from the Default Date — positive adds, negative subtracts. E.g. -7 with Current Date gives a week ago; 7 with First Day of Month gives the 8th.',\n        visible_if: { key: 'default_value_mode', in: ['current_date', 'first_day', 'last_day'] }\n      },\n    ];\n  }\n}\n","<div [ngStyle]=\"combinedStyles()\">\n  @if (currentMode() === 'view') {\n  <div class=\"eru-date-display\" [ngStyle]=\"displayContainerStyles()\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n    data-eru-target=\"date-display\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label date-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    @if (displayValue()) {\n    <span class=\"date-display-value\" [ngStyle]=\"displayValueStyles()\">{{ displayValue() }}</span>\n    } @else {\n    <span class=\"date-display-empty\">&mdash;</span>\n    }\n  </div>\n  } @else {\n  <mat-form-field\n    [appearance]=\"getProperty('appearance')\"\n    [class]=\"classes()\"\n    class=\"eru-date-form-field\"\n    eruCanvasEventHandler>\n    <mat-label>{{ getProperty('label') }}</mat-label>\n    @if (formControl) {\n      <input\n        type=\"text\"\n        matInput\n        [matDatepicker]=\"picker\"\n        [matDatepickerFilter]=\"dateFilter()\"\n        [placeholder]=\"getProperty('placeholder')\"\n        [required]=\"hasRequiredValidation()\"\n        [formControl]=\"formControl!\"\n        (dateChange)=\"onDateChange($event)\"\n        (blur)=\"onInputBlur()\"\n        readonly\n        data-eru-target=\"date-input\"\n        data-eru-focus-target=\"date-input\"\n        data-eru-blur-target=\"date-input\"\n        data-eru-click-target=\"date-input\">\n    } @else {\n      <input\n        type=\"text\"\n        matInput\n        [matDatepicker]=\"picker\"\n        [matDatepickerFilter]=\"dateFilter()\"\n        [placeholder]=\"getProperty('placeholder')\"\n        [required]=\"hasRequiredValidation()\"\n        [disabled]=\"isComponentDisabled()\"\n        [value]=\"controlValue()\"\n        (dateChange)=\"onDateChange($event)\"\n        (blur)=\"onInputBlur()\"\n        readonly\n        data-eru-target=\"date-input\"\n        data-eru-focus-target=\"date-input\"\n        data-eru-blur-target=\"date-input\"\n        data-eru-click-target=\"date-input\">\n    }\n    <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n    <mat-datepicker #picker (closed)=\"onPickerClosed()\"></mat-datepicker>\n    @if (validationErrors().length > 0) {\n      <mat-error>{{ validationErrors()[0] }}</mat-error>\n    }\n  </mat-form-field>\n  }\n</div>\n","import { ChangeDetectionStrategy, Component, EventEmitter, input, Output, signal, ViewEncapsulation } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n  selector: 'eru-time-picker-panel',\n  templateUrl: './time-picker-panel.component.html',\n  styleUrl: './time-picker-panel.component.scss',\n  standalone: true,\n  imports: [MatButtonModule, MatIconModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None\n})\nexport class TimePickerPanelComponent {\n  value = input<string>('00:00');\n\n  @Output() timeSelected = new EventEmitter<string>();\n  @Output() close = new EventEmitter<void>();\n\n  selectedHour = signal<number>(0);\n  selectedMinute = signal<number>(0);\n\n  hours = Array.from({ length: 24 }, (_, i) => i);\n  minutes = Array.from({ length: 60 }, (_, i) => i);\n\n  constructor() {\n    const value = this.value();\n    if (value) {\n      const [hour, minute] = value.split(':').map(Number);\n      this.selectedHour.set(isNaN(hour) ? 0 : hour);\n      this.selectedMinute.set(isNaN(minute) ? 0 : minute);\n    }\n  }\n\n  onHourSelect(hour: number): void {\n    this.selectedHour.set(hour);\n    this.emitTime();\n  }\n\n  onMinuteSelect(minute: number): void {\n    this.selectedMinute.set(minute);\n    this.emitTime();\n  }\n\n  emitTime(): void {\n    const h = this.selectedHour();\n    const m = this.selectedMinute();\n    this.timeSelected.emit(`${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`);\n  }\n\n  onClose(): void {\n    this.close.emit();\n  }\n\n  isHourSelected(hour: number): boolean {\n    return this.selectedHour() === hour;\n  }\n\n  isMinuteSelected(minute: number): boolean {\n    return this.selectedMinute() === minute;\n  }\n\n  formatNumber(num: number): string {\n    return String(num).padStart(2, '0');\n  }\n}\n","<div class=\"time-picker-panel\">\n  <div class=\"time-picker-header\">\n    <span class=\"time-picker-title\">Select Time</span>\n    <button mat-icon-button class=\"close-button\" (click)=\"onClose()\" type=\"button\">\n      <mat-icon>close</mat-icon>\n    </button>\n  </div>\n\n  <div class=\"time-picker-content\">\n    <div class=\"time-column\">\n      <div class=\"time-column-header\">Hour</div>\n      <div class=\"time-scroll-container\">\n        @for (hour of hours; track hour) {\n          <button\n            type=\"button\"\n            class=\"time-option\"\n            [class.selected]=\"isHourSelected(hour)\"\n            (click)=\"onHourSelect(hour)\">\n            {{formatNumber(hour)}}\n          </button>\n        }\n      </div>\n    </div>\n\n    <div class=\"time-column\">\n      <div class=\"time-column-header\">Minute</div>\n      <div class=\"time-scroll-container\">\n        @for (minute of minutes; track minute) {\n          <button\n            type=\"button\"\n            class=\"time-option\"\n            [class.selected]=\"isMinuteSelected(minute)\"\n            (click)=\"onMinuteSelect(minute)\">\n            {{formatNumber(minute)}}\n          </button>\n        }\n      </div>\n    </div>\n  </div>\n</div>\n","import { Component, ViewChild, ViewEncapsulation, signal, computed, effect, inject, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatDatepickerModule, MatDatepicker } from '@angular/material/datepicker';\nimport { DateAdapter, MAT_DATE_FORMATS, MatNativeDateModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\nimport { TimePickerPanelComponent } from '../time-picker/time-picker-panel.component';\nimport { EruDateAdapter, getEruDateFormats, normalizeDateFormat } from '../date/eru-date-adapter';\nimport { DATETIME_FORMATS, formatDateWithPattern } from 'eru-grid';\n\n@Component({\n  selector: 'eru-datetime',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatInputModule,\n    MatDatepickerModule,\n    MatNativeDateModule,\n    MatIconModule,\n    MatButtonModule,\n    OverlayModule,\n    TimePickerPanelComponent\n  ],\n  providers: [\n    { provide: DateAdapter, useClass: EruDateAdapter },\n    { provide: MAT_DATE_FORMATS, useFactory: getEruDateFormats },\n  ],\n  templateUrl: './datetime.component.html',\n  styleUrl: './datetime.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class DatetimeComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  private dateAdapter = inject(DateAdapter) as EruDateAdapter;\n\n  /**\n   * Display format for the date half. The bound field's definition wins over\n   * the component's own property, and the model persists a datetime pattern\n   * under `date_format` (uppercased, e.g. DD-MM-YYYY HH:MM:SS) — the same key\n   * as a plain date — so only the leading date tokens are taken from it. The\n   * time half still renders as stored; this controls the date ordering, which\n   * is the part that actually differs between locales.\n   */\n  readonly effectiveDateFormat = computed<string>(() => {\n    // Only the leading date tokens are used; the time half renders as stored.\n    const pick = (raw: any) => normalizeDateFormat(String(raw ?? '').trim().split(/\\s+/)[0]);\n    // The component's own choice wins and the model supplies the default — how a\n    // date reads is a page-level presentation choice. Reads the STORED property\n    // so the schema default does not mask the model's value.\n    return pick(this.getPropertyValue(this.component(), 'datetime_format', undefined))\n      || pick((this.fieldValue() as any)?.date_format)\n      || 'dd-MM-yyyy';\n  });\n\n  @ViewChild('picker') datepicker!: MatDatepicker<Date>;\n\n  override targetElementSelector = '[data-eru-target=\"datetime-input\"]';\n\n  isTimePanelOpen = signal(false);\n  timeValue = signal('');\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  readonly displayValue = computed(() => {\n    const date = this.storeValue();\n    const time = this.timeValue();\n    // Format the date half rather than echoing the stored ISO string, so the\n    // configured format shows in view mode and not only in the picker input.\n    const datePart = this.formatDatePart(date);\n    if (datePart && time) return `${datePart} ${time}`;\n    if (datePart) return datePart;\n    if (time) return time;\n    return '';\n  });\n\n  /** Stored date -> the configured display format. Unparseable values pass\n   *  through unchanged so bad data stays visible. */\n  private formatDatePart(value: any): string {\n    if (value === null || value === undefined || value === '') return '';\n    const d = this.toDateHalf(value);\n    return d ? formatDateWithPattern(d, this.effectiveDateFormat()) : String(value);\n  }\n\n  /**\n   * The date half of a value, in every shape one can arrive in: a `Date` from\n   * the picker, an epoch, the canonical `yyyy-MM-dd HH:mm:ss`, or a string in\n   * the configured display format.\n   *\n   * The time half is split off before the adapter is asked to parse, or a\n   * canonical value would fail to parse as a whole and the field would fall\n   * back to rendering its raw string.\n   */\n  private toDateHalf(value: any): Date | null {\n    if (value instanceof Date) return isNaN(value.getTime()) ? null : value;\n    if (typeof value === 'number') {\n      const n = new Date(value);\n      return isNaN(n.getTime()) ? null : n;\n    }\n    if (typeof value !== 'string' || !value.trim()) return null;\n    const raw = value.trim();\n    const iso = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(raw);\n    if (iso) return new Date(Number(iso[1]), Number(iso[2]) - 1, Number(iso[3]));\n    const parsed = this.dateAdapter.parse(raw.split(/\\s+/)[0]);\n    return (parsed instanceof Date && !isNaN(parsed.getTime())) ? parsed : null;\n  }\n\n  /** The time half of a stored value as `HH:mm:ss`, or '' when it carries none\n   *  (a legacy date-only value, or one saved before the time was persisted). */\n  private timePartOf(value: any): string {\n    if (typeof value !== 'string') return '';\n    const m = /(\\d{1,2}):(\\d{2})(?::(\\d{2}))?/.exec(value);\n    return m ? `${m[1].padStart(2, '0')}:${m[2]}:${m[3] ?? '00'}` : '';\n  }\n\n  /** A time from the picker as `HH:mm:ss`. Midnight when nothing is chosen, so\n   *  a date picked on its own still stores a whole datetime. */\n  private normalizeTimePart(time: any): string {\n    const m = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/.exec(String(time ?? '').trim());\n    return m ? `${m[1].padStart(2, '0')}:${m[2]}:${m[3] ?? '00'}` : '00:00:00';\n  }\n\n  /** The canonical `yyyy-MM-dd HH:mm:ss`, or the input untouched when its date\n   *  half cannot be parsed — bad data stays visible rather than being erased. */\n  private canonicalDateTime(dateValue: any, time: any): any {\n    const d = this.toDateHalf(dateValue);\n    if (!d) return dateValue;\n    return `${this.dateAdapter.toDateOnlyString(d)} ${this.normalizeTimePart(time)}`;\n  }\n\n  /**\n   * The store keeps `yyyy-MM-dd HH:mm:ss`, always — whatever `datetime_format`\n   * this control displays. The format is a presentation choice; letting it\n   * decide how the value is written means the same field persists as\n   * '17-09-2026' on one page and '2026-09-17' on another, and neither sorts nor\n   * compares as a datetime.\n   *\n   * This is also what makes the time durable. It used to live only in\n   * `timeValue`, a local signal the store never saw, so a time the user picked\n   * was absent from the save payload and gone on reload; folding it in here\n   * means the one write carries both halves.\n   */\n  protected override storeValueFor(controlValue: any): any {\n    if (controlValue === null || controlValue === undefined || controlValue === '') return controlValue;\n    return this.canonicalDateTime(controlValue, this.timeValue());\n  }\n\n  /** The picker owns the date half only — the time has its own field beside it,\n   *  so handing the control the canonical string would show it in both. */\n  protected override controlValueFor(value: any): any {\n    return this.toDateHalf(value) ?? value;\n  }\n\n  /** The canonical datetime, which is what page data and the save payload\n   *  carry. `get_formatted_value()` is the same value under the display format. */\n  override get_value(): any {\n    const stored = this.storeValue();\n    if (stored === null || stored === undefined || stored === '') return stored;\n    return this.canonicalDateTime(stored, this.timePartOf(stored) || this.timeValue());\n  }\n\n  override get_formatted_value(): string {\n    return this.displayValue();\n  }\n\n  constructor() {\n    super();\n    effect(() => {\n      this.dateAdapter.setFormat(this.effectiveDateFormat());\n    });\n    // Restore the time half from the stored value, so a reload shows the time\n    // that was saved instead of an empty time field beside a populated date.\n    effect(() => {\n      const time = this.timePartOf(this.storeValue());\n      untracked(() => {\n        if (time && time !== this.timeValue()) this.timeValue.set(time);\n      });\n    });\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onDateInputBlur(): void {\n    this.markControlAsTouched();\n    this.resetIfIdle();\n  }\n\n  private resetIfIdle(): void {\n    if (this.datepicker?.opened) return;\n    if (this.isTimePanelOpen()) return;\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"datetime-input\"]',\n      'blur': '[data-eru-blur-target=\"datetime-input\"]',\n      'click': '[data-eru-click-target=\"datetime-input\"]'\n    };\n  }\n\n  onPickerClosed(): void {\n    this.resetIfIdle();\n  }\n\n  onTimeInputClick(event: Event): void {\n    event.stopPropagation();\n    this.isTimePanelOpen.set(!this.isTimePanelOpen());\n  }\n\n  onTimeIconClick(event: Event): void {\n    event.stopPropagation();\n    this.isTimePanelOpen.set(!this.isTimePanelOpen());\n  }\n\n  onTimeBackdropClick(): void {\n    this.isTimePanelOpen.set(false);\n    this.resetIfIdle();\n  }\n\n  onTimeOverlayClick(event: Event): void {\n    event.stopPropagation();\n  }\n\n  onTimeSelected(time: string): void {\n    // Normalised, not the picker's raw 'HH:mm': the time field and the display\n    // both read this signal, and the value restored from the store on reload\n    // carries seconds — so leaving it raw made the same time read '14:30' just\n    // after picking and '14:30:00' once reloaded.\n    this.timeValue.set(this.normalizeTimePart(time));\n    // Persist it: the time is half the value, not a local display choice. Held\n    // back only until a date exists, since there is no datetime without one —\n    // storeValueFor folds this time in as soon as the date is picked.\n    const dateValue = this.storeValue() ?? this.formControl?.value ?? null;\n    if (this.toDateHalf(dateValue)) {\n      this.onValueChange(this.canonicalDateTime(dateValue, time));\n    }\n  }\n\n  onTimePanelClose(): void {\n    this.isTimePanelOpen.set(false);\n    this.resetIfIdle();\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: 'Select date and time',\n        width: 2\n      },\n      {\n        key: 'datetime_format',\n        type: 'select',\n        label: 'Date-Time Format',\n        category: 'behavior',\n        default_value: '',\n        options: DATETIME_FORMATS,\n        width: 2,\n        description: 'Ordering of the date half on this page. Leave blank to use the bound field\\'s format; pick one to override it here.'\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view when done.'\n      },\n    ];\n  }\n}\n","<div [ngStyle]=\"combinedStyles()\">\n  @if (currentMode() === 'view') {\n  <div class=\"eru-datetime-display\" [ngStyle]=\"displayContainerStyles()\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n    data-eru-target=\"datetime-display\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label datetime-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    @if (displayValue()) {\n    <span class=\"datetime-display-value\" [ngStyle]=\"displayValueStyles()\">{{ displayValue() }}</span>\n    } @else {\n    <span class=\"datetime-display-empty\">&mdash;</span>\n    }\n  </div>\n  } @else {\n  <div class=\"eru-datetime-input-container\" eruCanvasEventHandler>\n    <mat-form-field\n      [appearance]=\"getProperty('appearance') || 'outline'\"\n      class=\"eru-datetime-date-form-field\"\n      [class]=\"classes()\">\n      <mat-label>{{ getProperty('label') }}</mat-label>\n      @if (formControl) {\n        <input\n          type=\"text\"\n          matInput\n          [matDatepicker]=\"picker\"\n          [placeholder]=\"getProperty('placeholder') || 'dd-MM-yyyy'\"\n          [required]=\"hasRequiredValidation()\"\n          [formControl]=\"formControl!\"\n          (blur)=\"onDateInputBlur()\"\n          readonly\n          data-eru-target=\"datetime-input\"\n          data-eru-focus-target=\"datetime-input\"\n          data-eru-blur-target=\"datetime-input\"\n          data-eru-click-target=\"datetime-input\">\n      } @else {\n        <input\n          type=\"text\"\n          matInput\n          [matDatepicker]=\"picker\"\n          [placeholder]=\"getProperty('placeholder') || 'dd-MM-yyyy'\"\n          [required]=\"hasRequiredValidation()\"\n          [disabled]=\"isComponentDisabled()\"\n          [value]=\"storeValue() ?? ''\"\n          (blur)=\"onDateInputBlur()\"\n          readonly\n          data-eru-target=\"datetime-input\"\n          data-eru-focus-target=\"datetime-input\"\n          data-eru-blur-target=\"datetime-input\"\n          data-eru-click-target=\"datetime-input\">\n      }\n      <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n      <mat-datepicker #picker (closed)=\"onPickerClosed()\"></mat-datepicker>\n      @if (validationErrors().length > 0) {\n        <mat-error>{{ validationErrors()[0] }}</mat-error>\n      }\n    </mat-form-field>\n\n    <mat-form-field\n      [appearance]=\"getProperty('appearance') || 'outline'\"\n      class=\"datetime-time-field\">\n      <input\n        matInput\n        type=\"text\"\n        #timeInputRef\n        [value]=\"timeValue()\"\n        (click)=\"onTimeInputClick($event)\"\n        placeholder=\"HH:MM\"\n        [disabled]=\"isComponentDisabled()\"\n        readonly\n        cdkOverlayOrigin\n        #timeOrigin=\"cdkOverlayOrigin\">\n      <mat-icon matSuffix (click)=\"onTimeIconClick($event)\" style=\"cursor:pointer\">access_time</mat-icon>\n    </mat-form-field>\n\n    <ng-template\n      cdkConnectedOverlay\n      [cdkConnectedOverlayOrigin]=\"timeOrigin\"\n      [cdkConnectedOverlayOpen]=\"isTimePanelOpen()\"\n      [cdkConnectedOverlayHasBackdrop]=\"true\"\n      [cdkConnectedOverlayBackdropClass]=\"'time-picker-backdrop'\"\n      (backdropClick)=\"onTimeBackdropClick()\"\n      (detach)=\"onTimeBackdropClick()\">\n      <div class=\"eru-time-picker-overlay\" (click)=\"onTimeOverlayClick($event)\" (mousedown)=\"onTimeOverlayClick($event)\">\n        <eru-time-picker-panel\n          [value]=\"timeValue()\"\n          (timeSelected)=\"onTimeSelected($event)\"\n          (close)=\"onTimePanelClose()\">\n        </eru-time-picker-panel>\n      </div>\n    </ng-template>\n  </div>\n  }\n</div>\n","import { Component, ViewEncapsulation, signal, computed, effect, untracked, ViewChild, ElementRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\nimport { TimePickerPanelComponent } from './time-picker-panel.component';\n\n@Component({\n  selector: 'eru-time-picker',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatInputModule,\n    MatIconModule,\n    MatButtonModule,\n    OverlayModule,\n    TimePickerPanelComponent\n  ],\n  templateUrl: './time-picker.component.html',\n  styleUrl: './time-picker.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class TimePickerComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"time-input\"]';\n\n  isPanelOpen = signal(false);\n  timeValue = signal('');\n\n  @ViewChild('timeInputRef') timeInputRef!: ElementRef;\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  readonly displayValue = computed(() => {\n    const value = this.timeValue() || this.storeValue();\n    return value ?? '';\n  });\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  private resetToDefaultMode(): void {\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"time-input\"]',\n      'blur': '[data-eru-blur-target=\"time-input\"]',\n      'click': '[data-eru-click-target=\"time-input\"]',\n      'input': '[data-eru-target=\"time-input\"]'\n    };\n  }\n\n  onInputClick(event: Event): void {\n    event.stopPropagation();\n    this.isPanelOpen.set(!this.isPanelOpen());\n  }\n\n  onIconClick(event: Event): void {\n    event.stopPropagation();\n    this.isPanelOpen.set(!this.isPanelOpen());\n  }\n\n  onOverlayBackdropClick(): void {\n    this.isPanelOpen.set(false);\n    this.resetToDefaultMode();\n  }\n\n  onOverlayClick(event: Event): void {\n    event.stopPropagation();\n  }\n\n  onTimeSelected(time: string): void {\n    this.timeValue.set(time);\n  }\n\n  onPanelClose(): void {\n    this.isPanelOpen.set(false);\n    this.resetToDefaultMode();\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: 'HH:MM',\n        width: 2\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view when done.'\n      },\n    ];\n  }\n}\n","<div [ngStyle]=\"combinedStyles()\">\n  @if (currentMode() === 'view') {\n  <div class=\"time-picker-display\" [ngStyle]=\"displayContainerStyles()\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n    data-eru-target=\"time-display\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label time-picker-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    @if (displayValue()) {\n    <span class=\"time-picker-display-value\" [ngStyle]=\"displayValueStyles()\">{{ displayValue() }}</span>\n    } @else {\n    <span class=\"time-picker-display-empty\">&mdash;</span>\n    }\n  </div>\n  } @else {\n  <div class=\"eru-time-picker-container\" eruCanvasEventHandler>\n    <mat-form-field\n      [appearance]=\"getProperty('appearance') || 'outline'\"\n      class=\"eru-time-picker-field\"\n      [class]=\"classes()\">\n      @if (getProperty('label')) {\n        <mat-label>{{ getProperty('label') }}</mat-label>\n      }\n      <input\n        matInput\n        type=\"text\"\n        #timeInputRef\n        [value]=\"timeValue()\"\n        (click)=\"onInputClick($event)\"\n        [placeholder]=\"getProperty('placeholder') || 'HH:MM'\"\n        [required]=\"hasRequiredValidation()\"\n        [disabled]=\"isComponentDisabled()\"\n        readonly\n        data-eru-target=\"time-input\"\n        data-eru-focus-target=\"time-input\"\n        data-eru-blur-target=\"time-input\"\n        data-eru-click-target=\"time-input\"\n        cdkOverlayOrigin\n        #timeOrigin=\"cdkOverlayOrigin\">\n      <mat-icon matSuffix (click)=\"onIconClick($event)\" class=\"eru-time-picker-icon\">access_time</mat-icon>\n    </mat-form-field>\n\n    <ng-template\n      cdkConnectedOverlay\n      [cdkConnectedOverlayOrigin]=\"timeOrigin\"\n      [cdkConnectedOverlayOpen]=\"isPanelOpen()\"\n      [cdkConnectedOverlayHasBackdrop]=\"true\"\n      [cdkConnectedOverlayBackdropClass]=\"'time-picker-backdrop'\"\n      (backdropClick)=\"onOverlayBackdropClick()\"\n      (detach)=\"onOverlayBackdropClick()\">\n      <div class=\"eru-time-picker-overlay\" (click)=\"onOverlayClick($event)\" (mousedown)=\"onOverlayClick($event)\">\n        <eru-time-picker-panel\n          [value]=\"timeValue()\"\n          (timeSelected)=\"onTimeSelected($event)\"\n          (close)=\"onPanelClose()\">\n        </eru-time-picker-panel>\n      </div>\n    </ng-template>\n  </div>\n  }\n</div>\n","import { Component, ViewEncapsulation, signal, computed, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\n\n@Component({\n  selector: 'eru-duration',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatInputModule,\n    MatTabsModule,\n    OverlayModule\n  ],\n  templateUrl: './duration.component.html',\n  styleUrl: './duration.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class DurationComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"duration-input\"]';\n\n  isOverlayOpen = signal(false);\n  selectedTab = signal(0);\n  manualMinutes = signal(0);\n  startTime = signal('');\n  endTime = signal('');\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"duration-input\"]',\n      'blur': '[data-eru-blur-target=\"duration-input\"]',\n      'click': '[data-eru-click-target=\"duration-input\"]',\n      'input': '[data-eru-target=\"duration-input\"]'\n    };\n  }\n\n  toggleOverlay(): void {\n    this.isOverlayOpen.set(!this.isOverlayOpen());\n  }\n\n  onCellClick(): void {\n    if (this.store.editMode()) return;\n    if (this.isComponentDisabled()) return;\n    if (this.currentMode() !== 'edit') return;\n    this.isOverlayOpen.set(true);\n  }\n\n  onCellDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n    this.isOverlayOpen.set(true);\n  }\n\n  private resetToDefaultMode(): void {\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  onOverlayBackdropClick(): void {\n    this.isOverlayOpen.set(false);\n    this.resetToDefaultMode();\n  }\n\n  onOverlayClick(event: Event): void {\n    event.stopPropagation();\n  }\n\n  onTabChange(index: number): void {\n    this.selectedTab.set(index);\n  }\n\n  onManualMinutesChange(value: number): void {\n    this.manualMinutes.set(value);\n  }\n\n  onStartTimeChange(value: string): void {\n    this.startTime.set(value);\n    this.calculateDuration();\n  }\n\n  onEndTimeChange(value: string): void {\n    this.endTime.set(value);\n    this.calculateDuration();\n  }\n\n  calculateDuration(): void {\n    const start = this.startTime();\n    const end = this.endTime();\n    if (!start || !end) return;\n    const [sh, sm] = start.split(':').map(Number);\n    const [eh, em] = end.split(':').map(Number);\n    const startMins = sh * 60 + sm;\n    const endMins = eh * 60 + em;\n    if (endMins >= startMins) {\n      this.manualMinutes.set(endMins - startMins);\n    }\n  }\n\n  formatDuration(minutes: number): string {\n    if (!minutes) return '0m';\n    const h = Math.floor(minutes / 60);\n    const m = minutes % 60;\n    if (h > 0 && m > 0) return `${h}h ${m}m`;\n    if (h > 0) return `${h}h`;\n    return `${m}m`;\n  }\n\n  getDisplayValue(): string {\n    const val = this.storeValue() || this.getProperty('placeholder') || '';\n    return String(val);\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: '00:00:00',\n        width: 2\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view when done.'\n      },\n    ];\n  }\n}\n","<div [ngStyle]=\"combinedStyles()\" class=\"eru-duration-overlay-container\">\n  <div\n    class=\"eru-duration-cell-wrapper\" [ngStyle]=\"displayContainerStyles()\"\n    cdkOverlayOrigin\n    #durationTrigger=\"cdkOverlayOrigin\"\n    [class]=\"classes()\"\n    [class.eru-inline-editable]=\"canInlineEdit()\"\n    eruCanvasEventHandler\n    data-eru-target=\"duration-input\"\n    data-eru-focus-target=\"duration-input\"\n    data-eru-blur-target=\"duration-input\"\n    data-eru-click-target=\"duration-input\"\n    (click)=\"onCellClick()\"\n    (dblclick)=\"onCellDoubleClick()\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label duration-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    <div class=\"eru-duration-display\">\n      {{ getDisplayValue() }}\n    </div>\n  </div>\n\n  <ng-template\n    cdkConnectedOverlay\n    [cdkConnectedOverlayOrigin]=\"durationTrigger\"\n    [cdkConnectedOverlayOpen]=\"isOverlayOpen()\"\n    [cdkConnectedOverlayHasBackdrop]=\"true\"\n    [cdkConnectedOverlayBackdropClass]=\"'duration-backdrop'\"\n    (backdropClick)=\"onOverlayBackdropClick()\"\n    (detach)=\"onOverlayBackdropClick()\">\n    <div class=\"eru-duration-editor\" (click)=\"onOverlayClick($event)\">\n      <mat-tab-group\n        [selectedIndex]=\"selectedTab()\"\n        (selectedIndexChange)=\"onTabChange($event)\"\n        class=\"eru-duration-tabs\">\n        <mat-tab label=\"Manual\">\n          <div class=\"eru-duration-tab-content\">\n            <mat-form-field appearance=\"outline\" class=\"eru-duration-input-field\">\n              <mat-label>Minutes</mat-label>\n              <input\n                matInput\n                type=\"number\"\n                [ngModel]=\"manualMinutes()\"\n                (ngModelChange)=\"onManualMinutesChange($event)\"\n                [placeholder]=\"getProperty('placeholder') || ''\"\n                min=\"0\">\n            </mat-form-field>\n            <div class=\"eru-duration-preview\">\n              {{ formatDuration(manualMinutes()) }}\n            </div>\n          </div>\n        </mat-tab>\n\n        <mat-tab label=\"Range\">\n          <div class=\"eru-duration-tab-content\">\n            <div class=\"eru-time-range-container\" (click)=\"$event.stopPropagation()\">\n              <mat-form-field appearance=\"outline\" class=\"eru-time-picker-wrapper\">\n                <mat-label>Start Time</mat-label>\n                <input matInput type=\"time\" [ngModel]=\"startTime()\" (ngModelChange)=\"onStartTimeChange($event)\">\n              </mat-form-field>\n\n              <span class=\"eru-time-separator\">-</span>\n\n              <mat-form-field appearance=\"outline\" class=\"eru-time-picker-wrapper\">\n                <mat-label>End Time</mat-label>\n                <input matInput type=\"time\" [ngModel]=\"endTime()\" (ngModelChange)=\"onEndTimeChange($event)\">\n              </mat-form-field>\n            </div>\n            <div class=\"eru-duration-preview\">\n              Duration: {{ formatDuration(manualMinutes()) }}\n            </div>\n          </div>\n        </mat-tab>\n      </mat-tab-group>\n    </div>\n  </ng-template>\n</div>\n","import { Component, ViewEncapsulation, signal, computed, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\n\n@Component({\n  selector: 'eru-website',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatInputModule\n  ],\n  templateUrl: './website.component.html',\n  styleUrl: './website.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class WebsiteComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"website-input\"]';\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  readonly displayValue = computed(() => {\n    const value = this.storeValue();\n    return value ?? '';\n  });\n\n  /**\n   * Render the value as a clickable link in view mode. `is_hyp` and `hypl_nm`\n   * are the data model's keys, already honoured by the grid's website cell —\n   * without them a page showed the raw URL where a grid showed a link.\n   */\n  readonly isHyperlink = computed<boolean>(() => !!this.modelOrProperty('is_hyp'));\n\n  /** Link text: the configured label, falling back to the URL itself. */\n  readonly hyperlinkLabel = computed<string>(() => {\n    const label = this.modelOrProperty('hypl_nm');\n    const text = label !== undefined && label !== null ? String(label).trim() : '';\n    return text.length > 0 ? text : String(this.displayValue());\n  });\n\n  /**\n   * Absolute href. A stored value is often bare (\"example.com\"), which a\n   * browser would resolve relative to the app and navigate in-page.\n   */\n  readonly hyperlinkHref = computed<string>(() => {\n    const raw = String(this.displayValue()).trim();\n    if (!raw) return '';\n    return /^[a-z][a-z0-9+.-]*:\\/\\//i.test(raw) ? raw : `https://${raw}`;\n  });\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"website-input\"]',\n      'blur': '[data-eru-blur-target=\"website-input\"]',\n      'click': '[data-eru-click-target=\"website-input\"]',\n      'input': '[data-eru-target=\"website-input\"]'\n    };\n  }\n\n  // No click-to-open on the edit input. Opening the link was bound to the\n  // input's own click, so putting the cursor in the field to type navigated\n  // away instead — the field could not be edited at all. Following a link is\n  // view-mode behaviour, and view mode already renders a real anchor.\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onInputBlur(): void {\n    this.markControlAsTouched();\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: 'https://example.com',\n        width: 2\n      },\n      {\n        key: 'is_hyp',\n        type: 'boolean',\n        label: 'Show As Hyperlink',\n        category: 'behavior',\n        default_value: false,\n        description: 'Render the value as a clickable link in view mode. Taken from the data model when the field is bound.'\n      },\n      {\n        key: 'hypl_nm',\n        type: 'text',\n        label: 'Hyperlink Label',\n        category: 'content',\n        default_value: '',\n        description: 'Text shown instead of the URL. Blank shows the URL itself.',\n        visible_if: { key: 'is_hyp', equals: true }\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view (on blur).'\n      },\n    ];\n  }\n}\n\n","<div [ngStyle]=\"combinedStyles()\">\n  @if (currentMode() === 'view') {\n  <div class=\"eru-website-display\" [ngStyle]=\"displayContainerStyles()\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n    data-eru-target=\"website-display\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label website-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    @if (displayValue()) {\n      @if (isHyperlink()) {\n      <a class=\"website-display-value website-display-link\"\n        [href]=\"hyperlinkHref()\"\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        (click)=\"$event.stopPropagation()\">{{ hyperlinkLabel() }}</a>\n      } @else {\n      <span class=\"website-display-value\" [ngStyle]=\"displayValueStyles()\">{{ displayValue() }}</span>\n      }\n    } @else {\n    <span class=\"website-display-empty\">&mdash;</span>\n    }\n  </div>\n  } @else {\n  <mat-form-field\n    [appearance]=\"getProperty('appearance')\"\n    [class]=\"classes()\"\n    class=\"eru-website-form-field\"\n    [class.eru-has-error]=\"validationErrors().length > 0\"\n    eruCanvasEventHandler>\n    <mat-label>{{ getProperty('label') }}</mat-label>\n    @if (formControl) {\n      <input\n        matInput\n        type=\"url\"\n        [placeholder]=\"getProperty('placeholder')\"\n        [required]=\"hasRequiredValidation()\"\n        [formControl]=\"formControl!\"\n        (blur)=\"onInputBlur()\"\n        data-eru-target=\"website-input\"\n        data-eru-focus-target=\"website-input\"\n        data-eru-blur-target=\"website-input\"\n        data-eru-click-target=\"website-input\">\n    } @else {\n      <input\n        matInput\n        type=\"url\"\n        [placeholder]=\"getProperty('placeholder')\"\n        [required]=\"hasRequiredValidation()\"\n        [disabled]=\"isComponentDisabled()\"\n        [value]=\"storeValue() ?? ''\"\n        (input)=\"onValueChange($any($event.target).value)\"\n        (blur)=\"onInputBlur()\"\n        data-eru-target=\"website-input\"\n        data-eru-focus-target=\"website-input\"\n        data-eru-blur-target=\"website-input\"\n        data-eru-click-target=\"website-input\">\n    }\n    @if (validationErrors().length > 0) {\n      <mat-error>{{ validationErrors()[0] }}</mat-error>\n    }\n  </mat-form-field>\n  }\n</div>\n","import { Component, computed, ViewEncapsulation, signal, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\n\n@Component({\n  selector: 'eru-textarea',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatInputModule,\n    MatTooltipModule\n  ],\n  templateUrl: './textarea.component.html',\n  styleUrl: './textarea.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class TextareaComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"textarea-input\"]';\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  readonly displayValue = computed(() => {\n    const value = this.storeValue();\n    return value ?? '';\n  });\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"textarea-input\"]',\n      'blur': '[data-eru-blur-target=\"textarea-input\"]',\n      'click': '[data-eru-click-target=\"textarea-input\"]',\n      'input': '[data-eru-target=\"textarea-input\"]'\n    };\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onInputBlur(): void {\n    this.markControlAsTouched();\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  readonly rows = computed(() => {\n    const rowsValue = this.getProperty('rows');\n    if (rowsValue !== null && rowsValue !== undefined && !isNaN(Number(rowsValue))) {\n      return Number(rowsValue);\n    }\n    return 3;\n  });\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: '',\n        width: 2\n      },\n      {\n        key: 'rows',\n        type: 'number',\n        label: 'Rows',\n        category: 'behavior',\n        default_value: 3,\n        min: 1,\n        max: 20,\n        responsive: true,\n        description: 'Visible lines of text. Set per viewport — a form that wants six rows on a desktop rarely wants six on a phone.'\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view (on blur).'\n      },\n    ];\n  }\n}\n\n","<div [ngStyle]=\"combinedStyles()\">\n  @if (currentMode() === 'view') {\n  <div class=\"eru-textarea-display\" [ngStyle]=\"displayContainerStyles()\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n    data-eru-target=\"textarea-display\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label textarea-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    @if (displayValue()) {\n    <span class=\"textarea-display-value\" [ngStyle]=\"displayValueStyles()\">{{ displayValue() }}</span>\n    } @else {\n    <span class=\"textarea-display-empty\">&mdash;</span>\n    }\n  </div>\n  } @else {\n  <mat-form-field\n    [appearance]=\"getProperty('appearance')\"\n    [class]=\"classes()\"\n    class=\"eru-textarea-form-field\"\n    [class.eru-has-error]=\"validationErrors().length > 0\"\n    eruCanvasEventHandler>\n    <mat-label>{{ getProperty('label') }}</mat-label>\n    @if (formControl) {\n      <textarea\n        matInput\n        [placeholder]=\"getProperty('placeholder')\"\n        [required]=\"hasRequiredValidation()\"\n        [formControl]=\"formControl!\"\n        [rows]=\"rows()\"\n        (blur)=\"onInputBlur()\"\n        data-eru-target=\"textarea-input\"\n        data-eru-focus-target=\"textarea-input\"\n        data-eru-blur-target=\"textarea-input\"\n        data-eru-click-target=\"textarea-input\"></textarea>\n    } @else {\n      <textarea\n        matInput\n        [placeholder]=\"getProperty('placeholder')\"\n        [required]=\"hasRequiredValidation()\"\n        [disabled]=\"isComponentDisabled()\"\n        [rows]=\"rows()\"\n        [value]=\"storeValue() ?? ''\"\n        (input)=\"onValueChange($any($event.target).value)\"\n        (blur)=\"onInputBlur()\"\n        data-eru-target=\"textarea-input\"\n        data-eru-focus-target=\"textarea-input\"\n        data-eru-blur-target=\"textarea-input\"\n        data-eru-click-target=\"textarea-input\"></textarea>\n    }\n    @if (validationErrors().length > 0) {\n      <mat-error>{{ validationErrors()[0] }}</mat-error>\n    }\n  </mat-form-field>\n  }\n</div>\n","import { Component, ViewEncapsulation, signal, computed, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\n\n@Component({\n  selector: 'eru-textbox',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatInputModule,\n    MatIconModule\n  ],\n  templateUrl: './textbox.component.html',\n  styleUrl: './textbox.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class TextboxComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"textbox-input\"]';\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  readonly displayValue = computed(() => {\n    const value = this.storeValue();\n    return value ?? '';\n  });\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"textbox-input\"]',\n      'blur': '[data-eru-blur-target=\"textbox-input\"]',\n      'click': '[data-eru-click-target=\"textbox-input\"]',\n      'input': '[data-eru-target=\"textbox-input\"]'\n    };\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onInputBlur(): void {\n    this.markControlAsTouched();\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: '',\n        width: 2\n      },\n      {\n        key: 'prefix_icon',\n        type: 'text',\n        label: 'Prefix Icon',\n        category: 'content',\n        default_value: '',\n        description: 'Material icon name shown before the input (e.g. search, person)'\n      },\n      {\n        key: 'suffix_icon',\n        type: 'text',\n        label: 'Suffix Icon',\n        category: 'content',\n        default_value: '',\n        description: 'Material icon name shown after the input (e.g. visibility, close)'\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view (on blur).'\n      },\n      ...this.textOverflowPropertySchema()\n    ];\n  }\n}\n\n","<div [ngStyle]=\"combinedStyles()\">\n  @if (currentMode() === 'view') {\n  <div class=\"eru-textbox-display\" [ngStyle]=\"displayContainerStyles()\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n    data-eru-target=\"textbox-display\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label eru-textbox-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    <span class=\"eru-textbox-display-row\">\n      @if (getProperty('prefix_icon')) {\n      <mat-icon class=\"eru-textbox-display-icon\">{{ getProperty('prefix_icon') }}</mat-icon>\n      }\n      @if (displayValue()) {\n      <span class=\"eru-textbox-display-value\" [ngStyle]=\"valueTextStyles()\"\n        [attr.title]=\"textOverflowMode() === 'wrap' ? null : displayValue()\">{{ displayValue() }}</span>\n      } @else {\n      <span class=\"eru-textbox-display-empty\">&mdash;</span>\n      }\n      @if (getProperty('suffix_icon')) {\n      <mat-icon class=\"eru-textbox-display-icon\">{{ getProperty('suffix_icon') }}</mat-icon>\n      }\n    </span>\n  </div>\n  } @else {\n  <mat-form-field [appearance]=\"getProperty('appearance')\" [class]=\"classes()\" class=\"eru-textbox-form-field\"\n    [class.eru-has-error]=\"validationErrors().length > 0\" eruCanvasEventHandler>\n    <mat-label>{{ getProperty('label') }}</mat-label>\n    @if (getProperty('prefix_icon')) {\n    <mat-icon matPrefix>{{ getProperty('prefix_icon') }}</mat-icon>\n    }\n    @if (getProperty('suffix_icon')) {\n    <mat-icon matSuffix>{{ getProperty('suffix_icon') }}</mat-icon>\n    }\n    @if (formControl) {\n    <input matInput type=\"text\" [placeholder]=\"getProperty('placeholder')\" [required]=\"hasRequiredValidation()\"\n      [formControl]=\"formControl!\" (blur)=\"onInputBlur()\" data-eru-target=\"textbox-input\"\n      data-eru-focus-target=\"textbox-input\" data-eru-blur-target=\"textbox-input\" data-eru-click-target=\"textbox-input\">\n    } @else {\n    <input matInput type=\"text\" [placeholder]=\"getProperty('placeholder')\" [required]=\"hasRequiredValidation()\"\n      [disabled]=\"isComponentDisabled()\" [value]=\"storeValue() ?? ''\"\n      (input)=\"onValueChange($any($event.target).value)\" (blur)=\"onInputBlur()\" data-eru-target=\"textbox-input\"\n      data-eru-focus-target=\"textbox-input\" data-eru-blur-target=\"textbox-input\" data-eru-click-target=\"textbox-input\">\n    }\n    @if (validationErrors().length > 0) {\n    <mat-error>{{ validationErrors()[0] }}</mat-error>\n    }\n  </mat-form-field>\n  }\n</div>\n","import { Component, ViewEncapsulation, signal, computed, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\n\n@Component({\n  selector: 'eru-checkbox',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    CanvasEventHandlerDirective,\n    MatCheckboxModule,\n    MatIconModule\n  ],\n  templateUrl: './checkbox.component.html',\n  styleUrl: './checkbox.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class CheckboxComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"checkbox\"]';\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  private toBool(v: any): boolean {\n    if (typeof v === 'boolean') return v;\n    if (typeof v === 'number') return v !== 0;\n    if (typeof v === 'string') {\n      const s = v.trim().toLowerCase();\n      return s === 'true' || s === '1' || s === 'yes' || s === 'on' || s === 'checked';\n    }\n    return !!v;\n  }\n\n  // When `value_true`/`value_false` are configured, the backend may represent\n  // the checkbox with arbitrary values (e.g. \"Y\"/\"N\") instead of a real\n  // boolean. Left blank, both fall through to the generic toBool() heuristic.\n  private hasConfiguredValues(): boolean {\n    const valueTrue = this.getProperty('value_true');\n    const valueFalse = this.getProperty('value_false');\n    const hasTrue = valueTrue !== undefined && valueTrue !== null && String(valueTrue).length > 0;\n    const hasFalse = valueFalse !== undefined && valueFalse !== null && String(valueFalse).length > 0;\n    return hasTrue || hasFalse;\n  }\n\n  private resolveCheckboxState(raw: any): boolean {\n    const valueTrue = this.getProperty('value_true');\n    const valueFalse = this.getProperty('value_false');\n    const hasTrue = valueTrue !== undefined && valueTrue !== null && String(valueTrue).length > 0;\n    const hasFalse = valueFalse !== undefined && valueFalse !== null && String(valueFalse).length > 0;\n    if (!hasTrue && !hasFalse) return this.toBool(raw);\n    if (hasTrue && String(raw) === String(valueTrue)) return true;\n    if (hasFalse && String(raw) === String(valueFalse)) return false;\n    if (hasTrue && !hasFalse) return false;\n    if (hasFalse && !hasTrue) return true;\n    return this.toBool(raw);\n  }\n\n  // Inverse of resolveCheckboxState: maps a UI boolean back to the configured\n  // true/false representation before it's written to page data/state.\n  private checkboxValueFor(checked: boolean): any {\n    const valueTrue = this.getProperty('value_true');\n    const valueFalse = this.getProperty('value_false');\n    const hasTrue = valueTrue !== undefined && valueTrue !== null && String(valueTrue).length > 0;\n    const hasFalse = valueFalse !== undefined && valueFalse !== null && String(valueFalse).length > 0;\n    if (!hasTrue && !hasFalse) return checked;\n    if (checked) return hasTrue ? valueTrue : true;\n    return hasFalse ? valueFalse : false;\n  }\n\n  readonly displayChecked = computed(() => this.resolveCheckboxState(this.storeValue()));\n\n  readonly resolvedChecked = computed(() => this.resolveCheckboxState(this.storeValue()));\n\n  protected override onValueChange(checked: boolean): void {\n    super.onValueChange(this.checkboxValueFor(checked));\n  }\n\n  protected override controlValueFor(value: any): any {\n    return this.resolveCheckboxState(value);\n  }\n\n  protected override storeValueFor(controlValue: any): any {\n    return this.checkboxValueFor(this.toBool(controlValue));\n  }\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n\n    // Y/N is only applied on the way out of the checkbox, so a state variable\n    // or record field that starts as a real boolean keeps that boolean until\n    // someone clicks the box — and every payload built straight off the state\n    // key (a grid's query_payload_fields, say) sent true/false instead of the\n    // configured Y/N. Rewrite the store's own value once, so the configured\n    // representation holds whether or not the checkbox is ever touched. A blank\n    // value is left alone: nothing was chosen, and 'N' is a choice.\n    //\n    // Runs on the designer canvas too — the author sets value_true there and\n    // watches the grid beside it reload, and a click already writes to state in\n    // edit mode. Only the runtime state value is touched, never the declared\n    // initial value in the page definition.\n    effect(() => {\n      const raw = this.storeValue();\n      untracked(() => {\n        if (typeof raw !== 'boolean') return;\n        if (this.rowContext?.hasRow()) return;\n        if (!this.hasConfiguredValues()) return;\n        this.writeStoreValue(this.checkboxValueFor(raw));\n      });\n    });\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onCheckChange(checked: boolean): void {\n    this.onValueChange(checked);\n    this.resetToDefaultMode();\n  }\n\n  private resetToDefaultMode(): void {\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'change': '[data-eru-target=\"checkbox\"]',\n      'click': '[data-eru-target=\"checkbox\"]'\n    };\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'label',\n        type: 'text',\n        label: 'Label',\n        category: 'content',\n        default_value: 'Checkbox Label',\n        width: 2\n      },\n      {\n        key: 'value_true',\n        type: 'text',\n        label: 'Value For True',\n        category: 'content',\n        default_value: '',\n        description: 'Backend value that represents \"checked\" (e.g. Y, Yes). Leave blank to use true/false.'\n      },\n      {\n        key: 'value_false',\n        type: 'text',\n        label: 'Value For False',\n        category: 'content',\n        default_value: '',\n        description: 'Backend value that represents \"unchecked\" (e.g. N, No). Leave blank to use true/false.'\n      },\n      {\n        key: 'color',\n        type: 'select',\n        label: 'Color',\n        category: 'behavior',\n        default_value: 'primary',\n        options: [\n          { value: 'primary', label: 'Primary' },\n          { value: 'accent', label: 'Accent' },\n          { value: 'warn', label: 'Warn' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view when done.'\n      },\n    ];\n  }\n}\n","<div [ngStyle]=\"combinedStyles()\" class=\"checkbox-shell\">\n  @if (currentMode() === 'view') {\n    <div class=\"checkbox-display\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n      data-eru-target=\"checkbox-display\">\n      <mat-icon class=\"checkbox-display-icon\">{{ displayChecked() ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n      <span class=\"eru-display-label checkbox-display-label\">{{ getProperty('label') }}</span>\n    </div>\n  } @else if (formControl) {\n    <mat-checkbox\n      [formControl]=\"formControl!\"\n      [color]=\"getProperty('color')\"\n      [class]=\"classes()\"\n      (change)=\"onCheckChange($event.checked)\"\n      eruCanvasEventHandler\n      data-eru-target=\"checkbox\">\n      {{ getProperty('label') }}\n    </mat-checkbox>\n  } @else {\n    <mat-checkbox\n      [checked]=\"resolvedChecked()\"\n      [disabled]=\"isComponentDisabled()\"\n      [color]=\"getProperty('color')\"\n      [class]=\"classes()\"\n      (change)=\"onCheckChange($event.checked)\"\n      eruCanvasEventHandler\n      data-eru-target=\"checkbox\">\n      {{ getProperty('label') }}\n    </mat-checkbox>\n  }\n</div>\n","import { Component, signal, computed, ViewEncapsulation, effect, untracked, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatSelect, MatSelectModule } from '@angular/material/select';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { PropertySchema, SelectOption } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\nimport { parsePayloadField } from '../../utils/payload-field.util';\nimport { timestamp } from 'rxjs';\nimport { ChipListComponent } from 'eru-grid';\n\n@Component({\n  selector: 'eru-select',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatSelectModule,\n    MatFormFieldModule,\n    MatInputModule\n  ,\n    ChipListComponent],\n  templateUrl: './select.component.html',\n  styleUrl: './select.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class SelectComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  searchText = signal<string>('');\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  readonly displayValue = computed(() => {\n    const value = this.storeValue();\n    if (value === null || value === undefined || value === '') return '';\n    // The stored value is an entity id where the field is state-bound, and an\n    // id is not something to show a reader.\n    if (this.keepsEntityId()) return this.selectedLabels().join(', ');\n    if (Array.isArray(value)) return value.join(', ');\n    return String(value);\n  });\n\n  /**\n   * What the mat-select's `value` should be, for the branch rendered without a\n   * form control. Entity ids for an ENTITY_DATA list, the stored value itself\n   * otherwise.\n   */\n  readonly selectControlValue = computed(() => this.controlValueFor(this.storeValue()));\n\n  /** True when several values can be held, so they read as chips + `+N`. */\n  readonly isMultiple = computed(() => !!this.getProperty('multiple'));\n\n  /**\n   * Selected values as their option LABELS.\n   *\n   * The stored value is an id; the label is what a reader needs. Resolved\n   * against the option list, falling back to a label seen in an earlier page\n   * and finally to the raw value, so a selection off the current page still\n   * reads as something meaningful.\n   */\n  readonly selectedLabels = computed<string[]>(() => {\n    const value = this.storeValue();\n    const values = Array.isArray(value) ? value : (value === null || value === undefined || value === '' ? [] : [value]);\n    if (values.length === 0) return [];\n    // An ENTITY_DATA field bound to page data already stores the display text —\n    // the id lives in the proxy key — so there is nothing to resolve. A\n    // state-bound one holds the id and falls through to the lookup below.\n    if (this.entityProxyKey() && !this.keepsEntityId()) return values.map((v: any) => String(v));\n    const byValue = new Map(this.selectOptions().map(o => [String(o.value), o.label]));\n    return values.map(v => byValue.get(String(v)) ?? this.knownLabels.get(String(v)) ?? String(v));\n  });\n\n  /**\n   * The page-data key holding entity ids for an ENTITY_DATA select, or ''.\n   *\n   * An entity list's option value is the record's `entity_id` and its label is\n   * the record's display text, because two records can carry the same text —\n   * two companies both called \"Acme\" — and text therefore cannot identify a\n   * selection. So the field itself keeps the TEXT (what a reader and the rest\n   * of the page expect under `cn`) and this proxy key keeps the ID (`_cn`).\n   * The dropdown resolves what is selected from the id, never the text.\n   *\n   * Only ENTITY_DATA has ids to keep; every other option source writes one key\n   * exactly as before.\n   */\n  readonly entityProxyKey = computed<string>(() => {\n    if (this.effectiveOptionType() !== 'ENTITY_DATA') return '';\n    const name = String(this.getProperty('name') ?? '').trim();\n    return name ? `_${name}` : '';\n  });\n\n  /**\n   * True when this select's value is an entity ID rather than the display text.\n   *\n   * A field bound to PAGE DATA keeps the text, because that is what the record\n   * is saved with and what the rest of the page reads under the field's name —\n   * the id rides along in the `_<name>` proxy key.\n   *\n   * A field bound to PAGE or APP STATE has no record to fill: its variable\n   * exists to be handed to a query payload, a filter or another page, where the\n   * text identifies nothing — two financiers can both read \"FIN-1\". So the\n   * variable holds the id the option list is keyed by, and the control resolves\n   * the text for display from the options.\n   */\n  private readonly keepsEntityId = computed<boolean>(() =>\n    !!this.entityProxyKey() && this.valueSourceMode() === 'state');\n\n  /** Display text for an option value (an entity id), as far as it is known. */\n  private entityTextFor(value: any): string {\n    const key = String(value);\n    const match = this.selectOptions().find(o => String(o.value) === key);\n    return match ? match.label : (this.knownLabels.get(key) ?? key);\n  }\n\n  /** Entity ids currently held in the proxy key, normalised to an array. */\n  private storedEntityIds(): any[] {\n    const proxy = this.entityProxyKey();\n    if (!proxy) return [];\n    const component = this.component();\n    const key = this.dataKey() ? `${this.dataKey()}.${proxy}` : proxy;\n    const raw = this.store.getPageFieldData(key, component?.pageId);\n    if (raw === null || raw === undefined || raw === '') return [];\n    return Array.isArray(raw) ? raw.filter(v => v !== null && v !== undefined && v !== '') : [raw];\n  }\n\n  /**\n   * Entity ids for what is stored, preferring the proxy key.\n   *\n   * Falls back to matching the stored TEXT against the option list for a record\n   * saved before the proxy key existed — otherwise every such record would open\n   * with an empty dropdown. The fallback is the ambiguous path this whole\n   * mechanism exists to avoid, so it is only ever a fallback.\n   */\n  private resolvedEntityIds(): any[] {\n    const fromProxy = this.storedEntityIds();\n    // A proxy holding TEXT rather than an id — written while the host answered\n    // with the text as the option value — would match no option and open the\n    // dropdown blank. Healed the same way the no-proxy fallback below is, by\n    // looking the text up in the option list; a real id is left untouched.\n    if (fromProxy.length > 0) return fromProxy.map(v => this.entityIdForStored(v));\n    const stored = this.storeValue();\n    const texts = Array.isArray(stored)\n      ? stored\n      : (stored === null || stored === undefined || stored === '' ? [] : [stored]);\n    if (texts.length === 0) return [];\n    const byLabel = new Map(this.selectOptions().map(o => [String(o.label), o.value]));\n    return texts\n      .map((t: any) => byLabel.get(String(t)))\n      .filter((v: any) => v !== undefined && v !== null && v !== '');\n  }\n\n  /** A stored proxy value, as an option value: an id passes through, a label resolves. */\n  private entityIdForStored(value: any): any {\n    const key = String(value);\n    const options = this.selectOptions();\n    if (options.some(o => String(o.value) === key)) return value;\n    const byLabel = options.find(o => String(o.label) === key);\n    return byLabel ? byLabel.value : value;\n  }\n\n  /** Write the entity ids to the proxy key, alongside the text in the field. */\n  private writeEntityProxy(ids: any): void {\n    const proxy = this.entityProxyKey();\n    const component = this.component();\n    if (!proxy || !component) return;\n    const key = this.dataKey() ? `${this.dataKey()}.${proxy}` : proxy;\n    this.store.updatePageData({ entity_data: { [key]: ids } }, component.pageId);\n    this.writeRowValue(proxy, ids);\n  }\n\n  /**\n   * The field keeps the display TEXT. Called on the form-control write path,\n   * where the control holds entity ids for an ENTITY_DATA select.\n   */\n  protected override storeValueFor(controlValue: any): any {\n    if (!this.entityProxyKey()) return controlValue;\n    // The control already holds ids, which is what a state-bound select stores.\n    if (this.keepsEntityId()) return controlValue;\n    if (Array.isArray(controlValue)) return controlValue.map(v => this.entityTextFor(v));\n    if (controlValue === null || controlValue === undefined || controlValue === '') return controlValue;\n    return this.entityTextFor(controlValue);\n  }\n\n  /**\n   * The control holds entity IDS, resolved from the proxy key rather than from\n   * the stored text — which is the point of the proxy: an ambiguous text cannot\n   * pick the right record, an id always can.\n   */\n  protected override controlValueFor(value: any): any {\n    if (!this.entityProxyKey()) return value;\n    if (this.keepsEntityId()) {\n      // The variable holds the ids themselves. Each one still goes through\n      // `entityIdForStored`, which leaves a real id alone and turns a value\n      // saved as TEXT — by a page written before this — back into its id.\n      const raw = Array.isArray(value)\n        ? value\n        : (value === null || value === undefined || value === '' ? [] : [value]);\n      const ids = raw\n        .map((v: any) => this.entityIdForStored(v))\n        .filter((v: any) => v !== undefined && v !== null && v !== '');\n      if (this.isMultiple()) return ids;\n      return ids.length > 0 ? ids[0] : (value === null || value === undefined ? value : '');\n    }\n    const ids = this.resolvedEntityIds();\n    if (this.isMultiple()) return ids;\n    return ids.length > 0 ? ids[0] : (value === null || value === undefined ? value : '');\n  }\n\n  /**\n   * A selection writes BOTH keys: the id to the proxy, the text to the field.\n   *\n   * The proxy goes first, so the control-sync inside super's write already sees\n   * the new id and does not fight it back to the old one.\n   */\n  protected override onValueChange(newValue: any): void {\n    if (!this.entityProxyKey()) {\n      super.onValueChange(newValue);\n      return;\n    }\n    this.writeEntityProxy(newValue);\n    super.onValueChange(this.storeValueFor(newValue));\n  }\n\n  // Options fetched at runtime for the ENTITY_DATA / API option types. The\n  // host app (processo) resolves the ds_select_options_* dynamic-data\n  // requests and answers with a ready [{label, value}] list.\n  private readonly dynamicOptions = signal<SelectOption[] | null>(null);\n  private readonly optionsRequestId = signal<string | null>(null);\n  private lastOptionsFingerprint = '';\n\n  // ── Server-side search and paging (ENTITY_DATA / API) ───────────────────\n  // The server answers one page at a time and does its own matching, so the\n  // search box is not limited to filtering whichever page is loaded, and a long\n  // list is not fetched whole. STATIC options are unaffected: they are already\n  // in memory, so they keep filtering on the client with no round trip.\n\n  /** Rows per request; `skip` advances by this as the panel is scrolled. */\n  private static readonly OPTIONS_PAGE_SIZE = 50;\n\n  /** The rendered mat-select, for its `panel` element once the overlay opens. */\n  @ViewChild(MatSelect) private matSelect?: MatSelect;\n\n  /** Debounced search text, sent as `field_str`. Separate from `searchText` so\n   *  the input stays responsive while requests are paced. */\n  private readonly serverSearch = signal('');\n  private readonly optionsSkip = signal(0);\n  /** True once a short page comes back — there is nothing more to ask for. */\n  private readonly optionsExhausted = signal(false);\n  /** Guards against a scroll burst firing several requests for the same page. */\n  private loadingMore = false;\n  private searchDebounce: any = null;\n  private panelScrollTeardown: (() => void) | null = null;\n  /**\n   * Labels for values seen in any page so far.\n   *\n   * A stored value whose option is not in the current page still has to render\n   * as its label rather than its id — and after a search replaces the list, the\n   * option it came from is gone. Remembering the label is what lets the pinned\n   * option (see selectOptions) show something meaningful.\n   */\n  private readonly knownLabels = new Map<string, string>();\n\n  /** True when the option list is paged and searched on the server. */\n  private readonly isServerBacked = computed(() => {\n    const t = this.effectiveOptionType();\n    return t === 'ENTITY_DATA' || t === 'API';\n  });\n  // null until the first dependent fetch, so that fetch is not mistaken for a\n  // parent changing and does not clear a stored value.\n  private lastFilterKey: string | null = null;\n  private pendingDependentReset = false;\n\n  // For a select bound to an entity field the data model's option config is\n  // authoritative — the component's own option_type property can be stale\n  // (e.g. agent-authored pages that never went through the panel seeding).\n  readonly effectiveOptionType = computed(() => {\n    const ef = this.fieldValue();\n    const t = ef?.option_type || this.getProperty('option_type') || 'STATIC';\n    return String(t).toUpperCase();\n  });\n\n  /**\n   * Dependency pairs for a cascading dropdown, normalised.\n   *\n   * `def` names the field on the CURRENT record supplying a value; `dpef` names\n   * the key in the option source to match it against. A field saved before\n   * `df_fields` existed carries a single `dpef`, which is read as\n   * `{ def: dpef, dpef: dpef }` — that was the old implied behaviour, where the\n   * value was taken from the sibling of the same name.\n   *\n   * ENTITY_DATA and API scope the same way. An API's `dpef` names the key its\n   * underlying query filters on, and is allowed to be blank: an API list is\n   * usually scoped by a single parent whose remote key the query already knows,\n   * so `def` alone is a complete declaration and the parent's own field name is\n   * sent as the key.\n   */\n  readonly dependencyPairs = computed<{ def: string; dpef: string }[]>(() => {\n    const optionType = this.effectiveOptionType();\n    if (optionType !== 'ENTITY_DATA' && optionType !== 'API') return [];\n    // An entity list matches a column in the option-source entity, so a pair\n    // without `dpef` cannot be resolved; an API list can fall back to `def`.\n    const dpefRequired = optionType === 'ENTITY_DATA';\n\n    const raw = this.modelOrProperty('df_fields');\n    if (Array.isArray(raw) && raw.length > 0) {\n      return raw\n        .map((p: any) => {\n          const def = String(p?.def ?? '').trim();\n          const dpef = String(p?.dpef ?? '').trim();\n          return { def, dpef: dpef || (dpefRequired ? '' : def) };\n        })\n        .filter(p => p.def.length > 0 && p.dpef.length > 0);\n    }\n\n    const legacy = String(this.modelOrProperty('dpef') ?? '').trim();\n    const legacyDef = String(this.modelOrProperty('def') ?? '').trim();\n    if (legacy) return [{ def: legacyDef || legacy, dpef: legacy }];\n    if (!dpefRequired && legacyDef) return [{ def: legacyDef, dpef: legacyDef }];\n    return [];\n  });\n\n  /** True when this dropdown's options are scoped by another field. */\n  readonly isDependent = computed<boolean>(() => this.dependencyPairs().length > 0);\n\n  /**\n   * Filter sent with the options request: keys are fields in the option source,\n   * values come from the record being edited.\n   *\n   * A pair whose source value is absent is left OUT rather than sent empty —\n   * filtering on a blank would narrow the list to nothing, so an unset parent\n   * simply does not constrain the list.\n   *\n   * ENTITY_DATA wraps a multi-valued parent as `{$in: [...]}`, the shape the\n   * `getentityfielddata` json match expects and the one the legacy form UI\n   * sends; a raw array matched nothing. API sources take the plain value —\n   * their filter reaches a query variable, not a match expression.\n   */\n  readonly dependencyFilter = computed<Record<string, any>>(() => {\n    const wrapArrays = this.effectiveOptionType() === 'ENTITY_DATA';\n    const filter: Record<string, any> = {};\n    for (const pair of this.dependencyPairs()) {\n      const value = this.siblingFieldValue(pair.def);\n      if (value === null || value === undefined || value === '') continue;\n      if (!Array.isArray(value)) {\n        filter[pair.dpef] = value;\n        continue;\n      }\n      const cleaned = value.filter(v => v !== null && v !== undefined && v !== '');\n      if (cleaned.length === 0) continue;\n      // A single-select parent holds a scalar even when the value arrives\n      // wrapped, so it is unwrapped rather than sent as a one-element $in.\n      const single = this.store.getEntityField(pair.def)?.datatype === 'dropdown_single_select';\n      if (single) filter[pair.dpef] = cleaned[0];\n      else filter[pair.dpef] = wrapArrays ? { $in: cleaned } : cleaned;\n    }\n    return filter;\n  });\n\n  /**\n   * True once the dropdown has been opened at least once.\n   *\n   * A dependent list is fetched lazily, on first open. Its contents vary with\n   * the parent field's value, so in a repeating context (board cards, a grid)\n   * every record can need a different list — fetching eagerly would issue one\n   * request per record just to render. Opening the dropdown is also exactly when\n   * the full list is first needed.\n   *\n   * Independent lists keep fetching eagerly: there is one list per column, and\n   * deferring it would show a raw stored id instead of its label until the user\n   * opened the control.\n   */\n  private readonly hasOpened = signal(false);\n\n  /** Guards 'Auto Select First Option' so it fires once, not on every re-render. */\n  private autoSelectedFirst = false;\n\n  /**\n   * The option list the guard last saw, as its values joined.\n   *\n   * A list fed from state or from a parent field is rebuilt whenever that\n   * source changes — picking a different anchor replaces the currency list.\n   * Comparing against this tells a rebuilt list apart from a re-render, which\n   * is what lets the guard reopen for a value the new list no longer offers.\n   */\n  private lastAutoSelectOptionsKey: string | null = null;\n\n  constructor() {\n    super();\n\n    /**\n     * 'Auto Select First Option': seed an empty field with the head of the list.\n     *\n     * Runs once, and only while the field is genuinely empty — a stored value, a\n     * Default Value or a Default From State all arrive through the same\n     * resolution and count as \"has a value\", so none of them is overwritten.\n     * Once anything is selected the guard closes, so clearing the field by hand\n     * is not immediately undone. It reopens only when the option list itself is\n     * replaced by one that no longer offers the selected value — the head of\n     * the new list is seeded, or the field cleared when that list is empty.\n     *\n     * Routed through onValueChange rather than the control, so the write reaches\n     * page data (and, for an entity list, the `_<name>` id companion) and fires\n     * the field's Value Change actions exactly as a click would.\n     */\n    effect(() => {\n      if (!this.getProperty('auto_select_first')) return;\n      const options = this.sourceOptions();\n      const stored = this.storeValue();\n      untracked(() => {\n        const optionValues = (options || []).map(o => String(o?.value));\n        const key = optionValues.join('\\u0000');\n        const listChanged = this.lastAutoSelectOptionsKey !== null\n          && key !== this.lastAutoSelectOptionsKey;\n        this.lastAutoSelectOptionsKey = key;\n\n        const storedValues = Array.isArray(stored)\n          ? stored\n          : (stored === undefined || stored === null || stored === '' ? [] : [stored]);\n\n        // Reopen the guard when the list was replaced by one that no longer\n        // offers what is selected — a dependent list (currency for an anchor)\n        // otherwise keeps a value belonging to the previous parent, and the\n        // one-shot guard means the new list's head is never seeded. A value\n        // the new list still offers is left alone: nothing has gone stale, and\n        // forcing it back to the head would undo a deliberate choice.\n        const stale = storedValues.length > 0\n          && !storedValues.every(v => optionValues.includes(String(v)));\n        const reseed = listChanged && stale;\n        if (reseed) this.autoSelectedFirst = false;\n\n        if (this.autoSelectedFirst) return;\n        // Deliberately runs on the designer canvas too, so the author sees the\n        // same seeded value they will get at runtime. The write is page data\n        // only — emitEvent still suppresses the field's actions while editing.\n        if (this.isComponentDisabled()) return;\n        // A value of any origin closes the guard: the list may still be loading\n        // when it arrives, and re-opening later would overwrite it. A reseed has\n        // already established that the value belongs to a list that is gone, so\n        // neither it nor a default stands in the way.\n        if (!reseed && (storedValues.length > 0 || this.effectiveDefaultValue() !== undefined)) {\n          this.autoSelectedFirst = true;\n          return;\n        }\n        if (!options || options.length === 0) {\n          // The new list offers nothing at all, so there is no head to seed —\n          // but leaving the old selection standing would submit a value that\n          // belongs to the previous parent. Clear it and keep the guard open,\n          // so a list arriving later still seeds its head.\n          if (reseed) this.asSelfSeededChange(() => this.onValueChange(this.isMultiple() ? [] : ''));\n          return;\n        }\n        this.autoSelectedFirst = true;\n        const first = options[0].value;\n        // Announced as a self-seed, so the Value Change actions run on the\n        // designer canvas as well: the author is building the page around what\n        // follows from this value, and a dependent list left empty there\n        // cannot be configured. See BaseComponent.selfSeededChange.\n        this.asSelfSeededChange(() => this.onValueChange(this.isMultiple() ? [first] : first));\n      });\n    });\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n\n    // The option config is NOT copied onto the component for a bound field.\n    // Resolution already reads the data model directly (effectiveOptionType,\n    // selectOptions and the fetch effect below all prefer fieldValue()), and the\n    // property panel displays the model's value for these locked keys via its\n    // own inherited-value lookup. Writing them into the page as well produced a\n    // snapshot that silently drifted whenever the data model changed — which is\n    // exactly why effectiveOptionType had to distrust its own property.\n\n    // Fetch options for ENTITY_DATA / API sources. The bound entity field's\n    // metadata (from the data model) is authoritative when the select's name\n    // matches an entity field; otherwise the panel properties are used.\n    effect(() => {\n      const comp = this.component();\n      if (!comp) return;\n      const optionType = this.effectiveOptionType();\n      if (optionType !== 'ENTITY_DATA' && optionType !== 'API') return;\n\n      // A dependent list is deferred only inside a repeating context — see\n      // hasOpened. Deferring on a plain form deadlocks: mat-select refuses to\n      // open with an empty option list (MatSelect._canOpen), so a blank record's\n      // dependent dropdown could never be opened, and opening it is what was\n      // supposed to trigger the fetch. One form means one request, so fetch it.\n      const dependent = this.isDependent();\n      const deferred = dependent && !!this.rowContext?.hasRow();\n      if (deferred && !this.hasOpened()) return;\n\n      // Read inside the effect so changing a parent value re-runs the fetch and\n      // the list re-scopes without the user closing and reopening.\n      const filter = dependent ? this.dependencyFilter() : {};\n      const dependency: Record<string, any> = Object.keys(filter).length > 0 ? { filter } : {};\n\n      // Read inside the effect so a new search term or a scroll past the end\n      // re-runs the fetch.\n      const paging = {\n        field_str: this.serverSearch(),\n        limit: SelectComponent.OPTIONS_PAGE_SIZE,\n        skip: this.optionsSkip(),\n      };\n\n      const ef = this.fieldValue();\n      let type = '';\n      let payload = '';\n      if (optionType === 'ENTITY_DATA') {\n        const entity_name = ef?.entity_name || this.getProperty('entity_name') || '';\n        const field_name = ef?.field_name || this.getProperty('field_name') || '';\n        if (!entity_name) return;\n        type = 'ds_select_options_entity';\n        payload = JSON.stringify({ entity_name, field_name, ...dependency, ...paging });\n      } else {\n        const api_name = ef?.api_name || this.getPropertyWithLegacy('api_name', 'api') || '';\n        const api_field = ef?.api_field || this.getProperty('api_field') || '';\n        if (!api_name) return;\n        type = 'ds_select_options_api';\n        // Read inside the effect, like the dependency filter above: the list\n        // refetches whenever one of the payload values changes, and the\n        // fingerprint below keeps an unchanged payload from refetching.\n        const apiPayload = this.resolveApiPayload(this.getProperty('api_payload_fields') || []);\n        const api_result_path = String(this.getProperty('api_result_path') ?? '').trim();\n        const extra: Record<string, any> = {};\n        if (Object.keys(apiPayload).length > 0) extra['payload'] = apiPayload;\n        if (api_result_path) extra['api_result_path'] = api_result_path;\n        payload = JSON.stringify({ api_name, api_field, ...extra, ...dependency, ...paging });\n      }\n      const fingerprint = `${type}|${payload}`;\n      if (fingerprint === this.lastOptionsFingerprint) return;\n      // A parent moving is what invalidates this field's stored value — the\n      // first fetch is not, so a saved sub-industry survives the page loading\n      // its own list. Only a later change arms the reset.\n      const filterKey = JSON.stringify(filter);\n      if (dependent && this.lastFilterKey !== null && this.lastFilterKey !== filterKey) {\n        this.pendingDependentReset = true;\n      }\n      this.lastFilterKey = filterKey;\n      this.lastOptionsFingerprint = fingerprint;\n      untracked(() => {\n        const reqId = this.store.requestDynamicData(comp.id, type, payload);\n        this.optionsRequestId.set(reqId);\n      });\n    });\n\n    // Consume the response.\n    effect(() => {\n      const reqId = this.optionsRequestId();\n      if (!reqId) return;\n      const resp = this.store.dynamicDataResponses().get(reqId);\n      if (resp === undefined) return;\n      untracked(() => {\n        const page: SelectOption[] = Array.isArray(resp) ? resp : [];\n        for (const option of page) {\n          if (option && option.value !== undefined && option.value !== null) {\n            this.knownLabels.set(String(option.value), String(option.label ?? option.value));\n          }\n        }\n        // The first page replaces the list; a later one appends to it. Anything\n        // else would drop what the user has already scrolled past.\n        if (this.optionsSkip() === 0) {\n          this.dynamicOptions.set(page);\n        } else {\n          this.dynamicOptions.update(prev => [...(prev ?? []), ...page]);\n        }\n        // A short page is the end of the list — the only signal available\n        // without a total count in the response.\n        this.optionsExhausted.set(page.length < SelectComponent.OPTIONS_PAGE_SIZE);\n        this.loadingMore = false;\n        this.store.removeDynamicDataRequest(reqId);\n        this.optionsRequestId.set(null);\n        this.clearValueOutsideRescopedOptions();\n      });\n    });\n  }\n\n  /**\n   * Drop this field's value when a parent change has rescoped the list past it.\n   *\n   * Choosing a new industry leaves the old sub-industry stored and displayed\n   * even though it no longer belongs to the industry — and it would be saved\n   * that way. Only runs when a parent actually moved (see pendingDependentReset)\n   * and the value is genuinely absent from the new list, so a slow or failed\n   * fetch that answers with nothing does not wipe a valid value.\n   */\n  private clearValueOutsideRescopedOptions(): void {\n    if (!this.pendingDependentReset) return;\n    // Only the first page describes the whole rescoped list. Judging a value\n    // against page two would clear anything that happens to sit on page one.\n    if (this.optionsSkip() > 0) return;\n    this.pendingDependentReset = false;\n    if (this.store.editMode()) return;\n\n    const options = this.dynamicOptions();\n    if (!options || options.length === 0) return;\n\n    // Compared in the option list's own currency: entity ids for ENTITY_DATA,\n    // where the stored field holds text that would match no option value.\n    const current = this.entityProxyKey() ? this.controlValueFor(this.storeValue()) : this.storeValue();\n    if (current === null || current === undefined || current === '') return;\n    const allowed = new Set(options.map(o => String(o.value)));\n\n    if (Array.isArray(current)) {\n      const kept = current.filter(v => allowed.has(String(v)));\n      if (kept.length !== current.length) {\n        if (kept.length === 0) this.reopenAutoSelectForRescopedList();\n        this.onValueChange(kept);\n      }\n      return;\n    }\n    if (!allowed.has(String(current))) {\n      this.reopenAutoSelectForRescopedList();\n      this.onValueChange(this.getProperty('multiple') ? [] : '');\n    }\n  }\n\n  /**\n   * Hand 'Auto Select First Option' its one shot back, for a field this reset\n   * is about to empty.\n   *\n   * The seeding guard reopens on its own when a rescoped list no longer offers\n   * what is stored — but this runs FIRST, so by the time the guard looks there\n   * is nothing stored to be stale and the guard stays closed. The field then\n   * sat empty over a perfectly good list: choosing a different financier gave\n   * a new account list with no account picked.\n   */\n  private reopenAutoSelectForRescopedList(): void {\n    if (!this.getProperty('auto_select_first')) return;\n    this.autoSelectedFirst = false;\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onSelectOpenedChange(opened: boolean): void {\n    this.searchText.set('');\n    if (this.searchDebounce) { clearTimeout(this.searchDebounce); this.searchDebounce = null; }\n    if (opened) {\n      // Reopening starts a clean list: the previous session's search term and\n      // page position would otherwise still be in force with an empty box.\n      if (this.isServerBacked() && (this.serverSearch() !== '' || this.optionsSkip() !== 0)) {\n        this.serverSearch.set('');\n        this.optionsSkip.set(0);\n        this.optionsExhausted.set(false);\n        this.loadingMore = false;\n      }\n      // First open is what triggers a dependent list's fetch.\n      if (!this.hasOpened()) this.hasOpened.set(true);\n      this.attachPanelScroll();\n      return;\n    }\n    this.detachPanelScroll();\n    this.resetToDefaultMode();\n  }\n\n  private resetToDefaultMode(): void {\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  /**\n   * Options read out of a state variable holding an array.\n   *\n   * The array is usually rows returned by a call-query / call-function that an\n   * `update-state` action parked in state, so its elements are objects and only\n   * one of their keys is the option value. `option_value_key` names that key\n   * (and `option_label_key` the one to display); an array of plain scalars\n   * needs neither. A JSON string is parsed, so a variable that carries its rows\n   * as text works the same way.\n   */\n  private readonly stateOptions = computed<any[]>(() => {\n    const scope = this.getProperty('options_state_scope') === 'app' ? 'app' : 'page';\n    // One property per scope: `dynamic_options` is a fixed channel name, so a\n    // single picker could only ever list one scope's variables — which showed\n    // page variables while App State was selected.\n    const key = String(this.getProperty(scope === 'app' ? 'options_app_state_key' : 'options_state_key') ?? '').trim();\n    if (!key) return [];\n    const pageId = this.component()?.pageId;\n    const dataKey = this.dataKey();\n    const state = scope === 'app'\n      ? (this.store.appState() || {})\n      : (pageId ? this.store.getComputedPageStateFor(pageId, dataKey || undefined) : this.store.computedPageState());\n\n    let rows: any = state[key];\n    if (typeof rows === 'string') {\n      try { rows = JSON.parse(rows); } catch { return []; }\n    }\n    if (!Array.isArray(rows)) return [];\n\n    const valueKey = String(this.getProperty('option_value_key') ?? '').trim();\n    const labelKey = String(this.getProperty('option_label_key') ?? '').trim() || valueKey;\n    if (!valueKey) return rows;\n    return rows.map((row: any) => (row && typeof row === 'object')\n      ? { value: row[valueKey], label: row[labelKey] ?? row[valueKey] }\n      : row);\n  });\n\n  readonly selectOptions = computed(() => {\n    const optionType = this.effectiveOptionType();\n    // STATIC options: when the select is bound to an entity field, the\n    // data-model field definition is the source of truth (the same reason the\n    // panel locks the option config); `static_options` is the manual fallback.\n    // Entity/API options are fetched at runtime via the ds_select_options_*\n    // requests; `options` remains a legacy fallback.\n    let raw: any;\n    if (optionType === 'STATE') {\n      raw = this.stateOptions();\n    } else if (optionType === 'STATIC') {\n      const ef = this.fieldValue();\n      raw = (ef && Array.isArray(ef.options) && ef.options.length > 0)\n        ? ef.options\n        : this.getProperty('static_options');\n    } else if (this.isDependent() && this.dynamicOptions() === null) {\n      // Dependent list not fetched yet. Show just the current value as a single\n      // option so the control displays what is stored instead of appearing\n      // empty — mat-select renders nothing when no option matches its value.\n      // The real list arrives on first open.\n      // Keyed the same way the real options will be — ids for ENTITY_DATA.\n      const current = this.entityProxyKey()\n        ? (this.storedEntityIds().length > 0 ? this.storedEntityIds() : this.storeValue())\n        : this.storeValue();\n      const values = Array.isArray(current)\n        ? current\n        : (current === null || current === undefined || current === '' ? [] : [current]);\n      raw = values.map((v: any) => this.entityProxyKey()\n        ? { value: v, label: this.knownLabels.get(String(v)) ?? String(v) }\n        : String(v));\n    } else {\n      raw = this.dynamicOptions() ?? this.getProperty('options');\n    }\n\n    let options: SelectOption[];\n    if (Array.isArray(raw)) {\n      options = raw\n        .map((o: any) => (o && typeof o === 'object')\n          ? { value: o.value ?? o.name ?? o.label, label: o.label ?? o.name ?? String(o.value) }\n          : { value: o, label: String(o) })\n        .filter((o: SelectOption) => o.value !== undefined && o.value !== null && String(o.value).length > 0);\n    } else {\n      // Comma-separated string options. Each entry is either a plain value or\n      // the \"Label=value\" form (e.g. \"Per invoice=per-invoice\").\n      options = String(raw || '')\n        .split(',')\n        .map((option: string) => option.trim())\n        .filter((option: string) => option.length > 0)\n        .map((entry: string) => {\n          const eq = entry.indexOf('=');\n          if (eq > 0 && eq < entry.length - 1) {\n            return { label: entry.slice(0, eq).trim(), value: entry.slice(eq + 1).trim() };\n          }\n          return { value: entry, label: entry };\n        });\n    }\n\n    // Keep the stored value in the list even when the current page or search\n    // does not contain it. mat-select renders nothing for a value with no\n    // matching option, so a record whose company sits on page 12 would open\n    // showing an empty control and save as cleared. Appended, not prepended, so\n    // it does not displace the first real result; deduped below, so it adds\n    // nothing when the value IS on the page.\n    if (this.isServerBacked()) {\n      // Pinned by what the OPTION values are keyed on: entity ids for an\n      // ENTITY_DATA list, the stored value itself otherwise. The ids are read\n      // straight from the proxy key — resolving them through the option list\n      // would recurse into this very computed.\n      const proxy = this.entityProxyKey();\n      const ids = proxy ? this.storedEntityIds() : [];\n      const present = new Set(options.map((o: SelectOption) => String(o.value)));\n\n      if (proxy && ids.length === 0) {\n        // A record saved before the proxy key existed carries only the text.\n        // Pin it as its own value so the control still displays something —\n        // but never when an option already shows that label, or the list would\n        // read the same name twice.\n        const stored = this.storeValue();\n        const texts = Array.isArray(stored)\n          ? stored\n          : (stored === null || stored === undefined || stored === '' ? [] : [stored]);\n        const labels = new Set(options.map((o: SelectOption) => String(o.label)));\n        for (const text of texts) {\n          const key = String(text);\n          if (!key || present.has(key) || labels.has(key)) continue;\n          options = [...options, { value: text, label: key }];\n          present.add(key);\n        }\n      } else {\n        const current = proxy ? ids : this.storeValue();\n        const values = Array.isArray(current) ? current : (current === null || current === undefined || current === '' ? [] : [current]);\n        for (const value of values) {\n          const key = String(value);\n          if (!key || present.has(key)) continue;\n          options = [...options, { value, label: this.knownLabels.get(key) ?? key }];\n          present.add(key);\n        }\n      }\n    }\n\n    // Dedupe by value (first occurrence wins): source data (entity rows, API\n    // responses) can repeat values, which are redundant for a select and make\n    // the template's track-by-value throw NG0955.\n    const seen = new Set<string>();\n    return options.filter((o: SelectOption) => {\n      const key = String(o.value);\n      if (seen.has(key)) return false;\n      seen.add(key);\n      return true;\n    });\n  });\n\n  /**\n   * The list as the SOURCE gave it, without the stored value pinned onto the\n   * end for display (see selectOptions).\n   *\n   * Everything that asks \"does the new list still offer what is selected?\" has\n   * to ask it of this one. Judged against the display list the answer is always\n   * yes — the pin is the selected value — so a rescoped list that no longer\n   * holds it, or holds nothing at all, looked unchanged: picking a financier\n   * with no accounts left the previous financier's account selected.\n   */\n  private readonly sourceOptions = computed<SelectOption[]>(() => {\n    if (!this.isServerBacked()) return this.selectOptions();\n    const fetched = this.dynamicOptions();\n    if (fetched === null) return this.selectOptions();\n    return fetched.filter((o: any) => o && o.value !== undefined && o.value !== null && String(o.value).length > 0);\n  });\n\n  readonly filteredOptions = computed(() => {\n    const search = this.searchText().toLowerCase();\n    // The server has already matched `field_str` against label and value, so\n    // filtering again here would hide rows it matched on something else — and\n    // would re-hide the pinned selected option.\n    if (!search || this.isServerBacked()) {\n      return this.selectOptions();\n    }\n    return this.selectOptions().filter((option: SelectOption) =>\n      option.label.toLowerCase().includes(search) ||\n      String(option.value).toLowerCase().includes(search)\n    );\n  });\n\n  // Function for disable_if evaluation - uses getValue to be reactive to property changes\n  isDisabled = (key: string, getValue?: (k: string) => any): boolean => {\n    // Use getValue to get the current 'name' property value from the properties panel\n    // This ensures reactivity when the name property changes\n    if (getValue) {\n      const fieldName = getValue('name');\n      const entityField = this.store.getEntityField(fieldName);\n      return !!entityField;\n    }\n    // Fallback to fieldValue signal if getValue is not provided\n    return !!this.fieldValue();\n  };\n\n\n  /**\n   * Resolve `state:<key>` / `page:<path>` / `app:<key>` payload-field tokens\n   * into a {key: value} object. Same shape the grid and page-ref send.\n   */\n  private resolveApiPayload(fields: string[]): Record<string, any> {\n    if (!Array.isArray(fields) || fields.length === 0) return {};\n    const out: Record<string, any> = {};\n    for (const f of fields) {\n      const parsed = parsePayloadField(f);\n      if (!parsed) continue;\n      const { source, path, key } = parsed;\n      const placeholder = source === 'state' ? `@state.${path}`\n        : source === 'page' ? `@page.${path}`\n          : source === 'app' ? `@app.${path}`\n            : '';\n      if (!placeholder) continue;\n      out[key] = this.logicEvaluator.evaluateValue(placeholder, this.component()?.pageId);\n    }\n    return out;\n  }\n\n  onSearchChange(searchValue: string): void {\n    this.searchText.set(searchValue);\n    if (!this.isServerBacked()) return;\n    // Debounced: the box would otherwise fire a request per keystroke.\n    if (this.searchDebounce) clearTimeout(this.searchDebounce);\n    this.searchDebounce = setTimeout(() => {\n      this.searchDebounce = null;\n      if (this.serverSearch() === searchValue) return;\n      this.serverSearch.set(searchValue);\n      // A new search is a new list: start at the first page again.\n      this.optionsSkip.set(0);\n      this.optionsExhausted.set(false);\n      this.loadingMore = false;\n    }, 300);\n  }\n\n  /**\n   * Ask for the next page when the panel is scrolled near its end.\n   *\n   * Options are appended rather than recycled, so mat-select keeps every option\n   * instance it has rendered. That matters: its selection model, trigger text\n   * and keyboard navigation all address MatOption instances, and a virtual\n   * scroller destroying them as they leave the viewport breaks all three.\n   */\n  private onPanelScroll(panel: HTMLElement): void {\n    if (!this.isServerBacked() || this.optionsExhausted() || this.loadingMore) return;\n    if (this.optionsRequestId() !== null) return;\n    const remaining = panel.scrollHeight - panel.scrollTop - panel.clientHeight;\n    if (remaining > 96) return;\n    this.loadingMore = true;\n    this.optionsSkip.update(skip => skip + SelectComponent.OPTIONS_PAGE_SIZE);\n  }\n\n  private detachPanelScroll(): void {\n    this.panelScrollTeardown?.();\n    this.panelScrollTeardown = null;\n  }\n\n  /** Attach the scroll listener to mat-select's panel once the overlay exists. */\n  private attachPanelScroll(): void {\n    this.detachPanelScroll();\n    if (!this.isServerBacked()) return;\n    // The panel is created with the overlay, one tick after openedChange.\n    setTimeout(() => {\n      const panel: HTMLElement | null = this.matSelect?.panel?.nativeElement ?? null;\n      if (!panel) return;\n      const handler = () => this.onPanelScroll(panel);\n      panel.addEventListener('scroll', handler, { passive: true });\n      this.panelScrollTeardown = () => panel.removeEventListener('scroll', handler);\n    });\n  }\n\n  override targetElementSelector = '[data-eru-target=\"select\"]';\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'change': '[data-eru-target=\"select\"]',\n      'click': '[data-eru-target=\"select\"]'\n    };\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: 'Choose an option',\n        width: 2\n      },\n      {\n        key: 'option_type',\n        type: 'radio',\n        label: 'Option Type',\n        category: 'content',\n        default_value: 'STATIC',\n        options: [\n          { value: 'STATIC', label: 'Static' },\n          { value: 'ENTITY_DATA', label: 'Entity' },\n          { value: 'API', label: 'API' },\n          { value: 'STATE', label: 'State' }\n        ],\n        description: 'Where the list of options comes from. Separate from Value Source, which is where the picked value is stored.',\n        width: 'full',\n        orientation: 'horizontal',\n        disable_if: { evaluate: (getValue) => this.isDisabled('option_type', getValue) }\n      },\n      {\n        key: 'static_options',\n        type: 'textarea',\n        label: 'Options (comma-separated)',\n        category: 'content',\n        default_value: '',\n        description: 'Enter options separated by commas',\n        width: 'full',\n        visible_if: { key: 'option_type', equals: 'STATIC' },\n        disable_if: { evaluate: (getValue) => this.isDisabled('static_options', getValue) }\n      },\n      {\n        key: 'options_state_scope',\n        type: 'radio',\n        label: 'Options From',\n        category: 'content',\n        default_value: 'page',\n        options: [\n          { value: 'page', label: 'Page State' },\n          { value: 'app', label: 'App State' }\n        ],\n        description: 'Which state map holds the array of options',\n        width: 'full',\n        orientation: 'horizontal',\n        visible_if: { key: 'option_type', equals: 'STATE' }\n      },\n      {\n        key: 'options_state_key',\n        type: 'autocomplete',\n        label: 'Options Page State Variable',\n        category: 'content',\n        default_value: '',\n        dynamic_options: 'ds_page_state_vars',\n        description: 'Page state variable holding the array of options',\n        width: 'full',\n        visible_if: [\n          { key: 'option_type', equals: 'STATE' },\n          { key: 'options_state_scope', equals: 'page' }\n        ]\n      },\n      {\n        key: 'options_app_state_key',\n        type: 'autocomplete',\n        label: 'Options App State Variable',\n        category: 'content',\n        default_value: '',\n        dynamic_options: 'ds_app_state_vars',\n        description: 'App state variable holding the array of options. App state has no declarations, so a key that nothing has written yet can be typed here.',\n        width: 'full',\n        visible_if: [\n          { key: 'option_type', equals: 'STATE' },\n          { key: 'options_state_scope', equals: 'app' }\n        ]\n      },\n      {\n        key: 'option_value_key',\n        type: 'text',\n        label: 'Option Value Key',\n        category: 'content',\n        default_value: '',\n        description: 'Key to read from every element of the array as the option value (e.g. id). Leave empty when the array holds plain values.',\n        width: 'full',\n        visible_if: { key: 'option_type', equals: 'STATE' }\n      },\n      {\n        key: 'option_label_key',\n        type: 'text',\n        label: 'Option Label Key',\n        category: 'content',\n        default_value: '',\n        description: 'Key to display for every element (e.g. name). Defaults to the value key.',\n        width: 'full',\n        visible_if: { key: 'option_type', equals: 'STATE' }\n      },\n      {\n        key: 'entity_name',\n        type: 'select',\n        dynamic_options: 'ds_entity_name',\n        label: 'Entity Name',\n        category: 'content',\n        default_value: '',\n        description: 'Enter entity name',\n        width: 'full',\n        visible_if: { key: 'option_type', equals: 'ENTITY_DATA' },\n        disable_if: { evaluate: (getValue) => this.isDisabled('entity_name', getValue) }\n      },\n      {\n        key: 'field_name',\n        type: 'text',\n        label: 'Entity Field',\n        category: 'content',\n        default_value: '',\n        description: 'Field of the entity whose values populate the options',\n        width: 'full',\n        visible_if: { key: 'option_type', equals: 'ENTITY_DATA' },\n        disable_if: { evaluate: (getValue) => this.isDisabled('field_name', getValue) }\n      },\n      {\n        // An API option source runs an eru function by this name, so the list\n        // offered here is the process's functions — not the legacy `apis`\n        // catalogue this used to read, which named nothing the option fetch can\n        // actually call. Autocomplete rather than a fixed dropdown, for the same\n        // reason Call Function is: a function that is not written yet can be\n        // named here now.\n        key: 'api_name',\n        type: 'autocomplete',\n        dynamic_options: 'functions',\n        label: 'Function Name',\n        category: 'content',\n        default_value: '',\n        description: 'Function that returns the option list. Pick one, or type a name that does not exist yet.',\n        width: 'full',\n        visible_if: { key: 'option_type', equals: 'API' },\n        disable_if: { evaluate: (getValue) => this.isDisabled('api_name', getValue) }\n      },\n      {\n        key: 'api_field',\n        type: 'text',\n        label: 'API Field',\n        category: 'content',\n        default_value: '',\n        description: 'Key in the API response whose values populate the options',\n        width: 'full',\n        visible_if: { key: 'option_type', equals: 'API' },\n        disable_if: { evaluate: (getValue) => this.isDisabled('api_field', getValue) }\n      },\n      {\n        key: 'api_result_path',\n        type: 'text',\n        label: 'API Result Path',\n        category: 'content',\n        default_value: '',\n        description: 'Dot path to the rows in the response, e.g. Results.0.files. Use [*] to map over an array — Results.0.files[*].name reads one key from every row. Blank falls back to the first array found in the response.',\n        width: 'full',\n        visible_if: { key: 'option_type', equals: 'API' }\n      },\n      {\n        key: 'api_payload_fields',\n        type: 'payload_fields',\n        label: 'API Payload Fields',\n        category: 'content',\n        default_value: [],\n        dynamic_options: 'ds_page_ref_payload_fields',\n        description: 'Pick state vars / page-data fields of the page. The API receives {field_name: value} for each entry. Type \"= other_name\" alongside an entry to send it under a different key.',\n        width: 'full',\n        // Not locked when the field is bound, unlike api_name / api_field: the\n        // data model describes the option SOURCE, not what this page has to\n        // hand it. Two pages can call the same API with different payloads.\n        visible_if: { key: 'option_type', equals: 'API' }\n      },\n      {\n        key: 'df_fields',\n        type: 'dependent_fields',\n        label: 'Depends On',\n        category: 'content',\n        default_value: [],\n        description: 'Scope this list by other fields on the record. Each pair maps a field here to the key the option source filters on; the values go out together under \"filter\" and the list refetches whenever one of them changes.',\n        width: 'full',\n        visible_if: [\n          { key: 'option_type', equals: 'ENTITY_DATA' },\n          { key: 'option_type', equals: 'API' }\n        ],\n        visible_operator: 'any',\n        disable_if: { evaluate: (getValue) => this.isDisabled('df_fields', getValue) }\n      },\n      {\n        key: 'multiple',\n        type: 'boolean',\n        label: 'Multiple Selection',\n        category: 'behavior',\n        default_value: false,\n        description: 'Allow multiple selections'\n      },\n      {\n        key: 'searchable',\n        type: 'boolean',\n        label: 'Searchable',\n        category: 'behavior',\n        default_value: false,\n        description: 'Show a search box inside the dropdown to filter options (useful for long lists).'\n      },\n      {\n        key: 'auto_select_first',\n        type: 'boolean',\n        label: 'Auto Select First Option',\n        category: 'behavior',\n        default_value: false,\n        description: 'Select the first option when the field arrives empty, as soon as the list is known. A stored value, a Default Value or a Default From State always wins, and clearing the field by hand is left alone.'\n      },\n\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view when done.'\n      }\n    ];\n  }\n}\n\n","<div [ngStyle]=\"combinedStyles()\">\n  @if (currentMode() === 'view') {\n  <div class=\"eru-select-display\" [ngStyle]=\"displayContainerStyles()\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n    data-eru-target=\"select-display\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label select-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    @if (isMultiple() && selectedLabels().length > 0) {\n    <eru-chip-list class=\"select-display-chips\" [labels]=\"selectedLabels()\"></eru-chip-list>\n    } @else if (displayValue()) {\n    <span class=\"select-display-value\" [ngStyle]=\"displayValueStyles()\">{{ displayValue() }}</span>\n    } @else {\n    <span class=\"select-display-empty\">&mdash;</span>\n    }\n  </div>\n  } @else {\n  <mat-form-field [appearance]=\"getProperty('appearance')\" [class]=\"classes()\" class=\"eru-select-form-field\"\n    eruCanvasEventHandler>\n    <mat-label>{{ getProperty('label') }}</mat-label>\n    @if (formControl) {\n    <mat-select [placeholder]=\"getProperty('placeholder')\" [required]=\"hasRequiredValidation()\"\n      [multiple]=\"getProperty('multiple')\"\n      [formControl]=\"formControl!\" (selectionChange)=\"onValueChange($event.value)\" (blur)=\"markControlAsTouched()\"\n      (openedChange)=\"onSelectOpenedChange($event)\" data-eru-target=\"select\">\n      <!-- Material's own hook for a custom trigger (MatSelectTrigger, projected\n           by mat-select when `customTrigger` is set). Using it keeps every bit\n           of mat-select's behaviour — selection model, keyboard, a11y — and\n           only replaces the comma-joined text, so nothing here overrides the\n           library. Multi-select only; a single value has nothing to overflow. -->\n      @if (isMultiple() && selectedLabels().length > 0) {\n      <mat-select-trigger>\n        <eru-chip-list [labels]=\"selectedLabels()\" [compact]=\"true\"></eru-chip-list>\n      </mat-select-trigger>\n      }\n      @if (getProperty('searchable')) {\n      <mat-option disabled class=\"eru-search-option\">\n        <mat-form-field [appearance]=\"getProperty('appearance')\" class=\"eru-search-field\">\n          <mat-label>Search</mat-label>\n          <input matInput type=\"text\" class=\"eru-search-input\" [value]=\"searchText()\"\n            (input)=\"onSearchChange($any($event.target).value)\" (click)=\"$event.stopPropagation()\"\n            (keydown)=\"$event.stopPropagation()\">\n        </mat-form-field>\n      </mat-option>\n      }\n      @for (option of filteredOptions(); track option.value) {\n      <mat-option [value]=\"option.value\">{{ option.label }}</mat-option>\n      }\n    </mat-select>\n    } @else {\n    <mat-select [placeholder]=\"getProperty('placeholder')\" [required]=\"hasRequiredValidation()\"\n      [multiple]=\"getProperty('multiple')\"\n      [disabled]=\"isComponentDisabled()\" [value]=\"selectControlValue()\"\n      (selectionChange)=\"onValueChange($event.value)\" (blur)=\"markControlAsTouched()\"\n      (openedChange)=\"onSelectOpenedChange($event)\" data-eru-target=\"select\">\n      <!-- Material's own hook for a custom trigger (MatSelectTrigger, projected\n           by mat-select when `customTrigger` is set). Using it keeps every bit\n           of mat-select's behaviour — selection model, keyboard, a11y — and\n           only replaces the comma-joined text, so nothing here overrides the\n           library. Multi-select only; a single value has nothing to overflow. -->\n      @if (isMultiple() && selectedLabels().length > 0) {\n      <mat-select-trigger>\n        <eru-chip-list [labels]=\"selectedLabels()\" [compact]=\"true\"></eru-chip-list>\n      </mat-select-trigger>\n      }\n      @if (getProperty('searchable')) {\n      <mat-option disabled class=\"eru-search-option\">\n        <mat-form-field [appearance]=\"getProperty('appearance')\" class=\"eru-search-field\">\n          <mat-label>Search</mat-label>\n          <input matInput type=\"text\" class=\"eru-search-input\" [value]=\"searchText()\"\n            (input)=\"onSearchChange($any($event.target).value)\" (click)=\"$event.stopPropagation()\"\n            (keydown)=\"$event.stopPropagation()\">\n        </mat-form-field>\n      </mat-option>\n      }\n      @for (option of filteredOptions(); track option.value) {\n      <mat-option [value]=\"option.value\">{{ option.label }}</mat-option>\n      }\n    </mat-select>\n    }\n    @if (validationErrors().length > 0) {\n    <mat-error>{{ validationErrors()[0] }}</mat-error>\n    }\n  </mat-form-field>\n  }\n</div>","import { Component, ViewEncapsulation, signal, computed, ViewChild, ElementRef, untracked, effect, inject, input, EnvironmentInjector, createEnvironmentInjector } from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { EruComponent, PropertySchema } from '../../models';\nimport { StyleProperties } from '../../models/eru-project.model';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent, StyleSchema } from '../../components/base-component/base-component';\nimport { ComponentRegistryService, EruStudioStore } from '../../services';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\n\n@Component({\n  selector: 'eru-attachment',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    CanvasEventHandlerDirective,\n    NgComponentOutlet,\n    MatButtonModule,\n    MatIconModule,\n    OverlayModule\n  ],\n  templateUrl: './attachment.component.html',\n  styleUrl: './attachment.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class AttachmentComponent extends BaseComponent {\n  override targetElementSelector = '[data-eru-target=\"attachment-button\"]';\n\n  override componentEvents = [\n    { label: 'On Upload', value: 'on_upload' }\n  ];\n\n  private componentRegistry = inject(ComponentRegistryService);\n  private readonly parentEnv = inject(EnvironmentInjector);\n\n  readonly nestingLevel = input<number>(0);\n  readonly selectedComponent = this.store.selectedComponent;\n  readonly componentsReady = signal(false);\n\n  readonly dynamicComponentInjector = createEnvironmentInjector(\n    [\n      { provide: EruStudioStore, useValue: this.store },\n      { provide: LogicEvaluatorService, useValue: this.logicEvaluator }\n    ],\n    this.parentEnv\n  );\n\n  // ── trigger icon ───────────────────────────────────────────────────────────\n  readonly iconName = computed<string>(() =>\n    String(this.getProperty('icon_name') || '').trim() || 'attach_file');\n  readonly iconFontSet = computed<string>(() => this.getProperty('icon_font_set') || '');\n  /**\n   * A CSS colour, not a Material palette name.\n   *\n   * `mat-icon`'s `color` input only paints from the palette, which the studio's\n   * own tokens are not part of — the icon stayed the surface default whatever\n   * was chosen. A `color` property carries a design token or a custom value and\n   * is written straight to the element, which is how every other coloured part\n   * in the library works.\n   */\n  readonly iconColor = computed<string>(() => String(this.getProperty('icon_color') ?? '').trim());\n  readonly iconSize = computed<number>(() =>\n    this.getStylePropertyValue(this.component(), 'icon_size', 20));\n\n  /**\n   * How many clicks open the panel.\n   *\n   * A property rather than a view/edit mode: the trigger renders the same\n   * either way, so a mode would only ever mean \"how many clicks\" — with no\n   * second rendering to return from, and nothing to switch it back. Double\n   * click stays the default, which is what a cell inside a grid needs; single\n   * click suits an attachment standing on its own as a toolbar action.\n   */\n  readonly openOn = computed<'single' | 'double'>(() =>\n    this.getProperty('open_on') === 'single' ? 'single' : 'double');\n\n  /**\n   * The panel's own header strip — a flex container slot, the same arrangement\n   * a card's header uses.\n   *\n   * A slot rather than properties of its own: anything an author wants up there\n   * (a dropdown that scopes the upload, a title, a button) is already a\n   * component carrying its own data source and events, and none of that is\n   * worth reimplementing inside the panel.\n   */\n  readonly showHeader = computed<boolean>(() => this.getProperty('show_header') === true);\n  readonly headerSlot = computed<EruComponent>(() => this.slotComponent());\n\n  private readonly placeholders = new Map<string, EruComponent>();\n\n  isOverlayOpen = signal(false);\n  isDragging = signal(false);\n  currentFiles = signal<{ name: string; status: 'uploading' | 'done' | 'error'; fileId?: string }[]>([]);\n\n  readonly canEdit = computed(() => this.getProperty('editable') !== false && !this.isComponentDisabled());\n\n  @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n  private pendingUploads = new Map<string, string>();\n  /**\n   * Base64 of each file still in flight, keyed by file name.\n   *\n   * Held only until the upload answers: `on_upload` fires from\n   * `handleUploadResponse`, long after the FileReader that produced the content\n   * has gone out of scope, and the event has to be able to carry the file\n   * itself. Dropped as soon as it is emitted so a page does not accumulate every\n   * file uploaded during its life.\n   */\n  private pendingUploadContent = new Map<string, string>();\n  private pendingViewRequests = new Set<string>();\n\n  private _initializedFromStore = false;\n\n  constructor() {\n    super();\n\n    effect(() => {\n      const value = this.storeValue();\n      if (this._initializedFromStore) return;\n      untracked(() => {\n        const files = this.filesFromStoreValue(value);\n        if (files.length > 0) {\n          this._initializedFromStore = true;\n          this.currentFiles.set(files);\n        }\n      });\n    });\n\n    effect(() => {\n      const responses = this.store.dynamicDataResponses();\n      const componentId = untracked(() => this.component()?.id);\n      if (!componentId) return;\n      untracked(() => {\n        for (const [reqId, response] of responses.entries()) {\n          if (!response) continue;\n          if (this.pendingViewRequests.has(reqId)) {\n            if (!response.error && response.file && response.file_type) {\n              this.openFileInNewTab(response.file, response.file_type);\n            }\n            this.pendingViewRequests.delete(reqId);\n            continue;\n          }\n          const originalName = response.original_name || response.file_name;\n          if (originalName && this.pendingUploads.has(originalName)) {\n            // Removed before dispatching, not after: `afterUploadSettled` asks\n            // whether anything is still in flight, and this file is not.\n            this.pendingUploads.delete(originalName);\n            if (response.error) {\n              this.handleUploadError(originalName);\n            } else {\n              this.handleUploadResponse(originalName, response.file_name || response.file_id);\n            }\n          }\n        }\n      });\n    });\n\n    effect(() => {\n      const component = this.component();\n      const showHeader = this.showHeader();\n      if (!component) return;\n      untracked(() => this.reconcileHeaderSlot(component, showHeader));\n    });\n\n    effect(() => {\n      const children = this.component()?.children;\n      this.componentsReady.set(false);\n      if (children && children.length > 0) {\n        Promise.all(\n          children.map((child: EruComponent) =>\n            this.componentRegistry.getComponentClassAsync(child.type)\n          )\n        ).then(() => this.componentsReady.set(true));\n      } else {\n        this.componentsReady.set(true);\n      }\n    });\n  }\n\n  // ── header slot: canvas contract, mirrored from the card's slots ───────────\n\n  getSlotComponentClass(slot: EruComponent): any {\n    const definition = this.componentRegistry.getComponent(slot.type);\n    if (definition?.component) return definition.component;\n    return this.componentRegistry['loadedComponents'].get(slot.type);\n  }\n\n  getZIndex(level: number): number {\n    return 1 + (level * 10);\n  }\n\n  isSlotHovered(slot: EruComponent): boolean {\n    return this.store.hoveredComponentId() === slot.id;\n  }\n\n  onSlotMouseEnter(event: MouseEvent, slot: EruComponent) {\n    if (!this.store.editMode()) return;\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(slot.id);\n  }\n\n  onSlotMouseLeave(event: MouseEvent) {\n    if (!this.store.editMode()) return;\n    event.preventDefault();\n    event.stopPropagation();\n    this.store.setHoveredComponentId(null);\n  }\n\n  onSlotDragStart(event: DragEvent) {\n    // The slot belongs to its attachment; dragging it out would leave the panel\n    // without the container it renders into.\n    event.stopPropagation();\n    event.preventDefault();\n  }\n\n  selectSlot(event: MouseEvent, slot: EruComponent) {\n    if (!this.store.editMode()) return;\n    event.stopPropagation();\n    this.store.setSelectedComponent(slot);\n  }\n\n  private slotId(): string {\n    return `${this.component()?.id ?? ''}-slot-header`;\n  }\n\n  private slotComponent(): EruComponent {\n    const id = this.slotId();\n    const children = this.component()?.children ?? [];\n    const existing = children.find(child => child.id === id);\n    if (existing) return existing;\n\n    // Nothing reconciled yet — at runtime, or on a page saved before the header\n    // existed. A stable stand-in keeps the outlet from being re-created on\n    // every change detection pass. Anything else parked under the attachment is\n    // adopted, since the header is the only place a child can render.\n    const adopted = children.filter(child => child.id !== id);\n    const cached = this.placeholders.get(id);\n    if (cached\n      && cached.children?.length === adopted.length\n      && (cached.children ?? []).every((child, index) => child === adopted[index])) {\n      return cached;\n    }\n    const placeholder = { ...this.createSlotContainer(id), children: adopted };\n    this.placeholders.set(id, placeholder);\n    return placeholder;\n  }\n\n  /**\n   * Keeps the attachment's single child as its header slot. A slot switched off\n   * is kept, never deleted, so its content survives the toggle.\n   */\n  private reconcileHeaderSlot(component: EruComponent, needHeader: boolean): void {\n    if (!this.store.editMode()) return;\n    if (!needHeader) return;\n\n    const id = this.slotId();\n    const children = component.children ?? [];\n    let header = children.find(child => child.id === id) ?? null;\n    const legacy = children.filter(child => child.id !== id);\n\n    if (!header) header = this.createSlotContainer(id);\n    if (legacy.length > 0) {\n      header = { ...header, children: [...(header.children ?? []), ...legacy] };\n    }\n\n    const next = [header];\n    const unchanged = children.length === 1 && children[0] === header;\n    if (unchanged) return;\n\n    this.store.updateComponent(component.id, { children: next });\n  }\n\n  private createSlotContainer(id: string): EruComponent {\n    const now = new Date().toISOString();\n    return {\n      id,\n      type: 'flex_container',\n      properties: {\n        base: { flex_direction: 'row', align_items: 'center', gap: 8 }\n      } as EruComponent['properties'],\n      styles: {\n        classes: '',\n        responsive_classes: {},\n        responsive_styles: {},\n        custom: {}\n      },\n      children: [],\n      created_at: now,\n      updated_at: now\n    };\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'click': '[data-eru-target=\"attachment-button\"]'\n    };\n  }\n\n  toggleOverlay(): void {\n    this.isOverlayOpen.set(!this.isOverlayOpen());\n  }\n\n  onCellClick(): void {\n    if (this.store.editMode()) return;\n    if (this.openOn() !== 'single') return;\n    this.openPanel();\n  }\n\n  onCellDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (this.openOn() !== 'double') return;\n    this.openPanel();\n  }\n\n  /**\n   * A panel emptied by 'Clear and Close on Upload' leaves the field holding its\n   * ids, so the list is rebuilt from them on the way in — otherwise reopening\n   * would show nothing while files are in fact attached.\n   */\n  private openPanel(): void {\n    if (this.currentFiles().length === 0) {\n      const files = untracked(() => this.filesFromStoreValue(this.storeValue()));\n      if (files.length > 0) this.currentFiles.set(files);\n    }\n    this.isOverlayOpen.set(true);\n  }\n\n  private filesFromStoreValue(value: any): { name: string; status: 'done'; fileId: string }[] {\n    if (!value) return [];\n    const raw: string[] = Array.isArray(value)\n      ? value\n      : (typeof value === 'string' && value ? [value] : []);\n    const ids = Array.from(new Set(raw.map(f => typeof f === 'string' ? f : String(f))));\n    return ids.map(f => ({\n      name: f.split('_').slice(2).join('_') || f,\n      status: 'done' as const,\n      fileId: f\n    }));\n  }\n\n  readonly clearAndCloseOnUpload = computed<boolean>(() =>\n    this.getProperty('clear_and_close_on_upload') === true);\n\n  /**\n   * Reset the panel once every file has landed.\n   *\n   * Deferred until nothing is in flight and nothing failed: dropping three\n   * files would otherwise close the panel on the first response and hide the\n   * other two, and closing over an error would hide the one thing the author\n   * needs to see. The field value is left alone — the ids are what the record\n   * keeps, and `openPanel` reads them back.\n   */\n  private afterUploadSettled(): void {\n    if (!this.clearAndCloseOnUpload()) return;\n    if (this.pendingUploads.size > 0) return;\n    if (this.currentFiles().some(f => f.status === 'uploading' || f.status === 'error')) return;\n    this.currentFiles.set([]);\n    this.rejectionMessage.set('');\n    this.isDragging.set(false);\n    this.isOverlayOpen.set(false);\n  }\n\n  onOverlayBackdropClick(): void {\n    this.isOverlayOpen.set(false);\n    this.isDragging.set(false);\n  }\n\n  onOverlayClick(event: Event): void {\n    event.stopPropagation();\n  }\n\n  onUploadClick(): void {\n    this.fileInput?.nativeElement?.click();\n  }\n\n  onFileInputChange(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    if (input.files) {\n      Array.from(input.files).forEach(file => this.uploadFile(file));\n      input.value = '';\n    }\n  }\n\n  onFileDrop(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragging.set(false);\n    if (!event.dataTransfer?.files) return;\n    Array.from(event.dataTransfer.files).forEach(file => this.uploadFile(file));\n  }\n\n  onDragOver(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragging.set(true);\n  }\n\n  onDragLeave(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragging.set(false);\n  }\n\n  onPaste(event: ClipboardEvent): void {\n    event.preventDefault();\n    if (!event.clipboardData?.files.length) return;\n    Array.from(event.clipboardData.files).forEach(file => this.uploadFile(file));\n  }\n\n  /** Max files allowed, from the data model when bound. 0 means no limit. */\n  readonly maxFiles = computed<number>(() => {\n    const n = Number(this.modelOrProperty('max_files'));\n    return Number.isFinite(n) && n > 0 ? Math.floor(n) : 0;\n  });\n\n  /** Max size in bytes. 0 means no limit. */\n  readonly maxFileSize = computed<number>(() => {\n    const n = Number(this.modelOrProperty('max_file_size'));\n    return Number.isFinite(n) && n > 0 ? n : 0;\n  });\n\n  /** Permitted extensions, lower-cased and without a leading dot. Empty = any. */\n  readonly allowedFileTypes = computed<string[]>(() => {\n    const raw = this.modelOrProperty('allowed_file_types');\n    const list = Array.isArray(raw)\n      ? raw\n      : (typeof raw === 'string' ? raw.split(',') : []);\n    return list\n      .map((t: any) => String(t).trim().toLowerCase().replace(/^\\./, ''))\n      .filter((t: string) => t.length > 0);\n  });\n\n  /**\n   * Where uploads go. Seeded by the data model — the field knows the store it\n   * belongs in — and overridable per component, so one page can file the same\n   * field's files somewhere else.\n   */\n  readonly storageName = computed<string>(() =>\n    String(this.propertyOrModel('storage_name') ?? '').trim());\n\n  /**\n   * NAME of a sibling field, not a folder. The folder is that field's value on\n   * the current record, so an attachment lands under the record's own key (a\n   * PAN, a claim number) instead of one flat folder for every row.\n   */\n  readonly folderNameField = computed<string>(() =>\n    String(this.propertyOrModel('folder_name') ?? '').trim());\n\n  /** When off the host's upload service is never called — see `uploadFile`. */\n  readonly defaultUpload = computed<boolean>(() =>\n    this.propertyOrModel('default_upload') !== false);\n\n  /** The sibling field's current value, which is the folder to upload into. */\n  private resolvedFolderName(): string {\n    const field = this.folderNameField();\n    if (!field) return '';\n    const value = this.siblingFieldValue(field);\n    return value === undefined || value === null ? '' : String(value).trim();\n  }\n\n  /** Message shown when the last attempted file was rejected. */\n  readonly rejectionMessage = signal<string>('');\n\n  /**\n   * Why this file cannot be uploaded, or null when it is acceptable.\n   *\n   * Checked before the file is read and enqueued: the upload goes through the\n   * host app via ds_upload_file, so letting an oversized file through means\n   * base64-encoding it and shipping it only for the far end to refuse.\n   */\n  private rejectionReason(file: File): string | null {\n    const types = this.allowedFileTypes();\n    if (types.length > 0) {\n      const ext = (file.name.split('.').pop() || '').toLowerCase();\n      if (!types.includes(ext)) {\n        return `${file.name}: only ${types.join(', ')} allowed`;\n      }\n    }\n    const maxSize = this.maxFileSize();\n    if (maxSize > 0 && file.size > maxSize) {\n      const asMb = (n: number) => `${(n / (1024 * 1024)).toFixed(2)} MB`;\n      return `${file.name}: ${asMb(file.size)} exceeds the ${asMb(maxSize)} limit`;\n    }\n    const maxFiles = this.maxFiles();\n    if (maxFiles > 0 && this.currentFiles().length >= maxFiles) {\n      return `At most ${maxFiles} file${maxFiles === 1 ? '' : 's'} allowed`;\n    }\n    return null;\n  }\n\n  private uploadFile(file: File): void {\n    const existing = this.currentFiles();\n    if (existing.some(f => f.name === file.name)) return;\n\n    const rejection = this.rejectionReason(file);\n    if (rejection) {\n      this.rejectionMessage.set(rejection);\n      return;\n    }\n    this.rejectionMessage.set('');\n\n    this.currentFiles.set([...existing, { name: file.name, status: 'uploading' }]);\n\n    const reader = new FileReader();\n    reader.onload = () => {\n      const raw = reader.result as string;\n      const base64 = raw.includes(',') ? raw.split(',')[1] : raw;\n      const componentId = this.component()?.id || '';\n      untracked(() => {\n        const storageName = this.storageName();\n        const folderName = this.resolvedFolderName();\n        if (!this.defaultUpload()) {\n          this.handleCustomUpload(file.name, base64, storageName, folderName);\n          return;\n        }\n        const comp = this.component();\n        const pageId = comp?.pageId || this.store.currentPage()?.id || '';\n        this.pendingUploads.set(file.name, componentId);\n        this.pendingUploadContent.set(file.name, base64);\n        const payload: Record<string, any> = {\n          file: base64,\n          file_name: file.name,\n          page_id: pageId\n        };\n        // Omitted rather than sent empty: the upload service treats an absent\n        // key as \"use the default\", which is not the same request as one naming\n        // a blank storage or folder.\n        if (storageName) payload['storage_name'] = storageName;\n        if (folderName) payload['folder_name'] = folderName;\n        this.store.requestDynamicData(componentId, 'ds_upload_file', payload);\n      });\n    };\n    reader.readAsDataURL(file);\n  }\n\n  handleUploadResponse(fileName: string, fileId: string): void {\n    this.currentFiles.update(files =>\n      files.map(f => f.name === fileName ? { ...f, status: 'done' as const, fileId } : f)\n    );\n    const fieldName = this.getProperty('name');\n    if (fieldName) {\n      const current = this.storeValue();\n      const arr = Array.isArray(current) ? [...current] : (current ? [current] : []);\n      arr.push(fileId);\n      this.onValueChange(arr);\n    }\n    const file = this.pendingUploadContent.get(fileName) ?? '';\n    this.pendingUploadContent.delete(fileName);\n    this.emitUpload({ fileName, fileId, file });\n    this.afterUploadSettled();\n  }\n\n  /**\n   * The `default_upload` off path: nothing is sent anywhere, and `on_upload`\n   * carries the file itself so a configured action can store it. No file id\n   * exists yet, so the field value is left for that action to write.\n   */\n  private handleCustomUpload(fileName: string, file: string, storageName: string, folderName: string): void {\n    this.currentFiles.update(files =>\n      files.map(f => f.name === fileName ? { ...f, status: 'done' as const } : f)\n    );\n    this.emitUpload({ fileName, file, storageName, folderName });\n    this.afterUploadSettled();\n  }\n\n  /**\n   * Raise `on_upload` with the file attached.\n   *\n   * The detail goes through `payloadOverride.context`, not `emitEvent`'s `data`\n   * argument — `data` is not read by anything, so the file name and id this\n   * event used to pass there reached no handler at all. A context key is merged\n   * onto the subscription payload, which is what a call-function / call-api\n   * action sends and what `set-from-payload` addresses, so an action wired to\n   * this event now receives `upload.file` without the author having to pick it\n   * from anywhere.\n   *\n   * Namespaced under one `upload` key, the way the drill event namespaces its\n   * own, so it cannot collide with the record fields sharing that payload.\n   */\n  private emitUpload(detail: { fileName: string; fileId?: string; file: string; storageName?: string; folderName?: string }): void {\n    this.emitEvent('on_upload', undefined, undefined, {\n      context: {\n        upload: {\n          file: detail.file,\n          file_name: detail.fileName,\n          file_id: detail.fileId ?? '',\n          storage_name: detail.storageName ?? this.storageName(),\n          folder_name: detail.folderName ?? this.resolvedFolderName()\n        }\n      }\n    });\n  }\n\n  handleUploadError(fileName: string): void {\n    this.currentFiles.update(files =>\n      files.map(f => f.name === fileName ? { ...f, status: 'error' as const } : f)\n    );\n  }\n\n  deleteFile(fileName: string, event: Event): void {\n    event.stopPropagation();\n    const file = this.currentFiles().find(f => f.name === fileName);\n    this.currentFiles.set(this.currentFiles().filter(f => f.name !== fileName));\n    // A file removed mid-flight is no longer awaited: leaving it here would\n    // hold `afterUploadSettled` back for good, and its content would sit in\n    // memory for a response that can no longer be matched to a row.\n    this.pendingUploads.delete(fileName);\n    this.pendingUploadContent.delete(fileName);\n    if (file?.fileId && this.getProperty('name')) {\n      const current = this.storeValue();\n      if (Array.isArray(current)) {\n        this.onValueChange(current.filter((id: string) => id !== file.fileId));\n      }\n    }\n  }\n\n  viewFile(fileName: string, event: Event): void {\n    event.stopPropagation();\n    if (!fileName) return;\n    const componentId = this.component()?.id || '';\n    untracked(() => {\n      const requestId = this.store.requestDynamicData(componentId, 'ds_view_file', { file_name: fileName });\n      this.pendingViewRequests.add(requestId);\n    });\n  }\n\n  private openFileInNewTab(base64: string, mimeType: string): void {\n    try {\n      const byteCharacters = atob(base64);\n      const byteNumbers = new Array(byteCharacters.length);\n      for (let i = 0; i < byteCharacters.length; i++) {\n        byteNumbers[i] = byteCharacters.charCodeAt(i);\n      }\n      const byteArray = new Uint8Array(byteNumbers);\n      const blob = new Blob([byteArray], { type: mimeType });\n      const url = URL.createObjectURL(blob);\n      window.open(url, '_blank');\n      setTimeout(() => URL.revokeObjectURL(url), 60000);\n    } catch (err) {\n      console.error('Error opening file:', err);\n    }\n  }\n\n  trackByFile(index: number, file: { name: string }): string {\n    return file.name;\n  }\n\n  getFileName(file: string): string {\n    return file.split('/').pop() || file;\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'label',\n        type: 'text',\n        label: 'Label',\n        category: 'content',\n        default_value: 'Upload File',\n        width: 2\n      },\n      {\n        key: 'show_label',\n        type: 'boolean',\n        label: 'Show Label',\n        category: 'content',\n        default_value: false\n      },\n      {\n        key: 'icon_name',\n        type: 'text',\n        label: 'Icon Name',\n        category: 'content',\n        default_value: 'attach_file',\n        description: 'Material icon shown on the trigger. Blank falls back to attach_file.',\n        width: 'full'\n      },\n      {\n        key: 'icon_font_set',\n        type: 'select',\n        label: 'Icon Style',\n        category: 'content',\n        default_value: '',\n        options: [\n          { label: 'Filled (default)', value: '' },\n          { label: 'Outlined', value: 'material-icons-outlined' },\n          { label: 'Round', value: 'material-icons-round' },\n          { label: 'Sharp', value: 'material-icons-sharp' },\n          { label: 'Two-Tone', value: 'material-icons-two-tone' },\n          { label: 'Symbols Outlined', value: 'material-symbols-outlined' },\n          { label: 'Symbols Rounded', value: 'material-symbols-rounded' },\n          { label: 'Symbols Sharp', value: 'material-symbols-sharp' }\n        ]\n      },\n      {\n        key: 'icon_color',\n        type: 'color',\n        label: 'Icon Color',\n        category: 'content',\n        default_value: '',\n        width: 2,\n        description: 'Design token or custom colour. Blank keeps the surface default.'\n      },\n      {\n        key: 'show_header',\n        type: 'boolean',\n        label: 'Panel Header',\n        category: 'content',\n        default_value: false,\n        description: 'Adds a container at the top of the panel that any component can be dropped into. Switching it off hides the header without discarding what is in it.'\n      },\n      {\n        key: 'label_position',\n        type: 'select',\n        label: 'Label Position',\n        category: 'content',\n        default_value: 'before',\n        options: [\n          { value: 'before', label: 'Before Icon' },\n          { value: 'after', label: 'After Icon' }\n        ],\n        visible_if: { key: 'show_label', equals: true }\n      },\n      {\n        key: 'max_files',\n        type: 'number',\n        label: 'Max Files',\n        category: 'behavior',\n        default_value: null,\n        min: 1,\n        description: 'Most files this field accepts. Blank for no limit. Taken from the data model when the field is bound.'\n      },\n      {\n        key: 'allowed_file_types',\n        type: 'text',\n        label: 'Allowed File Types',\n        category: 'behavior',\n        default_value: '',\n        description: 'Comma-separated extensions, e.g. pdf, png, jpg. Blank allows any type.'\n      },\n      {\n        key: 'max_file_size',\n        type: 'number',\n        label: 'Max File Size (bytes)',\n        category: 'behavior',\n        default_value: null,\n        min: 1,\n        description: 'Largest file this field accepts, checked before upload. Blank for no limit.'\n      },\n      {\n        key: 'default_upload',\n        type: 'boolean',\n        label: 'Default Upload',\n        category: 'behavior',\n        default_value: true,\n        description: 'When off, the file is not sent to the upload service. On Upload fires with the file contents so a configured action can store it instead.'\n      },\n      {\n        key: 'storage_name',\n        type: 'text',\n        label: 'Storage Name',\n        category: 'behavior',\n        default_value: '',\n        description: 'Storage the file is written to. Taken from the data model when the field is bound; set here to override it.',\n        visible_if: { key: 'default_upload', equals: true }\n      },\n      {\n        key: 'folder_name',\n        type: 'autocomplete',\n        label: 'Folder Field',\n        category: 'behavior',\n        dynamic_options: 'entity_field_name',\n        default_value: '',\n        description: \"Field on this record whose value names the folder. Taken from the data model when the field is bound; set here to override it.\",\n        visible_if: { key: 'default_upload', equals: true }\n      },\n      {\n        key: 'clear_and_close_on_upload',\n        type: 'boolean',\n        label: 'Clear and Close on Upload',\n        category: 'behavior',\n        default_value: false,\n        description: 'Once every file has uploaded without error, empty the list and close the panel. The field keeps the uploaded ids, so reopening shows them again.'\n      },\n      {\n        key: 'open_on',\n        type: 'select',\n        label: 'Open Panel On',\n        category: 'behavior',\n        default_value: 'double',\n        options: [\n          { value: 'double', label: 'Double Click' },\n          { value: 'single', label: 'Single Click' }\n        ],\n        description: 'Double click suits a cell inside a grid, where a single click is how a row is picked. Single click suits an attachment standing on its own.'\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'When off, opening the overlay shows it in view mode (file list + view/download only, no upload or delete).'\n      },\n    ];\n  }\n\n  protected override getComponentStyleSchema(): StyleSchema[] {\n    return [\n      {\n        key: 'icon_size',\n        type: 'number',\n        label: 'Icon Size (px)',\n        category: 'style',\n        default_value: 20,\n        min: 12,\n        max: 128,\n        step: 2\n      }\n    ];\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      icon_size: 20\n    };\n  }\n}\n","<div [ngStyle]=\"combinedStyles()\" class=\"eru-attachment-overlay-container\">\n  <div class=\"eru-attachment-cell-wrapper\" cdkOverlayOrigin #attachmentTrigger=\"cdkOverlayOrigin\" [class]=\"classes()\"\n    [class.eru-inline-editable]=\"canInlineEdit()\" eruCanvasEventHandler\n    data-eru-target=\"attachment-button\" (click)=\"onCellClick()\" (dblclick)=\"onCellDoubleClick()\">\n    <div class=\"eru-cell-attachment-container\">\n      @if (getProperty('show_label') && getProperty('label_position') !== 'after') {\n      <span class=\"attachment-label\">{{ getProperty('label') }}</span>\n      }\n      <mat-icon class=\"attachment-pin-icon\" [fontSet]=\"iconFontSet()\" [style.color]=\"iconColor() || null\"\n        [style.font-size.px]=\"iconSize()\" [style.width.px]=\"iconSize()\"\n        [style.height.px]=\"iconSize()\">{{ iconName() }}</mat-icon>\n      @if (currentFiles().length > 0) {\n      <span class=\"attachment-file-count\">{{ currentFiles().length }}</span>\n      }\n      @if (getProperty('show_label') && getProperty('label_position') === 'after') {\n      <span class=\"attachment-label\">{{ getProperty('label') }}</span>\n      }\n    </div>\n  </div>\n\n  <!--\n    The panel never opens on the designer canvas, so its header is rendered\n    here instead while editing — otherwise the slot would exist in the JSON\n    with no surface to drop a component onto.\n  -->\n  @if (showHeader() && store.editMode() && componentsReady()) {\n  <div class=\"eru-attachment-header-designer\">\n    <span class=\"eru-attachment-header-designer-label\">Panel header</span>\n    <ng-container *ngTemplateOutlet=\"headerSlotTemplate\" />\n  </div>\n  }\n\n  <ng-template #headerSlotTemplate>\n    <div class=\"eru-attachment-header-slot\" [class.design-mode]=\"store.editMode()\"\n      [class.selected]=\"selectedComponent()?.id === headerSlot().id\"\n      [class.hovered-drop-target]=\"isSlotHovered(headerSlot())\"\n      [attr.data-container-id]=\"headerSlot().id\" [attr.data-component-id]=\"headerSlot().id\"\n      [attr.data-component-type]=\"'header'\" [attr.data-nesting-level]=\"nestingLevel() + 1\"\n      [style.z-index]=\"getZIndex(nestingLevel() + 1)\"\n      (mouseenter)=\"onSlotMouseEnter($event, headerSlot())\" (mouseleave)=\"onSlotMouseLeave($event)\"\n      (dragstart)=\"onSlotDragStart($event)\" (click)=\"selectSlot($event, headerSlot())\">\n      <ng-container [ngComponentOutlet]=\"getSlotComponentClass(headerSlot())\"\n        [ngComponentOutletInjector]=\"dynamicComponentInjector\"\n        [ngComponentOutletInputs]=\"{ component: headerSlot(), nestingLevel: nestingLevel() + 1 }\" />\n    </div>\n  </ng-template>\n\n  <ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"attachmentTrigger\"\n    [cdkConnectedOverlayOpen]=\"isOverlayOpen()\" [cdkConnectedOverlayHasBackdrop]=\"true\"\n    [cdkConnectedOverlayBackdropClass]=\"'attachment-backdrop'\" (backdropClick)=\"onOverlayBackdropClick()\"\n    (detach)=\"onOverlayBackdropClick()\">\n    <div class=\"eru-attachment-menu-overlay\" style=\"min-width: 300px; width: 300px;\" (click)=\"onOverlayClick($event)\">\n      <div class=\"eru-attachment-container\" (click)=\"$event.stopPropagation()\">\n        @if (showHeader() && componentsReady()) {\n        <div class=\"eru-attachment-custom-header\">\n          <ng-container *ngTemplateOutlet=\"headerSlotTemplate\" />\n        </div>\n        }\n        @if (canEdit()) {\n        <!-- No title above the drop zone: it already says what it is, and the\n             panel is 300px wide — the line only pushed the target down. The\n             read-only branch keeps its \"Files\" heading, which labels a list\n             that has nothing else to name it. -->\n        <div class=\"eru-attachment-drop-zone\" (drop)=\"onFileDrop($event)\" (dragover)=\"onDragOver($event)\"\n          (dragleave)=\"onDragLeave($event)\" (paste)=\"onPaste($event)\"\n          (click)=\"onUploadClick(); $event.stopPropagation()\" [class.eru-dragging]=\"isDragging()\">\n          <div class=\"eru-attachment-drop-content\">\n            <mat-icon class=\"eru-attachment-drop-icon\">add</mat-icon>\n            <div class=\"eru-attachment-drop-text\">\n              <div class=\"eru-primary-text\">Click to upload or drag files here</div>\n              <div class=\"eru-secondary-text\">Support multiple files</div>\n            </div>\n          </div>\n        </div>\n\n        <input #fileInput type=\"file\" multiple (change)=\"onFileInputChange($event)\" style=\"display: none;\">\n        } @else {\n        <div class=\"eru-attachment-header\">\n          <span class=\"eru-attachment-title\">Files</span>\n        </div>\n        }\n\n        @if (rejectionMessage()) {\n        <div class=\"eru-attachment-rejection\" role=\"alert\">{{ rejectionMessage() }}</div>\n        }\n\n        @if (currentFiles().length > 0) {\n        <div class=\"eru-attachment-file-list\">\n          @for (file of currentFiles(); track file.fileId || file.name; let i = $index) {\n          <div class=\"eru-attachment-file-item\" [class.uploading]=\"file.status === 'uploading'\"\n            [class.error]=\"file.status === 'error'\">\n            <div class=\"eru-file-info\">\n              @if (file.status === 'uploading') {\n              <mat-icon class=\"eru-file-status-icon uploading-icon\">sync</mat-icon>\n              } @else if (file.status === 'error') {\n              <mat-icon class=\"eru-file-status-icon error-icon\">error_outline</mat-icon>\n              } @else {\n              <mat-icon class=\"eru-file-status-icon eru-done-icon\">check_circle</mat-icon>\n              }\n              <span class=\"eru-file-name\">{{ file.name }}</span>\n            </div>\n            <div class=\"eru-file-actions\">\n              @if (file.status === 'done' && file.fileId) {\n              <button mat-icon-button class=\"file-view-btn\" (click)=\"viewFile(file.fileId!, $event)\" title=\"View\"\n                type=\"button\">\n                <mat-icon>visibility</mat-icon>\n              </button>\n              }\n              @if (canEdit()) {\n              <button mat-icon-button class=\"file-delete-btn\" (click)=\"deleteFile(file.name, $event)\" title=\"Delete\"\n                type=\"button\">\n                <mat-icon>delete_outline</mat-icon>\n              </button>\n              }\n            </div>\n          </div>\n          }\n        </div>\n        }\n      </div>\n    </div>\n  </ng-template>\n</div>","import { Component, ViewEncapsulation, signal, computed, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\n\n@Component({\n  selector: 'eru-location',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatInputModule\n  ],\n  templateUrl: './location.component.html',\n  styleUrl: './location.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class LocationComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"location-input\"]';\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  readonly displayValue = computed(() => {\n    const value = this.storeValue();\n    if (value === null || value === undefined || value === '') return '';\n    if (Array.isArray(value)) return value.join(', ');\n    return String(value);\n  });\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onLocationBlur(): void {\n    this.markControlAsTouched();\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"location-input\"]',\n      'blur': '[data-eru-blur-target=\"location-input\"]',\n      'click': '[data-eru-click-target=\"location-input\"]',\n      'input': '[data-eru-target=\"location-input\"]'\n    };\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: 'Enter location',\n        width: 2\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view when done.'\n      },\n    ];\n  }\n}\n\n","<div [ngStyle]=\"combinedStyles()\">\n  @if (currentMode() === 'view') {\n  <div class=\"eru-location-display\" [ngStyle]=\"displayContainerStyles()\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n    data-eru-target=\"location-display\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label location-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    @if (displayValue()) {\n    <span class=\"location-display-value\" [ngStyle]=\"displayValueStyles()\">{{ displayValue() }}</span>\n    } @else {\n    <span class=\"location-display-empty\">&mdash;</span>\n    }\n  </div>\n  } @else {\n  <mat-form-field\n    [appearance]=\"getProperty('appearance')\"\n    [class]=\"classes()\"\n    class=\"eru-location-form-field\"\n    eruCanvasEventHandler>\n    <mat-label>{{ getProperty('label') }}</mat-label>\n    @if (formControl) {\n      <input\n        matInput\n        type=\"text\"\n        [placeholder]=\"getProperty('placeholder')\"\n        [required]=\"hasRequiredValidation()\"\n        [formControl]=\"formControl!\"\n        (blur)=\"onLocationBlur()\"\n        data-eru-target=\"location-input\"\n        data-eru-focus-target=\"location-input\"\n        data-eru-blur-target=\"location-input\"\n        data-eru-click-target=\"location-input\">\n    } @else {\n      <input\n        matInput\n        type=\"text\"\n        [placeholder]=\"getProperty('placeholder')\"\n        [required]=\"hasRequiredValidation()\"\n        [disabled]=\"isComponentDisabled()\"\n        [value]=\"storeValue() ?? ''\"\n        (input)=\"onValueChange($any($event.target).value)\"\n        (blur)=\"onLocationBlur()\"\n        data-eru-target=\"location-input\"\n        data-eru-focus-target=\"location-input\"\n        data-eru-blur-target=\"location-input\"\n        data-eru-click-target=\"location-input\">\n    }\n    @if (validationErrors().length > 0) {\n      <mat-error>{{ validationErrors()[0] }}</mat-error>\n    }\n  </mat-form-field>\n  }\n</div>\n\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  EnvironmentInjector,\n  Input,\n  OnChanges,\n  OnInit,\n  SimpleChanges,\n  computed,\n  createEnvironmentInjector,\n  effect,\n  inject,\n  signal,\n  untracked\n} from '@angular/core';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { ComponentRegistryService, EruStudioStore, RowDataContext } from '../../services';\nimport { LogicEvaluatorService } from '../../services/logic-evaluator.service';\nimport { EruComponent } from '../../models';\n\n/**\n * Renders the user card for a single person by loading a designated card-layout\n * page from the host app and projecting its component tree, with the user object\n * exposed to descendants via `RowDataContext`.\n *\n * Used by `eru-people` in view mode when `people_card` names a page and\n * `show_people_card` is 'hover' or 'click'. One instance is created per opened\n * avatar, so each card owns its own RowDataContext.\n */\n@Component({\n  selector: 'eru-people-card-host',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, NgComponentOutlet],\n  providers: [RowDataContext],\n  template: `\n    <div class=\"eru-people-card-host\">\n      @if (componentsReady() && pageComponents().length > 0) {\n        @for (child of pageComponents(); track child.id) {\n          <ng-container\n            *ngComponentOutlet=\"getComponentClass(child.type);\n                                injector: dynamicComponentInjector;\n                                inputs: { component: child }\">\n          </ng-container>\n        }\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; }\n    .eru-people-card-host { display: flex; flex-direction: column; box-sizing: border-box; }\n  `]\n})\nexport class PeopleCardHostComponent implements OnInit, OnChanges {\n  private store = inject(EruStudioStore);\n  private rowDataContext = inject(RowDataContext);\n  private componentRegistry = inject(ComponentRegistryService);\n  private logicEvaluator = inject(LogicEvaluatorService);\n  private parentEnv = inject(EnvironmentInjector);\n\n  @Input() user: Record<string, any> | null = null;\n  @Input() cardPageId: string = '';\n\n  private lastPageRequestId = signal<string | null>(null);\n\n  readonly cardPageDef = computed(() => {\n    const reqId = this.lastPageRequestId();\n    if (!reqId) return null;\n    return this.store.dynamicDataResponses().get(reqId) ?? null;\n  });\n\n  readonly pageComponents = computed<EruComponent[]>(() => {\n    const def = this.cardPageDef() as any;\n    const comps: EruComponent[] | undefined = def?.page_def?.components;\n    if (!comps || comps.length === 0) return [];\n    const cardId = this.cardPageId;\n    const userId = this.user?.['user_id'] ?? '';\n    const markCard = (component: EruComponent): EruComponent => ({\n      ...component,\n      id: `${component.id}_people_${userId}`,\n      isNested: true,\n      pageId: cardId,\n      children: component.children?.map(markCard)\n    });\n    return comps.map(markCard);\n  });\n\n  readonly componentsReady = signal(true);\n\n  readonly dynamicComponentInjector = createEnvironmentInjector(\n    [\n      { provide: EruStudioStore, useValue: this.store },\n      { provide: LogicEvaluatorService, useValue: this.logicEvaluator },\n      { provide: RowDataContext, useValue: this.rowDataContext }\n    ],\n    this.parentEnv\n  );\n\n  constructor() {\n    // The card page's own entity, registered against the id its components\n    // carry (see pageComponents' `pageId` stamp), so a field inside the card\n    // binds to the CARD page's entity rather than the outer page's. Without it\n    // getPageEntityName returns '' for the card id and getEntityField falls back\n    // to the current page's entity: the field is never found and every\n    // data-model owned key (decimal, seperator, label, color_ranges...) silently\n    // reverts to the component's schema default — a field with decimal 0 in the\n    // model rendered with 2 decimals on a card. Same registration page_ref does.\n    effect(() => {\n      const def = (this.cardPageDef() as any)?.page_def;\n      const cardId = this.cardPageId;\n      if (!def || !cardId) return;\n      untracked(() => this.store.registerPageEntityName(cardId, def.entity_name || ''));\n    });\n\n    effect(() => {\n      const comps = this.pageComponents();\n      if (!comps || comps.length === 0) {\n        this.componentsReady.set(true);\n        return;\n      }\n      const types = new Set<string>();\n      const collect = (c: EruComponent) => {\n        types.add(c.type);\n        c.children?.forEach(collect);\n      };\n      comps.forEach(collect);\n      const allLoaded = Array.from(types).every(t => !!this.getComponentClass(t));\n      if (allLoaded) {\n        this.componentsReady.set(true);\n      } else {\n        this.componentsReady.set(false);\n        Promise.all(\n          Array.from(types).map(t => this.componentRegistry.getComponentClassAsync(t))\n        ).then(() => this.componentsReady.set(true));\n      }\n    });\n  }\n\n  ngOnInit(): void {\n    this.applyUser();\n    this.requestCardPage();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['user']) {\n      this.applyUser();\n    }\n    if (changes['cardPageId'] && !changes['cardPageId'].firstChange) {\n      this.requestCardPage();\n    }\n  }\n\n  private applyUser(): void {\n    this.rowDataContext.row.set(this.user ?? null);\n    this.rowDataContext.columns.set([]);\n    this.rowDataContext.group.set(null);\n  }\n\n  private requestCardPage(): void {\n    const id = this.cardPageId;\n    if (!id) return;\n    const reqId = this.store.requestDynamicData(this.cardHostComponentId(), 'ds_page', id);\n    this.lastPageRequestId.set(reqId);\n  }\n\n  private cardHostComponentId(): string {\n    const userId = this.user?.['user_id'] ?? '';\n    return `eru-people-card-host__${this.cardPageId}__${userId}`;\n  }\n\n  getComponentClass(type: string): any {\n    const definition = this.componentRegistry.getComponent(type);\n    if (definition?.component) return definition.component;\n    return (this.componentRegistry as any)['loadedComponents']?.get(type);\n  }\n}\n","import { Component, ViewEncapsulation, signal, computed, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { ConnectedPosition, OverlayModule } from '@angular/cdk/overlay';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\nimport { PeopleCardHostComponent } from './people-card-host.component';\n\nexport interface PeopleOption {\n  value: string;\n  label: string;\n  user: Record<string, any>;\n}\n\n@Component({\n  selector: 'eru-people',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    OverlayModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatSelectModule,\n    MatInputModule,\n    PeopleCardHostComponent\n  ],\n  templateUrl: './people.component.html',\n  styleUrl: './people.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class PeopleComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"people-input\"]';\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  // Process users resolved at runtime: the host app (processo) answers the\n  // ds_people request with the full user objects, so any user attribute can be\n  // used as a display field or bound inside the people card page.\n  private readonly users = signal<Record<string, any>[]>([]);\n  private readonly usersRequestId = signal<string | null>(null);\n  private usersRequested = false;\n\n  readonly searchText = signal<string>('');\n\n  /** user_id whose card overlay is currently open (view mode only). */\n  readonly openCardUserId = signal<string | null>(null);\n\n  /**\n   * User attribute(s) that form the displayed name.\n   *\n   * The data model stores a single field name under `api_field` — the same key a\n   * dropdown uses for its API field — and that wins when the component is bound,\n   * so a page labels people the way the process defines. `display_fields` stays\n   * as the local fallback and still accepts a list, which is richer than the\n   * model can express (e.g. first name + last name joined).\n   */\n  readonly displayFields = computed<string[]>(() => {\n    const fromModel = (this.fieldValue() as any)?.api_field;\n    if (fromModel !== undefined && fromModel !== null && String(fromModel).trim().length > 0) {\n      return [String(fromModel).trim()];\n    }\n    const raw = this.getProperty('display_fields');\n    if (Array.isArray(raw)) {\n      return raw.map((f: any) => String(f || '').trim()).filter((f: string) => f.length > 0);\n    }\n    if (typeof raw === 'string' && raw.trim().length > 0) {\n      return raw.split(',').map((f: string) => f.trim()).filter((f: string) => f.length > 0);\n    }\n    return [];\n  });\n\n  readonly peopleOptions = computed<PeopleOption[]>(() => {\n    const fields = this.displayFields();\n    return this.users()\n      .map((user: Record<string, any>) => ({\n        value: String(user?.['user_id'] ?? ''),\n        label: this.buildLabel(user, fields),\n        user\n      }))\n      .filter((option: PeopleOption) => option.value.length > 0);\n  });\n\n  readonly filteredOptions = computed<PeopleOption[]>(() => {\n    const search = this.searchText().toLowerCase().trim();\n    if (!search) return this.peopleOptions();\n    return this.peopleOptions().filter((option: PeopleOption) =>\n      option.label.toLowerCase().includes(search) ||\n      String(option.user?.['user_email'] || '').toLowerCase().includes(search)\n    );\n  });\n\n  /** Raw stored values, in stored order. A people field holds a list. */\n  readonly selectedValues = computed<string[]>(() => {\n    const value = this.storeValue();\n    if (Array.isArray(value)) {\n      return value\n        .filter((v: any) => v !== null && v !== undefined && String(v).length > 0)\n        .map((v: any) => String(v));\n    }\n    if (value === null || value === undefined || value === '') return [];\n    return [String(value)];\n  });\n\n  /**\n   * Selected people resolved against the user directory. A stored value is a\n   * user_id, but page data seeded elsewhere can hold a name or an email instead,\n   * so the value is matched on those too — otherwise the person would render as\n   * raw text and the dropdown would show nothing selected. Editing normalizes\n   * the field to user_ids.\n   */\n  readonly selectedPeople = computed<{ id: string; label: string; user: Record<string, any> | null }[]>(() => {\n    const seen = new Set<string>();\n    const people: { id: string; label: string; user: Record<string, any> | null }[] = [];\n    for (const raw of this.selectedValues()) {\n      const option = this.optionFor(raw);\n      const id = option?.value || raw;\n      if (seen.has(id)) continue;\n      seen.add(id);\n      people.push({ id, label: option?.label || raw, user: option?.user || null });\n    }\n    return people;\n  });\n\n  /**\n   * Whether more than one person may be picked. The data model's `multiple` wins\n   * when the field is bound. Note the stored value is a list either way — the\n   * flag only constrains how many the user may select, so turning it off never\n   * changes the value shape.\n   */\n  readonly isMultiple = computed<boolean>(() => this.modelOrProperty('multiple') !== false);\n\n  /**\n   * mat-select holds the id list when multiple, a single id otherwise. Page data\n   * always stores a list, so a single selection is unwrapped here and re-wrapped\n   * in onSelectionChange.\n   */\n  readonly selectValue = computed<any>(() => {\n    const ids = this.selectedPeople().map(p => p.id);\n    return this.isMultiple() ? ids : (ids.length > 0 ? ids[0] : null);\n  });\n\n  readonly maxAvatars = computed<number>(() => {\n    const configured = Number(this.getProperty('max_avatars'));\n    return Number.isFinite(configured) && configured > 0 ? Math.floor(configured) : 3;\n  });\n\n  readonly displayAvatars = computed(() => this.selectedPeople().slice(0, this.maxAvatars()));\n\n  readonly remainingCount = computed<number>(() =>\n    Math.max(0, this.selectedPeople().length - this.maxAvatars()));\n\n  readonly displayValue = computed(() =>\n    this.selectedPeople().map(person => person.label).join(', '));\n\n  readonly cardPageId = computed<string>(() => String(this.getProperty('people_card') || ''));\n\n  /** 'none' | 'hover' | 'click' — 'none' whenever no card page is mapped. */\n  readonly cardTrigger = computed<string>(() => {\n    if (!this.cardPageId()) return 'none';\n    const trigger = String(this.getProperty('show_people_card') || 'none');\n    return trigger === 'hover' || trigger === 'click' ? trigger : 'none';\n  });\n\n  /** The card is a view-mode affordance only, and never shown on the designer canvas. */\n  readonly cardEnabled = computed<boolean>(() =>\n    this.currentMode() === 'view' && !this.store.editMode() && this.cardTrigger() !== 'none');\n\n  // Beside the avatar first (right, then left), dropping below only when\n  // neither side fits. Offsets stay small: on hover the cursor has to cross the\n  // gap to reach the card, and a wide one makes that a miss.\n  readonly cardPositions: ConnectedPosition[] = [\n    { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: 2 },\n    { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -2 },\n    { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 2 },\n    { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -2 }\n  ];\n\n  // Leaving the avatar closes the card on a short delay rather than instantly:\n  // the cursor has to travel over the gap between the two, and an immediate\n  // close makes the card impossible to reach. Entering either the avatar or the\n  // card cancels the pending close.\n  private static readonly CARD_CLOSE_DELAY_MS = 220;\n  private closeCardTimer: ReturnType<typeof setTimeout> | null = null;\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n\n    // Ask the host app for the process users once. Labels, avatars and the card\n    // page all read from this single response.\n    effect(() => {\n      const comp = this.component();\n      if (!comp || this.usersRequested) return;\n      this.usersRequested = true;\n      untracked(() => {\n        this.usersRequestId.set(this.store.requestDynamicData(comp.id, 'ds_people', ''));\n      });\n    });\n\n    effect(() => {\n      const reqId = this.usersRequestId();\n      if (!reqId) return;\n      const resp = this.store.dynamicDataResponses().get(reqId);\n      if (resp === undefined) return;\n      untracked(() => {\n        this.users.set(Array.isArray(resp) ? resp : []);\n        this.store.removeDynamicDataRequest(reqId);\n        this.usersRequestId.set(null);\n      });\n    });\n\n    // A card left open while the value or trigger changes would point at a\n    // person who is no longer selected.\n    effect(() => {\n      const openId = this.openCardUserId();\n      if (!openId) return;\n      const stillSelected = this.selectedPeople().some(person => person.id === openId);\n      const enabled = this.cardEnabled();\n      if (!stillSelected || !enabled) {\n        untracked(() => this.openCardUserId.set(null));\n      }\n    });\n  }\n\n  // A people value is always a list, so a freshly created control must start as\n  // an array — the base sync coerces null/undefined to '' which a multiple\n  // mat-select cannot hold.\n  protected override controlValueFor(value: any): any {\n    if (Array.isArray(value)) return value;\n    if (value === null || value === undefined || value === '') return [];\n    return [value];\n  }\n\n  private buildLabel(user: Record<string, any>, fields: string[]): string {\n    if (fields.length > 0) {\n      const label = fields\n        .map((field: string) => user?.[field])\n        .filter((v: any) => v !== null && v !== undefined && String(v).trim().length > 0)\n        .map((v: any) => String(v).trim())\n        .join(' ');\n      if (label.length > 0) return label;\n    }\n    return String(user?.['user_name'] || user?.['user_email'] || user?.['user_id'] || '');\n  }\n\n  private optionFor(value: string): PeopleOption | null {\n    const options = this.peopleOptions();\n    return options.find((o: PeopleOption) => o.value === value)\n      || options.find((o: PeopleOption) => String(o.user?.['user_name'] ?? '') === value)\n      || options.find((o: PeopleOption) => String(o.user?.['user_email'] ?? '') === value)\n      || options.find((o: PeopleOption) => o.label === value)\n      || null;\n  }\n\n  getInitials(name: string): string {\n    if (!name) return '';\n    const words = String(name).trim().split(/\\s+/);\n    if (words.length === 0) return '';\n    const first = words[0].charAt(0).toUpperCase();\n    const second = words.length > 1 ? words[1].charAt(0).toUpperCase() : '';\n    return first + second;\n  }\n\n  onAvatarEnter(userId: string): void {\n    if (!this.cardEnabled() || this.cardTrigger() !== 'hover') return;\n    this.cancelPendingClose();\n    this.openCardUserId.set(userId);\n  }\n\n  onAvatarLeave(): void {\n    if (!this.cardEnabled() || this.cardTrigger() !== 'hover') return;\n    this.cancelPendingClose();\n    this.closeCardTimer = setTimeout(\n      () => {\n        this.closeCardTimer = null;\n        this.openCardUserId.set(null);\n      },\n      PeopleComponent.CARD_CLOSE_DELAY_MS\n    );\n  }\n\n  onAvatarClick(event: Event, userId: string): void {\n    if (!this.cardEnabled() || this.cardTrigger() !== 'click') return;\n    event.stopPropagation();\n    this.openCardUserId.set(this.openCardUserId() === userId ? null : userId);\n  }\n\n  closeCard(): void {\n    this.cancelPendingClose();\n    this.openCardUserId.set(null);\n  }\n\n  private cancelPendingClose(): void {\n    if (this.closeCardTimer === null) return;\n    clearTimeout(this.closeCardTimer);\n    this.closeCardTimer = null;\n  }\n\n  override ngOnDestroy(): void {\n    this.cancelPendingClose();\n    super.ngOnDestroy();\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this.closeCard();\n    this._mode.set('edit');\n  }\n\n  onSearchChange(searchValue: string): void {\n    this.searchText.set(searchValue || '');\n  }\n\n  onSelectionChange(value: any): void {\n    if (Array.isArray(value)) {\n      this.onValueChange(value);\n      return;\n    }\n    this.onValueChange(value === null || value === undefined || value === '' ? [] : [value]);\n  }\n\n  onSelectOpenedChange(opened: boolean): void {\n    this.searchText.set('');\n    if (opened) return;\n    this.resetToDefaultMode();\n  }\n\n  private resetToDefaultMode(): void {\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'focus': '[data-eru-focus-target=\"people-input\"]',\n      'blur': '[data-eru-blur-target=\"people-input\"]',\n      'click': '[data-eru-click-target=\"people-input\"]',\n      'input': '[data-eru-target=\"people-input\"]'\n    };\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: 'Select people...',\n        width: 2\n      },\n      {\n        key: 'display_fields',\n        type: 'multiselect',\n        dynamic_options: 'ds_people_fields',\n        label: 'Display Fields',\n        category: 'content',\n        default_value: ['user_name'],\n        description: 'User attributes shown as the name, joined with a space (e.g. first name + last name).',\n        width: 'full'\n      },\n      {\n        key: 'people_card',\n        type: 'select',\n        dynamic_options: 'ds_page_name',\n        label: 'People Card Page',\n        category: 'data',\n        default_value: '',\n        description: 'Page rendered as the user card next to the avatar. Leave blank for no card.',\n        width: 'full'\n      },\n      {\n        key: 'show_people_card',\n        type: 'select',\n        label: 'Show People Card',\n        category: 'behavior',\n        default_value: 'none',\n        options: [\n          { value: 'none', label: 'Never' },\n          { value: 'hover', label: 'On Hover' },\n          { value: 'click', label: 'On Click' }\n        ],\n        description: 'When to open the mapped card. View mode only.',\n        visible_if: { key: 'people_card', notEquals: '' }\n      },\n      {\n        key: 'multiple',\n        type: 'boolean',\n        label: 'Multiple Selection',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow more than one person. Turn off to force a single selection.'\n      },\n      {\n        key: 'max_avatars',\n        type: 'number',\n        label: 'Max Avatars',\n        category: 'behavior',\n        default_value: 3,\n        min: 1,\n        description: 'Avatars shown before collapsing the rest into a +N circle.',\n        visible_if: { key: 'multiple', notEquals: false }\n      },\n      {\n        key: 'searchable',\n        type: 'boolean',\n        label: 'Searchable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Show a search box inside the dropdown to filter people.'\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view when done.'\n      },\n    ];\n  }\n}\n","<div [ngStyle]=\"combinedStyles()\" class=\"people-overlay-container\">\n  @if (currentMode() === 'view') {\n  <div class=\"eru-people-display\" [ngStyle]=\"displayContainerStyles()\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n    data-eru-target=\"people-display\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label people-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    @if (selectedPeople().length > 0) {\n    <div class=\"people-avatar-row\">\n      @for (person of displayAvatars(); track person.id) {\n      <div class=\"eru-avatar-circle\" cdkOverlayOrigin #avatarTrigger=\"cdkOverlayOrigin\"\n        [class.avatar-clickable]=\"cardEnabled() && cardTrigger() === 'click' && !!person.user\"\n        [style.z-index]=\"displayAvatars().length - $index\" [attr.title]=\"person.label\"\n        (mouseenter)=\"onAvatarEnter(person.id)\" (mouseleave)=\"onAvatarLeave()\"\n        (click)=\"onAvatarClick($event, person.id)\">\n        {{ getInitials(person.label) }}\n      </div>\n      <ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"avatarTrigger\"\n        [cdkConnectedOverlayOpen]=\"cardEnabled() && openCardUserId() === person.id && !!person.user\"\n        [cdkConnectedOverlayPositions]=\"cardPositions\"\n        [cdkConnectedOverlayHasBackdrop]=\"cardTrigger() === 'click'\"\n        [cdkConnectedOverlayBackdropClass]=\"'people-card-backdrop'\" (backdropClick)=\"closeCard()\"\n        (detach)=\"closeCard()\">\n        <div class=\"eru-people-card-overlay\" (mouseenter)=\"onAvatarEnter(person.id)\" (mouseleave)=\"onAvatarLeave()\"\n          (click)=\"$event.stopPropagation()\">\n          <eru-people-card-host [user]=\"person.user\" [cardPageId]=\"cardPageId()\"></eru-people-card-host>\n        </div>\n      </ng-template>\n      }\n      @if (remainingCount() > 0) {\n      <div class=\"eru-avatar-circle eru-count-circle\" [style.z-index]=\"0\" [attr.title]=\"displayValue()\">+{{ remainingCount() }}</div>\n      }\n    </div>\n    } @else {\n    <span class=\"people-display-empty\">&mdash;</span>\n    }\n  </div>\n  } @else {\n  <mat-form-field [appearance]=\"getProperty('appearance') || 'outline'\" class=\"eru-people-form-field\" [class]=\"classes()\"\n    eruCanvasEventHandler (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n    <mat-label>{{ getProperty('label') }}</mat-label>\n    <div class=\"eru-people-select-container\">\n      <mat-select [multiple]=\"isMultiple()\" [required]=\"hasRequiredValidation()\" [disabled]=\"isComponentDisabled()\"\n        [value]=\"selectValue()\" panelClass=\"people-select-panel\" data-eru-target=\"people-select\"\n        (selectionChange)=\"onSelectionChange($event.value)\" (blur)=\"markControlAsTouched()\"\n        (openedChange)=\"onSelectOpenedChange($event)\" (click)=\"$event.stopPropagation()\">\n        <mat-select-trigger>\n          <div class=\"eru-people-trigger-content\">\n            @if (selectedPeople().length > 0) {\n            @for (person of displayAvatars(); track person.id) {\n            <div class=\"eru-avatar-circle\" [style.z-index]=\"displayAvatars().length - $index\" [attr.title]=\"person.label\">\n              {{ getInitials(person.label) }}\n            </div>\n            }\n            @if (remainingCount() > 0) {\n            <div class=\"eru-avatar-circle eru-count-circle\" [style.z-index]=\"0\">+{{ remainingCount() }}</div>\n            }\n            } @else {\n            <span class=\"eru-no-people-text\">{{ getProperty('placeholder') || 'Select people...' }}</span>\n            }\n          </div>\n        </mat-select-trigger>\n        @if (getProperty('searchable')) {\n        <mat-option disabled class=\"eru-search-option\" (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n          (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n          <input class=\"people-search-input\" type=\"text\" placeholder=\"Search people...\" [value]=\"searchText()\"\n            (input)=\"onSearchChange($any($event.target).value)\" (click)=\"$event.stopPropagation()\"\n            (mousedown)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n        </mat-option>\n        }\n        @for (option of filteredOptions(); track option.value) {\n        <mat-option [value]=\"option.value\">\n          <div class=\"eru-option-content\">\n            <div class=\"eru-option-avatar\">{{ getInitials(option.label) }}</div>\n            <span class=\"eru-option-text\">{{ option.label }}</span>\n          </div>\n        </mat-option>\n        }\n      </mat-select>\n    </div>\n    @if (validationErrors().length > 0) {\n    <mat-error>{{ validationErrors()[0] }}</mat-error>\n    }\n  </mat-form-field>\n  }\n</div>\n","import { Component, ViewEncapsulation, signal, computed, effect, inject, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\n\ninterface PriorityOption {\n  value: string;\n  label: string;\n  color: string;\n  /** Material icon name, or raw markup — see resolveIcon(). */\n  icon?: string;\n}\n\n/** Used only when neither the data model nor the component supplies a list. */\nconst PRIORITY_OPTIONS: PriorityOption[] = [\n  { value: 'low', label: 'Low', color: '#22C55E' },\n  { value: 'medium', label: 'Medium', color: '#F59E0B' },\n  { value: 'high', label: 'High', color: '#EF4444' }\n];\n\nconst DEFAULT_PRIORITY_ICON = 'flag';\n\n@Component({\n  selector: 'eru-priority',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatSelectModule,\n    MatOptionModule,\n    MatIconModule\n  ],\n  templateUrl: './priority.component.html',\n  styleUrl: './priority.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class PriorityComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"priority\"]';\n\n  /**\n   * The priority list, from the data model when the field is bound, else the\n   * component's own `options`, else the built-in Low/Medium/High.\n   *\n   * Previously this component only had a `value` select over a hardcoded list,\n   * so a process using Urgent / High / Normal / Low simply could not be\n   * rendered on a page — there was nothing to inherit into.\n   *\n   * Item shapes vary by author: the data model writes `{ label, color }`, the\n   * grid uses `{ value, label, color, icon }`, and a list may arrive as a JSON\n   * string. Identity falls back label -> name -> value so a stored value\n   * matches whichever key the author used.\n   */\n  readonly options = computed<PriorityOption[]>(() => {\n    let raw: any = this.modelOrProperty('options');\n    if (typeof raw === 'string') {\n      try { raw = JSON.parse(raw); } catch { raw = null; }\n    }\n    if (!Array.isArray(raw) || raw.length === 0) return PRIORITY_OPTIONS;\n    const mapped = raw\n      .map((o: any) => {\n        if (typeof o === 'string') {\n          return { value: o, label: o, color: '', icon: undefined } as PriorityOption;\n        }\n        const label = String(o?.label ?? o?.name ?? o?.value ?? '').trim();\n        const value = String(o?.value ?? o?.name ?? o?.label ?? '').trim();\n        return { value, label, color: o?.color || '', icon: o?.icon || undefined } as PriorityOption;\n      })\n      .filter((o: PriorityOption) => o.label.length > 0);\n    return mapped.length > 0 ? mapped : PRIORITY_OPTIONS;\n  });\n\n  private _mode = signal<'view' | 'edit'>('view');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  readonly currentValue = computed(() => {\n    const fieldVal = this.storeValue();\n    if (fieldVal !== undefined && fieldVal !== null && fieldVal !== '') {\n      return String(fieldVal);\n    }\n    return String(this.getProperty('value') ?? '');\n  });\n\n  readonly currentOption = computed<PriorityOption | null>(() => {\n    const val = this.currentValue();\n    if (!val) return null;\n    const options = this.options();\n    // A stored value may be the option's value or its label, depending on which\n    // the author wrote — the data model stores the label as the default.\n    return options.find(o => o.value === val)\n      || options.find(o => o.label === val)\n      || null;\n  });\n\n  readonly displayColor = computed(() => {\n    return this.currentOption()?.color || '#9ca3af';\n  });\n\n  /**\n   * Icon for an option. The grid ships raw markup in `icon`, while a Material\n   * icon name is the natural form here — so markup is detected and rendered as\n   * HTML, and anything else is treated as an icon name. That way a list authored\n   * for either library works, and a list with no icon falls back to the flag.\n   */\n  iconName(option: PriorityOption | null): string {\n    const icon = option?.icon?.trim();\n    if (!icon || icon.includes('<')) return DEFAULT_PRIORITY_ICON;\n    return icon;\n  }\n\n  /** Raw-markup icon, when the option carries one. Null otherwise. */\n  iconMarkup(option: PriorityOption | null): SafeHtml | null {\n    const icon = option?.icon?.trim();\n    if (!icon || !icon.includes('<')) return null;\n    return this.sanitizer.bypassSecurityTrustHtml(icon);\n  }\n\n  private sanitizer = inject(DomSanitizer);\n\n  /** Where the component's Label sits relative to the control: left, above, or hidden. */\n  readonly labelPosition = computed<'left' | 'above' | 'none'>(() => {\n    const v = this.getProperty('show_label');\n    return v === 'left' || v === 'above' ? v : 'none';\n  });\n\n  readonly labelText = computed<string>(() => this.resolvedLabel());\n\n  /**\n   * Display mode only. The dropdown is a Material control and carries its own\n   * floating label like every other field, so a second label there would be a\n   * duplicate; the display row has nowhere to put one, which is what this\n   * property is for.\n   */\n  readonly showLabel = computed<boolean>(() =>\n    this.currentMode() === 'view' && this.labelPosition() !== 'none' && !!this.labelText());\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'view') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'click': '[data-eru-target=\"priority\"]'\n    };\n  }\n\n  onBadgeDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onPriorityChange(value: string): void {\n    this.onValueChange(value);\n    this.resetToDefaultMode();\n  }\n\n  onSelectOpenedChange(opened: boolean): void {\n    if (opened) return;\n    this.resetToDefaultMode();\n  }\n\n  private resetToDefaultMode(): void {\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'view') as 'view' | 'edit');\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'options',\n        type: 'status_options',\n        label: 'Options',\n        category: 'content',\n        default_value: [\n          { label: 'Low', color: '#22C55E' },\n          { label: 'Medium', color: '#F59E0B' },\n          { label: 'High', color: '#EF4444' }\n        ],\n        width: 'full',\n        description: 'Priority list with a colour per item. Locked when the bound data-model field defines its own — the model is the single place the list is authored, so every page and grid shows the same priorities.',\n        disable_if: {\n          evaluate: (getValue: (k: string) => any) => {\n            const ef: any = this.store.getEntityField(getValue('name'));\n            return Array.isArray(ef?.options) && ef.options.length > 0;\n          }\n        }\n      },\n      {\n        key: 'show_label',\n        type: 'select',\n        label: 'Show Label',\n        category: 'content',\n        default_value: 'none',\n        options: [\n          { value: 'none', label: 'None' },\n          { value: 'left', label: 'Left' },\n          { value: 'above', label: 'Above' }\n        ],\n        description: 'Where to show the component Label in display mode. The dropdown always uses Material\\'s own floating label.'\n      },\n      {\n        key: 'value',\n        type: 'text',\n        label: 'Default Priority',\n        category: 'content',\n        default_value: '',\n        description: 'Shown when page data holds no value. Match an option label.'\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view (on close).'\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'view',\n        options: [\n          { value: 'view', label: 'Badge (View)' },\n          { value: 'edit', label: 'Dropdown (Edit)' }\n        ]\n      }\n    ];\n  }\n}\n\n","<div [ngStyle]=\"combinedStyles()\" class=\"priority-shell\"\n  [class.priority-shell-left]=\"showLabel() && labelPosition() === 'left'\"\n  [class.priority-shell-above]=\"showLabel() && labelPosition() === 'above'\">\n  @if (showLabel()) {\n  <span class=\"eru-priority-label-text\">{{ labelText() }}</span>\n  }\n  @if (currentMode() === 'edit') {\n  <mat-form-field\n    [appearance]=\"getProperty('appearance') || 'outline'\"\n    class=\"eru-priority-form-field\"\n    [class]=\"classes()\"\n    eruCanvasEventHandler\n    (click)=\"$event.stopPropagation()\"\n    (mousedown)=\"$event.stopPropagation()\">\n    <mat-label>{{ labelText() }}</mat-label>\n    <div class=\"eru-priority-container\">\n      <mat-select\n        [placeholder]=\"getProperty('placeholder') || ''\"\n        [disabled]=\"isComponentDisabled()\"\n        [required]=\"hasRequiredValidation()\"\n        [value]=\"currentValue()\"\n        panelClass=\"eru-priority-panel\"\n        data-eru-target=\"priority\"\n        (click)=\"$event.stopPropagation()\"\n        (openedChange)=\"onSelectOpenedChange($event)\"\n        (selectionChange)=\"onPriorityChange($event.value)\">\n        <mat-select-trigger>\n          <span class=\"eru-priority-trigger\">\n            @if (iconMarkup(currentOption())) {\n              <span class=\"eru-priority-icon-trigger\" [style.color]=\"displayColor()\" [innerHTML]=\"iconMarkup(currentOption())\"></span>\n            } @else {\n              <mat-icon class=\"eru-priority-icon-trigger\" [style.color]=\"displayColor()\">{{ iconName(currentOption()) }}</mat-icon>\n            }\n            <span>{{ currentOption()?.label || options()[0]?.label || '' }}</span>\n          </span>\n        </mat-select-trigger>\n        @for (option of options(); track option.value) {\n          <mat-option [value]=\"option.value\">\n            <span class=\"eru-priority-option\">\n              @if (iconMarkup(option)) {\n                <span class=\"eru-priority-icon\" [style.color]=\"option.color\" [innerHTML]=\"iconMarkup(option)\"></span>\n              } @else {\n                <mat-icon class=\"eru-priority-icon\" [style.color]=\"option.color\">{{ iconName(option) }}</mat-icon>\n              }\n              <span class=\"eru-priority-label\">{{ option.label }}</span>\n            </span>\n          </mat-option>\n        }\n      </mat-select>\n    </div>\n    @if (validationErrors().length > 0) {\n      <mat-error>{{ validationErrors()[0] }}</mat-error>\n    }\n  </mat-form-field>\n  } @else {\n  <div\n    class=\"eru-priority-display\"\n    [class]=\"classes()\"\n    [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onBadgeDoubleClick()\"\n    eruCanvasEventHandler\n    data-eru-target=\"priority\">\n    @if (iconMarkup(currentOption())) {\n      <span class=\"eru-priority-icon-display\" [style.color]=\"displayColor()\" [innerHTML]=\"iconMarkup(currentOption())\"></span>\n    } @else {\n      <mat-icon class=\"eru-priority-icon-display\" [style.color]=\"displayColor()\">{{ iconName(currentOption()) }}</mat-icon>\n    }\n    <span>{{ currentOption()?.label || currentValue() || 'No priority' }}</span>\n  </div>\n  }\n</div>\n","import { Component, ViewEncapsulation, signal, computed, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\n\n@Component({\n  selector: 'eru-progress',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    CanvasEventHandlerDirective,\n    MatSliderModule\n  ],\n  templateUrl: './progress.component.html',\n  styleUrl: './progress.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class ProgressComponent extends BaseComponent {\n  override targetElementSelector = '[data-eru-target=\"progress\"]';\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  readonly sliderDisabled = computed(() => {\n    if (this.isComponentDisabled()) return true;\n    return this.currentMode() === 'view';\n  });\n\n  readonly currentValue = computed(() => {\n    // Every reader (the label, the fill, the slider) is numeric, so a value that\n    // will not parse has to be dropped here rather than propagated — a bound\n    // field holding a non-numeric placeholder used to render \"NaN%\".\n    const value = this.storeValue();\n    if (value !== null && value !== undefined && value !== '') {\n      const n = Number(value);\n      if (Number.isFinite(n)) return n;\n    }\n    const fallback = Number(this.getProperty('value'));\n    return Number.isFinite(fallback) ? fallback : 0;\n  });\n\n  /**\n   * Scale bounds. The bound field's definition wins, so a field scaled 0-5 in\n   * the data model renders across its real range instead of appearing almost\n   * empty on a 0-100 bar. Falls back to the component's own properties, then to\n   * 0-100 so existing pages are unaffected.\n   */\n  private scaleBound(modelKey: 'start_value' | 'end_value', fallback: number): number {\n    const fromModel = Number((this.fieldValue() as any)?.[modelKey]);\n    if (Number.isFinite(fromModel)) return fromModel;\n    const own = Number(this.getProperty(modelKey));\n    return Number.isFinite(own) ? own : fallback;\n  }\n\n  readonly scaleStart = computed<number>(() => this.scaleBound('start_value', 0));\n\n  readonly scaleEnd = computed<number>(() => {\n    const end = this.scaleBound('end_value', 100);\n    // A degenerate range would make the slider unusable.\n    return end > this.scaleStart() ? end : this.scaleStart() + 100;\n  });\n\n  /**\n   * Whether to show the value as a percentage. `is_perc` is the data model's\n   * flag; it only reads as a percentage when the scale actually is 0-100, so a\n   * custom scale shows the raw value with its bounds instead.\n   */\n  readonly showPercent = computed<boolean>(() => {\n    const fromModel = (this.fieldValue() as any)?.is_perc;\n    const flag = fromModel !== undefined && fromModel !== null\n      ? !!fromModel\n      : this.getProperty('is_perc') !== false;\n    return flag && this.scaleStart() === 0 && this.scaleEnd() === 100;\n  });\n\n  /** Label beside the bar: \"45%\" on a percentage scale, \"3 / 5\" otherwise. */\n  readonly valueLabel = computed<string>(() =>\n    this.showPercent()\n      ? `${this.currentValue()}%`\n      : `${this.currentValue()} / ${this.scaleEnd()}`);\n\n  // Bar colour from the configured value ranges (e.g. 0-20 green). Applies in\n  // both edit and view/disabled modes. Null when no range matches, so the bar\n  // falls back to the default theme colour.\n  readonly barColor = computed<string | null>(() => {\n    return this.matchColorRange(this.currentValue())?.color || null;\n  });\n\n  readonly trackColor = computed<string | null>(() => {\n    return this.matchColorRange(this.currentValue())?.background || null;\n  });\n\n  /**\n   * How much of the view-mode bar is filled, 0-100.\n   *\n   * Computed against the configured scale rather than assuming 0-100, so a\n   * field scaled 0-5 in the data model fills proportionally — the same rule the\n   * slider follows through its min/max.\n   */\n  readonly fillPercent = computed<number>(() => {\n    const start = this.scaleStart();\n    const end = this.scaleEnd();\n    const span = end - start;\n    if (!Number.isFinite(span) || span <= 0) return 0;\n    const ratio = (this.currentValue() - start) / span;\n    return Math.max(0, Math.min(100, ratio * 100));\n  });\n\n  /**\n   * Diameter of the slider's round handle, as a CSS length, or null to leave\n   * Material's own size (20px) alone. The handle is the circle shown beside the\n   * percentage, and on a compact board card the default reads as oversized.\n   */\n  readonly handleSize = computed<string | null>(() => {\n    const v = this.getProperty('handle_size');\n    if (v === undefined || v === null || v === '') return null;\n    const n = Number(v);\n    return Number.isFinite(n) && n > 0 ? `${n}px` : null;\n  });\n\n  /** Where the component's Label sits relative to the bar: left, above, or hidden. */\n  readonly labelPosition = computed<'left' | 'above' | 'none'>(() => {\n    const v = this.getProperty('show_label');\n    return v === 'left' || v === 'above' ? v : 'none';\n  });\n\n  readonly labelText = computed<string>(() => this.resolvedLabel());\n\n  readonly showLabel = computed<boolean>(() => this.labelPosition() !== 'none' && !!this.labelText());\n\n  /**\n   * With a label shown, the component's own styles move to the wrapper so the\n   * label sits inside the same box and inherits font settings; the bar keeps\n   * only its layout styles. Without one, nothing changes.\n   */\n  readonly innerStyles = computed(() => this.showLabel() ? {} : this.combinedStyles());\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onSliderBlur(): void {\n    this.markControlAsTouched();\n    this.resetToDefaultMode();\n  }\n\n  private resetToDefaultMode(): void {\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {};\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'show_label',\n        type: 'select',\n        label: 'Show Label',\n        category: 'content',\n        default_value: 'none',\n        options: [\n          { value: 'none', label: 'None' },\n          { value: 'left', label: 'Left' },\n          { value: 'above', label: 'Above' }\n        ],\n        description: 'Where to show the component Label. None hides it.'\n      },\n      {\n        key: 'value',\n        type: 'number',\n        label: 'Value',\n        category: 'content',\n        default_value: 50,\n        min: 0,\n        description: 'Value shown when page data holds none. Not capped, since the scale is configurable.'\n      },\n      {\n        key: 'start_value',\n        type: 'number',\n        label: 'Scale Start',\n        category: 'behavior',\n        default_value: 0,\n        description: 'Lower bound of the bar. A bound field takes its scale from the data model instead.'\n      },\n      {\n        key: 'end_value',\n        type: 'number',\n        label: 'Scale End',\n        category: 'behavior',\n        default_value: 100,\n        description: 'Upper bound of the bar. A bound field takes its scale from the data model instead.'\n      },\n      {\n        key: 'is_perc',\n        type: 'boolean',\n        label: 'Show As Percentage',\n        category: 'behavior',\n        default_value: true,\n        description: 'Show the value with a % sign. Only applies on a 0-100 scale; a custom scale shows \"value / end\" instead.'\n      },\n      {\n        key: 'mode',\n        type: 'select',\n        label: 'Mode',\n        category: 'behavior',\n        default_value: 'determinate',\n        options: [\n          { value: 'determinate', label: 'Determinate' },\n          { value: 'indeterminate', label: 'Indeterminate' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View (Disabled)' },\n          { value: 'edit', label: 'Edit (Enabled)' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'When off, the slider stays disabled. When on, double-click enables it for changes; it returns to the default mode when done.'\n      },\n      {\n        key: 'handle_size',\n        type: 'number',\n        label: 'Handle Size (px)',\n        category: 'behavior',\n        default_value: '',\n        min: 4,\n        responsive: true,\n        description: 'Diameter of the round handle on the slider. Leave blank for the default (20px). Set per viewport.'\n      },\n      {\n        key: 'color_ranges',\n        type: 'color_ranges',\n        label: 'Colour ranges (by value)',\n        category: 'content',\n        default_value: [],\n        width: 'full',\n        min: 0,\n        description: 'Colour the bar when the value falls in a range — Text is the filled bar, Fill is the track behind it. Leave a bound blank for an open-ended range. Rows are checked top-down and the first match wins, so order matters. Locked when the mapped data-model field already defines ranges.',\n        disable_if: { evaluate: (getValue) => this.hasModelColorRanges(getValue) }\n      }\n    ];\n  }\n}\n","@if (showLabel()) {\n<div [ngStyle]=\"combinedStyles()\" class=\"progress-label-wrapper\"\n  [class.label-above]=\"labelPosition() === 'above'\">\n  <span class=\"progress-label\">{{ labelText() }}</span>\n  <ng-container *ngTemplateOutlet=\"control\"></ng-container>\n</div>\n} @else {\n<ng-container *ngTemplateOutlet=\"control\"></ng-container>\n}\n\n<ng-template #control>\n@if (sliderDisabled()) {\n<!-- View mode: a plain track + fill rather than a disabled mat-slider.\n     The slider mounted even when the control was read-only, and with\n     showTickMarks over its whole scale it renders one tick element per step —\n     ~101 DOM nodes for a 0-100 bar, on every progress control on the page. It\n     also read as interactive when it was not: the thumb invited a drag that did\n     nothing. Double-click still enters edit, which mounts the real slider.\n     Mirrors the same change in eru-grid's progress cell. -->\n<div [ngStyle]=\"innerStyles()\" class=\"eru-progress-input-container eru-progress-view-container\" [class]=\"classes()\"\n  [class.eru-inline-editable]=\"canInlineEdit()\"\n  eruCanvasEventHandler data-eru-target=\"progress\" (dblclick)=\"onDisplayDoubleClick()\">\n  <span class=\"eru-progress-value\" [style.color]=\"barColor()\">{{ valueLabel() }}</span>\n  <div class=\"eru-progress-view-track\" [style.background]=\"trackColor()\">\n    <div class=\"eru-progress-view-fill\" [style.width.%]=\"fillPercent()\" [style.background]=\"barColor()\"></div>\n  </div>\n</div>\n} @else {\n<div [ngStyle]=\"innerStyles()\" class=\"eru-progress-input-container\" [class]=\"classes()\" eruCanvasEventHandler\n  data-eru-target=\"progress\" (dblclick)=\"onDisplayDoubleClick()\"\n  [style.--mat-slider-active-track-color]=\"barColor()\"\n  [style.--mat-slider-disabled-active-track-color]=\"barColor()\"\n  [style.--mat-slider-with-tick-marks-active-container-color]=\"barColor()\"\n  [style.--mat-slider-handle-color]=\"barColor()\"\n  [style.--mat-slider-focus-handle-color]=\"barColor()\"\n  [style.--mat-slider-hover-handle-color]=\"barColor()\"\n  [style.--mat-slider-disabled-handle-color]=\"barColor()\"\n  [style.--mat-slider-ripple-color]=\"barColor()\"\n  [style.--mat-slider-inactive-track-color]=\"trackColor()\"\n  [style.--mat-slider-disabled-inactive-track-color]=\"trackColor()\"\n  [style.--mat-slider-with-tick-marks-inactive-container-color]=\"trackColor()\"\n  [style.--mat-slider-handle-width]=\"handleSize()\"\n  [style.--mat-slider-handle-height]=\"handleSize()\">\n  <span class=\"eru-progress-value\" [style.color]=\"barColor()\">{{ valueLabel() }}</span>\n  <mat-slider\n    class=\"eru-progress-slider\"\n    [min]=\"scaleStart()\"\n    [max]=\"scaleEnd()\"\n    [step]=\"1\"\n    [discrete]=\"true\"\n    [showTickMarks]=\"true\"\n    [disabled]=\"sliderDisabled()\">\n    <input matSliderThumb [ngModel]=\"currentValue()\" (ngModelChange)=\"onValueChange($event)\" (blur)=\"onSliderBlur()\">\n  </mat-slider>\n</div>\n}\n</ng-template>\n","import { Component, ViewEncapsulation, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PropertySchema } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\n\nconst RATING_ICONS: Record<string, { filled: string; empty: string; useOpacity: boolean }> = {\n  star:     { filled: '★', empty: '☆', useOpacity: false },\n  heart:    { filled: '♥', empty: '♡', useOpacity: false },\n  smiley:   { filled: '☺', empty: '☹', useOpacity: false },\n  thumbsup: { filled: '👍', empty: '👍', useOpacity: true  },\n  check:    { filled: '✔', empty: '○', useOpacity: false },\n};\n\n@Component({\n  selector: 'eru-rating',\n  standalone: true,\n  imports: [CommonModule, CanvasEventHandlerDirective],\n  templateUrl: './rating.component.html',\n  styleUrl: './rating.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class RatingComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"rating\"]';\n\n  hoverValue = signal<number>(0);\n\n  currentValue = computed(() => Number(this.storeValue() ?? this.getProperty('value') ?? 0));\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'click': '[data-eru-target=\"rating\"]'\n    };\n  }\n\n  getItems(): number[] {\n    const max = this.getPropertyWithLegacy('end_value', 'max') || 5;\n    return Array.from({ length: max }, (_, i) => i + 1);\n  }\n\n  getIconDef() {\n    const type = this.getPropertyWithLegacy('emoji_value', 'icon_type') || 'star';\n    return RATING_ICONS[type] || RATING_ICONS['star'];\n  }\n\n  getIcon(index: number): string {\n    const def = this.getIconDef();\n    const active = this.hoverValue() > 0 ? index <= this.hoverValue() : index <= this.currentValue();\n    return active ? def.filled : def.empty;\n  }\n\n  isActive(index: number): boolean {\n    const active = this.hoverValue() > 0 ? index <= this.hoverValue() : index <= this.currentValue();\n    return active;\n  }\n\n  useOpacity(): boolean {\n    return this.getIconDef().useOpacity;\n  }\n\n  /**\n   * Lowest selectable rating: the bound field's `start_value` wins, then the\n   * component's own property, defaulting to 1. Only a scale starting at 0 can\n   * represent \"unrated\", so that is what decides whether re-clicking the\n   * current rating clears it.\n   */\n  readonly scaleStart = computed<number>(() => {\n    const fromModel = Number((this.fieldValue() as any)?.start_value);\n    if (Number.isFinite(fromModel)) return fromModel;\n    const own = Number(this.getProperty('start_value'));\n    return Number.isFinite(own) ? own : 1;\n  });\n\n  onItemClick(index: number, event: Event): void {\n    event.stopPropagation();\n    if (this.isComponentDisabled()) return;\n    // Re-clicking the current rating clears it, but only when the scale starts\n    // at 0 — on a 1..n scale there is no value to clear to.\n    const clearable = this.scaleStart() <= 0;\n    const newValue = (index === this.currentValue() && clearable) ? 0 : index;\n    // Write through the form control like every other input component, so a\n    // rating bound to a field saves to the row. Previously this wrote\n    // setProperty('value'), which persists to the page definition instead —\n    // asymmetric with currentValue(), which reads storeValue() first.\n    this.onValueChange(newValue);\n  }\n\n  onItemHover(index: number): void {\n    if (this.isComponentDisabled()) return;\n    this.hoverValue.set(index);\n  }\n\n  override onMouseLeave(): void {\n    this.hoverValue.set(0);\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'emoji_value',\n        type: 'select',\n        label: 'Icon Type',\n        category: 'content',\n        default_value: 'star',\n        options: [\n          { value: 'star',     label: '★ Star' },\n          { value: 'heart',    label: '♥ Heart' },\n          { value: 'smiley',   label: '☺ Smiley' },\n          { value: 'thumbsup', label: '👍 Thumbs Up' },\n          { value: 'check',    label: '✔ Check' },\n        ]\n      },\n      {\n        key: 'value',\n        type: 'number',\n        label: 'Rating',\n        category: 'content',\n        default_value: 0,\n        min: 0,\n        max: 10\n      },\n      {\n        key: 'start_value',\n        type: 'number',\n        label: 'Scale Start',\n        category: 'behavior',\n        default_value: 1,\n        min: 0,\n        max: 1,\n        description: 'Lowest selectable rating. 1 by default; set 0 when \"unrated\" must be distinct from the lowest rating.'\n      },\n      {\n        key: 'end_value',\n        type: 'number',\n        label: 'Max',\n        category: 'behavior',\n        default_value: 5,\n        min: 1,\n        max: 10\n      },\n    ];\n  }\n}\n","<div\n  [ngStyle]=\"combinedStyles()\"\n  class=\"eru-rating-container\" [ngStyle]=\"displayContainerStyles()\"\n  [class]=\"classes()\"\n  [class.rating-disabled]=\"isComponentDisabled()\"\n  eruCanvasEventHandler\n  data-eru-target=\"rating\"\n  (mouseleave)=\"onMouseLeave()\">\n  @if (getProperty('label')) {\n  <span class=\"eru-display-label rating-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n  }\n  <span class=\"rating-row\">\n  @for (item of getItems(); track item) {\n    <span\n      class=\"rating-item\"\n      [class.active]=\"isActive(item)\"\n      [class.opacity-inactive]=\"useOpacity() && !isActive(item)\"\n      (click)=\"onItemClick(item, $event)\"\n      (mouseenter)=\"onItemHover(item)\">\n      {{ getIcon(item) }}\n    </span>\n  }\n  <span class=\"eru-rating-value\">{{ currentValue() }}/{{ getPropertyWithLegacy('end_value', 'max') || 5 }}</span>\n  </span>\n</div>\n","import { Component, ViewEncapsulation, signal, computed, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\nimport { StyleProperties } from '../../models/eru-project.model';\n// Shared with eru-grid so a status field cannot resolve differently on a page\n// than it does in a grid.\nimport { normalizeDatatype, statusPillColors } from 'eru-grid';\n\ninterface StatusOption {\n  label: string;\n  color: string;\n  group: 'open' | 'close';\n  /** Marked as the default in the data model. */\n  df?: boolean;\n}\n\n@Component({\n  selector: 'eru-status',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatSelectModule,\n    MatOptionModule,\n    MatTooltipModule\n  ],\n  templateUrl: './status.component.html',\n  styleUrl: './status.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class StatusComponent extends BaseComponent {\n  override targetElementSelector = '[data-eru-target=\"status\"]';\n\n  private _mode = signal<'view' | 'edit'>('view');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  /** Where the component's Label sits relative to the control: left, above, or hidden. */\n  readonly labelPosition = computed<'left' | 'above' | 'none'>(() => {\n    const v = this.getProperty('show_label');\n    return v === 'left' || v === 'above' ? v : 'none';\n  });\n\n  readonly labelText = computed<string>(() => this.resolvedLabel());\n\n  /**\n   * Badge mode only. The dropdown is a Material control and carries its own\n   * floating label like every other field, so a second label there would be a\n   * duplicate; the badge has nowhere to put one, which is what this property is\n   * for.\n   */\n  readonly showLabel = computed<boolean>(() =>\n    this.currentMode() === 'view' && this.labelPosition() !== 'none' && !!this.labelText());\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'view') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return { 'click': '[data-eru-target=\"status\"]' };\n  }\n\n  readonly allOptions = computed<StatusOption[]>(() => {\n    // fieldValue() resolves the entity field against THIS component's page —\n    // getPageEntityName(pageId) — not the outer page's. Looking it up by field\n    // name alone fell back to the current page's entity, so a status inside a\n    // page_ref took its vocabulary from the host: several entities here each\n    // have an `is` field with different statuses, and the panel's financed\n    // invoice would have been matched against the invoice entity's list. A\n    // value that exists in one list and not the other then matches no option\n    // and the badge falls back to grey.\n    const entityField = this.fieldValue() as any;\n    // normalizeDatatype maps the backend's `r_status` onto `status`, so a record\n    // status field resolves its open/close lists here rather than falling\n    // through to the component's placeholder options.\n    if (entityField && normalizeDatatype(entityField.datatype) === 'status') {\n      return this.parseEntityStatusOptions(entityField);\n    }\n\n    return [\n      ...this.parseJsonOptions(this.getPropertyWithLegacy('open_status', 'open_statuses'), 'open'),\n      ...this.parseJsonOptions(this.getPropertyWithLegacy('close_status', 'close_statuses'), 'close')\n    ];\n  });\n\n  /**\n   * The status to show when page data holds none.\n   *\n   * `df` on the option is the single source of truth — it is what the data model\n   * marks, and it survives a rename because the flag travels with the item,\n   * where a separate stored label would dangle. The component's own `value`\n   * property is the fallback for an unbound status, and is locked in the panel\n   * whenever the model marks a default.\n   */\n  readonly defaultStatusLabel = computed<string>(() => {\n    const flagged = this.allOptions().find(o => o.df);\n    if (flagged) return flagged.label;\n    return String(this.getProperty('value') ?? '');\n  });\n\n  readonly currentValue = computed(() => {\n    const source = this.getProperty('value_source') || 'static';\n    const valuePath = this.getProperty('value_path') || '';\n\n    if (source === 'state') {\n      const stateKey = this.getProperty('state_key') || this.getProperty('name');\n      if (!stateKey) return '';\n      const pageId = this.component()?.pageId;\n      const dataKey = this.dataKey();\n      const state = pageId ? this.store.getComputedPageStateFor(pageId, dataKey || undefined) : this.store.computedPageState();\n      return String(this.resolveByPath(state[stateKey] ?? '', valuePath) ?? '');\n    }\n\n    if (source === 'field') {\n      return String(this.resolveByPath(this.storeValue() ?? '', valuePath) ?? '');\n    }\n\n    // Page data wins; the configured/flagged default fills in when it holds\n    // nothing, so a new record opens on the model's default status.\n    const stored = this.storeValue();\n    if (stored !== undefined && stored !== null && stored !== '') {\n      return String(stored);\n    }\n    return this.defaultStatusLabel();\n  });\n\n  private resolveByPath(value: any, path: string): any {\n    if (!path) return value;\n    let obj = value;\n    if (typeof obj === 'string') {\n      try { obj = JSON.parse(obj); } catch { return value; }\n    }\n    if (obj === null || typeof obj !== 'object') return value;\n    const segments = path.replace(/\\[(\\w+)\\]/g, '.$1').split('.').filter(Boolean);\n    let current = obj;\n    for (const segment of segments) {\n      if (current === null || current === undefined) return '';\n      current = current[segment];\n    }\n    return current ?? '';\n  }\n\n  readonly currentOption = computed<StatusOption | null>(() => {\n    const val = this.currentValue();\n    if (!val) return null;\n    return this.allOptions().find(o => o.label === val) || null;\n  });\n\n  readonly displayColor = computed(() => {\n    return this.currentOption()?.color || '#9ca3af';\n  });\n\n  /**\n   * Fill, border and text for the badge — from eru-grid, so a status renders\n   * identically on a page and in a grid cell. The badge previously mixed its own\n   * alphas (10% fill, 25% border, the raw colour as text), which is the same\n   * value painted two different ways in two places.\n   */\n  readonly pillColors = computed(() => statusPillColors(this.displayColor()));\n\n  /**\n   * How badge mode paints the status: the labelled pill, or a colour ring with a\n   * dot in it whose tooltip carries the label. Same key and same two values as\n   * eru-grid's `status_view` column setting, so a status reads the same way on a\n   * page as it does in a grid. Anything unset stays the pill.\n   */\n  readonly statusView = computed<'pill' | 'dot'>(() =>\n    this.getProperty('status_view') === 'dot' ? 'dot' : 'pill');\n\n  /** The label a badge shows, and what the dot variant puts in its tooltip. */\n  readonly badgeText = computed<string>(() =>\n    this.currentOption()?.label || this.currentValue() || 'No status');\n\n  onBadgeDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onStatusChange(value: string): void {\n    this.onValueChange(value);\n    this.resetToDefaultMode();\n  }\n\n  onSelectOpenedChange(opened: boolean): void {\n    if (opened) return;\n    this.resetToDefaultMode();\n  }\n\n  private resetToDefaultMode(): void {\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'view') as 'view' | 'edit');\n  }\n\n  private parseEntityStatusOptions(entityField: any): StatusOption[] {\n    const options: StatusOption[] = [];\n    const openRaw = entityField.open_status;\n    const closeRaw = entityField.close_status;\n\n    // The data model stores each status as { name, color } — `name` is the\n    // label, and matching it against the stored value is what colours the\n    // badge. Entries may also be plain strings.\n    const collect = (raw: any, group: 'open' | 'close', fallbackColor: string) => {\n      if (!raw) return;\n      const parsed = typeof raw === 'string' ? this.tryParseJson(raw) : raw;\n      if (!Array.isArray(parsed)) return;\n      parsed.forEach((o: any) => {\n        const label = typeof o === 'string' ? o : (o?.name ?? o?.label ?? '');\n        if (!label) return;\n        options.push({\n          label: String(label),\n          color: (typeof o === 'object' && o?.color) || fallbackColor,\n          group,\n          df: typeof o === 'object' ? !!o?.df : false,\n        });\n      });\n    };\n\n    collect(openRaw, 'open', '#22C55E');\n    collect(closeRaw, 'close', '#EF4444');\n    return options;\n  }\n\n  private parseJsonOptions(raw: any, group: 'open' | 'close'): StatusOption[] {\n    if (!raw) return [];\n    const parsed = typeof raw === 'string' ? this.tryParseJson(raw) : raw;\n    if (!Array.isArray(parsed)) return [];\n    return parsed.map((o: any) => ({\n      label: o.label || o,\n      color: o.color || (group === 'open' ? '#22C55E' : '#EF4444'),\n      group,\n      df: !!o?.df,\n    }));\n  }\n\n  private tryParseJson(str: string): any {\n    try { return JSON.parse(str); } catch { return null; }\n  }\n\n  private getStatusSelectOptions(): { value: string; label: string }[] {\n    const comp = this.component();\n    const openRaw = comp?.properties?.base?.['open_status'] ?? comp?.properties?.base?.['open_statuses'];\n    const closeRaw = comp?.properties?.base?.['close_status'] ?? comp?.properties?.base?.['close_statuses'];\n    const open = this.parseJsonOptions(openRaw, 'open');\n    const close = this.parseJsonOptions(closeRaw, 'close');\n    return [{ value: '', label: '-- None --' }, ...[...open, ...close].map(o => ({ value: o.label, label: o.label }))];\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'value_source',\n        label: 'Value Source',\n        type: 'select',\n        category: 'content',\n        default_value: 'static',\n        options: [\n          { value: 'static', label: 'Static' },\n          { value: 'field', label: 'Page Data Field' },\n          { value: 'state', label: 'Page State' }\n        ]\n      },\n      {\n        key: 'state_key',\n        label: 'State Variable',\n        type: 'select',\n        category: 'content',\n        dynamic_options: 'ds_page_state_vars',\n        visible_if: { key: 'value_source', equals: 'state' }\n      },\n      {\n        key: 'value_path',\n        label: 'Value Path',\n        type: 'text',\n        category: 'content',\n        default_value: '',\n        description: 'Dot/bracket path to extract from a JSON value (e.g. data.status or items[0].label). Leave empty to use the value as is.',\n        visible_if: { key: 'value_source', in: ['field', 'state'] }\n      },\n      {\n        key: 'value',\n        label: 'Default Value',\n        type: 'select',\n        category: 'content',\n        default_value: '',\n        visible_if: { key: 'value_source', equals: 'static' },\n        options: this.getStatusSelectOptions(),\n        description: 'Status shown when page data holds none. Locked when the bound data-model field already marks one as default (df).',\n        disable_if: {\n          evaluate: (getValue: (k: string) => any) => {\n            const ef: any = this.store.getEntityField(getValue('name'));\n            const lists = [...(Array.isArray(ef?.open_status) ? ef.open_status : []),\n                           ...(Array.isArray(ef?.close_status) ? ef.close_status : [])];\n            return lists.some((o: any) => o && typeof o === 'object' && !!o.df);\n          }\n        }\n      },\n      {\n        key: 'status_view',\n        label: 'View Style',\n        type: 'select',\n        category: 'content',\n        default_value: 'pill',\n        options: [\n          { value: 'pill', label: 'Pill (Label)' },\n          { value: 'dot', label: 'Dot (Tooltip)' }\n        ],\n        description: 'How the status reads in badge mode. Dot shows only the colour and moves the label into a tooltip.'\n      },\n      {\n        key: 'show_label',\n        label: 'Show Label',\n        type: 'select',\n        category: 'content',\n        default_value: 'none',\n        options: [\n          { value: 'none', label: 'None' },\n          { value: 'left', label: 'Left' },\n          { value: 'above', label: 'Above' }\n        ],\n        description: 'Where to show the component Label in badge mode. The dropdown always uses Material\\'s own floating label.'\n      },\n      {\n        key: 'open_status',\n        label: 'Open Statuses',\n        type: 'status_options',\n        category: 'content',\n        default_value: [{ label: 'Active', color: '#22C55E' }],\n        description: 'Add open status...',\n        width: 'full'\n      },\n      {\n        key: 'close_status',\n        label: 'Close Statuses',\n        type: 'status_options',\n        category: 'content',\n        default_value: [{ label: 'Closed', color: '#EF4444' }],\n        description: 'Add close status...',\n        width: 'full'\n      },\n      {\n        key: 'editable',\n        label: 'Editable',\n        type: 'boolean',\n        category: 'behavior',\n        default_value: true\n      },\n      {\n        key: 'default_mode',\n        label: 'Default Mode',\n        type: 'select',\n        category: 'behavior',\n        default_value: 'view',\n        options: [\n          { value: 'view', label: 'Badge (View)' },\n          { value: 'edit', label: 'Dropdown (Edit)' }\n        ]\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      value_source: 'static',\n      value: '',\n      status_view: 'pill',\n      open_status: [{ label: 'Active', color: '#22C55E' }],\n      close_status: [{ label: 'Closed', color: '#EF4444' }],\n      editable: true,\n      default_mode: 'view'\n    };\n  }\n\n  protected override getComponentDefaultStyles(): StyleProperties {\n    return {\n      font_size: 12\n    };\n  }\n}\n","<div [ngStyle]=\"combinedStyles()\" class=\"status-shell\"\n  [class.status-shell-left]=\"showLabel() && labelPosition() === 'left'\"\n  [class.status-shell-above]=\"showLabel() && labelPosition() === 'above'\">\n  @if (showLabel()) {\n  <span class=\"status-label-text\">{{ labelText() }}</span>\n  }\n  @if (currentMode() === 'edit') {\n  <mat-form-field\n    [appearance]=\"getProperty('appearance') || 'outline'\"\n    class=\"eru-status-form-field\"\n    eruCanvasEventHandler\n    (click)=\"$event.stopPropagation()\"\n    (mousedown)=\"$event.stopPropagation()\">\n    <mat-label>{{ labelText() }}</mat-label>\n    <mat-select\n      [placeholder]=\"getProperty('placeholder') || 'Select status...'\"\n      [required]=\"hasRequiredValidation()\"\n      [disabled]=\"isComponentDisabled()\"\n      [value]=\"currentValue()\"\n      panelClass=\"eru-status-panel\"\n      data-eru-target=\"status\"\n      (click)=\"$event.stopPropagation()\"\n      (openedChange)=\"onSelectOpenedChange($event)\"\n      (selectionChange)=\"onStatusChange($event.value)\">\n      <!-- The closed trigger carries the same dot + colour as the option list,\n           so a status reads at a glance in edit mode too. -->\n      <mat-select-trigger>\n        <span class=\"eru-status-option-content\">\n          <span class=\"eru-status-option-indicator\" [style.background-color]=\"displayColor()\" [style.border-color]=\"displayColor()\"></span>\n          <span class=\"eru-status-option-label\" [style.color]=\"pillColors().text\">{{ currentOption()?.label || currentValue() }}</span>\n        </span>\n      </mat-select-trigger>\n      @for (option of allOptions(); track option.label) {\n        <mat-option [value]=\"option.label\">\n          <div class=\"eru-status-option-content\">\n            <span class=\"eru-status-option-indicator\" [style.background-color]=\"option.color\" [style.border-color]=\"option.color\"></span>\n            <span class=\"eru-status-option-label\">{{ option.label }}</span>\n          </div>\n        </mat-option>\n      }\n    </mat-select>\n  </mat-form-field>\n  } @else if (statusView() === 'dot') {\n  <!-- Dot variant: the colour alone carries the status and the label moves into\n       the tooltip, for places with no room for a labelled pill. -->\n  <div\n    class=\"status-dot-badge\"\n    [class.eru-inline-editable]=\"canInlineEdit()\"\n    [style.background-color]=\"pillColors().background\"\n    [style.border-color]=\"pillColors().border\"\n    [matTooltip]=\"badgeText()\"\n    matTooltipPosition=\"above\"\n    (dblclick)=\"onBadgeDoubleClick()\"\n    eruCanvasEventHandler\n    data-eru-target=\"status\">\n    <span class=\"status-dot\" [style.background-color]=\"pillColors().border\"></span>\n  </div>\n  } @else {\n  <div\n    class=\"status-badge\"\n    [class.eru-inline-editable]=\"canInlineEdit()\"\n    [style.background-color]=\"pillColors().background\"\n    [style.border-color]=\"pillColors().border\"\n    [style.color]=\"pillColors().text\"\n    (dblclick)=\"onBadgeDoubleClick()\"\n    eruCanvasEventHandler\n    data-eru-target=\"status\">\n    <span class=\"status-label\">{{ badgeText() }}</span>\n  </div>\n  }\n</div>\n","import { Component, ViewEncapsulation, signal, computed, effect, untracked } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { PropertySchema, EruComponentProperties } from '../../models';\nimport { CanvasEventHandlerDirective } from '../../directives/canvas-event-handler.directive';\nimport { BaseComponent } from '../../components/base-component/base-component';\nimport { TagPillColors, tagPillColors } from 'eru-grid';\nimport { ChipListComponent, ChipListItem } from 'eru-grid';\n\ninterface TagOption {\n  value: string;\n  label: string;\n  color: string;\n}\n\n@Component({\n  selector: 'eru-tag',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    CanvasEventHandlerDirective,\n    MatFormFieldModule,\n    MatSelectModule\n  ,\n    ChipListComponent],\n  templateUrl: './tag.component.html',\n  styleUrl: './tag.component.scss',\n  encapsulation: ViewEncapsulation.None\n})\nexport class TagComponent extends BaseComponent {\n  protected override supportsValueSource(): boolean {\n    return true;\n  }\n\n  override targetElementSelector = '[data-eru-target=\"tag\"]';\n\n  private _mode = signal<'view' | 'edit'>('edit');\n\n  readonly currentMode = computed<'view' | 'edit'>(() => {\n    if (this.getProperty('editable') === false) return 'view';\n    return this._mode();\n  });\n\n  /**\n   * The field definition the option list comes from.\n   *\n   * Normally the tag's own bound field. `options_from_field` points it at\n   * another field instead, which is what a filter needs: it wants a status\n   * column's values and colours while storing its selection somewhere that is\n   * not that column — binding by `name` to get the list would also bind the\n   * value, and writing several statuses back into a record is exactly the thing\n   * a status field must not allow.\n   */\n  private readonly optionsField = computed<any>(() => {\n    const borrowed = String(this.getProperty('options_from_field') || '').trim();\n    if (!borrowed) return this.fieldValue();\n    const entityName = this.store.getPageEntityName(this.component()?.pageId || '');\n    return this.store.getEntityField(borrowed, entityName);\n  });\n\n  readonly tagOptions = computed<TagOption[]>(() => {\n    // The bound field's list is authoritative — the same rule status and select\n    // follow, so a tag renders identically on a page and in a grid. The\n    // component's own property is the fallback for an unbound tag.\n    const ef = this.optionsField();\n    // A status field keeps its values in `open_status`/`close_status`, not in\n    // `options`. Read by shape rather than by datatype, matching\n    // BaseComponent.modelOptionColors — `r_status` is in neither library's\n    // datatype union and still has to resolve. Without this a tag bound to a\n    // status field found no `options`, fell through to its own placeholder\n    // list, and showed neither the real statuses nor their colours.\n    const statusShaped = ef && (ef.open_status || ef.close_status);\n    if (statusShaped) {\n      const out: TagOption[] = [];\n      const seen = new Set<string>();\n      const collect = (source: any, fallback: string) => {\n        let parsed = source;\n        if (typeof parsed === 'string') {\n          try { parsed = JSON.parse(parsed); } catch { return; }\n        }\n        if (!Array.isArray(parsed)) return;\n        for (const opt of parsed) {\n          const label = String(\n            (typeof opt === 'string' ? opt : (opt?.name ?? opt?.label)) ?? ''\n          ).trim();\n          // First definition wins, so a value listed in both groups keeps the\n          // colour of the group that declared it first.\n          if (!label || seen.has(label)) continue;\n          seen.add(label);\n          out.push({ value: label, label, color: (typeof opt === 'object' && opt?.color) || fallback });\n        }\n      };\n      collect(ef.open_status, '#22C55E');\n      collect(ef.close_status, '#EF4444');\n      return out;\n    }\n\n    let raw: any = (ef && Array.isArray(ef.options) && ef.options.length > 0)\n      ? ef.options\n      : this.getPropertyWithLegacy('options', 'tag_options');\n    if (typeof raw === 'string') {\n      try { raw = JSON.parse(raw); } catch { raw = []; }\n    }\n    if (!Array.isArray(raw)) return [];\n    return raw\n      .map((opt: any) => {\n        // Data-model options carry `name`; panel-authored ones carry `label`.\n        const label = String(opt?.label ?? opt?.name ?? opt ?? '').trim();\n        return { value: label, label, color: opt?.color || '' };\n      })\n      .filter((opt: TagOption) => opt.label.length > 0);\n  });\n\n  /**\n   * View mode shows every selected tag, wrapping onto further lines, instead of\n   * fitting one row and folding the rest into `+N`. Edit mode keeps folding —\n   * a select's closed trigger is one line by construction.\n   */\n  readonly showAllTagsInView = computed<boolean>(\n    () => this.getProperty('view_all_options') === true\n  );\n\n  readonly selectedValues = computed<string[]>(() => {\n    const value = this.storeValue();\n    if (value === null || value === undefined || value === '') return [];\n    if (Array.isArray(value)) return value.map((v) => String(v));\n    return String(value)\n      .split(',')\n      .map((v) => v.trim())\n      .filter((v) => v.length > 0);\n  });\n\n  constructor() {\n    super();\n    effect(() => {\n      const dm = (this.getProperty('default_mode') || 'edit') as 'view' | 'edit';\n      untracked(() => this._mode.set(dm));\n    });\n  }\n\n  onDisplayDoubleClick(): void {\n    if (this.store.editMode()) return;\n    if (!this.getProperty('editable')) return;\n    if (this.isComponentDisabled()) return;\n    this._mode.set('edit');\n  }\n\n  onSelectOpenedChange(opened: boolean): void {\n    if (opened) return;\n    this.resetToDefaultMode();\n  }\n\n  private resetToDefaultMode(): void {\n    if (this.store.editMode()) return;\n    if (this.getProperty('editable') === false) return;\n    this._mode.set((this.getProperty('default_mode') || 'edit') as 'view' | 'edit');\n  }\n\n  onSelectionChange(value: string[] | null): void {\n    const tags = value || [];\n    this.onValueChange(tags.length > 0 ? tags : null);\n  }\n\n  /**\n   * Selected tags as coloured chips for the shared chip row.\n   *\n   * The colour is part of a tag's meaning, so it travels with the label instead\n   * of the chip list assuming a neutral pill.\n   */\n  readonly tagChips = computed<ChipListItem[]>(() =>\n    (this.selectedValues() || [])\n      .filter(tag => tag !== null && tag !== undefined && String(tag).length > 0)\n      .map(tag => {\n        const colors = this.getTagColor(String(tag));\n        return { label: String(tag), background: colors.background, color: colors.text, dot: colors.dot };\n      }));\n\n  getTagColor(value: string): TagPillColors {\n    const option = this.tagOptions().find((opt) => opt.value === value);\n    return tagPillColors(option?.color);\n  }\n\n  protected override getEventTargets(): { [event: string]: string } {\n    return {\n      'change': '[data-eru-target=\"tag\"]',\n      'click': '[data-eru-target=\"tag\"]'\n    };\n  }\n\n  protected override getComponentPropertySchema(): PropertySchema[] {\n    return [\n      {\n        key: 'label',\n        type: 'text',\n        label: 'Tag Label',\n        category: 'content',\n        default_value: 'Tag',\n        width: 2\n      },\n      {\n        key: 'placeholder',\n        type: 'text',\n        label: 'Placeholder',\n        category: 'content',\n        default_value: 'Select tags',\n        width: 2\n      },\n      {\n        key: 'options',\n        type: 'status_options',\n        label: 'Options',\n        category: 'content',\n        default_value: [\n          { label: 'Active', color: '#22C55E' },\n          { label: 'Pending', color: '#F59E0B' },\n          { label: 'Closed', color: '#EF4444' }\n        ],\n        description: 'Add tag...',\n        width: 'full'\n      },\n      {\n        key: 'options_from_field',\n        type: 'select',\n        label: 'Options From Field',\n        category: 'content',\n        dynamic_options: 'entity_field_name',\n        description: 'Take the option list and colours from another field\\'s data model instead of this one\\'s. Works for a tag, select or status field — use it for a filter that offers a status column\\'s values without writing back to it.'\n      },\n      {\n        key: 'view_all_options',\n        type: 'boolean',\n        label: 'Show All Tags In View',\n        category: 'behavior',\n        default_value: false,\n        description: 'Show every selected tag in view mode, wrapping onto the next line. Off folds whatever does not fit one row into a +N counter.'\n      },\n      {\n        key: 'appearance',\n        type: 'select',\n        label: 'Appearance',\n        category: 'behavior',\n        default_value: 'outline',\n        options: [\n          { value: 'fill', label: 'Fill' },\n          { value: 'outline', label: 'Outline' }\n        ]\n      },\n      {\n        key: 'default_mode',\n        type: 'select',\n        label: 'Default Mode',\n        category: 'behavior',\n        default_value: 'edit',\n        options: [\n          { value: 'view', label: 'View' },\n          { value: 'edit', label: 'Edit' }\n        ]\n      },\n      {\n        key: 'editable',\n        type: 'boolean',\n        label: 'Editable',\n        category: 'behavior',\n        default_value: true,\n        description: 'Allow switching from view to edit (double-click) and back to view when done.'\n      }\n    ];\n  }\n\n  protected override getComponentDefaultProperties(): EruComponentProperties {\n    return {\n      label: 'Tag',\n      placeholder: 'Select tags',\n      default_mode: 'edit',\n      editable: true,\n      options: [\n        { label: 'Active', color: '#22C55E' },\n        { label: 'Pending', color: '#F59E0B' },\n        { label: 'Closed', color: '#EF4444' }\n      ]\n    };\n  }\n}\n","<div [ngStyle]=\"combinedStyles()\">\n  @if (currentMode() === 'view') {\n  <div class=\"eru-tag-display\" [ngStyle]=\"displayContainerStyles()\" [class]=\"classes()\" [class.eru-inline-editable]=\"canInlineEdit()\"\n    (dblclick)=\"onDisplayDoubleClick()\" eruCanvasEventHandler\n    data-eru-target=\"tag-display\">\n    @if (getProperty('label')) {\n    <span class=\"eru-display-label tag-display-label\" [ngStyle]=\"displayLabelStyles()\">{{ getProperty('label') }}</span>\n    }\n    @if (selectedValues().length > 0) {\n    <eru-chip-list class=\"tag-display-value\" [ngStyle]=\"displayValueStyles()\" [chips]=\"tagChips()\" [compact]=\"true\"\n      [wrap]=\"showAllTagsInView()\"></eru-chip-list>\n    } @else {\n    <span class=\"tag-display-empty\">&mdash;</span>\n    }\n  </div>\n  } @else {\n  <mat-form-field\n    [appearance]=\"getProperty('appearance') || 'outline'\"\n    class=\"eru-tag-form-field\"\n    [class]=\"classes()\"\n    eruCanvasEventHandler\n    (click)=\"$event.stopPropagation()\"\n    (mousedown)=\"$event.stopPropagation()\">\n    <mat-label>{{ getProperty('label') }}</mat-label>\n    <div class=\"eru-tag-container\">\n      <mat-select\n        [placeholder]=\"getProperty('placeholder') || ''\"\n        [multiple]=\"true\"\n        [disabled]=\"isComponentDisabled()\"\n        [required]=\"hasRequiredValidation()\"\n        [value]=\"selectedValues()\"\n        panelClass=\"eru-tag-panel\"\n        data-eru-target=\"tag\"\n        (selectionChange)=\"onSelectionChange($event.value)\"\n        (openedChange)=\"onSelectOpenedChange($event)\"\n        (click)=\"$event.stopPropagation()\">\n        <!-- Material's own custom-trigger hook (MatSelectTrigger): the closed\n             control shows the same coloured chip row as view mode instead of\n             mat-select's comma-joined text. Unconditional, because\n             `customTrigger` is a content query and gating it behind an @if\n             leaves it unresolved; mat-select shows its placeholder while the\n             value is empty, so an always-present trigger costs nothing. -->\n        <mat-select-trigger>\n          <eru-chip-list [chips]=\"tagChips()\" [compact]=\"true\"></eru-chip-list>\n        </mat-select-trigger>\n        @for (option of tagOptions(); track option.value) {\n        <mat-option [value]=\"option.value\">\n          <span class=\"eru-tag-option\" [style.background]=\"getTagColor(option.value).background\"\n            [style.color]=\"getTagColor(option.value).text\">\n            <span class=\"eru-tag-dot\" [style.background]=\"getTagColor(option.value).dot\"></span>\n            {{ option.label }}\n          </span>\n        </mat-option>\n        }\n      </mat-select>\n    </div>\n    @if (validationErrors().length > 0) {\n      <mat-error>{{ validationErrors()[0] }}</mat-error>\n    }\n  </mat-form-field>\n  }\n</div>\n","import { ComponentDefinition } from '../models';\nimport {\n  GhostComponent,\n  TextComponent,\n  TileComponent,\n  ButtonComponent,\n  ImageComponent,\n  ButtonToggleComponent,\n  BadgeComponent,\n  ChipsComponent,\n  IconComponent,\n  ProgressBarComponent,\n  ProgressSpinnerComponent,\n  TimerComponent,\n  FlexContainerComponent,\n  GridContainerComponent,\n  CardComponent,\n  DividerComponent,\n  ExpansionPanelComponent,\n  ListComponent,\n  StepperComponent,\n  SidebarStepperComponent,\n  TreeComponent,\n  GridListComponent,\n  RadioComponent,\n  SliderComponent,\n  SlideToggleComponent,\n  AutocompleteComponent,\n  PhoneComponent,\n  ToolbarComponent,\n  MenuComponent,\n  SidenavComponent,\n  TabsComponent,\n  NavMenuComponent,\n  NavOutletComponent,\n  EruPageComponent,\n  PageRefComponent,\n  GridComponent,\n  LineChartComponent,\n  BarChartComponent,\n  PieChartComponent\n} from '../components';\nimport {\n  EmailComponent,\n  NumberComponent,\n  CurrencyComponent,\n  DateComponent,\n  DatetimeComponent,\n  TimePickerComponent,\n  DurationComponent,\n  WebsiteComponent,\n  TextareaComponent,\n  TextboxComponent,\n  CheckboxComponent as EruCheckboxComponent,\n  SelectComponent as EruSelectComponent,\n  AttachmentComponent,\n  LocationComponent,\n  PeopleComponent,\n  PriorityComponent,\n  ProgressComponent,\n  RatingComponent,\n  StatusComponent,\n  TagComponent\n} from '../eru_components/index';\n\nexport const BASIC_COMPONENTS: ComponentDefinition[] = [\n  {\n    type: 'text',\n    name: 'Text',\n    category: 'basic',\n    icon: 'text_fields',\n    allow_children: false,\n    component: TextComponent\n  },\n  {\n    type: 'button',\n    name: 'Button',\n    category: 'basic',\n    icon: 'smart_button',\n    allow_children: false,\n    component: ButtonComponent\n  },\n  {\n    type: 'image',\n    name: 'Image',\n    category: 'basic',\n    icon: 'image',\n    allow_children: false,\n    component: ImageComponent\n  },\n  {\n    type: 'button_toggle',\n    name: 'Button Toggle',\n    category: 'basic',\n    icon: 'toggle_off',\n    allow_children: false,\n    component: ButtonToggleComponent\n  },\n  {\n    type: 'badge',\n    name: 'Badge',\n    category: 'basic',\n    icon: 'label',\n    allow_children: false,\n    component: BadgeComponent\n  },\n  {\n    type: 'chips',\n    name: 'Chips',\n    category: 'basic',\n    icon: 'label',\n    allow_children: false,\n    component: ChipsComponent\n  },\n  {\n    type: 'icon',\n    name: 'Icon',\n    category: 'basic',\n    icon: 'star',\n    allow_children: false,\n    component: IconComponent\n  },\n  {\n    type: 'progress_bar',\n    name: 'Progress Bar',\n    category: 'basic',\n    icon: 'linear_scale',\n    allow_children: false,\n    component: ProgressBarComponent\n  },\n  {\n    type: 'progress_spinner',\n    name: 'Progress Spinner',\n    category: 'basic',\n    icon: 'cached',\n    allow_children: false,\n    component: ProgressSpinnerComponent\n  },\n  {\n    type: 'tile',\n    name: 'Tile',\n    category: 'basic',\n    icon: 'dashboard',\n    allow_children: false,\n    component: TileComponent\n  },\n  {\n    type: 'timer',\n    name: 'Timer',\n    category: 'basic',\n    icon: 'timer',\n    allow_children: false,\n    component: TimerComponent\n  }\n];\n\nexport const LAYOUT_COMPONENTS: ComponentDefinition[] = [\n  {\n    type: 'flex_container',\n    name: 'Flex Container',\n    category: 'layout',\n    icon: 'view_column',\n    allow_children: true,\n    component: FlexContainerComponent\n  },\n  {\n    type: 'grid_container',\n    name: 'Grid Container',\n    category: 'layout',\n    icon: 'grid_view',\n    allow_children: true,\n    component: GridContainerComponent\n  },\n  {\n    type: 'card',\n    name: 'Card',\n    category: 'layout',\n    icon: 'crop_portrait',\n    allow_children: true,\n    component: CardComponent\n  },\n  {\n    type: 'divider',\n    name: 'Divider',\n    category: 'layout',\n    icon: 'horizontal_rule',\n    allow_children: false,\n    component: DividerComponent\n  },\n  {\n    type: 'expansion_panel',\n    name: 'Expansion Panel',\n    category: 'layout',\n    icon: 'expand_more',\n    allow_children: true,\n    component: ExpansionPanelComponent\n  },\n  {\n    type: 'list',\n    name: 'List',\n    category: 'layout',\n    icon: 'list',\n    allow_children: false,\n    component: ListComponent\n  },\n  {\n    type: 'stepper',\n    name: 'Stepper',\n    category: 'layout',\n    icon: 'linear_scale',\n    allow_children: true,\n    component: StepperComponent\n  },\n  {\n    type: 'tree',\n    name: 'Tree',\n    category: 'layout',\n    icon: 'account_tree',\n    allow_children: false,\n    component: TreeComponent\n  },\n  {\n    type: 'grid_list',\n    name: 'Grid List',\n    category: 'layout',\n    icon: 'grid_on',\n    allow_children: false,\n    component: GridListComponent\n  },\n  {\n    type: 'sidebar_stepper',\n    name: 'Sidebar Stepper',\n    category: 'layout',\n    icon: 'view_sidebar',\n    allow_children: true,\n    component: SidebarStepperComponent\n  },\n  {\n    type: 'page_ref',\n    name: 'Page Reference',\n    category: 'layout',\n    icon: 'description',\n    allow_children: false,\n    component: PageRefComponent\n  }\n];\n\nexport const FORM_COMPONENTS: ComponentDefinition[] = [\n  {\n    type: 'radio',\n    name: 'Radio Group',\n    category: 'form',\n    icon: 'radio_button_checked',\n    allow_children: false,\n    component: RadioComponent\n  },\n  {\n    type: 'slider',\n    name: 'Slider',\n    category: 'form',\n    icon: 'tune',\n    allow_children: false,\n    component: SliderComponent\n  },\n  {\n    type: 'slide_toggle',\n    name: 'Slide Toggle',\n    category: 'form',\n    icon: 'toggle_on',\n    allow_children: false,\n    component: SlideToggleComponent\n  },\n  {\n    type: 'autocomplete',\n    name: 'Autocomplete',\n    category: 'form',\n    icon: 'search',\n    allow_children: false,\n    component: AutocompleteComponent\n  },\n];\n\nexport const ERU_COMPONENTS: ComponentDefinition[] = [\n  {\n    type: 'phone',\n    name: 'Phone',\n    category: 'eru',\n    icon: 'phone',\n    allow_children: false,\n    component: PhoneComponent\n  },\n  {\n    type: 'email',\n    name: 'Email',\n    category: 'eru',\n    icon: 'email',\n    allow_children: false,\n    component: EmailComponent\n  },\n  {\n    type: 'number',\n    name: 'Number',\n    category: 'eru',\n    icon: 'numbers',\n    allow_children: false,\n    component: NumberComponent\n  },\n  {\n    type: 'currency',\n    name: 'Currency',\n    category: 'eru',\n    icon: 'attach_money',\n    allow_children: false,\n    component: CurrencyComponent\n  },\n  {\n    type: 'date',\n    name: 'Date',\n    category: 'eru',\n    icon: 'calendar_today',\n    allow_children: false,\n    component: DateComponent\n  },\n  {\n    type: 'datetime',\n    name: 'Date Time',\n    category: 'eru',\n    icon: 'event',\n    allow_children: false,\n    component: DatetimeComponent\n  },\n  {\n    type: 'time-picker',\n    name: 'Time Picker',\n    category: 'eru',\n    icon: 'access_time',\n    allow_children: false,\n    component: TimePickerComponent\n  },\n  {\n    type: 'duration',\n    name: 'Duration',\n    category: 'eru',\n    icon: 'timer',\n    allow_children: false,\n    component: DurationComponent\n  },\n  {\n    type: 'website',\n    name: 'Website',\n    category: 'eru',\n    icon: 'language',\n    allow_children: false,\n    component: WebsiteComponent\n  },\n  {\n    type: 'textarea',\n    name: 'Textarea',\n    category: 'eru',\n    icon: 'notes',\n    allow_children: false,\n    component: TextareaComponent\n  },\n  {\n    type: 'textbox',\n    name: 'Textbox',\n    category: 'eru',\n    icon: 'text_fields',\n    allow_children: false,\n    component: TextboxComponent\n  },\n  {\n    type: 'checkbox-eru',\n    name: 'Checkbox',\n    category: 'eru',\n    icon: 'check_box',\n    allow_children: false,\n    component: EruCheckboxComponent\n  },\n  {\n    type: 'select-eru',\n    name: 'Select',\n    category: 'eru',\n    icon: 'arrow_drop_down_circle',\n    allow_children: false,\n    component: EruSelectComponent\n  },\n  {\n    type: 'attachment',\n    name: 'Attachment',\n    category: 'eru',\n    icon: 'attach_file',\n    // Holds one header slot for the panel — see AttachmentComponent.\n    allow_children: true,\n    component: AttachmentComponent\n  },\n  {\n    type: 'location',\n    name: 'Location',\n    category: 'eru',\n    icon: 'location_on',\n    allow_children: false,\n    component: LocationComponent\n  },\n  {\n    type: 'people',\n    name: 'People',\n    category: 'eru',\n    icon: 'people',\n    allow_children: false,\n    component: PeopleComponent\n  },\n  {\n    type: 'priority',\n    name: 'Priority',\n    category: 'eru',\n    icon: 'flag',\n    allow_children: false,\n    component: PriorityComponent\n  },\n  {\n    type: 'progress',\n    name: 'Progress',\n    category: 'eru',\n    icon: 'linear_scale',\n    allow_children: false,\n    component: ProgressComponent\n  },\n  {\n    type: 'rating',\n    name: 'Rating',\n    category: 'eru',\n    icon: 'star',\n    allow_children: false,\n    component: RatingComponent\n  },\n  {\n    type: 'status',\n    name: 'Status',\n    category: 'eru',\n    icon: 'info',\n    allow_children: false,\n    component: StatusComponent\n  },\n  {\n    type: 'tag',\n    name: 'Tag',\n    category: 'eru',\n    icon: 'label',\n    allow_children: false,\n    component: TagComponent\n  }\n];\n\nexport const NAVIGATION_COMPONENTS: ComponentDefinition[] = [\n  {\n    type: 'toolbar',\n    name: 'Toolbar',\n    category: 'navigation',\n    icon: 'view_headline',\n    allow_children: false,\n    component: ToolbarComponent\n  },\n  {\n    type: 'menu',\n    name: 'Menu',\n    category: 'navigation',\n    icon: 'menu',\n    allow_children: false,\n    component: MenuComponent\n  },\n  {\n    type: 'sidenav',\n    name: 'Sidenav',\n    category: 'navigation',\n    icon: 'menu_open',\n    allow_children: true,\n    component: SidenavComponent\n  },\n  {\n    type: 'tabs',\n    name: 'Tabs',\n    category: 'navigation',\n    icon: 'tab',\n    allow_children: true,\n    component: TabsComponent\n  },\n  {\n    type: 'nav_menu',\n    name: 'Nav Menu',\n    category: 'navigation',\n    icon: 'view_sidebar',\n    allow_children: false,\n    component: NavMenuComponent\n  },\n  {\n    type: 'nav_outlet',\n    name: 'Nav Outlet',\n    category: 'navigation',\n    icon: 'view_quilt',\n    allow_children: false,\n    component: NavOutletComponent\n  }\n];\n\nexport const DATA_COMPONENTS: ComponentDefinition[] = [\n  {\n    type: 'grid',\n    name: 'Data Grid',\n    category: 'data',\n    icon: 'table_chart',\n    allow_children: false,\n    component: GridComponent\n  },\n  {\n    type: 'eru_page',\n    name: 'Page Container',\n    category: 'data',\n    icon: 'open_in_new',\n    allow_children: false,\n    component: EruPageComponent\n  },\n  {\n    type: 'line_chart',\n    name: 'Line Chart',\n    category: 'data',\n    icon: 'show_chart',\n    allow_children: false,\n    component: LineChartComponent\n  },\n  {\n    type: 'bar_chart',\n    name: 'Bar Chart',\n    category: 'data',\n    icon: 'bar_chart',\n    allow_children: false,\n    component: BarChartComponent\n  },\n  {\n    type: 'pie_chart',\n    name: 'Pie Chart',\n    category: 'data',\n    icon: 'pie_chart',\n    allow_children: false,\n    component: PieChartComponent\n  }\n];\n\nexport const LOADING_COMPONENTS: ComponentDefinition[] = [\n  {\n    type: 'ghost',\n    name: 'Ghost',\n    category: 'loading',\n    icon: 'blur_on',\n    allow_children: false,\n    component: GhostComponent\n  }\n];\n\nexport const ALL_COMPONENTS = [\n  ...BASIC_COMPONENTS,\n  ...LAYOUT_COMPONENTS,\n  ...FORM_COMPONENTS,\n  ...NAVIGATION_COMPONENTS,\n  ...DATA_COMPONENTS,\n  ...ERU_COMPONENTS,\n  ...LOADING_COMPONENTS\n];","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.EruStudioStore","i2.PropertyToTailwindService","i3.ComponentSchemaService","i4.LogicEvaluatorService","i2","i3","i4","i5","i6","i1","GridComponent","i8","i7","i9","i10","i11","EruCheckboxComponent","EruSelectComponent"],"mappings":"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"}