le-kit 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/custom-elements.json +1048 -1048
  2. package/dist/core/cjs/le-button.cjs.entry.js +1 -1
  3. package/dist/core/cjs/le-button.entry.cjs.js.map +1 -1
  4. package/dist/core/cjs/le-card.cjs.entry.js +1 -1
  5. package/dist/core/cjs/le-card.entry.cjs.js.map +1 -1
  6. package/dist/core/cjs/le-string-input.cjs.entry.js +1 -1
  7. package/dist/core/cjs/le-string-input.entry.cjs.js.map +1 -1
  8. package/dist/core/collection/components/le-button/le-button.default.css +23 -23
  9. package/dist/core/collection/components/le-card/le-card.default.css +6 -6
  10. package/dist/core/collection/components/le-string-input/le-string-input.css +1 -1
  11. package/dist/core/esm/le-button.entry.js +1 -1
  12. package/dist/core/esm/le-button.entry.js.map +1 -1
  13. package/dist/core/esm/le-card.entry.js +1 -1
  14. package/dist/core/esm/le-card.entry.js.map +1 -1
  15. package/dist/core/esm/le-string-input.entry.js +1 -1
  16. package/dist/core/esm/le-string-input.entry.js.map +1 -1
  17. package/dist/core/le-kit/le-button.entry.esm.js.map +1 -1
  18. package/dist/core/le-kit/le-card.entry.esm.js.map +1 -1
  19. package/dist/core/le-kit/le-kit.esm.js +1 -1
  20. package/dist/core/le-kit/le-string-input.entry.esm.js.map +1 -1
  21. package/dist/core/le-kit/p-4a9a9805.entry.js +2 -0
  22. package/dist/core/le-kit/{p-fb4e68e0.entry.js.map → p-4a9a9805.entry.js.map} +1 -1
  23. package/dist/core/le-kit/p-a5f1e539.entry.js +2 -0
  24. package/dist/core/le-kit/{p-86961f34.entry.js.map → p-a5f1e539.entry.js.map} +1 -1
  25. package/dist/core/le-kit/p-fd665f35.entry.js +2 -0
  26. package/dist/core/le-kit/{p-a07048f8.entry.js.map → p-fd665f35.entry.js.map} +1 -1
  27. package/dist/docs.json +1 -1
  28. package/package.json +7 -6
  29. package/dist/core/le-kit/p-86961f34.entry.js +0 -2
  30. package/dist/core/le-kit/p-a07048f8.entry.js +0 -2
  31. package/dist/core/le-kit/p-fb4e68e0.entry.js +0 -2
@@ -878,38 +878,16 @@
878
878
  },
879
879
  {
880
880
  "kind": "javascript-module",
881
- "path": "src/components/le-checkbox/le-checkbox.tsx",
881
+ "path": "src/components/le-component/le-component.tsx",
882
882
  "declarations": [
883
883
  {
884
884
  "kind": "class",
885
- "description": "A checkbox component with support for labels, descriptions, and external IDs.",
886
- "name": "LeCheckbox",
887
- "cssProperties": [
888
- {
889
- "description": "Size of the checkbox input",
890
- "name": "--le-checkbox-size"
891
- },
892
- {
893
- "description": "Color of the checkbox when checked",
894
- "name": "--le-checkbox-color"
895
- },
896
- {
897
- "description": "Color of the label text",
898
- "name": "--le-checkbox-label-color"
899
- },
900
- {
901
- "description": "Color of the description text",
902
- "name": "--le-checkbox-desc-color"
903
- }
904
- ],
885
+ "description": "Component wrapper for admin mode editing.\n\nThis component is used internally by other components to provide admin-mode\nediting capabilities. It wraps the component's rendered output and shows\na settings popover for editing properties.\n\nIn default mode, it acts as a simple passthrough (display: contents).\nIn admin mode, it shows a border, component name header, and settings popover.\n\nThe host element is found automatically by traversing up through the shadow DOM.\n\nUsage inside a component's render method:\n```tsx\nrender() {\n return (\n <le-component component=\"le-card\">\n <Host>...</Host>\n </le-component>\n );\n}\n```",
886
+ "name": "LeComponent",
905
887
  "slots": [
906
888
  {
907
- "description": "The label text for the checkbox",
889
+ "description": "The component's rendered content",
908
890
  "name": ""
909
- },
910
- {
911
- "description": "Additional description text displayed below the label",
912
- "name": "description"
913
891
  }
914
892
  ],
915
893
  "members": [
@@ -922,502 +900,429 @@
922
900
  },
923
901
  {
924
902
  "kind": "field",
925
- "name": "checked",
926
- "type": {
927
- "text": "boolean"
928
- },
929
- "default": "false",
930
- "description": "Whether the checkbox is checked"
931
- },
932
- {
933
- "kind": "field",
934
- "name": "disabled",
935
- "type": {
936
- "text": "boolean"
937
- },
938
- "default": "false",
939
- "description": "Whether the checkbox is disabled"
940
- },
941
- {
942
- "kind": "field",
943
- "name": "name",
903
+ "name": "component",
944
904
  "type": {
945
905
  "text": "string"
946
906
  },
947
- "description": "The name of the checkbox input"
907
+ "description": "The tag name of the component (e.g., 'le-card').\nUsed to look up property metadata and display the component name."
948
908
  },
949
909
  {
950
910
  "kind": "field",
951
- "name": "value",
911
+ "name": "displayName",
952
912
  "type": {
953
- "text": "string"
913
+ "text": "string | undefined"
954
914
  },
955
- "description": "The value of the checkbox input"
915
+ "description": "Optional display name for the component.\nIf not provided, the tag name will be formatted as the display name."
956
916
  },
957
917
  {
958
918
  "kind": "field",
959
- "name": "externalId",
919
+ "name": "hostClass",
960
920
  "type": {
961
- "text": "string"
921
+ "text": "string | undefined"
962
922
  },
963
- "description": "External ID for linking with external systems (e.g. database ID, PDF form field ID)"
923
+ "description": "Classes to apply to the host element.\nAllows parent components to pass their styling classes."
964
924
  },
965
925
  {
966
926
  "kind": "field",
967
- "name": "handleChange",
968
- "privacy": "private"
969
- },
970
- {
971
- "kind": "method",
972
- "name": "render"
973
- }
974
- ],
975
- "attributes": [
976
- {
977
- "name": "checked",
978
- "fieldName": "checked",
979
- "default": "false",
980
- "description": "Whether the checkbox is checked",
981
- "type": {
982
- "text": "boolean"
983
- }
984
- },
985
- {
986
- "name": "disabled",
987
- "fieldName": "disabled",
988
- "default": "false",
989
- "description": "Whether the checkbox is disabled",
990
- "type": {
991
- "text": "boolean"
992
- }
993
- },
994
- {
995
- "name": "name",
996
- "fieldName": "name",
997
- "description": "The name of the checkbox input",
998
- "type": {
999
- "text": "string"
1000
- }
1001
- },
1002
- {
1003
- "name": "value",
1004
- "fieldName": "value",
1005
- "description": "The value of the checkbox input",
1006
- "type": {
1007
- "text": "string"
1008
- }
1009
- },
1010
- {
1011
- "name": "external-id",
1012
- "fieldName": "externalId",
1013
- "description": "External ID for linking with external systems (e.g. database ID, PDF form field ID)",
1014
- "type": {
1015
- "text": "string"
1016
- }
1017
- }
1018
- ],
1019
- "tagName": "le-checkbox",
1020
- "events": [
1021
- {
1022
- "name": "change",
927
+ "name": "hostStyle",
1023
928
  "type": {
1024
- "text": "EventEmitter<{ checked: boolean; value: string; name: string; externalId: string }>"
929
+ "text": "{ [key: string]: string } | undefined"
1025
930
  },
1026
- "description": "Emitted when the checked state changes"
1027
- }
1028
- ],
1029
- "customElement": true
1030
- }
1031
- ],
1032
- "exports": [
1033
- {
1034
- "kind": "js",
1035
- "name": "LeCheckbox",
1036
- "declaration": {
1037
- "name": "LeCheckbox",
1038
- "module": "src/components/le-checkbox/le-checkbox.tsx"
1039
- }
1040
- },
1041
- {
1042
- "kind": "custom-element-definition",
1043
- "name": "le-checkbox",
1044
- "declaration": {
1045
- "name": "LeCheckbox",
1046
- "module": "src/components/le-checkbox/le-checkbox.tsx"
1047
- }
1048
- }
1049
- ]
1050
- },
1051
- {
1052
- "kind": "javascript-module",
1053
- "path": "src/components/le-popover/le-popover.tsx",
1054
- "declarations": [
1055
- {
1056
- "kind": "class",
1057
- "description": "A popover component for displaying floating content.\n\nUses the native HTML Popover API for proper layering with dialogs\nand other top-layer elements. Falls back gracefully in older browsers.",
1058
- "name": "LePopover",
1059
- "slots": [
1060
- {
1061
- "description": "Content to display inside the popover",
1062
- "name": ""
1063
- },
1064
- {
1065
- "description": "Element that triggers the popover (optional)",
1066
- "name": "trigger"
1067
- }
1068
- ],
1069
- "members": [
1070
- {
1071
- "kind": "field",
1072
- "name": "el",
1073
- "type": {
1074
- "text": "HTMLElement"
1075
- }
931
+ "description": "Inline styles to apply to the host element.\nAllows parent components to pass dynamic styles (e.g., flex properties)."
1076
932
  },
1077
933
  {
1078
934
  "kind": "field",
1079
- "name": "mode",
935
+ "name": "hostElement",
1080
936
  "type": {
1081
- "text": "'default' | 'admin'"
937
+ "text": "HTMLElement | undefined"
1082
938
  },
1083
- "description": "Mode of the popover should be 'default' for internal use"
939
+ "privacy": "private",
940
+ "description": "Reference to the host element (found automatically from parent)"
1084
941
  },
1085
942
  {
1086
943
  "kind": "field",
1087
- "name": "open",
944
+ "name": "adminMode",
1088
945
  "type": {
1089
946
  "text": "boolean"
1090
947
  },
948
+ "privacy": "private",
1091
949
  "default": "false",
1092
- "description": "Whether the popover is currently open"
950
+ "description": "Internal state to track admin mode"
1093
951
  },
1094
952
  {
1095
953
  "kind": "field",
1096
- "name": "position",
954
+ "name": "componentMeta",
1097
955
  "type": {
1098
- "text": "'top' | 'bottom' | 'left' | 'right' | 'auto'"
956
+ "text": "ComponentMetadata | null"
1099
957
  },
1100
- "default": "'bottom'",
1101
- "description": "Position of the popover relative to its trigger"
958
+ "privacy": "private",
959
+ "default": "null",
960
+ "description": "Component metadata loaded from Custom Elements Manifest"
1102
961
  },
1103
962
  {
1104
963
  "kind": "field",
1105
- "name": "align",
964
+ "name": "propertyValues",
1106
965
  "type": {
1107
- "text": "'start' | 'center' | 'end'"
966
+ "text": "Record<string, any>"
1108
967
  },
1109
- "default": "'start'",
1110
- "description": "Alignment of the popover"
968
+ "privacy": "private",
969
+ "default": "{}",
970
+ "description": "Current property values of the host component"
1111
971
  },
1112
972
  {
1113
973
  "kind": "field",
1114
- "name": "popoverTitle",
974
+ "name": "disconnectModeObserver",
1115
975
  "type": {
1116
- "text": "string | undefined"
976
+ "text": "() => void | undefined"
1117
977
  },
1118
- "description": "Optional title for the popover header"
978
+ "privacy": "private"
1119
979
  },
1120
980
  {
1121
- "kind": "field",
1122
- "name": "showClose",
1123
- "type": {
1124
- "text": "boolean"
1125
- },
1126
- "default": "true",
1127
- "description": "Whether to show a close button in the header"
981
+ "kind": "method",
982
+ "name": "findHostElement",
983
+ "privacy": "private",
984
+ "description": "Find the host element by traversing up through shadow DOM"
1128
985
  },
1129
986
  {
1130
- "kind": "field",
1131
- "name": "closeOnClickOutside",
1132
- "type": {
1133
- "text": "boolean"
987
+ "kind": "method",
988
+ "name": "formatDisplayName",
989
+ "privacy": "private",
990
+ "return": {
991
+ "type": {
992
+ "text": "string"
993
+ }
1134
994
  },
1135
- "default": "true",
1136
- "description": "Whether clicking outside closes the popover"
995
+ "parameters": [
996
+ {
997
+ "name": "tagName",
998
+ "type": {
999
+ "text": "string"
1000
+ }
1001
+ }
1002
+ ],
1003
+ "description": "Formats a tag name into a display name\ne.g., 'le-card' -> 'Card'"
1137
1004
  },
1138
1005
  {
1139
- "kind": "field",
1140
- "name": "closeOnEscape",
1141
- "type": {
1142
- "text": "boolean"
1143
- },
1144
- "default": "true",
1145
- "description": "Whether pressing Escape closes the popover"
1006
+ "kind": "method",
1007
+ "name": "loadComponentMetadata",
1008
+ "privacy": "private",
1009
+ "description": "Load component metadata from the Custom Elements Manifest"
1146
1010
  },
1147
1011
  {
1148
- "kind": "field",
1149
- "name": "offset",
1150
- "type": {
1151
- "text": "number"
1152
- },
1153
- "default": "8",
1154
- "description": "Offset from the trigger element (in pixels)"
1155
- },
1156
- {
1157
- "kind": "field",
1158
- "name": "width",
1159
- "type": {
1160
- "text": "string | undefined"
1161
- },
1162
- "description": "Fixed width for the popover (e.g., '300px', '20rem')"
1163
- },
1164
- {
1165
- "kind": "field",
1166
- "name": "minWidth",
1167
- "type": {
1168
- "text": "string | undefined"
1169
- },
1170
- "default": "'200px'",
1171
- "description": "Minimum width for the popover (e.g., '200px', '15rem')"
1172
- },
1173
- {
1174
- "kind": "field",
1175
- "name": "maxWidth",
1176
- "type": {
1177
- "text": "string | undefined"
1178
- },
1179
- "description": "Maximum width for the popover (e.g., '400px', '25rem')"
1180
- },
1181
- {
1182
- "kind": "field",
1183
- "name": "isPositioned",
1184
- "type": {
1185
- "text": "boolean"
1186
- },
1012
+ "kind": "method",
1013
+ "name": "isInternalAttribute",
1187
1014
  "privacy": "private",
1188
- "default": "false"
1189
- },
1190
- {
1191
- "kind": "field",
1192
- "name": "triggerEl",
1193
- "type": {
1194
- "text": "HTMLElement | undefined"
1195
- },
1196
- "privacy": "private"
1197
- },
1198
- {
1199
- "kind": "field",
1200
- "name": "popoverEl",
1201
- "type": {
1202
- "text": "HTMLElement | undefined"
1203
- },
1204
- "privacy": "private"
1205
- },
1206
- {
1207
- "kind": "field",
1208
- "name": "uniqueId",
1209
- "type": {
1210
- "text": "string"
1015
+ "return": {
1016
+ "type": {
1017
+ "text": "boolean"
1018
+ }
1211
1019
  },
1212
- "privacy": "private",
1213
- "default": "`le-popover-${Math.random().toString(36).substr(2, 9)}`"
1020
+ "parameters": [
1021
+ {
1022
+ "name": "name",
1023
+ "type": {
1024
+ "text": "string"
1025
+ }
1026
+ }
1027
+ ],
1028
+ "description": "Check if an attribute is internal (should not be shown in editor)"
1214
1029
  },
1215
1030
  {
1216
- "kind": "field",
1217
- "name": "scrollParents",
1218
- "type": {
1219
- "text": "Element[]"
1220
- },
1031
+ "kind": "method",
1032
+ "name": "readPropertyValues",
1221
1033
  "privacy": "private",
1222
- "default": "[]"
1034
+ "description": "Read current property values from the host element"
1223
1035
  },
1224
1036
  {
1225
1037
  "kind": "method",
1226
- "name": "getScrollParents",
1038
+ "name": "parseAttributeValue",
1227
1039
  "privacy": "private",
1228
1040
  "return": {
1229
1041
  "type": {
1230
- "text": "Element[]"
1042
+ "text": "any"
1231
1043
  }
1232
1044
  },
1233
1045
  "parameters": [
1234
1046
  {
1235
- "name": "element",
1047
+ "name": "value",
1236
1048
  "type": {
1237
- "text": "Element"
1049
+ "text": "string | null"
1050
+ }
1051
+ },
1052
+ {
1053
+ "name": "type",
1054
+ "optional": true,
1055
+ "type": {
1056
+ "text": "string"
1238
1057
  }
1239
1058
  }
1240
1059
  ],
1241
- "description": "Find all scrollable parent elements"
1060
+ "description": "Parse an attribute value based on its type"
1242
1061
  },
1243
1062
  {
1244
1063
  "kind": "method",
1245
- "name": "addScrollListeners",
1064
+ "name": "handlePropertyChange",
1246
1065
  "privacy": "private",
1247
- "description": "Add scroll listeners to all scrollable parents"
1066
+ "parameters": [
1067
+ {
1068
+ "name": "attrName",
1069
+ "type": {
1070
+ "text": "string"
1071
+ }
1072
+ },
1073
+ {
1074
+ "name": "value",
1075
+ "type": {
1076
+ "text": "any"
1077
+ }
1078
+ },
1079
+ {
1080
+ "name": "type",
1081
+ "optional": true,
1082
+ "type": {
1083
+ "text": "string"
1084
+ }
1085
+ }
1086
+ ],
1087
+ "description": "Handle property value changes from the editor"
1248
1088
  },
1249
1089
  {
1250
1090
  "kind": "method",
1251
- "name": "removeScrollListeners",
1091
+ "name": "deleteComponent",
1252
1092
  "privacy": "private",
1253
- "description": "Remove scroll listeners"
1093
+ "description": "Delete this component from the DOM"
1254
1094
  },
1255
1095
  {
1256
- "kind": "field",
1257
- "name": "handleScroll",
1258
- "privacy": "private"
1096
+ "kind": "method",
1097
+ "name": "renderPropertyEditor",
1098
+ "privacy": "private",
1099
+ "description": "Render the property editor form"
1259
1100
  },
1260
1101
  {
1261
- "kind": "field",
1262
- "name": "handlePopoverToggle",
1263
- "privacy": "private"
1102
+ "kind": "method",
1103
+ "name": "renderPropertyField",
1104
+ "privacy": "private",
1105
+ "parameters": [
1106
+ {
1107
+ "name": "attr",
1108
+ "type": {
1109
+ "text": "AttributeMetadata"
1110
+ }
1111
+ }
1112
+ ],
1113
+ "description": "Render a single property field based on its type"
1264
1114
  },
1265
1115
  {
1266
- "kind": "field",
1267
- "name": "handleOtherPopoverOpen",
1268
- "privacy": "private"
1116
+ "kind": "method",
1117
+ "name": "render"
1118
+ }
1119
+ ],
1120
+ "attributes": [
1121
+ {
1122
+ "name": "component",
1123
+ "fieldName": "component",
1124
+ "description": "The tag name of the component (e.g., 'le-card').\nUsed to look up property metadata and display the component name.",
1125
+ "type": {
1126
+ "text": "string"
1127
+ }
1269
1128
  },
1270
1129
  {
1271
- "kind": "method",
1272
- "name": "show",
1273
- "description": "Opens the popover"
1130
+ "name": "display-name",
1131
+ "fieldName": "displayName",
1132
+ "description": "Optional display name for the component.\nIf not provided, the tag name will be formatted as the display name.",
1133
+ "type": {
1134
+ "text": "string"
1135
+ }
1274
1136
  },
1275
1137
  {
1276
- "kind": "method",
1277
- "name": "hide",
1278
- "description": "Closes the popover"
1138
+ "name": "host-class",
1139
+ "fieldName": "hostClass",
1140
+ "description": "Classes to apply to the host element.\nAllows parent components to pass their styling classes.",
1141
+ "type": {
1142
+ "text": "string"
1143
+ }
1279
1144
  },
1280
1145
  {
1281
- "kind": "method",
1282
- "name": "toggle",
1283
- "description": "Toggles the popover"
1146
+ "name": "host-style",
1147
+ "fieldName": "hostStyle",
1148
+ "description": "Inline styles to apply to the host element.\nAllows parent components to pass dynamic styles (e.g., flex properties).",
1149
+ "type": {
1150
+ "text": "{ [key: string]: string }"
1151
+ }
1152
+ }
1153
+ ],
1154
+ "tagName": "le-component",
1155
+ "events": [],
1156
+ "customElement": true
1157
+ }
1158
+ ],
1159
+ "exports": [
1160
+ {
1161
+ "kind": "js",
1162
+ "name": "LeComponent",
1163
+ "declaration": {
1164
+ "name": "LeComponent",
1165
+ "module": "src/components/le-component/le-component.tsx"
1166
+ }
1167
+ },
1168
+ {
1169
+ "kind": "custom-element-definition",
1170
+ "name": "le-component",
1171
+ "declaration": {
1172
+ "name": "LeComponent",
1173
+ "module": "src/components/le-component/le-component.tsx"
1174
+ }
1175
+ }
1176
+ ]
1177
+ },
1178
+ {
1179
+ "kind": "javascript-module",
1180
+ "path": "src/components/le-checkbox/le-checkbox.tsx",
1181
+ "declarations": [
1182
+ {
1183
+ "kind": "class",
1184
+ "description": "A checkbox component with support for labels, descriptions, and external IDs.",
1185
+ "name": "LeCheckbox",
1186
+ "cssProperties": [
1187
+ {
1188
+ "description": "Size of the checkbox input",
1189
+ "name": "--le-checkbox-size"
1284
1190
  },
1285
1191
  {
1286
- "kind": "field",
1287
- "name": "handleTriggerClick",
1288
- "privacy": "private"
1192
+ "description": "Color of the checkbox when checked",
1193
+ "name": "--le-checkbox-color"
1289
1194
  },
1290
1195
  {
1291
- "kind": "method",
1292
- "name": "updatePosition",
1293
- "privacy": "private"
1196
+ "description": "Color of the label text",
1197
+ "name": "--le-checkbox-label-color"
1294
1198
  },
1295
1199
  {
1296
- "kind": "method",
1297
- "name": "render"
1200
+ "description": "Color of the description text",
1201
+ "name": "--le-checkbox-desc-color"
1298
1202
  }
1299
1203
  ],
1300
- "attributes": [
1204
+ "slots": [
1301
1205
  {
1302
- "name": "mode",
1303
- "fieldName": "mode",
1304
- "description": "Mode of the popover should be 'default' for internal use",
1206
+ "description": "The label text for the checkbox",
1207
+ "name": ""
1208
+ },
1209
+ {
1210
+ "description": "Additional description text displayed below the label",
1211
+ "name": "description"
1212
+ }
1213
+ ],
1214
+ "members": [
1215
+ {
1216
+ "kind": "field",
1217
+ "name": "el",
1305
1218
  "type": {
1306
- "text": "'default' | 'admin'"
1219
+ "text": "HTMLElement"
1307
1220
  }
1308
1221
  },
1309
1222
  {
1310
- "name": "open",
1311
- "fieldName": "open",
1312
- "default": "false",
1313
- "description": "Whether the popover is currently open",
1223
+ "kind": "field",
1224
+ "name": "checked",
1314
1225
  "type": {
1315
1226
  "text": "boolean"
1316
- }
1227
+ },
1228
+ "default": "false",
1229
+ "description": "Whether the checkbox is checked"
1317
1230
  },
1318
1231
  {
1319
- "name": "position",
1320
- "fieldName": "position",
1321
- "default": "'bottom'",
1322
- "description": "Position of the popover relative to its trigger",
1232
+ "kind": "field",
1233
+ "name": "disabled",
1323
1234
  "type": {
1324
- "text": "'top' | 'bottom' | 'left' | 'right' | 'auto'"
1325
- }
1235
+ "text": "boolean"
1236
+ },
1237
+ "default": "false",
1238
+ "description": "Whether the checkbox is disabled"
1326
1239
  },
1327
1240
  {
1328
- "name": "align",
1329
- "fieldName": "align",
1330
- "default": "'start'",
1331
- "description": "Alignment of the popover",
1241
+ "kind": "field",
1242
+ "name": "name",
1332
1243
  "type": {
1333
- "text": "'start' | 'center' | 'end'"
1334
- }
1244
+ "text": "string"
1245
+ },
1246
+ "description": "The name of the checkbox input"
1335
1247
  },
1336
1248
  {
1337
- "name": "popover-title",
1338
- "fieldName": "popoverTitle",
1339
- "description": "Optional title for the popover header",
1249
+ "kind": "field",
1250
+ "name": "value",
1340
1251
  "type": {
1341
1252
  "text": "string"
1342
- }
1253
+ },
1254
+ "description": "The value of the checkbox input"
1343
1255
  },
1344
1256
  {
1345
- "name": "show-close",
1346
- "fieldName": "showClose",
1347
- "default": "true",
1348
- "description": "Whether to show a close button in the header",
1257
+ "kind": "field",
1258
+ "name": "externalId",
1349
1259
  "type": {
1350
- "text": "boolean"
1351
- }
1260
+ "text": "string"
1261
+ },
1262
+ "description": "External ID for linking with external systems (e.g. database ID, PDF form field ID)"
1352
1263
  },
1353
1264
  {
1354
- "name": "close-on-click-outside",
1355
- "fieldName": "closeOnClickOutside",
1356
- "default": "true",
1357
- "description": "Whether clicking outside closes the popover",
1358
- "type": {
1359
- "text": "boolean"
1360
- }
1265
+ "kind": "field",
1266
+ "name": "handleChange",
1267
+ "privacy": "private"
1361
1268
  },
1362
1269
  {
1363
- "name": "close-on-escape",
1364
- "fieldName": "closeOnEscape",
1365
- "default": "true",
1366
- "description": "Whether pressing Escape closes the popover",
1270
+ "kind": "method",
1271
+ "name": "render"
1272
+ }
1273
+ ],
1274
+ "attributes": [
1275
+ {
1276
+ "name": "checked",
1277
+ "fieldName": "checked",
1278
+ "default": "false",
1279
+ "description": "Whether the checkbox is checked",
1367
1280
  "type": {
1368
1281
  "text": "boolean"
1369
1282
  }
1370
1283
  },
1371
1284
  {
1372
- "name": "offset",
1373
- "fieldName": "offset",
1374
- "default": "8",
1375
- "description": "Offset from the trigger element (in pixels)",
1285
+ "name": "disabled",
1286
+ "fieldName": "disabled",
1287
+ "default": "false",
1288
+ "description": "Whether the checkbox is disabled",
1376
1289
  "type": {
1377
- "text": "number"
1290
+ "text": "boolean"
1378
1291
  }
1379
1292
  },
1380
1293
  {
1381
- "name": "width",
1382
- "fieldName": "width",
1383
- "description": "Fixed width for the popover (e.g., '300px', '20rem')",
1294
+ "name": "name",
1295
+ "fieldName": "name",
1296
+ "description": "The name of the checkbox input",
1384
1297
  "type": {
1385
1298
  "text": "string"
1386
1299
  }
1387
1300
  },
1388
1301
  {
1389
- "name": "min-width",
1390
- "fieldName": "minWidth",
1391
- "default": "'200px'",
1392
- "description": "Minimum width for the popover (e.g., '200px', '15rem')",
1302
+ "name": "value",
1303
+ "fieldName": "value",
1304
+ "description": "The value of the checkbox input",
1393
1305
  "type": {
1394
1306
  "text": "string"
1395
1307
  }
1396
1308
  },
1397
1309
  {
1398
- "name": "max-width",
1399
- "fieldName": "maxWidth",
1400
- "description": "Maximum width for the popover (e.g., '400px', '25rem')",
1310
+ "name": "external-id",
1311
+ "fieldName": "externalId",
1312
+ "description": "External ID for linking with external systems (e.g. database ID, PDF form field ID)",
1401
1313
  "type": {
1402
1314
  "text": "string"
1403
1315
  }
1404
1316
  }
1405
1317
  ],
1406
- "tagName": "le-popover",
1318
+ "tagName": "le-checkbox",
1407
1319
  "events": [
1408
1320
  {
1409
- "name": "lePopoverOpen",
1410
- "type": {
1411
- "text": "EventEmitter<void>"
1412
- },
1413
- "description": "Emitted when the popover opens"
1414
- },
1415
- {
1416
- "name": "lePopoverClose",
1321
+ "name": "change",
1417
1322
  "type": {
1418
- "text": "EventEmitter<void>"
1323
+ "text": "EventEmitter<{ checked: boolean; value: string; name: string; externalId: string }>"
1419
1324
  },
1420
- "description": "Emitted when the popover closes"
1325
+ "description": "Emitted when the checked state changes"
1421
1326
  }
1422
1327
  ],
1423
1328
  "customElement": true
@@ -1426,72 +1331,38 @@
1426
1331
  "exports": [
1427
1332
  {
1428
1333
  "kind": "js",
1429
- "name": "LePopover",
1334
+ "name": "LeCheckbox",
1430
1335
  "declaration": {
1431
- "name": "LePopover",
1432
- "module": "src/components/le-popover/le-popover.tsx"
1336
+ "name": "LeCheckbox",
1337
+ "module": "src/components/le-checkbox/le-checkbox.tsx"
1433
1338
  }
1434
1339
  },
1435
1340
  {
1436
1341
  "kind": "custom-element-definition",
1437
- "name": "le-popover",
1342
+ "name": "le-checkbox",
1438
1343
  "declaration": {
1439
- "name": "LePopover",
1440
- "module": "src/components/le-popover/le-popover.tsx"
1344
+ "name": "LeCheckbox",
1345
+ "module": "src/components/le-checkbox/le-checkbox.tsx"
1441
1346
  }
1442
1347
  }
1443
1348
  ]
1444
1349
  },
1445
1350
  {
1446
1351
  "kind": "javascript-module",
1447
- "path": "src/components/le-number-input/le-number-input.tsx",
1352
+ "path": "src/components/le-popover/le-popover.tsx",
1448
1353
  "declarations": [
1449
1354
  {
1450
1355
  "kind": "class",
1451
- "description": "A number input component with validation, keyboard controls, and custom spinners.",
1452
- "name": "LeNumberInput",
1453
- "cssProperties": [
1454
- {
1455
- "description": "Input background color",
1456
- "name": "--le-input-bg"
1457
- },
1458
- {
1459
- "description": "Input text color",
1460
- "name": "--le-input-color"
1461
- },
1462
- {
1463
- "description": "Input border style",
1464
- "name": "--le-input-border"
1465
- },
1466
- {
1467
- "description": "Input border style when focused",
1468
- "name": "--le-input-border-focus"
1469
- },
1470
- {
1471
- "description": "Input border style when invalid",
1472
- "name": "--le-input-border-error"
1473
- },
1474
- {
1475
- "description": "Input border radius",
1476
- "name": "--le-input-radius"
1477
- },
1478
- {
1479
- "description": "Input padding",
1480
- "name": "--le-input-padding"
1481
- }
1482
- ],
1356
+ "description": "A popover component for displaying floating content.\n\nUses the native HTML Popover API for proper layering with dialogs\nand other top-layer elements. Falls back gracefully in older browsers.",
1357
+ "name": "LePopover",
1483
1358
  "slots": [
1484
1359
  {
1485
- "description": "The label text for the input",
1360
+ "description": "Content to display inside the popover",
1486
1361
  "name": ""
1487
1362
  },
1488
1363
  {
1489
- "description": "Additional description text displayed below the input",
1490
- "name": "description"
1491
- },
1492
- {
1493
- "description": "Icon to display at the start of the input",
1494
- "name": "icon-start"
1364
+ "description": "Element that triggers the popover (optional)",
1365
+ "name": "trigger"
1495
1366
  }
1496
1367
  ],
1497
1368
  "members": [
@@ -1504,192 +1375,220 @@
1504
1375
  },
1505
1376
  {
1506
1377
  "kind": "field",
1507
- "name": "value",
1508
- "type": {
1509
- "text": "number"
1510
- },
1511
- "description": "The value of the input"
1512
- },
1513
- {
1514
- "kind": "field",
1515
- "name": "name",
1378
+ "name": "mode",
1516
1379
  "type": {
1517
- "text": "string"
1380
+ "text": "'default' | 'admin'"
1518
1381
  },
1519
- "description": "The name of the input"
1382
+ "description": "Mode of the popover should be 'default' for internal use"
1520
1383
  },
1521
1384
  {
1522
1385
  "kind": "field",
1523
- "name": "label",
1386
+ "name": "open",
1524
1387
  "type": {
1525
- "text": "string"
1388
+ "text": "boolean"
1526
1389
  },
1527
- "description": "Label for the input"
1390
+ "default": "false",
1391
+ "description": "Whether the popover is currently open"
1528
1392
  },
1529
1393
  {
1530
1394
  "kind": "field",
1531
- "name": "placeholder",
1395
+ "name": "position",
1532
1396
  "type": {
1533
- "text": "string"
1397
+ "text": "'top' | 'bottom' | 'left' | 'right' | 'auto'"
1534
1398
  },
1535
- "description": "Placeholder text"
1399
+ "default": "'bottom'",
1400
+ "description": "Position of the popover relative to its trigger"
1536
1401
  },
1537
1402
  {
1538
1403
  "kind": "field",
1539
- "name": "min",
1404
+ "name": "align",
1540
1405
  "type": {
1541
- "text": "number | undefined"
1406
+ "text": "'start' | 'center' | 'end'"
1542
1407
  },
1543
- "description": "Minimum allowed value"
1408
+ "default": "'start'",
1409
+ "description": "Alignment of the popover"
1544
1410
  },
1545
1411
  {
1546
1412
  "kind": "field",
1547
- "name": "max",
1413
+ "name": "popoverTitle",
1548
1414
  "type": {
1549
- "text": "number | undefined"
1415
+ "text": "string | undefined"
1550
1416
  },
1551
- "description": "Maximum allowed value"
1417
+ "description": "Optional title for the popover header"
1552
1418
  },
1553
1419
  {
1554
1420
  "kind": "field",
1555
- "name": "step",
1421
+ "name": "showClose",
1556
1422
  "type": {
1557
- "text": "number"
1423
+ "text": "boolean"
1558
1424
  },
1559
- "default": "1",
1560
- "description": "Step value for increment/decrement"
1425
+ "default": "true",
1426
+ "description": "Whether to show a close button in the header"
1561
1427
  },
1562
1428
  {
1563
1429
  "kind": "field",
1564
- "name": "required",
1430
+ "name": "closeOnClickOutside",
1565
1431
  "type": {
1566
1432
  "text": "boolean"
1567
1433
  },
1568
- "default": "false",
1569
- "description": "Whether the input is required"
1434
+ "default": "true",
1435
+ "description": "Whether clicking outside closes the popover"
1570
1436
  },
1571
1437
  {
1572
1438
  "kind": "field",
1573
- "name": "disabled",
1439
+ "name": "closeOnEscape",
1574
1440
  "type": {
1575
1441
  "text": "boolean"
1576
1442
  },
1577
- "default": "false",
1578
- "description": "Whether the input is disabled"
1443
+ "default": "true",
1444
+ "description": "Whether pressing Escape closes the popover"
1579
1445
  },
1580
1446
  {
1581
1447
  "kind": "field",
1582
- "name": "readonly",
1448
+ "name": "offset",
1583
1449
  "type": {
1584
- "text": "boolean"
1450
+ "text": "number"
1585
1451
  },
1586
- "default": "false",
1587
- "description": "Whether the input is read-only"
1452
+ "default": "8",
1453
+ "description": "Offset from the trigger element (in pixels)"
1588
1454
  },
1589
1455
  {
1590
1456
  "kind": "field",
1591
- "name": "iconStart",
1457
+ "name": "width",
1592
1458
  "type": {
1593
1459
  "text": "string | undefined"
1594
1460
  },
1595
- "description": "Icon for the start icon"
1461
+ "description": "Fixed width for the popover (e.g., '300px', '20rem')"
1596
1462
  },
1597
1463
  {
1598
1464
  "kind": "field",
1599
- "name": "showSpinners",
1465
+ "name": "minWidth",
1600
1466
  "type": {
1601
- "text": "boolean"
1467
+ "text": "string | undefined"
1602
1468
  },
1603
- "default": "true",
1604
- "description": "Whether to show the spinner controls"
1469
+ "default": "'200px'",
1470
+ "description": "Minimum width for the popover (e.g., '200px', '15rem')"
1605
1471
  },
1606
1472
  {
1607
1473
  "kind": "field",
1608
- "name": "externalId",
1474
+ "name": "maxWidth",
1609
1475
  "type": {
1610
- "text": "string"
1476
+ "text": "string | undefined"
1611
1477
  },
1612
- "description": "External ID for linking with external systems"
1478
+ "description": "Maximum width for the popover (e.g., '400px', '25rem')"
1613
1479
  },
1614
1480
  {
1615
1481
  "kind": "field",
1616
- "name": "isValid",
1482
+ "name": "isPositioned",
1617
1483
  "type": {
1618
1484
  "text": "boolean"
1619
1485
  },
1620
1486
  "privacy": "private",
1621
- "default": "true",
1622
- "description": "Internal validation state"
1487
+ "default": "false"
1623
1488
  },
1624
1489
  {
1625
1490
  "kind": "field",
1626
- "name": "validationMessage",
1491
+ "name": "triggerEl",
1627
1492
  "type": {
1628
- "text": "string"
1493
+ "text": "HTMLElement | undefined"
1629
1494
  },
1630
- "privacy": "private",
1631
- "default": "''"
1632
- },
1633
- {
1634
- "kind": "method",
1635
- "name": "valueChanged"
1495
+ "privacy": "private"
1636
1496
  },
1637
1497
  {
1638
- "kind": "method",
1639
- "name": "validate",
1498
+ "kind": "field",
1499
+ "name": "popoverEl",
1500
+ "type": {
1501
+ "text": "HTMLElement | undefined"
1502
+ },
1640
1503
  "privacy": "private"
1641
1504
  },
1642
1505
  {
1643
- "kind": "method",
1644
- "name": "emitChange",
1645
- "privacy": "private"
1506
+ "kind": "field",
1507
+ "name": "uniqueId",
1508
+ "type": {
1509
+ "text": "string"
1510
+ },
1511
+ "privacy": "private",
1512
+ "default": "`le-popover-${Math.random().toString(36).substr(2, 9)}`"
1646
1513
  },
1647
1514
  {
1648
- "kind": "method",
1649
- "name": "emitInput",
1650
- "privacy": "private"
1515
+ "kind": "field",
1516
+ "name": "scrollParents",
1517
+ "type": {
1518
+ "text": "Element[]"
1519
+ },
1520
+ "privacy": "private",
1521
+ "default": "[]"
1651
1522
  },
1652
1523
  {
1653
1524
  "kind": "method",
1654
- "name": "updateValue",
1525
+ "name": "getScrollParents",
1655
1526
  "privacy": "private",
1527
+ "return": {
1528
+ "type": {
1529
+ "text": "Element[]"
1530
+ }
1531
+ },
1656
1532
  "parameters": [
1657
1533
  {
1658
- "name": "newValue",
1534
+ "name": "element",
1659
1535
  "type": {
1660
- "text": "number"
1536
+ "text": "Element"
1661
1537
  }
1662
1538
  }
1663
- ]
1539
+ ],
1540
+ "description": "Find all scrollable parent elements"
1664
1541
  },
1665
1542
  {
1666
- "kind": "field",
1667
- "name": "handleInput",
1668
- "privacy": "private"
1543
+ "kind": "method",
1544
+ "name": "addScrollListeners",
1545
+ "privacy": "private",
1546
+ "description": "Add scroll listeners to all scrollable parents"
1547
+ },
1548
+ {
1549
+ "kind": "method",
1550
+ "name": "removeScrollListeners",
1551
+ "privacy": "private",
1552
+ "description": "Remove scroll listeners"
1669
1553
  },
1670
1554
  {
1671
1555
  "kind": "field",
1672
- "name": "handleChange",
1556
+ "name": "handleScroll",
1673
1557
  "privacy": "private"
1674
1558
  },
1675
1559
  {
1676
1560
  "kind": "field",
1677
- "name": "handleKeyDown",
1561
+ "name": "handlePopoverToggle",
1678
1562
  "privacy": "private"
1679
1563
  },
1680
1564
  {
1681
1565
  "kind": "field",
1682
- "name": "handleWheel",
1566
+ "name": "handleOtherPopoverOpen",
1683
1567
  "privacy": "private"
1684
1568
  },
1569
+ {
1570
+ "kind": "method",
1571
+ "name": "show",
1572
+ "description": "Opens the popover"
1573
+ },
1574
+ {
1575
+ "kind": "method",
1576
+ "name": "hide",
1577
+ "description": "Closes the popover"
1578
+ },
1579
+ {
1580
+ "kind": "method",
1581
+ "name": "toggle",
1582
+ "description": "Toggles the popover"
1583
+ },
1685
1584
  {
1686
1585
  "kind": "field",
1687
- "name": "increment",
1586
+ "name": "handleTriggerClick",
1688
1587
  "privacy": "private"
1689
1588
  },
1690
1589
  {
1691
- "kind": "field",
1692
- "name": "decrement",
1590
+ "kind": "method",
1591
+ "name": "updatePosition",
1693
1592
  "privacy": "private"
1694
1593
  },
1695
1594
  {
@@ -1699,130 +1598,125 @@
1699
1598
  ],
1700
1599
  "attributes": [
1701
1600
  {
1702
- "name": "value",
1703
- "fieldName": "value",
1704
- "description": "The value of the input",
1705
- "type": {
1706
- "text": "number"
1707
- }
1708
- },
1709
- {
1710
- "name": "name",
1711
- "fieldName": "name",
1712
- "description": "The name of the input",
1601
+ "name": "mode",
1602
+ "fieldName": "mode",
1603
+ "description": "Mode of the popover should be 'default' for internal use",
1713
1604
  "type": {
1714
- "text": "string"
1605
+ "text": "'default' | 'admin'"
1715
1606
  }
1716
1607
  },
1717
1608
  {
1718
- "name": "label",
1719
- "fieldName": "label",
1720
- "description": "Label for the input",
1609
+ "name": "open",
1610
+ "fieldName": "open",
1611
+ "default": "false",
1612
+ "description": "Whether the popover is currently open",
1721
1613
  "type": {
1722
- "text": "string"
1614
+ "text": "boolean"
1723
1615
  }
1724
1616
  },
1725
1617
  {
1726
- "name": "placeholder",
1727
- "fieldName": "placeholder",
1728
- "description": "Placeholder text",
1618
+ "name": "position",
1619
+ "fieldName": "position",
1620
+ "default": "'bottom'",
1621
+ "description": "Position of the popover relative to its trigger",
1729
1622
  "type": {
1730
- "text": "string"
1623
+ "text": "'top' | 'bottom' | 'left' | 'right' | 'auto'"
1731
1624
  }
1732
1625
  },
1733
1626
  {
1734
- "name": "min",
1735
- "fieldName": "min",
1736
- "description": "Minimum allowed value",
1627
+ "name": "align",
1628
+ "fieldName": "align",
1629
+ "default": "'start'",
1630
+ "description": "Alignment of the popover",
1737
1631
  "type": {
1738
- "text": "number"
1632
+ "text": "'start' | 'center' | 'end'"
1739
1633
  }
1740
1634
  },
1741
1635
  {
1742
- "name": "max",
1743
- "fieldName": "max",
1744
- "description": "Maximum allowed value",
1636
+ "name": "popover-title",
1637
+ "fieldName": "popoverTitle",
1638
+ "description": "Optional title for the popover header",
1745
1639
  "type": {
1746
- "text": "number"
1640
+ "text": "string"
1747
1641
  }
1748
1642
  },
1749
1643
  {
1750
- "name": "step",
1751
- "fieldName": "step",
1752
- "default": "1",
1753
- "description": "Step value for increment/decrement",
1644
+ "name": "show-close",
1645
+ "fieldName": "showClose",
1646
+ "default": "true",
1647
+ "description": "Whether to show a close button in the header",
1754
1648
  "type": {
1755
- "text": "number"
1649
+ "text": "boolean"
1756
1650
  }
1757
1651
  },
1758
1652
  {
1759
- "name": "required",
1760
- "fieldName": "required",
1761
- "default": "false",
1762
- "description": "Whether the input is required",
1653
+ "name": "close-on-click-outside",
1654
+ "fieldName": "closeOnClickOutside",
1655
+ "default": "true",
1656
+ "description": "Whether clicking outside closes the popover",
1763
1657
  "type": {
1764
1658
  "text": "boolean"
1765
1659
  }
1766
1660
  },
1767
1661
  {
1768
- "name": "disabled",
1769
- "fieldName": "disabled",
1770
- "default": "false",
1771
- "description": "Whether the input is disabled",
1662
+ "name": "close-on-escape",
1663
+ "fieldName": "closeOnEscape",
1664
+ "default": "true",
1665
+ "description": "Whether pressing Escape closes the popover",
1772
1666
  "type": {
1773
1667
  "text": "boolean"
1774
1668
  }
1775
1669
  },
1776
1670
  {
1777
- "name": "readonly",
1778
- "fieldName": "readonly",
1779
- "default": "false",
1780
- "description": "Whether the input is read-only",
1671
+ "name": "offset",
1672
+ "fieldName": "offset",
1673
+ "default": "8",
1674
+ "description": "Offset from the trigger element (in pixels)",
1781
1675
  "type": {
1782
- "text": "boolean"
1676
+ "text": "number"
1783
1677
  }
1784
1678
  },
1785
1679
  {
1786
- "name": "icon-start",
1787
- "fieldName": "iconStart",
1788
- "description": "Icon for the start icon",
1680
+ "name": "width",
1681
+ "fieldName": "width",
1682
+ "description": "Fixed width for the popover (e.g., '300px', '20rem')",
1789
1683
  "type": {
1790
1684
  "text": "string"
1791
1685
  }
1792
1686
  },
1793
1687
  {
1794
- "name": "show-spinners",
1795
- "fieldName": "showSpinners",
1796
- "default": "true",
1797
- "description": "Whether to show the spinner controls",
1688
+ "name": "min-width",
1689
+ "fieldName": "minWidth",
1690
+ "default": "'200px'",
1691
+ "description": "Minimum width for the popover (e.g., '200px', '15rem')",
1798
1692
  "type": {
1799
- "text": "boolean"
1693
+ "text": "string"
1800
1694
  }
1801
1695
  },
1802
1696
  {
1803
- "name": "external-id",
1804
- "fieldName": "externalId",
1805
- "description": "External ID for linking with external systems",
1697
+ "name": "max-width",
1698
+ "fieldName": "maxWidth",
1699
+ "description": "Maximum width for the popover (e.g., '400px', '25rem')",
1806
1700
  "type": {
1807
1701
  "text": "string"
1808
1702
  }
1809
1703
  }
1810
1704
  ],
1811
- "tagName": "le-number-input",
1705
+ "tagName": "le-popover",
1812
1706
  "events": [
1813
1707
  {
1814
- "name": "leChange",
1708
+ "name": "lePopoverOpen",
1815
1709
  "type": {
1816
- "text": "EventEmitter<{ value: number; name: string; externalId: string; isValid: boolean }>"
1710
+ "text": "EventEmitter<void>"
1817
1711
  },
1818
- "description": "Emitted when the value changes (on blur or Enter)"
1712
+ "description": "Emitted when the popover opens"
1819
1713
  },
1820
1714
  {
1821
- "name": "leInput",
1715
+ "name": "lePopoverClose",
1822
1716
  "type": {
1823
- "text": "EventEmitter<{ value: number; name: string; externalId: string; isValid: boolean }>"
1717
+ "text": "EventEmitter<void>"
1824
1718
  },
1825
- "description": "Emitted when the input value changes (on keystroke/spin)"
1719
+ "description": "Emitted when the popover closes"
1826
1720
  }
1827
1721
  ],
1828
1722
  "customElement": true
@@ -1831,18 +1725,18 @@
1831
1725
  "exports": [
1832
1726
  {
1833
1727
  "kind": "js",
1834
- "name": "LeNumberInput",
1728
+ "name": "LePopover",
1835
1729
  "declaration": {
1836
- "name": "LeNumberInput",
1837
- "module": "src/components/le-number-input/le-number-input.tsx"
1730
+ "name": "LePopover",
1731
+ "module": "src/components/le-popover/le-popover.tsx"
1838
1732
  }
1839
1733
  },
1840
1734
  {
1841
1735
  "kind": "custom-element-definition",
1842
- "name": "le-number-input",
1736
+ "name": "le-popover",
1843
1737
  "declaration": {
1844
- "name": "LeNumberInput",
1845
- "module": "src/components/le-number-input/le-number-input.tsx"
1738
+ "name": "LePopover",
1739
+ "module": "src/components/le-popover/le-popover.tsx"
1846
1740
  }
1847
1741
  }
1848
1742
  ]
@@ -2253,96 +2147,177 @@
2253
2147
  },
2254
2148
  {
2255
2149
  "kind": "javascript-module",
2256
- "path": "src/components/le-component/le-component.tsx",
2150
+ "path": "src/components/le-slot/le-slot.tsx",
2257
2151
  "declarations": [
2258
2152
  {
2259
2153
  "kind": "class",
2260
- "description": "Component wrapper for admin mode editing.\n\nThis component is used internally by other components to provide admin-mode\nediting capabilities. It wraps the component's rendered output and shows\na settings popover for editing properties.\n\nIn default mode, it acts as a simple passthrough (display: contents).\nIn admin mode, it shows a border, component name header, and settings popover.\n\nThe host element is found automatically by traversing up through the shadow DOM.\n\nUsage inside a component's render method:\n```tsx\nrender() {\n return (\n <le-component component=\"le-card\">\n <Host>...</Host>\n </le-component>\n );\n}\n```",
2261
- "name": "LeComponent",
2154
+ "description": "Slot placeholder component for admin/CMS mode.\n\nThis component renders a visual placeholder for slots when in admin mode,\nallowing CMS systems to show available drop zones for content or inline editing.\n\nIn non-admin mode, this component renders nothing and acts as a passthrough.",
2155
+ "name": "LeSlot",
2262
2156
  "slots": [
2263
2157
  {
2264
- "description": "The component's rendered content",
2265
- "name": ""
2266
- }
2267
- ],
2268
- "members": [
2158
+ "description": "Default slot for placeholder content or drop zone UI",
2159
+ "name": ""
2160
+ }
2161
+ ],
2162
+ "members": [
2163
+ {
2164
+ "kind": "field",
2165
+ "name": "el",
2166
+ "type": {
2167
+ "text": "HTMLElement"
2168
+ }
2169
+ },
2170
+ {
2171
+ "kind": "field",
2172
+ "name": "type",
2173
+ "type": {
2174
+ "text": "'slot' | 'text' | 'textarea'"
2175
+ },
2176
+ "default": "'slot'",
2177
+ "description": "The type of slot content.\n- `slot`: Default, shows a dropzone for components (default)\n- `text`: Shows a single-line text input\n- `textarea`: Shows a multi-line text area"
2178
+ },
2179
+ {
2180
+ "kind": "field",
2181
+ "name": "name",
2182
+ "type": {
2183
+ "text": "string"
2184
+ },
2185
+ "default": "''",
2186
+ "description": "The name of the slot this placeholder represents.\nShould match the slot name in the parent component."
2187
+ },
2188
+ {
2189
+ "kind": "field",
2190
+ "name": "label",
2191
+ "type": {
2192
+ "text": "string | undefined"
2193
+ },
2194
+ "description": "Label to display in admin mode.\nIf not provided, the slot name will be used."
2195
+ },
2196
+ {
2197
+ "kind": "field",
2198
+ "name": "description",
2199
+ "type": {
2200
+ "text": "string | undefined"
2201
+ },
2202
+ "description": "Description of what content this slot accepts.\nShown in admin mode to guide content editors."
2203
+ },
2204
+ {
2205
+ "kind": "field",
2206
+ "name": "allowedComponents",
2207
+ "type": {
2208
+ "text": "string | undefined"
2209
+ },
2210
+ "description": "Comma-separated list of allowed component tags for this slot.\nUsed by CMS to filter available components."
2211
+ },
2269
2212
  {
2270
2213
  "kind": "field",
2271
- "name": "el",
2214
+ "name": "multiple",
2272
2215
  "type": {
2273
- "text": "HTMLElement"
2274
- }
2216
+ "text": "boolean"
2217
+ },
2218
+ "default": "true",
2219
+ "description": "Whether multiple components can be dropped in this slot."
2275
2220
  },
2276
2221
  {
2277
2222
  "kind": "field",
2278
- "name": "component",
2223
+ "name": "required",
2279
2224
  "type": {
2280
- "text": "string"
2225
+ "text": "boolean"
2281
2226
  },
2282
- "description": "The tag name of the component (e.g., 'le-card').\nUsed to look up property metadata and display the component name."
2227
+ "default": "false",
2228
+ "description": "Whether this slot is required to have content."
2283
2229
  },
2284
2230
  {
2285
2231
  "kind": "field",
2286
- "name": "displayName",
2232
+ "name": "placeholder",
2287
2233
  "type": {
2288
2234
  "text": "string | undefined"
2289
2235
  },
2290
- "description": "Optional display name for the component.\nIf not provided, the tag name will be formatted as the display name."
2236
+ "description": "Placeholder text for text/textarea inputs in admin mode."
2291
2237
  },
2292
2238
  {
2293
2239
  "kind": "field",
2294
- "name": "hostClass",
2240
+ "name": "tag",
2295
2241
  "type": {
2296
2242
  "text": "string | undefined"
2297
2243
  },
2298
- "description": "Classes to apply to the host element.\nAllows parent components to pass their styling classes."
2244
+ "description": "The HTML tag to create when there's no slotted element.\nUsed with type=\"text\" or type=\"textarea\" to auto-create elements."
2299
2245
  },
2300
2246
  {
2301
2247
  "kind": "field",
2302
- "name": "hostStyle",
2248
+ "name": "slotStyle",
2303
2249
  "type": {
2304
- "text": "{ [key: string]: string } | undefined"
2250
+ "text": "string | undefined"
2305
2251
  },
2306
- "description": "Inline styles to apply to the host element.\nAllows parent components to pass dynamic styles (e.g., flex properties)."
2252
+ "description": "CSS styles for the slot dropzone container.\nUseful for layouts - e.g., \"flex-direction: row\" for horizontal stacks.\nOnly applies in admin mode for type=\"slot\"."
2307
2253
  },
2308
2254
  {
2309
2255
  "kind": "field",
2310
- "name": "hostElement",
2256
+ "name": "adminMode",
2311
2257
  "type": {
2312
- "text": "HTMLElement | undefined"
2258
+ "text": "boolean"
2313
2259
  },
2314
2260
  "privacy": "private",
2315
- "description": "Reference to the host element (found automatically from parent)"
2261
+ "default": "false",
2262
+ "description": "Internal state to track admin mode"
2316
2263
  },
2317
2264
  {
2318
2265
  "kind": "field",
2319
- "name": "adminMode",
2266
+ "name": "textValue",
2267
+ "type": {
2268
+ "text": "string"
2269
+ },
2270
+ "privacy": "private",
2271
+ "default": "''",
2272
+ "description": "Internal state for text input value (synced from slot content)"
2273
+ },
2274
+ {
2275
+ "kind": "field",
2276
+ "name": "isValidHtml",
2277
+ "type": {
2278
+ "text": "boolean"
2279
+ },
2280
+ "privacy": "private",
2281
+ "default": "true",
2282
+ "description": "Whether the current textValue contains valid HTML"
2283
+ },
2284
+ {
2285
+ "kind": "field",
2286
+ "name": "availableComponents",
2287
+ "type": {
2288
+ "text": "ComponentInfo[]"
2289
+ },
2290
+ "privacy": "private",
2291
+ "default": "[]",
2292
+ "description": "Available components loaded from Custom Elements Manifest"
2293
+ },
2294
+ {
2295
+ "kind": "field",
2296
+ "name": "pickerOpen",
2320
2297
  "type": {
2321
2298
  "text": "boolean"
2322
2299
  },
2323
2300
  "privacy": "private",
2324
2301
  "default": "false",
2325
- "description": "Internal state to track admin mode"
2302
+ "description": "Whether the component picker popover is open"
2326
2303
  },
2327
2304
  {
2328
2305
  "kind": "field",
2329
- "name": "componentMeta",
2306
+ "name": "slotRef",
2330
2307
  "type": {
2331
- "text": "ComponentMetadata | null"
2308
+ "text": "HTMLSlotElement | undefined"
2332
2309
  },
2333
2310
  "privacy": "private",
2334
- "default": "null",
2335
- "description": "Component metadata loaded from Custom Elements Manifest"
2311
+ "description": "Reference to the slot element to access assignedNodes"
2336
2312
  },
2337
2313
  {
2338
2314
  "kind": "field",
2339
- "name": "propertyValues",
2315
+ "name": "slottedElement",
2340
2316
  "type": {
2341
- "text": "Record<string, any>"
2317
+ "text": "Element | undefined"
2342
2318
  },
2343
2319
  "privacy": "private",
2344
- "default": "{}",
2345
- "description": "Current property values of the host component"
2320
+ "description": "The original slotted element (e.g., <h3 slot=\"header\">)"
2346
2321
  },
2347
2322
  {
2348
2323
  "kind": "field",
@@ -2352,215 +2327,248 @@
2352
2327
  },
2353
2328
  "privacy": "private"
2354
2329
  },
2330
+ {
2331
+ "kind": "field",
2332
+ "name": "isUpdating",
2333
+ "type": {
2334
+ "text": "boolean"
2335
+ },
2336
+ "privacy": "private",
2337
+ "default": "false",
2338
+ "description": "Flag to prevent re-reading content right after we updated it"
2339
+ },
2355
2340
  {
2356
2341
  "kind": "method",
2357
- "name": "findHostElement",
2342
+ "name": "readSlottedContent",
2358
2343
  "privacy": "private",
2359
- "description": "Find the host element by traversing up through shadow DOM"
2344
+ "description": "Read content from slotted elements via assignedNodes()"
2360
2345
  },
2361
2346
  {
2362
2347
  "kind": "method",
2363
- "name": "formatDisplayName",
2348
+ "name": "validateHtml",
2364
2349
  "privacy": "private",
2365
2350
  "return": {
2366
2351
  "type": {
2367
- "text": "string"
2352
+ "text": "boolean"
2368
2353
  }
2369
2354
  },
2370
2355
  "parameters": [
2371
2356
  {
2372
- "name": "tagName",
2357
+ "name": "html",
2373
2358
  "type": {
2374
2359
  "text": "string"
2375
2360
  }
2376
2361
  }
2377
2362
  ],
2378
- "description": "Formats a tag name into a display name\ne.g., 'le-card' -> 'Card'"
2363
+ "description": "Validates if a string contains valid HTML"
2379
2364
  },
2380
2365
  {
2381
- "kind": "method",
2382
- "name": "loadComponentMetadata",
2383
- "privacy": "private",
2384
- "description": "Load component metadata from the Custom Elements Manifest"
2366
+ "kind": "field",
2367
+ "name": "handleTextInput",
2368
+ "privacy": "private"
2385
2369
  },
2386
2370
  {
2387
2371
  "kind": "method",
2388
- "name": "isInternalAttribute",
2372
+ "name": "createSlottedElement",
2389
2373
  "privacy": "private",
2390
- "return": {
2391
- "type": {
2392
- "text": "boolean"
2393
- }
2394
- },
2395
- "parameters": [
2396
- {
2397
- "name": "name",
2398
- "type": {
2399
- "text": "string"
2400
- }
2401
- }
2402
- ],
2403
- "description": "Check if an attribute is internal (should not be shown in editor)"
2374
+ "description": "Create a new slotted element when none exists.\nThe element is appended to the host component's light DOM."
2404
2375
  },
2405
2376
  {
2406
2377
  "kind": "method",
2407
- "name": "readPropertyValues",
2378
+ "name": "loadAvailableComponents",
2408
2379
  "privacy": "private",
2409
- "description": "Read current property values from the host element"
2380
+ "description": "Load available components from Custom Elements Manifest"
2410
2381
  },
2411
2382
  {
2412
2383
  "kind": "method",
2413
- "name": "parseAttributeValue",
2384
+ "name": "formatComponentName",
2414
2385
  "privacy": "private",
2415
2386
  "return": {
2416
2387
  "type": {
2417
- "text": "any"
2388
+ "text": "string"
2418
2389
  }
2419
2390
  },
2420
2391
  "parameters": [
2421
2392
  {
2422
- "name": "value",
2423
- "type": {
2424
- "text": "string | null"
2425
- }
2426
- },
2427
- {
2428
- "name": "type",
2429
- "optional": true,
2393
+ "name": "tagName",
2430
2394
  "type": {
2431
2395
  "text": "string"
2432
2396
  }
2433
2397
  }
2434
2398
  ],
2435
- "description": "Parse an attribute value based on its type"
2399
+ "description": "Format a tag name into a display name\ne.g., 'le-card' -> 'Card'"
2436
2400
  },
2437
2401
  {
2438
2402
  "kind": "method",
2439
- "name": "handlePropertyChange",
2403
+ "name": "addComponent",
2440
2404
  "privacy": "private",
2441
2405
  "parameters": [
2442
2406
  {
2443
- "name": "attrName",
2444
- "type": {
2445
- "text": "string"
2446
- }
2447
- },
2448
- {
2449
- "name": "value",
2450
- "type": {
2451
- "text": "any"
2452
- }
2453
- },
2454
- {
2455
- "name": "type",
2456
- "optional": true,
2407
+ "name": "tagName",
2457
2408
  "type": {
2458
2409
  "text": "string"
2459
2410
  }
2460
2411
  }
2461
2412
  ],
2462
- "description": "Handle property value changes from the editor"
2463
- },
2464
- {
2465
- "kind": "method",
2466
- "name": "deleteComponent",
2467
- "privacy": "private",
2468
- "description": "Delete this component from the DOM"
2413
+ "description": "Add a new component to the slot"
2469
2414
  },
2470
2415
  {
2471
- "kind": "method",
2472
- "name": "renderPropertyEditor",
2416
+ "kind": "field",
2417
+ "name": "handleSlotChange",
2473
2418
  "privacy": "private",
2474
- "description": "Render the property editor form"
2419
+ "description": "Handle slot change event to re-read content when nodes are assigned"
2475
2420
  },
2476
2421
  {
2477
2422
  "kind": "method",
2478
- "name": "renderPropertyField",
2479
- "privacy": "private",
2480
- "parameters": [
2481
- {
2482
- "name": "attr",
2483
- "type": {
2484
- "text": "AttributeMetadata"
2485
- }
2486
- }
2487
- ],
2488
- "description": "Render a single property field based on its type"
2423
+ "name": "render"
2489
2424
  },
2490
2425
  {
2491
2426
  "kind": "method",
2492
- "name": "render"
2427
+ "name": "renderContent",
2428
+ "privacy": "private"
2493
2429
  }
2494
2430
  ],
2495
2431
  "attributes": [
2496
2432
  {
2497
- "name": "component",
2498
- "fieldName": "component",
2499
- "description": "The tag name of the component (e.g., 'le-card').\nUsed to look up property metadata and display the component name.",
2433
+ "name": "type",
2434
+ "fieldName": "type",
2435
+ "default": "'slot'",
2436
+ "description": "The type of slot content.\n- `slot`: Default, shows a dropzone for components (default)\n- `text`: Shows a single-line text input\n- `textarea`: Shows a multi-line text area",
2437
+ "type": {
2438
+ "text": "'slot' | 'text' | 'textarea'"
2439
+ }
2440
+ },
2441
+ {
2442
+ "name": "name",
2443
+ "fieldName": "name",
2444
+ "default": "''",
2445
+ "description": "The name of the slot this placeholder represents.\nShould match the slot name in the parent component.",
2446
+ "type": {
2447
+ "text": "string"
2448
+ }
2449
+ },
2450
+ {
2451
+ "name": "label",
2452
+ "fieldName": "label",
2453
+ "description": "Label to display in admin mode.\nIf not provided, the slot name will be used.",
2454
+ "type": {
2455
+ "text": "string"
2456
+ }
2457
+ },
2458
+ {
2459
+ "name": "description",
2460
+ "fieldName": "description",
2461
+ "description": "Description of what content this slot accepts.\nShown in admin mode to guide content editors.",
2462
+ "type": {
2463
+ "text": "string"
2464
+ }
2465
+ },
2466
+ {
2467
+ "name": "allowed-components",
2468
+ "fieldName": "allowedComponents",
2469
+ "description": "Comma-separated list of allowed component tags for this slot.\nUsed by CMS to filter available components.",
2470
+ "type": {
2471
+ "text": "string"
2472
+ }
2473
+ },
2474
+ {
2475
+ "name": "multiple",
2476
+ "fieldName": "multiple",
2477
+ "default": "true",
2478
+ "description": "Whether multiple components can be dropped in this slot.",
2479
+ "type": {
2480
+ "text": "boolean"
2481
+ }
2482
+ },
2483
+ {
2484
+ "name": "required",
2485
+ "fieldName": "required",
2486
+ "default": "false",
2487
+ "description": "Whether this slot is required to have content.",
2500
2488
  "type": {
2501
- "text": "string"
2489
+ "text": "boolean"
2502
2490
  }
2503
2491
  },
2504
2492
  {
2505
- "name": "display-name",
2506
- "fieldName": "displayName",
2507
- "description": "Optional display name for the component.\nIf not provided, the tag name will be formatted as the display name.",
2493
+ "name": "placeholder",
2494
+ "fieldName": "placeholder",
2495
+ "description": "Placeholder text for text/textarea inputs in admin mode.",
2508
2496
  "type": {
2509
2497
  "text": "string"
2510
2498
  }
2511
2499
  },
2512
2500
  {
2513
- "name": "host-class",
2514
- "fieldName": "hostClass",
2515
- "description": "Classes to apply to the host element.\nAllows parent components to pass their styling classes.",
2501
+ "name": "tag",
2502
+ "fieldName": "tag",
2503
+ "description": "The HTML tag to create when there's no slotted element.\nUsed with type=\"text\" or type=\"textarea\" to auto-create elements.",
2516
2504
  "type": {
2517
2505
  "text": "string"
2518
2506
  }
2519
2507
  },
2520
2508
  {
2521
- "name": "host-style",
2522
- "fieldName": "hostStyle",
2523
- "description": "Inline styles to apply to the host element.\nAllows parent components to pass dynamic styles (e.g., flex properties).",
2509
+ "name": "slot-style",
2510
+ "fieldName": "slotStyle",
2511
+ "description": "CSS styles for the slot dropzone container.\nUseful for layouts - e.g., \"flex-direction: row\" for horizontal stacks.\nOnly applies in admin mode for type=\"slot\".",
2524
2512
  "type": {
2525
- "text": "{ [key: string]: string }"
2513
+ "text": "string"
2526
2514
  }
2527
2515
  }
2528
2516
  ],
2529
- "tagName": "le-component",
2530
- "events": [],
2517
+ "tagName": "le-slot",
2518
+ "events": [
2519
+ {
2520
+ "name": "leSlotChange",
2521
+ "type": {
2522
+ "text": "EventEmitter<{ name: string; value: string; isValid: boolean }>"
2523
+ },
2524
+ "description": "Emitted when text content changes in admin mode.\nThe event detail contains the new text value and validity."
2525
+ }
2526
+ ],
2531
2527
  "customElement": true
2532
2528
  }
2533
2529
  ],
2534
2530
  "exports": [
2535
2531
  {
2536
2532
  "kind": "js",
2537
- "name": "LeComponent",
2533
+ "name": "LeSlot",
2538
2534
  "declaration": {
2539
- "name": "LeComponent",
2540
- "module": "src/components/le-component/le-component.tsx"
2535
+ "name": "LeSlot",
2536
+ "module": "src/components/le-slot/le-slot.tsx"
2541
2537
  }
2542
2538
  },
2543
2539
  {
2544
2540
  "kind": "custom-element-definition",
2545
- "name": "le-component",
2541
+ "name": "le-slot",
2546
2542
  "declaration": {
2547
- "name": "LeComponent",
2548
- "module": "src/components/le-component/le-component.tsx"
2543
+ "name": "LeSlot",
2544
+ "module": "src/components/le-slot/le-slot.tsx"
2549
2545
  }
2550
2546
  }
2551
2547
  ]
2552
2548
  },
2553
2549
  {
2554
2550
  "kind": "javascript-module",
2555
- "path": "src/components/le-slot/le-slot.tsx",
2551
+ "path": "src/components/le-stack/le-stack.tsx",
2556
2552
  "declarations": [
2557
2553
  {
2558
2554
  "kind": "class",
2559
- "description": "Slot placeholder component for admin/CMS mode.\n\nThis component renders a visual placeholder for slots when in admin mode,\nallowing CMS systems to show available drop zones for content or inline editing.\n\nIn non-admin mode, this component renders nothing and acts as a passthrough.",
2560
- "name": "LeSlot",
2555
+ "description": "A flexible stack layout component using CSS flexbox.\n\n`le-stack` arranges its children in a row (horizontal) or column (vertical)\nwith configurable spacing, alignment, and wrapping behavior. Perfect for\ncreating responsive layouts.",
2556
+ "name": "LeStack",
2557
+ "cssProperties": [
2558
+ {
2559
+ "description": "Gap between items (defaults to var(--le-space-md))",
2560
+ "name": "--le-stack-gap"
2561
+ }
2562
+ ],
2563
+ "cssParts": [
2564
+ {
2565
+ "description": "The main stack container",
2566
+ "name": "stack"
2567
+ }
2568
+ ],
2561
2569
  "slots": [
2562
2570
  {
2563
- "description": "Default slot for placeholder content or drop zone UI",
2571
+ "description": "Default slot for stack items (le-box components recommended)",
2564
2572
  "name": ""
2565
2573
  }
2566
2574
  ],
@@ -2574,407 +2582,317 @@
2574
2582
  },
2575
2583
  {
2576
2584
  "kind": "field",
2577
- "name": "type",
2578
- "type": {
2579
- "text": "'slot' | 'text' | 'textarea'"
2580
- },
2581
- "default": "'slot'",
2582
- "description": "The type of slot content.\n- `slot`: Default, shows a dropzone for components (default)\n- `text`: Shows a single-line text input\n- `textarea`: Shows a multi-line text area"
2583
- },
2584
- {
2585
- "kind": "field",
2586
- "name": "name",
2587
- "type": {
2588
- "text": "string"
2589
- },
2590
- "default": "''",
2591
- "description": "The name of the slot this placeholder represents.\nShould match the slot name in the parent component."
2592
- },
2593
- {
2594
- "kind": "field",
2595
- "name": "label",
2585
+ "name": "direction",
2596
2586
  "type": {
2597
- "text": "string | undefined"
2587
+ "text": "'horizontal' | 'vertical'"
2598
2588
  },
2599
- "description": "Label to display in admin mode.\nIf not provided, the slot name will be used."
2589
+ "default": "'horizontal'",
2590
+ "description": "Direction of the stack layout"
2600
2591
  },
2601
2592
  {
2602
2593
  "kind": "field",
2603
- "name": "description",
2594
+ "name": "gap",
2604
2595
  "type": {
2605
2596
  "text": "string | undefined"
2606
2597
  },
2607
- "description": "Description of what content this slot accepts.\nShown in admin mode to guide content editors."
2598
+ "description": "Gap between items (CSS value like '8px', '1rem', 'var(--le-space-md)')"
2608
2599
  },
2609
2600
  {
2610
2601
  "kind": "field",
2611
- "name": "allowedComponents",
2602
+ "name": "align",
2612
2603
  "type": {
2613
- "text": "string | undefined"
2604
+ "text": "'start' | 'center' | 'end' | 'stretch' | 'baseline'"
2614
2605
  },
2615
- "description": "Comma-separated list of allowed component tags for this slot.\nUsed by CMS to filter available components."
2606
+ "default": "'stretch'",
2607
+ "description": "Alignment of items on the cross axis"
2616
2608
  },
2617
2609
  {
2618
2610
  "kind": "field",
2619
- "name": "multiple",
2611
+ "name": "justify",
2620
2612
  "type": {
2621
- "text": "boolean"
2613
+ "text": "'start' | 'center' | 'end' | 'space-between' | 'space-around' | 'space-evenly'"
2622
2614
  },
2623
- "default": "true",
2624
- "description": "Whether multiple components can be dropped in this slot."
2615
+ "default": "'start'",
2616
+ "description": "Distribution of items on the main axis"
2625
2617
  },
2626
2618
  {
2627
2619
  "kind": "field",
2628
- "name": "required",
2620
+ "name": "wrap",
2629
2621
  "type": {
2630
2622
  "text": "boolean"
2631
2623
  },
2632
2624
  "default": "false",
2633
- "description": "Whether this slot is required to have content."
2634
- },
2635
- {
2636
- "kind": "field",
2637
- "name": "placeholder",
2638
- "type": {
2639
- "text": "string | undefined"
2640
- },
2641
- "description": "Placeholder text for text/textarea inputs in admin mode."
2642
- },
2643
- {
2644
- "kind": "field",
2645
- "name": "tag",
2646
- "type": {
2647
- "text": "string | undefined"
2648
- },
2649
- "description": "The HTML tag to create when there's no slotted element.\nUsed with type=\"text\" or type=\"textarea\" to auto-create elements."
2625
+ "description": "Whether items should wrap to multiple lines"
2650
2626
  },
2651
2627
  {
2652
2628
  "kind": "field",
2653
- "name": "slotStyle",
2629
+ "name": "alignContent",
2654
2630
  "type": {
2655
- "text": "string | undefined"
2631
+ "text": "'start' | 'center' | 'end' | 'stretch' | 'space-between' | 'space-around'"
2656
2632
  },
2657
- "description": "CSS styles for the slot dropzone container.\nUseful for layouts - e.g., \"flex-direction: row\" for horizontal stacks.\nOnly applies in admin mode for type=\"slot\"."
2633
+ "default": "'stretch'",
2634
+ "description": "Alignment of wrapped lines (only applies when wrap is true)"
2658
2635
  },
2659
2636
  {
2660
2637
  "kind": "field",
2661
- "name": "adminMode",
2638
+ "name": "reverse",
2662
2639
  "type": {
2663
2640
  "text": "boolean"
2664
2641
  },
2665
- "privacy": "private",
2666
2642
  "default": "false",
2667
- "description": "Internal state to track admin mode"
2643
+ "description": "Whether to reverse the order of items"
2668
2644
  },
2669
2645
  {
2670
2646
  "kind": "field",
2671
- "name": "textValue",
2647
+ "name": "maxItems",
2672
2648
  "type": {
2673
- "text": "string"
2649
+ "text": "number | undefined"
2674
2650
  },
2675
- "privacy": "private",
2676
- "default": "''",
2677
- "description": "Internal state for text input value (synced from slot content)"
2651
+ "description": "Maximum number of items allowed in the stack (for CMS validation)"
2678
2652
  },
2679
2653
  {
2680
2654
  "kind": "field",
2681
- "name": "isValidHtml",
2655
+ "name": "fullWidth",
2682
2656
  "type": {
2683
2657
  "text": "boolean"
2684
2658
  },
2685
- "privacy": "private",
2686
- "default": "true",
2687
- "description": "Whether the current textValue contains valid HTML"
2688
- },
2689
- {
2690
- "kind": "field",
2691
- "name": "availableComponents",
2692
- "type": {
2693
- "text": "ComponentInfo[]"
2694
- },
2695
- "privacy": "private",
2696
- "default": "[]",
2697
- "description": "Available components loaded from Custom Elements Manifest"
2659
+ "default": "false",
2660
+ "description": "Whether the stack should take full width of its container"
2698
2661
  },
2699
2662
  {
2700
2663
  "kind": "field",
2701
- "name": "pickerOpen",
2664
+ "name": "fullHeight",
2702
2665
  "type": {
2703
2666
  "text": "boolean"
2704
2667
  },
2705
- "privacy": "private",
2706
2668
  "default": "false",
2707
- "description": "Whether the component picker popover is open"
2708
- },
2709
- {
2710
- "kind": "field",
2711
- "name": "slotRef",
2712
- "type": {
2713
- "text": "HTMLSlotElement | undefined"
2714
- },
2715
- "privacy": "private",
2716
- "description": "Reference to the slot element to access assignedNodes"
2717
- },
2718
- {
2719
- "kind": "field",
2720
- "name": "slottedElement",
2721
- "type": {
2722
- "text": "Element | undefined"
2723
- },
2724
- "privacy": "private",
2725
- "description": "The original slotted element (e.g., <h3 slot=\"header\">)"
2726
- },
2727
- {
2728
- "kind": "field",
2729
- "name": "disconnectModeObserver",
2730
- "type": {
2731
- "text": "() => void | undefined"
2732
- },
2733
- "privacy": "private"
2669
+ "description": "Whether the stack should take full height of its container"
2734
2670
  },
2735
2671
  {
2736
2672
  "kind": "field",
2737
- "name": "isUpdating",
2673
+ "name": "padding",
2738
2674
  "type": {
2739
- "text": "boolean"
2675
+ "text": "string | undefined"
2740
2676
  },
2741
- "privacy": "private",
2742
- "default": "false",
2743
- "description": "Flag to prevent re-reading content right after we updated it"
2744
- },
2745
- {
2746
- "kind": "method",
2747
- "name": "readSlottedContent",
2748
- "privacy": "private",
2749
- "description": "Read content from slotted elements via assignedNodes()"
2677
+ "description": "Padding inside the stack container (CSS value)"
2750
2678
  },
2751
2679
  {
2752
2680
  "kind": "method",
2753
- "name": "validateHtml",
2681
+ "name": "getFlexDirection",
2754
2682
  "privacy": "private",
2755
2683
  "return": {
2756
2684
  "type": {
2757
- "text": "boolean"
2758
- }
2759
- },
2760
- "parameters": [
2761
- {
2762
- "name": "html",
2763
- "type": {
2764
- "text": "string"
2765
- }
2685
+ "text": "string"
2766
2686
  }
2767
- ],
2768
- "description": "Validates if a string contains valid HTML"
2769
- },
2770
- {
2771
- "kind": "field",
2772
- "name": "handleTextInput",
2773
- "privacy": "private"
2774
- },
2775
- {
2776
- "kind": "method",
2777
- "name": "createSlottedElement",
2778
- "privacy": "private",
2779
- "description": "Create a new slotted element when none exists.\nThe element is appended to the host component's light DOM."
2780
- },
2781
- {
2782
- "kind": "method",
2783
- "name": "loadAvailableComponents",
2784
- "privacy": "private",
2785
- "description": "Load available components from Custom Elements Manifest"
2687
+ }
2786
2688
  },
2787
2689
  {
2788
2690
  "kind": "method",
2789
- "name": "formatComponentName",
2691
+ "name": "getAlignItems",
2790
2692
  "privacy": "private",
2791
2693
  "return": {
2792
2694
  "type": {
2793
2695
  "text": "string"
2794
2696
  }
2795
- },
2796
- "parameters": [
2797
- {
2798
- "name": "tagName",
2799
- "type": {
2800
- "text": "string"
2801
- }
2802
- }
2803
- ],
2804
- "description": "Format a tag name into a display name\ne.g., 'le-card' -> 'Card'"
2697
+ }
2805
2698
  },
2806
2699
  {
2807
2700
  "kind": "method",
2808
- "name": "addComponent",
2701
+ "name": "getJustifyContent",
2809
2702
  "privacy": "private",
2810
- "parameters": [
2811
- {
2812
- "name": "tagName",
2813
- "type": {
2814
- "text": "string"
2815
- }
2703
+ "return": {
2704
+ "type": {
2705
+ "text": "string"
2816
2706
  }
2817
- ],
2818
- "description": "Add a new component to the slot"
2707
+ }
2819
2708
  },
2820
2709
  {
2821
- "kind": "field",
2822
- "name": "handleSlotChange",
2710
+ "kind": "method",
2711
+ "name": "getAlignContent",
2823
2712
  "privacy": "private",
2824
- "description": "Handle slot change event to re-read content when nodes are assigned"
2713
+ "return": {
2714
+ "type": {
2715
+ "text": "string"
2716
+ }
2717
+ }
2825
2718
  },
2826
2719
  {
2827
2720
  "kind": "method",
2828
2721
  "name": "render"
2829
- },
2830
- {
2831
- "kind": "method",
2832
- "name": "renderContent",
2833
- "privacy": "private"
2834
2722
  }
2835
2723
  ],
2836
2724
  "attributes": [
2837
2725
  {
2838
- "name": "type",
2839
- "fieldName": "type",
2840
- "default": "'slot'",
2841
- "description": "The type of slot content.\n- `slot`: Default, shows a dropzone for components (default)\n- `text`: Shows a single-line text input\n- `textarea`: Shows a multi-line text area",
2726
+ "name": "direction",
2727
+ "fieldName": "direction",
2728
+ "default": "'horizontal'",
2729
+ "description": "Direction of the stack layout",
2842
2730
  "type": {
2843
- "text": "'slot' | 'text' | 'textarea'"
2731
+ "text": "'horizontal' | 'vertical'"
2844
2732
  }
2845
2733
  },
2846
2734
  {
2847
- "name": "name",
2848
- "fieldName": "name",
2849
- "default": "''",
2850
- "description": "The name of the slot this placeholder represents.\nShould match the slot name in the parent component.",
2735
+ "name": "gap",
2736
+ "fieldName": "gap",
2737
+ "description": "Gap between items (CSS value like '8px', '1rem', 'var(--le-space-md)')",
2851
2738
  "type": {
2852
2739
  "text": "string"
2853
2740
  }
2854
2741
  },
2855
2742
  {
2856
- "name": "label",
2857
- "fieldName": "label",
2858
- "description": "Label to display in admin mode.\nIf not provided, the slot name will be used.",
2743
+ "name": "align",
2744
+ "fieldName": "align",
2745
+ "default": "'stretch'",
2746
+ "description": "Alignment of items on the cross axis",
2859
2747
  "type": {
2860
- "text": "string"
2748
+ "text": "'start' | 'center' | 'end' | 'stretch' | 'baseline'"
2861
2749
  }
2862
2750
  },
2863
2751
  {
2864
- "name": "description",
2865
- "fieldName": "description",
2866
- "description": "Description of what content this slot accepts.\nShown in admin mode to guide content editors.",
2752
+ "name": "justify",
2753
+ "fieldName": "justify",
2754
+ "default": "'start'",
2755
+ "description": "Distribution of items on the main axis",
2867
2756
  "type": {
2868
- "text": "string"
2757
+ "text": "'start' | 'center' | 'end' | 'space-between' | 'space-around' | 'space-evenly'"
2869
2758
  }
2870
2759
  },
2871
2760
  {
2872
- "name": "allowed-components",
2873
- "fieldName": "allowedComponents",
2874
- "description": "Comma-separated list of allowed component tags for this slot.\nUsed by CMS to filter available components.",
2761
+ "name": "wrap",
2762
+ "fieldName": "wrap",
2763
+ "default": "false",
2764
+ "description": "Whether items should wrap to multiple lines",
2875
2765
  "type": {
2876
- "text": "string"
2766
+ "text": "boolean"
2877
2767
  }
2878
2768
  },
2879
2769
  {
2880
- "name": "multiple",
2881
- "fieldName": "multiple",
2882
- "default": "true",
2883
- "description": "Whether multiple components can be dropped in this slot.",
2770
+ "name": "align-content",
2771
+ "fieldName": "alignContent",
2772
+ "default": "'stretch'",
2773
+ "description": "Alignment of wrapped lines (only applies when wrap is true)",
2884
2774
  "type": {
2885
- "text": "boolean"
2775
+ "text": "'start' | 'center' | 'end' | 'stretch' | 'space-between' | 'space-around'"
2886
2776
  }
2887
2777
  },
2888
2778
  {
2889
- "name": "required",
2890
- "fieldName": "required",
2779
+ "name": "reverse",
2780
+ "fieldName": "reverse",
2891
2781
  "default": "false",
2892
- "description": "Whether this slot is required to have content.",
2782
+ "description": "Whether to reverse the order of items",
2893
2783
  "type": {
2894
2784
  "text": "boolean"
2895
2785
  }
2896
2786
  },
2897
2787
  {
2898
- "name": "placeholder",
2899
- "fieldName": "placeholder",
2900
- "description": "Placeholder text for text/textarea inputs in admin mode.",
2788
+ "name": "max-items",
2789
+ "fieldName": "maxItems",
2790
+ "description": "Maximum number of items allowed in the stack (for CMS validation)",
2901
2791
  "type": {
2902
- "text": "string"
2792
+ "text": "number"
2903
2793
  }
2904
2794
  },
2905
2795
  {
2906
- "name": "tag",
2907
- "fieldName": "tag",
2908
- "description": "The HTML tag to create when there's no slotted element.\nUsed with type=\"text\" or type=\"textarea\" to auto-create elements.",
2796
+ "name": "full-width",
2797
+ "fieldName": "fullWidth",
2798
+ "default": "false",
2799
+ "description": "Whether the stack should take full width of its container",
2909
2800
  "type": {
2910
- "text": "string"
2801
+ "text": "boolean"
2911
2802
  }
2912
2803
  },
2913
2804
  {
2914
- "name": "slot-style",
2915
- "fieldName": "slotStyle",
2916
- "description": "CSS styles for the slot dropzone container.\nUseful for layouts - e.g., \"flex-direction: row\" for horizontal stacks.\nOnly applies in admin mode for type=\"slot\".",
2805
+ "name": "full-height",
2806
+ "fieldName": "fullHeight",
2807
+ "default": "false",
2808
+ "description": "Whether the stack should take full height of its container",
2917
2809
  "type": {
2918
- "text": "string"
2810
+ "text": "boolean"
2919
2811
  }
2920
- }
2921
- ],
2922
- "tagName": "le-slot",
2923
- "events": [
2812
+ },
2924
2813
  {
2925
- "name": "leSlotChange",
2814
+ "name": "padding",
2815
+ "fieldName": "padding",
2816
+ "description": "Padding inside the stack container (CSS value)",
2926
2817
  "type": {
2927
- "text": "EventEmitter<{ name: string; value: string; isValid: boolean }>"
2928
- },
2929
- "description": "Emitted when text content changes in admin mode.\nThe event detail contains the new text value and validity."
2818
+ "text": "string"
2819
+ }
2930
2820
  }
2931
2821
  ],
2822
+ "tagName": "le-stack",
2823
+ "events": [],
2932
2824
  "customElement": true
2933
2825
  }
2934
2826
  ],
2935
2827
  "exports": [
2936
2828
  {
2937
2829
  "kind": "js",
2938
- "name": "LeSlot",
2830
+ "name": "LeStack",
2939
2831
  "declaration": {
2940
- "name": "LeSlot",
2941
- "module": "src/components/le-slot/le-slot.tsx"
2832
+ "name": "LeStack",
2833
+ "module": "src/components/le-stack/le-stack.tsx"
2942
2834
  }
2943
2835
  },
2944
2836
  {
2945
2837
  "kind": "custom-element-definition",
2946
- "name": "le-slot",
2838
+ "name": "le-stack",
2947
2839
  "declaration": {
2948
- "name": "LeSlot",
2949
- "module": "src/components/le-slot/le-slot.tsx"
2840
+ "name": "LeStack",
2841
+ "module": "src/components/le-stack/le-stack.tsx"
2950
2842
  }
2951
2843
  }
2952
2844
  ]
2953
2845
  },
2954
2846
  {
2955
2847
  "kind": "javascript-module",
2956
- "path": "src/components/le-stack/le-stack.tsx",
2848
+ "path": "src/components/le-number-input/le-number-input.tsx",
2957
2849
  "declarations": [
2958
2850
  {
2959
2851
  "kind": "class",
2960
- "description": "A flexible stack layout component using CSS flexbox.\n\n`le-stack` arranges its children in a row (horizontal) or column (vertical)\nwith configurable spacing, alignment, and wrapping behavior. Perfect for\ncreating responsive layouts.",
2961
- "name": "LeStack",
2852
+ "description": "A number input component with validation, keyboard controls, and custom spinners.",
2853
+ "name": "LeNumberInput",
2962
2854
  "cssProperties": [
2963
2855
  {
2964
- "description": "Gap between items (defaults to var(--le-space-md))",
2965
- "name": "--le-stack-gap"
2966
- }
2967
- ],
2968
- "cssParts": [
2856
+ "description": "Input background color",
2857
+ "name": "--le-input-bg"
2858
+ },
2969
2859
  {
2970
- "description": "The main stack container",
2971
- "name": "stack"
2860
+ "description": "Input text color",
2861
+ "name": "--le-input-color"
2862
+ },
2863
+ {
2864
+ "description": "Input border style",
2865
+ "name": "--le-input-border"
2866
+ },
2867
+ {
2868
+ "description": "Input border style when focused",
2869
+ "name": "--le-input-border-focus"
2870
+ },
2871
+ {
2872
+ "description": "Input border style when invalid",
2873
+ "name": "--le-input-border-error"
2874
+ },
2875
+ {
2876
+ "description": "Input border radius",
2877
+ "name": "--le-input-radius"
2878
+ },
2879
+ {
2880
+ "description": "Input padding",
2881
+ "name": "--le-input-padding"
2972
2882
  }
2973
2883
  ],
2974
2884
  "slots": [
2975
2885
  {
2976
- "description": "Default slot for stack items (le-box components recommended)",
2886
+ "description": "The label text for the input",
2977
2887
  "name": ""
2888
+ },
2889
+ {
2890
+ "description": "Additional description text displayed below the input",
2891
+ "name": "description"
2892
+ },
2893
+ {
2894
+ "description": "Icon to display at the start of the input",
2895
+ "name": "icon-start"
2978
2896
  }
2979
2897
  ],
2980
2898
  "members": [
@@ -2987,139 +2905,193 @@
2987
2905
  },
2988
2906
  {
2989
2907
  "kind": "field",
2990
- "name": "direction",
2908
+ "name": "value",
2991
2909
  "type": {
2992
- "text": "'horizontal' | 'vertical'"
2910
+ "text": "number"
2993
2911
  },
2994
- "default": "'horizontal'",
2995
- "description": "Direction of the stack layout"
2912
+ "description": "The value of the input"
2996
2913
  },
2997
2914
  {
2998
2915
  "kind": "field",
2999
- "name": "gap",
2916
+ "name": "name",
3000
2917
  "type": {
3001
- "text": "string | undefined"
2918
+ "text": "string"
3002
2919
  },
3003
- "description": "Gap between items (CSS value like '8px', '1rem', 'var(--le-space-md)')"
2920
+ "description": "The name of the input"
3004
2921
  },
3005
2922
  {
3006
2923
  "kind": "field",
3007
- "name": "align",
2924
+ "name": "label",
3008
2925
  "type": {
3009
- "text": "'start' | 'center' | 'end' | 'stretch' | 'baseline'"
2926
+ "text": "string"
3010
2927
  },
3011
- "default": "'stretch'",
3012
- "description": "Alignment of items on the cross axis"
2928
+ "description": "Label for the input"
3013
2929
  },
3014
2930
  {
3015
2931
  "kind": "field",
3016
- "name": "justify",
2932
+ "name": "placeholder",
3017
2933
  "type": {
3018
- "text": "'start' | 'center' | 'end' | 'space-between' | 'space-around' | 'space-evenly'"
2934
+ "text": "string"
3019
2935
  },
3020
- "default": "'start'",
3021
- "description": "Distribution of items on the main axis"
2936
+ "description": "Placeholder text"
3022
2937
  },
3023
2938
  {
3024
2939
  "kind": "field",
3025
- "name": "wrap",
2940
+ "name": "min",
2941
+ "type": {
2942
+ "text": "number | undefined"
2943
+ },
2944
+ "description": "Minimum allowed value"
2945
+ },
2946
+ {
2947
+ "kind": "field",
2948
+ "name": "max",
2949
+ "type": {
2950
+ "text": "number | undefined"
2951
+ },
2952
+ "description": "Maximum allowed value"
2953
+ },
2954
+ {
2955
+ "kind": "field",
2956
+ "name": "step",
2957
+ "type": {
2958
+ "text": "number"
2959
+ },
2960
+ "default": "1",
2961
+ "description": "Step value for increment/decrement"
2962
+ },
2963
+ {
2964
+ "kind": "field",
2965
+ "name": "required",
3026
2966
  "type": {
3027
2967
  "text": "boolean"
3028
2968
  },
3029
2969
  "default": "false",
3030
- "description": "Whether items should wrap to multiple lines"
2970
+ "description": "Whether the input is required"
3031
2971
  },
3032
2972
  {
3033
2973
  "kind": "field",
3034
- "name": "alignContent",
2974
+ "name": "disabled",
3035
2975
  "type": {
3036
- "text": "'start' | 'center' | 'end' | 'stretch' | 'space-between' | 'space-around'"
2976
+ "text": "boolean"
3037
2977
  },
3038
- "default": "'stretch'",
3039
- "description": "Alignment of wrapped lines (only applies when wrap is true)"
2978
+ "default": "false",
2979
+ "description": "Whether the input is disabled"
3040
2980
  },
3041
2981
  {
3042
2982
  "kind": "field",
3043
- "name": "reverse",
2983
+ "name": "readonly",
3044
2984
  "type": {
3045
2985
  "text": "boolean"
3046
2986
  },
3047
2987
  "default": "false",
3048
- "description": "Whether to reverse the order of items"
2988
+ "description": "Whether the input is read-only"
3049
2989
  },
3050
2990
  {
3051
2991
  "kind": "field",
3052
- "name": "maxItems",
2992
+ "name": "iconStart",
3053
2993
  "type": {
3054
- "text": "number | undefined"
2994
+ "text": "string | undefined"
3055
2995
  },
3056
- "description": "Maximum number of items allowed in the stack (for CMS validation)"
2996
+ "description": "Icon for the start icon"
3057
2997
  },
3058
2998
  {
3059
2999
  "kind": "field",
3060
- "name": "fullWidth",
3000
+ "name": "showSpinners",
3061
3001
  "type": {
3062
3002
  "text": "boolean"
3063
3003
  },
3064
- "default": "false",
3065
- "description": "Whether the stack should take full width of its container"
3004
+ "default": "true",
3005
+ "description": "Whether to show the spinner controls"
3066
3006
  },
3067
3007
  {
3068
3008
  "kind": "field",
3069
- "name": "fullHeight",
3009
+ "name": "externalId",
3010
+ "type": {
3011
+ "text": "string"
3012
+ },
3013
+ "description": "External ID for linking with external systems"
3014
+ },
3015
+ {
3016
+ "kind": "field",
3017
+ "name": "isValid",
3070
3018
  "type": {
3071
3019
  "text": "boolean"
3072
3020
  },
3073
- "default": "false",
3074
- "description": "Whether the stack should take full height of its container"
3021
+ "privacy": "private",
3022
+ "default": "true",
3023
+ "description": "Internal validation state"
3075
3024
  },
3076
3025
  {
3077
3026
  "kind": "field",
3078
- "name": "padding",
3027
+ "name": "validationMessage",
3079
3028
  "type": {
3080
- "text": "string | undefined"
3029
+ "text": "string"
3081
3030
  },
3082
- "description": "Padding inside the stack container (CSS value)"
3031
+ "privacy": "private",
3032
+ "default": "''"
3083
3033
  },
3084
3034
  {
3085
3035
  "kind": "method",
3086
- "name": "getFlexDirection",
3087
- "privacy": "private",
3088
- "return": {
3089
- "type": {
3090
- "text": "string"
3091
- }
3092
- }
3036
+ "name": "valueChanged"
3093
3037
  },
3094
3038
  {
3095
3039
  "kind": "method",
3096
- "name": "getAlignItems",
3097
- "privacy": "private",
3098
- "return": {
3099
- "type": {
3100
- "text": "string"
3101
- }
3102
- }
3040
+ "name": "validate",
3041
+ "privacy": "private"
3103
3042
  },
3104
3043
  {
3105
3044
  "kind": "method",
3106
- "name": "getJustifyContent",
3107
- "privacy": "private",
3108
- "return": {
3109
- "type": {
3110
- "text": "string"
3111
- }
3112
- }
3045
+ "name": "emitChange",
3046
+ "privacy": "private"
3113
3047
  },
3114
3048
  {
3115
3049
  "kind": "method",
3116
- "name": "getAlignContent",
3050
+ "name": "emitInput",
3051
+ "privacy": "private"
3052
+ },
3053
+ {
3054
+ "kind": "method",
3055
+ "name": "updateValue",
3117
3056
  "privacy": "private",
3118
- "return": {
3119
- "type": {
3120
- "text": "string"
3057
+ "parameters": [
3058
+ {
3059
+ "name": "newValue",
3060
+ "type": {
3061
+ "text": "number"
3062
+ }
3121
3063
  }
3122
- }
3064
+ ]
3065
+ },
3066
+ {
3067
+ "kind": "field",
3068
+ "name": "handleInput",
3069
+ "privacy": "private"
3070
+ },
3071
+ {
3072
+ "kind": "field",
3073
+ "name": "handleChange",
3074
+ "privacy": "private"
3075
+ },
3076
+ {
3077
+ "kind": "field",
3078
+ "name": "handleKeyDown",
3079
+ "privacy": "private"
3080
+ },
3081
+ {
3082
+ "kind": "field",
3083
+ "name": "handleWheel",
3084
+ "privacy": "private"
3085
+ },
3086
+ {
3087
+ "kind": "field",
3088
+ "name": "increment",
3089
+ "privacy": "private"
3090
+ },
3091
+ {
3092
+ "kind": "field",
3093
+ "name": "decrement",
3094
+ "privacy": "private"
3123
3095
  },
3124
3096
  {
3125
3097
  "kind": "method",
@@ -3128,122 +3100,150 @@
3128
3100
  ],
3129
3101
  "attributes": [
3130
3102
  {
3131
- "name": "direction",
3132
- "fieldName": "direction",
3133
- "default": "'horizontal'",
3134
- "description": "Direction of the stack layout",
3103
+ "name": "value",
3104
+ "fieldName": "value",
3105
+ "description": "The value of the input",
3135
3106
  "type": {
3136
- "text": "'horizontal' | 'vertical'"
3107
+ "text": "number"
3137
3108
  }
3138
3109
  },
3139
3110
  {
3140
- "name": "gap",
3141
- "fieldName": "gap",
3142
- "description": "Gap between items (CSS value like '8px', '1rem', 'var(--le-space-md)')",
3111
+ "name": "name",
3112
+ "fieldName": "name",
3113
+ "description": "The name of the input",
3143
3114
  "type": {
3144
3115
  "text": "string"
3145
3116
  }
3146
3117
  },
3147
3118
  {
3148
- "name": "align",
3149
- "fieldName": "align",
3150
- "default": "'stretch'",
3151
- "description": "Alignment of items on the cross axis",
3119
+ "name": "label",
3120
+ "fieldName": "label",
3121
+ "description": "Label for the input",
3152
3122
  "type": {
3153
- "text": "'start' | 'center' | 'end' | 'stretch' | 'baseline'"
3123
+ "text": "string"
3154
3124
  }
3155
3125
  },
3156
3126
  {
3157
- "name": "justify",
3158
- "fieldName": "justify",
3159
- "default": "'start'",
3160
- "description": "Distribution of items on the main axis",
3127
+ "name": "placeholder",
3128
+ "fieldName": "placeholder",
3129
+ "description": "Placeholder text",
3161
3130
  "type": {
3162
- "text": "'start' | 'center' | 'end' | 'space-between' | 'space-around' | 'space-evenly'"
3131
+ "text": "string"
3163
3132
  }
3164
3133
  },
3165
3134
  {
3166
- "name": "wrap",
3167
- "fieldName": "wrap",
3168
- "default": "false",
3169
- "description": "Whether items should wrap to multiple lines",
3135
+ "name": "min",
3136
+ "fieldName": "min",
3137
+ "description": "Minimum allowed value",
3170
3138
  "type": {
3171
- "text": "boolean"
3139
+ "text": "number"
3172
3140
  }
3173
3141
  },
3174
3142
  {
3175
- "name": "align-content",
3176
- "fieldName": "alignContent",
3177
- "default": "'stretch'",
3178
- "description": "Alignment of wrapped lines (only applies when wrap is true)",
3143
+ "name": "max",
3144
+ "fieldName": "max",
3145
+ "description": "Maximum allowed value",
3179
3146
  "type": {
3180
- "text": "'start' | 'center' | 'end' | 'stretch' | 'space-between' | 'space-around'"
3147
+ "text": "number"
3181
3148
  }
3182
3149
  },
3183
3150
  {
3184
- "name": "reverse",
3185
- "fieldName": "reverse",
3151
+ "name": "step",
3152
+ "fieldName": "step",
3153
+ "default": "1",
3154
+ "description": "Step value for increment/decrement",
3155
+ "type": {
3156
+ "text": "number"
3157
+ }
3158
+ },
3159
+ {
3160
+ "name": "required",
3161
+ "fieldName": "required",
3186
3162
  "default": "false",
3187
- "description": "Whether to reverse the order of items",
3163
+ "description": "Whether the input is required",
3188
3164
  "type": {
3189
3165
  "text": "boolean"
3190
3166
  }
3191
3167
  },
3192
3168
  {
3193
- "name": "max-items",
3194
- "fieldName": "maxItems",
3195
- "description": "Maximum number of items allowed in the stack (for CMS validation)",
3169
+ "name": "disabled",
3170
+ "fieldName": "disabled",
3171
+ "default": "false",
3172
+ "description": "Whether the input is disabled",
3196
3173
  "type": {
3197
- "text": "number"
3174
+ "text": "boolean"
3198
3175
  }
3199
3176
  },
3200
3177
  {
3201
- "name": "full-width",
3202
- "fieldName": "fullWidth",
3178
+ "name": "readonly",
3179
+ "fieldName": "readonly",
3203
3180
  "default": "false",
3204
- "description": "Whether the stack should take full width of its container",
3181
+ "description": "Whether the input is read-only",
3205
3182
  "type": {
3206
3183
  "text": "boolean"
3207
3184
  }
3208
3185
  },
3209
3186
  {
3210
- "name": "full-height",
3211
- "fieldName": "fullHeight",
3212
- "default": "false",
3213
- "description": "Whether the stack should take full height of its container",
3187
+ "name": "icon-start",
3188
+ "fieldName": "iconStart",
3189
+ "description": "Icon for the start icon",
3190
+ "type": {
3191
+ "text": "string"
3192
+ }
3193
+ },
3194
+ {
3195
+ "name": "show-spinners",
3196
+ "fieldName": "showSpinners",
3197
+ "default": "true",
3198
+ "description": "Whether to show the spinner controls",
3214
3199
  "type": {
3215
3200
  "text": "boolean"
3216
3201
  }
3217
3202
  },
3218
3203
  {
3219
- "name": "padding",
3220
- "fieldName": "padding",
3221
- "description": "Padding inside the stack container (CSS value)",
3204
+ "name": "external-id",
3205
+ "fieldName": "externalId",
3206
+ "description": "External ID for linking with external systems",
3222
3207
  "type": {
3223
3208
  "text": "string"
3224
3209
  }
3225
3210
  }
3226
3211
  ],
3227
- "tagName": "le-stack",
3228
- "events": [],
3212
+ "tagName": "le-number-input",
3213
+ "events": [
3214
+ {
3215
+ "name": "leChange",
3216
+ "type": {
3217
+ "text": "EventEmitter<{ value: number; name: string; externalId: string; isValid: boolean }>"
3218
+ },
3219
+ "description": "Emitted when the value changes (on blur or Enter)"
3220
+ },
3221
+ {
3222
+ "name": "leInput",
3223
+ "type": {
3224
+ "text": "EventEmitter<{ value: number; name: string; externalId: string; isValid: boolean }>"
3225
+ },
3226
+ "description": "Emitted when the input value changes (on keystroke/spin)"
3227
+ }
3228
+ ],
3229
3229
  "customElement": true
3230
3230
  }
3231
3231
  ],
3232
3232
  "exports": [
3233
3233
  {
3234
3234
  "kind": "js",
3235
- "name": "LeStack",
3235
+ "name": "LeNumberInput",
3236
3236
  "declaration": {
3237
- "name": "LeStack",
3238
- "module": "src/components/le-stack/le-stack.tsx"
3237
+ "name": "LeNumberInput",
3238
+ "module": "src/components/le-number-input/le-number-input.tsx"
3239
3239
  }
3240
3240
  },
3241
3241
  {
3242
3242
  "kind": "custom-element-definition",
3243
- "name": "le-stack",
3243
+ "name": "le-number-input",
3244
3244
  "declaration": {
3245
- "name": "LeStack",
3246
- "module": "src/components/le-stack/le-stack.tsx"
3245
+ "name": "LeNumberInput",
3246
+ "module": "src/components/le-number-input/le-number-input.tsx"
3247
3247
  }
3248
3248
  }
3249
3249
  ]