@lmb-it/kitsconcerto-native 0.1.277 → 0.1.285

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 (236) hide show
  1. package/apps/mobile/src/Core/AutoComplete/index.cjs +12 -4
  2. package/apps/mobile/src/Core/AutoComplete/index.cjs.map +1 -1
  3. package/apps/mobile/src/Core/AutoComplete/index.js +12 -4
  4. package/apps/mobile/src/Core/AutoComplete/index.js.map +1 -1
  5. package/apps/mobile/src/Core/MultiSelect/index.cjs +7 -4
  6. package/apps/mobile/src/Core/MultiSelect/index.cjs.map +1 -1
  7. package/apps/mobile/src/Core/MultiSelect/index.js +7 -4
  8. package/apps/mobile/src/Core/MultiSelect/index.js.map +1 -1
  9. package/components/Avatar/index.cjs +1 -0
  10. package/components/Avatar/index.cjs.map +1 -1
  11. package/components/Avatar/index.js +1 -0
  12. package/components/Avatar/index.js.map +1 -1
  13. package/components/Banner/banner.cjs +1 -0
  14. package/components/Banner/banner.cjs.map +1 -1
  15. package/components/Banner/banner.js +1 -0
  16. package/components/Banner/banner.js.map +1 -1
  17. package/components/BottomTabBar/index.cjs +1 -0
  18. package/components/BottomTabBar/index.cjs.map +1 -1
  19. package/components/BottomTabBar/index.js +1 -0
  20. package/components/BottomTabBar/index.js.map +1 -1
  21. package/components/BreadCrumb/index.cjs.map +1 -1
  22. package/components/BreadCrumb/index.js.map +1 -1
  23. package/components/Button/Button.cjs +1 -0
  24. package/components/Button/Button.cjs.map +1 -1
  25. package/components/Button/Button.js +1 -0
  26. package/components/Button/Button.js.map +1 -1
  27. package/components/Carousel/index.cjs +1 -0
  28. package/components/Carousel/index.cjs.map +1 -1
  29. package/components/Carousel/index.js +1 -0
  30. package/components/Carousel/index.js.map +1 -1
  31. package/components/ChatBubble/index.cjs +1 -0
  32. package/components/ChatBubble/index.cjs.map +1 -1
  33. package/components/ChatBubble/index.js +1 -0
  34. package/components/ChatBubble/index.js.map +1 -1
  35. package/components/Chip/index.cjs +1 -0
  36. package/components/Chip/index.cjs.map +1 -1
  37. package/components/Chip/index.js +1 -0
  38. package/components/Chip/index.js.map +1 -1
  39. package/components/DateSeparator/index.cjs +1 -0
  40. package/components/DateSeparator/index.cjs.map +1 -1
  41. package/components/DateSeparator/index.js +1 -0
  42. package/components/DateSeparator/index.js.map +1 -1
  43. package/components/DetailsList/index.cjs +1 -0
  44. package/components/DetailsList/index.cjs.map +1 -1
  45. package/components/DetailsList/index.js +1 -0
  46. package/components/DetailsList/index.js.map +1 -1
  47. package/components/EmptyState/index.cjs +1 -0
  48. package/components/EmptyState/index.cjs.map +1 -1
  49. package/components/EmptyState/index.js +1 -0
  50. package/components/EmptyState/index.js.map +1 -1
  51. package/components/Gallery/index.cjs +1 -0
  52. package/components/Gallery/index.cjs.map +1 -1
  53. package/components/Gallery/index.js +1 -0
  54. package/components/Gallery/index.js.map +1 -1
  55. package/components/MessageComposer/index.cjs +1 -0
  56. package/components/MessageComposer/index.cjs.map +1 -1
  57. package/components/MessageComposer/index.js +1 -0
  58. package/components/MessageComposer/index.js.map +1 -1
  59. package/components/MessageReceipt/index.cjs +1 -0
  60. package/components/MessageReceipt/index.cjs.map +1 -1
  61. package/components/MessageReceipt/index.js +1 -0
  62. package/components/MessageReceipt/index.js.map +1 -1
  63. package/components/ProgressBar/index.cjs +1 -0
  64. package/components/ProgressBar/index.cjs.map +1 -1
  65. package/components/ProgressBar/index.js +1 -0
  66. package/components/ProgressBar/index.js.map +1 -1
  67. package/components/SegmentedControl/index.cjs +1 -0
  68. package/components/SegmentedControl/index.cjs.map +1 -1
  69. package/components/SegmentedControl/index.js +1 -0
  70. package/components/SegmentedControl/index.js.map +1 -1
  71. package/components/StatCard/index.cjs +1 -0
  72. package/components/StatCard/index.cjs.map +1 -1
  73. package/components/StatCard/index.js +1 -0
  74. package/components/StatCard/index.js.map +1 -1
  75. package/components/Stepper/index.cjs +1 -0
  76. package/components/Stepper/index.cjs.map +1 -1
  77. package/components/Stepper/index.js +1 -0
  78. package/components/Stepper/index.js.map +1 -1
  79. package/components/Tabs/index.cjs +1 -0
  80. package/components/Tabs/index.cjs.map +1 -1
  81. package/components/Tabs/index.js +1 -0
  82. package/components/Tabs/index.js.map +1 -1
  83. package/components/Timeline/index.cjs +1 -0
  84. package/components/Timeline/index.cjs.map +1 -1
  85. package/components/Timeline/index.js +1 -0
  86. package/components/Timeline/index.js.map +1 -1
  87. package/components/Translate/index.cjs +1 -0
  88. package/components/Translate/index.cjs.map +1 -1
  89. package/components/Translate/index.js +1 -0
  90. package/components/Translate/index.js.map +1 -1
  91. package/components/TypingIndicator/index.cjs +1 -0
  92. package/components/TypingIndicator/index.cjs.map +1 -1
  93. package/components/TypingIndicator/index.js +1 -0
  94. package/components/TypingIndicator/index.js.map +1 -1
  95. package/components/overlay/ConfirmDialog/index.cjs +1 -0
  96. package/components/overlay/ConfirmDialog/index.cjs.map +1 -1
  97. package/components/overlay/ConfirmDialog/index.js +1 -0
  98. package/components/overlay/ConfirmDialog/index.js.map +1 -1
  99. package/components/overlay/Dialog/index.cjs +1 -0
  100. package/components/overlay/Dialog/index.cjs.map +1 -1
  101. package/components/overlay/Dialog/index.js +1 -0
  102. package/components/overlay/Dialog/index.js.map +1 -1
  103. package/contexts/BreadcrumbContext.cjs +33 -0
  104. package/contexts/BreadcrumbContext.cjs.map +1 -0
  105. package/contexts/BreadcrumbContext.js +28 -0
  106. package/contexts/BreadcrumbContext.js.map +1 -0
  107. package/form/controls/Checkbox/index.cjs +1 -0
  108. package/form/controls/Checkbox/index.cjs.map +1 -1
  109. package/form/controls/Checkbox/index.js +1 -0
  110. package/form/controls/Checkbox/index.js.map +1 -1
  111. package/form/controls/RadioButton/radio.cjs +1 -0
  112. package/form/controls/RadioButton/radio.cjs.map +1 -1
  113. package/form/controls/RadioButton/radio.js +1 -0
  114. package/form/controls/RadioButton/radio.js.map +1 -1
  115. package/form/controls/TriStateCheckbox/index.cjs +1 -0
  116. package/form/controls/TriStateCheckbox/index.cjs.map +1 -1
  117. package/form/controls/TriStateCheckbox/index.js +1 -0
  118. package/form/controls/TriStateCheckbox/index.js.map +1 -1
  119. package/form/file-pickers/index.cjs +1 -0
  120. package/form/file-pickers/index.cjs.map +1 -1
  121. package/form/file-pickers/index.js +1 -0
  122. package/form/file-pickers/index.js.map +1 -1
  123. package/form/helpers/FormContainer/index.cjs +13 -2
  124. package/form/helpers/FormContainer/index.cjs.map +1 -1
  125. package/form/helpers/FormContainer/index.js +13 -2
  126. package/form/helpers/FormContainer/index.js.map +1 -1
  127. package/form/inputs/ColorPicker/index.cjs +1 -0
  128. package/form/inputs/ColorPicker/index.cjs.map +1 -1
  129. package/form/inputs/ColorPicker/index.js +1 -0
  130. package/form/inputs/ColorPicker/index.js.map +1 -1
  131. package/form/inputs/Datepicker/index.cjs +1 -0
  132. package/form/inputs/Datepicker/index.cjs.map +1 -1
  133. package/form/inputs/Datepicker/index.js +1 -0
  134. package/form/inputs/Datepicker/index.js.map +1 -1
  135. package/form/inputs/InputLocation/index.cjs +1 -0
  136. package/form/inputs/InputLocation/index.cjs.map +1 -1
  137. package/form/inputs/InputLocation/index.js +1 -0
  138. package/form/inputs/InputLocation/index.js.map +1 -1
  139. package/form/inputs/InputMask/index.cjs +1 -0
  140. package/form/inputs/InputMask/index.cjs.map +1 -1
  141. package/form/inputs/InputMask/index.js +1 -0
  142. package/form/inputs/InputMask/index.js.map +1 -1
  143. package/form/inputs/InputNumber/index.cjs +1 -0
  144. package/form/inputs/InputNumber/index.cjs.map +1 -1
  145. package/form/inputs/InputNumber/index.js +1 -0
  146. package/form/inputs/InputNumber/index.js.map +1 -1
  147. package/form/inputs/InputPassword/index.cjs +1 -0
  148. package/form/inputs/InputPassword/index.cjs.map +1 -1
  149. package/form/inputs/InputPassword/index.js +1 -0
  150. package/form/inputs/InputPassword/index.js.map +1 -1
  151. package/form/inputs/InputSwitch/index.cjs +1 -0
  152. package/form/inputs/InputSwitch/index.cjs.map +1 -1
  153. package/form/inputs/InputSwitch/index.js +1 -0
  154. package/form/inputs/InputSwitch/index.js.map +1 -1
  155. package/form/inputs/InputText/index.cjs +1 -0
  156. package/form/inputs/InputText/index.cjs.map +1 -1
  157. package/form/inputs/InputText/index.js +1 -0
  158. package/form/inputs/InputText/index.js.map +1 -1
  159. package/form/inputs/InputTextarea/index.cjs +1 -0
  160. package/form/inputs/InputTextarea/index.cjs.map +1 -1
  161. package/form/inputs/InputTextarea/index.js +1 -0
  162. package/form/inputs/InputTextarea/index.js.map +1 -1
  163. package/form/inputs/PhoneInput/index.cjs +1 -0
  164. package/form/inputs/PhoneInput/index.cjs.map +1 -1
  165. package/form/inputs/PhoneInput/index.js +1 -0
  166. package/form/inputs/PhoneInput/index.js.map +1 -1
  167. package/form/selects/AutoComplete/index.cjs +11 -1
  168. package/form/selects/AutoComplete/index.cjs.map +1 -1
  169. package/form/selects/AutoComplete/index.js +12 -2
  170. package/form/selects/AutoComplete/index.js.map +1 -1
  171. package/form/selects/CascadeSelect/index.cjs +1 -0
  172. package/form/selects/CascadeSelect/index.cjs.map +1 -1
  173. package/form/selects/CascadeSelect/index.js +1 -0
  174. package/form/selects/CascadeSelect/index.js.map +1 -1
  175. package/form/selects/Dropdown/index.cjs +1 -0
  176. package/form/selects/Dropdown/index.cjs.map +1 -1
  177. package/form/selects/Dropdown/index.js +1 -0
  178. package/form/selects/Dropdown/index.js.map +1 -1
  179. package/form/selects/ListBox/index.cjs +1 -0
  180. package/form/selects/ListBox/index.cjs.map +1 -1
  181. package/form/selects/ListBox/index.js +1 -0
  182. package/form/selects/ListBox/index.js.map +1 -1
  183. package/form/selects/MultiSelect/index.cjs +9 -1
  184. package/form/selects/MultiSelect/index.cjs.map +1 -1
  185. package/form/selects/MultiSelect/index.js +10 -2
  186. package/form/selects/MultiSelect/index.js.map +1 -1
  187. package/form/selects/TreeSelect/index.cjs +1 -0
  188. package/form/selects/TreeSelect/index.cjs.map +1 -1
  189. package/form/selects/TreeSelect/index.js +1 -0
  190. package/form/selects/TreeSelect/index.js.map +1 -1
  191. package/form/selects/helpers/SelectPopupOverlay.cjs +1 -0
  192. package/form/selects/helpers/SelectPopupOverlay.cjs.map +1 -1
  193. package/form/selects/helpers/SelectPopupOverlay.js +1 -0
  194. package/form/selects/helpers/SelectPopupOverlay.js.map +1 -1
  195. package/form-renderer/components/fields/FileUploader/index.cjs +1 -0
  196. package/form-renderer/components/fields/FileUploader/index.cjs.map +1 -1
  197. package/form-renderer/components/fields/FileUploader/index.js +1 -0
  198. package/form-renderer/components/fields/FileUploader/index.js.map +1 -1
  199. package/form-renderer/components/fields/Group/index.cjs +1 -0
  200. package/form-renderer/components/fields/Group/index.cjs.map +1 -1
  201. package/form-renderer/components/fields/Group/index.js +1 -0
  202. package/form-renderer/components/fields/Group/index.js.map +1 -1
  203. package/form-renderer/components/fields/Radios/index.cjs +1 -0
  204. package/form-renderer/components/fields/Radios/index.cjs.map +1 -1
  205. package/form-renderer/components/fields/Radios/index.js +1 -0
  206. package/form-renderer/components/fields/Radios/index.js.map +1 -1
  207. package/form-renderer/components/fields/Select/index.cjs +1 -0
  208. package/form-renderer/components/fields/Select/index.cjs.map +1 -1
  209. package/form-renderer/components/fields/Select/index.js +1 -0
  210. package/form-renderer/components/fields/Select/index.js.map +1 -1
  211. package/hooks/main.cjs +1 -0
  212. package/hooks/main.cjs.map +1 -1
  213. package/hooks/main.js +1 -0
  214. package/hooks/main.js.map +1 -1
  215. package/hooks/useBreadcrumbTrail.cjs +21 -0
  216. package/hooks/useBreadcrumbTrail.cjs.map +1 -0
  217. package/hooks/useBreadcrumbTrail.js +16 -0
  218. package/hooks/useBreadcrumbTrail.js.map +1 -0
  219. package/hooks/useComponentDefaults.cjs +50 -8
  220. package/hooks/useComponentDefaults.cjs.map +1 -1
  221. package/hooks/useComponentDefaults.js +50 -8
  222. package/hooks/useComponentDefaults.js.map +1 -1
  223. package/index.cjs +5 -0
  224. package/index.cjs.map +1 -1
  225. package/index.d.ts +245 -19
  226. package/index.js +2 -0
  227. package/index.js.map +1 -1
  228. package/package.json +1 -1
  229. package/packages/types/src/Theme/defaultTheme.cjs +24 -4
  230. package/packages/types/src/Theme/defaultTheme.cjs.map +1 -1
  231. package/packages/types/src/Theme/defaultTheme.js +24 -4
  232. package/packages/types/src/Theme/defaultTheme.js.map +1 -1
  233. package/primitives/Card/index.cjs +1 -0
  234. package/primitives/Card/index.cjs.map +1 -1
  235. package/primitives/Card/index.js +1 -0
  236. package/primitives/Card/index.js.map +1 -1
@@ -27,9 +27,14 @@ const ELEMENT_SLOT_KEYS = /* @__PURE__ */ new Set([
27
27
  "itemHover",
28
28
  "itemDisabled",
29
29
  "itemInvalid",
30
- // MultiSelect specific (IMultiSelectSlots — chips + per-item checkbox)
30
+ // Chip-bearing selects (IChipInputSlots — MultiSelect display="chip"
31
+ // AND AutoComplete/Tags with isMultiple). `tokenContainer` is the
32
+ // bordered box that holds the chips and the caret — see the docblock
33
+ // on IChipInputSlots for why it is neither `root` nor `container`.
34
+ "tokenContainer",
31
35
  "token",
32
36
  "tokenIcon",
37
+ // MultiSelect specific (IMultiSelectSlots — per-item checkbox)
33
38
  "checkboxBox",
34
39
  "checkboxBoxChecked",
35
40
  "checkboxIcon",
@@ -147,6 +152,25 @@ const ELEMENT_SLOT_KEYS = /* @__PURE__ */ new Set([
147
152
  "avatarButton",
148
153
  "breadcrumb"
149
154
  ]);
155
+ function mergeSlotProps(layers) {
156
+ const out = {};
157
+ const classes = [];
158
+ for (const layer of layers) {
159
+ if (!layer) continue;
160
+ for (const [key, value] of Object.entries(layer)) {
161
+ if (value === void 0) continue;
162
+ if (key === "className") {
163
+ if (value) classes.push(String(value));
164
+ } else {
165
+ out[key] = value;
166
+ }
167
+ }
168
+ }
169
+ if (classes.length) {
170
+ out.className = Array.from(new Set(classes.join(" ").split(/\s+/).filter(Boolean))).join(" ");
171
+ }
172
+ return out;
173
+ }
150
174
  function useComponentDefaults(componentName, props, baseGroup) {
151
175
  const { theme } = KitsThemeProvider_native.useKitsTheme();
152
176
  const formElementConfig = theme.components.FormElement;
@@ -155,23 +179,31 @@ function useComponentDefaults(componentName, props, baseGroup) {
155
179
  return React.useMemo(() => {
156
180
  const instanceSlots = props.slots;
157
181
  if (!config && !baseConfig && !instanceSlots && !formElementConfig) {
158
- return { mergedProps: props, themeStyle: {}, elementStyles: {}, elementConfigs: {} };
182
+ return { mergedProps: props, themeStyle: {}, elementStyles: {}, elementProps: {}, elementConfigs: {} };
159
183
  }
160
184
  const formBase = formElementConfig || {};
161
185
  const base = baseConfig || {};
162
186
  const comp = config || {};
163
- const merged = {
164
- ...formBase.root?.props || {},
165
- ...base.root?.props || {},
166
- ...comp.root?.props || {},
167
- ...instanceSlots?.root?.props || {}
168
- };
187
+ const merged = mergeSlotProps([
188
+ formBase.root?.props,
189
+ base.root?.props,
190
+ comp.root?.props,
191
+ instanceSlots?.root?.props
192
+ ]);
193
+ const userClassName = typeof props.className === "string" ? props.className : void 0;
169
194
  for (const key of Object.keys(props)) {
170
195
  if (key === "slots") continue;
196
+ if (key === "className") continue;
171
197
  if (props[key] !== void 0) {
172
198
  merged[key] = props[key];
173
199
  }
174
200
  }
201
+ if (userClassName || merged.className) {
202
+ merged.className = mergeSlotProps([
203
+ { className: merged.className },
204
+ { className: userClassName }
205
+ ]).className;
206
+ }
175
207
  const allSlotKeys = /* @__PURE__ */ new Set();
176
208
  for (const key of Object.keys(formBase)) {
177
209
  if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);
@@ -188,6 +220,7 @@ function useComponentDefaults(componentName, props, baseGroup) {
188
220
  }
189
221
  }
190
222
  const elementStyles = {};
223
+ const elementProps = {};
191
224
  const elementConfigs = {};
192
225
  for (const slotKey of allSlotKeys) {
193
226
  const style = {
@@ -197,6 +230,13 @@ function useComponentDefaults(componentName, props, baseGroup) {
197
230
  ...instanceSlots?.[slotKey]?.style || {}
198
231
  };
199
232
  elementStyles[slotKey] = style;
233
+ const slotProps = mergeSlotProps([
234
+ formBase[slotKey]?.props,
235
+ base[slotKey]?.props,
236
+ comp[slotKey]?.props,
237
+ instanceSlots?.[slotKey]?.props
238
+ ]);
239
+ elementProps[slotKey] = slotProps;
200
240
  const pseudoMerged = {
201
241
  ...formBase[slotKey]?.pseudo || {},
202
242
  ...base[slotKey]?.pseudo || {},
@@ -205,6 +245,7 @@ function useComponentDefaults(componentName, props, baseGroup) {
205
245
  };
206
246
  elementConfigs[slotKey] = {
207
247
  style,
248
+ props: slotProps,
208
249
  important: instanceSlots?.[slotKey]?.important ?? comp[slotKey]?.important ?? base[slotKey]?.important ?? formBase[slotKey]?.important,
209
250
  pseudo: Object.keys(pseudoMerged).length > 0 ? pseudoMerged : void 0
210
251
  };
@@ -214,6 +255,7 @@ function useComponentDefaults(componentName, props, baseGroup) {
214
255
  mergedProps: merged,
215
256
  themeStyle,
216
257
  elementStyles,
258
+ elementProps,
217
259
  elementConfigs
218
260
  };
219
261
  }, [formElementConfig, baseConfig, config, props]);
@@ -1 +1 @@
1
- {"version":3,"file":"useComponentDefaults.cjs","sources":["../../../src/hooks/useComponentDefaults.ts"],"sourcesContent":["import {useMemo} from 'react';\nimport {useKitsTheme} from '../contexts/Theme';\n\n/**\n * Known element slot keys. When a config key matches one of these\n * AND the value has `props` or `style`, it is treated as an element slot.\n *\n * To add a new slot: add the key here AND to the relevant slot interface\n * in packages/types/src/Theme/types.ts (and to the `AllSlotKeys` union).\n *\n * The order below mirrors the typed slot hierarchy in\n * `packages/types/src/Theme/types.ts`.\n */\nconst ELEMENT_SLOT_KEYS = new Set([\n // ── Form-element slots ──────────────────────────────────\n // Base (all form elements — IFormElementBaseSlots)\n 'label', 'helperText', 'error',\n // Text input specific (ITextInputSlots — also shared by ISelectSlots)\n 'root', 'container', 'inputGroup', 'leftAddon', 'rightAddon',\n // Select specific (ISelectSlots — option-list popover)\n // Radio / Checkbox also use `item` / `itemSelected` / `itemDisabled` /\n // `itemHover` for the per-list-item wrapper, plus `itemInvalid`.\n 'panel', 'item', 'itemSelected', 'itemFocused', 'itemHover', 'itemDisabled', 'itemInvalid',\n // MultiSelect specific (IMultiSelectSlots — chips + per-item checkbox)\n 'token', 'tokenIcon',\n 'checkboxBox', 'checkboxBoxChecked', 'checkboxIcon',\n // Datepicker specific (IDatepickerSlots — calendar popup; `panel` shared with Select)\n 'calendarHeader', 'calendarNavButton', 'weekDay',\n 'dayCell', 'daySelected', 'dayToday', 'dayDisabled',\n // Switch specific (ISwitchSlots) — RENAMED from slider/sliderChecked/thumbChecked\n 'track', 'trackOn', 'thumb', 'thumbOn',\n // Checkbox specific (ICheckboxSlots)\n 'box', 'boxChecked', 'checkIcon',\n // Radio specific (IRadioSlots)\n 'circle', 'circleInner',\n // Radio + Checkbox: wrapper Flex around all list items\n 'itemsContainer',\n\n // ── Non-form component slots (untouched by the form-element refactor) ──\n // Card / Button / generic\n 'icon', 'header', 'title', 'subTitle', 'content', 'footer',\n // Button variants — `text` applies only to buttons with a label,\n // `iconOnly` applies only to icon-only buttons (so styling one never\n // affects the other).\n 'text', 'iconOnly',\n // Table\n 'th', 'headerRow', 'headerCell', 'body', 'bodyRow', 'bodyCell',\n 'wrapper', 'table', 'tbody',\n 'filterRow', 'filterCell', 'filterClearButton',\n 'columnFilter', 'columnFilterInput',\n 'tfoot', 'footerRow', 'footerCell', 'footer', 'paginator', 'emptyMessage',\n 'loadingOverlay', 'loadingIcon',\n 'rowGroupHeader', 'rowGroupHeaderName', 'rowExpansion', 'rowGroupFooter',\n 'rowGroupToggler', 'rowGroupTogglerIcon',\n 'resizeHelper',\n 'reorderIndicatorUp', 'reorderIndicatorUpIcon',\n 'reorderIndicatorDown', 'reorderIndicatorDownIcon',\n 'tableHeader', 'searchInput',\n 'paginatorPageButton', 'paginatorPageLink', 'paginatorActivePageButton',\n 'paginatorPageReport', 'paginatorRowsPerPage', 'paginatorRowsPerPageDropdown',\n 'paginatorPages',\n 'sortedColumn', 'stripedRow', 'selectedRow', 'selectedRowAccent',\n 'filterBar', 'filterInput', 'filterLabel',\n 'toolbarRight', 'toolbarButton', 'clearFilterButton', 'columnPicker',\n // Toolbar sizing + placeholder, and the chrome the table renders itself.\n // NOTE: a slot missing from this allowlist is silently dropped — theming\n // it has no effect at all — so every new slot must be listed here as\n // well as in its component's ITableElementSlots.\n 'toolbarControl', 'filterPlaceholder',\n 'topBar', 'bulkBar', 'bulkBarText',\n // Accordion\n 'headerActive', 'headerHover',\n // Sidebar/Drawer\n 'headerTitle', 'closeButton', 'mask',\n // Group (repeatable field array)\n 'row', 'addButton', 'removeButton',\n // Header (app-shell top bar)\n 'toggleModeButton', 'avatarButton', 'breadcrumb',\n]);\n\nexport interface IElementConfig {\n style: Record<string, any>;\n important?: boolean | string[];\n pseudo?: Record<string, Record<string, any>>;\n}\n\nexport interface UseComponentDefaultsResult<T> {\n /** Props with theme defaults merged in (user props always win) */\n mergedProps: T;\n /**\n * CSS style from root slot — backwards compat for components\n * that read themeStyle instead of elementStyles.root\n */\n themeStyle: Record<string, any>;\n /**\n * Per-element style maps. Each key is a slot name, value is the\n * merged IStyleClasses (not yet resolved to CSSProperties).\n * Use `useResolvedElementStyles(elementStyles)` to resolve.\n */\n elementStyles: Record<string, Record<string, any>>;\n /**\n * Full slot configs including `important` and `pseudo` fields.\n * Use this instead of `elementStyles` when you need those fields.\n */\n elementConfigs: Record<string, IElementConfig>;\n}\n\n/**\n * Merges theme-level component defaults with user-supplied props.\n *\n * Resolution chain (lowest → highest priority):\n * FormElement[slot] < baseGroup[slot] < component[slot] < instanceSlots[slot] < user props\n *\n * `FormElement` is the global base group for every form element\n * (label / helperText / error live there by default). It is applied\n * to every component regardless of whether a `baseGroup` is provided\n * — for non-form components like Button or Card, FormElement slots\n * are no-ops in practice because those components don't read\n * `elementStyles.label` / `helperText` / `error`.\n *\n * Element slots (`root`, `label`, `container`, etc.) are direct keys\n * on the component config. Each slot accepts `{ props?, style? }`.\n *\n * The `root` slot's `props` are merged into `mergedProps` alongside\n * user props (user always wins). The `root` slot's `style` is returned\n * as both `themeStyle` (backwards compat) and `elementStyles.root`.\n *\n * Supports base-group inheritance: e.g. `useComponentDefaults('InputText', rawProps, 'Input')`\n * merges FormElement first, then Input base, then InputText overrides,\n * then per-instance slots, then user props.\n *\n * @example\n * const { mergedProps, themeStyle, elementStyles } = useComponentDefaults('InputText', rawProps, 'Input');\n * // mergedProps → FormElement.root.props < Input.root.props < InputText.root.props < instanceSlots < user props\n * // elementStyles.label → FormElement.label.style < Input.label.style < InputText.label.style < instance label\n * // elementStyles.root → root element style (FormElement → Input → InputText → instance)\n * // elementStyles.container → container element style\n */\nexport default function useComponentDefaults<T extends Record<string, any>>(\n componentName: string,\n props: T,\n baseGroup?: string,\n): UseComponentDefaultsResult<T> {\n const {theme} = useKitsTheme();\n // Global base for every form element. Always looked up — if not\n // configured it is `undefined` and the merge contributes nothing.\n const formElementConfig = theme.components.FormElement;\n const baseConfig = baseGroup ? theme.components[baseGroup] : undefined;\n const config = theme.components[componentName];\n\n return useMemo(() => {\n // Extract per-instance slot overrides from props (IFormElement.slots passed through)\n const instanceSlots = (props as any).slots as Record<string, { props?: any; style?: any; important?: boolean | string[]; pseudo?: Record<string, Record<string, any>> }> | undefined;\n\n if (!config && !baseConfig && !instanceSlots && !formElementConfig) {\n return {mergedProps: props, themeStyle: {}, elementStyles: {}, elementConfigs: {}};\n }\n\n const formBase = (formElementConfig || {}) as Record<string, any>;\n const base = (baseConfig || {}) as Record<string, any>;\n const comp = (config || {}) as Record<string, any>;\n\n // --- Props merge: FormElement.root.props < base.root.props < config.root.props < instanceSlots.root.props < user props ---\n const merged = {\n ...(formBase.root?.props || {}),\n ...(base.root?.props || {}),\n ...(comp.root?.props || {}),\n ...(instanceSlots?.root?.props || {}),\n } as Record<string, any>;\n\n for (const key of Object.keys(props)) {\n // Skip 'slots' — it is consumed here, not forwarded\n if (key === 'slots') continue;\n if (props[key] !== undefined) {\n merged[key] = props[key];\n }\n }\n\n // --- Element styles merge: FormElement[slot] < base[slot] < config[slot] < instanceSlots[slot] ---\n const allSlotKeys = new Set<string>();\n for (const key of Object.keys(formBase)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n for (const key of Object.keys(base)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n for (const key of Object.keys(comp)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n if (instanceSlots) {\n for (const key of Object.keys(instanceSlots)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n }\n\n const elementStyles: Record<string, Record<string, any>> = {};\n const elementConfigs: Record<string, IElementConfig> = {};\n for (const slotKey of allSlotKeys) {\n const style = {\n ...(formBase[slotKey]?.style || {}),\n ...(base[slotKey]?.style || {}),\n ...(comp[slotKey]?.style || {}),\n ...(instanceSlots?.[slotKey]?.style || {}),\n };\n elementStyles[slotKey] = style;\n\n const pseudoMerged = {\n ...(formBase[slotKey]?.pseudo || {}),\n ...(base[slotKey]?.pseudo || {}),\n ...(comp[slotKey]?.pseudo || {}),\n ...(instanceSlots?.[slotKey]?.pseudo || {}),\n };\n elementConfigs[slotKey] = {\n style,\n important:\n instanceSlots?.[slotKey]?.important ??\n comp[slotKey]?.important ??\n base[slotKey]?.important ??\n formBase[slotKey]?.important,\n pseudo: Object.keys(pseudoMerged).length > 0 ? pseudoMerged : undefined,\n };\n }\n\n // themeStyle = root element style (backwards compat)\n const themeStyle = elementStyles.root || {};\n\n return {\n mergedProps: merged as T,\n themeStyle,\n elementStyles,\n elementConfigs,\n };\n }, [formElementConfig, baseConfig, config, props]);\n}\n"],"names":["useKitsTheme","useMemo"],"mappings":"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"}
1
+ {"version":3,"file":"useComponentDefaults.cjs","sources":["../../../src/hooks/useComponentDefaults.ts"],"sourcesContent":["import {useMemo} from 'react';\nimport {useKitsTheme} from '../contexts/Theme';\n\n/**\n * Known element slot keys. When a config key matches one of these\n * AND the value has `props` or `style`, it is treated as an element slot.\n *\n * To add a new slot: add the key here AND to the relevant slot interface\n * in packages/types/src/Theme/types.ts (and to the `AllSlotKeys` union).\n *\n * The order below mirrors the typed slot hierarchy in\n * `packages/types/src/Theme/types.ts`.\n */\nconst ELEMENT_SLOT_KEYS = new Set([\n // ── Form-element slots ──────────────────────────────────\n // Base (all form elements — IFormElementBaseSlots)\n 'label', 'helperText', 'error',\n // Text input specific (ITextInputSlots — also shared by ISelectSlots)\n 'root', 'container', 'inputGroup', 'leftAddon', 'rightAddon',\n // Select specific (ISelectSlots — option-list popover)\n // Radio / Checkbox also use `item` / `itemSelected` / `itemDisabled` /\n // `itemHover` for the per-list-item wrapper, plus `itemInvalid`.\n 'panel', 'item', 'itemSelected', 'itemFocused', 'itemHover', 'itemDisabled', 'itemInvalid',\n // Chip-bearing selects (IChipInputSlots — MultiSelect display=\"chip\"\n // AND AutoComplete/Tags with isMultiple). `tokenContainer` is the\n // bordered box that holds the chips and the caret — see the docblock\n // on IChipInputSlots for why it is neither `root` nor `container`.\n 'tokenContainer', 'token', 'tokenIcon',\n // MultiSelect specific (IMultiSelectSlots — per-item checkbox)\n 'checkboxBox', 'checkboxBoxChecked', 'checkboxIcon',\n // Datepicker specific (IDatepickerSlots — calendar popup; `panel` shared with Select)\n 'calendarHeader', 'calendarNavButton', 'weekDay',\n 'dayCell', 'daySelected', 'dayToday', 'dayDisabled',\n // Switch specific (ISwitchSlots) — RENAMED from slider/sliderChecked/thumbChecked\n 'track', 'trackOn', 'thumb', 'thumbOn',\n // Checkbox specific (ICheckboxSlots)\n 'box', 'boxChecked', 'checkIcon',\n // Radio specific (IRadioSlots)\n 'circle', 'circleInner',\n // Radio + Checkbox: wrapper Flex around all list items\n 'itemsContainer',\n\n // ── Non-form component slots (untouched by the form-element refactor) ──\n // Card / Button / generic\n 'icon', 'header', 'title', 'subTitle', 'content', 'footer',\n // Button variants — `text` applies only to buttons with a label,\n // `iconOnly` applies only to icon-only buttons (so styling one never\n // affects the other).\n 'text', 'iconOnly',\n // Table\n 'th', 'headerRow', 'headerCell', 'body', 'bodyRow', 'bodyCell',\n 'wrapper', 'table', 'tbody',\n 'filterRow', 'filterCell', 'filterClearButton',\n 'columnFilter', 'columnFilterInput',\n 'tfoot', 'footerRow', 'footerCell', 'footer', 'paginator', 'emptyMessage',\n 'loadingOverlay', 'loadingIcon',\n 'rowGroupHeader', 'rowGroupHeaderName', 'rowExpansion', 'rowGroupFooter',\n 'rowGroupToggler', 'rowGroupTogglerIcon',\n 'resizeHelper',\n 'reorderIndicatorUp', 'reorderIndicatorUpIcon',\n 'reorderIndicatorDown', 'reorderIndicatorDownIcon',\n 'tableHeader', 'searchInput',\n 'paginatorPageButton', 'paginatorPageLink', 'paginatorActivePageButton',\n 'paginatorPageReport', 'paginatorRowsPerPage', 'paginatorRowsPerPageDropdown',\n 'paginatorPages',\n 'sortedColumn', 'stripedRow', 'selectedRow', 'selectedRowAccent',\n 'filterBar', 'filterInput', 'filterLabel',\n 'toolbarRight', 'toolbarButton', 'clearFilterButton', 'columnPicker',\n // Toolbar sizing + placeholder, and the chrome the table renders itself.\n // NOTE: a slot missing from this allowlist is silently dropped — theming\n // it has no effect at all — so every new slot must be listed here as\n // well as in its component's ITableElementSlots.\n 'toolbarControl', 'filterPlaceholder',\n 'topBar', 'bulkBar', 'bulkBarText',\n // Accordion\n 'headerActive', 'headerHover',\n // Sidebar/Drawer\n 'headerTitle', 'closeButton', 'mask',\n // Group (repeatable field array)\n 'row', 'addButton', 'removeButton',\n // Header (app-shell top bar)\n 'toggleModeButton', 'avatarButton', 'breadcrumb',\n]);\n\nexport interface IElementConfig {\n style: Record<string, any>;\n /**\n * Extra attributes for this slot's element — `className`, `data-*`,\n * `aria-*`, anything the platform element accepts. Merged across the\n * whole chain (FormElement < baseGroup < component < instance slots),\n * with `className` CONCATENATED rather than replaced.\n */\n props: Record<string, any>;\n important?: boolean | string[];\n pseudo?: Record<string, Record<string, any>>;\n}\n\nexport interface UseComponentDefaultsResult<T> {\n /** Props with theme defaults merged in (user props always win) */\n mergedProps: T;\n /**\n * CSS style from root slot — backwards compat for components\n * that read themeStyle instead of elementStyles.root\n */\n themeStyle: Record<string, any>;\n /**\n * Per-element style maps. Each key is a slot name, value is the\n * merged IStyleClasses (not yet resolved to CSSProperties).\n * Use `useResolvedElementStyles(elementStyles)` to resolve.\n */\n elementStyles: Record<string, Record<string, any>>;\n /**\n * Per-element extra attributes. Each key is a slot name, value is the\n * merged `props` for that slot (`className`, `data-*`, `aria-*`, …).\n *\n * ⛔ EVERY SLOT, NOT JUST `root` — THAT WAS THE BUG. `IElementSlotConfig`\n * has advertised `props` on every slot since the slot system landed, but\n * only `root.props` was ever read (it is folded into `mergedProps`).\n * Anything a consumer put on another slot — the class a portal needs on a\n * tags field's outer box to make it match a text input — was parsed,\n * merged, and then thrown away with no warning and no type error.\n * Components apply `elementProps[slot]` to the matching element.\n */\n elementProps: Record<string, Record<string, any>>;\n /**\n * Full slot configs including `props`, `important` and `pseudo` fields.\n * Use this instead of `elementStyles` when you need those fields.\n */\n elementConfigs: Record<string, IElementConfig>;\n}\n\n/**\n * Merges slot `props` layers. Everything is last-wins EXCEPT `className`,\n * which is concatenated — a theme-level class and a consumer's class are\n * additive by nature, and dropping one of them is exactly the fault this\n * whole plumbing exists to fix.\n */\nfunction mergeSlotProps(layers: Array<Record<string, any> | undefined>): Record<string, any> {\n const out: Record<string, any> = {};\n const classes: string[] = [];\n for (const layer of layers) {\n if (!layer) continue;\n for (const [key, value] of Object.entries(layer)) {\n if (value === undefined) continue;\n if (key === 'className') {\n if (value) classes.push(String(value));\n } else {\n out[key] = value;\n }\n }\n }\n if (classes.length) {\n // De-duplicated, so a class repeated down the chain lands once.\n out.className = Array.from(new Set(classes.join(' ').split(/\\s+/).filter(Boolean))).join(' ');\n }\n return out;\n}\n\n/**\n * Merges theme-level component defaults with user-supplied props.\n *\n * Resolution chain (lowest → highest priority):\n * FormElement[slot] < baseGroup[slot] < component[slot] < instanceSlots[slot] < user props\n *\n * `FormElement` is the global base group for every form element\n * (label / helperText / error live there by default). It is applied\n * to every component regardless of whether a `baseGroup` is provided\n * — for non-form components like Button or Card, FormElement slots\n * are no-ops in practice because those components don't read\n * `elementStyles.label` / `helperText` / `error`.\n *\n * Element slots (`root`, `label`, `container`, etc.) are direct keys\n * on the component config. Each slot accepts `{ props?, style? }`.\n *\n * The `root` slot's `props` are merged into `mergedProps` alongside\n * user props (user always wins, except `className`, which concatenates).\n * The `root` slot's `style` is returned as both `themeStyle` (backwards\n * compat) and `elementStyles.root`.\n *\n * EVERY OTHER slot's `props` come back on `elementProps[slot]` — the\n * component is responsible for spreading them onto the element that slot\n * names. Before that existed, `props` on a non-root slot was silently\n * discarded, which is how a consumer's class on a tags field's outer box\n * disappeared without a single error.\n *\n * Supports base-group inheritance: e.g. `useComponentDefaults('InputText', rawProps, 'Input')`\n * merges FormElement first, then Input base, then InputText overrides,\n * then per-instance slots, then user props.\n *\n * @example\n * const { mergedProps, themeStyle, elementStyles } = useComponentDefaults('InputText', rawProps, 'Input');\n * // mergedProps → FormElement.root.props < Input.root.props < InputText.root.props < instanceSlots < user props\n * // elementStyles.label → FormElement.label.style < Input.label.style < InputText.label.style < instance label\n * // elementStyles.root → root element style (FormElement → Input → InputText → instance)\n * // elementStyles.container → container element style\n */\nexport default function useComponentDefaults<T extends Record<string, any>>(\n componentName: string,\n props: T,\n baseGroup?: string,\n): UseComponentDefaultsResult<T> {\n const {theme} = useKitsTheme();\n // Global base for every form element. Always looked up — if not\n // configured it is `undefined` and the merge contributes nothing.\n const formElementConfig = theme.components.FormElement;\n const baseConfig = baseGroup ? theme.components[baseGroup] : undefined;\n const config = theme.components[componentName];\n\n return useMemo(() => {\n // Extract per-instance slot overrides from props (IFormElement.slots passed through)\n const instanceSlots = (props as any).slots as Record<string, { props?: any; style?: any; important?: boolean | string[]; pseudo?: Record<string, Record<string, any>> }> | undefined;\n\n if (!config && !baseConfig && !instanceSlots && !formElementConfig) {\n return {mergedProps: props, themeStyle: {}, elementStyles: {}, elementProps: {}, elementConfigs: {}};\n }\n\n const formBase = (formElementConfig || {}) as Record<string, any>;\n const base = (baseConfig || {}) as Record<string, any>;\n const comp = (config || {}) as Record<string, any>;\n\n // --- Props merge: FormElement.root.props < base.root.props < config.root.props < instanceSlots.root.props < user props ---\n const merged = mergeSlotProps([\n formBase.root?.props,\n base.root?.props,\n comp.root?.props,\n instanceSlots?.root?.props,\n ]);\n\n const userClassName = typeof (props as any).className === 'string' ? (props as any).className : undefined;\n for (const key of Object.keys(props)) {\n // Skip 'slots' — it is consumed here, not forwarded\n if (key === 'slots') continue;\n // className is additive, not a replacement: a theme-level class on\n // `root.props` and the consumer's own class both have to survive.\n if (key === 'className') continue;\n if (props[key] !== undefined) {\n merged[key] = props[key];\n }\n }\n if (userClassName || merged.className) {\n merged.className = mergeSlotProps([\n {className: merged.className},\n {className: userClassName},\n ]).className;\n }\n\n // --- Element styles merge: FormElement[slot] < base[slot] < config[slot] < instanceSlots[slot] ---\n const allSlotKeys = new Set<string>();\n for (const key of Object.keys(formBase)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n for (const key of Object.keys(base)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n for (const key of Object.keys(comp)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n if (instanceSlots) {\n for (const key of Object.keys(instanceSlots)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n }\n\n const elementStyles: Record<string, Record<string, any>> = {};\n const elementProps: Record<string, Record<string, any>> = {};\n const elementConfigs: Record<string, IElementConfig> = {};\n for (const slotKey of allSlotKeys) {\n const style = {\n ...(formBase[slotKey]?.style || {}),\n ...(base[slotKey]?.style || {}),\n ...(comp[slotKey]?.style || {}),\n ...(instanceSlots?.[slotKey]?.style || {}),\n };\n elementStyles[slotKey] = style;\n\n const slotProps = mergeSlotProps([\n formBase[slotKey]?.props,\n base[slotKey]?.props,\n comp[slotKey]?.props,\n instanceSlots?.[slotKey]?.props,\n ]);\n elementProps[slotKey] = slotProps;\n\n const pseudoMerged = {\n ...(formBase[slotKey]?.pseudo || {}),\n ...(base[slotKey]?.pseudo || {}),\n ...(comp[slotKey]?.pseudo || {}),\n ...(instanceSlots?.[slotKey]?.pseudo || {}),\n };\n elementConfigs[slotKey] = {\n style,\n props: slotProps,\n important:\n instanceSlots?.[slotKey]?.important ??\n comp[slotKey]?.important ??\n base[slotKey]?.important ??\n formBase[slotKey]?.important,\n pseudo: Object.keys(pseudoMerged).length > 0 ? pseudoMerged : undefined,\n };\n }\n\n // themeStyle = root element style (backwards compat)\n const themeStyle = elementStyles.root || {};\n\n return {\n mergedProps: merged as T,\n themeStyle,\n elementStyles,\n elementProps,\n elementConfigs,\n };\n }, [formElementConfig, baseConfig, config, props]);\n}\n"],"names":["useKitsTheme","useMemo"],"mappings":"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"}
@@ -23,9 +23,14 @@ const ELEMENT_SLOT_KEYS = /* @__PURE__ */ new Set([
23
23
  "itemHover",
24
24
  "itemDisabled",
25
25
  "itemInvalid",
26
- // MultiSelect specific (IMultiSelectSlots — chips + per-item checkbox)
26
+ // Chip-bearing selects (IChipInputSlots — MultiSelect display="chip"
27
+ // AND AutoComplete/Tags with isMultiple). `tokenContainer` is the
28
+ // bordered box that holds the chips and the caret — see the docblock
29
+ // on IChipInputSlots for why it is neither `root` nor `container`.
30
+ "tokenContainer",
27
31
  "token",
28
32
  "tokenIcon",
33
+ // MultiSelect specific (IMultiSelectSlots — per-item checkbox)
29
34
  "checkboxBox",
30
35
  "checkboxBoxChecked",
31
36
  "checkboxIcon",
@@ -143,6 +148,25 @@ const ELEMENT_SLOT_KEYS = /* @__PURE__ */ new Set([
143
148
  "avatarButton",
144
149
  "breadcrumb"
145
150
  ]);
151
+ function mergeSlotProps(layers) {
152
+ const out = {};
153
+ const classes = [];
154
+ for (const layer of layers) {
155
+ if (!layer) continue;
156
+ for (const [key, value] of Object.entries(layer)) {
157
+ if (value === void 0) continue;
158
+ if (key === "className") {
159
+ if (value) classes.push(String(value));
160
+ } else {
161
+ out[key] = value;
162
+ }
163
+ }
164
+ }
165
+ if (classes.length) {
166
+ out.className = Array.from(new Set(classes.join(" ").split(/\s+/).filter(Boolean))).join(" ");
167
+ }
168
+ return out;
169
+ }
146
170
  function useComponentDefaults(componentName, props, baseGroup) {
147
171
  const { theme } = useKitsTheme();
148
172
  const formElementConfig = theme.components.FormElement;
@@ -151,23 +175,31 @@ function useComponentDefaults(componentName, props, baseGroup) {
151
175
  return useMemo(() => {
152
176
  const instanceSlots = props.slots;
153
177
  if (!config && !baseConfig && !instanceSlots && !formElementConfig) {
154
- return { mergedProps: props, themeStyle: {}, elementStyles: {}, elementConfigs: {} };
178
+ return { mergedProps: props, themeStyle: {}, elementStyles: {}, elementProps: {}, elementConfigs: {} };
155
179
  }
156
180
  const formBase = formElementConfig || {};
157
181
  const base = baseConfig || {};
158
182
  const comp = config || {};
159
- const merged = {
160
- ...formBase.root?.props || {},
161
- ...base.root?.props || {},
162
- ...comp.root?.props || {},
163
- ...instanceSlots?.root?.props || {}
164
- };
183
+ const merged = mergeSlotProps([
184
+ formBase.root?.props,
185
+ base.root?.props,
186
+ comp.root?.props,
187
+ instanceSlots?.root?.props
188
+ ]);
189
+ const userClassName = typeof props.className === "string" ? props.className : void 0;
165
190
  for (const key of Object.keys(props)) {
166
191
  if (key === "slots") continue;
192
+ if (key === "className") continue;
167
193
  if (props[key] !== void 0) {
168
194
  merged[key] = props[key];
169
195
  }
170
196
  }
197
+ if (userClassName || merged.className) {
198
+ merged.className = mergeSlotProps([
199
+ { className: merged.className },
200
+ { className: userClassName }
201
+ ]).className;
202
+ }
171
203
  const allSlotKeys = /* @__PURE__ */ new Set();
172
204
  for (const key of Object.keys(formBase)) {
173
205
  if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);
@@ -184,6 +216,7 @@ function useComponentDefaults(componentName, props, baseGroup) {
184
216
  }
185
217
  }
186
218
  const elementStyles = {};
219
+ const elementProps = {};
187
220
  const elementConfigs = {};
188
221
  for (const slotKey of allSlotKeys) {
189
222
  const style = {
@@ -193,6 +226,13 @@ function useComponentDefaults(componentName, props, baseGroup) {
193
226
  ...instanceSlots?.[slotKey]?.style || {}
194
227
  };
195
228
  elementStyles[slotKey] = style;
229
+ const slotProps = mergeSlotProps([
230
+ formBase[slotKey]?.props,
231
+ base[slotKey]?.props,
232
+ comp[slotKey]?.props,
233
+ instanceSlots?.[slotKey]?.props
234
+ ]);
235
+ elementProps[slotKey] = slotProps;
196
236
  const pseudoMerged = {
197
237
  ...formBase[slotKey]?.pseudo || {},
198
238
  ...base[slotKey]?.pseudo || {},
@@ -201,6 +241,7 @@ function useComponentDefaults(componentName, props, baseGroup) {
201
241
  };
202
242
  elementConfigs[slotKey] = {
203
243
  style,
244
+ props: slotProps,
204
245
  important: instanceSlots?.[slotKey]?.important ?? comp[slotKey]?.important ?? base[slotKey]?.important ?? formBase[slotKey]?.important,
205
246
  pseudo: Object.keys(pseudoMerged).length > 0 ? pseudoMerged : void 0
206
247
  };
@@ -210,6 +251,7 @@ function useComponentDefaults(componentName, props, baseGroup) {
210
251
  mergedProps: merged,
211
252
  themeStyle,
212
253
  elementStyles,
254
+ elementProps,
213
255
  elementConfigs
214
256
  };
215
257
  }, [formElementConfig, baseConfig, config, props]);
@@ -1 +1 @@
1
- {"version":3,"file":"useComponentDefaults.js","sources":["../../../src/hooks/useComponentDefaults.ts"],"sourcesContent":["import {useMemo} from 'react';\nimport {useKitsTheme} from '../contexts/Theme';\n\n/**\n * Known element slot keys. When a config key matches one of these\n * AND the value has `props` or `style`, it is treated as an element slot.\n *\n * To add a new slot: add the key here AND to the relevant slot interface\n * in packages/types/src/Theme/types.ts (and to the `AllSlotKeys` union).\n *\n * The order below mirrors the typed slot hierarchy in\n * `packages/types/src/Theme/types.ts`.\n */\nconst ELEMENT_SLOT_KEYS = new Set([\n // ── Form-element slots ──────────────────────────────────\n // Base (all form elements — IFormElementBaseSlots)\n 'label', 'helperText', 'error',\n // Text input specific (ITextInputSlots — also shared by ISelectSlots)\n 'root', 'container', 'inputGroup', 'leftAddon', 'rightAddon',\n // Select specific (ISelectSlots — option-list popover)\n // Radio / Checkbox also use `item` / `itemSelected` / `itemDisabled` /\n // `itemHover` for the per-list-item wrapper, plus `itemInvalid`.\n 'panel', 'item', 'itemSelected', 'itemFocused', 'itemHover', 'itemDisabled', 'itemInvalid',\n // MultiSelect specific (IMultiSelectSlots — chips + per-item checkbox)\n 'token', 'tokenIcon',\n 'checkboxBox', 'checkboxBoxChecked', 'checkboxIcon',\n // Datepicker specific (IDatepickerSlots — calendar popup; `panel` shared with Select)\n 'calendarHeader', 'calendarNavButton', 'weekDay',\n 'dayCell', 'daySelected', 'dayToday', 'dayDisabled',\n // Switch specific (ISwitchSlots) — RENAMED from slider/sliderChecked/thumbChecked\n 'track', 'trackOn', 'thumb', 'thumbOn',\n // Checkbox specific (ICheckboxSlots)\n 'box', 'boxChecked', 'checkIcon',\n // Radio specific (IRadioSlots)\n 'circle', 'circleInner',\n // Radio + Checkbox: wrapper Flex around all list items\n 'itemsContainer',\n\n // ── Non-form component slots (untouched by the form-element refactor) ──\n // Card / Button / generic\n 'icon', 'header', 'title', 'subTitle', 'content', 'footer',\n // Button variants — `text` applies only to buttons with a label,\n // `iconOnly` applies only to icon-only buttons (so styling one never\n // affects the other).\n 'text', 'iconOnly',\n // Table\n 'th', 'headerRow', 'headerCell', 'body', 'bodyRow', 'bodyCell',\n 'wrapper', 'table', 'tbody',\n 'filterRow', 'filterCell', 'filterClearButton',\n 'columnFilter', 'columnFilterInput',\n 'tfoot', 'footerRow', 'footerCell', 'footer', 'paginator', 'emptyMessage',\n 'loadingOverlay', 'loadingIcon',\n 'rowGroupHeader', 'rowGroupHeaderName', 'rowExpansion', 'rowGroupFooter',\n 'rowGroupToggler', 'rowGroupTogglerIcon',\n 'resizeHelper',\n 'reorderIndicatorUp', 'reorderIndicatorUpIcon',\n 'reorderIndicatorDown', 'reorderIndicatorDownIcon',\n 'tableHeader', 'searchInput',\n 'paginatorPageButton', 'paginatorPageLink', 'paginatorActivePageButton',\n 'paginatorPageReport', 'paginatorRowsPerPage', 'paginatorRowsPerPageDropdown',\n 'paginatorPages',\n 'sortedColumn', 'stripedRow', 'selectedRow', 'selectedRowAccent',\n 'filterBar', 'filterInput', 'filterLabel',\n 'toolbarRight', 'toolbarButton', 'clearFilterButton', 'columnPicker',\n // Toolbar sizing + placeholder, and the chrome the table renders itself.\n // NOTE: a slot missing from this allowlist is silently dropped — theming\n // it has no effect at all — so every new slot must be listed here as\n // well as in its component's ITableElementSlots.\n 'toolbarControl', 'filterPlaceholder',\n 'topBar', 'bulkBar', 'bulkBarText',\n // Accordion\n 'headerActive', 'headerHover',\n // Sidebar/Drawer\n 'headerTitle', 'closeButton', 'mask',\n // Group (repeatable field array)\n 'row', 'addButton', 'removeButton',\n // Header (app-shell top bar)\n 'toggleModeButton', 'avatarButton', 'breadcrumb',\n]);\n\nexport interface IElementConfig {\n style: Record<string, any>;\n important?: boolean | string[];\n pseudo?: Record<string, Record<string, any>>;\n}\n\nexport interface UseComponentDefaultsResult<T> {\n /** Props with theme defaults merged in (user props always win) */\n mergedProps: T;\n /**\n * CSS style from root slot — backwards compat for components\n * that read themeStyle instead of elementStyles.root\n */\n themeStyle: Record<string, any>;\n /**\n * Per-element style maps. Each key is a slot name, value is the\n * merged IStyleClasses (not yet resolved to CSSProperties).\n * Use `useResolvedElementStyles(elementStyles)` to resolve.\n */\n elementStyles: Record<string, Record<string, any>>;\n /**\n * Full slot configs including `important` and `pseudo` fields.\n * Use this instead of `elementStyles` when you need those fields.\n */\n elementConfigs: Record<string, IElementConfig>;\n}\n\n/**\n * Merges theme-level component defaults with user-supplied props.\n *\n * Resolution chain (lowest → highest priority):\n * FormElement[slot] < baseGroup[slot] < component[slot] < instanceSlots[slot] < user props\n *\n * `FormElement` is the global base group for every form element\n * (label / helperText / error live there by default). It is applied\n * to every component regardless of whether a `baseGroup` is provided\n * — for non-form components like Button or Card, FormElement slots\n * are no-ops in practice because those components don't read\n * `elementStyles.label` / `helperText` / `error`.\n *\n * Element slots (`root`, `label`, `container`, etc.) are direct keys\n * on the component config. Each slot accepts `{ props?, style? }`.\n *\n * The `root` slot's `props` are merged into `mergedProps` alongside\n * user props (user always wins). The `root` slot's `style` is returned\n * as both `themeStyle` (backwards compat) and `elementStyles.root`.\n *\n * Supports base-group inheritance: e.g. `useComponentDefaults('InputText', rawProps, 'Input')`\n * merges FormElement first, then Input base, then InputText overrides,\n * then per-instance slots, then user props.\n *\n * @example\n * const { mergedProps, themeStyle, elementStyles } = useComponentDefaults('InputText', rawProps, 'Input');\n * // mergedProps → FormElement.root.props < Input.root.props < InputText.root.props < instanceSlots < user props\n * // elementStyles.label → FormElement.label.style < Input.label.style < InputText.label.style < instance label\n * // elementStyles.root → root element style (FormElement → Input → InputText → instance)\n * // elementStyles.container → container element style\n */\nexport default function useComponentDefaults<T extends Record<string, any>>(\n componentName: string,\n props: T,\n baseGroup?: string,\n): UseComponentDefaultsResult<T> {\n const {theme} = useKitsTheme();\n // Global base for every form element. Always looked up — if not\n // configured it is `undefined` and the merge contributes nothing.\n const formElementConfig = theme.components.FormElement;\n const baseConfig = baseGroup ? theme.components[baseGroup] : undefined;\n const config = theme.components[componentName];\n\n return useMemo(() => {\n // Extract per-instance slot overrides from props (IFormElement.slots passed through)\n const instanceSlots = (props as any).slots as Record<string, { props?: any; style?: any; important?: boolean | string[]; pseudo?: Record<string, Record<string, any>> }> | undefined;\n\n if (!config && !baseConfig && !instanceSlots && !formElementConfig) {\n return {mergedProps: props, themeStyle: {}, elementStyles: {}, elementConfigs: {}};\n }\n\n const formBase = (formElementConfig || {}) as Record<string, any>;\n const base = (baseConfig || {}) as Record<string, any>;\n const comp = (config || {}) as Record<string, any>;\n\n // --- Props merge: FormElement.root.props < base.root.props < config.root.props < instanceSlots.root.props < user props ---\n const merged = {\n ...(formBase.root?.props || {}),\n ...(base.root?.props || {}),\n ...(comp.root?.props || {}),\n ...(instanceSlots?.root?.props || {}),\n } as Record<string, any>;\n\n for (const key of Object.keys(props)) {\n // Skip 'slots' — it is consumed here, not forwarded\n if (key === 'slots') continue;\n if (props[key] !== undefined) {\n merged[key] = props[key];\n }\n }\n\n // --- Element styles merge: FormElement[slot] < base[slot] < config[slot] < instanceSlots[slot] ---\n const allSlotKeys = new Set<string>();\n for (const key of Object.keys(formBase)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n for (const key of Object.keys(base)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n for (const key of Object.keys(comp)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n if (instanceSlots) {\n for (const key of Object.keys(instanceSlots)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n }\n\n const elementStyles: Record<string, Record<string, any>> = {};\n const elementConfigs: Record<string, IElementConfig> = {};\n for (const slotKey of allSlotKeys) {\n const style = {\n ...(formBase[slotKey]?.style || {}),\n ...(base[slotKey]?.style || {}),\n ...(comp[slotKey]?.style || {}),\n ...(instanceSlots?.[slotKey]?.style || {}),\n };\n elementStyles[slotKey] = style;\n\n const pseudoMerged = {\n ...(formBase[slotKey]?.pseudo || {}),\n ...(base[slotKey]?.pseudo || {}),\n ...(comp[slotKey]?.pseudo || {}),\n ...(instanceSlots?.[slotKey]?.pseudo || {}),\n };\n elementConfigs[slotKey] = {\n style,\n important:\n instanceSlots?.[slotKey]?.important ??\n comp[slotKey]?.important ??\n base[slotKey]?.important ??\n formBase[slotKey]?.important,\n pseudo: Object.keys(pseudoMerged).length > 0 ? pseudoMerged : undefined,\n };\n }\n\n // themeStyle = root element style (backwards compat)\n const themeStyle = elementStyles.root || {};\n\n return {\n mergedProps: merged as T,\n themeStyle,\n elementStyles,\n elementConfigs,\n };\n }, [formElementConfig, baseConfig, config, props]);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useComponentDefaults.js","sources":["../../../src/hooks/useComponentDefaults.ts"],"sourcesContent":["import {useMemo} from 'react';\nimport {useKitsTheme} from '../contexts/Theme';\n\n/**\n * Known element slot keys. When a config key matches one of these\n * AND the value has `props` or `style`, it is treated as an element slot.\n *\n * To add a new slot: add the key here AND to the relevant slot interface\n * in packages/types/src/Theme/types.ts (and to the `AllSlotKeys` union).\n *\n * The order below mirrors the typed slot hierarchy in\n * `packages/types/src/Theme/types.ts`.\n */\nconst ELEMENT_SLOT_KEYS = new Set([\n // ── Form-element slots ──────────────────────────────────\n // Base (all form elements — IFormElementBaseSlots)\n 'label', 'helperText', 'error',\n // Text input specific (ITextInputSlots — also shared by ISelectSlots)\n 'root', 'container', 'inputGroup', 'leftAddon', 'rightAddon',\n // Select specific (ISelectSlots — option-list popover)\n // Radio / Checkbox also use `item` / `itemSelected` / `itemDisabled` /\n // `itemHover` for the per-list-item wrapper, plus `itemInvalid`.\n 'panel', 'item', 'itemSelected', 'itemFocused', 'itemHover', 'itemDisabled', 'itemInvalid',\n // Chip-bearing selects (IChipInputSlots — MultiSelect display=\"chip\"\n // AND AutoComplete/Tags with isMultiple). `tokenContainer` is the\n // bordered box that holds the chips and the caret — see the docblock\n // on IChipInputSlots for why it is neither `root` nor `container`.\n 'tokenContainer', 'token', 'tokenIcon',\n // MultiSelect specific (IMultiSelectSlots — per-item checkbox)\n 'checkboxBox', 'checkboxBoxChecked', 'checkboxIcon',\n // Datepicker specific (IDatepickerSlots — calendar popup; `panel` shared with Select)\n 'calendarHeader', 'calendarNavButton', 'weekDay',\n 'dayCell', 'daySelected', 'dayToday', 'dayDisabled',\n // Switch specific (ISwitchSlots) — RENAMED from slider/sliderChecked/thumbChecked\n 'track', 'trackOn', 'thumb', 'thumbOn',\n // Checkbox specific (ICheckboxSlots)\n 'box', 'boxChecked', 'checkIcon',\n // Radio specific (IRadioSlots)\n 'circle', 'circleInner',\n // Radio + Checkbox: wrapper Flex around all list items\n 'itemsContainer',\n\n // ── Non-form component slots (untouched by the form-element refactor) ──\n // Card / Button / generic\n 'icon', 'header', 'title', 'subTitle', 'content', 'footer',\n // Button variants — `text` applies only to buttons with a label,\n // `iconOnly` applies only to icon-only buttons (so styling one never\n // affects the other).\n 'text', 'iconOnly',\n // Table\n 'th', 'headerRow', 'headerCell', 'body', 'bodyRow', 'bodyCell',\n 'wrapper', 'table', 'tbody',\n 'filterRow', 'filterCell', 'filterClearButton',\n 'columnFilter', 'columnFilterInput',\n 'tfoot', 'footerRow', 'footerCell', 'footer', 'paginator', 'emptyMessage',\n 'loadingOverlay', 'loadingIcon',\n 'rowGroupHeader', 'rowGroupHeaderName', 'rowExpansion', 'rowGroupFooter',\n 'rowGroupToggler', 'rowGroupTogglerIcon',\n 'resizeHelper',\n 'reorderIndicatorUp', 'reorderIndicatorUpIcon',\n 'reorderIndicatorDown', 'reorderIndicatorDownIcon',\n 'tableHeader', 'searchInput',\n 'paginatorPageButton', 'paginatorPageLink', 'paginatorActivePageButton',\n 'paginatorPageReport', 'paginatorRowsPerPage', 'paginatorRowsPerPageDropdown',\n 'paginatorPages',\n 'sortedColumn', 'stripedRow', 'selectedRow', 'selectedRowAccent',\n 'filterBar', 'filterInput', 'filterLabel',\n 'toolbarRight', 'toolbarButton', 'clearFilterButton', 'columnPicker',\n // Toolbar sizing + placeholder, and the chrome the table renders itself.\n // NOTE: a slot missing from this allowlist is silently dropped — theming\n // it has no effect at all — so every new slot must be listed here as\n // well as in its component's ITableElementSlots.\n 'toolbarControl', 'filterPlaceholder',\n 'topBar', 'bulkBar', 'bulkBarText',\n // Accordion\n 'headerActive', 'headerHover',\n // Sidebar/Drawer\n 'headerTitle', 'closeButton', 'mask',\n // Group (repeatable field array)\n 'row', 'addButton', 'removeButton',\n // Header (app-shell top bar)\n 'toggleModeButton', 'avatarButton', 'breadcrumb',\n]);\n\nexport interface IElementConfig {\n style: Record<string, any>;\n /**\n * Extra attributes for this slot's element — `className`, `data-*`,\n * `aria-*`, anything the platform element accepts. Merged across the\n * whole chain (FormElement < baseGroup < component < instance slots),\n * with `className` CONCATENATED rather than replaced.\n */\n props: Record<string, any>;\n important?: boolean | string[];\n pseudo?: Record<string, Record<string, any>>;\n}\n\nexport interface UseComponentDefaultsResult<T> {\n /** Props with theme defaults merged in (user props always win) */\n mergedProps: T;\n /**\n * CSS style from root slot — backwards compat for components\n * that read themeStyle instead of elementStyles.root\n */\n themeStyle: Record<string, any>;\n /**\n * Per-element style maps. Each key is a slot name, value is the\n * merged IStyleClasses (not yet resolved to CSSProperties).\n * Use `useResolvedElementStyles(elementStyles)` to resolve.\n */\n elementStyles: Record<string, Record<string, any>>;\n /**\n * Per-element extra attributes. Each key is a slot name, value is the\n * merged `props` for that slot (`className`, `data-*`, `aria-*`, …).\n *\n * ⛔ EVERY SLOT, NOT JUST `root` — THAT WAS THE BUG. `IElementSlotConfig`\n * has advertised `props` on every slot since the slot system landed, but\n * only `root.props` was ever read (it is folded into `mergedProps`).\n * Anything a consumer put on another slot — the class a portal needs on a\n * tags field's outer box to make it match a text input — was parsed,\n * merged, and then thrown away with no warning and no type error.\n * Components apply `elementProps[slot]` to the matching element.\n */\n elementProps: Record<string, Record<string, any>>;\n /**\n * Full slot configs including `props`, `important` and `pseudo` fields.\n * Use this instead of `elementStyles` when you need those fields.\n */\n elementConfigs: Record<string, IElementConfig>;\n}\n\n/**\n * Merges slot `props` layers. Everything is last-wins EXCEPT `className`,\n * which is concatenated — a theme-level class and a consumer's class are\n * additive by nature, and dropping one of them is exactly the fault this\n * whole plumbing exists to fix.\n */\nfunction mergeSlotProps(layers: Array<Record<string, any> | undefined>): Record<string, any> {\n const out: Record<string, any> = {};\n const classes: string[] = [];\n for (const layer of layers) {\n if (!layer) continue;\n for (const [key, value] of Object.entries(layer)) {\n if (value === undefined) continue;\n if (key === 'className') {\n if (value) classes.push(String(value));\n } else {\n out[key] = value;\n }\n }\n }\n if (classes.length) {\n // De-duplicated, so a class repeated down the chain lands once.\n out.className = Array.from(new Set(classes.join(' ').split(/\\s+/).filter(Boolean))).join(' ');\n }\n return out;\n}\n\n/**\n * Merges theme-level component defaults with user-supplied props.\n *\n * Resolution chain (lowest → highest priority):\n * FormElement[slot] < baseGroup[slot] < component[slot] < instanceSlots[slot] < user props\n *\n * `FormElement` is the global base group for every form element\n * (label / helperText / error live there by default). It is applied\n * to every component regardless of whether a `baseGroup` is provided\n * — for non-form components like Button or Card, FormElement slots\n * are no-ops in practice because those components don't read\n * `elementStyles.label` / `helperText` / `error`.\n *\n * Element slots (`root`, `label`, `container`, etc.) are direct keys\n * on the component config. Each slot accepts `{ props?, style? }`.\n *\n * The `root` slot's `props` are merged into `mergedProps` alongside\n * user props (user always wins, except `className`, which concatenates).\n * The `root` slot's `style` is returned as both `themeStyle` (backwards\n * compat) and `elementStyles.root`.\n *\n * EVERY OTHER slot's `props` come back on `elementProps[slot]` — the\n * component is responsible for spreading them onto the element that slot\n * names. Before that existed, `props` on a non-root slot was silently\n * discarded, which is how a consumer's class on a tags field's outer box\n * disappeared without a single error.\n *\n * Supports base-group inheritance: e.g. `useComponentDefaults('InputText', rawProps, 'Input')`\n * merges FormElement first, then Input base, then InputText overrides,\n * then per-instance slots, then user props.\n *\n * @example\n * const { mergedProps, themeStyle, elementStyles } = useComponentDefaults('InputText', rawProps, 'Input');\n * // mergedProps → FormElement.root.props < Input.root.props < InputText.root.props < instanceSlots < user props\n * // elementStyles.label → FormElement.label.style < Input.label.style < InputText.label.style < instance label\n * // elementStyles.root → root element style (FormElement → Input → InputText → instance)\n * // elementStyles.container → container element style\n */\nexport default function useComponentDefaults<T extends Record<string, any>>(\n componentName: string,\n props: T,\n baseGroup?: string,\n): UseComponentDefaultsResult<T> {\n const {theme} = useKitsTheme();\n // Global base for every form element. Always looked up — if not\n // configured it is `undefined` and the merge contributes nothing.\n const formElementConfig = theme.components.FormElement;\n const baseConfig = baseGroup ? theme.components[baseGroup] : undefined;\n const config = theme.components[componentName];\n\n return useMemo(() => {\n // Extract per-instance slot overrides from props (IFormElement.slots passed through)\n const instanceSlots = (props as any).slots as Record<string, { props?: any; style?: any; important?: boolean | string[]; pseudo?: Record<string, Record<string, any>> }> | undefined;\n\n if (!config && !baseConfig && !instanceSlots && !formElementConfig) {\n return {mergedProps: props, themeStyle: {}, elementStyles: {}, elementProps: {}, elementConfigs: {}};\n }\n\n const formBase = (formElementConfig || {}) as Record<string, any>;\n const base = (baseConfig || {}) as Record<string, any>;\n const comp = (config || {}) as Record<string, any>;\n\n // --- Props merge: FormElement.root.props < base.root.props < config.root.props < instanceSlots.root.props < user props ---\n const merged = mergeSlotProps([\n formBase.root?.props,\n base.root?.props,\n comp.root?.props,\n instanceSlots?.root?.props,\n ]);\n\n const userClassName = typeof (props as any).className === 'string' ? (props as any).className : undefined;\n for (const key of Object.keys(props)) {\n // Skip 'slots' — it is consumed here, not forwarded\n if (key === 'slots') continue;\n // className is additive, not a replacement: a theme-level class on\n // `root.props` and the consumer's own class both have to survive.\n if (key === 'className') continue;\n if (props[key] !== undefined) {\n merged[key] = props[key];\n }\n }\n if (userClassName || merged.className) {\n merged.className = mergeSlotProps([\n {className: merged.className},\n {className: userClassName},\n ]).className;\n }\n\n // --- Element styles merge: FormElement[slot] < base[slot] < config[slot] < instanceSlots[slot] ---\n const allSlotKeys = new Set<string>();\n for (const key of Object.keys(formBase)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n for (const key of Object.keys(base)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n for (const key of Object.keys(comp)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n if (instanceSlots) {\n for (const key of Object.keys(instanceSlots)) {\n if (ELEMENT_SLOT_KEYS.has(key)) allSlotKeys.add(key);\n }\n }\n\n const elementStyles: Record<string, Record<string, any>> = {};\n const elementProps: Record<string, Record<string, any>> = {};\n const elementConfigs: Record<string, IElementConfig> = {};\n for (const slotKey of allSlotKeys) {\n const style = {\n ...(formBase[slotKey]?.style || {}),\n ...(base[slotKey]?.style || {}),\n ...(comp[slotKey]?.style || {}),\n ...(instanceSlots?.[slotKey]?.style || {}),\n };\n elementStyles[slotKey] = style;\n\n const slotProps = mergeSlotProps([\n formBase[slotKey]?.props,\n base[slotKey]?.props,\n comp[slotKey]?.props,\n instanceSlots?.[slotKey]?.props,\n ]);\n elementProps[slotKey] = slotProps;\n\n const pseudoMerged = {\n ...(formBase[slotKey]?.pseudo || {}),\n ...(base[slotKey]?.pseudo || {}),\n ...(comp[slotKey]?.pseudo || {}),\n ...(instanceSlots?.[slotKey]?.pseudo || {}),\n };\n elementConfigs[slotKey] = {\n style,\n props: slotProps,\n important:\n instanceSlots?.[slotKey]?.important ??\n comp[slotKey]?.important ??\n base[slotKey]?.important ??\n formBase[slotKey]?.important,\n pseudo: Object.keys(pseudoMerged).length > 0 ? pseudoMerged : undefined,\n };\n }\n\n // themeStyle = root element style (backwards compat)\n const themeStyle = elementStyles.root || {};\n\n return {\n mergedProps: merged as T,\n themeStyle,\n elementStyles,\n elementProps,\n elementConfigs,\n };\n }, [formElementConfig, baseConfig, config, props]);\n}\n"],"names":[],"mappings":"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"}
package/index.cjs CHANGED
@@ -99,6 +99,7 @@ var index_native$P = require('./contexts/Main/index.cjs');
99
99
  var index_native$15 = require('./contexts/Theme/index.cjs');
100
100
  var DialogContext = require('./contexts/DialogContext.cjs');
101
101
  var PermissionsContext = require('./contexts/PermissionsContext.cjs');
102
+ var BreadcrumbContext = require('./contexts/BreadcrumbContext.cjs');
102
103
  var useSelectionController = require('./hooks/useSelectionController.cjs');
103
104
  var useDisclosure = require('./hooks/useDisclosure.cjs');
104
105
  var index_native$1g = require('./hooks/useScrollState/index.cjs');
@@ -119,6 +120,7 @@ var index_native$1f = require('./hooks/useReducedMotion/index.cjs');
119
120
  var useEnter = require('./hooks/useEnter.cjs');
120
121
  var useCountUp = require('./hooks/useCountUp.cjs');
121
122
  var useMeasuredWidth_native = require('./hooks/useMeasuredWidth.cjs');
123
+ var useBreadcrumbTrail = require('./hooks/useBreadcrumbTrail.cjs');
122
124
  var index$o = require('./motion/index.cjs');
123
125
  var index_native$q = require('./assets/Icons/index.cjs');
124
126
  var index$p = require('./locale/index.cjs');
@@ -289,6 +291,8 @@ exports.useDialog = DialogContext.useDialog;
289
291
  exports.usePopup = DialogContext.usePopup;
290
292
  exports.PermissionsProvider = PermissionsContext.default;
291
293
  exports.usePermissions = PermissionsContext.usePermissions;
294
+ exports.BreadcrumbProvider = BreadcrumbContext.default;
295
+ exports.useBreadcrumb = BreadcrumbContext.useBreadcrumb;
292
296
  exports.useSelectionController = useSelectionController.default;
293
297
  exports.useDisclosure = useDisclosure.default;
294
298
  exports.useScrollState = index_native$1g.default;
@@ -313,6 +317,7 @@ exports.useReducedMotion = index_native$1f.useReducedMotion;
313
317
  exports.useEnter = useEnter.default;
314
318
  exports.useCountUp = useCountUp.default;
315
319
  exports.useMeasuredWidth = useMeasuredWidth_native.default;
320
+ exports.useBreadcrumbTrail = useBreadcrumbTrail.default;
316
321
  exports.kitsMotion = index$o.kitsMotion;
317
322
  exports.IconMap = index_native$q.IconMap;
318
323
  exports.localeFiles = index$p.default;
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}