@kubuild/components 0.7.0 → 0.8.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 (53) hide show
  1. package/dist/blocks/index.cjs +601 -12
  2. package/dist/blocks/index.cjs.map +1 -1
  3. package/dist/blocks/index.d.ts +2 -1
  4. package/dist/blocks/index.d.ts.map +1 -1
  5. package/dist/blocks/index.js +3 -1
  6. package/dist/blocks/sales.d.ts +7 -0
  7. package/dist/blocks/sales.d.ts.map +1 -0
  8. package/dist/canonical-props.d.ts +8 -0
  9. package/dist/canonical-props.d.ts.map +1 -0
  10. package/dist/{chunk-3HU2KE2B.js → chunk-CJN5OHHX.js} +596 -9
  11. package/dist/chunk-CJN5OHHX.js.map +1 -0
  12. package/dist/{chunk-JTQ35OQQ.js → chunk-DIZKTXJI.js} +601 -13
  13. package/dist/chunk-DIZKTXJI.js.map +1 -0
  14. package/dist/definitions/constants.d.ts.map +1 -1
  15. package/dist/definitions/conversion/accordion.d.ts +8 -0
  16. package/dist/definitions/conversion/accordion.d.ts.map +1 -0
  17. package/dist/definitions/conversion/carousel.d.ts +7 -0
  18. package/dist/definitions/conversion/carousel.d.ts.map +1 -0
  19. package/dist/definitions/conversion/countdown.d.ts +19 -0
  20. package/dist/definitions/conversion/countdown.d.ts.map +1 -0
  21. package/dist/definitions/conversion/divider.d.ts +9 -0
  22. package/dist/definitions/conversion/divider.d.ts.map +1 -0
  23. package/dist/definitions/conversion/index.d.ts +7 -0
  24. package/dist/definitions/conversion/index.d.ts.map +1 -0
  25. package/dist/definitions/conversion/rating.d.ts +7 -0
  26. package/dist/definitions/conversion/rating.d.ts.map +1 -0
  27. package/dist/definitions/conversion/tabs.d.ts +9 -0
  28. package/dist/definitions/conversion/tabs.d.ts.map +1 -0
  29. package/dist/definitions/form/button.d.ts.map +1 -1
  30. package/dist/definitions/index.cjs +746 -147
  31. package/dist/definitions/index.cjs.map +1 -1
  32. package/dist/definitions/index.d.ts +1 -0
  33. package/dist/definitions/index.d.ts.map +1 -1
  34. package/dist/definitions/index.js +27 -1
  35. package/dist/definitions/types.d.ts +4 -1
  36. package/dist/definitions/types.d.ts.map +1 -1
  37. package/dist/definitions/typography/badge.d.ts.map +1 -1
  38. package/dist/definitions/typography/blockquote.d.ts.map +1 -1
  39. package/dist/definitions/typography/heading.d.ts.map +1 -1
  40. package/dist/definitions/typography/link.d.ts.map +1 -1
  41. package/dist/definitions/typography/paragraph.d.ts.map +1 -1
  42. package/dist/definitions/typography/text.d.ts.map +1 -1
  43. package/dist/index.cjs +1417 -227
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +32 -2
  48. package/dist/index.js.map +1 -1
  49. package/dist/registry.d.ts +12 -0
  50. package/dist/registry.d.ts.map +1 -1
  51. package/package.json +3 -3
  52. package/dist/chunk-3HU2KE2B.js.map +0 -1
  53. package/dist/chunk-JTQ35OQQ.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -21,15 +21,22 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
23
  CONTENT_CHILD_TYPES: () => CONTENT_CHILD_TYPES,
24
+ COUNTDOWN_EXPIRE_BEHAVIORS: () => COUNTDOWN_EXPIRE_BEHAVIORS,
25
+ COUNTDOWN_FORMATS: () => COUNTDOWN_FORMATS,
26
+ COUNTDOWN_MODES: () => COUNTDOWN_MODES,
27
+ COUNTDOWN_STORAGE_TYPES: () => COUNTDOWN_STORAGE_TYPES,
24
28
  ComponentRegistry: () => ComponentRegistry,
25
29
  FORM_STARTER_BLOCKS: () => FORM_STARTER_BLOCKS,
26
30
  LAYOUT_PARENTS: () => LAYOUT_PARENTS,
27
31
  LAYOUT_STARTER_BLOCKS: () => LAYOUT_STARTER_BLOCKS,
32
+ SALES_STARTER_BLOCKS: () => SALES_STARTER_BLOCKS,
28
33
  STARTER_BLOCKS: () => STARTER_BLOCKS,
29
34
  TRAIT_GROUP_LABELS: () => TRAIT_GROUP_LABELS,
30
35
  TRAIT_GROUP_ORDER: () => TRAIT_GROUP_ORDER,
31
36
  UI_STARTER_BLOCKS: () => UI_STARTER_BLOCKS,
32
37
  acceptTrait: () => acceptTrait,
38
+ accordionDefinition: () => accordionDefinition,
39
+ accordionItemDefinition: () => accordionItemDefinition,
33
40
  actionTrait: () => actionTrait,
34
41
  altTrait: () => altTrait,
35
42
  ariaLabelTrait: () => ariaLabelTrait,
@@ -42,6 +49,8 @@ __export(src_exports, {
42
49
  buttonDefinition: () => buttonDefinition,
43
50
  buttonSubmitDefinition: () => buttonSubmitDefinition,
44
51
  buttonTypeTrait: () => buttonTypeTrait,
52
+ canonicalTextPropFields: () => canonicalTextPropFields,
53
+ carouselDefinition: () => carouselDefinition,
45
54
  checkboxDefinition: () => checkboxDefinition,
46
55
  citeTrait: () => citeTrait,
47
56
  codeBlockDefinition: () => codeBlockDefinition,
@@ -53,12 +62,14 @@ __export(src_exports, {
53
62
  containerDefinition: () => containerDefinition,
54
63
  controlsTrait: () => controlsTrait,
55
64
  coreComponentDefinitions: () => coreComponentDefinitions,
65
+ countdownDefinition: () => countdownDefinition,
56
66
  createDefaultComponentRegistry: () => createDefaultComponentRegistry,
57
67
  defaultCheckedTrait: () => defaultCheckedTrait,
58
68
  defaultGenId: () => defaultGenId,
59
69
  defaultSelectedTrait: () => defaultSelectedTrait,
60
70
  defaultValueTrait: () => defaultValueTrait,
61
71
  disabledTrait: () => disabledTrait,
72
+ dividerDefinition: () => dividerDefinition,
62
73
  drawerDefinition: () => drawerDefinition,
63
74
  extractComponentRequirements: () => extractComponentRequirements,
64
75
  fieldNameTrait: () => fieldNameTrait,
@@ -105,6 +116,7 @@ __export(src_exports, {
105
116
  radioDefinition: () => radioDefinition,
106
117
  radioGroupDefinition: () => radioGroupDefinition,
107
118
  radioItemDefinition: () => radioItemDefinition,
119
+ ratingDefinition: () => ratingDefinition,
108
120
  readOnlyTrait: () => readOnlyTrait,
109
121
  relTrait: () => relTrait,
110
122
  requiredTrait: () => requiredTrait,
@@ -118,13 +130,16 @@ __export(src_exports, {
118
130
  showPreviewTrait: () => showPreviewTrait,
119
131
  showSpinnerTrait: () => showSpinnerTrait,
120
132
  sortTraits: () => sortTraits,
133
+ spacerDefinition: () => spacerDefinition,
121
134
  srcTrait: () => srcTrait,
122
135
  suffixIconTrait: () => suffixIconTrait,
123
136
  switchDefinition: () => switchDefinition,
124
137
  switchSizeTrait: () => switchSizeTrait,
138
+ tabPanelDefinition: () => tabPanelDefinition,
125
139
  tableCellDefinition: () => tableCellDefinition,
126
140
  tableDefinition: () => tableDefinition,
127
141
  tableRowDefinition: () => tableRowDefinition,
142
+ tabsDefinition: () => tabsDefinition,
128
143
  tagTrait: () => tagTrait,
129
144
  targetTrait: () => targetTrait,
130
145
  textDefinition: () => textDefinition,
@@ -1074,7 +1089,20 @@ function autoDisableOnSubmitTrait(overrides) {
1074
1089
  }
1075
1090
 
1076
1091
  // src/definitions/constants.ts
1077
- var LAYOUT_PARENTS = ["page", "section", "container", "columns", "flex", "grid", "modal", "drawer", "collapsible"];
1092
+ var LAYOUT_PARENTS = [
1093
+ "page",
1094
+ "section",
1095
+ "container",
1096
+ "columns",
1097
+ "flex",
1098
+ "grid",
1099
+ "modal",
1100
+ "drawer",
1101
+ "collapsible",
1102
+ "accordion-item",
1103
+ "tab-panel",
1104
+ "carousel"
1105
+ ];
1078
1106
  var CONTENT_CHILD_TYPES = [
1079
1107
  "heading",
1080
1108
  "text",
@@ -1105,7 +1133,14 @@ var CONTENT_CHILD_TYPES = [
1105
1133
  "custom",
1106
1134
  "modal",
1107
1135
  "drawer",
1108
- "collapsible"
1136
+ "collapsible",
1137
+ "countdown",
1138
+ "accordion",
1139
+ "tabs",
1140
+ "carousel",
1141
+ "rating",
1142
+ "divider",
1143
+ "spacer"
1109
1144
  ];
1110
1145
 
1111
1146
  // src/definitions/layout/page.ts
@@ -1274,13 +1309,27 @@ var gridDefinition = {
1274
1309
  };
1275
1310
 
1276
1311
  // src/definitions/typography/heading.ts
1312
+ var import_schema2 = require("@kubuild/schema");
1313
+
1314
+ // src/canonical-props.ts
1277
1315
  var import_schema = require("@kubuild/schema");
1316
+ function canonicalTextPropFields(componentType) {
1317
+ const rule = (0, import_schema.getCanonicalTextPropRule)(componentType);
1318
+ if (!rule) return {};
1319
+ return {
1320
+ canonicalTextProp: rule.canonical,
1321
+ deprecatedPropAliases: Object.fromEntries(rule.aliases.map((alias) => [alias, rule.canonical]))
1322
+ };
1323
+ }
1324
+
1325
+ // src/definitions/typography/heading.ts
1278
1326
  var headingDefinition = {
1279
1327
  type: "heading",
1280
1328
  label: "Heading",
1281
1329
  category: "typography",
1282
1330
  icon: "heading",
1283
1331
  acceptsChildren: false,
1332
+ ...canonicalTextPropFields("heading"),
1284
1333
  defaultProps: { text: "Heading Text", level: 2 },
1285
1334
  propFields: [
1286
1335
  { name: "text", label: "Text", type: "string", defaultValue: "Heading Text" },
@@ -1306,7 +1355,8 @@ var headingDefinition = {
1306
1355
  ],
1307
1356
  validateProps: (props) => {
1308
1357
  const errors = [];
1309
- if (!(0, import_schema.isVariableBinding)(props.text) && (typeof props.text !== "string" || props.text.trim().length === 0)) {
1358
+ const text = props.text ?? props.content;
1359
+ if (!(0, import_schema2.isVariableBinding)(text) && (typeof text !== "string" || text.trim().length === 0)) {
1310
1360
  errors.push('Heading requires a non-empty "text".');
1311
1361
  }
1312
1362
  if (props.level !== void 0 && (typeof props.level !== "number" || props.level < 1 || props.level > 6)) {
@@ -1325,16 +1375,18 @@ var headingDefinition = {
1325
1375
  };
1326
1376
 
1327
1377
  // src/definitions/typography/text.ts
1328
- var import_schema2 = require("@kubuild/schema");
1378
+ var import_schema3 = require("@kubuild/schema");
1329
1379
  var textDefinition = {
1330
1380
  type: "text",
1331
1381
  label: "Text",
1332
1382
  category: "typography",
1333
1383
  icon: "type",
1334
1384
  acceptsChildren: false,
1335
- defaultProps: { content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit." },
1385
+ ...canonicalTextPropFields("text"),
1386
+ // `as: 'p'` keeps the block-level rendering the old `content` default produced (STORA-550).
1387
+ defaultProps: { text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", as: "p" },
1336
1388
  propFields: [
1337
- { name: "content", label: "Content", type: "string", defaultValue: "Lorem ipsum dolor sit amet." }
1389
+ { name: "text", label: "Content", type: "string", defaultValue: "Lorem ipsum dolor sit amet." }
1338
1390
  ],
1339
1391
  traits: [
1340
1392
  idTrait(),
@@ -1342,8 +1394,9 @@ var textDefinition = {
1342
1394
  ariaLabelTrait()
1343
1395
  ],
1344
1396
  validateProps: (props) => {
1345
- if (!(0, import_schema2.isVariableBinding)(props.content) && (typeof props.content !== "string" || props.content.trim().length === 0)) {
1346
- return ['Text requires a non-empty "content".'];
1397
+ const value = props.text ?? props.content;
1398
+ if (!(0, import_schema3.isVariableBinding)(value) && (typeof value !== "string" || value.trim().length === 0)) {
1399
+ return ['Text requires a non-empty "text".'];
1347
1400
  }
1348
1401
  return true;
1349
1402
  },
@@ -1357,13 +1410,14 @@ var textDefinition = {
1357
1410
  };
1358
1411
 
1359
1412
  // src/definitions/typography/paragraph.ts
1360
- var import_schema3 = require("@kubuild/schema");
1413
+ var import_schema4 = require("@kubuild/schema");
1361
1414
  var paragraphDefinition = {
1362
1415
  type: "paragraph",
1363
1416
  label: "Paragraph",
1364
1417
  category: "typography",
1365
1418
  icon: "paragraph",
1366
1419
  acceptsChildren: false,
1420
+ ...canonicalTextPropFields("paragraph"),
1367
1421
  defaultProps: {
1368
1422
  text: "A paragraph of text with clean semantic typography."
1369
1423
  },
@@ -1383,7 +1437,7 @@ var paragraphDefinition = {
1383
1437
  validateProps: (props) => {
1384
1438
  const errors = [];
1385
1439
  const textVal = props.text ?? props.content;
1386
- if (textVal !== void 0 && !(0, import_schema3.isVariableBinding)(textVal) && (typeof textVal !== "string" || textVal.trim().length === 0)) {
1440
+ if (textVal !== void 0 && !(0, import_schema4.isVariableBinding)(textVal) && (typeof textVal !== "string" || textVal.trim().length === 0)) {
1387
1441
  errors.push('Paragraph requires a non-empty "text".');
1388
1442
  }
1389
1443
  return errors.length > 0 ? errors : true;
@@ -1399,13 +1453,14 @@ var paragraphDefinition = {
1399
1453
  };
1400
1454
 
1401
1455
  // src/definitions/typography/link.ts
1402
- var import_schema4 = require("@kubuild/schema");
1456
+ var import_schema5 = require("@kubuild/schema");
1403
1457
  var linkDefinition = {
1404
1458
  type: "link",
1405
1459
  label: "Link",
1406
1460
  category: "typography",
1407
1461
  icon: "link",
1408
1462
  acceptsChildren: false,
1463
+ ...canonicalTextPropFields("link"),
1409
1464
  defaultProps: {
1410
1465
  text: "Click here",
1411
1466
  href: "#",
@@ -1439,19 +1494,19 @@ var linkDefinition = {
1439
1494
  ],
1440
1495
  validateProps: (props) => {
1441
1496
  const errors = [];
1442
- if (props.text !== void 0 && !(0, import_schema4.isVariableBinding)(props.text) && (typeof props.text !== "string" || props.text.trim().length === 0)) {
1497
+ if (props.text !== void 0 && !(0, import_schema5.isVariableBinding)(props.text) && (typeof props.text !== "string" || props.text.trim().length === 0)) {
1443
1498
  errors.push('Link requires a non-empty "text".');
1444
1499
  }
1445
- if (props.href !== void 0 && typeof props.href !== "string" && !(0, import_schema4.isVariableBinding)(props.href)) {
1500
+ if (props.href !== void 0 && typeof props.href !== "string" && !(0, import_schema5.isVariableBinding)(props.href)) {
1446
1501
  errors.push('Link "href" must be a string when provided.');
1447
1502
  }
1448
- if (props.target !== void 0 && !(0, import_schema4.isVariableBinding)(props.target)) {
1503
+ if (props.target !== void 0 && !(0, import_schema5.isVariableBinding)(props.target)) {
1449
1504
  const allowedTargets = ["_self", "_blank", "_parent", "_top"];
1450
1505
  if (typeof props.target !== "string" || !allowedTargets.includes(props.target)) {
1451
1506
  errors.push(`Link "target" must be one of: ${allowedTargets.join(", ")}.`);
1452
1507
  }
1453
1508
  }
1454
- if (props.rel !== void 0 && typeof props.rel !== "string" && !(0, import_schema4.isVariableBinding)(props.rel)) {
1509
+ if (props.rel !== void 0 && typeof props.rel !== "string" && !(0, import_schema5.isVariableBinding)(props.rel)) {
1455
1510
  errors.push('Link "rel" must be a string when provided.');
1456
1511
  }
1457
1512
  return errors.length > 0 ? errors : true;
@@ -1466,7 +1521,7 @@ var linkDefinition = {
1466
1521
  };
1467
1522
 
1468
1523
  // src/definitions/typography/blockquote.ts
1469
- var import_schema5 = require("@kubuild/schema");
1524
+ var import_schema6 = require("@kubuild/schema");
1470
1525
  var blockquoteDefinition = {
1471
1526
  type: "blockquote",
1472
1527
  label: "Blockquote",
@@ -1486,6 +1541,7 @@ var blockquoteDefinition = {
1486
1541
  "html-embed",
1487
1542
  "custom"
1488
1543
  ],
1544
+ ...canonicalTextPropFields("blockquote"),
1489
1545
  defaultProps: {
1490
1546
  text: "\u201CSimplicity is the soul of efficiency.\u201D"
1491
1547
  },
@@ -1506,10 +1562,10 @@ var blockquoteDefinition = {
1506
1562
  ],
1507
1563
  validateProps: (props) => {
1508
1564
  const errors = [];
1509
- if (props.text !== void 0 && typeof props.text !== "string" && !(0, import_schema5.isVariableBinding)(props.text)) {
1565
+ if (props.text !== void 0 && typeof props.text !== "string" && !(0, import_schema6.isVariableBinding)(props.text)) {
1510
1566
  errors.push('Blockquote "text" must be a string when provided.');
1511
1567
  }
1512
- if (props.cite !== void 0 && typeof props.cite !== "string" && !(0, import_schema5.isVariableBinding)(props.cite)) {
1568
+ if (props.cite !== void 0 && typeof props.cite !== "string" && !(0, import_schema6.isVariableBinding)(props.cite)) {
1513
1569
  errors.push('Blockquote "cite" must be a string when provided.');
1514
1570
  }
1515
1571
  return errors.length > 0 ? errors : true;
@@ -1532,13 +1588,14 @@ var blockquoteDefinition = {
1532
1588
  };
1533
1589
 
1534
1590
  // src/definitions/typography/badge.ts
1535
- var import_schema6 = require("@kubuild/schema");
1591
+ var import_schema7 = require("@kubuild/schema");
1536
1592
  var badgeDefinition = {
1537
1593
  type: "badge",
1538
1594
  label: "Badge",
1539
1595
  category: "typography",
1540
1596
  icon: "badge",
1541
1597
  acceptsChildren: false,
1598
+ ...canonicalTextPropFields("badge"),
1542
1599
  defaultProps: {
1543
1600
  text: "Badge",
1544
1601
  variant: "default"
@@ -1566,10 +1623,10 @@ var badgeDefinition = {
1566
1623
  ],
1567
1624
  validateProps: (props) => {
1568
1625
  const errors = [];
1569
- if (props.text !== void 0 && !(0, import_schema6.isVariableBinding)(props.text) && (typeof props.text !== "string" || props.text.trim().length === 0)) {
1626
+ if (props.text !== void 0 && !(0, import_schema7.isVariableBinding)(props.text) && (typeof props.text !== "string" || props.text.trim().length === 0)) {
1570
1627
  errors.push('Badge requires a non-empty "text".');
1571
1628
  }
1572
- if (props.variant !== void 0 && typeof props.variant !== "string" && !(0, import_schema6.isVariableBinding)(props.variant)) {
1629
+ if (props.variant !== void 0 && typeof props.variant !== "string" && !(0, import_schema7.isVariableBinding)(props.variant)) {
1573
1630
  errors.push('Badge "variant" must be a string.');
1574
1631
  }
1575
1632
  return errors.length > 0 ? errors : true;
@@ -1593,7 +1650,7 @@ var badgeDefinition = {
1593
1650
  };
1594
1651
 
1595
1652
  // src/definitions/typography/code-block.ts
1596
- var import_schema7 = require("@kubuild/schema");
1653
+ var import_schema8 = require("@kubuild/schema");
1597
1654
  var codeBlockDefinition = {
1598
1655
  type: "code-block",
1599
1656
  label: "Code Block",
@@ -1625,10 +1682,10 @@ var codeBlockDefinition = {
1625
1682
  ],
1626
1683
  validateProps: (props) => {
1627
1684
  const errors = [];
1628
- if (props.code !== void 0 && typeof props.code !== "string" && !(0, import_schema7.isVariableBinding)(props.code)) {
1685
+ if (props.code !== void 0 && typeof props.code !== "string" && !(0, import_schema8.isVariableBinding)(props.code)) {
1629
1686
  errors.push('Code Block "code" must be a string when provided.');
1630
1687
  }
1631
- if (props.language !== void 0 && typeof props.language !== "string" && !(0, import_schema7.isVariableBinding)(props.language)) {
1688
+ if (props.language !== void 0 && typeof props.language !== "string" && !(0, import_schema8.isVariableBinding)(props.language)) {
1632
1689
  errors.push('Code Block "language" must be a string when provided.');
1633
1690
  }
1634
1691
  return errors.length > 0 ? errors : true;
@@ -1650,7 +1707,7 @@ var codeBlockDefinition = {
1650
1707
  };
1651
1708
 
1652
1709
  // src/definitions/media/image.ts
1653
- var import_schema8 = require("@kubuild/schema");
1710
+ var import_schema9 = require("@kubuild/schema");
1654
1711
  var imageDefinition = {
1655
1712
  type: "image",
1656
1713
  label: "Image",
@@ -1680,12 +1737,12 @@ var imageDefinition = {
1680
1737
  ],
1681
1738
  validateProps: (props) => {
1682
1739
  const errors = [];
1683
- const hasSrc = typeof props.src === "string" && props.src.trim().length > 0 || (0, import_schema8.isVariableBinding)(props.src);
1684
- const hasAsset = (0, import_schema8.isAssetReference)(props.asset);
1740
+ const hasSrc = typeof props.src === "string" && props.src.trim().length > 0 || (0, import_schema9.isVariableBinding)(props.src);
1741
+ const hasAsset = (0, import_schema9.isAssetReference)(props.asset);
1685
1742
  if (!hasSrc && !hasAsset) {
1686
1743
  errors.push('Image requires either a non-empty "src" URL or a valid "asset" reference.');
1687
1744
  }
1688
- const hasAlt = typeof props.alt === "string" && props.alt.trim().length > 0 || (0, import_schema8.isVariableBinding)(props.alt);
1745
+ const hasAlt = typeof props.alt === "string" && props.alt.trim().length > 0 || (0, import_schema9.isVariableBinding)(props.alt);
1689
1746
  if (!hasAlt) {
1690
1747
  errors.push('Image requires non-empty "alt" text.');
1691
1748
  }
@@ -1701,7 +1758,7 @@ var imageDefinition = {
1701
1758
  };
1702
1759
 
1703
1760
  // src/definitions/media/video.ts
1704
- var import_schema9 = require("@kubuild/schema");
1761
+ var import_schema10 = require("@kubuild/schema");
1705
1762
  var videoDefinition = {
1706
1763
  type: "video",
1707
1764
  label: "Video",
@@ -1769,25 +1826,25 @@ var videoDefinition = {
1769
1826
  ],
1770
1827
  validateProps: (props) => {
1771
1828
  const errors = [];
1772
- if (props.src !== void 0 && typeof props.src !== "string" && !(0, import_schema9.isVariableBinding)(props.src)) {
1829
+ if (props.src !== void 0 && typeof props.src !== "string" && !(0, import_schema10.isVariableBinding)(props.src)) {
1773
1830
  errors.push('Video "src" must be a string when provided.');
1774
1831
  }
1775
- if (props.provider !== void 0 && !(0, import_schema9.isVariableBinding)(props.provider)) {
1832
+ if (props.provider !== void 0 && !(0, import_schema10.isVariableBinding)(props.provider)) {
1776
1833
  const allowed = ["auto", "html5", "youtube", "vimeo"];
1777
1834
  if (typeof props.provider !== "string" || !allowed.includes(props.provider)) {
1778
1835
  errors.push(`Video "provider" must be one of: ${allowed.join(", ")}.`);
1779
1836
  }
1780
1837
  }
1781
- if (props.controls !== void 0 && typeof props.controls !== "boolean" && !(0, import_schema9.isVariableBinding)(props.controls)) {
1838
+ if (props.controls !== void 0 && typeof props.controls !== "boolean" && !(0, import_schema10.isVariableBinding)(props.controls)) {
1782
1839
  errors.push('Video "controls" must be a boolean.');
1783
1840
  }
1784
- if (props.autoplay !== void 0 && typeof props.autoplay !== "boolean" && !(0, import_schema9.isVariableBinding)(props.autoplay)) {
1841
+ if (props.autoplay !== void 0 && typeof props.autoplay !== "boolean" && !(0, import_schema10.isVariableBinding)(props.autoplay)) {
1785
1842
  errors.push('Video "autoplay" must be a boolean.');
1786
1843
  }
1787
- if (props.loop !== void 0 && typeof props.loop !== "boolean" && !(0, import_schema9.isVariableBinding)(props.loop)) {
1844
+ if (props.loop !== void 0 && typeof props.loop !== "boolean" && !(0, import_schema10.isVariableBinding)(props.loop)) {
1788
1845
  errors.push('Video "loop" must be a boolean.');
1789
1846
  }
1790
- if (props.muted !== void 0 && typeof props.muted !== "boolean" && !(0, import_schema9.isVariableBinding)(props.muted)) {
1847
+ if (props.muted !== void 0 && typeof props.muted !== "boolean" && !(0, import_schema10.isVariableBinding)(props.muted)) {
1791
1848
  errors.push('Video "muted" must be a boolean.');
1792
1849
  }
1793
1850
  return errors.length > 0 ? errors : true;
@@ -1805,7 +1862,7 @@ var videoDefinition = {
1805
1862
  };
1806
1863
 
1807
1864
  // src/definitions/media/icon.ts
1808
- var import_schema10 = require("@kubuild/schema");
1865
+ var import_schema11 = require("@kubuild/schema");
1809
1866
  var iconDefinition = {
1810
1867
  type: "icon",
1811
1868
  label: "Icon",
@@ -1831,15 +1888,15 @@ var iconDefinition = {
1831
1888
  ],
1832
1889
  validateProps: (props) => {
1833
1890
  const errors = [];
1834
- if (props.name !== void 0 && !(0, import_schema10.isVariableBinding)(props.name) && (typeof props.name !== "string" || props.name.trim().length === 0)) {
1891
+ if (props.name !== void 0 && !(0, import_schema11.isVariableBinding)(props.name) && (typeof props.name !== "string" || props.name.trim().length === 0)) {
1835
1892
  errors.push('Icon requires a non-empty "name".');
1836
1893
  }
1837
- if (props.size !== void 0 && !(0, import_schema10.isVariableBinding)(props.size)) {
1894
+ if (props.size !== void 0 && !(0, import_schema11.isVariableBinding)(props.size)) {
1838
1895
  if (typeof props.size !== "number" || props.size < 0) {
1839
1896
  errors.push('Icon "size" must be a non-negative number.');
1840
1897
  }
1841
1898
  }
1842
- if (props.strokeWidth !== void 0 && !(0, import_schema10.isVariableBinding)(props.strokeWidth)) {
1899
+ if (props.strokeWidth !== void 0 && !(0, import_schema11.isVariableBinding)(props.strokeWidth)) {
1843
1900
  if (typeof props.strokeWidth !== "number" || props.strokeWidth < 0) {
1844
1901
  errors.push('Icon "strokeWidth" must be a non-negative number.');
1845
1902
  }
@@ -1856,7 +1913,7 @@ var iconDefinition = {
1856
1913
  };
1857
1914
 
1858
1915
  // src/definitions/media/html-embed.ts
1859
- var import_schema11 = require("@kubuild/schema");
1916
+ var import_schema12 = require("@kubuild/schema");
1860
1917
  var htmlEmbedDefinition = {
1861
1918
  type: "html-embed",
1862
1919
  label: "HTML Embed",
@@ -1880,7 +1937,7 @@ var htmlEmbedDefinition = {
1880
1937
  ],
1881
1938
  validateProps: (props) => {
1882
1939
  const errors = [];
1883
- if (props.html !== void 0 && typeof props.html !== "string" && !(0, import_schema11.isVariableBinding)(props.html)) {
1940
+ if (props.html !== void 0 && typeof props.html !== "string" && !(0, import_schema12.isVariableBinding)(props.html)) {
1884
1941
  errors.push('HTML Embed "html" must be a string.');
1885
1942
  }
1886
1943
  return errors.length > 0 ? errors : true;
@@ -1894,7 +1951,7 @@ var htmlEmbedDefinition = {
1894
1951
  };
1895
1952
 
1896
1953
  // src/definitions/data/table.ts
1897
- var import_schema12 = require("@kubuild/schema");
1954
+ var import_schema13 = require("@kubuild/schema");
1898
1955
  var tableDefinition = {
1899
1956
  type: "table",
1900
1957
  label: "Table",
@@ -1934,13 +1991,13 @@ var tableDefinition = {
1934
1991
  ],
1935
1992
  validateProps: (props) => {
1936
1993
  const errors = [];
1937
- if (props.striped !== void 0 && typeof props.striped !== "boolean" && !(0, import_schema12.isVariableBinding)(props.striped)) {
1994
+ if (props.striped !== void 0 && typeof props.striped !== "boolean" && !(0, import_schema13.isVariableBinding)(props.striped)) {
1938
1995
  errors.push('Table "striped" must be a boolean.');
1939
1996
  }
1940
- if (props.bordered !== void 0 && typeof props.bordered !== "boolean" && !(0, import_schema12.isVariableBinding)(props.bordered)) {
1997
+ if (props.bordered !== void 0 && typeof props.bordered !== "boolean" && !(0, import_schema13.isVariableBinding)(props.bordered)) {
1941
1998
  errors.push('Table "bordered" must be a boolean.');
1942
1999
  }
1943
- if (props.compact !== void 0 && typeof props.compact !== "boolean" && !(0, import_schema12.isVariableBinding)(props.compact)) {
2000
+ if (props.compact !== void 0 && typeof props.compact !== "boolean" && !(0, import_schema13.isVariableBinding)(props.compact)) {
1944
2001
  errors.push('Table "compact" must be a boolean.');
1945
2002
  }
1946
2003
  return errors.length > 0 ? errors : true;
@@ -2025,22 +2082,22 @@ var tableCellDefinition = {
2025
2082
  ],
2026
2083
  validateProps: (props) => {
2027
2084
  const errors = [];
2028
- if (props.tag !== void 0 && !(0, import_schema12.isVariableBinding)(props.tag)) {
2085
+ if (props.tag !== void 0 && !(0, import_schema13.isVariableBinding)(props.tag)) {
2029
2086
  if (props.tag !== "td" && props.tag !== "th") {
2030
2087
  errors.push('Table Cell "tag" must be either "td" or "th".');
2031
2088
  }
2032
2089
  }
2033
- if (props.colSpan !== void 0 && !(0, import_schema12.isVariableBinding)(props.colSpan)) {
2090
+ if (props.colSpan !== void 0 && !(0, import_schema13.isVariableBinding)(props.colSpan)) {
2034
2091
  if (typeof props.colSpan !== "number" || props.colSpan < 1 || !Number.isInteger(props.colSpan)) {
2035
2092
  errors.push('Table Cell "colSpan" must be a positive integer (>= 1).');
2036
2093
  }
2037
2094
  }
2038
- if (props.rowSpan !== void 0 && !(0, import_schema12.isVariableBinding)(props.rowSpan)) {
2095
+ if (props.rowSpan !== void 0 && !(0, import_schema13.isVariableBinding)(props.rowSpan)) {
2039
2096
  if (typeof props.rowSpan !== "number" || props.rowSpan < 1 || !Number.isInteger(props.rowSpan)) {
2040
2097
  errors.push('Table Cell "rowSpan" must be a positive integer (>= 1).');
2041
2098
  }
2042
2099
  }
2043
- if (props.text !== void 0 && typeof props.text !== "string" && !(0, import_schema12.isVariableBinding)(props.text)) {
2100
+ if (props.text !== void 0 && typeof props.text !== "string" && !(0, import_schema13.isVariableBinding)(props.text)) {
2044
2101
  errors.push('Table Cell "text" must be a string when provided.');
2045
2102
  }
2046
2103
  return errors.length > 0 ? errors : true;
@@ -2057,7 +2114,7 @@ var tableCellDefinition = {
2057
2114
  };
2058
2115
 
2059
2116
  // src/definitions/data/list.ts
2060
- var import_schema13 = require("@kubuild/schema");
2117
+ var import_schema14 = require("@kubuild/schema");
2061
2118
  var listDefinition = {
2062
2119
  type: "list",
2063
2120
  label: "List",
@@ -2106,12 +2163,12 @@ var listDefinition = {
2106
2163
  ],
2107
2164
  validateProps: (props) => {
2108
2165
  const errors = [];
2109
- if (props.tag !== void 0 && !(0, import_schema13.isVariableBinding)(props.tag)) {
2166
+ if (props.tag !== void 0 && !(0, import_schema14.isVariableBinding)(props.tag)) {
2110
2167
  if (props.tag !== "ul" && props.tag !== "ol") {
2111
2168
  errors.push('List "tag" must be either "ul" or "ol".');
2112
2169
  }
2113
2170
  }
2114
- if (props.listStyleType !== void 0 && !(0, import_schema13.isVariableBinding)(props.listStyleType)) {
2171
+ if (props.listStyleType !== void 0 && !(0, import_schema14.isVariableBinding)(props.listStyleType)) {
2115
2172
  const allowed = ["disc", "circle", "square", "decimal", "none", "custom-icon"];
2116
2173
  if (typeof props.listStyleType !== "string" || !allowed.includes(props.listStyleType)) {
2117
2174
  errors.push(`List "listStyleType" must be one of: ${allowed.join(", ")}.`);
@@ -2166,7 +2223,7 @@ var listItemDefinition = {
2166
2223
  ],
2167
2224
  validateProps: (props) => {
2168
2225
  const errors = [];
2169
- if (props.text !== void 0 && typeof props.text !== "string" && !(0, import_schema13.isVariableBinding)(props.text)) {
2226
+ if (props.text !== void 0 && typeof props.text !== "string" && !(0, import_schema14.isVariableBinding)(props.text)) {
2170
2227
  errors.push('List Item "text" must be a string when provided.');
2171
2228
  }
2172
2229
  return errors.length > 0 ? errors : true;
@@ -2203,7 +2260,7 @@ var collectionDefinition = {
2203
2260
  };
2204
2261
 
2205
2262
  // src/definitions/form/button.ts
2206
- var import_schema14 = require("@kubuild/schema");
2263
+ var import_schema15 = require("@kubuild/schema");
2207
2264
  var buttonDefinition = {
2208
2265
  type: "button",
2209
2266
  label: "Button",
@@ -2211,6 +2268,7 @@ var buttonDefinition = {
2211
2268
  icon: "mouse-pointer",
2212
2269
  acceptsChildren: false,
2213
2270
  capabilities: ["actionRegistry"],
2271
+ ...canonicalTextPropFields("button"),
2214
2272
  defaultProps: {
2215
2273
  label: "Click Me",
2216
2274
  variant: "primary"
@@ -2254,22 +2312,22 @@ var buttonDefinition = {
2254
2312
  ],
2255
2313
  validateProps: (props) => {
2256
2314
  const errors = [];
2257
- const hasLabel = typeof props.label === "string" && props.label.trim().length > 0 || (0, import_schema14.isVariableBinding)(props.label);
2315
+ const hasLabel = typeof props.label === "string" && props.label.trim().length > 0 || (0, import_schema15.isVariableBinding)(props.label);
2258
2316
  if (!hasLabel) {
2259
2317
  errors.push('Button requires a non-empty "label".');
2260
2318
  }
2261
- if (props.href !== void 0 && typeof props.href !== "string" && !(0, import_schema14.isVariableBinding)(props.href)) {
2319
+ if (props.href !== void 0 && typeof props.href !== "string" && !(0, import_schema15.isVariableBinding)(props.href)) {
2262
2320
  errors.push('Button "href" must be a string when provided.');
2263
2321
  }
2264
- if (props.buttonType !== void 0 && !(0, import_schema14.isVariableBinding)(props.buttonType)) {
2322
+ if (props.buttonType !== void 0 && !(0, import_schema15.isVariableBinding)(props.buttonType)) {
2265
2323
  if (!["button", "submit", "reset"].includes(props.buttonType)) {
2266
2324
  errors.push('Button "buttonType" must be one of: "button", "submit", "reset".');
2267
2325
  }
2268
2326
  }
2269
- if (props.action !== void 0 && !(0, import_schema14.isActionBinding)(props.action)) {
2327
+ if (props.action !== void 0 && !(0, import_schema15.isActionBinding)(props.action)) {
2270
2328
  errors.push('Button "action" must be a valid action binding when provided.');
2271
2329
  }
2272
- if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema14.isVariableBinding)(props.disabled)) {
2330
+ if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema15.isVariableBinding)(props.disabled)) {
2273
2331
  errors.push('Button "disabled" must be a boolean when provided.');
2274
2332
  }
2275
2333
  return errors.length > 0 ? errors : true;
@@ -2357,25 +2415,25 @@ var buttonSubmitDefinition = {
2357
2415
  ],
2358
2416
  validateProps: (props) => {
2359
2417
  const errors = [];
2360
- const hasLabel = typeof props.label === "string" && props.label.trim().length > 0 || (0, import_schema14.isVariableBinding)(props.label);
2418
+ const hasLabel = typeof props.label === "string" && props.label.trim().length > 0 || (0, import_schema15.isVariableBinding)(props.label);
2361
2419
  if (!hasLabel) {
2362
2420
  errors.push('Submit Button requires a non-empty "label".');
2363
2421
  }
2364
- if (props.loadingText !== void 0 && typeof props.loadingText !== "string" && !(0, import_schema14.isVariableBinding)(props.loadingText)) {
2422
+ if (props.loadingText !== void 0 && typeof props.loadingText !== "string" && !(0, import_schema15.isVariableBinding)(props.loadingText)) {
2365
2423
  errors.push('Submit Button "loadingText" must be a string when provided.');
2366
2424
  }
2367
- if (props.showSpinner !== void 0 && typeof props.showSpinner !== "boolean" && !(0, import_schema14.isVariableBinding)(props.showSpinner)) {
2425
+ if (props.showSpinner !== void 0 && typeof props.showSpinner !== "boolean" && !(0, import_schema15.isVariableBinding)(props.showSpinner)) {
2368
2426
  errors.push('Submit Button "showSpinner" must be a boolean when provided.');
2369
2427
  }
2370
- if (props.autoDisableOnSubmit !== void 0 && typeof props.autoDisableOnSubmit !== "boolean" && !(0, import_schema14.isVariableBinding)(props.autoDisableOnSubmit)) {
2428
+ if (props.autoDisableOnSubmit !== void 0 && typeof props.autoDisableOnSubmit !== "boolean" && !(0, import_schema15.isVariableBinding)(props.autoDisableOnSubmit)) {
2371
2429
  errors.push('Submit Button "autoDisableOnSubmit" must be a boolean when provided.');
2372
2430
  }
2373
- if (props.buttonType !== void 0 && !(0, import_schema14.isVariableBinding)(props.buttonType)) {
2431
+ if (props.buttonType !== void 0 && !(0, import_schema15.isVariableBinding)(props.buttonType)) {
2374
2432
  if (!["submit", "reset", "button"].includes(props.buttonType)) {
2375
2433
  errors.push('Submit Button "buttonType" must be one of: "submit", "reset", "button".');
2376
2434
  }
2377
2435
  }
2378
- if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema14.isVariableBinding)(props.disabled)) {
2436
+ if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema15.isVariableBinding)(props.disabled)) {
2379
2437
  errors.push('Submit Button "disabled" must be a boolean when provided.');
2380
2438
  }
2381
2439
  return errors.length > 0 ? errors : true;
@@ -2402,7 +2460,7 @@ var buttonSubmitDefinition = {
2402
2460
  };
2403
2461
 
2404
2462
  // src/definitions/form/form.ts
2405
- var import_schema15 = require("@kubuild/schema");
2463
+ var import_schema16 = require("@kubuild/schema");
2406
2464
  var formDefinition = {
2407
2465
  type: "form",
2408
2466
  label: "Form",
@@ -2489,34 +2547,34 @@ var formDefinition = {
2489
2547
  ],
2490
2548
  validateProps: (props) => {
2491
2549
  const errors = [];
2492
- if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema15.isVariableBinding)(props.name)) {
2550
+ if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema16.isVariableBinding)(props.name)) {
2493
2551
  errors.push('Form "name" must be a string when provided.');
2494
2552
  }
2495
- if (props.action !== void 0 && typeof props.action !== "string" && !(0, import_schema15.isVariableBinding)(props.action)) {
2553
+ if (props.action !== void 0 && typeof props.action !== "string" && !(0, import_schema16.isVariableBinding)(props.action)) {
2496
2554
  errors.push('Form "action" must be a string when provided.');
2497
2555
  }
2498
- if (props.method !== void 0 && !(0, import_schema15.isVariableBinding)(props.method)) {
2556
+ if (props.method !== void 0 && !(0, import_schema16.isVariableBinding)(props.method)) {
2499
2557
  if (!["GET", "POST", "get", "post"].includes(props.method)) {
2500
2558
  errors.push('Form "method" must be either "GET" or "POST".');
2501
2559
  }
2502
2560
  }
2503
- if (props.target !== void 0 && !(0, import_schema15.isVariableBinding)(props.target)) {
2561
+ if (props.target !== void 0 && !(0, import_schema16.isVariableBinding)(props.target)) {
2504
2562
  if (!["_self", "_blank", "_parent", "_top"].includes(props.target)) {
2505
2563
  errors.push('Form "target" must be one of: "_self", "_blank", "_parent", "_top".');
2506
2564
  }
2507
2565
  }
2508
- if (props.autoComplete !== void 0 && !(0, import_schema15.isVariableBinding)(props.autoComplete)) {
2566
+ if (props.autoComplete !== void 0 && !(0, import_schema16.isVariableBinding)(props.autoComplete)) {
2509
2567
  if (!["on", "off"].includes(props.autoComplete)) {
2510
2568
  errors.push('Form "autoComplete" must be either "on" or "off".');
2511
2569
  }
2512
2570
  }
2513
- if (props.preventDefault !== void 0 && typeof props.preventDefault !== "boolean" && !(0, import_schema15.isVariableBinding)(props.preventDefault)) {
2571
+ if (props.preventDefault !== void 0 && typeof props.preventDefault !== "boolean" && !(0, import_schema16.isVariableBinding)(props.preventDefault)) {
2514
2572
  errors.push('Form "preventDefault" must be a boolean when provided.');
2515
2573
  }
2516
- if (props.scrollToFirstError !== void 0 && typeof props.scrollToFirstError !== "boolean" && !(0, import_schema15.isVariableBinding)(props.scrollToFirstError)) {
2574
+ if (props.scrollToFirstError !== void 0 && typeof props.scrollToFirstError !== "boolean" && !(0, import_schema16.isVariableBinding)(props.scrollToFirstError)) {
2517
2575
  errors.push('Form "scrollToFirstError" must be a boolean when provided.');
2518
2576
  }
2519
- if (props.resetOnSubmit !== void 0 && typeof props.resetOnSubmit !== "boolean" && !(0, import_schema15.isVariableBinding)(props.resetOnSubmit)) {
2577
+ if (props.resetOnSubmit !== void 0 && typeof props.resetOnSubmit !== "boolean" && !(0, import_schema16.isVariableBinding)(props.resetOnSubmit)) {
2520
2578
  errors.push('Form "resetOnSubmit" must be a boolean when provided.');
2521
2579
  }
2522
2580
  return errors.length > 0 ? errors : true;
@@ -2532,7 +2590,7 @@ var formDefinition = {
2532
2590
  };
2533
2591
 
2534
2592
  // src/definitions/form/input.ts
2535
- var import_schema16 = require("@kubuild/schema");
2593
+ var import_schema17 = require("@kubuild/schema");
2536
2594
  var inputDefinition = {
2537
2595
  type: "input",
2538
2596
  label: "Input",
@@ -2614,47 +2672,47 @@ var inputDefinition = {
2614
2672
  ],
2615
2673
  validateProps: (props) => {
2616
2674
  const errors = [];
2617
- if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema16.isVariableBinding)(props.name)) {
2675
+ if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema17.isVariableBinding)(props.name)) {
2618
2676
  errors.push('Input "name" must be a string when provided.');
2619
2677
  }
2620
- if (props.type !== void 0 && !(0, import_schema16.isVariableBinding)(props.type)) {
2678
+ if (props.type !== void 0 && !(0, import_schema17.isVariableBinding)(props.type)) {
2621
2679
  const validTypes = ["text", "email", "number", "password", "tel", "url", "search", "date", "hidden"];
2622
2680
  if (!validTypes.includes(props.type)) {
2623
2681
  errors.push(`Input "type" must be one of: ${validTypes.join(", ")}.`);
2624
2682
  }
2625
2683
  }
2626
- if (props.placeholder !== void 0 && typeof props.placeholder !== "string" && !(0, import_schema16.isVariableBinding)(props.placeholder)) {
2684
+ if (props.placeholder !== void 0 && typeof props.placeholder !== "string" && !(0, import_schema17.isVariableBinding)(props.placeholder)) {
2627
2685
  errors.push('Input "placeholder" must be a string when provided.');
2628
2686
  }
2629
- if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema16.isVariableBinding)(props.required)) {
2687
+ if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema17.isVariableBinding)(props.required)) {
2630
2688
  errors.push('Input "required" must be a boolean when provided.');
2631
2689
  }
2632
- if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema16.isVariableBinding)(props.disabled)) {
2690
+ if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema17.isVariableBinding)(props.disabled)) {
2633
2691
  errors.push('Input "disabled" must be a boolean when provided.');
2634
2692
  }
2635
- if (props.readOnly !== void 0 && typeof props.readOnly !== "boolean" && !(0, import_schema16.isVariableBinding)(props.readOnly)) {
2693
+ if (props.readOnly !== void 0 && typeof props.readOnly !== "boolean" && !(0, import_schema17.isVariableBinding)(props.readOnly)) {
2636
2694
  errors.push('Input "readOnly" must be a boolean when provided.');
2637
2695
  }
2638
- if (props.pattern !== void 0 && typeof props.pattern !== "string" && !(0, import_schema16.isVariableBinding)(props.pattern)) {
2696
+ if (props.pattern !== void 0 && typeof props.pattern !== "string" && !(0, import_schema17.isVariableBinding)(props.pattern)) {
2639
2697
  errors.push('Input "pattern" must be a string when provided.');
2640
2698
  }
2641
- if (props.minLength !== void 0 && !(0, import_schema16.isVariableBinding)(props.minLength)) {
2699
+ if (props.minLength !== void 0 && !(0, import_schema17.isVariableBinding)(props.minLength)) {
2642
2700
  if (typeof props.minLength !== "number" || props.minLength < 0 || !Number.isInteger(props.minLength)) {
2643
2701
  errors.push('Input "minLength" must be a non-negative integer when provided.');
2644
2702
  }
2645
2703
  }
2646
- if (props.maxLength !== void 0 && !(0, import_schema16.isVariableBinding)(props.maxLength)) {
2704
+ if (props.maxLength !== void 0 && !(0, import_schema17.isVariableBinding)(props.maxLength)) {
2647
2705
  if (typeof props.maxLength !== "number" || props.maxLength < 0 || !Number.isInteger(props.maxLength)) {
2648
2706
  errors.push('Input "maxLength" must be a non-negative integer when provided.');
2649
2707
  }
2650
2708
  }
2651
- if (props.prefixIcon !== void 0 && typeof props.prefixIcon !== "string" && !(0, import_schema16.isVariableBinding)(props.prefixIcon)) {
2709
+ if (props.prefixIcon !== void 0 && typeof props.prefixIcon !== "string" && !(0, import_schema17.isVariableBinding)(props.prefixIcon)) {
2652
2710
  errors.push('Input "prefixIcon" must be a string when provided.');
2653
2711
  }
2654
- if (props.suffixIcon !== void 0 && typeof props.suffixIcon !== "string" && !(0, import_schema16.isVariableBinding)(props.suffixIcon)) {
2712
+ if (props.suffixIcon !== void 0 && typeof props.suffixIcon !== "string" && !(0, import_schema17.isVariableBinding)(props.suffixIcon)) {
2655
2713
  errors.push('Input "suffixIcon" must be a string when provided.');
2656
2714
  }
2657
- if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema16.isVariableBinding)(props.helperText)) {
2715
+ if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema17.isVariableBinding)(props.helperText)) {
2658
2716
  errors.push('Input "helperText" must be a string when provided.');
2659
2717
  }
2660
2718
  return errors.length > 0 ? errors : true;
@@ -2679,7 +2737,7 @@ var inputDefinition = {
2679
2737
  };
2680
2738
 
2681
2739
  // src/definitions/form/textarea.ts
2682
- var import_schema17 = require("@kubuild/schema");
2740
+ var import_schema18 = require("@kubuild/schema");
2683
2741
  var textareaDefinition = {
2684
2742
  type: "textarea",
2685
2743
  label: "Textarea",
@@ -2741,41 +2799,41 @@ var textareaDefinition = {
2741
2799
  ],
2742
2800
  validateProps: (props) => {
2743
2801
  const errors = [];
2744
- if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema17.isVariableBinding)(props.name)) {
2802
+ if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema18.isVariableBinding)(props.name)) {
2745
2803
  errors.push('Textarea "name" must be a string when provided.');
2746
2804
  }
2747
- if (props.rows !== void 0 && !(0, import_schema17.isVariableBinding)(props.rows)) {
2805
+ if (props.rows !== void 0 && !(0, import_schema18.isVariableBinding)(props.rows)) {
2748
2806
  if (typeof props.rows !== "number" || props.rows < 1 || !Number.isInteger(props.rows)) {
2749
2807
  errors.push('Textarea "rows" must be a positive integer (>= 1).');
2750
2808
  }
2751
2809
  }
2752
- if (props.placeholder !== void 0 && typeof props.placeholder !== "string" && !(0, import_schema17.isVariableBinding)(props.placeholder)) {
2810
+ if (props.placeholder !== void 0 && typeof props.placeholder !== "string" && !(0, import_schema18.isVariableBinding)(props.placeholder)) {
2753
2811
  errors.push('Textarea "placeholder" must be a string when provided.');
2754
2812
  }
2755
- if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema17.isVariableBinding)(props.required)) {
2813
+ if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema18.isVariableBinding)(props.required)) {
2756
2814
  errors.push('Textarea "required" must be a boolean when provided.');
2757
2815
  }
2758
- if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema17.isVariableBinding)(props.disabled)) {
2816
+ if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema18.isVariableBinding)(props.disabled)) {
2759
2817
  errors.push('Textarea "disabled" must be a boolean when provided.');
2760
2818
  }
2761
- if (props.readOnly !== void 0 && typeof props.readOnly !== "boolean" && !(0, import_schema17.isVariableBinding)(props.readOnly)) {
2819
+ if (props.readOnly !== void 0 && typeof props.readOnly !== "boolean" && !(0, import_schema18.isVariableBinding)(props.readOnly)) {
2762
2820
  errors.push('Textarea "readOnly" must be a boolean when provided.');
2763
2821
  }
2764
- if (props.resize !== void 0 && !(0, import_schema17.isVariableBinding)(props.resize)) {
2822
+ if (props.resize !== void 0 && !(0, import_schema18.isVariableBinding)(props.resize)) {
2765
2823
  const allowedResize = ["vertical", "horizontal", "both", "none"];
2766
2824
  if (typeof props.resize !== "string" || !allowedResize.includes(props.resize)) {
2767
2825
  errors.push(`Textarea "resize" must be one of: ${allowedResize.join(", ")}.`);
2768
2826
  }
2769
2827
  }
2770
- if (props.autoGrow !== void 0 && typeof props.autoGrow !== "boolean" && !(0, import_schema17.isVariableBinding)(props.autoGrow)) {
2828
+ if (props.autoGrow !== void 0 && typeof props.autoGrow !== "boolean" && !(0, import_schema18.isVariableBinding)(props.autoGrow)) {
2771
2829
  errors.push('Textarea "autoGrow" must be a boolean when provided.');
2772
2830
  }
2773
- if (props.maxCharCount !== void 0 && !(0, import_schema17.isVariableBinding)(props.maxCharCount)) {
2831
+ if (props.maxCharCount !== void 0 && !(0, import_schema18.isVariableBinding)(props.maxCharCount)) {
2774
2832
  if (typeof props.maxCharCount !== "number" || props.maxCharCount < 1 || !Number.isInteger(props.maxCharCount)) {
2775
2833
  errors.push('Textarea "maxCharCount" must be a positive integer (>= 1) when provided.');
2776
2834
  }
2777
2835
  }
2778
- if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema17.isVariableBinding)(props.helperText)) {
2836
+ if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema18.isVariableBinding)(props.helperText)) {
2779
2837
  errors.push('Textarea "helperText" must be a string when provided.');
2780
2838
  }
2781
2839
  return errors.length > 0 ? errors : true;
@@ -2800,7 +2858,7 @@ var textareaDefinition = {
2800
2858
  };
2801
2859
 
2802
2860
  // src/definitions/form/select.ts
2803
- var import_schema18 = require("@kubuild/schema");
2861
+ var import_schema19 = require("@kubuild/schema");
2804
2862
  var selectDefinition = {
2805
2863
  type: "select",
2806
2864
  label: "Select",
@@ -2852,21 +2910,21 @@ var selectDefinition = {
2852
2910
  ],
2853
2911
  validateProps: (props) => {
2854
2912
  const errors = [];
2855
- if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema18.isVariableBinding)(props.name)) {
2913
+ if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema19.isVariableBinding)(props.name)) {
2856
2914
  errors.push('Select "name" must be a string when provided.');
2857
2915
  }
2858
- if (props.options !== void 0 && !(0, import_schema18.isVariableBinding)(props.options)) {
2916
+ if (props.options !== void 0 && !(0, import_schema19.isVariableBinding)(props.options)) {
2859
2917
  if (!Array.isArray(props.options) && typeof props.options !== "string") {
2860
2918
  errors.push('Select "options" must be an array of option objects or a JSON string.');
2861
2919
  }
2862
2920
  }
2863
- if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema18.isVariableBinding)(props.required)) {
2921
+ if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema19.isVariableBinding)(props.required)) {
2864
2922
  errors.push('Select "required" must be a boolean when provided.');
2865
2923
  }
2866
- if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema18.isVariableBinding)(props.disabled)) {
2924
+ if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema19.isVariableBinding)(props.disabled)) {
2867
2925
  errors.push('Select "disabled" must be a boolean when provided.');
2868
2926
  }
2869
- if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema18.isVariableBinding)(props.helperText)) {
2927
+ if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema19.isVariableBinding)(props.helperText)) {
2870
2928
  errors.push('Select "helperText" must be a string when provided.');
2871
2929
  }
2872
2930
  return errors.length > 0 ? errors : true;
@@ -2891,7 +2949,7 @@ var selectDefinition = {
2891
2949
  };
2892
2950
 
2893
2951
  // src/definitions/form/checkbox.ts
2894
- var import_schema19 = require("@kubuild/schema");
2952
+ var import_schema20 = require("@kubuild/schema");
2895
2953
  var checkboxDefinition = {
2896
2954
  type: "checkbox",
2897
2955
  label: "Checkbox",
@@ -2933,28 +2991,28 @@ var checkboxDefinition = {
2933
2991
  ],
2934
2992
  validateProps: (props) => {
2935
2993
  const errors = [];
2936
- if (props.label !== void 0 && typeof props.label !== "string" && !(0, import_schema19.isVariableBinding)(props.label)) {
2994
+ if (props.label !== void 0 && typeof props.label !== "string" && !(0, import_schema20.isVariableBinding)(props.label)) {
2937
2995
  errors.push('Checkbox "label" must be a string when provided.');
2938
2996
  }
2939
- if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema19.isVariableBinding)(props.name)) {
2997
+ if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema20.isVariableBinding)(props.name)) {
2940
2998
  errors.push('Checkbox "name" must be a string when provided.');
2941
2999
  }
2942
- if (props.value !== void 0 && typeof props.value !== "string" && !(0, import_schema19.isVariableBinding)(props.value)) {
3000
+ if (props.value !== void 0 && typeof props.value !== "string" && !(0, import_schema20.isVariableBinding)(props.value)) {
2943
3001
  errors.push('Checkbox "value" must be a string when provided.');
2944
3002
  }
2945
- if (props.defaultChecked !== void 0 && typeof props.defaultChecked !== "boolean" && !(0, import_schema19.isVariableBinding)(props.defaultChecked)) {
3003
+ if (props.defaultChecked !== void 0 && typeof props.defaultChecked !== "boolean" && !(0, import_schema20.isVariableBinding)(props.defaultChecked)) {
2946
3004
  errors.push('Checkbox "defaultChecked" must be a boolean when provided.');
2947
3005
  }
2948
- if (props.indeterminate !== void 0 && typeof props.indeterminate !== "boolean" && !(0, import_schema19.isVariableBinding)(props.indeterminate)) {
3006
+ if (props.indeterminate !== void 0 && typeof props.indeterminate !== "boolean" && !(0, import_schema20.isVariableBinding)(props.indeterminate)) {
2949
3007
  errors.push('Checkbox "indeterminate" must be a boolean when provided.');
2950
3008
  }
2951
- if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema19.isVariableBinding)(props.required)) {
3009
+ if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema20.isVariableBinding)(props.required)) {
2952
3010
  errors.push('Checkbox "required" must be a boolean when provided.');
2953
3011
  }
2954
- if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema19.isVariableBinding)(props.disabled)) {
3012
+ if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema20.isVariableBinding)(props.disabled)) {
2955
3013
  errors.push('Checkbox "disabled" must be a boolean when provided.');
2956
3014
  }
2957
- if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema19.isVariableBinding)(props.helperText)) {
3015
+ if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema20.isVariableBinding)(props.helperText)) {
2958
3016
  errors.push('Checkbox "helperText" must be a string when provided.');
2959
3017
  }
2960
3018
  return errors.length > 0 ? errors : true;
@@ -2973,7 +3031,7 @@ var checkboxDefinition = {
2973
3031
  };
2974
3032
 
2975
3033
  // src/definitions/form/switch.ts
2976
- var import_schema20 = require("@kubuild/schema");
3034
+ var import_schema21 = require("@kubuild/schema");
2977
3035
  var switchDefinition = {
2978
3036
  type: "switch",
2979
3037
  label: "Switch",
@@ -3025,31 +3083,31 @@ var switchDefinition = {
3025
3083
  ],
3026
3084
  validateProps: (props) => {
3027
3085
  const errors = [];
3028
- if (props.label !== void 0 && typeof props.label !== "string" && !(0, import_schema20.isVariableBinding)(props.label)) {
3086
+ if (props.label !== void 0 && typeof props.label !== "string" && !(0, import_schema21.isVariableBinding)(props.label)) {
3029
3087
  errors.push('Switch "label" must be a string when provided.');
3030
3088
  }
3031
- if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema20.isVariableBinding)(props.name)) {
3089
+ if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema21.isVariableBinding)(props.name)) {
3032
3090
  errors.push('Switch "name" must be a string when provided.');
3033
3091
  }
3034
- if (props.value !== void 0 && typeof props.value !== "string" && !(0, import_schema20.isVariableBinding)(props.value)) {
3092
+ if (props.value !== void 0 && typeof props.value !== "string" && !(0, import_schema21.isVariableBinding)(props.value)) {
3035
3093
  errors.push('Switch "value" must be a string when provided.');
3036
3094
  }
3037
- if (props.defaultChecked !== void 0 && typeof props.defaultChecked !== "boolean" && !(0, import_schema20.isVariableBinding)(props.defaultChecked)) {
3095
+ if (props.defaultChecked !== void 0 && typeof props.defaultChecked !== "boolean" && !(0, import_schema21.isVariableBinding)(props.defaultChecked)) {
3038
3096
  errors.push('Switch "defaultChecked" must be a boolean when provided.');
3039
3097
  }
3040
- if (props.switchSize !== void 0 && !(0, import_schema20.isVariableBinding)(props.switchSize)) {
3098
+ if (props.switchSize !== void 0 && !(0, import_schema21.isVariableBinding)(props.switchSize)) {
3041
3099
  const allowedSizes = ["sm", "md", "lg"];
3042
3100
  if (typeof props.switchSize !== "string" || !allowedSizes.includes(props.switchSize)) {
3043
3101
  errors.push(`Switch "switchSize" must be one of: ${allowedSizes.join(", ")}.`);
3044
3102
  }
3045
3103
  }
3046
- if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema20.isVariableBinding)(props.required)) {
3104
+ if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema21.isVariableBinding)(props.required)) {
3047
3105
  errors.push('Switch "required" must be a boolean when provided.');
3048
3106
  }
3049
- if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema20.isVariableBinding)(props.disabled)) {
3107
+ if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema21.isVariableBinding)(props.disabled)) {
3050
3108
  errors.push('Switch "disabled" must be a boolean when provided.');
3051
3109
  }
3052
- if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema20.isVariableBinding)(props.helperText)) {
3110
+ if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema21.isVariableBinding)(props.helperText)) {
3053
3111
  errors.push('Switch "helperText" must be a string when provided.');
3054
3112
  }
3055
3113
  return errors.length > 0 ? errors : true;
@@ -3068,7 +3126,7 @@ var switchDefinition = {
3068
3126
  };
3069
3127
 
3070
3128
  // src/definitions/form/radio.ts
3071
- var import_schema21 = require("@kubuild/schema");
3129
+ var import_schema22 = require("@kubuild/schema");
3072
3130
  var radioGroupDefinition = {
3073
3131
  type: "radio-group",
3074
3132
  label: "Radio Group",
@@ -3119,25 +3177,25 @@ var radioGroupDefinition = {
3119
3177
  ],
3120
3178
  validateProps: (props) => {
3121
3179
  const errors = [];
3122
- if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema21.isVariableBinding)(props.name)) {
3180
+ if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema22.isVariableBinding)(props.name)) {
3123
3181
  errors.push('RadioGroup "name" must be a string when provided.');
3124
3182
  }
3125
- if (props.defaultSelected !== void 0 && typeof props.defaultSelected !== "string" && !(0, import_schema21.isVariableBinding)(props.defaultSelected)) {
3183
+ if (props.defaultSelected !== void 0 && typeof props.defaultSelected !== "string" && !(0, import_schema22.isVariableBinding)(props.defaultSelected)) {
3126
3184
  errors.push('RadioGroup "defaultSelected" must be a string when provided.');
3127
3185
  }
3128
- if (props.orientation !== void 0 && !(0, import_schema21.isVariableBinding)(props.orientation)) {
3186
+ if (props.orientation !== void 0 && !(0, import_schema22.isVariableBinding)(props.orientation)) {
3129
3187
  const allowedOrientations = ["vertical", "horizontal"];
3130
3188
  if (typeof props.orientation !== "string" || !allowedOrientations.includes(props.orientation)) {
3131
3189
  errors.push(`RadioGroup "orientation" must be one of: ${allowedOrientations.join(", ")}.`);
3132
3190
  }
3133
3191
  }
3134
- if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema21.isVariableBinding)(props.required)) {
3192
+ if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema22.isVariableBinding)(props.required)) {
3135
3193
  errors.push('RadioGroup "required" must be a boolean when provided.');
3136
3194
  }
3137
- if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema21.isVariableBinding)(props.disabled)) {
3195
+ if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema22.isVariableBinding)(props.disabled)) {
3138
3196
  errors.push('RadioGroup "disabled" must be a boolean when provided.');
3139
3197
  }
3140
- if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema21.isVariableBinding)(props.helperText)) {
3198
+ if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema22.isVariableBinding)(props.helperText)) {
3141
3199
  errors.push('RadioGroup "helperText" must be a string when provided.');
3142
3200
  }
3143
3201
  return errors.length > 0 ? errors : true;
@@ -3188,25 +3246,25 @@ var radioDefinition = {
3188
3246
  ],
3189
3247
  validateProps: (props) => {
3190
3248
  const errors = [];
3191
- if (props.label !== void 0 && typeof props.label !== "string" && !(0, import_schema21.isVariableBinding)(props.label)) {
3249
+ if (props.label !== void 0 && typeof props.label !== "string" && !(0, import_schema22.isVariableBinding)(props.label)) {
3192
3250
  errors.push('Radio "label" must be a string when provided.');
3193
3251
  }
3194
- if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema21.isVariableBinding)(props.name)) {
3252
+ if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema22.isVariableBinding)(props.name)) {
3195
3253
  errors.push('Radio "name" must be a string when provided.');
3196
3254
  }
3197
- if (props.value !== void 0 && typeof props.value !== "string" && !(0, import_schema21.isVariableBinding)(props.value)) {
3255
+ if (props.value !== void 0 && typeof props.value !== "string" && !(0, import_schema22.isVariableBinding)(props.value)) {
3198
3256
  errors.push('Radio "value" must be a string when provided.');
3199
3257
  }
3200
- if (props.defaultChecked !== void 0 && typeof props.defaultChecked !== "boolean" && !(0, import_schema21.isVariableBinding)(props.defaultChecked)) {
3258
+ if (props.defaultChecked !== void 0 && typeof props.defaultChecked !== "boolean" && !(0, import_schema22.isVariableBinding)(props.defaultChecked)) {
3201
3259
  errors.push('Radio "defaultChecked" must be a boolean when provided.');
3202
3260
  }
3203
- if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema21.isVariableBinding)(props.required)) {
3261
+ if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema22.isVariableBinding)(props.required)) {
3204
3262
  errors.push('Radio "required" must be a boolean when provided.');
3205
3263
  }
3206
- if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema21.isVariableBinding)(props.disabled)) {
3264
+ if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema22.isVariableBinding)(props.disabled)) {
3207
3265
  errors.push('Radio "disabled" must be a boolean when provided.');
3208
3266
  }
3209
- if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema21.isVariableBinding)(props.helperText)) {
3267
+ if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema22.isVariableBinding)(props.helperText)) {
3210
3268
  errors.push('Radio "helperText" must be a string when provided.');
3211
3269
  }
3212
3270
  return errors.length > 0 ? errors : true;
@@ -3230,7 +3288,7 @@ var radioItemDefinition = {
3230
3288
  };
3231
3289
 
3232
3290
  // src/definitions/form/file-upload.ts
3233
- var import_schema22 = require("@kubuild/schema");
3291
+ var import_schema23 = require("@kubuild/schema");
3234
3292
  var fileUploadDefinition = {
3235
3293
  type: "file-upload",
3236
3294
  label: "File Upload",
@@ -3275,33 +3333,33 @@ var fileUploadDefinition = {
3275
3333
  ],
3276
3334
  validateProps: (props) => {
3277
3335
  const errors = [];
3278
- if (props.label !== void 0 && typeof props.label !== "string" && !(0, import_schema22.isVariableBinding)(props.label)) {
3336
+ if (props.label !== void 0 && typeof props.label !== "string" && !(0, import_schema23.isVariableBinding)(props.label)) {
3279
3337
  errors.push('FileUpload "label" must be a string when provided.');
3280
3338
  }
3281
- if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema22.isVariableBinding)(props.name)) {
3339
+ if (props.name !== void 0 && typeof props.name !== "string" && !(0, import_schema23.isVariableBinding)(props.name)) {
3282
3340
  errors.push('FileUpload "name" must be a string when provided.');
3283
3341
  }
3284
- if (props.accept !== void 0 && typeof props.accept !== "string" && !(0, import_schema22.isVariableBinding)(props.accept)) {
3342
+ if (props.accept !== void 0 && typeof props.accept !== "string" && !(0, import_schema23.isVariableBinding)(props.accept)) {
3285
3343
  errors.push('FileUpload "accept" must be a string when provided.');
3286
3344
  }
3287
- if (props.maxFileSize !== void 0 && !(0, import_schema22.isVariableBinding)(props.maxFileSize)) {
3345
+ if (props.maxFileSize !== void 0 && !(0, import_schema23.isVariableBinding)(props.maxFileSize)) {
3288
3346
  if (typeof props.maxFileSize !== "number" || props.maxFileSize <= 0) {
3289
3347
  errors.push('FileUpload "maxFileSize" must be a positive number when provided.');
3290
3348
  }
3291
3349
  }
3292
- if (props.multiple !== void 0 && typeof props.multiple !== "boolean" && !(0, import_schema22.isVariableBinding)(props.multiple)) {
3350
+ if (props.multiple !== void 0 && typeof props.multiple !== "boolean" && !(0, import_schema23.isVariableBinding)(props.multiple)) {
3293
3351
  errors.push('FileUpload "multiple" must be a boolean when provided.');
3294
3352
  }
3295
- if (props.showPreview !== void 0 && typeof props.showPreview !== "boolean" && !(0, import_schema22.isVariableBinding)(props.showPreview)) {
3353
+ if (props.showPreview !== void 0 && typeof props.showPreview !== "boolean" && !(0, import_schema23.isVariableBinding)(props.showPreview)) {
3296
3354
  errors.push('FileUpload "showPreview" must be a boolean when provided.');
3297
3355
  }
3298
- if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema22.isVariableBinding)(props.required)) {
3356
+ if (props.required !== void 0 && typeof props.required !== "boolean" && !(0, import_schema23.isVariableBinding)(props.required)) {
3299
3357
  errors.push('FileUpload "required" must be a boolean when provided.');
3300
3358
  }
3301
- if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema22.isVariableBinding)(props.disabled)) {
3359
+ if (props.disabled !== void 0 && typeof props.disabled !== "boolean" && !(0, import_schema23.isVariableBinding)(props.disabled)) {
3302
3360
  errors.push('FileUpload "disabled" must be a boolean when provided.');
3303
3361
  }
3304
- if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema22.isVariableBinding)(props.helperText)) {
3362
+ if (props.helperText !== void 0 && typeof props.helperText !== "string" && !(0, import_schema23.isVariableBinding)(props.helperText)) {
3305
3363
  errors.push('FileUpload "helperText" must be a string when provided.');
3306
3364
  }
3307
3365
  return errors.length > 0 ? errors : true;
@@ -3541,77 +3599,607 @@ var collapsibleDefinition = {
3541
3599
  }
3542
3600
  };
3543
3601
 
3544
- // src/definitions/index.ts
3545
- var coreComponentDefinitions = [
3546
- pageDefinition,
3547
- sectionDefinition,
3548
- containerDefinition,
3549
- columnsDefinition,
3550
- flexDefinition,
3551
- gridDefinition,
3552
- headingDefinition,
3553
- textDefinition,
3554
- paragraphDefinition,
3555
- linkDefinition,
3556
- blockquoteDefinition,
3557
- badgeDefinition,
3558
- codeBlockDefinition,
3559
- imageDefinition,
3560
- videoDefinition,
3561
- iconDefinition,
3562
- htmlEmbedDefinition,
3563
- buttonDefinition,
3564
- buttonSubmitDefinition,
3565
- formDefinition,
3566
- inputDefinition,
3567
- textareaDefinition,
3568
- selectDefinition,
3569
- checkboxDefinition,
3570
- switchDefinition,
3571
- radioGroupDefinition,
3572
- radioDefinition,
3573
- radioItemDefinition,
3574
- fileUploadDefinition,
3575
- collectionDefinition,
3576
- listDefinition,
3577
- listItemDefinition,
3578
- tableDefinition,
3579
- tableRowDefinition,
3580
- tableCellDefinition,
3581
- modalDefinition,
3582
- drawerDefinition,
3583
- collapsibleDefinition
3584
- ];
3585
- function createDefaultComponentRegistry() {
3586
- const registry = new ComponentRegistry();
3587
- for (const def of coreComponentDefinitions) {
3588
- registry.register(def);
3589
- }
3590
- return registry;
3591
- }
3592
-
3593
- // src/requirements.ts
3594
- function extractComponentRequirements(root, registry) {
3595
- const requiredComponents = /* @__PURE__ */ new Set();
3596
- const requiredCapabilities = /* @__PURE__ */ new Set();
3597
- const visit = (node) => {
3598
- const definition = registry.get(node.type);
3599
- if (definition?.category === "custom") {
3600
- requiredComponents.add(node.type);
3602
+ // src/definitions/conversion/countdown.ts
3603
+ var import_schema24 = require("@kubuild/schema");
3604
+ var COUNTDOWN_MODES = ["evergreen", "fixed"];
3605
+ var COUNTDOWN_FORMATS = ["mm:ss", "hh:mm:ss", "d h m s"];
3606
+ var COUNTDOWN_EXPIRE_BEHAVIORS = ["text", "hide", "zero"];
3607
+ var COUNTDOWN_STORAGE_TYPES = ["session", "local"];
3608
+ var countdownDefinition = {
3609
+ type: "countdown",
3610
+ label: "Countdown",
3611
+ category: "interactive",
3612
+ icon: "clock",
3613
+ description: "Urgency timer for limited offers (evergreen per-visitor or fixed deadline).",
3614
+ acceptsChildren: false,
3615
+ defaultProps: {
3616
+ mode: "evergreen",
3617
+ durationMinutes: 15,
3618
+ targetDate: "",
3619
+ timezone: "UTC",
3620
+ format: "hh:mm:ss",
3621
+ label: "",
3622
+ labelDays: "Days",
3623
+ labelHours: "Hours",
3624
+ labelMinutes: "Minutes",
3625
+ labelSeconds: "Seconds",
3626
+ expireBehavior: "text",
3627
+ expiredText: "This offer has expired.",
3628
+ storage: "session",
3629
+ storageKey: ""
3630
+ },
3631
+ propFields: [
3632
+ {
3633
+ name: "mode",
3634
+ label: "Mode",
3635
+ type: "select",
3636
+ defaultValue: "evergreen",
3637
+ options: [
3638
+ { label: "Evergreen (per visitor)", value: "evergreen" },
3639
+ { label: "Fixed date", value: "fixed" }
3640
+ ]
3641
+ },
3642
+ {
3643
+ name: "durationMinutes",
3644
+ label: "Duration (minutes)",
3645
+ type: "number",
3646
+ defaultValue: 15,
3647
+ description: "Evergreen mode: how long each visitor gets from their first view."
3648
+ },
3649
+ {
3650
+ name: "targetDate",
3651
+ label: "Target Date/Time",
3652
+ type: "string",
3653
+ defaultValue: "",
3654
+ description: 'Fixed mode: wall-clock time "YYYY-MM-DDTHH:mm" in the selected timezone.'
3655
+ },
3656
+ {
3657
+ name: "timezone",
3658
+ label: "Timezone",
3659
+ type: "string",
3660
+ defaultValue: "UTC",
3661
+ description: 'Fixed mode: IANA timezone name, e.g. "Asia/Jakarta" or "Europe/London".'
3662
+ },
3663
+ {
3664
+ name: "format",
3665
+ label: "Format",
3666
+ type: "select",
3667
+ defaultValue: "hh:mm:ss",
3668
+ options: [
3669
+ { label: "mm:ss", value: "mm:ss" },
3670
+ { label: "hh:mm:ss", value: "hh:mm:ss" },
3671
+ { label: "d h m s (unit blocks)", value: "d h m s" }
3672
+ ]
3673
+ },
3674
+ {
3675
+ name: "label",
3676
+ label: "Label",
3677
+ type: "string",
3678
+ defaultValue: "",
3679
+ description: 'Optional text shown before the timer, e.g. "Offer ends in".'
3680
+ },
3681
+ { name: "labelDays", label: "Days Label", type: "string", defaultValue: "Days" },
3682
+ { name: "labelHours", label: "Hours Label", type: "string", defaultValue: "Hours" },
3683
+ { name: "labelMinutes", label: "Minutes Label", type: "string", defaultValue: "Minutes" },
3684
+ { name: "labelSeconds", label: "Seconds Label", type: "string", defaultValue: "Seconds" },
3685
+ {
3686
+ name: "expireBehavior",
3687
+ label: "When Expired",
3688
+ type: "select",
3689
+ defaultValue: "text",
3690
+ options: [
3691
+ { label: "Show expired text", value: "text" },
3692
+ { label: "Hide timer", value: "hide" },
3693
+ { label: "Keep showing zeros", value: "zero" }
3694
+ ],
3695
+ description: 'Add an "On Expire" action pipeline to redirect, show a toast, open a modal, etc.'
3696
+ },
3697
+ {
3698
+ name: "expiredText",
3699
+ label: "Expired Text",
3700
+ type: "string",
3701
+ defaultValue: "This offer has expired."
3702
+ },
3703
+ {
3704
+ name: "storage",
3705
+ label: "Evergreen Storage",
3706
+ type: "select",
3707
+ defaultValue: "session",
3708
+ options: [
3709
+ { label: "Session (per browser session)", value: "session" },
3710
+ { label: "Local (persists across visits)", value: "local" }
3711
+ ]
3712
+ },
3713
+ {
3714
+ name: "storageKey",
3715
+ label: "Storage Key",
3716
+ type: "string",
3717
+ defaultValue: "",
3718
+ description: "Share one deadline across pages by using the same key (defaults to the node id)."
3601
3719
  }
3602
- for (const capability of definition?.capabilities ?? []) {
3603
- requiredCapabilities.add(capability);
3720
+ ],
3721
+ traits: [
3722
+ idTrait(),
3723
+ ariaLabelTrait({ description: 'Accessible name for the timer, e.g. "Offer ends in".' })
3724
+ ],
3725
+ defaultStyles: {
3726
+ base: {
3727
+ display: "flex",
3728
+ alignItems: "center",
3729
+ justifyContent: "center",
3730
+ gap: "12px",
3731
+ fontSize: "28px",
3732
+ fontWeight: "700",
3733
+ fontVariantNumeric: "tabular-nums"
3604
3734
  }
3605
- node.children?.forEach(visit);
3606
- };
3607
- visit(root);
3608
- return {
3609
- requiredComponents: Array.from(requiredComponents),
3610
- requiredCapabilities: Array.from(requiredCapabilities)
3611
- };
3612
- }
3613
-
3614
- // src/prop-types.ts
3735
+ },
3736
+ validateProps: (props) => {
3737
+ const errors = [];
3738
+ const checkEnum = (name, allowed) => {
3739
+ const value = props[name];
3740
+ if (value === void 0 || (0, import_schema24.isVariableBinding)(value)) return;
3741
+ if (typeof value !== "string" || !allowed.includes(value)) {
3742
+ errors.push(`Countdown "${name}" must be one of: ${allowed.join(", ")}.`);
3743
+ }
3744
+ };
3745
+ checkEnum("mode", COUNTDOWN_MODES);
3746
+ checkEnum("format", COUNTDOWN_FORMATS);
3747
+ checkEnum("expireBehavior", COUNTDOWN_EXPIRE_BEHAVIORS);
3748
+ checkEnum("storage", COUNTDOWN_STORAGE_TYPES);
3749
+ const duration = props.durationMinutes;
3750
+ if (duration !== void 0 && !(0, import_schema24.isVariableBinding)(duration)) {
3751
+ if (typeof duration !== "number" || !Number.isFinite(duration) || duration < 0) {
3752
+ errors.push('Countdown "durationMinutes" must be a non-negative number.');
3753
+ }
3754
+ }
3755
+ return errors;
3756
+ }
3757
+ };
3758
+
3759
+ // src/definitions/conversion/accordion.ts
3760
+ var import_schema25 = require("@kubuild/schema");
3761
+ var accordionDefinition = {
3762
+ type: "accordion",
3763
+ label: "Accordion",
3764
+ category: "interactive",
3765
+ icon: "chevron-down",
3766
+ description: "Group of expandable items (FAQ) with single- or multi-open behavior.",
3767
+ acceptsChildren: true,
3768
+ allowedChildren: ["accordion-item"],
3769
+ defaultProps: {
3770
+ allowMultiple: false,
3771
+ defaultOpenIndex: 0,
3772
+ icon: "chevron",
3773
+ faqSchema: false
3774
+ },
3775
+ defaultChildren: [
3776
+ {
3777
+ type: "accordion-item",
3778
+ props: { title: "What is included?" },
3779
+ children: [{ type: "paragraph", props: { text: "Everything you need to get started." } }]
3780
+ },
3781
+ {
3782
+ type: "accordion-item",
3783
+ props: { title: "Can I get a refund?" },
3784
+ children: [{ type: "paragraph", props: { text: "Yes, within 30 days of purchase." } }]
3785
+ },
3786
+ {
3787
+ type: "accordion-item",
3788
+ props: { title: "How do I get access?" },
3789
+ children: [
3790
+ { type: "paragraph", props: { text: "You receive an email right after checkout." } }
3791
+ ]
3792
+ }
3793
+ ],
3794
+ propFields: [
3795
+ {
3796
+ name: "allowMultiple",
3797
+ label: "Allow Multiple Open",
3798
+ type: "boolean",
3799
+ defaultValue: false,
3800
+ description: "When off, opening an item closes the others."
3801
+ },
3802
+ {
3803
+ name: "defaultOpenIndex",
3804
+ label: "Default Open Item",
3805
+ type: "number",
3806
+ defaultValue: 0,
3807
+ description: "Zero-based index of the item open on first render (-1 = all closed)."
3808
+ },
3809
+ {
3810
+ name: "icon",
3811
+ label: "Icon",
3812
+ type: "select",
3813
+ defaultValue: "chevron",
3814
+ options: [
3815
+ { label: "Chevron", value: "chevron" },
3816
+ { label: "Plus / Minus", value: "plus" },
3817
+ { label: "None", value: "none" }
3818
+ ]
3819
+ },
3820
+ {
3821
+ name: "faqSchema",
3822
+ label: "Output FAQPage JSON-LD",
3823
+ type: "boolean",
3824
+ defaultValue: false,
3825
+ description: "Emits schema.org FAQPage structured data on the published page for SEO."
3826
+ }
3827
+ ],
3828
+ traits: [idTrait(), ariaLabelTrait({ description: "Accessible name for the accordion group." })],
3829
+ defaultStyles: {
3830
+ base: {
3831
+ display: "flex",
3832
+ flexDirection: "column",
3833
+ width: "100%",
3834
+ borderTop: "1px solid #e2e8f0"
3835
+ }
3836
+ },
3837
+ validateProps: (props) => {
3838
+ const errors = [];
3839
+ const idx = props.defaultOpenIndex;
3840
+ if (idx !== void 0 && !(0, import_schema25.isVariableBinding)(idx) && (typeof idx !== "number" || !Number.isInteger(idx))) {
3841
+ errors.push('Accordion "defaultOpenIndex" must be an integer.');
3842
+ }
3843
+ return errors;
3844
+ }
3845
+ };
3846
+ var accordionItemDefinition = {
3847
+ type: "accordion-item",
3848
+ label: "Accordion Item",
3849
+ category: "interactive",
3850
+ icon: "chevron-right",
3851
+ description: "One question/answer row of an accordion: a title header plus content children.",
3852
+ acceptsChildren: true,
3853
+ allowedChildren: ["container", "columns", "flex", "grid", ...CONTENT_CHILD_TYPES],
3854
+ defaultProps: {
3855
+ title: "Question"
3856
+ },
3857
+ defaultChildren: [{ type: "paragraph", props: { text: "Answer goes here." } }],
3858
+ propFields: [{ name: "title", label: "Title", type: "string", defaultValue: "Question" }],
3859
+ traits: [idTrait()],
3860
+ defaultStyles: {
3861
+ base: {
3862
+ borderBottom: "1px solid #e2e8f0"
3863
+ }
3864
+ }
3865
+ };
3866
+
3867
+ // src/definitions/conversion/tabs.ts
3868
+ var import_schema26 = require("@kubuild/schema");
3869
+ var tabsDefinition = {
3870
+ type: "tabs",
3871
+ label: "Tabs",
3872
+ category: "interactive",
3873
+ icon: "tabs",
3874
+ description: "Tabbed content for product variants, specifications, or plan comparison.",
3875
+ acceptsChildren: true,
3876
+ allowedChildren: ["tab-panel"],
3877
+ defaultProps: {
3878
+ activeIndex: 0
3879
+ },
3880
+ defaultChildren: [
3881
+ {
3882
+ type: "tab-panel",
3883
+ props: { label: "Tab 1" },
3884
+ children: [{ type: "paragraph", props: { text: "Content for the first tab." } }]
3885
+ },
3886
+ {
3887
+ type: "tab-panel",
3888
+ props: { label: "Tab 2" },
3889
+ children: [{ type: "paragraph", props: { text: "Content for the second tab." } }]
3890
+ }
3891
+ ],
3892
+ propFields: [
3893
+ {
3894
+ name: "activeIndex",
3895
+ label: "Active Tab",
3896
+ type: "number",
3897
+ defaultValue: 0,
3898
+ description: "Zero-based index of the tab shown initially."
3899
+ }
3900
+ ],
3901
+ traits: [idTrait(), ariaLabelTrait({ description: "Accessible name for the tab list." })],
3902
+ defaultStyles: {
3903
+ base: {
3904
+ display: "flex",
3905
+ flexDirection: "column",
3906
+ width: "100%"
3907
+ }
3908
+ },
3909
+ validateProps: (props) => {
3910
+ const errors = [];
3911
+ const idx = props.activeIndex;
3912
+ if (idx !== void 0 && !(0, import_schema26.isVariableBinding)(idx) && (typeof idx !== "number" || !Number.isInteger(idx) || idx < 0)) {
3913
+ errors.push('Tabs "activeIndex" must be a non-negative integer.');
3914
+ }
3915
+ return errors;
3916
+ }
3917
+ };
3918
+ var tabPanelDefinition = {
3919
+ type: "tab-panel",
3920
+ label: "Tab Panel",
3921
+ category: "interactive",
3922
+ icon: "layout",
3923
+ description: "Content of a single tab; its label is shown in the tab list.",
3924
+ acceptsChildren: true,
3925
+ allowedChildren: ["container", "columns", "flex", "grid", ...CONTENT_CHILD_TYPES],
3926
+ defaultProps: {
3927
+ label: "Tab"
3928
+ },
3929
+ defaultChildren: [{ type: "paragraph", props: { text: "Tab content." } }],
3930
+ propFields: [{ name: "label", label: "Tab Label", type: "string", defaultValue: "Tab" }],
3931
+ traits: [idTrait()],
3932
+ defaultStyles: {
3933
+ base: {
3934
+ paddingTop: "16px"
3935
+ }
3936
+ }
3937
+ };
3938
+
3939
+ // src/definitions/conversion/carousel.ts
3940
+ var import_schema27 = require("@kubuild/schema");
3941
+ var carouselDefinition = {
3942
+ type: "carousel",
3943
+ label: "Carousel",
3944
+ category: "interactive",
3945
+ icon: "carousel",
3946
+ description: "Slider for product galleries and testimonials; each child is a slide.",
3947
+ acceptsChildren: true,
3948
+ allowedChildren: ["*"],
3949
+ defaultProps: {
3950
+ autoplay: false,
3951
+ interval: 5e3,
3952
+ loop: true,
3953
+ showDots: true,
3954
+ showArrows: true
3955
+ },
3956
+ defaultChildren: [
3957
+ { type: "container", children: [{ type: "paragraph", props: { text: "Slide 1" } }] },
3958
+ { type: "container", children: [{ type: "paragraph", props: { text: "Slide 2" } }] },
3959
+ { type: "container", children: [{ type: "paragraph", props: { text: "Slide 3" } }] }
3960
+ ],
3961
+ propFields: [
3962
+ { name: "autoplay", label: "Autoplay", type: "boolean", defaultValue: false },
3963
+ { name: "interval", label: "Autoplay Interval (ms)", type: "number", defaultValue: 5e3 },
3964
+ { name: "loop", label: "Loop", type: "boolean", defaultValue: true },
3965
+ { name: "showDots", label: "Show Dots", type: "boolean", defaultValue: true },
3966
+ { name: "showArrows", label: "Show Arrows", type: "boolean", defaultValue: true }
3967
+ ],
3968
+ traits: [
3969
+ idTrait(),
3970
+ ariaLabelTrait({ description: 'Accessible name for the carousel, e.g. "Testimonials".' })
3971
+ ],
3972
+ defaultStyles: {
3973
+ base: {
3974
+ position: "relative",
3975
+ width: "100%",
3976
+ overflow: "hidden"
3977
+ }
3978
+ },
3979
+ validateProps: (props) => {
3980
+ const errors = [];
3981
+ const interval = props.interval;
3982
+ if (interval !== void 0 && !(0, import_schema27.isVariableBinding)(interval) && (typeof interval !== "number" || !(interval > 0))) {
3983
+ errors.push('Carousel "interval" must be a positive number of milliseconds.');
3984
+ }
3985
+ return errors;
3986
+ }
3987
+ };
3988
+
3989
+ // src/definitions/conversion/rating.ts
3990
+ var import_schema28 = require("@kubuild/schema");
3991
+ var ratingDefinition = {
3992
+ type: "rating",
3993
+ label: "Rating",
3994
+ category: "media",
3995
+ icon: "star",
3996
+ description: "Read-only star rating with half-star support.",
3997
+ acceptsChildren: false,
3998
+ defaultProps: {
3999
+ value: 5,
4000
+ max: 5,
4001
+ size: 20,
4002
+ color: "#f59e0b",
4003
+ emptyColor: "#e2e8f0",
4004
+ labelTemplate: "{value} out of {max}"
4005
+ },
4006
+ propFields: [
4007
+ {
4008
+ name: "value",
4009
+ label: "Value",
4010
+ type: "number",
4011
+ defaultValue: 5,
4012
+ description: "Rounded to the nearest half star."
4013
+ },
4014
+ { name: "max", label: "Max Stars", type: "number", defaultValue: 5 },
4015
+ { name: "size", label: "Star Size (px)", type: "number", defaultValue: 20 },
4016
+ { name: "color", label: "Color", type: "color", defaultValue: "#f59e0b" },
4017
+ { name: "emptyColor", label: "Empty Color", type: "color", defaultValue: "#e2e8f0" },
4018
+ {
4019
+ name: "labelTemplate",
4020
+ label: "Accessible Label",
4021
+ type: "string",
4022
+ defaultValue: "{value} out of {max}",
4023
+ description: 'Screen reader text; {value} and {max} are replaced (e.g. "{value} dari {max}").'
4024
+ }
4025
+ ],
4026
+ traits: [idTrait()],
4027
+ defaultStyles: {
4028
+ base: {
4029
+ display: "inline-flex",
4030
+ alignItems: "center",
4031
+ gap: "2px"
4032
+ }
4033
+ },
4034
+ validateProps: (props) => {
4035
+ const errors = [];
4036
+ for (const name of ["value", "max", "size"]) {
4037
+ const v = props[name];
4038
+ if (v !== void 0 && !(0, import_schema28.isVariableBinding)(v) && (typeof v !== "number" || !Number.isFinite(v) || v < 0)) {
4039
+ errors.push(`Rating "${name}" must be a non-negative number.`);
4040
+ }
4041
+ }
4042
+ return errors;
4043
+ }
4044
+ };
4045
+
4046
+ // src/definitions/conversion/divider.ts
4047
+ var import_schema29 = require("@kubuild/schema");
4048
+ var dividerDefinition = {
4049
+ type: "divider",
4050
+ label: "Divider",
4051
+ category: "layout",
4052
+ icon: "divider",
4053
+ description: "Horizontal rule (solid/dashed/dotted) with an optional centered label.",
4054
+ acceptsChildren: false,
4055
+ defaultProps: {
4056
+ lineStyle: "solid",
4057
+ thickness: 1,
4058
+ color: "#e2e8f0",
4059
+ label: ""
4060
+ },
4061
+ propFields: [
4062
+ {
4063
+ name: "lineStyle",
4064
+ label: "Line Style",
4065
+ type: "select",
4066
+ defaultValue: "solid",
4067
+ options: [
4068
+ { label: "Solid", value: "solid" },
4069
+ { label: "Dashed", value: "dashed" },
4070
+ { label: "Dotted", value: "dotted" }
4071
+ ]
4072
+ },
4073
+ { name: "thickness", label: "Thickness (px)", type: "number", defaultValue: 1 },
4074
+ { name: "color", label: "Color", type: "color", defaultValue: "#e2e8f0" },
4075
+ {
4076
+ name: "label",
4077
+ label: "Center Label",
4078
+ type: "string",
4079
+ defaultValue: "",
4080
+ description: 'Optional text in the middle of the line, e.g. "OR".'
4081
+ }
4082
+ ],
4083
+ traits: [idTrait()],
4084
+ defaultStyles: {
4085
+ base: {
4086
+ width: "100%",
4087
+ marginTop: "16px",
4088
+ marginBottom: "16px"
4089
+ }
4090
+ },
4091
+ validateProps: (props) => {
4092
+ const v = props.lineStyle;
4093
+ if (v !== void 0 && !(0, import_schema29.isVariableBinding)(v) && !["solid", "dashed", "dotted"].includes(v)) {
4094
+ return ['Divider "lineStyle" must be one of: solid, dashed, dotted.'];
4095
+ }
4096
+ return [];
4097
+ }
4098
+ };
4099
+ var spacerDefinition = {
4100
+ type: "spacer",
4101
+ label: "Spacer",
4102
+ category: "layout",
4103
+ icon: "dimension",
4104
+ description: "Empty vertical space; height is responsive per breakpoint.",
4105
+ acceptsChildren: false,
4106
+ defaultProps: {},
4107
+ traits: [idTrait()],
4108
+ defaultStyles: {
4109
+ base: {
4110
+ width: "100%",
4111
+ height: "48px"
4112
+ },
4113
+ tablet: {
4114
+ height: "32px"
4115
+ },
4116
+ mobile: {
4117
+ height: "24px"
4118
+ }
4119
+ }
4120
+ };
4121
+
4122
+ // src/definitions/index.ts
4123
+ var coreComponentDefinitions = [
4124
+ pageDefinition,
4125
+ sectionDefinition,
4126
+ containerDefinition,
4127
+ columnsDefinition,
4128
+ flexDefinition,
4129
+ gridDefinition,
4130
+ headingDefinition,
4131
+ textDefinition,
4132
+ paragraphDefinition,
4133
+ linkDefinition,
4134
+ blockquoteDefinition,
4135
+ badgeDefinition,
4136
+ codeBlockDefinition,
4137
+ imageDefinition,
4138
+ videoDefinition,
4139
+ iconDefinition,
4140
+ htmlEmbedDefinition,
4141
+ buttonDefinition,
4142
+ buttonSubmitDefinition,
4143
+ formDefinition,
4144
+ inputDefinition,
4145
+ textareaDefinition,
4146
+ selectDefinition,
4147
+ checkboxDefinition,
4148
+ switchDefinition,
4149
+ radioGroupDefinition,
4150
+ radioDefinition,
4151
+ radioItemDefinition,
4152
+ fileUploadDefinition,
4153
+ collectionDefinition,
4154
+ listDefinition,
4155
+ listItemDefinition,
4156
+ tableDefinition,
4157
+ tableRowDefinition,
4158
+ tableCellDefinition,
4159
+ modalDefinition,
4160
+ drawerDefinition,
4161
+ collapsibleDefinition,
4162
+ // Conversion components (Epic 60)
4163
+ countdownDefinition,
4164
+ accordionDefinition,
4165
+ accordionItemDefinition,
4166
+ tabsDefinition,
4167
+ tabPanelDefinition,
4168
+ carouselDefinition,
4169
+ ratingDefinition,
4170
+ dividerDefinition,
4171
+ spacerDefinition
4172
+ ];
4173
+ function createDefaultComponentRegistry() {
4174
+ const registry = new ComponentRegistry();
4175
+ for (const def of coreComponentDefinitions) {
4176
+ registry.register(def);
4177
+ }
4178
+ return registry;
4179
+ }
4180
+
4181
+ // src/requirements.ts
4182
+ function extractComponentRequirements(root, registry) {
4183
+ const requiredComponents = /* @__PURE__ */ new Set();
4184
+ const requiredCapabilities = /* @__PURE__ */ new Set();
4185
+ const visit = (node) => {
4186
+ const definition = registry.get(node.type);
4187
+ if (definition?.category === "custom") {
4188
+ requiredComponents.add(node.type);
4189
+ }
4190
+ for (const capability of definition?.capabilities ?? []) {
4191
+ requiredCapabilities.add(capability);
4192
+ }
4193
+ node.children?.forEach(visit);
4194
+ };
4195
+ visit(root);
4196
+ return {
4197
+ requiredComponents: Array.from(requiredComponents),
4198
+ requiredCapabilities: Array.from(requiredCapabilities)
4199
+ };
4200
+ }
4201
+
4202
+ // src/prop-types.ts
3615
4203
  function primitiveTypeForField(field) {
3616
4204
  switch (field.type) {
3617
4205
  case "string":
@@ -4218,7 +4806,7 @@ var UI_STARTER_BLOCKS = [
4218
4806
  id: gen("paragraph"),
4219
4807
  type: "paragraph",
4220
4808
  props: {
4221
- content: "A visual builder designed for maximum craft, responsiveness, and performance."
4809
+ text: "A visual builder designed for maximum craft, responsiveness, and performance."
4222
4810
  },
4223
4811
  styles: {
4224
4812
  base: {
@@ -4276,7 +4864,7 @@ var UI_STARTER_BLOCKS = [
4276
4864
  {
4277
4865
  id: gen("badge"),
4278
4866
  type: "badge",
4279
- props: { label: "PRO FEATURE", variant: "primary" },
4867
+ props: { text: "PRO FEATURE", variant: "primary" },
4280
4868
  styles: { base: { marginBottom: "12px", display: "inline-block" } }
4281
4869
  },
4282
4870
  {
@@ -4291,7 +4879,7 @@ var UI_STARTER_BLOCKS = [
4291
4879
  id: gen("paragraph"),
4292
4880
  type: "paragraph",
4293
4881
  props: {
4294
- content: "Engineered for sub-millisecond render updates and zero runtime overhead."
4882
+ text: "Engineered for sub-millisecond render updates and zero runtime overhead."
4295
4883
  },
4296
4884
  styles: { base: { fontSize: "14px", color: "#64748b", lineHeight: "1.5" } }
4297
4885
  }
@@ -4355,7 +4943,7 @@ var UI_STARTER_BLOCKS = [
4355
4943
  {
4356
4944
  id: gen("paragraph"),
4357
4945
  type: "paragraph",
4358
- props: { content: "High dynamic range gradients crafted for modern presentations." },
4946
+ props: { text: "High dynamic range gradients crafted for modern presentations." },
4359
4947
  styles: { base: { fontSize: "13px", color: "#64748b", lineHeight: "1.4" } }
4360
4948
  }
4361
4949
  ]
@@ -4389,7 +4977,7 @@ var UI_STARTER_BLOCKS = [
4389
4977
  {
4390
4978
  id: gen("badge"),
4391
4979
  type: "badge",
4392
- props: { label: "MOST POPULAR", variant: "primary" },
4980
+ props: { text: "MOST POPULAR", variant: "primary" },
4393
4981
  styles: { base: { marginBottom: "12px", display: "inline-block" } }
4394
4982
  },
4395
4983
  {
@@ -4409,7 +4997,7 @@ var UI_STARTER_BLOCKS = [
4409
4997
  {
4410
4998
  id: gen("paragraph"),
4411
4999
  type: "paragraph",
4412
- props: { content: "Includes unlimited pages, custom domains, and team collaboration." },
5000
+ props: { text: "Includes unlimited pages, custom domains, and team collaboration." },
4413
5001
  styles: { base: { fontSize: "14px", color: "#64748b", marginBottom: "24px" } }
4414
5002
  },
4415
5003
  {
@@ -4466,7 +5054,7 @@ var UI_STARTER_BLOCKS = [
4466
5054
  {
4467
5055
  id: gen("paragraph"),
4468
5056
  type: "paragraph",
4469
- props: { content: "Start building with zero installation and instant live preview." },
5057
+ props: { text: "Start building with zero installation and instant live preview." },
4470
5058
  styles: {
4471
5059
  base: { fontSize: "16px", color: "#94a3b8", marginBottom: "24px", maxWidth: "600px", margin: "0 auto 24px auto" }
4472
5060
  }
@@ -4549,7 +5137,7 @@ var FORM_STARTER_BLOCKS = [
4549
5137
  id: gen("paragraph"),
4550
5138
  type: "paragraph",
4551
5139
  props: {
4552
- content: "Have questions or need assistance? Fill out the form below and we will get back to you shortly."
5140
+ text: "Have questions or need assistance? Fill out the form below and we will get back to you shortly."
4553
5141
  },
4554
5142
  styles: {
4555
5143
  base: {
@@ -4807,7 +5395,7 @@ var FORM_STARTER_BLOCKS = [
4807
5395
  id: gen("paragraph"),
4808
5396
  type: "paragraph",
4809
5397
  props: {
4810
- content: "Subscribe to our newsletter for weekly curated insights, updates, and best practices."
5398
+ text: "Subscribe to our newsletter for weekly curated insights, updates, and best practices."
4811
5399
  },
4812
5400
  styles: {
4813
5401
  base: {
@@ -4985,7 +5573,7 @@ var FORM_STARTER_BLOCKS = [
4985
5573
  {
4986
5574
  id: gen("badge"),
4987
5575
  type: "badge",
4988
- props: { label: "FREE CONSULTATION", variant: "primary" },
5576
+ props: { text: "FREE CONSULTATION", variant: "primary" },
4989
5577
  styles: { base: { marginBottom: "12px", display: "inline-block" } }
4990
5578
  },
4991
5579
  {
@@ -5005,7 +5593,7 @@ var FORM_STARTER_BLOCKS = [
5005
5593
  id: gen("paragraph"),
5006
5594
  type: "paragraph",
5007
5595
  props: {
5008
- content: "Share your project details with our solutions team. We will analyze your needs and provide a personalized roadmap."
5596
+ text: "Share your project details with our solutions team. We will analyze your needs and provide a personalized roadmap."
5009
5597
  },
5010
5598
  styles: {
5011
5599
  base: {
@@ -5246,24 +5834,618 @@ var FORM_STARTER_BLOCKS = [
5246
5834
  }
5247
5835
  ];
5248
5836
 
5837
+ // src/blocks/sales.ts
5838
+ var SALES_CATEGORY = "sales";
5839
+ var SALES_CATEGORY_LABEL = "Sales & Conversion";
5840
+ function sectionShell(gen, children, sectionStyles = {}, maxWidth = "960px") {
5841
+ return {
5842
+ id: gen("section"),
5843
+ type: "section",
5844
+ styles: {
5845
+ ...sectionStyles,
5846
+ base: {
5847
+ paddingTop: "64px",
5848
+ paddingBottom: "64px",
5849
+ paddingLeft: "24px",
5850
+ paddingRight: "24px",
5851
+ width: "100%",
5852
+ ...sectionStyles.base ?? {}
5853
+ },
5854
+ mobile: {
5855
+ paddingTop: "40px",
5856
+ paddingBottom: "40px",
5857
+ paddingLeft: "16px",
5858
+ paddingRight: "16px",
5859
+ ...sectionStyles.mobile ?? {}
5860
+ }
5861
+ },
5862
+ children: [
5863
+ {
5864
+ id: gen("container"),
5865
+ type: "container",
5866
+ props: { tag: "div" },
5867
+ styles: {
5868
+ base: {
5869
+ maxWidth,
5870
+ margin: "0 auto",
5871
+ width: "100%",
5872
+ display: "flex",
5873
+ flexDirection: "column",
5874
+ gap: "24px"
5875
+ }
5876
+ },
5877
+ children
5878
+ }
5879
+ ]
5880
+ };
5881
+ }
5882
+ function sectionHeading(gen, text, subtitle, color = "#0f172a") {
5883
+ const nodes = [
5884
+ {
5885
+ id: gen("heading"),
5886
+ type: "heading",
5887
+ props: { text, level: 2 },
5888
+ styles: {
5889
+ base: { fontSize: "32px", fontWeight: "800", color, textAlign: "center", margin: "0" },
5890
+ mobile: { fontSize: "26px" }
5891
+ }
5892
+ }
5893
+ ];
5894
+ if (subtitle) {
5895
+ nodes.push({
5896
+ id: gen("paragraph"),
5897
+ type: "paragraph",
5898
+ props: { text: subtitle },
5899
+ styles: { base: { fontSize: "16px", color: "#64748b", textAlign: "center", margin: "0" } }
5900
+ });
5901
+ }
5902
+ return nodes;
5903
+ }
5904
+ function faqItem(gen, question, answer) {
5905
+ return {
5906
+ id: gen("accordion-item"),
5907
+ type: "accordion-item",
5908
+ props: { title: question },
5909
+ styles: { base: { borderBottom: "1px solid #e2e8f0" } },
5910
+ children: [
5911
+ {
5912
+ id: gen("paragraph"),
5913
+ type: "paragraph",
5914
+ props: { text: answer },
5915
+ styles: { base: { fontSize: "15px", color: "#475569", margin: "0", lineHeight: "1.6" } }
5916
+ }
5917
+ ]
5918
+ };
5919
+ }
5920
+ function testimonialSlide(gen, quote, name, role, rating) {
5921
+ return {
5922
+ id: gen("flex"),
5923
+ type: "flex",
5924
+ styles: {
5925
+ base: {
5926
+ display: "flex",
5927
+ flexDirection: "column",
5928
+ alignItems: "center",
5929
+ gap: "16px",
5930
+ padding: "32px 48px",
5931
+ textAlign: "center"
5932
+ },
5933
+ mobile: { padding: "24px 40px" }
5934
+ },
5935
+ children: [
5936
+ {
5937
+ id: gen("rating"),
5938
+ type: "rating",
5939
+ props: { value: rating, max: 5, size: 20, color: "#f59e0b" }
5940
+ },
5941
+ {
5942
+ id: gen("blockquote"),
5943
+ type: "blockquote",
5944
+ props: { text: quote },
5945
+ styles: {
5946
+ base: {
5947
+ fontSize: "18px",
5948
+ color: "#0f172a",
5949
+ fontStyle: "italic",
5950
+ margin: "0",
5951
+ lineHeight: "1.6"
5952
+ }
5953
+ }
5954
+ },
5955
+ {
5956
+ id: gen("text"),
5957
+ type: "text",
5958
+ props: { text: `${name} \u2014 ${role}` },
5959
+ styles: { base: { fontSize: "14px", fontWeight: "600", color: "#64748b" } }
5960
+ }
5961
+ ]
5962
+ };
5963
+ }
5964
+ function badgeItem(gen, iconName, label) {
5965
+ return {
5966
+ id: gen("flex"),
5967
+ type: "flex",
5968
+ styles: {
5969
+ base: {
5970
+ display: "flex",
5971
+ flexDirection: "column",
5972
+ alignItems: "center",
5973
+ gap: "8px",
5974
+ padding: "16px",
5975
+ textAlign: "center"
5976
+ }
5977
+ },
5978
+ children: [
5979
+ {
5980
+ id: gen("icon"),
5981
+ type: "icon",
5982
+ props: { name: iconName, size: 28, color: "#16a34a", ariaLabel: label }
5983
+ },
5984
+ {
5985
+ id: gen("text"),
5986
+ type: "text",
5987
+ props: { text: label },
5988
+ styles: { base: { fontSize: "14px", fontWeight: "600", color: "#334155" } }
5989
+ }
5990
+ ]
5991
+ };
5992
+ }
5993
+ function planCard(gen, name, price, features, highlighted) {
5994
+ return {
5995
+ id: gen("container"),
5996
+ type: "container",
5997
+ props: { tag: "div" },
5998
+ styles: {
5999
+ base: {
6000
+ display: "flex",
6001
+ flexDirection: "column",
6002
+ gap: "12px",
6003
+ padding: "28px 24px",
6004
+ backgroundColor: "#ffffff",
6005
+ borderRadius: "16px",
6006
+ border: highlighted ? "2px solid #2563eb" : "1px solid #e2e8f0"
6007
+ }
6008
+ },
6009
+ children: [
6010
+ {
6011
+ id: gen("heading"),
6012
+ type: "heading",
6013
+ props: { text: name, level: 3 },
6014
+ styles: { base: { fontSize: "20px", fontWeight: "700", color: "#0f172a", margin: "0" } }
6015
+ },
6016
+ {
6017
+ id: gen("heading"),
6018
+ type: "heading",
6019
+ props: { text: price, level: 4 },
6020
+ styles: { base: { fontSize: "32px", fontWeight: "800", color: "#2563eb", margin: "0" } }
6021
+ },
6022
+ {
6023
+ id: gen("list"),
6024
+ type: "list",
6025
+ props: { tag: "ul", listStyleType: "disc" },
6026
+ styles: { base: { fontSize: "14px", color: "#475569", paddingLeft: "20px", margin: "0" } },
6027
+ children: features.map((feature) => ({
6028
+ id: gen("list-item"),
6029
+ type: "list-item",
6030
+ props: { text: feature }
6031
+ }))
6032
+ },
6033
+ {
6034
+ id: gen("button"),
6035
+ type: "button",
6036
+ props: {
6037
+ label: `Choose ${name}`,
6038
+ href: "#checkout",
6039
+ variant: highlighted ? "primary" : "secondary"
6040
+ },
6041
+ styles: {
6042
+ base: {
6043
+ width: "100%",
6044
+ padding: "12px",
6045
+ borderRadius: "8px",
6046
+ fontWeight: "600",
6047
+ marginTop: "8px"
6048
+ }
6049
+ }
6050
+ }
6051
+ ]
6052
+ };
6053
+ }
6054
+ function planColumns(gen, plans) {
6055
+ return {
6056
+ id: gen("columns"),
6057
+ type: "columns",
6058
+ props: { columns: plans.length, gap: "16px" },
6059
+ styles: {
6060
+ base: {
6061
+ display: "grid",
6062
+ gridTemplateColumns: `repeat(${plans.length}, minmax(0, 1fr))`,
6063
+ gap: "16px"
6064
+ },
6065
+ mobile: { gridTemplateColumns: "repeat(1, minmax(0, 1fr))" }
6066
+ },
6067
+ children: plans.map(
6068
+ ([name, price, features, highlighted]) => planCard(gen, name, price, features, highlighted)
6069
+ )
6070
+ };
6071
+ }
6072
+ var SALES_STARTER_BLOCKS = [
6073
+ {
6074
+ id: "sales-faq",
6075
+ name: "FAQ",
6076
+ category: SALES_CATEGORY,
6077
+ categoryLabel: SALES_CATEGORY_LABEL,
6078
+ description: "Frequently asked questions accordion with FAQPage structured data for SEO",
6079
+ icon: "chevron-down",
6080
+ createNodeTree: (gen = defaultGenId) => sectionShell(
6081
+ gen,
6082
+ [
6083
+ ...sectionHeading(
6084
+ gen,
6085
+ "Frequently Asked Questions",
6086
+ "Everything you need to know before you buy."
6087
+ ),
6088
+ {
6089
+ id: gen("accordion"),
6090
+ type: "accordion",
6091
+ props: { allowMultiple: false, defaultOpenIndex: 0, icon: "chevron", faqSchema: true },
6092
+ styles: {
6093
+ base: {
6094
+ display: "flex",
6095
+ flexDirection: "column",
6096
+ width: "100%",
6097
+ borderTop: "1px solid #e2e8f0"
6098
+ }
6099
+ },
6100
+ children: [
6101
+ faqItem(
6102
+ gen,
6103
+ "What exactly do I get?",
6104
+ "Instant access to the full program, all bonuses, and every future update."
6105
+ ),
6106
+ faqItem(
6107
+ gen,
6108
+ "How long do I have access?",
6109
+ "Lifetime access \u2014 learn at your own pace, on any device."
6110
+ ),
6111
+ faqItem(
6112
+ gen,
6113
+ "Is there a money-back guarantee?",
6114
+ "Yes. If you are not satisfied within 30 days, we refund you in full."
6115
+ ),
6116
+ faqItem(
6117
+ gen,
6118
+ "How do I pay?",
6119
+ "We accept cards, bank transfer, and e-wallets through a secure checkout."
6120
+ )
6121
+ ]
6122
+ }
6123
+ ],
6124
+ {},
6125
+ "760px"
6126
+ )
6127
+ },
6128
+ {
6129
+ id: "sales-testimonials",
6130
+ name: "Testimonials Carousel",
6131
+ category: SALES_CATEGORY,
6132
+ categoryLabel: SALES_CATEGORY_LABEL,
6133
+ description: "Customer testimonial slider with star ratings",
6134
+ icon: "star",
6135
+ createNodeTree: (gen = defaultGenId) => sectionShell(
6136
+ gen,
6137
+ [
6138
+ ...sectionHeading(gen, "What Our Customers Say"),
6139
+ {
6140
+ id: gen("carousel"),
6141
+ type: "carousel",
6142
+ props: {
6143
+ autoplay: true,
6144
+ interval: 6e3,
6145
+ loop: true,
6146
+ showDots: true,
6147
+ showArrows: true,
6148
+ ariaLabel: "Testimonials"
6149
+ },
6150
+ styles: {
6151
+ base: {
6152
+ position: "relative",
6153
+ width: "100%",
6154
+ overflow: "hidden",
6155
+ backgroundColor: "#f8fafc",
6156
+ borderRadius: "16px"
6157
+ }
6158
+ },
6159
+ children: [
6160
+ testimonialSlide(
6161
+ gen,
6162
+ "This completely changed how I run my business. Worth every cent.",
6163
+ "Sarah K.",
6164
+ "Founder",
6165
+ 5
6166
+ ),
6167
+ testimonialSlide(
6168
+ gen,
6169
+ "Clear, practical, and easy to follow. I saw results in the first week.",
6170
+ "Budi S.",
6171
+ "Marketing Lead",
6172
+ 4.5
6173
+ ),
6174
+ testimonialSlide(
6175
+ gen,
6176
+ "The support team is amazing and the material is top-notch.",
6177
+ "Aisha R.",
6178
+ "Freelancer",
6179
+ 5
6180
+ )
6181
+ ]
6182
+ }
6183
+ ],
6184
+ { base: { backgroundColor: "#ffffff" } },
6185
+ "760px"
6186
+ )
6187
+ },
6188
+ {
6189
+ id: "sales-countdown-banner",
6190
+ name: "Countdown Banner",
6191
+ category: SALES_CATEGORY,
6192
+ categoryLabel: SALES_CATEGORY_LABEL,
6193
+ description: "Limited-time offer banner with an evergreen countdown timer and CTA",
6194
+ icon: "clock",
6195
+ createNodeTree: (gen = defaultGenId) => sectionShell(
6196
+ gen,
6197
+ [
6198
+ ...sectionHeading(gen, "Special Launch Price Ends Soon", void 0, "#ffffff"),
6199
+ {
6200
+ id: gen("countdown"),
6201
+ type: "countdown",
6202
+ props: {
6203
+ mode: "evergreen",
6204
+ durationMinutes: 30,
6205
+ format: "d h m s",
6206
+ labelDays: "Days",
6207
+ labelHours: "Hours",
6208
+ labelMinutes: "Minutes",
6209
+ labelSeconds: "Seconds",
6210
+ expireBehavior: "text",
6211
+ expiredText: "The special price has ended.",
6212
+ storage: "session",
6213
+ ariaLabel: "Offer ends in"
6214
+ },
6215
+ styles: {
6216
+ base: {
6217
+ display: "flex",
6218
+ alignItems: "center",
6219
+ justifyContent: "center",
6220
+ gap: "16px",
6221
+ fontSize: "36px",
6222
+ fontWeight: "800",
6223
+ color: "#ffffff",
6224
+ fontVariantNumeric: "tabular-nums"
6225
+ },
6226
+ mobile: { fontSize: "28px", gap: "8px" }
6227
+ }
6228
+ },
6229
+ {
6230
+ id: gen("button"),
6231
+ type: "button",
6232
+ props: { label: "Claim the Offer", href: "#checkout" },
6233
+ styles: {
6234
+ base: {
6235
+ alignSelf: "center",
6236
+ backgroundColor: "#f59e0b",
6237
+ color: "#0f172a",
6238
+ padding: "14px 32px",
6239
+ borderRadius: "9999px",
6240
+ fontSize: "16px",
6241
+ fontWeight: "700"
6242
+ }
6243
+ }
6244
+ }
6245
+ ],
6246
+ { base: { backgroundColor: "#0f172a" } }
6247
+ )
6248
+ },
6249
+ {
6250
+ id: "sales-guarantee",
6251
+ name: "Money-Back Guarantee",
6252
+ category: SALES_CATEGORY,
6253
+ categoryLabel: SALES_CATEGORY_LABEL,
6254
+ description: "Risk-reversal guarantee section with shield icon",
6255
+ icon: "badge",
6256
+ createNodeTree: (gen = defaultGenId) => sectionShell(
6257
+ gen,
6258
+ [
6259
+ {
6260
+ id: gen("flex"),
6261
+ type: "flex",
6262
+ styles: {
6263
+ base: {
6264
+ display: "flex",
6265
+ flexDirection: "row",
6266
+ alignItems: "center",
6267
+ gap: "24px",
6268
+ padding: "32px",
6269
+ backgroundColor: "#f0fdf4",
6270
+ border: "2px dashed #16a34a",
6271
+ borderRadius: "16px"
6272
+ },
6273
+ mobile: { flexDirection: "column", textAlign: "center", padding: "24px" }
6274
+ },
6275
+ children: [
6276
+ {
6277
+ id: gen("icon"),
6278
+ type: "icon",
6279
+ props: { name: "shield-check", size: 64, color: "#16a34a", ariaLabel: "Guarantee" }
6280
+ },
6281
+ {
6282
+ id: gen("flex"),
6283
+ type: "flex",
6284
+ styles: { base: { display: "flex", flexDirection: "column", gap: "8px" } },
6285
+ children: [
6286
+ {
6287
+ id: gen("heading"),
6288
+ type: "heading",
6289
+ props: { text: "30-Day Money-Back Guarantee", level: 3 },
6290
+ styles: {
6291
+ base: { fontSize: "22px", fontWeight: "800", color: "#14532d", margin: "0" }
6292
+ }
6293
+ },
6294
+ {
6295
+ id: gen("paragraph"),
6296
+ type: "paragraph",
6297
+ props: {
6298
+ text: "Try it risk-free. If it is not right for you, email us within 30 days and we will refund every cent \u2014 no questions asked."
6299
+ },
6300
+ styles: {
6301
+ base: { fontSize: "15px", color: "#166534", margin: "0", lineHeight: "1.6" }
6302
+ }
6303
+ }
6304
+ ]
6305
+ }
6306
+ ]
6307
+ }
6308
+ ],
6309
+ {},
6310
+ "760px"
6311
+ )
6312
+ },
6313
+ {
6314
+ id: "sales-trust-badges",
6315
+ name: "Trust Badges",
6316
+ category: SALES_CATEGORY,
6317
+ categoryLabel: SALES_CATEGORY_LABEL,
6318
+ description: "Row of trust signals: secure payment, guarantee, support, and delivery",
6319
+ icon: "grid",
6320
+ createNodeTree: (gen = defaultGenId) => sectionShell(
6321
+ gen,
6322
+ [
6323
+ {
6324
+ id: gen("grid"),
6325
+ type: "grid",
6326
+ styles: {
6327
+ base: {
6328
+ display: "grid",
6329
+ gridTemplateColumns: "repeat(4, minmax(0, 1fr))",
6330
+ gap: "16px"
6331
+ },
6332
+ mobile: { gridTemplateColumns: "repeat(2, minmax(0, 1fr))" }
6333
+ },
6334
+ children: [
6335
+ badgeItem(gen, "lock", "Secure Payment"),
6336
+ badgeItem(gen, "shield-check", "Money-Back Guarantee"),
6337
+ badgeItem(gen, "headphones", "24/7 Support"),
6338
+ badgeItem(gen, "zap", "Instant Access")
6339
+ ]
6340
+ },
6341
+ {
6342
+ id: gen("divider"),
6343
+ type: "divider",
6344
+ props: { lineStyle: "solid", thickness: 1, color: "#e2e8f0", label: "" }
6345
+ },
6346
+ {
6347
+ id: gen("paragraph"),
6348
+ type: "paragraph",
6349
+ props: { text: "Trusted by 10,000+ customers." },
6350
+ styles: {
6351
+ base: { fontSize: "14px", color: "#64748b", textAlign: "center", margin: "0" }
6352
+ }
6353
+ }
6354
+ ],
6355
+ { base: { paddingTop: "32px", paddingBottom: "32px" } }
6356
+ )
6357
+ },
6358
+ {
6359
+ id: "sales-plan-comparison",
6360
+ name: "Plan Comparison",
6361
+ category: SALES_CATEGORY,
6362
+ categoryLabel: SALES_CATEGORY_LABEL,
6363
+ description: "Monthly/yearly tabs comparing pricing plans side by side",
6364
+ icon: "columns",
6365
+ createNodeTree: (gen = defaultGenId) => sectionShell(gen, [
6366
+ ...sectionHeading(gen, "Choose Your Plan", "Switch between monthly and yearly billing."),
6367
+ {
6368
+ id: gen("tabs"),
6369
+ type: "tabs",
6370
+ props: { activeIndex: 0, ariaLabel: "Billing period" },
6371
+ styles: { base: { display: "flex", flexDirection: "column", width: "100%" } },
6372
+ children: [
6373
+ {
6374
+ id: gen("tab-panel"),
6375
+ type: "tab-panel",
6376
+ props: { label: "Monthly" },
6377
+ styles: { base: { paddingTop: "24px" } },
6378
+ children: [
6379
+ planColumns(gen, [
6380
+ ["Basic", "$19 / mo", ["1 project", "Email support", "Core features"], false],
6381
+ [
6382
+ "Pro",
6383
+ "$49 / mo",
6384
+ ["Unlimited projects", "Priority support", "All features"],
6385
+ true
6386
+ ]
6387
+ ])
6388
+ ]
6389
+ },
6390
+ {
6391
+ id: gen("tab-panel"),
6392
+ type: "tab-panel",
6393
+ props: { label: "Yearly" },
6394
+ styles: { base: { paddingTop: "24px" } },
6395
+ children: [
6396
+ planColumns(gen, [
6397
+ [
6398
+ "Basic",
6399
+ "$190 / yr",
6400
+ ["1 project", "Email support", "Core features", "2 months free"],
6401
+ false
6402
+ ],
6403
+ [
6404
+ "Pro",
6405
+ "$490 / yr",
6406
+ ["Unlimited projects", "Priority support", "All features", "2 months free"],
6407
+ true
6408
+ ]
6409
+ ])
6410
+ ]
6411
+ }
6412
+ ]
6413
+ },
6414
+ {
6415
+ id: gen("spacer"),
6416
+ type: "spacer",
6417
+ styles: { base: { width: "100%", height: "16px" }, mobile: { height: "8px" } }
6418
+ }
6419
+ ])
6420
+ }
6421
+ ];
6422
+
5249
6423
  // src/blocks/index.ts
5250
6424
  var STARTER_BLOCKS = [
5251
6425
  ...LAYOUT_STARTER_BLOCKS,
5252
6426
  ...UI_STARTER_BLOCKS,
5253
- ...FORM_STARTER_BLOCKS
6427
+ ...FORM_STARTER_BLOCKS,
6428
+ ...SALES_STARTER_BLOCKS
5254
6429
  ];
5255
6430
  // Annotate the CommonJS export names for ESM import in node:
5256
6431
  0 && (module.exports = {
5257
6432
  CONTENT_CHILD_TYPES,
6433
+ COUNTDOWN_EXPIRE_BEHAVIORS,
6434
+ COUNTDOWN_FORMATS,
6435
+ COUNTDOWN_MODES,
6436
+ COUNTDOWN_STORAGE_TYPES,
5258
6437
  ComponentRegistry,
5259
6438
  FORM_STARTER_BLOCKS,
5260
6439
  LAYOUT_PARENTS,
5261
6440
  LAYOUT_STARTER_BLOCKS,
6441
+ SALES_STARTER_BLOCKS,
5262
6442
  STARTER_BLOCKS,
5263
6443
  TRAIT_GROUP_LABELS,
5264
6444
  TRAIT_GROUP_ORDER,
5265
6445
  UI_STARTER_BLOCKS,
5266
6446
  acceptTrait,
6447
+ accordionDefinition,
6448
+ accordionItemDefinition,
5267
6449
  actionTrait,
5268
6450
  altTrait,
5269
6451
  ariaLabelTrait,
@@ -5276,6 +6458,8 @@ var STARTER_BLOCKS = [
5276
6458
  buttonDefinition,
5277
6459
  buttonSubmitDefinition,
5278
6460
  buttonTypeTrait,
6461
+ canonicalTextPropFields,
6462
+ carouselDefinition,
5279
6463
  checkboxDefinition,
5280
6464
  citeTrait,
5281
6465
  codeBlockDefinition,
@@ -5287,12 +6471,14 @@ var STARTER_BLOCKS = [
5287
6471
  containerDefinition,
5288
6472
  controlsTrait,
5289
6473
  coreComponentDefinitions,
6474
+ countdownDefinition,
5290
6475
  createDefaultComponentRegistry,
5291
6476
  defaultCheckedTrait,
5292
6477
  defaultGenId,
5293
6478
  defaultSelectedTrait,
5294
6479
  defaultValueTrait,
5295
6480
  disabledTrait,
6481
+ dividerDefinition,
5296
6482
  drawerDefinition,
5297
6483
  extractComponentRequirements,
5298
6484
  fieldNameTrait,
@@ -5339,6 +6525,7 @@ var STARTER_BLOCKS = [
5339
6525
  radioDefinition,
5340
6526
  radioGroupDefinition,
5341
6527
  radioItemDefinition,
6528
+ ratingDefinition,
5342
6529
  readOnlyTrait,
5343
6530
  relTrait,
5344
6531
  requiredTrait,
@@ -5352,13 +6539,16 @@ var STARTER_BLOCKS = [
5352
6539
  showPreviewTrait,
5353
6540
  showSpinnerTrait,
5354
6541
  sortTraits,
6542
+ spacerDefinition,
5355
6543
  srcTrait,
5356
6544
  suffixIconTrait,
5357
6545
  switchDefinition,
5358
6546
  switchSizeTrait,
6547
+ tabPanelDefinition,
5359
6548
  tableCellDefinition,
5360
6549
  tableDefinition,
5361
6550
  tableRowDefinition,
6551
+ tabsDefinition,
5362
6552
  tagTrait,
5363
6553
  targetTrait,
5364
6554
  textDefinition,