@vectoriox/iox-ui 5.40.0 → 5.41.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 (31) hide show
  1. package/composite-core/index.d.ts +210 -12
  2. package/design-core/index.d.ts +694 -17
  3. package/fesm2022/vectoriox-iox-ui-actions-core.mjs +4 -3
  4. package/fesm2022/vectoriox-iox-ui-actions-core.mjs.map +1 -1
  5. package/fesm2022/vectoriox-iox-ui-composite-core.mjs +535 -121
  6. package/fesm2022/vectoriox-iox-ui-composite-core.mjs.map +1 -1
  7. package/fesm2022/vectoriox-iox-ui-design-core.mjs +843 -45
  8. package/fesm2022/vectoriox-iox-ui-design-core.mjs.map +1 -1
  9. package/fesm2022/vectoriox-iox-ui-generation-core.mjs +801 -17
  10. package/fesm2022/vectoriox-iox-ui-generation-core.mjs.map +1 -1
  11. package/fesm2022/vectoriox-iox-ui.mjs +3945 -3914
  12. package/fesm2022/vectoriox-iox-ui.mjs.map +1 -1
  13. package/generation-core/index.d.ts +563 -4
  14. package/index.d.ts +22 -1
  15. package/package.json +1 -1
  16. package/src/actions-core/element-actions.ts +4 -3
  17. package/src/composite-core/accordion.ts +1 -0
  18. package/src/composite-core/composite-kinds.ts +42 -6
  19. package/src/composite-core/exclusive-runtime.ts +60 -10
  20. package/src/composite-core/exclusive.ts +64 -0
  21. package/src/composite-core/public-api.ts +5 -2
  22. package/src/composite-core/segmented.ts +349 -0
  23. package/src/composite-core/structure.ts +6 -1
  24. package/src/composite-core/tabs.ts +6 -3
  25. package/src/design-core/contrast-audit.ts +8 -3
  26. package/src/design-core/flavor-spec.generated.ts +832 -41
  27. package/src/generation-core/compose-site.ts +169 -12
  28. package/src/generation-core/node-baselines.generated.ts +49 -0
  29. package/src/generation-core/patterns.ts +20 -0
  30. package/src/generation-core/site-spec.generated.ts +595 -0
  31. package/styles/iox-design.css +19 -0
@@ -892,6 +892,512 @@ declare const SPEC_SITE_PATTERNS: {
892
892
  }];
893
893
  };
894
894
  };
895
+ readonly "pricing.tiers": {
896
+ readonly family: "pricing";
897
+ readonly label: "Pricing — plans with a monthly / yearly switch";
898
+ readonly node: {
899
+ readonly t: "Section";
900
+ readonly es: "section";
901
+ readonly c: readonly [{
902
+ readonly t: "Container";
903
+ readonly es: "box";
904
+ readonly lay: {
905
+ readonly display: "flex";
906
+ readonly flexDirection: "column";
907
+ readonly gap: "8px";
908
+ readonly alignItems: "center";
909
+ readonly textAlign: "center";
910
+ };
911
+ readonly c: readonly [{
912
+ readonly t: "Text";
913
+ readonly es: "eyebrow";
914
+ readonly slot: "eyebrow";
915
+ readonly ph: "copy";
916
+ readonly text: "Pricing";
917
+ }, {
918
+ readonly t: "Heading";
919
+ readonly es: "h2";
920
+ readonly level: "h2";
921
+ readonly slot: "title";
922
+ readonly ph: "copy";
923
+ readonly text: "Plans";
924
+ }];
925
+ }, {
926
+ readonly t: "Container";
927
+ readonly recipe: "segmented";
928
+ readonly name: "Billing period";
929
+ readonly lay: {
930
+ readonly alignSelf: "center";
931
+ };
932
+ readonly resp: {
933
+ readonly mobile: {
934
+ readonly position: "sticky";
935
+ readonly top: "calc(12px + env(safe-area-inset-top, 0px))";
936
+ readonly zIndex: "2";
937
+ };
938
+ };
939
+ }, {
940
+ readonly t: "Container";
941
+ readonly es: "box";
942
+ readonly layer: "Plans";
943
+ readonly lay: {
944
+ readonly display: "grid";
945
+ readonly gridTemplateColumns: "repeat(3, minmax(0, 1fr))";
946
+ readonly gap: "var(--iox-space-gap)";
947
+ readonly alignItems: "stretch";
948
+ };
949
+ readonly resp: {
950
+ readonly mobile: {
951
+ readonly gridTemplateColumns: "minmax(0, 1fr)";
952
+ };
953
+ };
954
+ readonly c: readonly [{
955
+ readonly t: "Container";
956
+ readonly recipe: "card";
957
+ readonly layout: "top";
958
+ readonly ph: "copy";
959
+ readonly parts: {
960
+ readonly media: false;
961
+ readonly eyebrow: false;
962
+ readonly badge: false;
963
+ readonly actions: false;
964
+ };
965
+ readonly words: {
966
+ readonly title: "First plan";
967
+ readonly text: "Who this plan is for, in one sentence.";
968
+ };
969
+ readonly c: readonly [{
970
+ readonly t: "Container";
971
+ readonly es: "box";
972
+ readonly layer: "Price · Monthly";
973
+ readonly shownWhen: "monthly";
974
+ readonly lay: {
975
+ readonly display: "flex";
976
+ readonly alignItems: "baseline";
977
+ readonly flexWrap: "wrap";
978
+ readonly gap: "6px";
979
+ };
980
+ readonly c: readonly [{
981
+ readonly t: "Text";
982
+ readonly es: "price";
983
+ readonly ph: "price";
984
+ readonly text: "Monthly price";
985
+ }, {
986
+ readonly t: "Text";
987
+ readonly es: "small";
988
+ readonly text: "per month";
989
+ }];
990
+ }, {
991
+ readonly t: "Container";
992
+ readonly es: "box";
993
+ readonly layer: "Price · Yearly";
994
+ readonly shownWhen: "yearly";
995
+ readonly lay: {
996
+ readonly display: "flex";
997
+ readonly alignItems: "baseline";
998
+ readonly flexWrap: "wrap";
999
+ readonly gap: "6px";
1000
+ };
1001
+ readonly c: readonly [{
1002
+ readonly t: "Text";
1003
+ readonly es: "price";
1004
+ readonly ph: "price";
1005
+ readonly text: "Yearly price";
1006
+ }, {
1007
+ readonly t: "Text";
1008
+ readonly es: "small";
1009
+ readonly text: "per year";
1010
+ }];
1011
+ }, {
1012
+ readonly t: "Container";
1013
+ readonly es: "box";
1014
+ readonly layer: "Includes";
1015
+ readonly lay: {
1016
+ readonly display: "flex";
1017
+ readonly flexDirection: "column";
1018
+ readonly gap: "8px";
1019
+ };
1020
+ readonly c: readonly [{
1021
+ readonly t: "Container";
1022
+ readonly es: "box";
1023
+ readonly lay: {
1024
+ readonly display: "flex";
1025
+ readonly flexWrap: "nowrap";
1026
+ readonly gap: "8px";
1027
+ readonly alignItems: "flex-start";
1028
+ };
1029
+ readonly c: readonly [{
1030
+ readonly t: "Icon";
1031
+ readonly es: "icon";
1032
+ readonly icon: "ph ph-check";
1033
+ }, {
1034
+ readonly t: "Text";
1035
+ readonly es: "body";
1036
+ readonly ph: "copy";
1037
+ readonly text: "What this plan includes";
1038
+ }];
1039
+ }, {
1040
+ readonly t: "Container";
1041
+ readonly es: "box";
1042
+ readonly lay: {
1043
+ readonly display: "flex";
1044
+ readonly flexWrap: "nowrap";
1045
+ readonly gap: "8px";
1046
+ readonly alignItems: "flex-start";
1047
+ };
1048
+ readonly c: readonly [{
1049
+ readonly t: "Icon";
1050
+ readonly es: "icon";
1051
+ readonly icon: "ph ph-check";
1052
+ }, {
1053
+ readonly t: "Text";
1054
+ readonly es: "body";
1055
+ readonly ph: "copy";
1056
+ readonly text: "What this plan includes";
1057
+ }];
1058
+ }, {
1059
+ readonly t: "Container";
1060
+ readonly es: "box";
1061
+ readonly lay: {
1062
+ readonly display: "flex";
1063
+ readonly flexWrap: "nowrap";
1064
+ readonly gap: "8px";
1065
+ readonly alignItems: "flex-start";
1066
+ };
1067
+ readonly c: readonly [{
1068
+ readonly t: "Icon";
1069
+ readonly es: "icon";
1070
+ readonly icon: "ph ph-check";
1071
+ }, {
1072
+ readonly t: "Text";
1073
+ readonly es: "body";
1074
+ readonly ph: "copy";
1075
+ readonly text: "What this plan includes";
1076
+ }];
1077
+ }];
1078
+ }, {
1079
+ readonly t: "Container";
1080
+ readonly es: "box";
1081
+ readonly role: "card.actions";
1082
+ readonly layer: "Buttons";
1083
+ readonly lay: {
1084
+ readonly display: "flex";
1085
+ readonly flexWrap: "wrap";
1086
+ readonly gap: "8px";
1087
+ readonly alignItems: "center";
1088
+ readonly width: "100%";
1089
+ readonly margin: "auto 0px 0px 0px";
1090
+ readonly padding: "6px 0px 0px 0px";
1091
+ };
1092
+ readonly c: readonly [{
1093
+ readonly t: "ButtonBlock";
1094
+ readonly es: "button-primary";
1095
+ readonly href: "/contact";
1096
+ readonly text: "Choose this plan";
1097
+ }];
1098
+ }];
1099
+ }, {
1100
+ readonly t: "Container";
1101
+ readonly recipe: "card";
1102
+ readonly layout: "top";
1103
+ readonly ph: "copy";
1104
+ readonly scheme: "accent";
1105
+ readonly badge: "neutral";
1106
+ readonly parts: {
1107
+ readonly media: false;
1108
+ readonly eyebrow: false;
1109
+ readonly badge: true;
1110
+ readonly actions: false;
1111
+ };
1112
+ readonly words: {
1113
+ readonly title: "Second plan";
1114
+ readonly text: "Who this plan is for, in one sentence.";
1115
+ readonly badge: "Most popular";
1116
+ };
1117
+ readonly c: readonly [{
1118
+ readonly t: "Container";
1119
+ readonly es: "box";
1120
+ readonly layer: "Price · Monthly";
1121
+ readonly shownWhen: "monthly";
1122
+ readonly lay: {
1123
+ readonly display: "flex";
1124
+ readonly alignItems: "baseline";
1125
+ readonly flexWrap: "wrap";
1126
+ readonly gap: "6px";
1127
+ };
1128
+ readonly c: readonly [{
1129
+ readonly t: "Text";
1130
+ readonly es: "price";
1131
+ readonly ph: "price";
1132
+ readonly text: "Monthly price";
1133
+ }, {
1134
+ readonly t: "Text";
1135
+ readonly es: "small";
1136
+ readonly text: "per month";
1137
+ }];
1138
+ }, {
1139
+ readonly t: "Container";
1140
+ readonly es: "box";
1141
+ readonly layer: "Price · Yearly";
1142
+ readonly shownWhen: "yearly";
1143
+ readonly lay: {
1144
+ readonly display: "flex";
1145
+ readonly alignItems: "baseline";
1146
+ readonly flexWrap: "wrap";
1147
+ readonly gap: "6px";
1148
+ };
1149
+ readonly c: readonly [{
1150
+ readonly t: "Text";
1151
+ readonly es: "price";
1152
+ readonly ph: "price";
1153
+ readonly text: "Yearly price";
1154
+ }, {
1155
+ readonly t: "Text";
1156
+ readonly es: "small";
1157
+ readonly text: "per year";
1158
+ }];
1159
+ }, {
1160
+ readonly t: "Container";
1161
+ readonly es: "box";
1162
+ readonly layer: "Includes";
1163
+ readonly lay: {
1164
+ readonly display: "flex";
1165
+ readonly flexDirection: "column";
1166
+ readonly gap: "8px";
1167
+ };
1168
+ readonly c: readonly [{
1169
+ readonly t: "Container";
1170
+ readonly es: "box";
1171
+ readonly lay: {
1172
+ readonly display: "flex";
1173
+ readonly flexWrap: "nowrap";
1174
+ readonly gap: "8px";
1175
+ readonly alignItems: "flex-start";
1176
+ };
1177
+ readonly c: readonly [{
1178
+ readonly t: "Icon";
1179
+ readonly es: "icon";
1180
+ readonly icon: "ph ph-check";
1181
+ }, {
1182
+ readonly t: "Text";
1183
+ readonly es: "body";
1184
+ readonly ph: "copy";
1185
+ readonly text: "What this plan includes";
1186
+ }];
1187
+ }, {
1188
+ readonly t: "Container";
1189
+ readonly es: "box";
1190
+ readonly lay: {
1191
+ readonly display: "flex";
1192
+ readonly flexWrap: "nowrap";
1193
+ readonly gap: "8px";
1194
+ readonly alignItems: "flex-start";
1195
+ };
1196
+ readonly c: readonly [{
1197
+ readonly t: "Icon";
1198
+ readonly es: "icon";
1199
+ readonly icon: "ph ph-check";
1200
+ }, {
1201
+ readonly t: "Text";
1202
+ readonly es: "body";
1203
+ readonly ph: "copy";
1204
+ readonly text: "What this plan includes";
1205
+ }];
1206
+ }, {
1207
+ readonly t: "Container";
1208
+ readonly es: "box";
1209
+ readonly lay: {
1210
+ readonly display: "flex";
1211
+ readonly flexWrap: "nowrap";
1212
+ readonly gap: "8px";
1213
+ readonly alignItems: "flex-start";
1214
+ };
1215
+ readonly c: readonly [{
1216
+ readonly t: "Icon";
1217
+ readonly es: "icon";
1218
+ readonly icon: "ph ph-check";
1219
+ }, {
1220
+ readonly t: "Text";
1221
+ readonly es: "body";
1222
+ readonly ph: "copy";
1223
+ readonly text: "What this plan includes";
1224
+ }];
1225
+ }];
1226
+ }, {
1227
+ readonly t: "Container";
1228
+ readonly es: "box";
1229
+ readonly role: "card.actions";
1230
+ readonly layer: "Buttons";
1231
+ readonly lay: {
1232
+ readonly display: "flex";
1233
+ readonly flexWrap: "wrap";
1234
+ readonly gap: "8px";
1235
+ readonly alignItems: "center";
1236
+ readonly width: "100%";
1237
+ readonly margin: "auto 0px 0px 0px";
1238
+ readonly padding: "6px 0px 0px 0px";
1239
+ };
1240
+ readonly c: readonly [{
1241
+ readonly t: "ButtonBlock";
1242
+ readonly es: "button-primary";
1243
+ readonly href: "/contact";
1244
+ readonly text: "Choose this plan";
1245
+ }];
1246
+ }];
1247
+ }, {
1248
+ readonly t: "Container";
1249
+ readonly recipe: "card";
1250
+ readonly layout: "top";
1251
+ readonly ph: "copy";
1252
+ readonly parts: {
1253
+ readonly media: false;
1254
+ readonly eyebrow: false;
1255
+ readonly badge: false;
1256
+ readonly actions: false;
1257
+ };
1258
+ readonly words: {
1259
+ readonly title: "Third plan";
1260
+ readonly text: "Who this plan is for, in one sentence.";
1261
+ };
1262
+ readonly c: readonly [{
1263
+ readonly t: "Container";
1264
+ readonly es: "box";
1265
+ readonly layer: "Price · Monthly";
1266
+ readonly shownWhen: "monthly";
1267
+ readonly lay: {
1268
+ readonly display: "flex";
1269
+ readonly alignItems: "baseline";
1270
+ readonly flexWrap: "wrap";
1271
+ readonly gap: "6px";
1272
+ };
1273
+ readonly c: readonly [{
1274
+ readonly t: "Text";
1275
+ readonly es: "price";
1276
+ readonly ph: "price";
1277
+ readonly text: "Monthly price";
1278
+ }, {
1279
+ readonly t: "Text";
1280
+ readonly es: "small";
1281
+ readonly text: "per month";
1282
+ }];
1283
+ }, {
1284
+ readonly t: "Container";
1285
+ readonly es: "box";
1286
+ readonly layer: "Price · Yearly";
1287
+ readonly shownWhen: "yearly";
1288
+ readonly lay: {
1289
+ readonly display: "flex";
1290
+ readonly alignItems: "baseline";
1291
+ readonly flexWrap: "wrap";
1292
+ readonly gap: "6px";
1293
+ };
1294
+ readonly c: readonly [{
1295
+ readonly t: "Text";
1296
+ readonly es: "price";
1297
+ readonly ph: "price";
1298
+ readonly text: "Yearly price";
1299
+ }, {
1300
+ readonly t: "Text";
1301
+ readonly es: "small";
1302
+ readonly text: "per year";
1303
+ }];
1304
+ }, {
1305
+ readonly t: "Container";
1306
+ readonly es: "box";
1307
+ readonly layer: "Includes";
1308
+ readonly lay: {
1309
+ readonly display: "flex";
1310
+ readonly flexDirection: "column";
1311
+ readonly gap: "8px";
1312
+ };
1313
+ readonly c: readonly [{
1314
+ readonly t: "Container";
1315
+ readonly es: "box";
1316
+ readonly lay: {
1317
+ readonly display: "flex";
1318
+ readonly flexWrap: "nowrap";
1319
+ readonly gap: "8px";
1320
+ readonly alignItems: "flex-start";
1321
+ };
1322
+ readonly c: readonly [{
1323
+ readonly t: "Icon";
1324
+ readonly es: "icon";
1325
+ readonly icon: "ph ph-check";
1326
+ }, {
1327
+ readonly t: "Text";
1328
+ readonly es: "body";
1329
+ readonly ph: "copy";
1330
+ readonly text: "What this plan includes";
1331
+ }];
1332
+ }, {
1333
+ readonly t: "Container";
1334
+ readonly es: "box";
1335
+ readonly lay: {
1336
+ readonly display: "flex";
1337
+ readonly flexWrap: "nowrap";
1338
+ readonly gap: "8px";
1339
+ readonly alignItems: "flex-start";
1340
+ };
1341
+ readonly c: readonly [{
1342
+ readonly t: "Icon";
1343
+ readonly es: "icon";
1344
+ readonly icon: "ph ph-check";
1345
+ }, {
1346
+ readonly t: "Text";
1347
+ readonly es: "body";
1348
+ readonly ph: "copy";
1349
+ readonly text: "What this plan includes";
1350
+ }];
1351
+ }, {
1352
+ readonly t: "Container";
1353
+ readonly es: "box";
1354
+ readonly lay: {
1355
+ readonly display: "flex";
1356
+ readonly flexWrap: "nowrap";
1357
+ readonly gap: "8px";
1358
+ readonly alignItems: "flex-start";
1359
+ };
1360
+ readonly c: readonly [{
1361
+ readonly t: "Icon";
1362
+ readonly es: "icon";
1363
+ readonly icon: "ph ph-check";
1364
+ }, {
1365
+ readonly t: "Text";
1366
+ readonly es: "body";
1367
+ readonly ph: "copy";
1368
+ readonly text: "What this plan includes";
1369
+ }];
1370
+ }];
1371
+ }, {
1372
+ readonly t: "Container";
1373
+ readonly es: "box";
1374
+ readonly role: "card.actions";
1375
+ readonly layer: "Buttons";
1376
+ readonly lay: {
1377
+ readonly display: "flex";
1378
+ readonly flexWrap: "wrap";
1379
+ readonly gap: "8px";
1380
+ readonly alignItems: "center";
1381
+ readonly width: "100%";
1382
+ readonly margin: "auto 0px 0px 0px";
1383
+ readonly padding: "6px 0px 0px 0px";
1384
+ };
1385
+ readonly c: readonly [{
1386
+ readonly t: "ButtonBlock";
1387
+ readonly es: "button-primary";
1388
+ readonly href: "/contact";
1389
+ readonly text: "Choose this plan";
1390
+ }];
1391
+ }];
1392
+ }];
1393
+ }];
1394
+ readonly lay: {
1395
+ readonly display: "flex";
1396
+ readonly flexDirection: "column";
1397
+ readonly gap: "32px";
1398
+ };
1399
+ };
1400
+ };
895
1401
  readonly "hero.full-bleed-media": {
896
1402
  readonly family: "hero";
897
1403
  readonly label: "Hero — words over a background video";
@@ -1395,6 +1901,12 @@ interface SitePlan {
1395
1901
  * `binds`, a binding path per part: `image`, `eyebrow`, `title`, `text`; `href` + `param` link the whole card
1396
1902
  * through its title). A header pattern's `phoneMenu` names its phone shape (drawer · bar · both), stamped by
1397
1903
  * `planNavShape` (CC1).
1904
+ *
1905
+ * CC4b (`pricing.tiers`): `recipe: 'segmented'` stamps a Segmented control (Monthly · Yearly, named by `name`, its own
1906
+ * `lay` / `resp`) · `shownWhen` hides a node at base and shows it while the pattern's segmented option of that key is
1907
+ * on (the targeted `trigger-on`) · `ph: 'price'` a price the studio types (a publish-blocking placeholder showing its
1908
+ * label) · on a card recipe: `words` (title / text / badge), `badge` (the badge's tone), `scheme` (the Brand card), and
1909
+ * `c` — nodes joining its Content column · `icon` an Icon's glyph · `layer` the node's name in the layer tree.
1398
1910
  */
1399
1911
  interface PatternNode {
1400
1912
  readonly t: string;
@@ -1433,6 +1945,16 @@ interface PatternNode {
1433
1945
  readonly opens?: string;
1434
1946
  /** CC3: a control's accessible name (`ariaLabel`). */
1435
1947
  readonly name?: string;
1948
+ /** CC4b: hidden at base, shown while the pattern's Segmented option with this key is on. */
1949
+ readonly shownWhen?: string;
1950
+ /** CC4b: a card recipe's words (its title, text, badge). */
1951
+ readonly words?: Readonly<Record<string, string>>;
1952
+ /** CC4b: a card recipe's badge tone (`neutral` · `success` · `warning` · `accent`). */
1953
+ readonly badge?: string;
1954
+ /** CC4b: an Icon's glyph (`ph ph-check`). */
1955
+ readonly icon?: string;
1956
+ /** CC4b: the node's name in the layer tree (`Price · Monthly`). */
1957
+ readonly layer?: string;
1436
1958
  }
1437
1959
  /** The composite-core recipes a pattern may stamp (`recipe`). */
1438
1960
  declare enum PatternRecipe {
@@ -1443,6 +1965,8 @@ declare enum PatternRecipe {
1443
1965
  /** CC4a: Tabs — Manual (three placeholder tabs), or From content when the section names a list `binding`: the tab
1444
1966
  * list and the panels are both Repeaters over it, one row giving its tab AND its panel. */
1445
1967
  Tabs = "tabs",
1968
+ /** CC4b: the Segmented control — Monthly · Yearly, named by the pattern (`name`). */
1969
+ Segmented = "segmented",
1446
1970
  /** CC3: the accessible carousel — a named Slider whose controls are parts, one quote per slide (placeholders). */
1447
1971
  Carousel = "carousel",
1448
1972
  /** CC3: the Lightbox — a Dialog holding a Slider over the node's `src` (the gallery's own source). */
@@ -1476,7 +2000,9 @@ declare enum PatternPlaceholder {
1476
2000
  Copy = "copy",
1477
2001
  Image = "image",
1478
2002
  /** CC3: a clip the studio uploads (a Video's file): the poster blank until then, publish-blocking. */
1479
- Video = "video"
2003
+ Video = "video",
2004
+ /** CC4b (Q37): a price the studio types — free text, publish-blocking, its label shown meanwhile, never a number. */
2005
+ Price = "price"
1480
2006
  }
1481
2007
  /** CC3: what an `opens` node opens. */
1482
2008
  declare enum PatternOpens {
@@ -1707,8 +2233,16 @@ declare enum PlaceholderKind {
1707
2233
  /** An image slot with no image: the empty-image placeholder (DS3). */
1708
2234
  Image = "image",
1709
2235
  /** CC3: a video slot with no clip — the studio uploads its own (the poster blank meanwhile). */
1710
- Video = "video"
2236
+ Video = "video",
2237
+ /** CC4b (Q37): a price — a FACT the customer could be held to. Free text the studio types ("₪ 1,200", "From $40",
2238
+ * "On request"); its label shows meanwhile ("Monthly price"), never a number. No currency model. */
2239
+ Price = "price"
1711
2240
  }
2241
+ /** The placeholders a page cannot be published with unfilled (W4's gate): a fact, a price, the studio's own video.
2242
+ * Copy and an empty image are the author's to rewrite, never blocking. */
2243
+ declare const PUBLISH_BLOCKING_PLACEHOLDERS: ReadonlySet<PlaceholderKind>;
2244
+ /** True when a placeholder of `kind` blocks publishing until the studio fills it. */
2245
+ declare function blocksPublish(kind: PlaceholderKind): boolean;
1712
2246
  interface ComposedPlaceholder {
1713
2247
  nodeId: string;
1714
2248
  /** The page key, or the global slot (`header` / `footer`), the node lives in. */
@@ -1840,6 +2374,31 @@ declare function siteNavPages(pages: ReadonlyArray<SitePageRef>): SitePageRef[];
1840
2374
  * no /contact page: an email to the business, else removed), and the pattern's phone shape. Pure.
1841
2375
  */
1842
2376
  declare function composeNavHeader(input: NavHeaderInput, options: NavHeaderOptions): ComposedNavHeader;
2377
+ /** The pricing section (CC4b, board 10): plans with a Monthly / Yearly switch — the library and the palette, never a
2378
+ * Studio page (Q35). */
2379
+ declare const PRICING_PATTERN = "pricing.tiers";
2380
+ /** What a section is composed from when there is no Site Plan: the studio's name, its pages (the routes a link may
2381
+ * reach) and its facts. */
2382
+ interface SectionInput {
2383
+ readonly business?: SiteBusiness;
2384
+ readonly pages?: ReadonlyArray<SitePageRef>;
2385
+ }
2386
+ interface SectionOptions {
2387
+ /** The section's id; its parts' ids derive from it (`<id>-0-1-…`), so a fresh id gives fresh parts. */
2388
+ readonly id: string;
2389
+ }
2390
+ interface ComposedSection {
2391
+ section: SerializedNode;
2392
+ placeholders: ComposedPlaceholder[];
2393
+ issues: ComposeIssue[];
2394
+ }
2395
+ /**
2396
+ * ONE library pattern composed on its own — the builder palette's ready-made sections (CC4b: "Pricing", the
2397
+ * `pricing.tiers` pattern). THE SAME pattern and composer as `composeSite`: its words, its placeholders (a price shows
2398
+ * its label, never a number) and the one dangling-link rule — except a button to a page the studio lacks keeps its
2399
+ * words, unlinked, for the author to link. Pure.
2400
+ */
2401
+ declare function composeSection(patternId: string, input: SectionInput, options: SectionOptions): ComposedSection;
1843
2402
 
1844
2403
  /**
1845
2404
  * The phone shapes of a navigation bar (complex-components plan CC1, §7a + R1; boards 1–3). ONE pure tree
@@ -1974,5 +2533,5 @@ declare function removeBarItem(globals: ReadonlyArray<SerializedNode>, itemId: s
1974
2533
  /** The bar's Items list drag-to-reorder (board 2): item `from` moves to `to`. Input not mutated. */
1975
2534
  declare function moveBarItem(globals: ReadonlyArray<SerializedNode>, from: number, to: number): BarItemsEditResult;
1976
2535
 
1977
- export { BAR_ITEMS_MAX, BAR_ITEMS_MIN, BASELINE_ROLES, BaselineRole, BindScope, CardBindTarget, ComposeError, ComposeIssueCode, DANGLING_LINK_CODES, DEFAULT_PHONE_MENU_BREAKPOINT, FACT_KEYS, GlobalSlot, NAV_PART_LABELS, NAV_SHAPE_COPY, NEUTRAL_STYLE_PROPS, NODE_BASELINES, NavPagesSource, NavRole, NavShape, NavShapeError, PatternDirective, PatternGlobalPosition, PatternOpens, PatternPlaceholder, PatternRecipe, PhoneMenuBreakpoint, PlaceholderKind, PlanDataSourceMode, PlanDataSourceType, RelativeOp, SAMPLE_IMAGE_REF, SITE_FACT_LABELS, SITE_HEADER_PATTERN, SITE_PATTERNS, SITE_PLAN_VERSION, SITE_TEMPLATES, SPEC_SITE_FACTS, SPEC_SITE_PATTERNS, SPEC_SITE_PLAN_SHAPE, SPEC_SITE_TEMPLATES, STUDIO_TEMPLATE, SitePlanError, SitePlanIssueCode, SitePlanSourceKind, SiteTemplateError, SiteTemplateId, addBarItem, altSourceScopes, assertStyleSlots, assertValidSitePlan, barIconForRoute, composeNavHeader, composeSite, createSerializedNode, findNavRoot, moveBarItem, navPages, navShapeBreakpoint, navShapeOf, nextSourceOf, nodeBindPaths, parseSampleImageRef, patternById, patternNeedsBinding, patternNodes, patternOptionalParts, patternScopes, patternSlots, patternTakesBinding, phoneMenuPages, planFromTemplate, planNavShape, releasedLayoutDefaults, removeBarItem, requiredShapeKeys, routeParams, sampleImageRef, setStyleProps, shapeKeys, siteNavPages, validateSitePlan, walkSerialized };
1978
- export type { AddBarItemResult, BarItemsEditResult, CmsDataSourcePlan, ComposeContext, ComposeIssue, ComposedDataSource, ComposedItem, ComposedNavHeader, ComposedPage, ComposedPlaceholder, ComposedRoute, ComposedSite, ContentFieldPlan, ContentSeedPlan, ContentTypePlan, CreateNodeOptions, DataSourcePlan, FactKey, NavHeaderInput, NavHeaderOptions, NavPage, NavShapeOptions, NavShapeResult, NodeBaseline, PagePlan, PageSectionPlan, PatternNode, RelativeDataSourcePlan, SerializedBinding, SerializedNode, SerializedResponsive, SiteBusiness, SitePageRef, SitePattern, SitePlan, SitePlanIssue, SitePlanSource, SitePlanValidation, SiteTemplate, TemplatePlanInput };
2536
+ export { BAR_ITEMS_MAX, BAR_ITEMS_MIN, BASELINE_ROLES, BaselineRole, BindScope, CardBindTarget, ComposeError, ComposeIssueCode, DANGLING_LINK_CODES, DEFAULT_PHONE_MENU_BREAKPOINT, FACT_KEYS, GlobalSlot, NAV_PART_LABELS, NAV_SHAPE_COPY, NEUTRAL_STYLE_PROPS, NODE_BASELINES, NavPagesSource, NavRole, NavShape, NavShapeError, PRICING_PATTERN, PUBLISH_BLOCKING_PLACEHOLDERS, PatternDirective, PatternGlobalPosition, PatternOpens, PatternPlaceholder, PatternRecipe, PhoneMenuBreakpoint, PlaceholderKind, PlanDataSourceMode, PlanDataSourceType, RelativeOp, SAMPLE_IMAGE_REF, SITE_FACT_LABELS, SITE_HEADER_PATTERN, SITE_PATTERNS, SITE_PLAN_VERSION, SITE_TEMPLATES, SPEC_SITE_FACTS, SPEC_SITE_PATTERNS, SPEC_SITE_PLAN_SHAPE, SPEC_SITE_TEMPLATES, STUDIO_TEMPLATE, SitePlanError, SitePlanIssueCode, SitePlanSourceKind, SiteTemplateError, SiteTemplateId, addBarItem, altSourceScopes, assertStyleSlots, assertValidSitePlan, barIconForRoute, blocksPublish, composeNavHeader, composeSection, composeSite, createSerializedNode, findNavRoot, moveBarItem, navPages, navShapeBreakpoint, navShapeOf, nextSourceOf, nodeBindPaths, parseSampleImageRef, patternById, patternNeedsBinding, patternNodes, patternOptionalParts, patternScopes, patternSlots, patternTakesBinding, phoneMenuPages, planFromTemplate, planNavShape, releasedLayoutDefaults, removeBarItem, requiredShapeKeys, routeParams, sampleImageRef, setStyleProps, shapeKeys, siteNavPages, validateSitePlan, walkSerialized };
2537
+ export type { AddBarItemResult, BarItemsEditResult, CmsDataSourcePlan, ComposeContext, ComposeIssue, ComposedDataSource, ComposedItem, ComposedNavHeader, ComposedPage, ComposedPlaceholder, ComposedRoute, ComposedSection, ComposedSite, ContentFieldPlan, ContentSeedPlan, ContentTypePlan, CreateNodeOptions, DataSourcePlan, FactKey, NavHeaderInput, NavHeaderOptions, NavPage, NavShapeOptions, NavShapeResult, NodeBaseline, PagePlan, PageSectionPlan, PatternNode, RelativeDataSourcePlan, SectionInput, SectionOptions, SerializedBinding, SerializedNode, SerializedResponsive, SiteBusiness, SitePageRef, SitePattern, SitePlan, SitePlanIssue, SitePlanSource, SitePlanValidation, SiteTemplate, TemplatePlanInput };