@vectoriox/iox-ui 5.84.0 → 5.86.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/actions-core/index.d.ts +47 -3
  2. package/composite-core/index.d.ts +93 -15
  3. package/design-core/index.d.ts +2013 -187
  4. package/fesm2022/vectoriox-iox-ui-actions-core.mjs +153 -70
  5. package/fesm2022/vectoriox-iox-ui-actions-core.mjs.map +1 -1
  6. package/fesm2022/vectoriox-iox-ui-composite-core.mjs +307 -39
  7. package/fesm2022/vectoriox-iox-ui-composite-core.mjs.map +1 -1
  8. package/fesm2022/vectoriox-iox-ui-design-core.mjs +2222 -85
  9. package/fesm2022/vectoriox-iox-ui-design-core.mjs.map +1 -1
  10. package/fesm2022/vectoriox-iox-ui-forms-core.mjs +27 -4
  11. package/fesm2022/vectoriox-iox-ui-forms-core.mjs.map +1 -1
  12. package/fesm2022/vectoriox-iox-ui-generation-core.mjs +250 -12
  13. package/fesm2022/vectoriox-iox-ui-generation-core.mjs.map +1 -1
  14. package/fesm2022/vectoriox-iox-ui-scene-core.mjs +101 -5
  15. package/fesm2022/vectoriox-iox-ui-scene-core.mjs.map +1 -1
  16. package/fesm2022/vectoriox-iox-ui.mjs +1545 -78
  17. package/fesm2022/vectoriox-iox-ui.mjs.map +1 -1
  18. package/forms-core/index.d.ts +23 -4
  19. package/generation-core/index.d.ts +13 -0
  20. package/index.d.ts +563 -62
  21. package/package.json +1 -1
  22. package/scene-core/index.d.ts +32 -4
  23. package/src/actions-core/action.model.ts +1 -1
  24. package/src/actions-core/dialog-motion.ts +25 -0
  25. package/src/actions-core/dialog-opener.ts +9 -3
  26. package/src/actions-core/element-actions.ts +25 -1
  27. package/src/actions-core/popover-opener.ts +50 -0
  28. package/src/actions-core/public-api.ts +1 -0
  29. package/src/composite-core/header.ts +25 -0
  30. package/src/composite-core/public-api.ts +1 -0
  31. package/src/composite-core/slider-runtime.ts +82 -0
  32. package/src/composite-core/slider.ts +194 -27
  33. package/src/composite-core/structure.ts +14 -9
  34. package/src/design-core/flavor-spec.generated.ts +2145 -85
  35. package/src/design-core/header-behaviour.ts +76 -0
  36. package/src/design-core/public-api.ts +1 -0
  37. package/src/design-core/theme-color.ts +21 -5
  38. package/src/forms-core/submit-lifecycle.ts +30 -3
  39. package/src/generation-core/baseline-roles.ts +1 -0
  40. package/src/generation-core/compose-site.ts +8 -0
  41. package/src/generation-core/node-baselines.generated.ts +231 -11
  42. package/src/generation-core/patterns.ts +2 -0
  43. package/src/generation-core/site-spec.generated.ts +8 -0
  44. package/src/scene-core/scene.ts +18 -0
  45. package/src/scene-core/scroll-driver.ts +83 -6
  46. package/styles/iox-design.css +431 -1
  47. package/styles/iox-forms.css +29 -4
@@ -1,4 +1,4 @@
1
- import { readOwnedTrait, writeOwnedTrait, ROW_INDEX_ATTRIBUTE, elementStyleById, switchElementStyle, LinkType, setColorScheme, COLOR_SCHEME_TRAIT, repeatedRowIndex, roleClass } from '@vectoriox/iox-ui/design-core';
1
+ import { readOwnedTrait, writeOwnedTrait, ROW_INDEX_ATTRIBUTE, elementStyleById, switchElementStyle, LinkType, setColorScheme, COLOR_SCHEME_TRAIT, repeatedRowIndex, roleClass, headerBehaviourOf, HeaderTrait, headerEdgeOf, headerStaysAtTop } from '@vectoriox/iox-ui/design-core';
2
2
  export { ROW_INDEX_ATTRIBUTE } from '@vectoriox/iox-ui/design-core';
3
3
 
4
4
  /** What a recipe asks its consumer to create: a NEW node of `type`, the way that consumer creates one
@@ -1990,9 +1990,35 @@ var SliderRole;
1990
1990
  SliderRole["Prev"] = "slider.prev";
1991
1991
  SliderRole["Next"] = "slider.next";
1992
1992
  SliderRole["Pagination"] = "slider.pagination";
1993
+ /** Premium M4 (M1.3): the bar UNDER the picture that holds the controls — caption · count · arrows. */
1994
+ SliderRole["Bar"] = "slider.bar";
1995
+ /** The caption of the slide in view (its `caption`, else its picture's description) — drawn by the runtime. */
1996
+ SliderRole["Caption"] = "slider.caption";
1997
+ /** "1 / 3", drawn by the runtime, left to right in every language. */
1998
+ SliderRole["Count"] = "slider.count";
1993
1999
  })(SliderRole || (SliderRole = {}));
1994
2000
  /** Parts in the order they are stamped: the pause control first (APG: the first focus stop), the dots last. */
1995
- const SLIDER_PART_ROLES = [SliderRole.Pause, SliderRole.Prev, SliderRole.Next, SliderRole.Pagination];
2001
+ const SLIDER_PART_ROLES = [
2002
+ SliderRole.Pause, SliderRole.Prev, SliderRole.Next, SliderRole.Pagination, SliderRole.Bar, SliderRole.Caption, SliderRole.Count,
2003
+ ];
2004
+ /** Where the controls sit (premium M4): over the picture (CC3, every slider saved before M4) or in the bar under it. */
2005
+ var SliderPlacement;
2006
+ (function (SliderPlacement) {
2007
+ SliderPlacement["Over"] = "over";
2008
+ SliderPlacement["Under"] = "under";
2009
+ })(SliderPlacement || (SliderPlacement = {}));
2010
+ const SLIDER_PLACEMENT_TRAIT = 'controlsPlacement';
2011
+ /** The bar's parts in reading order: the pause control, the caption at the reading start, the count, the dots, the
2012
+ * arrows at the end (M1.3). */
2013
+ const SLIDER_BAR_ORDER = [
2014
+ SliderRole.Pause, SliderRole.Caption, SliderRole.Count, SliderRole.Pagination, SliderRole.Prev, SliderRole.Next,
2015
+ ];
2016
+ /** Parts that exist only in the bar. */
2017
+ const BAR_ONLY = [SliderRole.Caption, SliderRole.Count];
2018
+ /** Premium M4: the trait that has the SCROLL play the slider (held mid-screen, resting on each picture). */
2019
+ const SLIDER_SCROLL_PLAYS_TRAIT = 'scrollPlays';
2020
+ /** Premium M4: a slide's caption (SliderSlide ▸ Caption) — the bar's Caption part shows the one in view. */
2021
+ const SLIDE_CAPTION_TRAIT = 'caption';
1996
2022
  const SLIDER_TYPE = 'SliderContainer';
1997
2023
  const SLIDE_TYPE = 'SliderSlide';
1998
2024
  /** The Bindings switches that own the parts. */
@@ -2001,11 +2027,17 @@ var SliderFlag;
2001
2027
  SliderFlag["Navigation"] = "enableNavigation";
2002
2028
  SliderFlag["Pagination"] = "enablePagination";
2003
2029
  SliderFlag["Autoplay"] = "enableAutoplay";
2030
+ /** Premium M4: a caption under the picture (the bar only). */
2031
+ SliderFlag["Caption"] = "enableCaption";
2032
+ /** Premium M4: "1 / 3" under the picture (the bar only). */
2033
+ SliderFlag["Count"] = "enableCount";
2004
2034
  })(SliderFlag || (SliderFlag = {}));
2005
2035
  const FLAG_PARTS = [
2006
2036
  [SliderFlag.Autoplay, [SliderRole.Pause]],
2007
2037
  [SliderFlag.Navigation, [SliderRole.Prev, SliderRole.Next]],
2008
2038
  [SliderFlag.Pagination, [SliderRole.Pagination]],
2039
+ [SliderFlag.Caption, [SliderRole.Caption]],
2040
+ [SliderFlag.Count, [SliderRole.Count]],
2009
2041
  ];
2010
2042
  /** The trait that names the carousel (Slider ▸ Accessibility ▸ Carousel name) — the A11y trait every named part uses. */
2011
2043
  const SLIDER_NAME_TRAIT = 'ariaLabel';
@@ -2015,9 +2047,28 @@ function isSliderPart(node) {
2015
2047
  function isSlider(node) {
2016
2048
  return node?.type === SLIDER_TYPE;
2017
2049
  }
2018
- /** The slider's own part playing `role` (a direct child), or undefined. */
2050
+ /** The slider's own part playing `role` — a direct child, or one in its bar — or undefined. */
2019
2051
  function sliderPart(slider, role) {
2020
- return (slider.children ?? []).find(c => c?.role === role);
2052
+ const direct = (slider.children ?? []).find(c => c?.role === role);
2053
+ if (direct)
2054
+ return direct;
2055
+ const bar = (slider.children ?? []).find(c => c?.role === SliderRole.Bar);
2056
+ return (bar?.children ?? []).find(c => c?.role === role);
2057
+ }
2058
+ /**
2059
+ * Where the slider's controls sit. The STRUCTURE decides once there are controls — a bar means under the picture, a
2060
+ * control of its own means over it (every slider saved before M4) — so a stored trait can never disagree with what is
2061
+ * drawn. A slider with no controls yet takes its `controlsPlacement` (the builder's new Slider: under the picture).
2062
+ */
2063
+ function sliderPlacementOf(slider) {
2064
+ if (!slider)
2065
+ return SliderPlacement.Over;
2066
+ const children = slider.children ?? [];
2067
+ if (children.some(c => c?.role === SliderRole.Bar))
2068
+ return SliderPlacement.Under;
2069
+ if (children.some(isSliderPart))
2070
+ return SliderPlacement.Over;
2071
+ return readProp(slider, SLIDER_PLACEMENT_TRAIT) === SliderPlacement.Under ? SliderPlacement.Under : SliderPlacement.Over;
2021
2072
  }
2022
2073
  /** True when the slider's controls are parts (it was created or migrated in CC3) — Swiper then draws none of its own. */
2023
2074
  function hasSliderParts(slider) {
@@ -2047,11 +2098,14 @@ var Type$2;
2047
2098
  Type["ButtonBlock"] = "ButtonBlock";
2048
2099
  Type["Icon"] = "Icon";
2049
2100
  Type["Container"] = "Container";
2101
+ Type["Text"] = "Text";
2050
2102
  })(Type$2 || (Type$2 = {}));
2051
2103
  var Style$2;
2052
2104
  (function (Style) {
2053
2105
  Style["Control"] = "button-secondary";
2054
2106
  Style["Icon"] = "icon";
2107
+ /** The caption and the count read as small print. */
2108
+ Style["Words"] = "small";
2055
2109
  })(Style$2 || (Style$2 = {}));
2056
2110
  /** Each part's glyph (Phosphor) and its default accessible name. */
2057
2111
  const SLIDER_PART_GLYPH = {
@@ -2065,8 +2119,29 @@ const PART_LABEL = {
2065
2119
  [SliderRole.Prev]: 'Previous',
2066
2120
  [SliderRole.Next]: 'Next',
2067
2121
  [SliderRole.Pagination]: 'Pagination',
2122
+ [SliderRole.Bar]: 'Controls',
2123
+ [SliderRole.Caption]: 'Caption',
2124
+ [SliderRole.Count]: 'Count',
2068
2125
  };
2069
2126
  const ZERO$1 = '0px 0px 0px 0px';
2127
+ /** A control in the bar: in flow, its own size, no offsets (the bar spaces its parts). */
2128
+ const BAR_PART_LAYOUT = { position: 'static', top: 'auto', margin: ZERO$1 };
2129
+ /**
2130
+ * The bar (M1.3): a row under the picture. Its inline padding keeps the PAGE's margin when the slider bleeds to the
2131
+ * screen's edge — the gutter less however far the slider is already inset from the screen (`100%` is the slider's
2132
+ * width, the bar's containing block) — so in a padded section it is 0 and at full bleed it is the gutter.
2133
+ */
2134
+ const BAR_INLINE_PAD = 'max(0px, calc(var(--iox-space-gutter, 24px) - (100vw - 100%) / 2))';
2135
+ const BAR_BASE = {
2136
+ position: 'relative', display: 'flex', flexDirection: 'row', flexWrap: 'nowrap', alignItems: 'center', justifyContent: 'flex-start',
2137
+ gap: '12px', width: '100%', height: 'auto', minHeight: '44px', margin: ZERO$1, padding: `12px ${BAR_INLINE_PAD} 0px ${BAR_INLINE_PAD}`, zIndex: '10',
2138
+ };
2139
+ /** The caption takes the room the controls leave; its words end in an ellipsis rather than push them off. */
2140
+ const CAPTION_BASE$1 = {
2141
+ flexGrow: '1', flexShrink: '1', flexBasis: '0%', minWidth: '0px', width: 'auto', minHeight: 'auto', margin: ZERO$1, padding: ZERO$1,
2142
+ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',
2143
+ };
2144
+ const COUNT_BASE = { flexGrow: '0', flexShrink: '0', width: 'auto', minHeight: 'auto', margin: ZERO$1, padding: ZERO$1 };
2070
2145
  /** A round 44px control (board 6 `.st-ctl`), over the slides (z above `.swiper-wrapper`). The PLACE (which edge) is the
2071
2146
  * shared CSS's, in logical insets, so a carousel reads the same way in RTL. */
2072
2147
  const CONTROL_BASE = {
@@ -2093,6 +2168,16 @@ function legacyLookOf(slider) {
2093
2168
  }
2094
2169
  /** One part, from the recipe (board 6: `button-secondary` controls, token dots) or in a migrated slider's legacy look. */
2095
2170
  function buildSliderPart(create, role, legacy) {
2171
+ if (role === SliderRole.Bar) {
2172
+ const bar = makeCompositePart(create, { key: 'bar', type: Type$2.Container, props: {}, elementStyle: NO_ELEMENT_STYLE }, role, PART_LABEL[role], BAR_BASE);
2173
+ bar.children = [];
2174
+ return bar;
2175
+ }
2176
+ if (role === SliderRole.Caption || role === SliderRole.Count) {
2177
+ // Their words are the runtime's (the slide in view), drawn as the part's generated content: the node's own
2178
+ // content stays empty, so no renderer ever fights the runtime over the element's text.
2179
+ return makeCompositePart(create, { key: role.split('.')[1], type: Type$2.Text, props: { content: '', tag: 'p' }, elementStyle: Style$2.Words }, role, PART_LABEL[role], role === SliderRole.Caption ? CAPTION_BASE$1 : COUNT_BASE);
2180
+ }
2096
2181
  if (role === SliderRole.Pagination) {
2097
2182
  const dots = makeCompositePart(create, { key: 'pagination', type: Type$2.Container, props: {}, elementStyle: NO_ELEMENT_STYLE }, role, PART_LABEL[role], legacy?.paginationColor ? { ...PAGINATION_BASE, color: legacy.paginationColor } : PAGINATION_BASE);
2098
2183
  dots.children = [];
@@ -2117,49 +2202,133 @@ function buildSliderPart(create, role, legacy) {
2117
2202
  return button;
2118
2203
  }
2119
2204
  const truthy = (v) => v === true || v === 'true';
2120
- /** The parts the slider's switches call for, in stamping order. */
2121
- function wantedSliderParts(slider) {
2122
- return FLAG_PARTS.filter(([flag]) => truthy(readProp(slider, flag))).flatMap(([, roles]) => roles);
2123
- }
2205
+ /** The parts the slider's switches call for, in stamping order — and its bar, while the controls sit under the
2206
+ * picture. A caption and a count live in the bar only. */
2207
+ function wantedSliderParts(slider, placement = sliderPlacementOf(slider)) {
2208
+ const under = placement === SliderPlacement.Under;
2209
+ const roles = FLAG_PARTS.filter(([flag]) => truthy(readProp(slider, flag))).flatMap(([, r]) => r).filter(r => under || !BAR_ONLY.includes(r));
2210
+ // The bar exists while it holds something: an empty band under the picture is never drawn.
2211
+ return under && roles.length ? [...roles, SliderRole.Bar] : roles;
2212
+ }
2213
+ /** The slider's parts wherever they are: its direct children and those in its bar. */
2214
+ function allSliderParts(slider) {
2215
+ const direct = (slider.children ?? []).filter(isSliderPart);
2216
+ const bar = direct.find(c => c.role === SliderRole.Bar);
2217
+ return [...direct, ...(bar?.children ?? []).filter(isSliderPart)];
2218
+ }
2219
+ const barIndex = (role) => SLIDER_BAR_ORDER.indexOf(role);
2124
2220
  /**
2125
- * Make the slider's parts match its switches — ONE edit (a palette switch, the migration, the composer). Missing
2126
- * parts are stamped from the recipe (or, `legacy`, in the migrated look) at their place: the pause control, Previous
2127
- * and Next before the first slide, the pagination after the last; parts whose switch is off are removed. Everything
2128
- * else (the slides, the author's edits to an existing part) is kept.
2221
+ * Make the slider's parts match its switches — ONE edit (a palette switch, the migration, the composer, a change of
2222
+ * placement). Missing parts are stamped from the recipe (or, `legacy`, in the migrated look) at their place: over the
2223
+ * picture, the pause control, Previous and Next before the first slide and the pagination after the last; under it
2224
+ * (premium M4), every control in the bar in its reading order, the bar after the slides. Parts whose switch is off are
2225
+ * removed wherever they are. Everything else (the slides, the author's edits to an existing part) is kept.
2129
2226
  */
2130
2227
  function syncSliderParts(slider, create, legacy) {
2131
- const wanted = new Set(wantedSliderParts(slider));
2132
- const children = [...(slider.children ?? [])];
2133
- const removed = children.filter(c => isSliderPart(c) && !wanted.has(c.role));
2134
- const kept = children.filter(c => !removed.includes(c));
2228
+ // A migrated slider keeps the place Swiper drew its controls in: over the picture.
2229
+ const wanted = new Set(wantedSliderParts(slider, legacy ? SliderPlacement.Over : sliderPlacementOf(slider)));
2230
+ const under = wanted.has(SliderRole.Bar);
2231
+ const removed = allSliderParts(slider).filter(c => !wanted.has(c.role));
2135
2232
  const added = [];
2233
+ let kept = [...(slider.children ?? [])].filter(c => !removed.includes(c));
2234
+ let bar = kept.find(c => c.role === SliderRole.Bar) ?? null;
2235
+ if (bar)
2236
+ bar.children = (bar.children ?? []).filter(c => !removed.includes(c));
2237
+ if (under && !bar) {
2238
+ bar = buildSliderPart(create, SliderRole.Bar);
2239
+ added.push(bar);
2240
+ kept.push(bar);
2241
+ }
2136
2242
  for (const role of SLIDER_PART_ROLES) {
2137
- if (!wanted.has(role) || kept.some(c => c.role === role))
2243
+ if (role === SliderRole.Bar || !wanted.has(role) || allSliderPartsOf(kept, bar).some(c => c.role === role))
2138
2244
  continue;
2139
2245
  const part = buildSliderPart(create, role, legacy);
2140
2246
  added.push(part);
2141
- if (role === SliderRole.Pagination) {
2247
+ if (under && bar) {
2248
+ if (role !== SliderRole.Caption && role !== SliderRole.Count)
2249
+ writeStyles(part, BAR_PART_LAYOUT);
2250
+ placeInBar(bar, part);
2251
+ }
2252
+ else if (role === SliderRole.Pagination) {
2142
2253
  kept.push(part);
2143
2254
  }
2144
2255
  else {
2145
- // Before the first slide, after the parts that come before it in stamping order.
2146
- const order = SLIDER_PART_ROLES.indexOf(role);
2147
- const firstSlide = kept.findIndex(c => !isSliderPart(c));
2148
- let at = firstSlide < 0 ? kept.length : firstSlide;
2149
- for (let i = 0; i < kept.length; i++) {
2150
- const r = kept[i].role;
2151
- if (isSliderPart(kept[i]) && SLIDER_PART_ROLES.indexOf(r) > order && i < at) {
2152
- at = i;
2153
- break;
2154
- }
2155
- }
2156
- kept.splice(at, 0, part);
2256
+ kept = placeBeforeSlides(kept, part, role);
2157
2257
  }
2158
2258
  }
2159
2259
  if (added.length || removed.length)
2160
2260
  slider.children = kept;
2161
2261
  return { added, removed };
2162
2262
  }
2263
+ function allSliderPartsOf(children, bar) {
2264
+ return [...children.filter(isSliderPart), ...(bar?.children ?? []).filter(isSliderPart)];
2265
+ }
2266
+ /** Into the bar at its reading-order place (after the parts that come before it). */
2267
+ function placeInBar(bar, part) {
2268
+ const children = [...(bar.children ?? [])];
2269
+ const order = barIndex(part.role);
2270
+ const at = children.findIndex(c => barIndex(c.role) > order);
2271
+ children.splice(at < 0 ? children.length : at, 0, part);
2272
+ bar.children = children;
2273
+ }
2274
+ /** Before the first slide, after the parts that come before it in stamping order. */
2275
+ function placeBeforeSlides(kept, part, role) {
2276
+ const out = [...kept];
2277
+ const order = SLIDER_PART_ROLES.indexOf(role);
2278
+ const firstSlide = out.findIndex(c => !isSliderPart(c));
2279
+ let at = firstSlide < 0 ? out.length : firstSlide;
2280
+ for (let i = 0; i < out.length; i++) {
2281
+ const r = out[i].role;
2282
+ if (isSliderPart(out[i]) && SLIDER_PART_ROLES.indexOf(r) > order && i < at) {
2283
+ at = i;
2284
+ break;
2285
+ }
2286
+ }
2287
+ out.splice(at, 0, part);
2288
+ return out;
2289
+ }
2290
+ /** The layout a control has over the picture (its recipe's place: absolute, the arrows at the vertical middle). */
2291
+ function overLayoutFor(role) {
2292
+ if (role === SliderRole.Pagination)
2293
+ return { position: 'absolute', margin: ZERO$1 };
2294
+ return role === SliderRole.Pause ? { position: 'absolute', top: 'auto', margin: ZERO$1 } : { position: 'absolute', top: ARROW_TOP, margin: ZERO$1 };
2295
+ }
2296
+ /**
2297
+ * Move the controls over the picture or into the bar under it (premium M4, M1.3 — Slider ▸ Controls) — ONE edit and
2298
+ * one undo step. The parts keep their identity and the author's edits; only their place changes (in flow in the bar,
2299
+ * absolute over the picture). A caption and a count exist only in the bar. True when anything changed.
2300
+ */
2301
+ function setSliderPlacement(slider, placement, create) {
2302
+ const was = sliderPlacementOf(slider);
2303
+ writeProp(slider, SLIDER_PLACEMENT_TRAIT, placement);
2304
+ if (was === placement)
2305
+ return false;
2306
+ const children = [...(slider.children ?? [])];
2307
+ const bar = children.find(c => c.role === SliderRole.Bar) ?? null;
2308
+ if (placement === SliderPlacement.Under) {
2309
+ const controls = children.filter(c => isSliderPart(c) && c.role !== SliderRole.Bar);
2310
+ const rest = children.filter(c => !controls.includes(c));
2311
+ const target = bar ?? buildSliderPart(create, SliderRole.Bar);
2312
+ for (const part of controls) {
2313
+ writeStyles(part, BAR_PART_LAYOUT);
2314
+ placeInBar(target, part);
2315
+ }
2316
+ slider.children = bar ? rest : [...rest, target];
2317
+ }
2318
+ else {
2319
+ const inBar = (bar?.children ?? []).filter(isSliderPart);
2320
+ let rest = children.filter(c => c !== bar);
2321
+ for (const part of inBar) {
2322
+ if (BAR_ONLY.includes(part.role))
2323
+ continue;
2324
+ writeStyles(part, overLayoutFor(part.role));
2325
+ rest = part.role === SliderRole.Pagination ? [...rest, part] : placeBeforeSlides(rest, part, part.role);
2326
+ }
2327
+ slider.children = rest;
2328
+ }
2329
+ syncSliderParts(slider, create);
2330
+ return true;
2331
+ }
2163
2332
  /** True when a saved slider still relies on Swiper-drawn controls: a switch is on and no part exists yet. */
2164
2333
  function needsSliderMigration(slider) {
2165
2334
  return !!slider && isSlider(slider) && !hasSliderParts(slider) && wantedSliderParts(slider).length > 0;
@@ -2248,6 +2417,8 @@ function buildCarouselRecipe(create, options = {}) {
2248
2417
  // Rewind: Previous and Next are always there to press (board 6) — neither greys out at an end.
2249
2418
  slidesPerView: 1, spaceBetween: 0, loop: 'rewind', enableNavigation: true, enablePagination: true, enableAutoplay: true, autoplayDelay: 5000,
2250
2419
  autoplayPauseOnMouseEnter: true, autoHeight: true, [SLIDER_NAME_TRAIT]: options.name ?? 'What clients say',
2420
+ // Board 6 draws its controls in a row above the quotes — its own place, not the M4 bar under a picture.
2421
+ [SLIDER_PLACEMENT_TRAIT]: SliderPlacement.Over,
2251
2422
  }))
2252
2423
  writeProp(slider, name, value);
2253
2424
  slider.children = (options.quotes ?? CAROUSEL_QUOTES).map((q, i) => {
@@ -2312,13 +2483,17 @@ const COMPOSITE_ROLE_SPECS = {
2312
2483
  // A Scene always keeps its stage: everything it pins and clips lives there.
2313
2484
  [SceneRole.Scene]: { parent: null },
2314
2485
  [SceneRole.Stage]: { parent: SceneRole.Scene, locked: true },
2315
- // CC3 — a Slider's controls are its own direct children (Swiper is handed them). The pause control stays while
2316
- // Autoplay is on (WCAG 2.2.2): the Autoplay switch removes it, never Delete. The arrows and the dots follow
2317
- // their switches and may be deleted.
2318
- [SliderRole.Pause]: { parent: null, parentType: SLIDER_TYPE, locked: true },
2319
- [SliderRole.Prev]: { parent: null, parentType: SLIDER_TYPE, pinned: true },
2320
- [SliderRole.Next]: { parent: null, parentType: SLIDER_TYPE, pinned: true },
2321
- [SliderRole.Pagination]: { parent: null, parentType: SLIDER_TYPE, pinned: true },
2486
+ // CC3 — a Slider's controls are its own direct children (Swiper is handed them) — or, premium M4, children of its
2487
+ // bar under the picture. The pause control stays while Autoplay is on (WCAG 2.2.2): the Autoplay switch removes it,
2488
+ // never Delete. The arrows, the dots, the caption and the count follow their switches and may be deleted; the bar
2489
+ // follows Slider ▸ Controls.
2490
+ [SliderRole.Pause]: { parent: SliderRole.Bar, parentType: SLIDER_TYPE, locked: true },
2491
+ [SliderRole.Prev]: { parent: SliderRole.Bar, parentType: SLIDER_TYPE, pinned: true },
2492
+ [SliderRole.Next]: { parent: SliderRole.Bar, parentType: SLIDER_TYPE, pinned: true },
2493
+ [SliderRole.Pagination]: { parent: SliderRole.Bar, parentType: SLIDER_TYPE, pinned: true },
2494
+ [SliderRole.Bar]: { parent: null, parentType: SLIDER_TYPE, pinned: true },
2495
+ [SliderRole.Caption]: { parent: SliderRole.Bar, pinned: true },
2496
+ [SliderRole.Count]: { parent: SliderRole.Bar, pinned: true },
2322
2497
  };
2323
2498
  var StructureEdit;
2324
2499
  (function (StructureEdit) {
@@ -2348,7 +2523,7 @@ function structureRefusal(node, edit, ancestors = []) {
2348
2523
  return null;
2349
2524
  if (edit === StructureEdit.Delete)
2350
2525
  return spec.locked ? StructureRefusal.LockedPart : null;
2351
- const placed = spec.parentType ? parent?.type === spec.parentType : parent?.role === spec.parent;
2526
+ const placed = (!!spec.parentType && parent?.type === spec.parentType) || (spec.parent !== null && parent?.role === spec.parent);
2352
2527
  return placed ? null : StructureRefusal.LockedPlacement;
2353
2528
  }
2354
2529
  /** True when `node` is a locked part (shown with a lock and no delete in the layer tree). Deleting a whole
@@ -2508,6 +2683,77 @@ function attachCarouselA11y(swiper, options = {}) {
2508
2683
  carouselOf(swiper.el)?.destroy();
2509
2684
  return new CarouselA11y(swiper, options);
2510
2685
  }
2686
+ // ── The bar's words (premium components M4, M1.3) ──────────────────────────────────────────────────────
2687
+ /** Where the Caption and the Count parts get their words: generated content (`attr()`), never the element's text — so
2688
+ * the canvas's Text component and the runtime never write the same node. */
2689
+ const SLIDER_TEXT_ATTRIBUTE = 'data-iox-text';
2690
+ /** A slide's caption, written by every renderer (iox-ui `nodeA11yAttributes`, SLIDE_CAPTION_ATTRIBUTE). */
2691
+ const CAPTION_ATTRIBUTE = 'data-iox-caption';
2692
+ /** Held for a frame while the caption changes, so its new words fade in (iox-design.css). */
2693
+ const SLIDER_SWAPPING_ATTRIBUTE = 'data-iox-swapping';
2694
+ const BAR_RUNTIME_KEY = '__ioxSliderBar';
2695
+ /** What the caption says for a slide: its own caption, else its picture's description, else nothing. */
2696
+ function sliderCaptionOf(slide) {
2697
+ if (!slide)
2698
+ return '';
2699
+ const holder = slide.hasAttribute(CAPTION_ATTRIBUTE) ? slide : slide.querySelector(`[${CAPTION_ATTRIBUTE}]`);
2700
+ const own = holder?.getAttribute(CAPTION_ATTRIBUTE)?.trim();
2701
+ if (own)
2702
+ return own;
2703
+ return slide.querySelector('img[alt]')?.getAttribute('alt')?.trim() ?? '';
2704
+ }
2705
+ /** "2 / 5" — the slide in view and how many there are; nothing for an empty slider. */
2706
+ function sliderCountText(index, total) {
2707
+ if (!(total > 0))
2708
+ return '';
2709
+ const i = Math.min(total - 1, Math.max(0, Math.floor(Number.isFinite(index) ? index : 0)));
2710
+ return `${i + 1} / ${total}`;
2711
+ }
2712
+ /**
2713
+ * Keep the bar's Caption and Count on the slide in view — the canvas, Preview and both engine paths (bootSlider). The
2714
+ * caption changes behind a short fade (the first one does not); the count reads left to right in every language.
2715
+ * Returns the stop; a slider with neither part gets a no-op.
2716
+ */
2717
+ function attachSliderBar(swiper) {
2718
+ (swiper.el[BAR_RUNTIME_KEY])?.();
2719
+ const caption = sliderPartElement(swiper.el, SliderRole.Caption);
2720
+ const count = sliderPartElement(swiper.el, SliderRole.Count);
2721
+ if (!caption && !count)
2722
+ return () => { };
2723
+ const view = swiper.el.ownerDocument?.defaultView;
2724
+ const raf = (fn) => (view?.requestAnimationFrame ? view.requestAnimationFrame(() => view.requestAnimationFrame(fn)) : setTimeout(fn, 32));
2725
+ let first = true;
2726
+ const sync = () => {
2727
+ if (swiper.destroyed)
2728
+ return;
2729
+ const slides = swiper.slides ?? [];
2730
+ if (count) {
2731
+ count.setAttribute('dir', 'ltr');
2732
+ count.setAttribute(SLIDER_TEXT_ATTRIBUTE, sliderCountText(swiper.realIndex ?? swiper.activeIndex, slides.length));
2733
+ }
2734
+ if (caption) {
2735
+ const words = sliderCaptionOf(slides[swiper.activeIndex]);
2736
+ if (caption.getAttribute(SLIDER_TEXT_ATTRIBUTE) !== words) {
2737
+ if (!first) {
2738
+ caption.setAttribute(SLIDER_SWAPPING_ATTRIBUTE, '');
2739
+ raf(() => caption.removeAttribute(SLIDER_SWAPPING_ATTRIBUTE));
2740
+ }
2741
+ caption.setAttribute(SLIDER_TEXT_ATTRIBUTE, words);
2742
+ }
2743
+ }
2744
+ first = false;
2745
+ };
2746
+ swiper.on('slideChange', sync);
2747
+ swiper.on('slidesLengthChange', sync);
2748
+ sync();
2749
+ const stop = () => {
2750
+ swiper.off('slideChange', sync);
2751
+ swiper.off('slidesLengthChange', sync);
2752
+ delete swiper.el[BAR_RUNTIME_KEY];
2753
+ };
2754
+ swiper.el[BAR_RUNTIME_KEY] = stop;
2755
+ return stop;
2756
+ }
2511
2757
 
2512
2758
  /**
2513
2759
  * THE LIGHTBOX (CC3 — complex-components plan §7d, board 6). Not a component: a Dialog holding a Slider bound to the
@@ -3931,6 +4177,28 @@ function runCompositeItemAction(el, action) {
3931
4177
  return runtime ? runtime.run(action, runtime.keyOf(item.el)) : null;
3932
4178
  }
3933
4179
 
4180
+ /**
4181
+ * Set how a header behaves as the page scrolls (premium components T2, M4) — ONE edit for the builder's Header section
4182
+ * and the composer (generation-core), on either node shape. A header that stays at the top is the containing block of its
4183
+ * edge: the live site makes it sticky (iox-design.css), and a header stored `static` becomes `relative` — what the canvas,
4184
+ * which forces a node's own position, draws it with. Nothing else of the author's is touched.
4185
+ */
4186
+ function setHeaderBehaviour(node, behaviour, edge) {
4187
+ const b = headerBehaviourOf(behaviour);
4188
+ writeProp(node, HeaderTrait.Behaviour, b);
4189
+ writeProp(node, HeaderTrait.Edge, headerEdgeOf(edge) ?? '');
4190
+ const position = readStyle(node, 'position');
4191
+ if (headerStaysAtTop(b) && (position === undefined || position === null || position === '' || position === 'static'))
4192
+ writeStyles(node, { position: 'relative' });
4193
+ }
4194
+ /** The header's behaviour and edge as stored (Scrolls / none for a header that never chose). */
4195
+ function headerBehaviourOfNode(node) {
4196
+ return {
4197
+ behaviour: headerBehaviourOf(node ? readProp(node, HeaderTrait.Behaviour) : undefined),
4198
+ edge: headerEdgeOf(node ? readProp(node, HeaderTrait.Edge) : undefined),
4199
+ };
4200
+ }
4201
+
3934
4202
  /**
3935
4203
  * @vectoriox/iox-ui/composite-core — composites built from the builder's own parts (composite-components
3936
4204
  * plan §3a). FRAMEWORK-FREE: the builder, the SSR engine and iox-cms (generation-core's composer, the site
@@ -3946,5 +4214,5 @@ function runCompositeItemAction(el, action) {
3946
4214
  * Generated bundle index. Do not edit.
3947
4215
  */
3948
4216
 
3949
- export { ACCORDION_BIND_PROP, ACCORDION_CONTENT_LIMIT, ACCORDION_DEFAULT_ONS, ACCORDION_ICONS, ACCORDION_ICON_GLYPH, ACCORDION_NEW_ITEM_WORDS, ACCORDION_WORDS, ACTIVATE_ON_ATTRIBUTE, AccordionClass, AccordionDefaultOn, AccordionEditRefusal, AccordionIcon, AccordionKeyAction, AccordionRole, AccordionRuntime, BADGE_TONES, BADGE_TONE_ICONS, BadgeTone, CARD_LAYOUTS, CARD_LAYOUT_CUSTOM, CARD_PARTS, CARD_PART_ROLE, CARD_STACK_BREAKPOINT, CARD_WORDS, CAROUSEL_QUOTES, CHIP_ICON, CHIP_STYLE, COMPOSITE_ATTRIBUTE, COMPOSITE_KIND_ROLES, COMPOSITE_ROLE_SPECS, CardLayout, CardPart, CardRole, CarouselA11y, CompositeBehaviourTrait, CompositeItemAction, CompositeKind, DEFAULT_ON_ATTRIBUTE, DISCLOSURE_ITEM_KEY, DISCLOSURE_WORDS, DisclosureRole, EXCLUSIVE_KIND_ROLES, ExclusiveRuntime, ITEM_KEY_ATTRIBUTE, ITEM_OFF_EVENT, ITEM_ON_EVENT, ITEM_OPEN_STATE, LIGHTBOX_ARROWS_HIDE_AT, LIGHTBOX_LABEL, MULTIPLE_ATTRIBUTE, NO_ELEMENT_STYLE, ON_ATTRIBUTE, ON_STATE, ORIENTATION_ATTRIBUTE, PILL_LABEL_STYLE, SCOPE_ATTRIBUTE, SEGMENTED_BADGE_TONE, SEGMENTED_BADGE_WORDS, SEGMENTED_BEHAVIOUR, SEGMENTED_MAX_OPTIONS, SEGMENTED_MIN_OPTIONS, SEGMENTED_NAME, SEGMENTED_NEW_OPTION_WORDS, SEGMENTED_WORDS, SLIDER_NAME_TRAIT, SLIDER_PART_GLYPH, SLIDER_PART_ROLES, SLIDER_PLAY_GLYPH, SLIDER_TYPE, SLIDER_WORDS, SLIDE_TO_ROW, SLIDE_TYPE, SWIPER_THEME_COLOR, SceneRole, SegmentedEditRefusal, SegmentedRole, SegmentedTrait, SliderFlag, SliderRole, StructureEdit, StructureRefusal, TABS_ACTIVATE_ONS, TABS_CONTENT_LIMIT, TABS_IMAGE_BIND_PROP, TABS_LABEL_BIND_PROP, TABS_NEW_TAB_WORDS, TABS_ORIENTATIONS, TABS_STACK_BREAKPOINT, TABS_TEXT_BIND_PROP, TABS_WORDS, TabsActivateOn, TabsBehaviourTrait, TabsEditRefusal, TabsOrientation, TabsRole, UNTIL_FOUND, acceptsRefusal, accordionAnswerOf, accordionBehaviour, accordionDomIds, accordionFocusIndex, accordionHeadingLevel, accordionItemAttributes, accordionItemLabel, accordionItemOf, accordionItemState, accordionItems, accordionKeyAction, accordionPanelAttributes, accordionPanelOf, accordionPartStyle, accordionQuestionOf, accordionRegionAttributes, accordionRemovalRefusal, accordionRootAttributes, accordionRootOf, accordionRootOfItem, accordionRuntimeOf, accordionScope, accordionToContent, accordionToManual, accordionTrackAttributes, accordionTriggerAttributes, accordionTriggerOf, addAccordionItem, addSegmentedOption, addTabPair, applyCardLayout, attachAccordionAt, attachAccordions, attachCarouselA11y, attachCompositeAt, attachExclusiveAt, badgeStyleId, badgeToneOf, buildAccordionItem, buildAccordionRecipe, buildBadge, buildCardRecipe, buildCarouselRecipe, buildChip, buildCompositeIcon, buildDisclosureRecipe, buildLightboxRecipe, buildSegmentedOption, buildSegmentedRecipe, buildSliderPart, buildTabPair, buildTabsRecipe, canOpenAtClickedItem, cardPartsOf, cardRootOf, cardTitleOf, carouselOf, clearLayerStyles, closeAccordionItem, closestAccordion, closestAccordionItem, closestExclusive, closestExclusiveItemPart, compositeItemOf, compositeItems, compositeKindOfRole, compositeRootOf, compositeRowKeys, compositeScopeId, detachAccordion, detectAccordionIcon, detectCardLayout, disclosureOpenByDefault, domSafeKey, exclusiveBehaviourOf, exclusiveDefaultOf, exclusiveItemLabel, exclusiveItemPartOf, exclusiveKindHasPanels, exclusiveKindOf, exclusiveLabelOf, exclusivePartAttributes, exclusiveRootAttributesOf, exclusiveRootHoldsTriggers, exclusiveRootOf, exclusiveRuntimeOf, exclusiveScopeFor, findByRole, hasLabelledRegion, hasSliderParts, initialAccordionOpen, isAccordionFromContent, isAccordionItemOn, isAccordionPart, isAccordionRoot, isAnyCompositeRoot, isCardLinked, isCardRoot, isCompositeItem, isCompositeItemOn, isCompositePanel, isCompositeRoot, isCompositeTrigger, isDisclosurePart, isDisclosureRoot, isExclusiveItemOn, isExclusiveItemPart, isExclusiveKind, isExclusiveList, isExclusivePanel, isExclusivePanels, isExclusiveRoot, isExclusiveTrigger, isLockedPart, isPartOfExclusiveScope, isPillNode, isSegmentedPart, isSegmentedRoot, isSlider, isSliderPart, isTabsFromContent, isTabsPart, isTabsRoot, isToggleKind, itemOpenTriggerIds, lightboxSliderOf, makeCompositePart, manualTabKeys, migrateSliderControls, moveAccordionItem, moveSegmentedOption, moveTabPair, needsSliderMigration, nextAccordionState, nextItemKey, nextSegmentedKey, nextTabKey, onAccordionItemState, onCompositeItemState, onExclusiveItemState, openAccordionItem, parentInComposite, pickAccordionAutoBinds, pickTabsAutoBinds, readLayerStyle, readProp, readStyle, removeFromComposite, removeSegmentedOption, removeTabPair, renameAccordionItem, renameSegmentedOption, renameTab, repeatSourceOf, rowIndexOf, rowItemKey, rowSourceOf, runCompositeItemAction, sameRepeatSource, segmentedAddRefusal, segmentedBadgeOf, segmentedDefaultOn, segmentedItemTriggerIds, segmentedKeyAction, segmentedKeys, segmentedLabel, segmentedOptionAttributes, segmentedOptionKey, segmentedOptionLabel, segmentedOptionLabelNodeOf, segmentedOptions, segmentedPartAttributes, segmentedRemovalRefusal, segmentedRootAttributes, segmentedRootAttributesOf, segmentedScopeFor, serializeDomAttributes, setAccordionBehaviour, setAccordionIcon, setBadgeTone, setCardLinked, setCardPart, setSegmentedBadge, setSegmentedBehaviour, setSliderFlag, setTabsBehaviour, shouldScrollToItem, slideIndexForRow, sliderLiveRegion, sliderPart, sliderPartElement, sliderPauseAttributes, sliderPauseGlyph, sliderSlides, sliderWords, splitSliderChildren, structureRefusal, syncSliderParts, tabLabel, tabLabelNodeOf, tabListAttributes, tabPanelAttributes, tabPanelImageOf, tabPanelOf, tabPanelTextOf, tabPartKey, tabTriggerAttributes, tabTriggerOf, tabsBehaviour, tabsItemState, tabsItemTriggerIds, tabsKeyAction, tabsLabel, tabsListOf, tabsPanels, tabsPanelsOf, tabsPartAttributes, tabsPartnerOf, tabsRemovalRefusal, tabsRootAttributes, tabsScope, tabsScopeFor, tabsToContent, tabsToManual, tabsTriggers, walkComposite, wantedSliderParts, writeLayerStyles, writeProp, writeStyles };
4217
+ export { ACCORDION_BIND_PROP, ACCORDION_CONTENT_LIMIT, ACCORDION_DEFAULT_ONS, ACCORDION_ICONS, ACCORDION_ICON_GLYPH, ACCORDION_NEW_ITEM_WORDS, ACCORDION_WORDS, ACTIVATE_ON_ATTRIBUTE, AccordionClass, AccordionDefaultOn, AccordionEditRefusal, AccordionIcon, AccordionKeyAction, AccordionRole, AccordionRuntime, BADGE_TONES, BADGE_TONE_ICONS, BadgeTone, CARD_LAYOUTS, CARD_LAYOUT_CUSTOM, CARD_PARTS, CARD_PART_ROLE, CARD_STACK_BREAKPOINT, CARD_WORDS, CAROUSEL_QUOTES, CHIP_ICON, CHIP_STYLE, COMPOSITE_ATTRIBUTE, COMPOSITE_KIND_ROLES, COMPOSITE_ROLE_SPECS, CardLayout, CardPart, CardRole, CarouselA11y, CompositeBehaviourTrait, CompositeItemAction, CompositeKind, DEFAULT_ON_ATTRIBUTE, DISCLOSURE_ITEM_KEY, DISCLOSURE_WORDS, DisclosureRole, EXCLUSIVE_KIND_ROLES, ExclusiveRuntime, ITEM_KEY_ATTRIBUTE, ITEM_OFF_EVENT, ITEM_ON_EVENT, ITEM_OPEN_STATE, LIGHTBOX_ARROWS_HIDE_AT, LIGHTBOX_LABEL, MULTIPLE_ATTRIBUTE, NO_ELEMENT_STYLE, ON_ATTRIBUTE, ON_STATE, ORIENTATION_ATTRIBUTE, PILL_LABEL_STYLE, SCOPE_ATTRIBUTE, SEGMENTED_BADGE_TONE, SEGMENTED_BADGE_WORDS, SEGMENTED_BEHAVIOUR, SEGMENTED_MAX_OPTIONS, SEGMENTED_MIN_OPTIONS, SEGMENTED_NAME, SEGMENTED_NEW_OPTION_WORDS, SEGMENTED_WORDS, SLIDER_BAR_ORDER, SLIDER_NAME_TRAIT, SLIDER_PART_GLYPH, SLIDER_PART_ROLES, SLIDER_PLACEMENT_TRAIT, SLIDER_PLAY_GLYPH, SLIDER_SCROLL_PLAYS_TRAIT, SLIDER_SWAPPING_ATTRIBUTE, SLIDER_TEXT_ATTRIBUTE, SLIDER_TYPE, SLIDER_WORDS, SLIDE_CAPTION_TRAIT, SLIDE_TO_ROW, SLIDE_TYPE, SWIPER_THEME_COLOR, SceneRole, SegmentedEditRefusal, SegmentedRole, SegmentedTrait, SliderFlag, SliderPlacement, SliderRole, StructureEdit, StructureRefusal, TABS_ACTIVATE_ONS, TABS_CONTENT_LIMIT, TABS_IMAGE_BIND_PROP, TABS_LABEL_BIND_PROP, TABS_NEW_TAB_WORDS, TABS_ORIENTATIONS, TABS_STACK_BREAKPOINT, TABS_TEXT_BIND_PROP, TABS_WORDS, TabsActivateOn, TabsBehaviourTrait, TabsEditRefusal, TabsOrientation, TabsRole, UNTIL_FOUND, acceptsRefusal, accordionAnswerOf, accordionBehaviour, accordionDomIds, accordionFocusIndex, accordionHeadingLevel, accordionItemAttributes, accordionItemLabel, accordionItemOf, accordionItemState, accordionItems, accordionKeyAction, accordionPanelAttributes, accordionPanelOf, accordionPartStyle, accordionQuestionOf, accordionRegionAttributes, accordionRemovalRefusal, accordionRootAttributes, accordionRootOf, accordionRootOfItem, accordionRuntimeOf, accordionScope, accordionToContent, accordionToManual, accordionTrackAttributes, accordionTriggerAttributes, accordionTriggerOf, addAccordionItem, addSegmentedOption, addTabPair, applyCardLayout, attachAccordionAt, attachAccordions, attachCarouselA11y, attachCompositeAt, attachExclusiveAt, attachSliderBar, badgeStyleId, badgeToneOf, buildAccordionItem, buildAccordionRecipe, buildBadge, buildCardRecipe, buildCarouselRecipe, buildChip, buildCompositeIcon, buildDisclosureRecipe, buildLightboxRecipe, buildSegmentedOption, buildSegmentedRecipe, buildSliderPart, buildTabPair, buildTabsRecipe, canOpenAtClickedItem, cardPartsOf, cardRootOf, cardTitleOf, carouselOf, clearLayerStyles, closeAccordionItem, closestAccordion, closestAccordionItem, closestExclusive, closestExclusiveItemPart, compositeItemOf, compositeItems, compositeKindOfRole, compositeRootOf, compositeRowKeys, compositeScopeId, detachAccordion, detectAccordionIcon, detectCardLayout, disclosureOpenByDefault, domSafeKey, exclusiveBehaviourOf, exclusiveDefaultOf, exclusiveItemLabel, exclusiveItemPartOf, exclusiveKindHasPanels, exclusiveKindOf, exclusiveLabelOf, exclusivePartAttributes, exclusiveRootAttributesOf, exclusiveRootHoldsTriggers, exclusiveRootOf, exclusiveRuntimeOf, exclusiveScopeFor, findByRole, hasLabelledRegion, hasSliderParts, headerBehaviourOfNode, initialAccordionOpen, isAccordionFromContent, isAccordionItemOn, isAccordionPart, isAccordionRoot, isAnyCompositeRoot, isCardLinked, isCardRoot, isCompositeItem, isCompositeItemOn, isCompositePanel, isCompositeRoot, isCompositeTrigger, isDisclosurePart, isDisclosureRoot, isExclusiveItemOn, isExclusiveItemPart, isExclusiveKind, isExclusiveList, isExclusivePanel, isExclusivePanels, isExclusiveRoot, isExclusiveTrigger, isLockedPart, isPartOfExclusiveScope, isPillNode, isSegmentedPart, isSegmentedRoot, isSlider, isSliderPart, isTabsFromContent, isTabsPart, isTabsRoot, isToggleKind, itemOpenTriggerIds, lightboxSliderOf, makeCompositePart, manualTabKeys, migrateSliderControls, moveAccordionItem, moveSegmentedOption, moveTabPair, needsSliderMigration, nextAccordionState, nextItemKey, nextSegmentedKey, nextTabKey, onAccordionItemState, onCompositeItemState, onExclusiveItemState, openAccordionItem, parentInComposite, pickAccordionAutoBinds, pickTabsAutoBinds, readLayerStyle, readProp, readStyle, removeFromComposite, removeSegmentedOption, removeTabPair, renameAccordionItem, renameSegmentedOption, renameTab, repeatSourceOf, rowIndexOf, rowItemKey, rowSourceOf, runCompositeItemAction, sameRepeatSource, segmentedAddRefusal, segmentedBadgeOf, segmentedDefaultOn, segmentedItemTriggerIds, segmentedKeyAction, segmentedKeys, segmentedLabel, segmentedOptionAttributes, segmentedOptionKey, segmentedOptionLabel, segmentedOptionLabelNodeOf, segmentedOptions, segmentedPartAttributes, segmentedRemovalRefusal, segmentedRootAttributes, segmentedRootAttributesOf, segmentedScopeFor, serializeDomAttributes, setAccordionBehaviour, setAccordionIcon, setBadgeTone, setCardLinked, setCardPart, setHeaderBehaviour, setSegmentedBadge, setSegmentedBehaviour, setSliderFlag, setSliderPlacement, setTabsBehaviour, shouldScrollToItem, slideIndexForRow, sliderCaptionOf, sliderCountText, sliderLiveRegion, sliderPart, sliderPartElement, sliderPauseAttributes, sliderPauseGlyph, sliderPlacementOf, sliderSlides, sliderWords, splitSliderChildren, structureRefusal, syncSliderParts, tabLabel, tabLabelNodeOf, tabListAttributes, tabPanelAttributes, tabPanelImageOf, tabPanelOf, tabPanelTextOf, tabPartKey, tabTriggerAttributes, tabTriggerOf, tabsBehaviour, tabsItemState, tabsItemTriggerIds, tabsKeyAction, tabsLabel, tabsListOf, tabsPanels, tabsPanelsOf, tabsPartAttributes, tabsPartnerOf, tabsRemovalRefusal, tabsRootAttributes, tabsScope, tabsScopeFor, tabsToContent, tabsToManual, tabsTriggers, walkComposite, wantedSliderParts, writeLayerStyles, writeProp, writeStyles };
3950
4218
  //# sourceMappingURL=vectoriox-iox-ui-composite-core.mjs.map