@vectoriox/iox-builder 9.6.1 → 9.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { ComponentRef, Type, InjectionToken, ChangeDetectorRef, OnInit, AfterViewInit, OnChanges, OnDestroy, EventEmitter, ElementRef, ApplicationRef, SimpleChanges, ViewContainerRef, Injector, EnvironmentInjector, TemplateRef, AfterContentInit, QueryList } from '@angular/core';
2
+ import { ComponentRef, Type, InjectionToken, ChangeDetectorRef, OnInit, AfterViewInit, OnChanges, OnDestroy, EventEmitter, ElementRef, ApplicationRef, SimpleChanges, ViewContainerRef, Injector, EnvironmentInjector, TemplateRef, AfterContentInit, QueryList, NgZone } from '@angular/core';
3
3
  import * as i30 from '@vectoriox/iox-ui';
4
4
  import { ResponsiveOverrides, RelativeSourceSpec, Breakpoint, PageStyleSettings, FormRenderState, AdoptContext, DesignTokenLike, DesignMode, ComponentInstanceRegistryService, DataSourceEndpoints, LinkType, PalettePreset, syncNodeDesignClasses } from '@vectoriox/iox-ui';
5
5
  export { ComponentInstanceRegistryService, IoxContextSlot, PageStyleSettings, SetContextParams, VIRTUAL_TRAIT_KEYS, composeVirtualTraits } from '@vectoriox/iox-ui';
@@ -19,8 +19,8 @@ import * as i26 from 'primeng/inputtext';
19
19
  import * as i27 from 'primeng/select';
20
20
  import * as i28 from 'primeng/tooltip';
21
21
  import * as i29 from 'primeng/dialog';
22
+ import { AccordionRuntime, CompositeNodeFactory, CompositeNode } from '@vectoriox/iox-ui/composite-core';
22
23
  import { FormPresetDef } from '@vectoriox/iox-ui/forms-core';
23
- import { CompositeNodeFactory, CompositeNode } from '@vectoriox/iox-ui/composite-core';
24
24
 
25
25
  declare enum StyleCategory {
26
26
  Layout = "Layout",
@@ -132,7 +132,7 @@ interface IoxDataSource {
132
132
  };
133
133
  }
134
134
 
135
- type InteractionTrigger = 'pageLoad' | 'click' | 'hover' | 'viewportEnter' | 'scrollProgress' | 'pageLeave' | 'pageEnter' | 'swiperSlideChange' | 'swiperReachBeginning' | 'swiperReachEnd' | 'swiperAutoplayStart' | 'swiperAutoplayStop' | 'swiperSlideActive' | 'swiperSlideInactive';
135
+ type InteractionTrigger = 'pageLoad' | 'click' | 'hover' | 'viewportEnter' | 'scrollProgress' | 'pageLeave' | 'pageEnter' | 'swiperSlideChange' | 'swiperReachBeginning' | 'swiperReachEnd' | 'swiperAutoplayStart' | 'swiperAutoplayStop' | 'swiperSlideActive' | 'swiperSlideInactive' | 'itemOn' | 'itemOff';
136
136
  type InteractionActionType = 'fadeIn' | 'fadeOut' | 'moveUp' | 'moveDown' | 'moveLeft' | 'moveRight' | 'scaleIn' | 'scaleOut' | 'rotate' | 'show' | 'hide' | 'toggleVisibility' | 'setContext' | 'clearContext' | 'openDialog' | 'closeDialog' | 'toggleDialog' | 'navigate' | 'scrollTo' | 'submitForm' | 'copyToClipboard' | 'grantConsent' | 'denyConsent' | 'setConsentCategory' | 'openConsentPreferences' | 'swiperNext' | 'swiperPrev' | 'swiperGoToSlide' | 'swiperAutoplayStart' | 'swiperAutoplayStop' | 'swiperAutoplayPause';
137
137
  interface InteractionAction {
138
138
  type: InteractionActionType;
@@ -241,7 +241,7 @@ interface InteractionPreset {
241
241
  name: string;
242
242
  interactions: IoxInteraction[];
243
243
  }
244
- type ElementState = 'hover' | 'active' | 'focus' | 'first-child' | 'last-child' | 'nth-child(odd)' | 'nth-child(even)' | 'parent-hover' | 'trigger-hover' | 'wrong' | 'accepted' | 'current';
244
+ type ElementState = 'hover' | 'active' | 'focus' | 'first-child' | 'last-child' | 'nth-child(odd)' | 'nth-child(even)' | 'parent-hover' | 'trigger-hover' | 'trigger-on' | 'wrong' | 'accepted' | 'current' | 'on';
245
245
  /** Interaction pseudo-classes — compiled to .iox-node-{id}:state */
246
246
  declare const INTERACTION_STATES: ElementState[];
247
247
  /** Structural pseudo-classes — compiled to .iox-outer-{id}:state */
@@ -266,6 +266,7 @@ declare const RELATIONAL_STATE_BASE: Partial<Record<ElementState, string>>;
266
266
  * `TARGETED_STATE_BASE` maps each targeted state to the trigger's pseudo-class.
267
267
  */
268
268
  declare const TARGETED_STATES: ElementState[];
269
+ /** Kept for the hover case; every targeted state's selector suffix is the shared `TARGETED_STATE_SUFFIX`. */
269
270
  declare const TARGETED_STATE_BASE: Partial<Record<ElementState, string>>;
270
271
  /**
271
272
  * Design-time validation states (forms-and-inputs-plan.md Part 2, board 7 — "the failure
@@ -372,6 +373,12 @@ interface ComponentNode {
372
373
  * composite's editors. A navigation's roles are written by the composer and `planNavShape` (CC1).
373
374
  */
374
375
  role?: string;
376
+ /**
377
+ * An item's identity inside its composite (CC2 — an Accordion item's `k1`…, composite plan §3). Its ARIA
378
+ * ids derive from it, so a reorder never pairs a header with another item's panel. Reissued on every
379
+ * clone (`regenerateNodeIds`). A From-content template carries none: each row's key is its own id.
380
+ */
381
+ itemKey?: string;
375
382
  }
376
383
  /**
377
384
  * Build a full StyleTraitGroup[] schema populated with values from a flat
@@ -660,6 +667,8 @@ declare enum ToolbarAction {
660
667
  Copy = "copy",
661
668
  Paste = "paste",
662
669
  AddSlide = "add-slide",
670
+ /** An accordion part's "Add item" (CC2): a fresh item after the selected one's item. */
671
+ AddItem = "add-item",
663
672
  Wrap = "wrap",
664
673
  /** Open the components panel to insert into / after the selection (B2 quick-add). */
665
674
  AddElement = "add-element"
@@ -765,6 +774,11 @@ declare class OverlayService {
765
774
  node: ComponentNode;
766
775
  ref: NodeRef;
767
776
  } | undefined;
777
+ /** The registered node with this id (a From-content row's click resolves to its TEMPLATE part, CC2). */
778
+ findRefByNodeId(id: string): {
779
+ node: ComponentNode;
780
+ ref: NodeRef;
781
+ } | undefined;
768
782
  /**
769
783
  * Walk up the DOM from a node's registered host element to the nearest ANCESTOR
770
784
  * element that is itself a registered node. Used to resolve the immediate parent
@@ -778,7 +792,9 @@ declare class OverlayService {
778
792
  clearHover(): void;
779
793
  /** Current selection snapshot (null if nothing is selected). */
780
794
  getCurrentSelection(): OverlayEntry | null;
781
- setSelect(element: HTMLElement, componentName: string, mode: BuilderMode, node?: ComponentNode, componentRef?: ComponentRef<any>): void;
795
+ /** The From-content row (1-based) a click came from when it selected a TEMPLATE part (CC2), else null. */
796
+ selectedRow: number | null;
797
+ setSelect(element: HTMLElement, componentName: string, mode: BuilderMode, node?: ComponentNode, componentRef?: ComponentRef<any>, fromRow?: number | null): void;
782
798
  clearSelect(): void;
783
799
  refreshSelect(): void;
784
800
  /** Lightweight swap for drag-preview tracking. */
@@ -1059,7 +1075,13 @@ declare enum InsertRefusal {
1059
1075
  * structure guard (composite-core `structureRefusal`). Reordering inside the parent never asks. */
1060
1076
  LockedPartMove = "lockedPartMove",
1061
1077
  /** A composite's LOCKED part deleted (Delete key, toolbar, layer tree, Make global): refused. */
1062
- LockedPart = "lockedPart"
1078
+ LockedPart = "lockedPart",
1079
+ /** An accordion item's header or panel (CC2) moved out of its item. */
1080
+ LockedItemPartMove = "lockedItemPartMove",
1081
+ /** An accordion item's header or panel (CC2) deleted on its own. */
1082
+ LockedItemPart = "lockedItemPart",
1083
+ /** An accordion's LAST item (composite plan T11): it keeps at least one. */
1084
+ LastItem = "lastItem"
1063
1085
  }
1064
1086
  declare const FORM_STATE_BLOCK_TYPES: ReadonlySet<string>;
1065
1087
  /** The builder-chrome label that says each refusal on screen (English in `BUILDER_CHROME_EN`). */
@@ -1079,8 +1101,9 @@ interface TypedNode {
1079
1101
  */
1080
1102
  declare function insertRefusal(node: TypedNode | null | undefined, ancestors: readonly TypedNode[]): InsertRefusal | null;
1081
1103
  /** Why `node` may not be REMOVED from where it is (deleted, cut, made global), or null when it may: a
1082
- * composite's locked part stays — its Parts switch or deleting the whole composite are the ways out. */
1083
- declare function removalRefusal(node: TypedNode | null | undefined): InsertRefusal | null;
1104
+ * composite's locked part stays — its Parts switch or deleting the whole composite are the ways out — and an
1105
+ * accordion keeps its last item. `siblings` = the list `node` sits in (where the caller has it). */
1106
+ declare function removalRefusal(node: TypedNode | null | undefined, siblings?: readonly TypedNode[] | null): InsertRefusal | null;
1084
1107
 
1085
1108
  /**
1086
1109
  * SymbolRegistryService — in-memory store for org-level symbols.
@@ -1151,7 +1174,7 @@ declare class DragEngineService {
1151
1174
  * The ONE check every REMOVAL asks (Delete key, toolbar, layer tree, Make global): null when `node` may
1152
1175
  * leave its place; otherwise the refusal, announced on `insertRefused$` like any other.
1153
1176
  */
1154
- refuseRemoval(node: unknown): InsertRefusal | null;
1177
+ refuseRemoval(node: unknown, siblings?: readonly unknown[] | null): InsertRefusal | null;
1155
1178
  /** The node a payload WOULD insert, without building it: a type string, a block/symbol, or a node. */
1156
1179
  private payloadNode;
1157
1180
  /** The nodes a dropzone sits in, outermost first, its own node last — read from the DOM, which is
@@ -1686,6 +1709,12 @@ declare class InteractionEngineService {
1686
1709
  replayTrigger(nodeId: string, trigger: InteractionTrigger): void;
1687
1710
  private _replayTrigger;
1688
1711
  private attachInteraction;
1712
+ /**
1713
+ * `itemOn` / `itemOff` (CC2): run when the part's accordion ITEM opens / closes — announced by the shared
1714
+ * composite-core runtime on the item, on the canvas as on the site. An item already open when the
1715
+ * listener attaches has opened: its `itemOn` runs at once (its entrance was pre-stated hidden).
1716
+ */
1717
+ private attachItemState;
1689
1718
  private attachPageLoad;
1690
1719
  private attachViewportEnter;
1691
1720
  private isBuilderMode;
@@ -1888,7 +1917,10 @@ declare enum AuditCode {
1888
1917
  /** Form content inside a link or a button — a STRUCTURE finding, true at every width (form-nesting-audit.util). */
1889
1918
  FormInLink = "form-in-link",
1890
1919
  /** An icon-only button or link with no Accessible name — announced as an unnamed control (CC1 N6). */
1891
- UnnamedControl = "unnamed-control"
1920
+ UnnamedControl = "unnamed-control",
1921
+ /** A composite whose items come from content, and its source returned no rows (CC2, board 9): the
1922
+ * canvas shows the placeholder, the live site renders nothing. */
1923
+ EmptySource = "empty-source"
1892
1924
  }
1893
1925
  /** A fix that changes the tree, not a style or a trait — applied as one page-history step. */
1894
1926
  declare enum StructureFix {
@@ -1918,6 +1950,12 @@ interface AuditNode {
1918
1950
  top?: number;
1919
1951
  /** It shows only an icon and has no Accessible name (the shared `needsAccessibleName`). */
1920
1952
  unnamedControl?: boolean;
1953
+ /** Takes its items from content and the source returned none (CC2): the source's alias, and the section
1954
+ * it sits in (the finding names both). */
1955
+ emptySource?: {
1956
+ alias: string;
1957
+ section: string;
1958
+ };
1921
1959
  }
1922
1960
  interface AuditFinding {
1923
1961
  nodeId: string;
@@ -2124,6 +2162,8 @@ declare class BuilderComponent implements OnInit, AfterViewInit, OnChanges, OnDe
2124
2162
  * `utils/responsive-audit.util.ts`.
2125
2163
  */
2126
2164
  runAudit(): void;
2165
+ /** An Accordion from content whose source came back with no rows (CC2): what the audit names. */
2166
+ private emptySourceOf;
2127
2167
  /** The node's OWN trait values — the Base layer the responsive `inputs` cascade sits on top of. */
2128
2168
  private baseInputMapOf;
2129
2169
  private refreshStructureFindings;
@@ -2319,6 +2359,9 @@ declare class BuilderComponent implements OnInit, AfterViewInit, OnChanges, OnDe
2319
2359
  interaction?: IoxInteraction;
2320
2360
  wrapType?: string;
2321
2361
  }): void;
2362
+ /** Toolbar ▸ Add item on an accordion part (CC2): a fresh item after the selection's own item (or at the end
2363
+ * for the root), the recipe's own item — ONE undo step, then the new item's header is selected. */
2364
+ private addAccordionItemFrom;
2322
2365
  confirmSaveBlock(): void;
2323
2366
  cancelSaveBlock(): void;
2324
2367
  private deepCloneWithNewIds;
@@ -2409,6 +2452,9 @@ declare class RenderDirective implements OnInit, OnDestroy {
2409
2452
  * (`null`), the legacy path is byte-identical — the parent's wrapper owns `iox-outer` + drag.
2410
2453
  */
2411
2454
  ioxDragSourceId: string | null;
2455
+ /** Set by a parent whose element only takes PHRASING content (an Accordion header's <button>, CC2): a
2456
+ * Heading then renders as a <span> — its outline level is the <hN> the header renders around it. */
2457
+ ioxPhrasing: boolean;
2412
2458
  onClick: EventEmitter<any>;
2413
2459
  onMouseEnter: EventEmitter<any>;
2414
2460
  onMouseLeave: EventEmitter<any>;
@@ -2416,6 +2462,9 @@ declare class RenderDirective implements OnInit, OnDestroy {
2416
2462
  private readonly onCanvas;
2417
2463
  private readonly labels;
2418
2464
  private readonly designState;
2465
+ private readonly compositeCanvas;
2466
+ /** The node this directive attached a composite runtime for (an accordion root). */
2467
+ private compositeRootId;
2419
2468
  /** Host element drag was registered on (collapsed path) — unregistered on destroy. */
2420
2469
  private hostDragEl;
2421
2470
  constructor(vcr: ViewContainerRef, injector: Injector, envInjector: EnvironmentInjector, doc: Document, registryService: ComponentRegistryService, overlayService: OverlayService, styleRegistry: StyleRegistryService, interactionEngine: InteractionEngineService, cdr: ChangeDetectorRef, panelEventService: PanelEventService, dragEngine: DragEngineService);
@@ -2449,7 +2498,7 @@ declare class RenderDirective implements OnInit, OnDestroy {
2449
2498
  private syncA11y;
2450
2499
  private render;
2451
2500
  static ɵfac: i0.ɵɵFactoryDeclaration<RenderDirective, never>;
2452
- static ɵdir: i0.ɵɵDirectiveDeclaration<RenderDirective, "[ioxRender]", never, { "ioxRender": { "alias": "ioxRender"; "required": false; }; "ioxDragSourceId": { "alias": "ioxDragSourceId"; "required": false; }; }, { "onClick": "onClick"; "onMouseEnter": "onMouseEnter"; "onMouseLeave": "onMouseLeave"; }, never, never, false, never>;
2501
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RenderDirective, "[ioxRender]", never, { "ioxRender": { "alias": "ioxRender"; "required": false; }; "ioxDragSourceId": { "alias": "ioxDragSourceId"; "required": false; }; "ioxPhrasing": { "alias": "ioxPhrasing"; "required": false; }; }, { "onClick": "onClick"; "onMouseEnter": "onMouseEnter"; "onMouseLeave": "onMouseLeave"; }, never, never, false, never>;
2453
2502
  }
2454
2503
 
2455
2504
  declare class IoxDraggableDirective implements OnInit, OnDestroy {
@@ -2597,8 +2646,16 @@ declare class OverlayComponent implements OnInit, OnDestroy {
2597
2646
  get hasInteractions(): boolean;
2598
2647
  get selectedNodeIsGlobal(): boolean;
2599
2648
  private readonly builderLabels;
2649
+ /** The kind badge's glyph: the composite's kind icon (board 9: "kind icon + 'Accordion · trigger'"). */
2650
+ get selectedRoleIcon(): string;
2600
2651
  /** A composite part's kind + role under the selection (board 3/8 "Selection kind badge"), or null. */
2601
2652
  get selectedRoleBadge(): string | null;
2653
+ /** The selection toolbar's name: the part's LAYER name (board 3 — "Header", "Accordion"), else its type. */
2654
+ get toolbarName(): string;
2655
+ /** An accordion part: the toolbar's "Add item" (CC2). */
2656
+ get canAddItem(): boolean;
2657
+ get addItemLabel(): string;
2658
+ onAddItem(event: MouseEvent): void;
2602
2659
  get selectedPresetName(): string | null;
2603
2660
  get isLinkedSymbol(): boolean;
2604
2661
  get isDetachedSymbol(): boolean;
@@ -2779,6 +2836,10 @@ declare class BuilderContainerComponent implements OnInit, OnDestroy {
2779
2836
  childClick: EventEmitter<any>;
2780
2837
  childMouseEnter: EventEmitter<any>;
2781
2838
  childMouseLeave: EventEmitter<void>;
2839
+ /** The node this container renders (assigned by RenderDirective, never an input). */
2840
+ node: ComponentNode | null;
2841
+ /** The wrapper a child renders in: an Accordion item's header → its heading level, its panel → the track. */
2842
+ wrapperOf(child: ComponentNode): string | null;
2782
2843
  constructor(elRef: ElementRef<HTMLElement>, dragEngine: DragEngineService, cdr: ChangeDetectorRef);
2783
2844
  ngOnInit(): void;
2784
2845
  ngOnDestroy(): void;
@@ -2807,6 +2868,10 @@ declare class BuilderLinkedContainerComponent implements OnInit, OnDestroy {
2807
2868
  childMouseEnter: EventEmitter<any>;
2808
2869
  childMouseLeave: EventEmitter<void>;
2809
2870
  private capturePreventDefault;
2871
+ /** The node this component renders (assigned by RenderDirective, never an input). */
2872
+ node: ComponentNode | null;
2873
+ /** An Accordion's header renders a <button> (CC2). */
2874
+ get isTrigger(): boolean;
2810
2875
  constructor(dragEngine: DragEngineService, cdr: ChangeDetectorRef, elRef: ElementRef<HTMLElement>, isPreview: boolean);
2811
2876
  ngOnInit(): void;
2812
2877
  ngOnDestroy(): void;
@@ -2886,6 +2951,7 @@ declare class BuilderRepeaterComponent implements OnInit, OnDestroy {
2886
2951
  private panelEventService;
2887
2952
  private cdr;
2888
2953
  private interactionEngine;
2954
+ private labels?;
2889
2955
  private _children;
2890
2956
  get children(): ComponentNode[];
2891
2957
  /** RenderDirective sets `source` (→ fetchData) BEFORE `children`. With an async source the response
@@ -2904,6 +2970,15 @@ declare class BuilderRepeaterComponent implements OnInit, OnDestroy {
2904
2970
  items: any[];
2905
2971
  previewRows: ComponentNode[][];
2906
2972
  isLoading: boolean;
2973
+ /** The node rendered (assigned by RenderDirective). An Accordion from content is a Repeater (CC2). */
2974
+ node: ComponentNode | null;
2975
+ /** Set once a fetch has answered — an empty source is a FINDING only after it said so. */
2976
+ private fetched;
2977
+ /** A composite whose source answered with no rows: the placeholder takes the template's place. */
2978
+ get showsEmptySource(): boolean;
2979
+ get emptySourceTitle(): string;
2980
+ get emptySourceHint(): string;
2981
+ private label;
2907
2982
  /** Bound reference passed to [ioxDropzonePostDrop] so the directive can call it. */
2908
2983
  readonly refreshPreviewsBound: () => void;
2909
2984
  private _source;
@@ -2917,8 +2992,12 @@ declare class BuilderRepeaterComponent implements OnInit, OnDestroy {
2917
2992
  set sourcePath(value: string);
2918
2993
  get limit(): number;
2919
2994
  set limit(value: number);
2920
- constructor(dragEngine: DragEngineService, overlayService: OverlayService, dataSourceService: BuilderDataSourceService, dsRegistry: DataSourceRegistryService, panelEventService: PanelEventService, cdr: ChangeDetectorRef, interactionEngine: InteractionEngineService);
2995
+ constructor(dragEngine: DragEngineService, overlayService: OverlayService, dataSourceService: BuilderDataSourceService, dsRegistry: DataSourceRegistryService, panelEventService: PanelEventService, cdr: ChangeDetectorRef, interactionEngine: InteractionEngineService, labels?: BuilderLabelResolver | undefined);
2921
2996
  ngOnInit(): void;
2997
+ /** The definition the last fetch ran on — compared to the registry's to refetch only on a real change. */
2998
+ private fetchedDefinition;
2999
+ private sourceSub?;
3000
+ private sourceDefinition;
2922
3001
  ngOnDestroy(): void;
2923
3002
  onDrop(event: IoxDropEvent): void;
2924
3003
  /** Monotonic fetch token — editing a binding sets `source` and `sourcePath` as two separate inputs,
@@ -2940,7 +3019,7 @@ declare class BuilderRepeaterComponent implements OnInit, OnDestroy {
2940
3019
  /** Rebuild preview rows after the template STRUCTURE changed (e.g. a child was wrapped, deleted,
2941
3020
  * or moved). Deferred so the new DOM + overlay refs exist before bindings are re-applied. */
2942
3021
  refreshTemplate(): void;
2943
- static ɵfac: i0.ɵɵFactoryDeclaration<BuilderRepeaterComponent, never>;
3022
+ static ɵfac: i0.ɵɵFactoryDeclaration<BuilderRepeaterComponent, [null, null, null, null, null, null, null, { optional: true; }]>;
2944
3023
  static ɵcmp: i0.ɵɵComponentDeclaration<BuilderRepeaterComponent, "app-builder-repeater", never, { "children": { "alias": "children"; "required": false; }; "style": { "alias": "style"; "required": false; }; "nodeId": { "alias": "nodeId"; "required": false; }; "dropListId": { "alias": "dropListId"; "required": false; }; "source": { "alias": "source"; "required": false; }; "sourcePath": { "alias": "sourcePath"; "required": false; }; "limit": { "alias": "limit"; "required": false; }; }, { "childClick": "childClick"; "childMouseEnter": "childMouseEnter"; "childMouseLeave": "childMouseLeave"; }, never, never, false, never>;
2945
3024
  }
2946
3025
 
@@ -3197,6 +3276,8 @@ interface LayerMoreRows {
3197
3276
  alias: string;
3198
3277
  /** The template items' depth — the line sits level with them, under the last row of the template. */
3199
3278
  depth: number;
3279
+ /** A composite's rows (an Accordion from content): the line adds "— edit the template" (board 9). */
3280
+ composite: boolean;
3200
3281
  }
3201
3282
  interface LayerTreeRow {
3202
3283
  node: ComponentNode;
@@ -3222,6 +3303,8 @@ interface LayerTreeRow {
3222
3303
  descriptor: string | null;
3223
3304
  /** A part inside a Repeater's template that reads the row (or any source): the plug glyph. */
3224
3305
  bound: boolean;
3306
+ /** A composite part's role chip (`trigger`, `card.title`), or null. */
3307
+ roleChip: string | null;
3225
3308
  /** Set on the LAST visible row of a Repeater's template: the "N more rows" line follows it. */
3226
3309
  moreRows: LayerMoreRows | null;
3227
3310
  }
@@ -3230,6 +3313,9 @@ interface LayerTreeContext {
3230
3313
  isExpanded(node: ComponentNode): boolean;
3231
3314
  /** The live Repeater's rows (its rendered component), or null when it has not rendered. */
3232
3315
  repeaterRows(node: ComponentNode): LayerRepeaterRows | null;
3316
+ /** A composite whose items come FROM CONTENT (CC2): its root row's sub-label ("From faqs · 6 rows",
3317
+ * board 9), in the host's language. Absent → the Repeater's own `alias × N`. */
3318
+ fromContentLabel?(rows: LayerRepeaterRows): string | null;
3233
3319
  }
3234
3320
  /** The alias a Repeater repeats — its `source` binding (canonical), else its `source` trait. */
3235
3321
  declare function repeaterSourceAlias(node: ComponentNode): string;
@@ -3291,7 +3377,8 @@ declare class LayerTreeComponent implements OnInit, OnDestroy {
3291
3377
  constructor(registry: ComponentRegistryService, overlayService: OverlayService, dragEngine: DragEngineService);
3292
3378
  ngOnInit(): void;
3293
3379
  ngOnDestroy(): void;
3294
- /** "5 more rows from projects" — the line after a Repeater's template (boards 4 / 8). */
3380
+ /** "5 more rows from projects" — the line after a Repeater's template (boards 4 / 8); a composite's says
3381
+ * "— edit the template" too (board 9). */
3295
3382
  moreRowsText(more: LayerMoreRows): string;
3296
3383
  /** The name's title — the full text a narrow sidebar truncates: the name, its sub-label, and every
3297
3384
  * binding a bound part holds. */
@@ -3330,6 +3417,8 @@ interface Crumb {
3330
3417
  /** `null` for the Body crumb: the page root is not a node in the layout tree. */
3331
3418
  node: ComponentNode | null;
3332
3419
  label: string;
3420
+ /** A composite ROOT's kind glyph (board 3: "≡ Accordion"), or null. */
3421
+ icon: string | null;
3333
3422
  /** True for the last crumb (the selected node, or Body when nothing is selected). */
3334
3423
  isCurrent: boolean;
3335
3424
  /** Stable track key — nodes are tracked by reference, Body by its label. */
@@ -3445,6 +3534,21 @@ declare function findNodeLocation(roots: ComponentNode[], target: ComponentNode)
3445
3534
  */
3446
3535
  declare function wrapNode(roots: ComponentNode[], target: ComponentNode, wrapper: ComponentNode): ComponentNode | null;
3447
3536
 
3537
+ /**
3538
+ * The same node as another TYPE (CC2: an Accordion switching Manual ⇄ From content is a Container ⇄ a
3539
+ * Repeater, board 9). A fresh `next` node of the new type (the caller's `createConfig`) takes over
3540
+ * everything that is the node's and not its type's: its id (so its rules, selection and history stay), its
3541
+ * name, role, element style, every style value BOTH types have a slot for, its state, targeted-state and
3542
+ * breakpoint styles, interactions, non-source bindings, global placement — and every content trait both
3543
+ * types declare (a composite's behaviour). Children are the caller's (the switch decides them). Pure: `node`
3544
+ * is not touched.
3545
+ */
3546
+ declare function retypeNode(node: ComponentNode, next: ComponentNode): ComponentNode;
3547
+
3548
+ declare function regenerateNodeIds(root: ComponentNode, opts?: {
3549
+ styleId?: 'clear' | 'regenerate';
3550
+ }): void;
3551
+
3448
3552
  /**
3449
3553
  * State OUTSIDE the layout that one step changed together with it — e.g. adopting a page's element
3450
3554
  * styles (DS7) also sets the page's design-system flag and links its global elements. Opaque here;
@@ -3487,15 +3591,49 @@ declare class BuilderHistoryService {
3487
3591
  static ɵprov: i0.ɵɵInjectableDeclaration<BuilderHistoryService>;
3488
3592
  }
3489
3593
 
3594
+ /**
3595
+ * The composites' runtime ON THE CANVAS (CC2) — the canvas is a live runtime, so an Accordion opens and
3596
+ * closes on the canvas exactly as on the site: the SAME composite-core `AccordionRuntime` the live engine
3597
+ * attaches. On top of the live state it shows what the author is designing (R2, CC1's design state):
3598
+ * - selecting anything inside a CLOSED panel (canvas, tree, crumb, an Items row, SELECT_NODE) opens its item
3599
+ * while it is selected, and deselecting closes it again;
3600
+ * - "Showing on canvas ▸ All open" opens every item; "As saved" goes back to the saved default.
3601
+ * Canvas-only: it never writes a node, so the saved page is unchanged and nothing becomes an undo step.
3602
+ */
3603
+ declare class CompositeCanvasService implements OnDestroy {
3604
+ private readonly designState;
3605
+ private readonly zone;
3606
+ private readonly attached;
3607
+ private readonly sub;
3608
+ constructor(designState: CanvasDesignStateService | null, zone: NgZone);
3609
+ ngOnDestroy(): void;
3610
+ /** An accordion root rendered on the canvas: run it. `element` is the root's rendered element. */
3611
+ attach(node: ComponentNode, element: HTMLElement): void;
3612
+ detach(nodeId: string | null | undefined): void;
3613
+ /** The root's behaviour changed in its panel (Allow several open, Open by default). */
3614
+ refreshBehaviour(node: ComponentNode): void;
3615
+ /** The runtime of an attached root (the e2e harness and the panels read its state). */
3616
+ runtimeOf(nodeId: string | null | undefined): AccordionRuntime | null;
3617
+ private applyDesignState;
3618
+ /** The keys the design state holds open: every item ("All open"), or the items whose hidden part the
3619
+ * selection sits in. A preview row shares its template's classes, so the template (row 1) answers. */
3620
+ private forcedFor;
3621
+ static ɵfac: i0.ɵɵFactoryDeclaration<CompositeCanvasService, [{ optional: true; }, null]>;
3622
+ static ɵprov: i0.ɵɵInjectableDeclaration<CompositeCanvasService>;
3623
+ }
3624
+
3490
3625
  /**
3491
3626
  * Parts that are HIDDEN AT REST (complex-components R2, board 3): on the live site they are not on
3492
3627
  * screen until something opens them, so on the canvas they show only while selected into or switched
3493
- * open ("Showing on canvas"). The layer tree marks them with the eye-slash glyph. Today: a Dialog (the
3494
- * mobile menu's drawer, a consent banner). CC2 adds a collapsed Accordion panel and an inactive tab.
3628
+ * open ("Showing on canvas"). The layer tree marks them with the eye-slash glyph. A Dialog (the mobile
3629
+ * menu's drawer, a consent banner) by its type; an Accordion's PANEL by its role (CC2 — closed until its
3630
+ * item opens). An inactive tab joins in CC4.
3495
3631
  */
3496
3632
  declare const HIDDEN_AT_REST_TYPES: ReadonlyArray<string>;
3633
+ declare const HIDDEN_AT_REST_ROLES: ReadonlyArray<string>;
3497
3634
  declare function isHiddenAtRest(node: {
3498
3635
  type?: string;
3636
+ role?: string | null;
3499
3637
  } | null | undefined): boolean;
3500
3638
  /**
3501
3639
  * How the selection shows a node hidden at rest — the two approved rules, by what the node IS:
@@ -3713,10 +3851,18 @@ declare function buildPalettePreset(def: PalettePresetDef, createConfig: (type:
3713
3851
  declare enum CompositePresetId {
3714
3852
  Card = "card",
3715
3853
  Badge = "badge",
3716
- Chip = "chip"
3854
+ Chip = "chip",
3855
+ Accordion = "accordion"
3856
+ }
3857
+ /** Where a composite sits in the Components panel (composite plan §6d): content blocks, or the interactive
3858
+ * composites (the Accordion — CC2; Tabs and the floating family later). */
3859
+ declare enum CompositePaletteGroup {
3860
+ ContentBlocks = "content-blocks",
3861
+ Interactive = "interactive"
3717
3862
  }
3718
3863
  interface CompositePresetDef {
3719
3864
  id: CompositePresetId;
3865
+ group: CompositePaletteGroup;
3720
3866
  name: string;
3721
3867
  icon: string;
3722
3868
  description: string;
@@ -4019,5 +4165,5 @@ declare class TextBlockComponentConfig extends ComponentConfig {
4019
4165
  constructor();
4020
4166
  }
4021
4167
 
4022
- export { ACTION_TYPE_OPTIONS, AuditCode, AuditPanelComponent, AuditSeverity, BODY_CRUMB_LABEL, BOUND_ICON, BREAKPOINT_PRESENTATION, BUILDER_CANVAS_CONTAINER, BUILDER_CHROME_EN, BUILDER_FONT_LINK_ATTR, BUILDER_TOKEN_SCOPE_CLASS, BackgroundGroupStyleConfig, BorderGroupStyleConfig, BreadcrumbBarComponent, BuilderButtonBlockComponent, BuilderButtonComponentConfig, BuilderClipboardService, BuilderComponent, BuilderContainerComponent, BuilderContainerComponentConfig, BuilderDataSourceService, BuilderDialogComponent, BuilderDividerComponentConfig, BuilderHeadingComponentConfig, BuilderHistoryService, BuilderIconComponentConfig, BuilderImageComponentConfig, BuilderLinkComponentConfig, BuilderLinkedContainerComponent, BuilderLinkedContainerConfig, BuilderListComponentConfig, BuilderListItemComponentConfig, BuilderMode, BuilderRepeaterComponent, BuilderSpacerComponentConfig, ButtonBlockComponentConfig, CANVAS_EMPTY_IMAGE_LABEL_EN, CANVAS_EMPTY_IMAGE_LABEL_KEY, CANVAS_ROOT_RESET_CSS, COMPOSITE_PRESETS, CanvasDesignStateService, CanvasShowState, CardComponentConfig, ChildLayoutGroupStyleConfig, ComponentConfig, ComponentRegistryService, CompositePresetId, DEFAULT_ESSENTIAL_TRAITS, DESCRIPTOR_MAX_LENGTH, DRAG_HANDLE_ATTR, DROP_REFUSED_CLASS, DataSourceRegistryService, DataSourceType, DialogComponentConfig, DimensionsGroupStyleConfig, DragEngineService, EASING_OPTIONS, EDITOR_CHROME_ATTRIBUTE, ESSENTIAL_TRAITS_BY_TYPE, EffectsGroupStyleConfig, FIELD_KIND_PRESETS, FIELD_PARTS, FORM_STATE_BLOCK_TYPES, FORM_TYPE, FieldComponentConfig, FieldGroupComponentConfig, FormComponentConfig, FormErrorComponentConfig, FormStateService, FormSuccessComponentConfig, GLOBALS_AFTER_CLASS, GalleryConfig, GlobalCanvasLayer, GroupStyleConfig, HIDDEN_AT_REST_LABEL_KEY, HIDDEN_AT_REST_TYPES, INSERT_REFUSAL_LABEL_KEYS, INTERACTION_STATES, INVERSE_ACTION, IOX_BUILDER_CANVAS, IOX_BUILDER_LABELS, IOX_DATA_SOURCE_ENDPOINTS, InsertRefusal, InteractionEngineService, InteractionPresetRegistryService, IoxBuilderModule, IoxDraggableDirective, IoxDropzoneDirective, LAYOUT_PRESETS, LayerTreeComponent, LayoutGroupStyleConfig, ListGroupStyleConfig, NodeAction, OverlayComponent, OverlayService, PALETTE_PRESET_DEFS, PanelChildComponent, PanelComponent, PanelEventService, PanelEventTypes, PanelTypes, PositionGroupStyleConfig, PresetRegistryService, RELATIONAL_STATES, RELATIONAL_STATE_BASE, REPEATER_SOURCE_PROP, REPEATER_TYPE, ROOT_ESCAPE_PX, ROUTE_ANIMATION_OPTIONS, RenderDirective, RepeaterComponentConfig, RootZone, SCREEN_WIDTH_OPTIONS, STRUCTURAL_STATES, SUPPORTED_STATES, SectionComponent, SectionComponentConfig, SelectionReveal, SizeGroupStyleConfig, SliderContainerComponent, SliderContainerConfig, SliderSlideComponent, SliderSlideConfig, SpacingGroupStyleConfig, StructureFix, StyleCategory, StyleRegistryService, TraitConfig as StyleTraitConfig, SubmitButtonComponentConfig, SymbolRegistryService, TARGETED_STATES, TARGETED_STATE_BASE, TRIGGER_OPTIONS, TextBlockComponentConfig, ToolbarAction, ToolbarComponent, TraitConfig, TraitInputType, TypographyGroupStyleConfig, UNITS_ALL, UNITS_DEG, UNITS_FIXED, UNITS_NO_VW, VALIDATION_STATES, VALIDATION_STATE_CLASS, ViewportService, ZOOM_OPTIONS, arrayItemSchemaFields, arraySchemaFields, auditNodes, bindingLabel, bindingLabels, buildCompositePreset, buildConsentPreset, buildElementStyleSpecimen, buildFieldKindPreset, buildFlavorSpecimen, buildFormPreset, buildFullStyleTraits, buildLayoutPreset, buildPalettePreset, buildPresetStyleTraits, builderCompositeFactory, canFluidise, canvasEmptyImageLabel, collapseColumnsProps, columnCountOf, defaultBuilderLabels, defaultPageSettings, dropChildren, dropTargetLabel, escapesRoot, essentialTraitsFor, findNodeLocation, findParentOf, flattenLayerTree, flattenSchemaFields, fluidiseProps, generateNodeId, globalCanvasLayer, insertRefusal, insertRefusalLabel, isHiddenAt, isHiddenAtRest, isPinnedGlobal, isSpecimen, markSpecimen, matchesControlSearch, nearestFormNode, nodeAncestorPath, nodeAncestorPathInEither, nodeDescriptor, nodeStyleMap, pathToNode, refreshSubtree, removalRefusal, reorderProps, repeaterSourceAlias, repeaterSubLabel, resolveInsertTarget, resolveTraitControllerType, resolveTraitOptions, rootEscapeBand, rootZone, selectionRevealOf, setStyleTrait, setTrait, shortDescriptor, stackChildrenProps, summarise, syncEmptyImagePlaceholder, syncNodeDesign, syncNodeInputs, textNode, upsertNodeStyles, visibilityProps, walkNodes, wrapNode };
4168
+ export { ACTION_TYPE_OPTIONS, AuditCode, AuditPanelComponent, AuditSeverity, BODY_CRUMB_LABEL, BOUND_ICON, BREAKPOINT_PRESENTATION, BUILDER_CANVAS_CONTAINER, BUILDER_CHROME_EN, BUILDER_FONT_LINK_ATTR, BUILDER_TOKEN_SCOPE_CLASS, BackgroundGroupStyleConfig, BorderGroupStyleConfig, BreadcrumbBarComponent, BuilderButtonBlockComponent, BuilderButtonComponentConfig, BuilderClipboardService, BuilderComponent, BuilderContainerComponent, BuilderContainerComponentConfig, BuilderDataSourceService, BuilderDialogComponent, BuilderDividerComponentConfig, BuilderHeadingComponentConfig, BuilderHistoryService, BuilderIconComponentConfig, BuilderImageComponentConfig, BuilderLinkComponentConfig, BuilderLinkedContainerComponent, BuilderLinkedContainerConfig, BuilderListComponentConfig, BuilderListItemComponentConfig, BuilderMode, BuilderRepeaterComponent, BuilderSpacerComponentConfig, ButtonBlockComponentConfig, CANVAS_EMPTY_IMAGE_LABEL_EN, CANVAS_EMPTY_IMAGE_LABEL_KEY, CANVAS_ROOT_RESET_CSS, COMPOSITE_PRESETS, CanvasDesignStateService, CanvasShowState, CardComponentConfig, ChildLayoutGroupStyleConfig, ComponentConfig, ComponentRegistryService, CompositeCanvasService, CompositePaletteGroup, CompositePresetId, DEFAULT_ESSENTIAL_TRAITS, DESCRIPTOR_MAX_LENGTH, DRAG_HANDLE_ATTR, DROP_REFUSED_CLASS, DataSourceRegistryService, DataSourceType, DialogComponentConfig, DimensionsGroupStyleConfig, DragEngineService, EASING_OPTIONS, EDITOR_CHROME_ATTRIBUTE, ESSENTIAL_TRAITS_BY_TYPE, EffectsGroupStyleConfig, FIELD_KIND_PRESETS, FIELD_PARTS, FORM_STATE_BLOCK_TYPES, FORM_TYPE, FieldComponentConfig, FieldGroupComponentConfig, FormComponentConfig, FormErrorComponentConfig, FormStateService, FormSuccessComponentConfig, GLOBALS_AFTER_CLASS, GalleryConfig, GlobalCanvasLayer, GroupStyleConfig, HIDDEN_AT_REST_LABEL_KEY, HIDDEN_AT_REST_ROLES, HIDDEN_AT_REST_TYPES, INSERT_REFUSAL_LABEL_KEYS, INTERACTION_STATES, INVERSE_ACTION, IOX_BUILDER_CANVAS, IOX_BUILDER_LABELS, IOX_DATA_SOURCE_ENDPOINTS, InsertRefusal, InteractionEngineService, InteractionPresetRegistryService, IoxBuilderModule, IoxDraggableDirective, IoxDropzoneDirective, LAYOUT_PRESETS, LayerTreeComponent, LayoutGroupStyleConfig, ListGroupStyleConfig, NodeAction, OverlayComponent, OverlayService, PALETTE_PRESET_DEFS, PanelChildComponent, PanelComponent, PanelEventService, PanelEventTypes, PanelTypes, PositionGroupStyleConfig, PresetRegistryService, RELATIONAL_STATES, RELATIONAL_STATE_BASE, REPEATER_SOURCE_PROP, REPEATER_TYPE, ROOT_ESCAPE_PX, ROUTE_ANIMATION_OPTIONS, RenderDirective, RepeaterComponentConfig, RootZone, SCREEN_WIDTH_OPTIONS, STRUCTURAL_STATES, SUPPORTED_STATES, SectionComponent, SectionComponentConfig, SelectionReveal, SizeGroupStyleConfig, SliderContainerComponent, SliderContainerConfig, SliderSlideComponent, SliderSlideConfig, SpacingGroupStyleConfig, StructureFix, StyleCategory, StyleRegistryService, TraitConfig as StyleTraitConfig, SubmitButtonComponentConfig, SymbolRegistryService, TARGETED_STATES, TARGETED_STATE_BASE, TRIGGER_OPTIONS, TextBlockComponentConfig, ToolbarAction, ToolbarComponent, TraitConfig, TraitInputType, TypographyGroupStyleConfig, UNITS_ALL, UNITS_DEG, UNITS_FIXED, UNITS_NO_VW, VALIDATION_STATES, VALIDATION_STATE_CLASS, ViewportService, ZOOM_OPTIONS, arrayItemSchemaFields, arraySchemaFields, auditNodes, bindingLabel, bindingLabels, buildCompositePreset, buildConsentPreset, buildElementStyleSpecimen, buildFieldKindPreset, buildFlavorSpecimen, buildFormPreset, buildFullStyleTraits, buildLayoutPreset, buildPalettePreset, buildPresetStyleTraits, builderCompositeFactory, canFluidise, canvasEmptyImageLabel, collapseColumnsProps, columnCountOf, defaultBuilderLabels, defaultPageSettings, dropChildren, dropTargetLabel, escapesRoot, essentialTraitsFor, findNodeLocation, findParentOf, flattenLayerTree, flattenSchemaFields, fluidiseProps, generateNodeId, globalCanvasLayer, insertRefusal, insertRefusalLabel, isHiddenAt, isHiddenAtRest, isPinnedGlobal, isSpecimen, markSpecimen, matchesControlSearch, nearestFormNode, nodeAncestorPath, nodeAncestorPathInEither, nodeDescriptor, nodeStyleMap, pathToNode, refreshSubtree, regenerateNodeIds, removalRefusal, reorderProps, repeaterSourceAlias, repeaterSubLabel, resolveInsertTarget, resolveTraitControllerType, resolveTraitOptions, retypeNode, rootEscapeBand, rootZone, selectionRevealOf, setStyleTrait, setTrait, shortDescriptor, stackChildrenProps, summarise, syncEmptyImagePlaceholder, syncNodeDesign, syncNodeInputs, textNode, upsertNodeStyles, visibilityProps, walkNodes, wrapNode };
4023
4169
  export type { AuditFinding, AuditNode, BreakpointPresentation, BuilderClipboard, BuilderLabelResolver, CanvasDesignSnapshot, ComponentEventDef, ComponentMethodDef, ComponentNode, ComponentTrait, CompositePresetDef, ConsentPreset, CreateConfig, Crumb, DesignSpecimenCopy, DragPayload, DsFilterByQueryParam, DsFilterByRouteParam, ElementState, FieldKindDef, FormStateSnapshot, GlobalLayerSource, HistoryChange, HistoryEntry, HistoryStep, InsertRefusedEvent, InsertTarget, InteractionAction, InteractionActionType, InteractionPreset, InteractionTrigger, IoxBinding, IoxDataSource, IoxDropEvent, IoxInteraction, IoxSymbol, LayerMoreRows, LayerRepeaterRows, LayerTreeContext, LayerTreeRow, LayoutPresetChildStyles, LayoutPresetDef, NodeRef, OverlayBoxModel, OverlayBoxSpacing, OverlayEntry, PageRouteAnimationSettings, PageScrollSettings, PageSettings, PalettePresetDef, PanelEvent, QuadSizeSegment, RootEscapeMemory, RouteAnimationPreset, ScreenWidthOption, SelectionBadge, StyleMap, StylePart, StylePreset, StyleTrait, StyleTraitGroup, TraitOptionMap, TraitSelectOption, TraitShowCondition, TreePathNode, UpsertTokensOptions, ViewportState, ZoomOption };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vectoriox/iox-builder",
3
- "version": "9.6.1",
3
+ "version": "9.7.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=20.0.0",
6
6
  "@angular/core": ">=20.0.0",