@vectoriox/iox-ui 5.39.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 (32) 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 +894 -21
  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 +625 -5
  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 +248 -12
  28. package/src/generation-core/nav-shape.ts +53 -3
  29. package/src/generation-core/node-baselines.generated.ts +49 -0
  30. package/src/generation-core/patterns.ts +20 -0
  31. package/src/generation-core/site-spec.generated.ts +595 -0
  32. package/styles/iox-design.css +19 -0
@@ -1025,6 +1025,601 @@ export const SPEC_SITE_PATTERNS = {
1025
1025
  ]
1026
1026
  }
1027
1027
  },
1028
+ "pricing.tiers": {
1029
+ "family": "pricing",
1030
+ "label": "Pricing — plans with a monthly / yearly switch",
1031
+ "node": {
1032
+ "t": "Section",
1033
+ "es": "section",
1034
+ "c": [
1035
+ {
1036
+ "t": "Container",
1037
+ "es": "box",
1038
+ "lay": {
1039
+ "display": "flex",
1040
+ "flexDirection": "column",
1041
+ "gap": "8px",
1042
+ "alignItems": "center",
1043
+ "textAlign": "center"
1044
+ },
1045
+ "c": [
1046
+ {
1047
+ "t": "Text",
1048
+ "es": "eyebrow",
1049
+ "slot": "eyebrow",
1050
+ "ph": "copy",
1051
+ "text": "Pricing"
1052
+ },
1053
+ {
1054
+ "t": "Heading",
1055
+ "es": "h2",
1056
+ "level": "h2",
1057
+ "slot": "title",
1058
+ "ph": "copy",
1059
+ "text": "Plans"
1060
+ }
1061
+ ]
1062
+ },
1063
+ {
1064
+ "t": "Container",
1065
+ "recipe": "segmented",
1066
+ "name": "Billing period",
1067
+ "lay": {
1068
+ "alignSelf": "center"
1069
+ },
1070
+ "resp": {
1071
+ "mobile": {
1072
+ "position": "sticky",
1073
+ "top": "calc(12px + env(safe-area-inset-top, 0px))",
1074
+ "zIndex": "2"
1075
+ }
1076
+ }
1077
+ },
1078
+ {
1079
+ "t": "Container",
1080
+ "es": "box",
1081
+ "layer": "Plans",
1082
+ "lay": {
1083
+ "display": "grid",
1084
+ "gridTemplateColumns": "repeat(3, minmax(0, 1fr))",
1085
+ "gap": "var(--iox-space-gap)",
1086
+ "alignItems": "stretch"
1087
+ },
1088
+ "resp": {
1089
+ "mobile": {
1090
+ "gridTemplateColumns": "minmax(0, 1fr)"
1091
+ }
1092
+ },
1093
+ "c": [
1094
+ {
1095
+ "t": "Container",
1096
+ "recipe": "card",
1097
+ "layout": "top",
1098
+ "ph": "copy",
1099
+ "parts": {
1100
+ "media": false,
1101
+ "eyebrow": false,
1102
+ "badge": false,
1103
+ "actions": false
1104
+ },
1105
+ "words": {
1106
+ "title": "First plan",
1107
+ "text": "Who this plan is for, in one sentence."
1108
+ },
1109
+ "c": [
1110
+ {
1111
+ "t": "Container",
1112
+ "es": "box",
1113
+ "layer": "Price · Monthly",
1114
+ "shownWhen": "monthly",
1115
+ "lay": {
1116
+ "display": "flex",
1117
+ "alignItems": "baseline",
1118
+ "flexWrap": "wrap",
1119
+ "gap": "6px"
1120
+ },
1121
+ "c": [
1122
+ {
1123
+ "t": "Text",
1124
+ "es": "price",
1125
+ "ph": "price",
1126
+ "text": "Monthly price"
1127
+ },
1128
+ {
1129
+ "t": "Text",
1130
+ "es": "small",
1131
+ "text": "per month"
1132
+ }
1133
+ ]
1134
+ },
1135
+ {
1136
+ "t": "Container",
1137
+ "es": "box",
1138
+ "layer": "Price · Yearly",
1139
+ "shownWhen": "yearly",
1140
+ "lay": {
1141
+ "display": "flex",
1142
+ "alignItems": "baseline",
1143
+ "flexWrap": "wrap",
1144
+ "gap": "6px"
1145
+ },
1146
+ "c": [
1147
+ {
1148
+ "t": "Text",
1149
+ "es": "price",
1150
+ "ph": "price",
1151
+ "text": "Yearly price"
1152
+ },
1153
+ {
1154
+ "t": "Text",
1155
+ "es": "small",
1156
+ "text": "per year"
1157
+ }
1158
+ ]
1159
+ },
1160
+ {
1161
+ "t": "Container",
1162
+ "es": "box",
1163
+ "layer": "Includes",
1164
+ "lay": {
1165
+ "display": "flex",
1166
+ "flexDirection": "column",
1167
+ "gap": "8px"
1168
+ },
1169
+ "c": [
1170
+ {
1171
+ "t": "Container",
1172
+ "es": "box",
1173
+ "lay": {
1174
+ "display": "flex",
1175
+ "flexWrap": "nowrap",
1176
+ "gap": "8px",
1177
+ "alignItems": "flex-start"
1178
+ },
1179
+ "c": [
1180
+ {
1181
+ "t": "Icon",
1182
+ "es": "icon",
1183
+ "icon": "ph ph-check"
1184
+ },
1185
+ {
1186
+ "t": "Text",
1187
+ "es": "body",
1188
+ "ph": "copy",
1189
+ "text": "What this plan includes"
1190
+ }
1191
+ ]
1192
+ },
1193
+ {
1194
+ "t": "Container",
1195
+ "es": "box",
1196
+ "lay": {
1197
+ "display": "flex",
1198
+ "flexWrap": "nowrap",
1199
+ "gap": "8px",
1200
+ "alignItems": "flex-start"
1201
+ },
1202
+ "c": [
1203
+ {
1204
+ "t": "Icon",
1205
+ "es": "icon",
1206
+ "icon": "ph ph-check"
1207
+ },
1208
+ {
1209
+ "t": "Text",
1210
+ "es": "body",
1211
+ "ph": "copy",
1212
+ "text": "What this plan includes"
1213
+ }
1214
+ ]
1215
+ },
1216
+ {
1217
+ "t": "Container",
1218
+ "es": "box",
1219
+ "lay": {
1220
+ "display": "flex",
1221
+ "flexWrap": "nowrap",
1222
+ "gap": "8px",
1223
+ "alignItems": "flex-start"
1224
+ },
1225
+ "c": [
1226
+ {
1227
+ "t": "Icon",
1228
+ "es": "icon",
1229
+ "icon": "ph ph-check"
1230
+ },
1231
+ {
1232
+ "t": "Text",
1233
+ "es": "body",
1234
+ "ph": "copy",
1235
+ "text": "What this plan includes"
1236
+ }
1237
+ ]
1238
+ }
1239
+ ]
1240
+ },
1241
+ {
1242
+ "t": "Container",
1243
+ "es": "box",
1244
+ "role": "card.actions",
1245
+ "layer": "Buttons",
1246
+ "lay": {
1247
+ "display": "flex",
1248
+ "flexWrap": "wrap",
1249
+ "gap": "8px",
1250
+ "alignItems": "center",
1251
+ "width": "100%",
1252
+ "margin": "auto 0px 0px 0px",
1253
+ "padding": "6px 0px 0px 0px"
1254
+ },
1255
+ "c": [
1256
+ {
1257
+ "t": "ButtonBlock",
1258
+ "es": "button-primary",
1259
+ "href": "/contact",
1260
+ "text": "Choose this plan"
1261
+ }
1262
+ ]
1263
+ }
1264
+ ]
1265
+ },
1266
+ {
1267
+ "t": "Container",
1268
+ "recipe": "card",
1269
+ "layout": "top",
1270
+ "ph": "copy",
1271
+ "scheme": "accent",
1272
+ "badge": "neutral",
1273
+ "parts": {
1274
+ "media": false,
1275
+ "eyebrow": false,
1276
+ "badge": true,
1277
+ "actions": false
1278
+ },
1279
+ "words": {
1280
+ "title": "Second plan",
1281
+ "text": "Who this plan is for, in one sentence.",
1282
+ "badge": "Most popular"
1283
+ },
1284
+ "c": [
1285
+ {
1286
+ "t": "Container",
1287
+ "es": "box",
1288
+ "layer": "Price · Monthly",
1289
+ "shownWhen": "monthly",
1290
+ "lay": {
1291
+ "display": "flex",
1292
+ "alignItems": "baseline",
1293
+ "flexWrap": "wrap",
1294
+ "gap": "6px"
1295
+ },
1296
+ "c": [
1297
+ {
1298
+ "t": "Text",
1299
+ "es": "price",
1300
+ "ph": "price",
1301
+ "text": "Monthly price"
1302
+ },
1303
+ {
1304
+ "t": "Text",
1305
+ "es": "small",
1306
+ "text": "per month"
1307
+ }
1308
+ ]
1309
+ },
1310
+ {
1311
+ "t": "Container",
1312
+ "es": "box",
1313
+ "layer": "Price · Yearly",
1314
+ "shownWhen": "yearly",
1315
+ "lay": {
1316
+ "display": "flex",
1317
+ "alignItems": "baseline",
1318
+ "flexWrap": "wrap",
1319
+ "gap": "6px"
1320
+ },
1321
+ "c": [
1322
+ {
1323
+ "t": "Text",
1324
+ "es": "price",
1325
+ "ph": "price",
1326
+ "text": "Yearly price"
1327
+ },
1328
+ {
1329
+ "t": "Text",
1330
+ "es": "small",
1331
+ "text": "per year"
1332
+ }
1333
+ ]
1334
+ },
1335
+ {
1336
+ "t": "Container",
1337
+ "es": "box",
1338
+ "layer": "Includes",
1339
+ "lay": {
1340
+ "display": "flex",
1341
+ "flexDirection": "column",
1342
+ "gap": "8px"
1343
+ },
1344
+ "c": [
1345
+ {
1346
+ "t": "Container",
1347
+ "es": "box",
1348
+ "lay": {
1349
+ "display": "flex",
1350
+ "flexWrap": "nowrap",
1351
+ "gap": "8px",
1352
+ "alignItems": "flex-start"
1353
+ },
1354
+ "c": [
1355
+ {
1356
+ "t": "Icon",
1357
+ "es": "icon",
1358
+ "icon": "ph ph-check"
1359
+ },
1360
+ {
1361
+ "t": "Text",
1362
+ "es": "body",
1363
+ "ph": "copy",
1364
+ "text": "What this plan includes"
1365
+ }
1366
+ ]
1367
+ },
1368
+ {
1369
+ "t": "Container",
1370
+ "es": "box",
1371
+ "lay": {
1372
+ "display": "flex",
1373
+ "flexWrap": "nowrap",
1374
+ "gap": "8px",
1375
+ "alignItems": "flex-start"
1376
+ },
1377
+ "c": [
1378
+ {
1379
+ "t": "Icon",
1380
+ "es": "icon",
1381
+ "icon": "ph ph-check"
1382
+ },
1383
+ {
1384
+ "t": "Text",
1385
+ "es": "body",
1386
+ "ph": "copy",
1387
+ "text": "What this plan includes"
1388
+ }
1389
+ ]
1390
+ },
1391
+ {
1392
+ "t": "Container",
1393
+ "es": "box",
1394
+ "lay": {
1395
+ "display": "flex",
1396
+ "flexWrap": "nowrap",
1397
+ "gap": "8px",
1398
+ "alignItems": "flex-start"
1399
+ },
1400
+ "c": [
1401
+ {
1402
+ "t": "Icon",
1403
+ "es": "icon",
1404
+ "icon": "ph ph-check"
1405
+ },
1406
+ {
1407
+ "t": "Text",
1408
+ "es": "body",
1409
+ "ph": "copy",
1410
+ "text": "What this plan includes"
1411
+ }
1412
+ ]
1413
+ }
1414
+ ]
1415
+ },
1416
+ {
1417
+ "t": "Container",
1418
+ "es": "box",
1419
+ "role": "card.actions",
1420
+ "layer": "Buttons",
1421
+ "lay": {
1422
+ "display": "flex",
1423
+ "flexWrap": "wrap",
1424
+ "gap": "8px",
1425
+ "alignItems": "center",
1426
+ "width": "100%",
1427
+ "margin": "auto 0px 0px 0px",
1428
+ "padding": "6px 0px 0px 0px"
1429
+ },
1430
+ "c": [
1431
+ {
1432
+ "t": "ButtonBlock",
1433
+ "es": "button-primary",
1434
+ "href": "/contact",
1435
+ "text": "Choose this plan"
1436
+ }
1437
+ ]
1438
+ }
1439
+ ]
1440
+ },
1441
+ {
1442
+ "t": "Container",
1443
+ "recipe": "card",
1444
+ "layout": "top",
1445
+ "ph": "copy",
1446
+ "parts": {
1447
+ "media": false,
1448
+ "eyebrow": false,
1449
+ "badge": false,
1450
+ "actions": false
1451
+ },
1452
+ "words": {
1453
+ "title": "Third plan",
1454
+ "text": "Who this plan is for, in one sentence."
1455
+ },
1456
+ "c": [
1457
+ {
1458
+ "t": "Container",
1459
+ "es": "box",
1460
+ "layer": "Price · Monthly",
1461
+ "shownWhen": "monthly",
1462
+ "lay": {
1463
+ "display": "flex",
1464
+ "alignItems": "baseline",
1465
+ "flexWrap": "wrap",
1466
+ "gap": "6px"
1467
+ },
1468
+ "c": [
1469
+ {
1470
+ "t": "Text",
1471
+ "es": "price",
1472
+ "ph": "price",
1473
+ "text": "Monthly price"
1474
+ },
1475
+ {
1476
+ "t": "Text",
1477
+ "es": "small",
1478
+ "text": "per month"
1479
+ }
1480
+ ]
1481
+ },
1482
+ {
1483
+ "t": "Container",
1484
+ "es": "box",
1485
+ "layer": "Price · Yearly",
1486
+ "shownWhen": "yearly",
1487
+ "lay": {
1488
+ "display": "flex",
1489
+ "alignItems": "baseline",
1490
+ "flexWrap": "wrap",
1491
+ "gap": "6px"
1492
+ },
1493
+ "c": [
1494
+ {
1495
+ "t": "Text",
1496
+ "es": "price",
1497
+ "ph": "price",
1498
+ "text": "Yearly price"
1499
+ },
1500
+ {
1501
+ "t": "Text",
1502
+ "es": "small",
1503
+ "text": "per year"
1504
+ }
1505
+ ]
1506
+ },
1507
+ {
1508
+ "t": "Container",
1509
+ "es": "box",
1510
+ "layer": "Includes",
1511
+ "lay": {
1512
+ "display": "flex",
1513
+ "flexDirection": "column",
1514
+ "gap": "8px"
1515
+ },
1516
+ "c": [
1517
+ {
1518
+ "t": "Container",
1519
+ "es": "box",
1520
+ "lay": {
1521
+ "display": "flex",
1522
+ "flexWrap": "nowrap",
1523
+ "gap": "8px",
1524
+ "alignItems": "flex-start"
1525
+ },
1526
+ "c": [
1527
+ {
1528
+ "t": "Icon",
1529
+ "es": "icon",
1530
+ "icon": "ph ph-check"
1531
+ },
1532
+ {
1533
+ "t": "Text",
1534
+ "es": "body",
1535
+ "ph": "copy",
1536
+ "text": "What this plan includes"
1537
+ }
1538
+ ]
1539
+ },
1540
+ {
1541
+ "t": "Container",
1542
+ "es": "box",
1543
+ "lay": {
1544
+ "display": "flex",
1545
+ "flexWrap": "nowrap",
1546
+ "gap": "8px",
1547
+ "alignItems": "flex-start"
1548
+ },
1549
+ "c": [
1550
+ {
1551
+ "t": "Icon",
1552
+ "es": "icon",
1553
+ "icon": "ph ph-check"
1554
+ },
1555
+ {
1556
+ "t": "Text",
1557
+ "es": "body",
1558
+ "ph": "copy",
1559
+ "text": "What this plan includes"
1560
+ }
1561
+ ]
1562
+ },
1563
+ {
1564
+ "t": "Container",
1565
+ "es": "box",
1566
+ "lay": {
1567
+ "display": "flex",
1568
+ "flexWrap": "nowrap",
1569
+ "gap": "8px",
1570
+ "alignItems": "flex-start"
1571
+ },
1572
+ "c": [
1573
+ {
1574
+ "t": "Icon",
1575
+ "es": "icon",
1576
+ "icon": "ph ph-check"
1577
+ },
1578
+ {
1579
+ "t": "Text",
1580
+ "es": "body",
1581
+ "ph": "copy",
1582
+ "text": "What this plan includes"
1583
+ }
1584
+ ]
1585
+ }
1586
+ ]
1587
+ },
1588
+ {
1589
+ "t": "Container",
1590
+ "es": "box",
1591
+ "role": "card.actions",
1592
+ "layer": "Buttons",
1593
+ "lay": {
1594
+ "display": "flex",
1595
+ "flexWrap": "wrap",
1596
+ "gap": "8px",
1597
+ "alignItems": "center",
1598
+ "width": "100%",
1599
+ "margin": "auto 0px 0px 0px",
1600
+ "padding": "6px 0px 0px 0px"
1601
+ },
1602
+ "c": [
1603
+ {
1604
+ "t": "ButtonBlock",
1605
+ "es": "button-primary",
1606
+ "href": "/contact",
1607
+ "text": "Choose this plan"
1608
+ }
1609
+ ]
1610
+ }
1611
+ ]
1612
+ }
1613
+ ]
1614
+ }
1615
+ ],
1616
+ "lay": {
1617
+ "display": "flex",
1618
+ "flexDirection": "column",
1619
+ "gap": "32px"
1620
+ }
1621
+ }
1622
+ },
1028
1623
  "hero.full-bleed-media": {
1029
1624
  "family": "hero",
1030
1625
  "label": "Hero — words over a background video",
@@ -254,6 +254,25 @@ dialog[data-iox-dialog]:not([open]) {
254
254
  /* A panel is a Tab stop of its own (APG): its focus ring is the look's. */
255
255
  .iox-role-tabs-panel:focus-visible { outline: none; box-shadow: var(--iox-focus-ring); }
256
256
 
257
+ /* ── CC4b: the Segmented control (complex-components board 10; composite T32) ──────────────────────────
258
+ The renderers write ONE markup (composite-core segmented.ts): the root is role=radiogroup, each option a <button
259
+ role=radio aria-checked>. Structural only — the look is the parts' element styles (segmented, segmented-option). */
260
+
261
+ /* An option is a real button: its UA look is reset at zero specificity, so the node's own rule (the style) wins. Its
262
+ words keep to one line (board 10: a 5th option does not fit a phone row — the Options list refuses it). */
263
+ :where(.iox-role-segmented-option) {
264
+ appearance: none; -webkit-appearance: none; background: none; border: 0 solid transparent; margin: 0;
265
+ font: inherit; color: inherit; cursor: pointer; box-sizing: border-box; white-space: nowrap;
266
+ }
267
+ :where(.iox-role-segmented-option):focus-visible { outline: none; }
268
+ /* Q39 (WCAG 2.4.11): on a phone the pricing pattern keeps the control sticky at the top of its section; a focused card
269
+ must never scroll in under it. */
270
+ @media (max-width: 767px) {
271
+ html:has(.iox-role-segmented) {
272
+ scroll-padding-top: calc(env(safe-area-inset-top, 0px) + 28px + var(--iox-segmented-option-min-height, 44px) + 2 * var(--iox-segmented-pad, 4px));
273
+ }
274
+ }
275
+
257
276
  /* ── CC3: Video (complex-components plan §7b, board 5) ────────────────────────────────────────────────
258
277
  One markup from media-core `videoInnerHtml` (both engine paths, the canvas). The frame is the node (it wears
259
278
  `media`: radius, fit); the poster, the play button, the provider badge and the consent prompt are drawn by the