@kubuild/components 0.6.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 (54) 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-PWKMZYTC.js → chunk-CJN5OHHX.js} +596 -10
  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 -148
  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/media/image.d.ts.map +1 -1
  36. package/dist/definitions/types.d.ts +4 -1
  37. package/dist/definitions/types.d.ts.map +1 -1
  38. package/dist/definitions/typography/badge.d.ts.map +1 -1
  39. package/dist/definitions/typography/blockquote.d.ts.map +1 -1
  40. package/dist/definitions/typography/heading.d.ts.map +1 -1
  41. package/dist/definitions/typography/link.d.ts.map +1 -1
  42. package/dist/definitions/typography/paragraph.d.ts.map +1 -1
  43. package/dist/definitions/typography/text.d.ts.map +1 -1
  44. package/dist/index.cjs +1417 -228
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.ts +1 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +32 -2
  49. package/dist/index.js.map +1 -1
  50. package/dist/registry.d.ts +12 -0
  51. package/dist/registry.d.ts.map +1 -1
  52. package/package.json +3 -3
  53. package/dist/chunk-JTQ35OQQ.js.map +0 -1
  54. package/dist/chunk-PWKMZYTC.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",
@@ -1666,7 +1723,6 @@ var imageDefinition = {
1666
1723
  },
1667
1724
  propFields: [
1668
1725
  { name: "src", label: "Image URL", type: "string" },
1669
- { name: "asset", label: "Asset Reference", type: "json" },
1670
1726
  { name: "alt", label: "Alt Text", type: "string", defaultValue: "Default image" },
1671
1727
  { name: "width", label: "Width", type: "number" },
1672
1728
  { name: "height", label: "Height", type: "number" }
@@ -1681,12 +1737,12 @@ var imageDefinition = {
1681
1737
  ],
1682
1738
  validateProps: (props) => {
1683
1739
  const errors = [];
1684
- const hasSrc = typeof props.src === "string" && props.src.trim().length > 0 || (0, import_schema8.isVariableBinding)(props.src);
1685
- 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);
1686
1742
  if (!hasSrc && !hasAsset) {
1687
1743
  errors.push('Image requires either a non-empty "src" URL or a valid "asset" reference.');
1688
1744
  }
1689
- 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);
1690
1746
  if (!hasAlt) {
1691
1747
  errors.push('Image requires non-empty "alt" text.');
1692
1748
  }
@@ -1702,7 +1758,7 @@ var imageDefinition = {
1702
1758
  };
1703
1759
 
1704
1760
  // src/definitions/media/video.ts
1705
- var import_schema9 = require("@kubuild/schema");
1761
+ var import_schema10 = require("@kubuild/schema");
1706
1762
  var videoDefinition = {
1707
1763
  type: "video",
1708
1764
  label: "Video",
@@ -1770,25 +1826,25 @@ var videoDefinition = {
1770
1826
  ],
1771
1827
  validateProps: (props) => {
1772
1828
  const errors = [];
1773
- 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)) {
1774
1830
  errors.push('Video "src" must be a string when provided.');
1775
1831
  }
1776
- if (props.provider !== void 0 && !(0, import_schema9.isVariableBinding)(props.provider)) {
1832
+ if (props.provider !== void 0 && !(0, import_schema10.isVariableBinding)(props.provider)) {
1777
1833
  const allowed = ["auto", "html5", "youtube", "vimeo"];
1778
1834
  if (typeof props.provider !== "string" || !allowed.includes(props.provider)) {
1779
1835
  errors.push(`Video "provider" must be one of: ${allowed.join(", ")}.`);
1780
1836
  }
1781
1837
  }
1782
- 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)) {
1783
1839
  errors.push('Video "controls" must be a boolean.');
1784
1840
  }
1785
- 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)) {
1786
1842
  errors.push('Video "autoplay" must be a boolean.');
1787
1843
  }
1788
- 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)) {
1789
1845
  errors.push('Video "loop" must be a boolean.');
1790
1846
  }
1791
- 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)) {
1792
1848
  errors.push('Video "muted" must be a boolean.');
1793
1849
  }
1794
1850
  return errors.length > 0 ? errors : true;
@@ -1806,7 +1862,7 @@ var videoDefinition = {
1806
1862
  };
1807
1863
 
1808
1864
  // src/definitions/media/icon.ts
1809
- var import_schema10 = require("@kubuild/schema");
1865
+ var import_schema11 = require("@kubuild/schema");
1810
1866
  var iconDefinition = {
1811
1867
  type: "icon",
1812
1868
  label: "Icon",
@@ -1832,15 +1888,15 @@ var iconDefinition = {
1832
1888
  ],
1833
1889
  validateProps: (props) => {
1834
1890
  const errors = [];
1835
- 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)) {
1836
1892
  errors.push('Icon requires a non-empty "name".');
1837
1893
  }
1838
- if (props.size !== void 0 && !(0, import_schema10.isVariableBinding)(props.size)) {
1894
+ if (props.size !== void 0 && !(0, import_schema11.isVariableBinding)(props.size)) {
1839
1895
  if (typeof props.size !== "number" || props.size < 0) {
1840
1896
  errors.push('Icon "size" must be a non-negative number.');
1841
1897
  }
1842
1898
  }
1843
- if (props.strokeWidth !== void 0 && !(0, import_schema10.isVariableBinding)(props.strokeWidth)) {
1899
+ if (props.strokeWidth !== void 0 && !(0, import_schema11.isVariableBinding)(props.strokeWidth)) {
1844
1900
  if (typeof props.strokeWidth !== "number" || props.strokeWidth < 0) {
1845
1901
  errors.push('Icon "strokeWidth" must be a non-negative number.');
1846
1902
  }
@@ -1857,7 +1913,7 @@ var iconDefinition = {
1857
1913
  };
1858
1914
 
1859
1915
  // src/definitions/media/html-embed.ts
1860
- var import_schema11 = require("@kubuild/schema");
1916
+ var import_schema12 = require("@kubuild/schema");
1861
1917
  var htmlEmbedDefinition = {
1862
1918
  type: "html-embed",
1863
1919
  label: "HTML Embed",
@@ -1881,7 +1937,7 @@ var htmlEmbedDefinition = {
1881
1937
  ],
1882
1938
  validateProps: (props) => {
1883
1939
  const errors = [];
1884
- 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)) {
1885
1941
  errors.push('HTML Embed "html" must be a string.');
1886
1942
  }
1887
1943
  return errors.length > 0 ? errors : true;
@@ -1895,7 +1951,7 @@ var htmlEmbedDefinition = {
1895
1951
  };
1896
1952
 
1897
1953
  // src/definitions/data/table.ts
1898
- var import_schema12 = require("@kubuild/schema");
1954
+ var import_schema13 = require("@kubuild/schema");
1899
1955
  var tableDefinition = {
1900
1956
  type: "table",
1901
1957
  label: "Table",
@@ -1935,13 +1991,13 @@ var tableDefinition = {
1935
1991
  ],
1936
1992
  validateProps: (props) => {
1937
1993
  const errors = [];
1938
- 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)) {
1939
1995
  errors.push('Table "striped" must be a boolean.');
1940
1996
  }
1941
- 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)) {
1942
1998
  errors.push('Table "bordered" must be a boolean.');
1943
1999
  }
1944
- 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)) {
1945
2001
  errors.push('Table "compact" must be a boolean.');
1946
2002
  }
1947
2003
  return errors.length > 0 ? errors : true;
@@ -2026,22 +2082,22 @@ var tableCellDefinition = {
2026
2082
  ],
2027
2083
  validateProps: (props) => {
2028
2084
  const errors = [];
2029
- if (props.tag !== void 0 && !(0, import_schema12.isVariableBinding)(props.tag)) {
2085
+ if (props.tag !== void 0 && !(0, import_schema13.isVariableBinding)(props.tag)) {
2030
2086
  if (props.tag !== "td" && props.tag !== "th") {
2031
2087
  errors.push('Table Cell "tag" must be either "td" or "th".');
2032
2088
  }
2033
2089
  }
2034
- if (props.colSpan !== void 0 && !(0, import_schema12.isVariableBinding)(props.colSpan)) {
2090
+ if (props.colSpan !== void 0 && !(0, import_schema13.isVariableBinding)(props.colSpan)) {
2035
2091
  if (typeof props.colSpan !== "number" || props.colSpan < 1 || !Number.isInteger(props.colSpan)) {
2036
2092
  errors.push('Table Cell "colSpan" must be a positive integer (>= 1).');
2037
2093
  }
2038
2094
  }
2039
- if (props.rowSpan !== void 0 && !(0, import_schema12.isVariableBinding)(props.rowSpan)) {
2095
+ if (props.rowSpan !== void 0 && !(0, import_schema13.isVariableBinding)(props.rowSpan)) {
2040
2096
  if (typeof props.rowSpan !== "number" || props.rowSpan < 1 || !Number.isInteger(props.rowSpan)) {
2041
2097
  errors.push('Table Cell "rowSpan" must be a positive integer (>= 1).');
2042
2098
  }
2043
2099
  }
2044
- 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)) {
2045
2101
  errors.push('Table Cell "text" must be a string when provided.');
2046
2102
  }
2047
2103
  return errors.length > 0 ? errors : true;
@@ -2058,7 +2114,7 @@ var tableCellDefinition = {
2058
2114
  };
2059
2115
 
2060
2116
  // src/definitions/data/list.ts
2061
- var import_schema13 = require("@kubuild/schema");
2117
+ var import_schema14 = require("@kubuild/schema");
2062
2118
  var listDefinition = {
2063
2119
  type: "list",
2064
2120
  label: "List",
@@ -2107,12 +2163,12 @@ var listDefinition = {
2107
2163
  ],
2108
2164
  validateProps: (props) => {
2109
2165
  const errors = [];
2110
- if (props.tag !== void 0 && !(0, import_schema13.isVariableBinding)(props.tag)) {
2166
+ if (props.tag !== void 0 && !(0, import_schema14.isVariableBinding)(props.tag)) {
2111
2167
  if (props.tag !== "ul" && props.tag !== "ol") {
2112
2168
  errors.push('List "tag" must be either "ul" or "ol".');
2113
2169
  }
2114
2170
  }
2115
- if (props.listStyleType !== void 0 && !(0, import_schema13.isVariableBinding)(props.listStyleType)) {
2171
+ if (props.listStyleType !== void 0 && !(0, import_schema14.isVariableBinding)(props.listStyleType)) {
2116
2172
  const allowed = ["disc", "circle", "square", "decimal", "none", "custom-icon"];
2117
2173
  if (typeof props.listStyleType !== "string" || !allowed.includes(props.listStyleType)) {
2118
2174
  errors.push(`List "listStyleType" must be one of: ${allowed.join(", ")}.`);
@@ -2167,7 +2223,7 @@ var listItemDefinition = {
2167
2223
  ],
2168
2224
  validateProps: (props) => {
2169
2225
  const errors = [];
2170
- 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)) {
2171
2227
  errors.push('List Item "text" must be a string when provided.');
2172
2228
  }
2173
2229
  return errors.length > 0 ? errors : true;
@@ -2204,7 +2260,7 @@ var collectionDefinition = {
2204
2260
  };
2205
2261
 
2206
2262
  // src/definitions/form/button.ts
2207
- var import_schema14 = require("@kubuild/schema");
2263
+ var import_schema15 = require("@kubuild/schema");
2208
2264
  var buttonDefinition = {
2209
2265
  type: "button",
2210
2266
  label: "Button",
@@ -2212,6 +2268,7 @@ var buttonDefinition = {
2212
2268
  icon: "mouse-pointer",
2213
2269
  acceptsChildren: false,
2214
2270
  capabilities: ["actionRegistry"],
2271
+ ...canonicalTextPropFields("button"),
2215
2272
  defaultProps: {
2216
2273
  label: "Click Me",
2217
2274
  variant: "primary"
@@ -2255,22 +2312,22 @@ var buttonDefinition = {
2255
2312
  ],
2256
2313
  validateProps: (props) => {
2257
2314
  const errors = [];
2258
- 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);
2259
2316
  if (!hasLabel) {
2260
2317
  errors.push('Button requires a non-empty "label".');
2261
2318
  }
2262
- 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)) {
2263
2320
  errors.push('Button "href" must be a string when provided.');
2264
2321
  }
2265
- if (props.buttonType !== void 0 && !(0, import_schema14.isVariableBinding)(props.buttonType)) {
2322
+ if (props.buttonType !== void 0 && !(0, import_schema15.isVariableBinding)(props.buttonType)) {
2266
2323
  if (!["button", "submit", "reset"].includes(props.buttonType)) {
2267
2324
  errors.push('Button "buttonType" must be one of: "button", "submit", "reset".');
2268
2325
  }
2269
2326
  }
2270
- if (props.action !== void 0 && !(0, import_schema14.isActionBinding)(props.action)) {
2327
+ if (props.action !== void 0 && !(0, import_schema15.isActionBinding)(props.action)) {
2271
2328
  errors.push('Button "action" must be a valid action binding when provided.');
2272
2329
  }
2273
- 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)) {
2274
2331
  errors.push('Button "disabled" must be a boolean when provided.');
2275
2332
  }
2276
2333
  return errors.length > 0 ? errors : true;
@@ -2358,25 +2415,25 @@ var buttonSubmitDefinition = {
2358
2415
  ],
2359
2416
  validateProps: (props) => {
2360
2417
  const errors = [];
2361
- 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);
2362
2419
  if (!hasLabel) {
2363
2420
  errors.push('Submit Button requires a non-empty "label".');
2364
2421
  }
2365
- 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)) {
2366
2423
  errors.push('Submit Button "loadingText" must be a string when provided.');
2367
2424
  }
2368
- 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)) {
2369
2426
  errors.push('Submit Button "showSpinner" must be a boolean when provided.');
2370
2427
  }
2371
- 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)) {
2372
2429
  errors.push('Submit Button "autoDisableOnSubmit" must be a boolean when provided.');
2373
2430
  }
2374
- if (props.buttonType !== void 0 && !(0, import_schema14.isVariableBinding)(props.buttonType)) {
2431
+ if (props.buttonType !== void 0 && !(0, import_schema15.isVariableBinding)(props.buttonType)) {
2375
2432
  if (!["submit", "reset", "button"].includes(props.buttonType)) {
2376
2433
  errors.push('Submit Button "buttonType" must be one of: "submit", "reset", "button".');
2377
2434
  }
2378
2435
  }
2379
- 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)) {
2380
2437
  errors.push('Submit Button "disabled" must be a boolean when provided.');
2381
2438
  }
2382
2439
  return errors.length > 0 ? errors : true;
@@ -2403,7 +2460,7 @@ var buttonSubmitDefinition = {
2403
2460
  };
2404
2461
 
2405
2462
  // src/definitions/form/form.ts
2406
- var import_schema15 = require("@kubuild/schema");
2463
+ var import_schema16 = require("@kubuild/schema");
2407
2464
  var formDefinition = {
2408
2465
  type: "form",
2409
2466
  label: "Form",
@@ -2490,34 +2547,34 @@ var formDefinition = {
2490
2547
  ],
2491
2548
  validateProps: (props) => {
2492
2549
  const errors = [];
2493
- 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)) {
2494
2551
  errors.push('Form "name" must be a string when provided.');
2495
2552
  }
2496
- 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)) {
2497
2554
  errors.push('Form "action" must be a string when provided.');
2498
2555
  }
2499
- if (props.method !== void 0 && !(0, import_schema15.isVariableBinding)(props.method)) {
2556
+ if (props.method !== void 0 && !(0, import_schema16.isVariableBinding)(props.method)) {
2500
2557
  if (!["GET", "POST", "get", "post"].includes(props.method)) {
2501
2558
  errors.push('Form "method" must be either "GET" or "POST".');
2502
2559
  }
2503
2560
  }
2504
- if (props.target !== void 0 && !(0, import_schema15.isVariableBinding)(props.target)) {
2561
+ if (props.target !== void 0 && !(0, import_schema16.isVariableBinding)(props.target)) {
2505
2562
  if (!["_self", "_blank", "_parent", "_top"].includes(props.target)) {
2506
2563
  errors.push('Form "target" must be one of: "_self", "_blank", "_parent", "_top".');
2507
2564
  }
2508
2565
  }
2509
- if (props.autoComplete !== void 0 && !(0, import_schema15.isVariableBinding)(props.autoComplete)) {
2566
+ if (props.autoComplete !== void 0 && !(0, import_schema16.isVariableBinding)(props.autoComplete)) {
2510
2567
  if (!["on", "off"].includes(props.autoComplete)) {
2511
2568
  errors.push('Form "autoComplete" must be either "on" or "off".');
2512
2569
  }
2513
2570
  }
2514
- 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)) {
2515
2572
  errors.push('Form "preventDefault" must be a boolean when provided.');
2516
2573
  }
2517
- 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)) {
2518
2575
  errors.push('Form "scrollToFirstError" must be a boolean when provided.');
2519
2576
  }
2520
- 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)) {
2521
2578
  errors.push('Form "resetOnSubmit" must be a boolean when provided.');
2522
2579
  }
2523
2580
  return errors.length > 0 ? errors : true;
@@ -2533,7 +2590,7 @@ var formDefinition = {
2533
2590
  };
2534
2591
 
2535
2592
  // src/definitions/form/input.ts
2536
- var import_schema16 = require("@kubuild/schema");
2593
+ var import_schema17 = require("@kubuild/schema");
2537
2594
  var inputDefinition = {
2538
2595
  type: "input",
2539
2596
  label: "Input",
@@ -2615,47 +2672,47 @@ var inputDefinition = {
2615
2672
  ],
2616
2673
  validateProps: (props) => {
2617
2674
  const errors = [];
2618
- 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)) {
2619
2676
  errors.push('Input "name" must be a string when provided.');
2620
2677
  }
2621
- if (props.type !== void 0 && !(0, import_schema16.isVariableBinding)(props.type)) {
2678
+ if (props.type !== void 0 && !(0, import_schema17.isVariableBinding)(props.type)) {
2622
2679
  const validTypes = ["text", "email", "number", "password", "tel", "url", "search", "date", "hidden"];
2623
2680
  if (!validTypes.includes(props.type)) {
2624
2681
  errors.push(`Input "type" must be one of: ${validTypes.join(", ")}.`);
2625
2682
  }
2626
2683
  }
2627
- 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)) {
2628
2685
  errors.push('Input "placeholder" must be a string when provided.');
2629
2686
  }
2630
- 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)) {
2631
2688
  errors.push('Input "required" must be a boolean when provided.');
2632
2689
  }
2633
- 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)) {
2634
2691
  errors.push('Input "disabled" must be a boolean when provided.');
2635
2692
  }
2636
- 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)) {
2637
2694
  errors.push('Input "readOnly" must be a boolean when provided.');
2638
2695
  }
2639
- 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)) {
2640
2697
  errors.push('Input "pattern" must be a string when provided.');
2641
2698
  }
2642
- if (props.minLength !== void 0 && !(0, import_schema16.isVariableBinding)(props.minLength)) {
2699
+ if (props.minLength !== void 0 && !(0, import_schema17.isVariableBinding)(props.minLength)) {
2643
2700
  if (typeof props.minLength !== "number" || props.minLength < 0 || !Number.isInteger(props.minLength)) {
2644
2701
  errors.push('Input "minLength" must be a non-negative integer when provided.');
2645
2702
  }
2646
2703
  }
2647
- if (props.maxLength !== void 0 && !(0, import_schema16.isVariableBinding)(props.maxLength)) {
2704
+ if (props.maxLength !== void 0 && !(0, import_schema17.isVariableBinding)(props.maxLength)) {
2648
2705
  if (typeof props.maxLength !== "number" || props.maxLength < 0 || !Number.isInteger(props.maxLength)) {
2649
2706
  errors.push('Input "maxLength" must be a non-negative integer when provided.');
2650
2707
  }
2651
2708
  }
2652
- 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)) {
2653
2710
  errors.push('Input "prefixIcon" must be a string when provided.');
2654
2711
  }
2655
- 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)) {
2656
2713
  errors.push('Input "suffixIcon" must be a string when provided.');
2657
2714
  }
2658
- 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)) {
2659
2716
  errors.push('Input "helperText" must be a string when provided.');
2660
2717
  }
2661
2718
  return errors.length > 0 ? errors : true;
@@ -2680,7 +2737,7 @@ var inputDefinition = {
2680
2737
  };
2681
2738
 
2682
2739
  // src/definitions/form/textarea.ts
2683
- var import_schema17 = require("@kubuild/schema");
2740
+ var import_schema18 = require("@kubuild/schema");
2684
2741
  var textareaDefinition = {
2685
2742
  type: "textarea",
2686
2743
  label: "Textarea",
@@ -2742,41 +2799,41 @@ var textareaDefinition = {
2742
2799
  ],
2743
2800
  validateProps: (props) => {
2744
2801
  const errors = [];
2745
- 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)) {
2746
2803
  errors.push('Textarea "name" must be a string when provided.');
2747
2804
  }
2748
- if (props.rows !== void 0 && !(0, import_schema17.isVariableBinding)(props.rows)) {
2805
+ if (props.rows !== void 0 && !(0, import_schema18.isVariableBinding)(props.rows)) {
2749
2806
  if (typeof props.rows !== "number" || props.rows < 1 || !Number.isInteger(props.rows)) {
2750
2807
  errors.push('Textarea "rows" must be a positive integer (>= 1).');
2751
2808
  }
2752
2809
  }
2753
- 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)) {
2754
2811
  errors.push('Textarea "placeholder" must be a string when provided.');
2755
2812
  }
2756
- 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)) {
2757
2814
  errors.push('Textarea "required" must be a boolean when provided.');
2758
2815
  }
2759
- 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)) {
2760
2817
  errors.push('Textarea "disabled" must be a boolean when provided.');
2761
2818
  }
2762
- 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)) {
2763
2820
  errors.push('Textarea "readOnly" must be a boolean when provided.');
2764
2821
  }
2765
- if (props.resize !== void 0 && !(0, import_schema17.isVariableBinding)(props.resize)) {
2822
+ if (props.resize !== void 0 && !(0, import_schema18.isVariableBinding)(props.resize)) {
2766
2823
  const allowedResize = ["vertical", "horizontal", "both", "none"];
2767
2824
  if (typeof props.resize !== "string" || !allowedResize.includes(props.resize)) {
2768
2825
  errors.push(`Textarea "resize" must be one of: ${allowedResize.join(", ")}.`);
2769
2826
  }
2770
2827
  }
2771
- 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)) {
2772
2829
  errors.push('Textarea "autoGrow" must be a boolean when provided.');
2773
2830
  }
2774
- if (props.maxCharCount !== void 0 && !(0, import_schema17.isVariableBinding)(props.maxCharCount)) {
2831
+ if (props.maxCharCount !== void 0 && !(0, import_schema18.isVariableBinding)(props.maxCharCount)) {
2775
2832
  if (typeof props.maxCharCount !== "number" || props.maxCharCount < 1 || !Number.isInteger(props.maxCharCount)) {
2776
2833
  errors.push('Textarea "maxCharCount" must be a positive integer (>= 1) when provided.');
2777
2834
  }
2778
2835
  }
2779
- 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)) {
2780
2837
  errors.push('Textarea "helperText" must be a string when provided.');
2781
2838
  }
2782
2839
  return errors.length > 0 ? errors : true;
@@ -2801,7 +2858,7 @@ var textareaDefinition = {
2801
2858
  };
2802
2859
 
2803
2860
  // src/definitions/form/select.ts
2804
- var import_schema18 = require("@kubuild/schema");
2861
+ var import_schema19 = require("@kubuild/schema");
2805
2862
  var selectDefinition = {
2806
2863
  type: "select",
2807
2864
  label: "Select",
@@ -2853,21 +2910,21 @@ var selectDefinition = {
2853
2910
  ],
2854
2911
  validateProps: (props) => {
2855
2912
  const errors = [];
2856
- 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)) {
2857
2914
  errors.push('Select "name" must be a string when provided.');
2858
2915
  }
2859
- if (props.options !== void 0 && !(0, import_schema18.isVariableBinding)(props.options)) {
2916
+ if (props.options !== void 0 && !(0, import_schema19.isVariableBinding)(props.options)) {
2860
2917
  if (!Array.isArray(props.options) && typeof props.options !== "string") {
2861
2918
  errors.push('Select "options" must be an array of option objects or a JSON string.');
2862
2919
  }
2863
2920
  }
2864
- 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)) {
2865
2922
  errors.push('Select "required" must be a boolean when provided.');
2866
2923
  }
2867
- 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)) {
2868
2925
  errors.push('Select "disabled" must be a boolean when provided.');
2869
2926
  }
2870
- 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)) {
2871
2928
  errors.push('Select "helperText" must be a string when provided.');
2872
2929
  }
2873
2930
  return errors.length > 0 ? errors : true;
@@ -2892,7 +2949,7 @@ var selectDefinition = {
2892
2949
  };
2893
2950
 
2894
2951
  // src/definitions/form/checkbox.ts
2895
- var import_schema19 = require("@kubuild/schema");
2952
+ var import_schema20 = require("@kubuild/schema");
2896
2953
  var checkboxDefinition = {
2897
2954
  type: "checkbox",
2898
2955
  label: "Checkbox",
@@ -2934,28 +2991,28 @@ var checkboxDefinition = {
2934
2991
  ],
2935
2992
  validateProps: (props) => {
2936
2993
  const errors = [];
2937
- 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)) {
2938
2995
  errors.push('Checkbox "label" must be a string when provided.');
2939
2996
  }
2940
- 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)) {
2941
2998
  errors.push('Checkbox "name" must be a string when provided.');
2942
2999
  }
2943
- 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)) {
2944
3001
  errors.push('Checkbox "value" must be a string when provided.');
2945
3002
  }
2946
- 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)) {
2947
3004
  errors.push('Checkbox "defaultChecked" must be a boolean when provided.');
2948
3005
  }
2949
- 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)) {
2950
3007
  errors.push('Checkbox "indeterminate" must be a boolean when provided.');
2951
3008
  }
2952
- 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)) {
2953
3010
  errors.push('Checkbox "required" must be a boolean when provided.');
2954
3011
  }
2955
- 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)) {
2956
3013
  errors.push('Checkbox "disabled" must be a boolean when provided.');
2957
3014
  }
2958
- 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)) {
2959
3016
  errors.push('Checkbox "helperText" must be a string when provided.');
2960
3017
  }
2961
3018
  return errors.length > 0 ? errors : true;
@@ -2974,7 +3031,7 @@ var checkboxDefinition = {
2974
3031
  };
2975
3032
 
2976
3033
  // src/definitions/form/switch.ts
2977
- var import_schema20 = require("@kubuild/schema");
3034
+ var import_schema21 = require("@kubuild/schema");
2978
3035
  var switchDefinition = {
2979
3036
  type: "switch",
2980
3037
  label: "Switch",
@@ -3026,31 +3083,31 @@ var switchDefinition = {
3026
3083
  ],
3027
3084
  validateProps: (props) => {
3028
3085
  const errors = [];
3029
- 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)) {
3030
3087
  errors.push('Switch "label" must be a string when provided.');
3031
3088
  }
3032
- 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)) {
3033
3090
  errors.push('Switch "name" must be a string when provided.');
3034
3091
  }
3035
- 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)) {
3036
3093
  errors.push('Switch "value" must be a string when provided.');
3037
3094
  }
3038
- 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)) {
3039
3096
  errors.push('Switch "defaultChecked" must be a boolean when provided.');
3040
3097
  }
3041
- if (props.switchSize !== void 0 && !(0, import_schema20.isVariableBinding)(props.switchSize)) {
3098
+ if (props.switchSize !== void 0 && !(0, import_schema21.isVariableBinding)(props.switchSize)) {
3042
3099
  const allowedSizes = ["sm", "md", "lg"];
3043
3100
  if (typeof props.switchSize !== "string" || !allowedSizes.includes(props.switchSize)) {
3044
3101
  errors.push(`Switch "switchSize" must be one of: ${allowedSizes.join(", ")}.`);
3045
3102
  }
3046
3103
  }
3047
- 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)) {
3048
3105
  errors.push('Switch "required" must be a boolean when provided.');
3049
3106
  }
3050
- 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)) {
3051
3108
  errors.push('Switch "disabled" must be a boolean when provided.');
3052
3109
  }
3053
- 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)) {
3054
3111
  errors.push('Switch "helperText" must be a string when provided.');
3055
3112
  }
3056
3113
  return errors.length > 0 ? errors : true;
@@ -3069,7 +3126,7 @@ var switchDefinition = {
3069
3126
  };
3070
3127
 
3071
3128
  // src/definitions/form/radio.ts
3072
- var import_schema21 = require("@kubuild/schema");
3129
+ var import_schema22 = require("@kubuild/schema");
3073
3130
  var radioGroupDefinition = {
3074
3131
  type: "radio-group",
3075
3132
  label: "Radio Group",
@@ -3120,25 +3177,25 @@ var radioGroupDefinition = {
3120
3177
  ],
3121
3178
  validateProps: (props) => {
3122
3179
  const errors = [];
3123
- 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)) {
3124
3181
  errors.push('RadioGroup "name" must be a string when provided.');
3125
3182
  }
3126
- 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)) {
3127
3184
  errors.push('RadioGroup "defaultSelected" must be a string when provided.');
3128
3185
  }
3129
- if (props.orientation !== void 0 && !(0, import_schema21.isVariableBinding)(props.orientation)) {
3186
+ if (props.orientation !== void 0 && !(0, import_schema22.isVariableBinding)(props.orientation)) {
3130
3187
  const allowedOrientations = ["vertical", "horizontal"];
3131
3188
  if (typeof props.orientation !== "string" || !allowedOrientations.includes(props.orientation)) {
3132
3189
  errors.push(`RadioGroup "orientation" must be one of: ${allowedOrientations.join(", ")}.`);
3133
3190
  }
3134
3191
  }
3135
- 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)) {
3136
3193
  errors.push('RadioGroup "required" must be a boolean when provided.');
3137
3194
  }
3138
- 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)) {
3139
3196
  errors.push('RadioGroup "disabled" must be a boolean when provided.');
3140
3197
  }
3141
- 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)) {
3142
3199
  errors.push('RadioGroup "helperText" must be a string when provided.');
3143
3200
  }
3144
3201
  return errors.length > 0 ? errors : true;
@@ -3189,25 +3246,25 @@ var radioDefinition = {
3189
3246
  ],
3190
3247
  validateProps: (props) => {
3191
3248
  const errors = [];
3192
- 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)) {
3193
3250
  errors.push('Radio "label" must be a string when provided.');
3194
3251
  }
3195
- 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)) {
3196
3253
  errors.push('Radio "name" must be a string when provided.');
3197
3254
  }
3198
- 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)) {
3199
3256
  errors.push('Radio "value" must be a string when provided.');
3200
3257
  }
3201
- 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)) {
3202
3259
  errors.push('Radio "defaultChecked" must be a boolean when provided.');
3203
3260
  }
3204
- 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)) {
3205
3262
  errors.push('Radio "required" must be a boolean when provided.');
3206
3263
  }
3207
- 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)) {
3208
3265
  errors.push('Radio "disabled" must be a boolean when provided.');
3209
3266
  }
3210
- 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)) {
3211
3268
  errors.push('Radio "helperText" must be a string when provided.');
3212
3269
  }
3213
3270
  return errors.length > 0 ? errors : true;
@@ -3231,7 +3288,7 @@ var radioItemDefinition = {
3231
3288
  };
3232
3289
 
3233
3290
  // src/definitions/form/file-upload.ts
3234
- var import_schema22 = require("@kubuild/schema");
3291
+ var import_schema23 = require("@kubuild/schema");
3235
3292
  var fileUploadDefinition = {
3236
3293
  type: "file-upload",
3237
3294
  label: "File Upload",
@@ -3276,33 +3333,33 @@ var fileUploadDefinition = {
3276
3333
  ],
3277
3334
  validateProps: (props) => {
3278
3335
  const errors = [];
3279
- 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)) {
3280
3337
  errors.push('FileUpload "label" must be a string when provided.');
3281
3338
  }
3282
- 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)) {
3283
3340
  errors.push('FileUpload "name" must be a string when provided.');
3284
3341
  }
3285
- 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)) {
3286
3343
  errors.push('FileUpload "accept" must be a string when provided.');
3287
3344
  }
3288
- if (props.maxFileSize !== void 0 && !(0, import_schema22.isVariableBinding)(props.maxFileSize)) {
3345
+ if (props.maxFileSize !== void 0 && !(0, import_schema23.isVariableBinding)(props.maxFileSize)) {
3289
3346
  if (typeof props.maxFileSize !== "number" || props.maxFileSize <= 0) {
3290
3347
  errors.push('FileUpload "maxFileSize" must be a positive number when provided.');
3291
3348
  }
3292
3349
  }
3293
- 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)) {
3294
3351
  errors.push('FileUpload "multiple" must be a boolean when provided.');
3295
3352
  }
3296
- 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)) {
3297
3354
  errors.push('FileUpload "showPreview" must be a boolean when provided.');
3298
3355
  }
3299
- 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)) {
3300
3357
  errors.push('FileUpload "required" must be a boolean when provided.');
3301
3358
  }
3302
- 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)) {
3303
3360
  errors.push('FileUpload "disabled" must be a boolean when provided.');
3304
3361
  }
3305
- 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)) {
3306
3363
  errors.push('FileUpload "helperText" must be a string when provided.');
3307
3364
  }
3308
3365
  return errors.length > 0 ? errors : true;
@@ -3542,77 +3599,607 @@ var collapsibleDefinition = {
3542
3599
  }
3543
3600
  };
3544
3601
 
3545
- // src/definitions/index.ts
3546
- var coreComponentDefinitions = [
3547
- pageDefinition,
3548
- sectionDefinition,
3549
- containerDefinition,
3550
- columnsDefinition,
3551
- flexDefinition,
3552
- gridDefinition,
3553
- headingDefinition,
3554
- textDefinition,
3555
- paragraphDefinition,
3556
- linkDefinition,
3557
- blockquoteDefinition,
3558
- badgeDefinition,
3559
- codeBlockDefinition,
3560
- imageDefinition,
3561
- videoDefinition,
3562
- iconDefinition,
3563
- htmlEmbedDefinition,
3564
- buttonDefinition,
3565
- buttonSubmitDefinition,
3566
- formDefinition,
3567
- inputDefinition,
3568
- textareaDefinition,
3569
- selectDefinition,
3570
- checkboxDefinition,
3571
- switchDefinition,
3572
- radioGroupDefinition,
3573
- radioDefinition,
3574
- radioItemDefinition,
3575
- fileUploadDefinition,
3576
- collectionDefinition,
3577
- listDefinition,
3578
- listItemDefinition,
3579
- tableDefinition,
3580
- tableRowDefinition,
3581
- tableCellDefinition,
3582
- modalDefinition,
3583
- drawerDefinition,
3584
- collapsibleDefinition
3585
- ];
3586
- function createDefaultComponentRegistry() {
3587
- const registry = new ComponentRegistry();
3588
- for (const def of coreComponentDefinitions) {
3589
- registry.register(def);
3590
- }
3591
- return registry;
3592
- }
3593
-
3594
- // src/requirements.ts
3595
- function extractComponentRequirements(root, registry) {
3596
- const requiredComponents = /* @__PURE__ */ new Set();
3597
- const requiredCapabilities = /* @__PURE__ */ new Set();
3598
- const visit = (node) => {
3599
- const definition = registry.get(node.type);
3600
- if (definition?.category === "custom") {
3601
- 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)."
3602
3719
  }
3603
- for (const capability of definition?.capabilities ?? []) {
3604
- 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"
3605
3734
  }
3606
- node.children?.forEach(visit);
3607
- };
3608
- visit(root);
3609
- return {
3610
- requiredComponents: Array.from(requiredComponents),
3611
- requiredCapabilities: Array.from(requiredCapabilities)
3612
- };
3613
- }
3614
-
3615
- // 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
3616
4203
  function primitiveTypeForField(field) {
3617
4204
  switch (field.type) {
3618
4205
  case "string":
@@ -4219,7 +4806,7 @@ var UI_STARTER_BLOCKS = [
4219
4806
  id: gen("paragraph"),
4220
4807
  type: "paragraph",
4221
4808
  props: {
4222
- content: "A visual builder designed for maximum craft, responsiveness, and performance."
4809
+ text: "A visual builder designed for maximum craft, responsiveness, and performance."
4223
4810
  },
4224
4811
  styles: {
4225
4812
  base: {
@@ -4277,7 +4864,7 @@ var UI_STARTER_BLOCKS = [
4277
4864
  {
4278
4865
  id: gen("badge"),
4279
4866
  type: "badge",
4280
- props: { label: "PRO FEATURE", variant: "primary" },
4867
+ props: { text: "PRO FEATURE", variant: "primary" },
4281
4868
  styles: { base: { marginBottom: "12px", display: "inline-block" } }
4282
4869
  },
4283
4870
  {
@@ -4292,7 +4879,7 @@ var UI_STARTER_BLOCKS = [
4292
4879
  id: gen("paragraph"),
4293
4880
  type: "paragraph",
4294
4881
  props: {
4295
- content: "Engineered for sub-millisecond render updates and zero runtime overhead."
4882
+ text: "Engineered for sub-millisecond render updates and zero runtime overhead."
4296
4883
  },
4297
4884
  styles: { base: { fontSize: "14px", color: "#64748b", lineHeight: "1.5" } }
4298
4885
  }
@@ -4356,7 +4943,7 @@ var UI_STARTER_BLOCKS = [
4356
4943
  {
4357
4944
  id: gen("paragraph"),
4358
4945
  type: "paragraph",
4359
- props: { content: "High dynamic range gradients crafted for modern presentations." },
4946
+ props: { text: "High dynamic range gradients crafted for modern presentations." },
4360
4947
  styles: { base: { fontSize: "13px", color: "#64748b", lineHeight: "1.4" } }
4361
4948
  }
4362
4949
  ]
@@ -4390,7 +4977,7 @@ var UI_STARTER_BLOCKS = [
4390
4977
  {
4391
4978
  id: gen("badge"),
4392
4979
  type: "badge",
4393
- props: { label: "MOST POPULAR", variant: "primary" },
4980
+ props: { text: "MOST POPULAR", variant: "primary" },
4394
4981
  styles: { base: { marginBottom: "12px", display: "inline-block" } }
4395
4982
  },
4396
4983
  {
@@ -4410,7 +4997,7 @@ var UI_STARTER_BLOCKS = [
4410
4997
  {
4411
4998
  id: gen("paragraph"),
4412
4999
  type: "paragraph",
4413
- props: { content: "Includes unlimited pages, custom domains, and team collaboration." },
5000
+ props: { text: "Includes unlimited pages, custom domains, and team collaboration." },
4414
5001
  styles: { base: { fontSize: "14px", color: "#64748b", marginBottom: "24px" } }
4415
5002
  },
4416
5003
  {
@@ -4467,7 +5054,7 @@ var UI_STARTER_BLOCKS = [
4467
5054
  {
4468
5055
  id: gen("paragraph"),
4469
5056
  type: "paragraph",
4470
- props: { content: "Start building with zero installation and instant live preview." },
5057
+ props: { text: "Start building with zero installation and instant live preview." },
4471
5058
  styles: {
4472
5059
  base: { fontSize: "16px", color: "#94a3b8", marginBottom: "24px", maxWidth: "600px", margin: "0 auto 24px auto" }
4473
5060
  }
@@ -4550,7 +5137,7 @@ var FORM_STARTER_BLOCKS = [
4550
5137
  id: gen("paragraph"),
4551
5138
  type: "paragraph",
4552
5139
  props: {
4553
- 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."
4554
5141
  },
4555
5142
  styles: {
4556
5143
  base: {
@@ -4808,7 +5395,7 @@ var FORM_STARTER_BLOCKS = [
4808
5395
  id: gen("paragraph"),
4809
5396
  type: "paragraph",
4810
5397
  props: {
4811
- 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."
4812
5399
  },
4813
5400
  styles: {
4814
5401
  base: {
@@ -4986,7 +5573,7 @@ var FORM_STARTER_BLOCKS = [
4986
5573
  {
4987
5574
  id: gen("badge"),
4988
5575
  type: "badge",
4989
- props: { label: "FREE CONSULTATION", variant: "primary" },
5576
+ props: { text: "FREE CONSULTATION", variant: "primary" },
4990
5577
  styles: { base: { marginBottom: "12px", display: "inline-block" } }
4991
5578
  },
4992
5579
  {
@@ -5006,7 +5593,7 @@ var FORM_STARTER_BLOCKS = [
5006
5593
  id: gen("paragraph"),
5007
5594
  type: "paragraph",
5008
5595
  props: {
5009
- 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."
5010
5597
  },
5011
5598
  styles: {
5012
5599
  base: {
@@ -5247,24 +5834,618 @@ var FORM_STARTER_BLOCKS = [
5247
5834
  }
5248
5835
  ];
5249
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
+
5250
6423
  // src/blocks/index.ts
5251
6424
  var STARTER_BLOCKS = [
5252
6425
  ...LAYOUT_STARTER_BLOCKS,
5253
6426
  ...UI_STARTER_BLOCKS,
5254
- ...FORM_STARTER_BLOCKS
6427
+ ...FORM_STARTER_BLOCKS,
6428
+ ...SALES_STARTER_BLOCKS
5255
6429
  ];
5256
6430
  // Annotate the CommonJS export names for ESM import in node:
5257
6431
  0 && (module.exports = {
5258
6432
  CONTENT_CHILD_TYPES,
6433
+ COUNTDOWN_EXPIRE_BEHAVIORS,
6434
+ COUNTDOWN_FORMATS,
6435
+ COUNTDOWN_MODES,
6436
+ COUNTDOWN_STORAGE_TYPES,
5259
6437
  ComponentRegistry,
5260
6438
  FORM_STARTER_BLOCKS,
5261
6439
  LAYOUT_PARENTS,
5262
6440
  LAYOUT_STARTER_BLOCKS,
6441
+ SALES_STARTER_BLOCKS,
5263
6442
  STARTER_BLOCKS,
5264
6443
  TRAIT_GROUP_LABELS,
5265
6444
  TRAIT_GROUP_ORDER,
5266
6445
  UI_STARTER_BLOCKS,
5267
6446
  acceptTrait,
6447
+ accordionDefinition,
6448
+ accordionItemDefinition,
5268
6449
  actionTrait,
5269
6450
  altTrait,
5270
6451
  ariaLabelTrait,
@@ -5277,6 +6458,8 @@ var STARTER_BLOCKS = [
5277
6458
  buttonDefinition,
5278
6459
  buttonSubmitDefinition,
5279
6460
  buttonTypeTrait,
6461
+ canonicalTextPropFields,
6462
+ carouselDefinition,
5280
6463
  checkboxDefinition,
5281
6464
  citeTrait,
5282
6465
  codeBlockDefinition,
@@ -5288,12 +6471,14 @@ var STARTER_BLOCKS = [
5288
6471
  containerDefinition,
5289
6472
  controlsTrait,
5290
6473
  coreComponentDefinitions,
6474
+ countdownDefinition,
5291
6475
  createDefaultComponentRegistry,
5292
6476
  defaultCheckedTrait,
5293
6477
  defaultGenId,
5294
6478
  defaultSelectedTrait,
5295
6479
  defaultValueTrait,
5296
6480
  disabledTrait,
6481
+ dividerDefinition,
5297
6482
  drawerDefinition,
5298
6483
  extractComponentRequirements,
5299
6484
  fieldNameTrait,
@@ -5340,6 +6525,7 @@ var STARTER_BLOCKS = [
5340
6525
  radioDefinition,
5341
6526
  radioGroupDefinition,
5342
6527
  radioItemDefinition,
6528
+ ratingDefinition,
5343
6529
  readOnlyTrait,
5344
6530
  relTrait,
5345
6531
  requiredTrait,
@@ -5353,13 +6539,16 @@ var STARTER_BLOCKS = [
5353
6539
  showPreviewTrait,
5354
6540
  showSpinnerTrait,
5355
6541
  sortTraits,
6542
+ spacerDefinition,
5356
6543
  srcTrait,
5357
6544
  suffixIconTrait,
5358
6545
  switchDefinition,
5359
6546
  switchSizeTrait,
6547
+ tabPanelDefinition,
5360
6548
  tableCellDefinition,
5361
6549
  tableDefinition,
5362
6550
  tableRowDefinition,
6551
+ tabsDefinition,
5363
6552
  tagTrait,
5364
6553
  targetTrait,
5365
6554
  textDefinition,