@vectoriox/iox-ui 5.62.1 → 5.64.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.
@@ -1,7 +1,7 @@
1
1
  import { NEW_NODE_STYLE_DEFAULTS, defaultElementStyleFor, elementStyleById, ownedTraitsOf, applyElementStyle, flavorPackById, parseHexColor, SPEC_AXES, EntranceParam, staggerDelay, LinkType, COLOR_SCHEMES, setColorScheme, resolveDesignChoices, ANIMATE_IDS, auditDesignContrast } from '@vectoriox/iox-ui/design-core';
2
2
  import { formPresetById, FORM_PRESETS, ControlType, FORM_NODE_TYPE, collectFormSpec, FIELD_NODE_TYPE } from '@vectoriox/iox-ui/forms-core';
3
3
  import { SEO_DESCRIPTION_MAX, SEO_TITLE_MAX } from '@vectoriox/iox-ui/seo-core';
4
- import { segmentedOptions, ITEM_OPEN_STATE, CardPart, CardRole, CardLayout, CARD_LAYOUTS, CARD_PARTS, BADGE_TONES, buildCardRecipe, findByRole, buildSegmentedRecipe, AccordionRole, buildAccordionRecipe, ACCORDION_WORDS, accordionItems, accordionQuestionOf, accordionAnswerOf, ACCORDION_BIND_PROP, pickAccordionAutoBinds, ACCORDION_CONTENT_LIMIT, buildTabsRecipe, TABS_WORDS, tabsTriggers, tabLabelNodeOf, TABS_LABEL_BIND_PROP, tabsPanels, tabPanelTextOf, TABS_TEXT_BIND_PROP, tabPanelImageOf, pickTabsAutoBinds, tabsListOf, tabsPanelsOf, TABS_CONTENT_LIMIT, TABS_IMAGE_BIND_PROP, buildCarouselRecipe, SLIDE_TYPE, buildLightboxRecipe, LIGHTBOX_LABEL, SLIDE_TO_ROW } from '@vectoriox/iox-ui/composite-core';
4
+ import { pickTabsAutoBinds, pickAccordionAutoBinds, segmentedOptions, ITEM_OPEN_STATE, CardPart, CardRole, CardLayout, CARD_LAYOUTS, CARD_PARTS, BADGE_TONES, buildCardRecipe, findByRole, buildSegmentedRecipe, AccordionRole, buildAccordionRecipe, ACCORDION_WORDS, accordionItems, accordionQuestionOf, accordionAnswerOf, ACCORDION_BIND_PROP, ACCORDION_CONTENT_LIMIT, buildTabsRecipe, TABS_WORDS, tabsTriggers, tabLabelNodeOf, TABS_LABEL_BIND_PROP, tabsPanels, tabPanelTextOf, TABS_TEXT_BIND_PROP, tabPanelImageOf, tabsListOf, tabsPanelsOf, TABS_CONTENT_LIMIT, TABS_IMAGE_BIND_PROP, buildCarouselRecipe, SLIDE_TYPE, buildLightboxRecipe, LIGHTBOX_LABEL, SLIDE_TO_ROW } from '@vectoriox/iox-ui/composite-core';
5
5
  import { ELEMENT_ACTION_DESCRIPTORS, resolveActionAvailability } from '@vectoriox/iox-ui/actions-core';
6
6
 
7
7
  // GENERATED from iox-ai-guidance flavor-spec.v1.json — do not edit; re-run scripts/gen-flavor-spec.mjs
@@ -10752,6 +10752,31 @@ function jsonSchemaObjects(node, out = []) {
10752
10752
  return out;
10753
10753
  }
10754
10754
 
10755
+ const LIST_RECIPES = {
10756
+ [PatternRecipe.Accordion]: { picks: f => ({ ...pickAccordionAutoBinds(f) }), required: ['question', 'answer'], needs: 'short-text field for the question and long-text field for the answer' },
10757
+ [PatternRecipe.Tabs]: { picks: f => ({ ...pickTabsAutoBinds(f) }), required: ['label', 'text'], needs: 'short-text field for the tab and long-text field for its panel' },
10758
+ };
10759
+ /** The fields `recipe` binds from a listed type's `fields`, and what they lack. A recipe that lists nothing lacks nothing. */
10760
+ function recipeListBinds(recipe, fields) {
10761
+ const spec = recipe ? LIST_RECIPES[recipe] : undefined;
10762
+ if (!spec)
10763
+ return { picks: {}, gap: null };
10764
+ const picks = spec.picks(fields);
10765
+ return { picks: picks, gap: spec.required.every(key => picks[key]) ? null : spec.needs };
10766
+ }
10767
+ const listsBinding = (src) => src === PatternDirective.Binding || src === PatternDirective.OptionalBinding;
10768
+ /** What a listed type with `fields` lacks for the pattern's recipes that repeat the section's binding — the first gap, or null. */
10769
+ function patternListGap(pattern, fields) {
10770
+ for (const node of patternNodes(pattern)) {
10771
+ if (!listsBinding(node.src))
10772
+ continue;
10773
+ const { gap } = recipeListBinds(node.recipe, fields);
10774
+ if (gap)
10775
+ return gap;
10776
+ }
10777
+ return null;
10778
+ }
10779
+
10755
10780
  /**
10756
10781
  * The Site Plan validator — the gate in front of the composer. The wizard's plan and (later) the AI's
10757
10782
  * plan go through the SAME checks: an unknown pattern, a slot the pattern does not declare, a source
@@ -10972,10 +10997,11 @@ function validateContentTypes(c, list) {
10972
10997
  if (name && types.has(name))
10973
10998
  c.add(SitePlanIssueCode.Duplicate, `${path}.name`, `content type "${name}" is used twice`);
10974
10999
  else if (name)
10975
- types.set(name, { fields: fieldSet, roles });
11000
+ types.set(name, { fields: fieldSet, described: fields.filter(isPlainObject).map(describeField), roles });
10976
11001
  });
10977
11002
  return types;
10978
11003
  }
11004
+ const describeField = (f) => ({ name: String(f['name']), type: typeof f['type'] === 'string' ? f['type'] : undefined, controller: typeof f['controller'] === 'string' ? f['controller'] : undefined });
10979
11005
  /** A content type's roles (L0-3): known roles only, each played by a field of the type; `title` always; `gallery` a list. */
10980
11006
  function validateRoles(c, roles, path, typeName, fields, fieldTypes) {
10981
11007
  if (!isPlainObject(roles)) {
@@ -11202,6 +11228,12 @@ function validatePages(c, list, types, sources, density) {
11202
11228
  c.add(SitePlanIssueCode.UnknownDataSource, `${sp}.binding`, `no data source "${binding}"`);
11203
11229
  else if (src.type !== PlanDataSourceType.Cms || src.mode !== PlanDataSourceMode.Query)
11204
11230
  c.add(SitePlanIssueCode.Binding, `${sp}.binding`, `"${binding}" is not a list source`);
11231
+ else {
11232
+ const listed = src.contentType ? types.get(src.contentType) : undefined;
11233
+ const gap = listed ? patternListGap(pattern, listed.described) : null;
11234
+ if (gap)
11235
+ c.add(SitePlanIssueCode.Binding, `${sp}.binding`, `"${binding}" lists ${src.contentType}, which has no ${gap} — bind "${patternId}" to a list that has${patternNeedsBinding(pattern) ? '' : ', or to none'}`);
11236
+ }
11205
11237
  }
11206
11238
  }
11207
11239
  else if (binding)
@@ -12698,6 +12730,13 @@ function composeSegmented(pn, id) {
12698
12730
  applyLayout(root, pn);
12699
12731
  return root;
12700
12732
  }
12733
+ /** The content type a section binding lists, through its data source. */
12734
+ function boundContentType(binding, ctx) {
12735
+ const source = ctx.plan.dataSources.find(d => d.alias === binding);
12736
+ return source && 'contentType' in source ? ctx.plan.contentTypes.find(t => t.name === source.contentType) : undefined;
12737
+ }
12738
+ /** A type's fields as composite-core's pickers read them. */
12739
+ const fieldsOf = (type) => (type?.fields ?? []).map(f => ({ name: f.name, type: f.type, controller: f.controller }));
12701
12740
  /**
12702
12741
  * An Accordion (CC2) — the composite-core recipe stamped with this composer's factory. Manual (no section
12703
12742
  * binding): three items whose questions and answers are placeholders the studio rewrites (`ph: 'copy'`), never
@@ -12726,12 +12765,9 @@ function composeAccordion(pn, id, ctx) {
12726
12765
  }
12727
12766
  return root;
12728
12767
  }
12729
- const source = ctx.plan.dataSources.find(d => d.alias === binding);
12730
- const type = source && 'contentType' in source ? ctx.plan.contentTypes.find(t => t.name === source.contentType) : undefined;
12731
- const picks = pickAccordionAutoBinds((type?.fields ?? []).map(f => ({ name: f.name, type: f.type, controller: f.controller })));
12732
- if (!picks.question || !picks.answer) {
12733
- throw new ComposeError(`${id}: "${binding}" has no short-text field for the question and long-text field for the answer`);
12734
- }
12768
+ const { picks, gap } = recipeListBinds(pn.recipe, fieldsOf(boundContentType(binding, ctx)));
12769
+ if (gap)
12770
+ throw new ComposeError(`${id}: "${binding}" has no ${gap}`);
12735
12771
  addBinding(root, { prop: 'source', source: binding, path: '' });
12736
12772
  setProp(root, 'limit', ACCORDION_CONTENT_LIMIT);
12737
12773
  const [template] = accordionItems(root);
@@ -12740,11 +12776,6 @@ function composeAccordion(pn, id, ctx) {
12740
12776
  addBinding(accordionAnswerOf(template), { prop: ACCORDION_BIND_PROP, source: binding, path: picks.answer });
12741
12777
  return root;
12742
12778
  }
12743
- /** The content type a section binding lists, through its data source. */
12744
- function boundContentType(binding, ctx) {
12745
- const source = ctx.plan.dataSources.find(d => d.alias === binding);
12746
- return source && 'contentType' in source ? ctx.plan.contentTypes.find(t => t.name === source.contentType) : undefined;
12747
- }
12748
12779
  const TABS_ROOT_KEY = 'tabs';
12749
12780
  const TABS_HOLDER_KEYS = new Set(['list', 'panels']);
12750
12781
  /**
@@ -12783,11 +12814,9 @@ function composeTabs(pn, id, ctx) {
12783
12814
  }
12784
12815
  return root;
12785
12816
  }
12786
- const type = boundContentType(binding, ctx);
12787
- const picks = pickTabsAutoBinds((type?.fields ?? []).map(f => ({ name: f.name, type: f.type, controller: f.controller })));
12788
- if (!picks.label || !picks.text) {
12789
- throw new ComposeError(`${id}: "${binding}" has no short-text field for the tab and long-text field for its panel`);
12790
- }
12817
+ const { picks, gap } = recipeListBinds(pn.recipe, fieldsOf(boundContentType(binding, ctx)));
12818
+ if (gap)
12819
+ throw new ComposeError(`${id}: "${binding}" has no ${gap}`);
12791
12820
  for (const holder of [tabsListOf(tree), tabsPanelsOf(tree)]) {
12792
12821
  addBinding(holder, { prop: 'source', source: binding, path: '' });
12793
12822
  setProp(holder, 'limit', TABS_CONTENT_LIMIT);
@@ -13380,6 +13409,85 @@ function buildStepFacts(plan, actions = {}) {
13380
13409
  };
13381
13410
  }
13382
13411
 
13412
+ /**
13413
+ * What a plan reads but no model is asked to write (vectoriox/iox-cms#49): the data sources that follow from the pages
13414
+ * alone. A per-item page whose sections read the NEXT item (`project.next`) needs a `$siblings.next` source of its route
13415
+ * source — a fact of the pages, while data sources are the plan's STRUCTURE, asked first and fixed once accepted. Asking
13416
+ * the structure for it made the pages' answer unfixable by construction (a re-ask of the pages cannot add a source), so
13417
+ * it is derived, the same way for the plan wire's expansion (`expandPlanWire`) and for a sentence's page edits
13418
+ * (`applyPlanEdits`). Pure and idempotent: a plan that already holds the source gains nothing; a source is derived only
13419
+ * where it is valid by construction (its subject a single cms source of a type of the plan), so it never adds an issue
13420
+ * at a structure path. Its siblings are walked within an unlimited list of the same type — the structure's first, else a
13421
+ * derived one.
13422
+ */
13423
+ const NEXT_SUFFIX = 'Next';
13424
+ const LIST_SUFFIX = 'All';
13425
+ /** The sources by alias, as the validator reads them (the first of an alias wins). */
13426
+ function sourceViews(list) {
13427
+ const views = new Map();
13428
+ for (const raw of list) {
13429
+ if (isPlainObject(raw) && isNonEmptyString(raw['alias']) && !views.has(raw['alias']))
13430
+ views.set(raw['alias'], raw);
13431
+ }
13432
+ return views;
13433
+ }
13434
+ const readsNext = (page) => Array.isArray(page['sections']) && page['sections'].some(s => {
13435
+ const pattern = isPlainObject(s) && typeof s['pattern'] === 'string' ? patternById(s['pattern']) : undefined;
13436
+ return !!pattern && patternScopes(pattern).has(BindScope.Next);
13437
+ });
13438
+ /** The alias itself, else the first of `<alias>2`, `<alias>3`… no source has. */
13439
+ function freeAlias(base, taken) {
13440
+ let alias = base;
13441
+ for (let n = 2; taken.has(alias); n++)
13442
+ alias = `${base}${n}`;
13443
+ return alias;
13444
+ }
13445
+ /** The unlimited list of `contentType` the plan holds (its first), or null. */
13446
+ function fullListOf(views, contentType) {
13447
+ for (const [alias, s] of views) {
13448
+ if (s.type === PlanDataSourceType.Cms && s.mode === PlanDataSourceMode.Query && s.contentType === contentType && s.limit === undefined)
13449
+ return alias;
13450
+ }
13451
+ return null;
13452
+ }
13453
+ /**
13454
+ * The data sources `plan` lacks and its pages need, in page order (appended after the plan's own). Tolerates any
13455
+ * value: what is not a well-formed plan gains nothing, for the validator to judge as written.
13456
+ */
13457
+ function derivedDataSources(plan) {
13458
+ if (!isPlainObject(plan) || !Array.isArray(plan['dataSources']) || !Array.isArray(plan['pages']) || !Array.isArray(plan['contentTypes']))
13459
+ return [];
13460
+ const types = new Set(plan['contentTypes'].map(t => (isPlainObject(t) ? t['name'] : undefined)).filter(isNonEmptyString));
13461
+ const views = sourceViews(plan['dataSources']);
13462
+ const derived = [];
13463
+ const add = (source) => { derived.push(source); views.set(source.alias, source); };
13464
+ for (const page of plan['pages']) {
13465
+ if (!isPlainObject(page) || !isNonEmptyString(page['routeSource']) || !readsNext(page))
13466
+ continue;
13467
+ const subject = page['routeSource'];
13468
+ const route = views.get(subject);
13469
+ if (!route || route.type !== PlanDataSourceType.Cms || route.mode !== PlanDataSourceMode.Single)
13470
+ continue;
13471
+ if (!isNonEmptyString(route.contentType) || !types.has(route.contentType) || nextSourceOf(views, subject))
13472
+ continue;
13473
+ let within = fullListOf(views, route.contentType);
13474
+ if (!within) {
13475
+ within = freeAlias(`${subject}${LIST_SUFFIX}`, views);
13476
+ add({ alias: within, type: PlanDataSourceType.Cms, mode: PlanDataSourceMode.Query, contentType: route.contentType });
13477
+ }
13478
+ add({ alias: freeAlias(`${subject}${NEXT_SUFFIX}`, views), type: PlanDataSourceType.Relative, of: subject, op: RelativeOp.SiblingsNext, within });
13479
+ }
13480
+ return derived;
13481
+ }
13482
+ /** `plan` with the data sources its pages need appended (`derivedDataSources`); the same object when it lacks none. */
13483
+ function withDerivedSources(plan) {
13484
+ const derived = derivedDataSources(plan);
13485
+ if (!derived.length)
13486
+ return plan;
13487
+ const own = plan;
13488
+ return { ...own, dataSources: [...own['dataSources'], ...derived] };
13489
+ }
13490
+
13383
13491
  /**
13384
13492
  * The plan WIRE (AI plan M1-3, vectoriox/iox-cms#45, #47): what a model writes when it plans a site — a compact format
13385
13493
  * inside the Claude API's structured-output limits (≤ 24 optional parameters and ≤ 16 unions per request, and a compiled
@@ -13400,6 +13508,10 @@ function buildStepFacts(plan, actions = {}) {
13400
13508
  * - **What the model does not decide is not on the wire** (`PLAN_WIRE_DERIVED`): the look (the owner's pick), the run,
13401
13509
  * the language (the reading's), the facts (the owner's own, verbatim), the version, the home page (the page at `/`).
13402
13510
  * So the format is the same for every studio and every run — one compiled grammar, cached by the provider.
13511
+ * - **What follows from the pages is derived, never asked** (`plan-derived.ts`, vectoriox/iox-cms#49): a per-item page
13512
+ * reading the next item gets its `$siblings.next` source — the structure, asked first and then fixed, cannot know the
13513
+ * pages need it, and the pages cannot add a source. `planToWire` writes every source the plan holds, a derived one
13514
+ * too (it is the plan's: a change's brief shows it, and a plan → wire → plan round trip stays exact).
13403
13515
  *
13404
13516
  * ONE source: every wire key names the plan keys it carries (`refs`) and is described in the plan table's own words, and
13405
13517
  * every plan key is either carried or derived (`planWireGaps()`); a key the plan shape gains breaks the builder until it
@@ -13444,7 +13556,7 @@ const WIRE_KEYS = {
13444
13556
  plan: {
13445
13557
  business: inPart(PlanPart.Structure, key('plan.business')),
13446
13558
  contentTypes: inPart(PlanPart.Structure, key('plan.contentTypes')),
13447
- dataSources: inPart(PlanPart.Structure, { refs: ['plan.dataSources'], text: 'dataSource[] — merged by alias into the org library' }),
13559
+ dataSources: inPart(PlanPart.Structure, { refs: ['plan.dataSources'], text: "dataSource[] — merged by alias into the org library; a per-item page's $siblings.next source (what a section reading the next item needs) is added for you" }),
13448
13560
  pages: inPart(PlanPart.Pages, key('plan.pages')),
13449
13561
  globals: inPart(PlanPart.Pages, key('plan.globals')),
13450
13562
  },
@@ -13774,7 +13886,7 @@ function expandWireBusiness(wire, facts) {
13774
13886
  * A model's plan (its parts, on the wire) + what the generation decides (the look, the run, the language, the owner's
13775
13887
  * facts) → the Site Plan. Pure. Translates, never repairs: whatever an answer got wrong is still wrong, for
13776
13888
  * `validateSitePlan` — a part that is not an object is the result itself, a part not written yet leaves its keys out
13777
- * (the validator then names them, at their own paths).
13889
+ * (the validator then names them, at their own paths). What follows from the pages alone is added (`withDerivedSources`).
13778
13890
  */
13779
13891
  function expandPlanWire(parts, context) {
13780
13892
  const written = PLAN_PARTS.filter(part => parts[part] !== undefined).map(part => parts[part]);
@@ -13783,7 +13895,7 @@ function expandPlanWire(parts, context) {
13783
13895
  return odd;
13784
13896
  const wire = Object.assign({}, ...written);
13785
13897
  const { business, contentTypes, dataSources, pages, ...rest } = wire;
13786
- return {
13898
+ return withDerivedSources({
13787
13899
  ...rest,
13788
13900
  version: SITE_PLAN_VERSION,
13789
13901
  source: { ...context.source },
@@ -13793,7 +13905,7 @@ function expandPlanWire(parts, context) {
13793
13905
  contentTypes: each(contentTypes, expandWireContentType),
13794
13906
  dataSources: each(dataSources, expandWireDataSource),
13795
13907
  pages: each(pages, expandWirePage),
13796
- };
13908
+ });
13797
13909
  }
13798
13910
  // ── The plan → the wire ────────────────────────────────────────────────────────────────────────────────────────────
13799
13911
  function fieldToWire(field) {
@@ -14491,8 +14603,9 @@ const APPLY = {
14491
14603
  };
14492
14604
  /**
14493
14605
  * Apply a set of edits to a plan — all of them, or none (any issue refuses the set and returns the plan unchanged). The
14494
- * sources only removed pages and sections read are dropped with them; sources nothing read before are kept.
14495
- * The result still has to pass `validateSitePlan`.
14606
+ * sources only removed pages and sections read are dropped with them; sources nothing read before are kept; the sources
14607
+ * the pages now need and no model writes are derived (`derivedDataSources` — a page edit adding `project.next`, as the
14608
+ * plan wire's expansion does, vectoriox/iox-cms#49). The result still has to pass `validateSitePlan`.
14496
14609
  */
14497
14610
  function applyPlanEdits(plan, edits) {
14498
14611
  const structure = validatePlanEdits(edits);
@@ -14511,7 +14624,11 @@ function applyPlanEdits(plan, edits) {
14511
14624
  for (const s of draft.dataSources)
14512
14625
  if (!dataSources.includes(s))
14513
14626
  changed.push({ kind: PlanChangeKind.DataSource, action: PlanChangeAction.Removed, name: s.alias });
14514
- return { plan: { ...plan, pages: draft.pages, contentTypes: draft.contentTypes, dataSources }, changed, issues: [] };
14627
+ const edited = { ...plan, pages: draft.pages, contentTypes: draft.contentTypes, dataSources };
14628
+ const derived = derivedDataSources(edited);
14629
+ for (const s of derived)
14630
+ changed.push({ kind: PlanChangeKind.DataSource, action: PlanChangeAction.Added, name: s.alias });
14631
+ return { plan: derived.length ? { ...edited, dataSources: [...dataSources, ...derived] } : edited, changed, issues: [] };
14515
14632
  }
14516
14633
  // ── The format a model writes edits in ─────────────────────────────────────────────────────────────────
14517
14634
  /** Each part's answer format name. */
@@ -15297,5 +15414,5 @@ function addStockCredits(footer, credits) {
15297
15414
  * Generated bundle index. Do not edit.
15298
15415
  */
15299
15416
 
15300
- export { ACTIVE_BUILD_STATUSES, AI_REFUSAL_NEXT, AI_REFUSAL_STATUS, AI_STEPS, AI_STEP_LABELS, AI_STEP_NEEDS, AI_STEP_PART_TOKENS, AI_STEP_TYPICAL_TOKENS, AiCallStatus, AiCapability, AiFeature, AiGenerationStage, AiKeyMode, AiLimit, AiNextKind, AiProviderId, AiRefusalCode, AiStep, BAR_ITEMS_MAX, BAR_ITEMS_MIN, BASELINE_ROLES, BUILD_STEPS, BaselineRole, BindScope, BuildNoticeCode, BuildStep, CONTENT_ROLE_MEANINGS, CREDITS_PER_USD, CardBindTarget, CheckSeverity, ComposeError, ComposeIssueCode, ContentRole, ContentTypeAction, CreatedKind, DANGLING_LINK_CODES, DEFAULT_PHONE_MENU_BREAKPOINT, DEFAULT_SITE_LOCALE, ENTRANCE_EASING, ENTRANCE_ORIGIN_LOOK, ENTRANCE_TRIGGER, EntrancePart, EntranceSide, FACT_KEYS, FINAL_GENERATION_STAGES, FINDING_SEVERITY, GRAMMAR_TOO_LARGE_MESSAGE, GlobalSlot, HEBREW_PREFIXES, JSON_SCHEMA_BANNED_KEYWORDS, JsonSchemaShapeError, KeptReason, NAV_PART_LABELS, NAV_SHAPE_COPY, NEUTRAL_STYLE_PROPS, NODE_BASELINES, NO_TOKENS, NavPagesSource, NavRole, NavShape, NavShapeError, PAGE_ARCHETYPES, PLAN_EDITS_ANSWER_SHAPES, PLAN_EDITS_PART_SCHEMA_NAMES, PLAN_EDIT_OP_PART, PLAN_EDIT_SHAPE, PLAN_EDIT_WIRE_KEYS, PLAN_PARTS, PLAN_PART_KEYS, PLAN_WIRE_DERIVED, PLAN_WIRE_PART_SCHEMA_NAMES, PLAN_WIRE_SHAPE, PRICING_PATTERN, PUBLISH_BLOCKING_PLACEHOLDERS, PageDataKind, PathIssueCollector, PatternDirective, PatternGlobalPosition, PatternOpens, PatternPlaceholder, PatternRecipe, PhoneMenuBreakpoint, PlaceholderKind, PlanChangeAction, PlanChangeKind, PlanDataSourceMode, PlanDataSourceType, PlanEditIssueCode, PlanEditOp, PlanEditsOutcome, PlanPart, PlanWireEntry, PlanWireShapeError, PlanWordIssueCode, PreflightRefusalCode, PublishRefusalCode, REQUIRED_CONTENT_ROLES, RelativeOp, SAMPLE_IMAGE_REF, SITE_CHECKS, SITE_FACT_LABELS, SITE_HEADER_PATTERN, SITE_LIBRARY, SITE_LOCALES, SITE_NEED_IDS, SITE_PATTERNS, SITE_PLAN_VERSION, SITE_TEMPLATES, SPEC_SITE_ARCHETYPES, SPEC_SITE_COPY_LENGTHS, SPEC_SITE_DENSITY_COPY, SPEC_SITE_FACTS, SPEC_SITE_LIBRARY, SPEC_SITE_LOCALES, SPEC_SITE_NEED_IDS, SPEC_SITE_PATTERNS, SPEC_SITE_PLAN_SHAPE, SPEC_SITE_REQUIRED_ROLES, SPEC_SITE_ROLES, SPEC_SITE_TEMPLATES, STOCK_FAMILIES, STOCK_PROVIDER_TERMS, STRICT_SCHEMA_BUDGET, STRICT_SCHEMA_LIMITS, STUDIO_TEMPLATE, SiteBuildKind, SiteBuildStatus, SiteCheckId, SiteFindingCode, SiteLocale, SitePlanError, SitePlanIssueCode, SitePlanSourceKind, SiteTemplateError, SiteTemplateId, StepState, StockProviderId, addBarItem, addStockCredits, aiStepParts, applyPlanEdits, applyStockPhotos, archetypeIssues, assertStyleSlots, assertValidSitePlan, auditSite, barIconForRoute, blocksPublish, buildKeys, buildStepFacts, builtHomePageId, composeNavHeader, composeSection, composeSite, contentTypePreviewFields, contentTypeToWire, copyLengthOf, costUsd, createSerializedNode, creditsOfUsd, dataSourceToWire, describePlanData, describeShapeKey, entranceAction, entranceInteraction, estimateStepCredits, expandPlanWire, expandWireContentType, expandWireDataSource, expandWireEdit, expandWireField, expandWirePage, expandWireSection, failedBuildStep, fieldToWire, findNavRoot, isActiveBuild, isNonEmptyString, isPlainObject, isRtlLocale, jsonAnyOf, jsonBoolean, jsonClosedObject, jsonInteger, jsonListOf, jsonOneOf, jsonSchemaKeywords, jsonSchemaObjects, jsonShapedObject, jsonText, modelCanDo, moveBarItem, navPages, navShapeBreakpoint, navShapeOf, nextSourceOf, nodeBindPaths, pageToWire, parsePatternPath, parseSampleImageRef, pathAt, patternById, patternHasForm, patternLinkSlots, patternManifest, patternNeedsBinding, patternNodes, patternOptionalParts, patternRoleNeeds, patternScopes, patternSlotBudgets, patternSlots, patternTakesBinding, phoneMenuPages, planEditOps, planEditToWire, planEditWireGaps, planEditWireKeys, planEditWireOps, planEditWireShape, planEditsFromWire, planEditsJsonSchema, planEditsToWire, planEntrances, planFromTemplate, planNavShape, planPartOfPath, planPartToWire, planStockPhotos, planToWire, planWireGaps, planWirePartJsonSchema, planWirePartShape, planWordIssues, publishRefusal, publishVerdict, releasedLayoutDefaults, removeBarItem, requiredAcknowledgements, requiredShapeKeys, roleField, routeMatches, routeParams, sampleImageRef, sectionEntrances, sectionPatternIds, sectionToWire, setStyleProps, shapeKeys, showcaseGlobals, showcasePages, showcasePlans, siteNavPages, slotBudget, stockCopyKey, stockCreditLine, stockCreditLines, stockCreditNode, stockCreditNodeId, stockSlots, strictSchemaComplexity, strictSchemaRefusal, typicalStepTokens, validatePlanEdits, validateSitePlan, walkSerialized, wireContentTypeJsonSchema, wireDataSourceJsonSchema, wireFieldJsonSchema, wirePageJsonSchema, wireSectionJsonSchema, wordPattern, writtenTexts };
15417
+ export { ACTIVE_BUILD_STATUSES, AI_REFUSAL_NEXT, AI_REFUSAL_STATUS, AI_STEPS, AI_STEP_LABELS, AI_STEP_NEEDS, AI_STEP_PART_TOKENS, AI_STEP_TYPICAL_TOKENS, AiCallStatus, AiCapability, AiFeature, AiGenerationStage, AiKeyMode, AiLimit, AiNextKind, AiProviderId, AiRefusalCode, AiStep, BAR_ITEMS_MAX, BAR_ITEMS_MIN, BASELINE_ROLES, BUILD_STEPS, BaselineRole, BindScope, BuildNoticeCode, BuildStep, CONTENT_ROLE_MEANINGS, CREDITS_PER_USD, CardBindTarget, CheckSeverity, ComposeError, ComposeIssueCode, ContentRole, ContentTypeAction, CreatedKind, DANGLING_LINK_CODES, DEFAULT_PHONE_MENU_BREAKPOINT, DEFAULT_SITE_LOCALE, ENTRANCE_EASING, ENTRANCE_ORIGIN_LOOK, ENTRANCE_TRIGGER, EntrancePart, EntranceSide, FACT_KEYS, FINAL_GENERATION_STAGES, FINDING_SEVERITY, GRAMMAR_TOO_LARGE_MESSAGE, GlobalSlot, HEBREW_PREFIXES, JSON_SCHEMA_BANNED_KEYWORDS, JsonSchemaShapeError, KeptReason, NAV_PART_LABELS, NAV_SHAPE_COPY, NEUTRAL_STYLE_PROPS, NODE_BASELINES, NO_TOKENS, NavPagesSource, NavRole, NavShape, NavShapeError, PAGE_ARCHETYPES, PLAN_EDITS_ANSWER_SHAPES, PLAN_EDITS_PART_SCHEMA_NAMES, PLAN_EDIT_OP_PART, PLAN_EDIT_SHAPE, PLAN_EDIT_WIRE_KEYS, PLAN_PARTS, PLAN_PART_KEYS, PLAN_WIRE_DERIVED, PLAN_WIRE_PART_SCHEMA_NAMES, PLAN_WIRE_SHAPE, PRICING_PATTERN, PUBLISH_BLOCKING_PLACEHOLDERS, PageDataKind, PathIssueCollector, PatternDirective, PatternGlobalPosition, PatternOpens, PatternPlaceholder, PatternRecipe, PhoneMenuBreakpoint, PlaceholderKind, PlanChangeAction, PlanChangeKind, PlanDataSourceMode, PlanDataSourceType, PlanEditIssueCode, PlanEditOp, PlanEditsOutcome, PlanPart, PlanWireEntry, PlanWireShapeError, PlanWordIssueCode, PreflightRefusalCode, PublishRefusalCode, REQUIRED_CONTENT_ROLES, RelativeOp, SAMPLE_IMAGE_REF, SITE_CHECKS, SITE_FACT_LABELS, SITE_HEADER_PATTERN, SITE_LIBRARY, SITE_LOCALES, SITE_NEED_IDS, SITE_PATTERNS, SITE_PLAN_VERSION, SITE_TEMPLATES, SPEC_SITE_ARCHETYPES, SPEC_SITE_COPY_LENGTHS, SPEC_SITE_DENSITY_COPY, SPEC_SITE_FACTS, SPEC_SITE_LIBRARY, SPEC_SITE_LOCALES, SPEC_SITE_NEED_IDS, SPEC_SITE_PATTERNS, SPEC_SITE_PLAN_SHAPE, SPEC_SITE_REQUIRED_ROLES, SPEC_SITE_ROLES, SPEC_SITE_TEMPLATES, STOCK_FAMILIES, STOCK_PROVIDER_TERMS, STRICT_SCHEMA_BUDGET, STRICT_SCHEMA_LIMITS, STUDIO_TEMPLATE, SiteBuildKind, SiteBuildStatus, SiteCheckId, SiteFindingCode, SiteLocale, SitePlanError, SitePlanIssueCode, SitePlanSourceKind, SiteTemplateError, SiteTemplateId, StepState, StockProviderId, addBarItem, addStockCredits, aiStepParts, applyPlanEdits, applyStockPhotos, archetypeIssues, assertStyleSlots, assertValidSitePlan, auditSite, barIconForRoute, blocksPublish, buildKeys, buildStepFacts, builtHomePageId, composeNavHeader, composeSection, composeSite, contentTypePreviewFields, contentTypeToWire, copyLengthOf, costUsd, createSerializedNode, creditsOfUsd, dataSourceToWire, derivedDataSources, describePlanData, describeShapeKey, entranceAction, entranceInteraction, estimateStepCredits, expandPlanWire, expandWireContentType, expandWireDataSource, expandWireEdit, expandWireField, expandWirePage, expandWireSection, failedBuildStep, fieldToWire, findNavRoot, isActiveBuild, isNonEmptyString, isPlainObject, isRtlLocale, jsonAnyOf, jsonBoolean, jsonClosedObject, jsonInteger, jsonListOf, jsonOneOf, jsonSchemaKeywords, jsonSchemaObjects, jsonShapedObject, jsonText, modelCanDo, moveBarItem, navPages, navShapeBreakpoint, navShapeOf, nextSourceOf, nodeBindPaths, pageToWire, parsePatternPath, parseSampleImageRef, pathAt, patternById, patternHasForm, patternLinkSlots, patternListGap, patternManifest, patternNeedsBinding, patternNodes, patternOptionalParts, patternRoleNeeds, patternScopes, patternSlotBudgets, patternSlots, patternTakesBinding, phoneMenuPages, planEditOps, planEditToWire, planEditWireGaps, planEditWireKeys, planEditWireOps, planEditWireShape, planEditsFromWire, planEditsJsonSchema, planEditsToWire, planEntrances, planFromTemplate, planNavShape, planPartOfPath, planPartToWire, planStockPhotos, planToWire, planWireGaps, planWirePartJsonSchema, planWirePartShape, planWordIssues, publishRefusal, publishVerdict, recipeListBinds, releasedLayoutDefaults, removeBarItem, requiredAcknowledgements, requiredShapeKeys, roleField, routeMatches, routeParams, sampleImageRef, sectionEntrances, sectionPatternIds, sectionToWire, setStyleProps, shapeKeys, showcaseGlobals, showcasePages, showcasePlans, siteNavPages, slotBudget, stockCopyKey, stockCreditLine, stockCreditLines, stockCreditNode, stockCreditNodeId, stockSlots, strictSchemaComplexity, strictSchemaRefusal, typicalStepTokens, validatePlanEdits, validateSitePlan, walkSerialized, wireContentTypeJsonSchema, wireDataSourceJsonSchema, wireFieldJsonSchema, wirePageJsonSchema, wireSectionJsonSchema, withDerivedSources, wordPattern, writtenTexts };
15301
15418
  //# sourceMappingURL=vectoriox-iox-ui-generation-core.mjs.map