@vectoriox/iox-ui 5.63.0 → 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.
- package/fesm2022/vectoriox-iox-ui-generation-core.mjs +143 -26
- package/fesm2022/vectoriox-iox-ui-generation-core.mjs.map +1 -1
- package/generation-core/index.d.ts +29 -5
- package/package.json +1 -1
- package/src/generation-core/compose-site.ts +21 -23
- package/src/generation-core/plan-derived.ts +84 -0
- package/src/generation-core/plan-edits.ts +8 -3
- package/src/generation-core/plan-wire.ts +9 -4
- package/src/generation-core/public-api.ts +2 -0
- package/src/generation-core/recipe-fields.ts +49 -0
- package/src/generation-core/validate-site-plan.ts +15 -2
|
@@ -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,
|
|
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
|
|
12730
|
-
|
|
12731
|
-
|
|
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
|
|
12787
|
-
|
|
12788
|
-
|
|
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:
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|