@dynamic-framework/ui-react 2.8.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/dist/css/dynamic-ui.css +5 -22
  2. package/dist/css/dynamic-ui.min.css +2 -2
  3. package/dist/esm/components/DAlert/DAlert.js +16 -0
  4. package/dist/esm/components/DAlert/DAlert.js.map +1 -0
  5. package/dist/esm/components/DAlert/index.js +6 -0
  6. package/dist/esm/components/DAlert/index.js.map +1 -0
  7. package/dist/esm/components/DAvatar/DAvatar.js +23 -0
  8. package/dist/esm/components/DAvatar/DAvatar.js.map +1 -0
  9. package/dist/esm/components/DAvatar/index.js +6 -0
  10. package/dist/esm/components/DAvatar/index.js.map +1 -0
  11. package/dist/esm/components/DBadge/DBadge.js +31 -0
  12. package/dist/esm/components/DBadge/DBadge.js.map +1 -0
  13. package/dist/esm/components/DBadge/index.js +6 -0
  14. package/dist/esm/components/DBadge/index.js.map +1 -0
  15. package/dist/esm/components/DBox/DBox.js +9 -0
  16. package/dist/esm/components/DBox/DBox.js.map +1 -0
  17. package/dist/esm/components/DBox/index.js +6 -0
  18. package/dist/esm/components/DBox/index.js.map +1 -0
  19. package/dist/esm/components/DBoxFile/DBoxFile.js +26 -0
  20. package/dist/esm/components/DBoxFile/DBoxFile.js.map +1 -0
  21. package/dist/esm/components/DBoxFile/index.js +6 -0
  22. package/dist/esm/components/DBoxFile/index.js.map +1 -0
  23. package/dist/esm/components/DBoxFile/useDBoxFile.js +236 -0
  24. package/dist/esm/components/DBoxFile/useDBoxFile.js.map +1 -0
  25. package/dist/esm/components/DBoxFile/utils.js +127 -0
  26. package/dist/esm/components/DBoxFile/utils.js.map +1 -0
  27. package/dist/esm/components/DButton/DButton.js +84 -0
  28. package/dist/esm/components/DButton/DButton.js.map +1 -0
  29. package/dist/esm/components/DButton/index.js +6 -0
  30. package/dist/esm/components/DButton/index.js.map +1 -0
  31. package/dist/esm/components/DButtonIcon/DButtonIcon.js +52 -0
  32. package/dist/esm/components/DButtonIcon/DButtonIcon.js.map +1 -0
  33. package/dist/esm/components/DButtonIcon/index.js +6 -0
  34. package/dist/esm/components/DButtonIcon/index.js.map +1 -0
  35. package/dist/esm/components/DButtonIcon/warnMissingAccessibleName.js +40 -0
  36. package/dist/esm/components/DButtonIcon/warnMissingAccessibleName.js.map +1 -0
  37. package/dist/esm/components/DCard/DCard.js +17 -0
  38. package/dist/esm/components/DCard/DCard.js.map +1 -0
  39. package/dist/esm/components/DCard/components/DCardBody.js +9 -0
  40. package/dist/esm/components/DCard/components/DCardBody.js.map +1 -0
  41. package/dist/esm/components/DCard/components/DCardFooter.js +9 -0
  42. package/dist/esm/components/DCard/components/DCardFooter.js.map +1 -0
  43. package/dist/esm/components/DCard/components/DCardHeader.js +9 -0
  44. package/dist/esm/components/DCard/components/DCardHeader.js.map +1 -0
  45. package/dist/esm/components/DCard/index.js +9 -0
  46. package/dist/esm/components/DCard/index.js.map +1 -0
  47. package/dist/esm/components/DCarousel/DCarousel.js +39 -0
  48. package/dist/esm/components/DCarousel/DCarousel.js.map +1 -0
  49. package/dist/esm/components/DCarousel/components/DCarouselSlide.js +12 -0
  50. package/dist/esm/components/DCarousel/components/DCarouselSlide.js.map +1 -0
  51. package/dist/esm/components/DCarousel/index.js +7 -0
  52. package/dist/esm/components/DCarousel/index.js.map +1 -0
  53. package/dist/esm/components/DChip/DChip.js +18 -0
  54. package/dist/esm/components/DChip/DChip.js.map +1 -0
  55. package/dist/esm/components/DChip/index.js +6 -0
  56. package/dist/esm/components/DChip/index.js.map +1 -0
  57. package/dist/esm/components/DCollapse/DCollapse.js +30 -0
  58. package/dist/esm/components/DCollapse/DCollapse.js.map +1 -0
  59. package/dist/esm/components/DCollapse/index.js +6 -0
  60. package/dist/esm/components/DCollapse/index.js.map +1 -0
  61. package/dist/esm/components/DConfirmModal/DConfirmModalContainer.js +59 -0
  62. package/dist/esm/components/DConfirmModal/DConfirmModalContainer.js.map +1 -0
  63. package/dist/esm/components/DConfirmModal/DConfirmModalUI.js +39 -0
  64. package/dist/esm/components/DConfirmModal/DConfirmModalUI.js.map +1 -0
  65. package/dist/esm/components/DConfirmModal/confirmModalStore.js +38 -0
  66. package/dist/esm/components/DConfirmModal/confirmModalStore.js.map +1 -0
  67. package/dist/esm/components/DCreditCard/DCreditCard.js +15 -0
  68. package/dist/esm/components/DCreditCard/DCreditCard.js.map +1 -0
  69. package/dist/esm/components/DCreditCard/index.js +6 -0
  70. package/dist/esm/components/DCreditCard/index.js.map +1 -0
  71. package/dist/esm/components/DCurrencyText/DCurrencyText.js +10 -0
  72. package/dist/esm/components/DCurrencyText/DCurrencyText.js.map +1 -0
  73. package/dist/esm/components/DCurrencyText/index.js +6 -0
  74. package/dist/esm/components/DCurrencyText/index.js.map +1 -0
  75. package/dist/esm/components/DDataStateWrapper/DDataStateWrapper.js +35 -0
  76. package/dist/esm/components/DDataStateWrapper/DDataStateWrapper.js.map +1 -0
  77. package/dist/esm/components/DDataStateWrapper/components/EmptyState.js +10 -0
  78. package/dist/esm/components/DDataStateWrapper/components/EmptyState.js.map +1 -0
  79. package/dist/esm/components/DDataStateWrapper/components/ErrorState.js +10 -0
  80. package/dist/esm/components/DDataStateWrapper/components/ErrorState.js.map +1 -0
  81. package/dist/esm/components/DDataStateWrapper/components/LoadingState.js +8 -0
  82. package/dist/esm/components/DDataStateWrapper/components/LoadingState.js.map +1 -0
  83. package/dist/esm/components/DDataStateWrapper/index.js +9 -0
  84. package/dist/esm/components/DDataStateWrapper/index.js.map +1 -0
  85. package/dist/esm/components/DDatePicker/DDatePicker.js +54 -0
  86. package/dist/esm/components/DDatePicker/DDatePicker.js.map +1 -0
  87. package/dist/esm/components/DDatePicker/components/DDatePickerHeaderSelector.js +50 -0
  88. package/dist/esm/components/DDatePicker/components/DDatePickerHeaderSelector.js.map +1 -0
  89. package/dist/esm/components/DDatePicker/components/DDatePickerInput.js +16 -0
  90. package/dist/esm/components/DDatePicker/components/DDatePickerInput.js.map +1 -0
  91. package/dist/esm/components/DDatePicker/components/DDatePickerTime.js +11 -0
  92. package/dist/esm/components/DDatePicker/components/DDatePickerTime.js.map +1 -0
  93. package/dist/esm/components/DDatePicker/index.js +6 -0
  94. package/dist/esm/components/DDatePicker/index.js.map +1 -0
  95. package/dist/esm/components/DDropdown/DDropdown.js +315 -0
  96. package/dist/esm/components/DDropdown/DDropdown.js.map +1 -0
  97. package/dist/esm/components/DDropdown/index.js +6 -0
  98. package/dist/esm/components/DDropdown/index.js.map +1 -0
  99. package/dist/esm/components/DErrorBoundary/DErrorBoundary.js +22 -0
  100. package/dist/esm/components/DErrorBoundary/DErrorBoundary.js.map +1 -0
  101. package/dist/esm/components/DErrorBoundary/components/DefaultErrorBoundary.js +10 -0
  102. package/dist/esm/components/DErrorBoundary/components/DefaultErrorBoundary.js.map +1 -0
  103. package/dist/esm/components/DErrorBoundary/index.js +7 -0
  104. package/dist/esm/components/DErrorBoundary/index.js.map +1 -0
  105. package/dist/esm/components/DIcon/DIcon.js +21 -0
  106. package/dist/esm/components/DIcon/DIcon.js.map +1 -0
  107. package/dist/esm/components/DIcon/index.js +6 -0
  108. package/dist/esm/components/DIcon/index.js.map +1 -0
  109. package/dist/esm/components/DIconBase/DIconBase.js +146 -0
  110. package/dist/esm/components/DIconBase/DIconBase.js.map +1 -0
  111. package/dist/esm/components/DIconBase/index.js +6 -0
  112. package/dist/esm/components/DIconBase/index.js.map +1 -0
  113. package/dist/esm/components/DIconBase/resolveIconFromRegistry.js +20 -0
  114. package/dist/esm/components/DIconBase/resolveIconFromRegistry.js.map +1 -0
  115. package/dist/esm/components/DIconBase/warnUnknownIcon.js +59 -0
  116. package/dist/esm/components/DIconBase/warnUnknownIcon.js.map +1 -0
  117. package/dist/esm/components/DInput/DInput.js +83 -0
  118. package/dist/esm/components/DInput/DInput.js.map +1 -0
  119. package/dist/esm/components/DInput/index.js +6 -0
  120. package/dist/esm/components/DInput/index.js.map +1 -0
  121. package/dist/esm/components/DInputCheck/DInputCheck.js +57 -0
  122. package/dist/esm/components/DInputCheck/DInputCheck.js.map +1 -0
  123. package/dist/esm/components/DInputCheck/index.js +6 -0
  124. package/dist/esm/components/DInputCheck/index.js.map +1 -0
  125. package/dist/esm/components/DInputCounter/DInputCounter.js +49 -0
  126. package/dist/esm/components/DInputCounter/DInputCounter.js.map +1 -0
  127. package/dist/esm/components/DInputCounter/index.js +6 -0
  128. package/dist/esm/components/DInputCounter/index.js.map +1 -0
  129. package/dist/esm/components/DInputCurrency/DInputCurrency.js +20 -0
  130. package/dist/esm/components/DInputCurrency/DInputCurrency.js.map +1 -0
  131. package/dist/esm/components/DInputCurrency/index.js +6 -0
  132. package/dist/esm/components/DInputCurrency/index.js.map +1 -0
  133. package/dist/esm/components/DInputMask/DInputMask.js +13 -0
  134. package/dist/esm/components/DInputMask/DInputMask.js.map +1 -0
  135. package/dist/esm/components/DInputMask/index.js +6 -0
  136. package/dist/esm/components/DInputMask/index.js.map +1 -0
  137. package/dist/esm/components/DInputPassword/DInputPassword.js +24 -0
  138. package/dist/esm/components/DInputPassword/DInputPassword.js.map +1 -0
  139. package/dist/esm/components/DInputPassword/index.js +6 -0
  140. package/dist/esm/components/DInputPassword/index.js.map +1 -0
  141. package/dist/esm/components/DInputPhone/DInputPhone.js +96 -0
  142. package/dist/esm/components/DInputPhone/DInputPhone.js.map +1 -0
  143. package/dist/esm/components/DInputPhone/index.js +6 -0
  144. package/dist/esm/components/DInputPhone/index.js.map +1 -0
  145. package/dist/esm/components/DInputPin/DInputPin.js +86 -0
  146. package/dist/esm/components/DInputPin/DInputPin.js.map +1 -0
  147. package/dist/esm/components/DInputPin/index.js +6 -0
  148. package/dist/esm/components/DInputPin/index.js.map +1 -0
  149. package/dist/esm/components/DInputRange/DInputRange.js +46 -0
  150. package/dist/esm/components/DInputRange/DInputRange.js.map +1 -0
  151. package/dist/esm/components/DInputRange/index.js +6 -0
  152. package/dist/esm/components/DInputRange/index.js.map +1 -0
  153. package/dist/esm/components/DInputSearch/DInputSearch.js +57 -0
  154. package/dist/esm/components/DInputSearch/DInputSearch.js.map +1 -0
  155. package/dist/esm/components/DInputSearch/index.js +6 -0
  156. package/dist/esm/components/DInputSearch/index.js.map +1 -0
  157. package/dist/esm/components/DInputSelect/DInputSelect.js +90 -0
  158. package/dist/esm/components/DInputSelect/DInputSelect.js.map +1 -0
  159. package/dist/esm/components/DInputSelect/index.js +6 -0
  160. package/dist/esm/components/DInputSelect/index.js.map +1 -0
  161. package/dist/esm/components/DInputSwitch/DInputSwitch.js +32 -0
  162. package/dist/esm/components/DInputSwitch/DInputSwitch.js.map +1 -0
  163. package/dist/esm/components/DInputSwitch/index.js +6 -0
  164. package/dist/esm/components/DInputSwitch/index.js.map +1 -0
  165. package/dist/esm/components/DLayout/DLayout.js +22 -0
  166. package/dist/esm/components/DLayout/DLayout.js.map +1 -0
  167. package/dist/esm/components/DLayout/components/DLayoutPane.js +16 -0
  168. package/dist/esm/components/DLayout/components/DLayoutPane.js.map +1 -0
  169. package/dist/esm/components/DLayout/index.js +7 -0
  170. package/dist/esm/components/DLayout/index.js.map +1 -0
  171. package/dist/esm/components/DListGroup/DListGroup.js +31 -0
  172. package/dist/esm/components/DListGroup/DListGroup.js.map +1 -0
  173. package/dist/esm/components/DListGroup/components/DListGroupItem.js +41 -0
  174. package/dist/esm/components/DListGroup/components/DListGroupItem.js.map +1 -0
  175. package/dist/esm/components/DListGroup/index.js +7 -0
  176. package/dist/esm/components/DListGroup/index.js.map +1 -0
  177. package/dist/esm/components/DModal/DModal.js +37 -0
  178. package/dist/esm/components/DModal/DModal.js.map +1 -0
  179. package/dist/esm/components/DModal/components/DModalBody.js +9 -0
  180. package/dist/esm/components/DModal/components/DModalBody.js.map +1 -0
  181. package/dist/esm/components/DModal/components/DModalFooter.js +14 -0
  182. package/dist/esm/components/DModal/components/DModalFooter.js.map +1 -0
  183. package/dist/esm/components/DModal/components/DModalHeader.js +15 -0
  184. package/dist/esm/components/DModal/components/DModalHeader.js.map +1 -0
  185. package/dist/esm/components/DModal/index.js +9 -0
  186. package/dist/esm/components/DModal/index.js.map +1 -0
  187. package/dist/esm/components/DOffcanvas/DOffcanvas.js +82 -0
  188. package/dist/esm/components/DOffcanvas/DOffcanvas.js.map +1 -0
  189. package/dist/esm/components/DOffcanvas/components/DOffcanvasBody.js +9 -0
  190. package/dist/esm/components/DOffcanvas/components/DOffcanvasBody.js.map +1 -0
  191. package/dist/esm/components/DOffcanvas/components/DOffcanvasFooter.js +14 -0
  192. package/dist/esm/components/DOffcanvas/components/DOffcanvasFooter.js.map +1 -0
  193. package/dist/esm/components/DOffcanvas/components/DOffcanvasHeader.js +15 -0
  194. package/dist/esm/components/DOffcanvas/components/DOffcanvasHeader.js.map +1 -0
  195. package/dist/esm/components/DOffcanvas/index.js +9 -0
  196. package/dist/esm/components/DOffcanvas/index.js.map +1 -0
  197. package/dist/esm/components/DOtp/DOtp.js +26 -0
  198. package/dist/esm/components/DOtp/DOtp.js.map +1 -0
  199. package/dist/esm/components/DOtp/components/OtpCountdown.js +12 -0
  200. package/dist/esm/components/DOtp/components/OtpCountdown.js.map +1 -0
  201. package/dist/esm/components/DOtp/index.js +6 -0
  202. package/dist/esm/components/DOtp/index.js.map +1 -0
  203. package/dist/esm/components/DPaginator/DPaginator.js +12 -0
  204. package/dist/esm/components/DPaginator/DPaginator.js.map +1 -0
  205. package/dist/esm/components/DPaginator/index.js +6 -0
  206. package/dist/esm/components/DPaginator/index.js.map +1 -0
  207. package/dist/esm/components/DPasswordStrengthMeter/DPasswordStrengthMeter.js +27 -0
  208. package/dist/esm/components/DPasswordStrengthMeter/DPasswordStrengthMeter.js.map +1 -0
  209. package/dist/esm/components/DPasswordStrengthMeter/PasswordCheckItem.js +10 -0
  210. package/dist/esm/components/DPasswordStrengthMeter/PasswordCheckItem.js.map +1 -0
  211. package/dist/esm/components/DPasswordStrengthMeter/PasswordCheckList.js +41 -0
  212. package/dist/esm/components/DPasswordStrengthMeter/PasswordCheckList.js.map +1 -0
  213. package/dist/esm/components/DPasswordStrengthMeter/PasswordStrength.js +23 -0
  214. package/dist/esm/components/DPasswordStrengthMeter/PasswordStrength.js.map +1 -0
  215. package/dist/esm/components/DPasswordStrengthMeter/index.js +6 -0
  216. package/dist/esm/components/DPasswordStrengthMeter/index.js.map +1 -0
  217. package/dist/esm/components/DPopover/DPopover.js +49 -0
  218. package/dist/esm/components/DPopover/DPopover.js.map +1 -0
  219. package/dist/esm/components/DPopover/index.js +6 -0
  220. package/dist/esm/components/DPopover/index.js.map +1 -0
  221. package/dist/esm/components/DProgress/DProgress.js +16 -0
  222. package/dist/esm/components/DProgress/DProgress.js.map +1 -0
  223. package/dist/esm/components/DProgress/index.js +6 -0
  224. package/dist/esm/components/DProgress/index.js.map +1 -0
  225. package/dist/esm/components/DSelect/DSelect.js +60 -0
  226. package/dist/esm/components/DSelect/DSelect.js.map +1 -0
  227. package/dist/esm/components/DSelect/components/DSelectClearIndicator.js +12 -0
  228. package/dist/esm/components/DSelect/components/DSelectClearIndicator.js.map +1 -0
  229. package/dist/esm/components/DSelect/components/DSelectDropdownIndicator.js +12 -0
  230. package/dist/esm/components/DSelect/components/DSelectDropdownIndicator.js.map +1 -0
  231. package/dist/esm/components/DSelect/components/DSelectLoadingIndicator.js +12 -0
  232. package/dist/esm/components/DSelect/components/DSelectLoadingIndicator.js.map +1 -0
  233. package/dist/esm/components/DSelect/components/DSelectMultiValueRemove.js +12 -0
  234. package/dist/esm/components/DSelect/components/DSelectMultiValueRemove.js.map +1 -0
  235. package/dist/esm/components/DSelect/components/DSelectOptionCheck.js +14 -0
  236. package/dist/esm/components/DSelect/components/DSelectOptionCheck.js.map +1 -0
  237. package/dist/esm/components/DSelect/components/DSelectOptionEmoji.js +14 -0
  238. package/dist/esm/components/DSelect/components/DSelectOptionEmoji.js.map +1 -0
  239. package/dist/esm/components/DSelect/components/DSelectOptionIcon.js +15 -0
  240. package/dist/esm/components/DSelect/components/DSelectOptionIcon.js.map +1 -0
  241. package/dist/esm/components/DSelect/components/DSelectPlaceholder.js +14 -0
  242. package/dist/esm/components/DSelect/components/DSelectPlaceholder.js.map +1 -0
  243. package/dist/esm/components/DSelect/components/DSelectSingleValueEmoji.js +15 -0
  244. package/dist/esm/components/DSelect/components/DSelectSingleValueEmoji.js.map +1 -0
  245. package/dist/esm/components/DSelect/components/DSelectSingleValueEmojiText.js +15 -0
  246. package/dist/esm/components/DSelect/components/DSelectSingleValueEmojiText.js.map +1 -0
  247. package/dist/esm/components/DSelect/components/DSelectSingleValueIconText.js +16 -0
  248. package/dist/esm/components/DSelect/components/DSelectSingleValueIconText.js.map +1 -0
  249. package/dist/esm/components/DSelect/index.js +6 -0
  250. package/dist/esm/components/DSelect/index.js.map +1 -0
  251. package/dist/esm/components/DStepper/DStepper.js +13 -0
  252. package/dist/esm/components/DStepper/DStepper.js.map +1 -0
  253. package/dist/esm/components/DStepper/index.js +6 -0
  254. package/dist/esm/components/DStepper/index.js.map +1 -0
  255. package/dist/esm/components/DStepperDesktop/DStepperDesktop.js +27 -0
  256. package/dist/esm/components/DStepperDesktop/DStepperDesktop.js.map +1 -0
  257. package/dist/esm/components/DStepperDesktop/index.js +6 -0
  258. package/dist/esm/components/DStepperDesktop/index.js.map +1 -0
  259. package/dist/esm/components/DStepperMobile/DStepperMobile.js +37 -0
  260. package/dist/esm/components/DStepperMobile/DStepperMobile.js.map +1 -0
  261. package/dist/esm/components/DStepperMobile/index.js +6 -0
  262. package/dist/esm/components/DStepperMobile/index.js.map +1 -0
  263. package/dist/esm/components/DTabs/DTabs.js +117 -0
  264. package/dist/esm/components/DTabs/DTabs.js.map +1 -0
  265. package/dist/esm/components/DTabs/TabContext.js +13 -0
  266. package/dist/esm/components/DTabs/TabContext.js.map +1 -0
  267. package/dist/esm/components/DTabs/components/DTabContent.js +14 -0
  268. package/dist/esm/components/DTabs/components/DTabContent.js.map +1 -0
  269. package/dist/esm/components/DTabs/index.js +8 -0
  270. package/dist/esm/components/DTabs/index.js.map +1 -0
  271. package/dist/esm/components/DTimeline/DTimeline.js +12 -0
  272. package/dist/esm/components/DTimeline/DTimeline.js.map +1 -0
  273. package/dist/esm/components/DTimeline/index.js +6 -0
  274. package/dist/esm/components/DTimeline/index.js.map +1 -0
  275. package/dist/esm/components/DToast/DToast.js +15 -0
  276. package/dist/esm/components/DToast/DToast.js.map +1 -0
  277. package/dist/esm/components/DToast/components/DToastBody.js +9 -0
  278. package/dist/esm/components/DToast/components/DToastBody.js.map +1 -0
  279. package/dist/esm/components/DToast/components/DToastHeader.js +9 -0
  280. package/dist/esm/components/DToast/components/DToastHeader.js.map +1 -0
  281. package/dist/esm/components/DToast/index.js +8 -0
  282. package/dist/esm/components/DToast/index.js.map +1 -0
  283. package/dist/esm/components/DToastContainer/DToastContainer.js +9 -0
  284. package/dist/esm/components/DToastContainer/DToastContainer.js.map +1 -0
  285. package/dist/esm/components/DToastContainer/index.js +7 -0
  286. package/dist/esm/components/DToastContainer/index.js.map +1 -0
  287. package/dist/esm/components/DToastContainer/useDToast.js +58 -0
  288. package/dist/esm/components/DToastContainer/useDToast.js.map +1 -0
  289. package/dist/esm/components/DTooltip/DTooltip.js +51 -0
  290. package/dist/esm/components/DTooltip/DTooltip.js.map +1 -0
  291. package/dist/esm/components/DTooltip/index.js +6 -0
  292. package/dist/esm/components/DTooltip/index.js.map +1 -0
  293. package/dist/esm/components/DVoucher/DVoucher.js +55 -0
  294. package/dist/esm/components/DVoucher/DVoucher.js.map +1 -0
  295. package/dist/esm/components/DVoucher/hooks/useScreenshot.js +30 -0
  296. package/dist/esm/components/DVoucher/hooks/useScreenshot.js.map +1 -0
  297. package/dist/esm/components/DVoucher/hooks/useScreenshotDownload.js +30 -0
  298. package/dist/esm/components/DVoucher/hooks/useScreenshotDownload.js.map +1 -0
  299. package/dist/esm/components/DVoucher/hooks/useScreenshotWebShare.js +27 -0
  300. package/dist/esm/components/DVoucher/hooks/useScreenshotWebShare.js.map +1 -0
  301. package/dist/esm/components/DVoucher/index.js +9 -0
  302. package/dist/esm/components/DVoucher/index.js.map +1 -0
  303. package/dist/esm/components/config.js +14 -0
  304. package/dist/esm/components/config.js.map +1 -0
  305. package/dist/esm/contexts/DContext.js +124 -0
  306. package/dist/esm/contexts/DContext.js.map +1 -0
  307. package/dist/esm/contexts/DPortalContext.js +128 -0
  308. package/dist/esm/contexts/DPortalContext.js.map +1 -0
  309. package/dist/esm/hooks/useConfirmModal.js +63 -0
  310. package/dist/esm/hooks/useConfirmModal.js.map +1 -0
  311. package/dist/esm/hooks/useCountdown.js +45 -0
  312. package/dist/esm/hooks/useCountdown.js.map +1 -0
  313. package/dist/esm/hooks/useDisableBodyScrollEffect.js +52 -0
  314. package/dist/esm/hooks/useDisableBodyScrollEffect.js.map +1 -0
  315. package/dist/esm/hooks/useDisableInputWheel.js +17 -0
  316. package/dist/esm/hooks/useDisableInputWheel.js.map +1 -0
  317. package/dist/esm/hooks/useFormatCurrency.js +16 -0
  318. package/dist/esm/hooks/useFormatCurrency.js.map +1 -0
  319. package/dist/esm/hooks/useInputCurrency.js +76 -0
  320. package/dist/esm/hooks/useInputCurrency.js.map +1 -0
  321. package/dist/esm/hooks/useItemSelection.js +35 -0
  322. package/dist/esm/hooks/useItemSelection.js.map +1 -0
  323. package/dist/esm/hooks/useMediaBreakpointUp.js +30 -0
  324. package/dist/esm/hooks/useMediaBreakpointUp.js.map +1 -0
  325. package/dist/esm/hooks/useMediaQuery.js +11 -0
  326. package/dist/esm/hooks/useMediaQuery.js.map +1 -0
  327. package/dist/esm/hooks/useOtp.js +107 -0
  328. package/dist/esm/hooks/useOtp.js.map +1 -0
  329. package/dist/esm/hooks/usePortal.js +26 -0
  330. package/dist/esm/hooks/usePortal.js.map +1 -0
  331. package/dist/esm/hooks/useProvidedRefOrCreate.js +24 -0
  332. package/dist/esm/hooks/useProvidedRefOrCreate.js.map +1 -0
  333. package/dist/esm/hooks/useResponsiveProp.js +50 -0
  334. package/dist/esm/hooks/useResponsiveProp.js.map +1 -0
  335. package/dist/esm/hooks/useStackState.js +40 -0
  336. package/dist/esm/hooks/useStackState.js.map +1 -0
  337. package/dist/esm/icons/coreIcons.js +55 -0
  338. package/dist/esm/icons/coreIcons.js.map +1 -0
  339. package/dist/esm/index.js +98 -0
  340. package/dist/esm/index.js.map +1 -0
  341. package/dist/esm/utils/attr-accept.js +38 -0
  342. package/dist/esm/utils/attr-accept.js.map +1 -0
  343. package/dist/esm/utils/buildUrl.js +57 -0
  344. package/dist/esm/utils/buildUrl.js.map +1 -0
  345. package/dist/esm/utils/changeQueryString.js +19 -0
  346. package/dist/esm/utils/changeQueryString.js.map +1 -0
  347. package/dist/esm/utils/configureI18n.js +20 -0
  348. package/dist/esm/utils/configureI18n.js.map +1 -0
  349. package/dist/esm/utils/formatCurrency.js +8 -0
  350. package/dist/esm/utils/formatCurrency.js.map +1 -0
  351. package/dist/esm/utils/getCssVariable.js +7 -0
  352. package/dist/esm/utils/getCssVariable.js.map +1 -0
  353. package/dist/esm/utils/getKeyboardFocusableElements.js +11 -0
  354. package/dist/esm/utils/getKeyboardFocusableElements.js.map +1 -0
  355. package/dist/esm/utils/getQueryString.js +8 -0
  356. package/dist/esm/utils/getQueryString.js.map +1 -0
  357. package/dist/esm/utils/mediaQuery.js +13 -0
  358. package/dist/esm/utils/mediaQuery.js.map +1 -0
  359. package/dist/esm/utils/sanitizeHref.js +67 -0
  360. package/dist/esm/utils/sanitizeHref.js.map +1 -0
  361. package/dist/esm/utils/validatePhoneNumber.js +14 -0
  362. package/dist/esm/utils/validatePhoneNumber.js.map +1 -0
  363. package/dist/icons-core.json +33 -0
  364. package/dist/index.esm.js +463 -55
  365. package/dist/index.esm.js.map +1 -1
  366. package/dist/index.js +465 -54
  367. package/dist/index.js.map +1 -1
  368. package/dist/types/components/DButtonIcon/warnMissingAccessibleName.d.ts +18 -0
  369. package/dist/types/components/DIcon/DIcon.d.ts +8 -0
  370. package/dist/types/components/DIconBase/DIconBase.d.ts +43 -1
  371. package/dist/types/components/DIconBase/resolveIconFromRegistry.d.ts +14 -0
  372. package/dist/types/components/DIconBase/warnUnknownIcon.d.ts +13 -0
  373. package/dist/types/components/DInputCheck/DInputCheck.d.ts +1 -0
  374. package/dist/types/components/DInputRange/DInputRange.d.ts +1 -1
  375. package/dist/types/components/DInputSwitch/DInputSwitch.d.ts +2 -1
  376. package/dist/types/components/DModal/components/DModalHeader.d.ts +5 -1
  377. package/dist/types/components/DOffcanvas/components/DOffcanvasHeader.d.ts +5 -1
  378. package/dist/types/components/DTooltip/DTooltip.d.ts +38 -3
  379. package/dist/types/components/config.d.ts +10 -0
  380. package/dist/types/icons/coreIcons.d.ts +24 -0
  381. package/dist/types/icons/index.d.ts +2 -0
  382. package/dist/types/index.d.ts +1 -0
  383. package/dist/types/utils/buildUrl.d.ts +32 -0
  384. package/dist/types/utils/index.d.ts +2 -0
  385. package/dist/types/utils/sanitizeHref.d.ts +37 -0
  386. package/package.json +12 -9
  387. package/src/style/_shame.scss +1 -5
  388. package/src/style/abstracts/variables/_+import.scss +1 -0
  389. package/src/style/abstracts/variables/_box.scss +7 -0
  390. package/src/style/abstracts/variables/_forms.scss +1 -3
  391. package/src/style/abstracts/variables/_shadow.scss +12 -1
  392. package/src/style/base/_+import.scss +0 -1
  393. package/src/style/base/_form-check.scss +4 -2
  394. package/src/style/components/_d-box.scss +5 -5
  395. package/dist/types/components/DVoucher/hooks/useScreenshotDownload.spec.d.ts +0 -1
  396. package/dist/types/components/DVoucher/hooks/useScreenshotWebShare.spec.d.ts +0 -1
  397. package/dist/types/hooks/tests/useCountdown.spec.d.ts +0 -1
  398. package/dist/types/hooks/tests/useDisableBodyScrollEffect.spec.d.ts +0 -1
  399. package/dist/types/hooks/tests/useDisableInputWheel.spec.d.ts +0 -1
  400. package/dist/types/hooks/tests/useFormatCurrency.spec.d.ts +0 -1
  401. package/dist/types/hooks/tests/useInputCurrency.spec.d.ts +0 -1
  402. package/dist/types/hooks/tests/useItemSelection.spec.d.ts +0 -1
  403. package/dist/types/hooks/tests/useMediaBreakpointUp.spec.d.ts +0 -1
  404. package/dist/types/hooks/tests/useMediaQuery.spec.d.ts +0 -1
  405. package/dist/types/hooks/tests/usePortal.spec.d.ts +0 -1
  406. package/dist/types/hooks/tests/useProvidedRefOrCreate.spec.d.ts +0 -1
  407. package/dist/types/hooks/tests/useStackState.spec.d.ts +0 -1
  408. package/dist/types/utils/tests/attr-accept.spec.d.ts +0 -1
  409. package/dist/types/utils/tests/changeQueryString.spec.d.ts +0 -1
  410. package/dist/types/utils/tests/configureI18n.spec.d.ts +0 -1
  411. package/dist/types/utils/tests/formatCurrency.spec.d.ts +0 -1
  412. package/dist/types/utils/tests/getCssVariable.spec.d.ts +0 -1
  413. package/dist/types/utils/tests/getKeyboardFocusableElements.spec.d.ts +0 -1
  414. package/dist/types/utils/tests/getQueryString.spec.d.ts +0 -1
  415. package/dist/types/utils/tests/mediaQuery.spec.d.ts +0 -1
  416. package/dist/types/utils/tests/validatePhoneNumber.spec.d.ts +0 -1
  417. package/src/style/base/_form-text.scss +0 -12
package/dist/index.js CHANGED
@@ -45,6 +45,16 @@ function _interopNamespaceDefault(e) {
45
45
  var LucideIcons__namespace = /*#__PURE__*/_interopNamespaceDefault(LucideIcons);
46
46
 
47
47
  const PREFIX_BS = 'bs-';
48
+ /**
49
+ * Default icon-font family configured by `DContextProvider`.
50
+ *
51
+ * `DIconBase` compares the family it receives against these values to tell an
52
+ * unconfigured consumer apart from one that deliberately opted into an icon
53
+ * font (Material Symbols, Bootstrap Icons). Only the former gets the
54
+ * development warning for an unresolved icon name.
55
+ */
56
+ const DEFAULT_ICON_FAMILY_CLASS = 'bi';
57
+ const DEFAULT_ICON_FAMILY_PREFIX = 'bi-';
48
58
 
49
59
  /* eslint-disable no-lonely-if */
50
60
  function useDisableBodyScrollEffect(disable) {
@@ -326,8 +336,8 @@ const DEFAULT_STATE = {
326
336
  decimal: '.',
327
337
  },
328
338
  icon: {
329
- familyClass: 'bi',
330
- familyPrefix: 'bi-',
339
+ familyClass: DEFAULT_ICON_FAMILY_CLASS,
340
+ familyPrefix: DEFAULT_ICON_FAMILY_PREFIX,
331
341
  materialStyle: false,
332
342
  },
333
343
  iconRegistry: undefined,
@@ -432,6 +442,79 @@ function useDContext() {
432
442
  return React.useContext(DContext);
433
443
  }
434
444
 
445
+ /**
446
+ * Resolves a string icon name against the registry supplied through
447
+ * `DContextProvider`'s `iconRegistry` prop.
448
+ *
449
+ * This is the single implementation shared by `DIcon` and `DIconBase`, so both
450
+ * public entry points — and every Dynamic UI component that renders an icon
451
+ * through them — resolve names identically.
452
+ *
453
+ * A non-string `icon` is returned untouched: a component passed directly needs
454
+ * no lookup. A name missing from the registry is also returned untouched, so
455
+ * the caller can fall through to lucide-react and then to the icon-font family.
456
+ */
457
+ function resolveIconFromRegistry(icon, iconRegistry) {
458
+ if (typeof icon !== 'string')
459
+ return icon;
460
+ return (iconRegistry === null || iconRegistry === void 0 ? void 0 : iconRegistry[icon]) || icon;
461
+ }
462
+
463
+ /**
464
+ * Names already reported, so a name repeated across renders or across many
465
+ * instances only warns once per page load.
466
+ */
467
+ const warnedIconNames = new Set();
468
+ /**
469
+ * True when the icon-font family is the one `DContextProvider` defaults to.
470
+ *
471
+ * The warning is limited to that case so a consumer who configured a different
472
+ * font — Material Symbols, for instance — is not told about names that font
473
+ * resolves perfectly well.
474
+ *
475
+ * It cannot tell "never configured a font" apart from "configured exactly the
476
+ * defaults", and those defaults are also the standard Bootstrap Icons setup, so
477
+ * a consumer who deliberately uses Bootstrap Icons is warned too. The message
478
+ * says so; silencing that case would need a new context flag, which is beyond
479
+ * what this helper should decide.
480
+ */
481
+ function isDefaultIconFamily(familyClass, familyPrefix) {
482
+ return familyClass === DEFAULT_ICON_FAMILY_CLASS
483
+ && familyPrefix === DEFAULT_ICON_FAMILY_PREFIX;
484
+ }
485
+ /**
486
+ * Warns, once per name and only outside production builds, that an icon name
487
+ * resolved to neither the registry nor lucide-react and is falling back to the
488
+ * default icon font, which this package no longer ships.
489
+ *
490
+ * Whether that fallback renders depends on the host app: if it loads the font
491
+ * itself the `<i>` shows the glyph, and if it does not, nothing appears. The
492
+ * message states both possibilities instead of assuming the second.
493
+ *
494
+ * The `process.env.NODE_ENV` guard is what bundlers constant-fold, so the whole
495
+ * call — and this module — drops out of a consumer's production bundle.
496
+ */
497
+ function warnUnknownIcon(name, familyClass, familyPrefix) {
498
+ if (!isDefaultIconFamily(familyClass, familyPrefix))
499
+ return;
500
+ if (warnedIconNames.has(name))
501
+ return;
502
+ warnedIconNames.add(name);
503
+ const fallbackClass = `${DEFAULT_ICON_FAMILY_CLASS} ${DEFAULT_ICON_FAMILY_PREFIX}${name}`;
504
+ // eslint-disable-next-line no-console
505
+ console.warn(`[Dynamic UI] Icon "${name}" is not in the icon registry and is not a `
506
+ + 'lucide-react export, so it falls back to the default icon font: '
507
+ + `<i class="${fallbackClass}">. That renders only if your app loads that `
508
+ + 'font, which this package stopped shipping in v2.0.0. '
509
+ + 'If the icon is missing, pass a PascalCase lucide-react name such as '
510
+ + '"Home", or register the component with '
511
+ + '<DContextProvider iconRegistry={{ MyIcon }}>. '
512
+ + `If you use the "${DEFAULT_ICON_FAMILY_CLASS}" font on purpose, this is a `
513
+ + 'false positive: the warning fires whenever the configured family equals '
514
+ + 'the package default, which is also the standard Bootstrap Icons setup. '
515
+ + 'It never appears in production builds.');
516
+ }
517
+
435
518
  function subscribeToMediaQuery(query, callback) {
436
519
  const mediaQueryList = window.matchMedia(query);
437
520
  mediaQueryList.addEventListener('change', callback);
@@ -521,7 +604,31 @@ function useResponsiveProp(useListener = false) {
521
604
  function isIconComponent(value) {
522
605
  return typeof value !== 'string' && reactIs.isValidElementType(value);
523
606
  }
524
- function DIconBase({ icon, color, style, className, size, useListenerSize = false, hasCircle = false, materialStyle = false, familyClass, familyPrefix, strokeWidth = 2, dataAttributes, }) {
607
+ /**
608
+ * Renders an icon, resolving the `icon` prop in this order:
609
+ *
610
+ * 1. **Icon registry** — a string name found in `DContextProvider`'s
611
+ * `iconRegistry` renders the component registered under it. A component
612
+ * passed directly skips this step and renders as-is.
613
+ * 2. **lucide-react** — a PascalCase name exported by lucide-react renders that
614
+ * icon. When `materialStyle` is on, this step is skipped and the name is
615
+ * emitted as the text content of the icon-font element instead.
616
+ * 3. **Icon-font family** — anything left over renders as
617
+ * `<i class="{familyClass} {familyPrefix}{name}">`, the legacy path for
618
+ * Material Symbols and Bootstrap Icons. Outside production builds, a name
619
+ * that reaches this step while the family is still the package default logs
620
+ * a one-time warning.
621
+ *
622
+ * A name that resolves nowhere and has no family configured renders `?`.
623
+ *
624
+ * Every path is hidden from the accessibility tree by default (`aria-hidden`),
625
+ * since icons are overwhelmingly decorative. See `ariaHidden` / `ariaLabel` to
626
+ * override that for an icon that carries meaning on its own.
627
+ */
628
+ function DIconBase({ icon: iconProp, color, style, className, size, useListenerSize = false, hasCircle = false, materialStyle = false, familyClass, familyPrefix, strokeWidth = 2, ariaHidden, ariaLabel, dataAttributes, }) {
629
+ const { iconRegistry } = useDContext();
630
+ // The registry wins over every other source, including Material icons.
631
+ const icon = resolveIconFromRegistry(iconProp, iconRegistry);
525
632
  // If materialStyle is true, use Material Design icons (legacy)
526
633
  const isStringIcon = typeof icon === 'string';
527
634
  const useMaterialIcons = materialStyle && isStringIcon;
@@ -543,6 +650,61 @@ function DIconBase({ icon, color, style, className, size, useListenerSize = fals
543
650
  }, [responsivePropValue, size]);
544
651
  const generateStyleVariables = React.useMemo(() => (Object.assign(Object.assign(Object.assign({}, resolvedSize && { [`--${PREFIX_BS}icon-component-size`]: resolvedSize }), hasCircle && { [`--${PREFIX_BS}icon-component-padding`]: `calc(var(--${PREFIX_BS}icon-component-size, 24px) * 0.4)` }), style)), [resolvedSize, hasCircle, style]);
545
652
  const generateClasses = React.useMemo(() => (Object.assign(Object.assign(Object.assign({ 'd-icon': true }, className && { [className]: true }), { 'd-icon-has-circle': hasCircle }), color && { [`d-icon-color-${color}`]: true })), [className, hasCircle, color]);
653
+ /**
654
+ * Decorative by default. `ariaHidden` and `ariaLabel` are not symmetric:
655
+ * hiding is absolute, so `ariaHidden` wins over a name, but `ariaHidden={false}`
656
+ * and `ariaLabel` agree — both expose the icon — and the name is honoured.
657
+ */
658
+ const accessibilityProps = React.useMemo(() => {
659
+ // Hiding is absolute: it wins over a name.
660
+ if (ariaHidden === true)
661
+ return { 'aria-hidden': true };
662
+ // A name exposes the icon, which is also what `ariaHidden={false}` asks for.
663
+ if (ariaLabel)
664
+ return { role: 'img', 'aria-label': ariaLabel };
665
+ // Exposed with no name: an explicit opt-out of the default, warned about below.
666
+ if (ariaHidden === false)
667
+ return {};
668
+ return { 'aria-hidden': true };
669
+ }, [ariaHidden, ariaLabel]);
670
+ /**
671
+ * `dataAttributes` is typed to `data-*`, but casting through it was the only
672
+ * way to reach the DOM before `ariaHidden` existed, so it still wins over the
673
+ * computed values — and therefore decides the effective state below.
674
+ */
675
+ const domAttributes = React.useMemo(() => (Object.assign(Object.assign({}, accessibilityProps), dataAttributes)), [accessibilityProps, dataAttributes]);
676
+ /**
677
+ * lucide-react hides its own `<svg>` unless it receives an a11y prop, and a
678
+ * registry component may do the same, which would keep the graphic out of the
679
+ * tree even when this wrapper is not hidden. Only matters when the icon is
680
+ * exposed without a name: under `role="img"` the wrapper is a leaf, so a
681
+ * hidden child changes nothing.
682
+ *
683
+ * A registry component that hardcodes `aria-hidden` on its own `<svg>` instead
684
+ * of spreading props still wins — nothing here can reach inside it.
685
+ */
686
+ const isExposedWithoutName = React.useMemo(() => {
687
+ const attributes = domAttributes;
688
+ const hidden = attributes['aria-hidden'];
689
+ return hidden !== true && hidden !== 'true' && !attributes.role;
690
+ }, [domAttributes]);
691
+ /**
692
+ * Diagnostics read the effective state, so a `dataAttributes` override that
693
+ * hides the icon after all is not reported as exposing it. Memoised like the
694
+ * values above, so re-rendering with the same props does not repeat them.
695
+ */
696
+ React.useMemo(() => {
697
+ if (process.env.NODE_ENV === 'production')
698
+ return;
699
+ if (ariaHidden === true && ariaLabel) {
700
+ // eslint-disable-next-line no-console
701
+ console.warn(`DIcon: ariaLabel "${ariaLabel}" is ignored because ariaHidden is true. Drop ariaHidden to expose the name.`);
702
+ }
703
+ if (ariaHidden === false && isExposedWithoutName) {
704
+ // eslint-disable-next-line no-console
705
+ console.warn('DIcon: ariaHidden={false} without an ariaLabel exposes an unnamed graphic to assistive technology. Pass ariaLabel to name it.');
706
+ }
707
+ }, [ariaHidden, ariaLabel, isExposedWithoutName]);
546
708
  const iconSize = React.useMemo(() => {
547
709
  if (resolvedSize) {
548
710
  const numSize = parseInt(resolvedSize, 10);
@@ -552,43 +714,46 @@ function DIconBase({ icon, color, style, className, size, useListenerSize = fals
552
714
  }, [resolvedSize]);
553
715
  // Render Material Design icon (legacy support)
554
716
  if (useMaterialIcons) {
555
- return (jsxRuntime.jsx("i", Object.assign({ className: classNames(generateClasses, familyClass), style: generateStyleVariables }, dataAttributes, { children: isStringIcon ? icon : null })));
717
+ return (jsxRuntime.jsx("i", Object.assign({ className: classNames(generateClasses, familyClass), style: generateStyleVariables }, domAttributes, { children: isStringIcon ? icon : null })));
556
718
  }
557
719
  if (isIconComponent(icon)) {
558
- return (jsxRuntime.jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, dataAttributes, { children: React.createElement(icon, {
559
- width: resolvedSize || 24,
560
- height: resolvedSize || 24,
561
- strokeWidth,
562
- }) })));
720
+ return (jsxRuntime.jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, domAttributes, { children: React.createElement(icon, Object.assign({ width: resolvedSize || 24, height: resolvedSize || 24, strokeWidth }, isExposedWithoutName && { 'aria-hidden': false })) })));
563
721
  }
564
722
  // Render Lucide icon
565
723
  if (!LucideIcon) {
566
- if (isStringIcon && familyClass && familyPrefix) {
567
- return (jsxRuntime.jsx("i", Object.assign({ className: classNames(generateClasses, familyClass, `${familyPrefix}${icon}`), style: generateStyleVariables }, dataAttributes)));
724
+ if (typeof icon === 'string' && familyClass && familyPrefix) {
725
+ if (process.env.NODE_ENV !== 'production') {
726
+ warnUnknownIcon(icon, familyClass, familyPrefix);
727
+ }
728
+ return (jsxRuntime.jsx("i", Object.assign({ className: classNames(generateClasses, familyClass, `${familyPrefix}${icon}`), style: generateStyleVariables }, domAttributes)));
568
729
  }
569
730
  // eslint-disable-next-line no-console
570
731
  console.warn(`Icon "${String(icon)}" not found in Lucide. Make sure to use PascalCase names (e.g., "Home", "User", "Settings")`);
571
- return (jsxRuntime.jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, dataAttributes, { children: "?" })));
732
+ return (jsxRuntime.jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, domAttributes, { children: "?" })));
572
733
  }
573
- return (jsxRuntime.jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, dataAttributes, { children: jsxRuntime.jsx(LucideIcon, { size: iconSize || 24, strokeWidth: strokeWidth }) })));
734
+ return (jsxRuntime.jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, domAttributes, { children: jsxRuntime.jsx(LucideIcon, Object.assign({ size: iconSize || 24, strokeWidth: strokeWidth }, isExposedWithoutName && { 'aria-hidden': false })) })));
574
735
  }
575
736
 
737
+ /**
738
+ * Thin wrapper over `DIconBase` that fills the icon-font configuration
739
+ * (`familyClass`, `familyPrefix`, `materialStyle`) from `DContextProvider`
740
+ * whenever the caller does not pass it explicitly.
741
+ *
742
+ * Name resolution itself — registry, then lucide-react, then the icon-font
743
+ * family — lives in `DIconBase`, so both components behave identically.
744
+ */
576
745
  function DIcon(_a) {
577
746
  var { icon, familyClass: propFamilyClass, familyPrefix: propFamilyPrefix, materialStyle: propMaterialStyle } = _a, props = tslib.__rest(_a, ["icon", "familyClass", "familyPrefix", "materialStyle"]);
578
- const { icon: { familyClass, familyPrefix, materialStyle, }, iconRegistry, } = useDContext();
579
- const registryIcon = typeof icon === 'string'
580
- ? iconRegistry === null || iconRegistry === void 0 ? void 0 : iconRegistry[icon]
581
- : undefined;
582
- const resolvedIcon = registryIcon || icon;
583
- return (jsxRuntime.jsx(DIconBase, Object.assign({ icon: resolvedIcon, familyClass: propFamilyClass !== null && propFamilyClass !== void 0 ? propFamilyClass : familyClass, familyPrefix: propFamilyPrefix !== null && propFamilyPrefix !== void 0 ? propFamilyPrefix : familyPrefix, materialStyle: propMaterialStyle !== null && propMaterialStyle !== void 0 ? propMaterialStyle : materialStyle }, props)));
747
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
748
+ return (jsxRuntime.jsx(DIconBase, Object.assign({ icon: icon, familyClass: propFamilyClass !== null && propFamilyClass !== void 0 ? propFamilyClass : familyClass, familyPrefix: propFamilyPrefix !== null && propFamilyPrefix !== void 0 ? propFamilyPrefix : familyPrefix, materialStyle: propMaterialStyle !== null && propMaterialStyle !== void 0 ? propMaterialStyle : materialStyle }, props)));
584
749
  }
585
750
 
586
- function DAlert({ color = 'success', icon: iconProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle = false, iconClose: iconCloseProp, iconCloseFamilyClass, iconCloseFamilyPrefix, iconCloseMaterialStyle = false, showClose, onClose, children, id, className, style, dataAttributes, }) {
587
- const { iconMap: { alert, xLg, }, } = useDContext();
751
+ function DAlert({ color = 'success', icon: iconProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle, iconClose: iconCloseProp, iconCloseFamilyClass, iconCloseFamilyPrefix, iconCloseMaterialStyle, showClose, onClose, children, id, className, style, dataAttributes, }) {
752
+ const { icon: { materialStyle, familyClass, familyPrefix, }, iconMap: { alert, xLg, }, } = useDContext();
588
753
  const icon = React.useMemo(() => iconProp || alert[color], [alert, iconProp, color]);
589
754
  const iconClose = React.useMemo(() => (iconCloseProp || xLg), [iconCloseProp, xLg]);
590
755
  const generateClasses = React.useMemo(() => (Object.assign({ alert: true, [`alert-${color}`]: true, 'fade show': !!showClose }, className && { [className]: true })), [color, showClose, className]);
591
- return (jsxRuntime.jsxs("div", Object.assign({ className: classNames(generateClasses), style: style, role: "alert", id: id }, dataAttributes, { children: [icon && (jsxRuntime.jsx(DIcon, { className: "alert-icon", icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })), jsxRuntime.jsx("div", { className: "alert-text", children: children }), showClose && (jsxRuntime.jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: jsxRuntime.jsx(DIcon, { icon: iconClose, familyClass: iconCloseFamilyClass, familyPrefix: iconCloseFamilyPrefix, materialStyle: iconCloseMaterialStyle }) }))] })));
756
+ return (jsxRuntime.jsxs("div", Object.assign({ className: classNames(generateClasses), style: style, role: "alert", id: id }, dataAttributes, { children: [icon && (jsxRuntime.jsx(DIcon, { className: "alert-icon", icon: icon, familyClass: iconFamilyClass !== null && iconFamilyClass !== void 0 ? iconFamilyClass : familyClass, familyPrefix: iconFamilyPrefix !== null && iconFamilyPrefix !== void 0 ? iconFamilyPrefix : familyPrefix, materialStyle: iconMaterialStyle !== null && iconMaterialStyle !== void 0 ? iconMaterialStyle : materialStyle })), jsxRuntime.jsx("div", { className: "alert-text", children: children }), showClose && (jsxRuntime.jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: jsxRuntime.jsx(DIcon, { icon: iconClose, familyClass: iconCloseFamilyClass !== null && iconCloseFamilyClass !== void 0 ? iconCloseFamilyClass : familyClass, familyPrefix: iconCloseFamilyPrefix !== null && iconCloseFamilyPrefix !== void 0 ? iconCloseFamilyPrefix : familyPrefix, materialStyle: iconCloseMaterialStyle !== null && iconCloseMaterialStyle !== void 0 ? iconCloseMaterialStyle : materialStyle }) }))] })));
592
757
  }
593
758
 
594
759
  function DAvatar({ id, size, image, name: nameProp, useNameAsInitials = false, className, style, dataAttributes, }) {
@@ -610,6 +775,7 @@ function DAvatar({ id, size, image, name: nameProp, useNameAsInitials = false, c
610
775
 
611
776
  function DBadge(props) {
612
777
  const { text, soft = false, color = 'primary', id, rounded, className, size, style, iconStart, iconEnd, iconMaterialStyle, iconFamilyClass, iconFamilyPrefix, dataAttributes, } = props;
778
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
613
779
  // Responsive size resolution using useResponsiveProp
614
780
  const { responsivePropValue } = useResponsiveProp(true);
615
781
  const resolvedSize = React.useMemo(() => {
@@ -626,7 +792,7 @@ function DBadge(props) {
626
792
  'rounded-pill': !!rounded,
627
793
  [`badge-${resolvedSize}`]: !!resolvedSize,
628
794
  }), [rounded, soft, color, resolvedSize]);
629
- return (jsxRuntime.jsxs("span", Object.assign({ className: classNames(generateClasses, className), style: style }, id && { id }, dataAttributes, { children: [iconStart && (jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })), jsxRuntime.jsx("span", { children: text }), iconEnd && (jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle }))] })));
795
+ return (jsxRuntime.jsxs("span", Object.assign({ className: classNames(generateClasses, className), style: style }, id && { id }, dataAttributes, { children: [iconStart && (jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconFamilyClass !== null && iconFamilyClass !== void 0 ? iconFamilyClass : familyClass, familyPrefix: iconFamilyPrefix !== null && iconFamilyPrefix !== void 0 ? iconFamilyPrefix : familyPrefix, materialStyle: iconMaterialStyle !== null && iconMaterialStyle !== void 0 ? iconMaterialStyle : materialStyle })), jsxRuntime.jsx("span", { children: text }), iconEnd && (jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconFamilyClass !== null && iconFamilyClass !== void 0 ? iconFamilyClass : familyClass, familyPrefix: iconFamilyPrefix !== null && iconFamilyPrefix !== void 0 ? iconFamilyPrefix : familyPrefix, materialStyle: iconMaterialStyle !== null && iconMaterialStyle !== void 0 ? iconMaterialStyle : materialStyle }))] })));
630
796
  }
631
797
 
632
798
  function DBox({ className, style, children, dataAttributes, }) {
@@ -658,6 +824,7 @@ function DInput(_a, ref) {
658
824
  const inputRef = useProvidedRefOrCreate(ref);
659
825
  const innerId = React.useId();
660
826
  const id = React.useMemo(() => idProp || innerId, [idProp, innerId]);
827
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
661
828
  const handleOnChange = React.useCallback((event) => {
662
829
  onChange === null || onChange === void 0 ? void 0 : onChange(event.currentTarget.value);
663
830
  }, [onChange]);
@@ -720,7 +887,7 @@ function DInput(_a, ref) {
720
887
  [`input-group-${size}`]: !!size,
721
888
  'input-group': true,
722
889
  'has-validation': invalid || valid,
723
- }), children: [!!inputStart && (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}InputStart`, children: inputStart })), iconStart && (onIconStartClick ? (jsxRuntime.jsx("button", { type: "button", className: "input-group-text", id: `${id}Start`, onClick: handleOnIconStartClick, disabled: disabled || loading || iconStartDisabled, "aria-label": iconStartAriaLabel || (typeof iconStart === 'string' ? iconStart : 'start icon'), tabIndex: iconStartTabIndex, children: jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle }) })) : (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}Start`, "aria-hidden": "true", tabIndex: -1, children: jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle }) }))), dynamicComponent, (iconEnd && !loading) && (onIconEndClick ? (jsxRuntime.jsx("button", { type: "button", className: "input-group-text", id: `${id}End`, onClick: handleOnIconEndClick, disabled: disabled || loading || iconEndDisabled, "aria-label": iconEndAriaLabel || (typeof iconEnd === 'string' ? iconEnd : 'end icon'), tabIndex: iconEndTabIndex, children: jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }) })) : (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}End`, "aria-hidden": "true", tabIndex: -1, children: jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }) }))), loading && (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}Loading`, children: jsxRuntime.jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", "data-testid": "loading-spinner", children: jsxRuntime.jsx("span", { className: "visually-hidden", children: "Loading..." }) }) })), !!inputEnd && (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}InputEnd`, children: inputEnd }))] }), hint && (jsxRuntime.jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
890
+ }), children: [!!inputStart && (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}InputStart`, children: inputStart })), iconStart && (onIconStartClick ? (jsxRuntime.jsx("button", { type: "button", className: "input-group-text", id: `${id}Start`, onClick: handleOnIconStartClick, disabled: disabled || loading || iconStartDisabled, "aria-label": iconStartAriaLabel || (typeof iconStart === 'string' ? iconStart : 'start icon'), tabIndex: iconStartTabIndex, children: jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass !== null && iconStartFamilyClass !== void 0 ? iconStartFamilyClass : familyClass, familyPrefix: iconStartFamilyPrefix !== null && iconStartFamilyPrefix !== void 0 ? iconStartFamilyPrefix : familyPrefix, materialStyle: iconStartMaterialStyle !== null && iconStartMaterialStyle !== void 0 ? iconStartMaterialStyle : materialStyle }) })) : (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}Start`, tabIndex: -1, children: jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass !== null && iconStartFamilyClass !== void 0 ? iconStartFamilyClass : familyClass, familyPrefix: iconStartFamilyPrefix !== null && iconStartFamilyPrefix !== void 0 ? iconStartFamilyPrefix : familyPrefix, materialStyle: iconStartMaterialStyle !== null && iconStartMaterialStyle !== void 0 ? iconStartMaterialStyle : materialStyle }) }))), dynamicComponent, (iconEnd && !loading) && (onIconEndClick ? (jsxRuntime.jsx("button", { type: "button", className: "input-group-text", id: `${id}End`, onClick: handleOnIconEndClick, disabled: disabled || loading || iconEndDisabled, "aria-label": iconEndAriaLabel || (typeof iconEnd === 'string' ? iconEnd : 'end icon'), tabIndex: iconEndTabIndex, children: jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass !== null && iconEndFamilyClass !== void 0 ? iconEndFamilyClass : familyClass, familyPrefix: iconEndFamilyPrefix !== null && iconEndFamilyPrefix !== void 0 ? iconEndFamilyPrefix : familyPrefix, materialStyle: iconEndMaterialStyle !== null && iconEndMaterialStyle !== void 0 ? iconEndMaterialStyle : materialStyle }) })) : (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}End`, tabIndex: -1, children: jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass !== null && iconEndFamilyClass !== void 0 ? iconEndFamilyClass : familyClass, familyPrefix: iconEndFamilyPrefix !== null && iconEndFamilyPrefix !== void 0 ? iconEndFamilyPrefix : familyPrefix, materialStyle: iconEndMaterialStyle !== null && iconEndMaterialStyle !== void 0 ? iconEndMaterialStyle : materialStyle }) }))), loading && (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}Loading`, children: jsxRuntime.jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", "data-testid": "loading-spinner", children: jsxRuntime.jsx("span", { className: "visually-hidden", children: "Loading..." }) }) })), !!inputEnd && (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}InputEnd`, children: inputEnd }))] }), hint && (jsxRuntime.jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
724
891
  }
725
892
  const ForwardedDInput = React.forwardRef(DInput);
726
893
  ForwardedDInput.displayName = 'DInput';
@@ -1116,7 +1283,7 @@ function useDBoxFile(props) {
1116
1283
 
1117
1284
  function DBoxFile(_a) {
1118
1285
  var { icon: iconProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle, children, className, style, dataAttributes } = _a, props = tslib.__rest(_a, ["icon", "iconFamilyClass", "iconFamilyPrefix", "iconMaterialStyle", "children", "className", "style", "dataAttributes"]);
1119
- const { iconMap: { upload } } = useDContext();
1286
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { upload }, } = useDContext();
1120
1287
  const icon = React.useMemo(() => iconProp || upload, [iconProp, upload]);
1121
1288
  const { inputRef, rootRef, isDragValid, isDragInvalid, acceptAttr, files, handleFileSelect, handleDrop, handleDragEnter, handleDragLeave, handleClick, handleKeyDown, handleRemoveFile, openFileDialog, } = useDBoxFile(props);
1122
1289
  return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("section", Object.assign({ className: classNames('d-box-file', {
@@ -1124,13 +1291,14 @@ function DBoxFile(_a) {
1124
1291
  'd-box-file-disabled': props.disabled,
1125
1292
  'd-box-file-valid': isDragValid,
1126
1293
  'd-box-file-invalid': isDragInvalid,
1127
- }, className), style: style }, dataAttributes, { children: jsxRuntime.jsxs("div", Object.assign({ className: "d-box-file-dropzone", ref: rootRef, onDragEnter: handleDragEnter, onDragOver: (e) => e.preventDefault(), onDragLeave: handleDragLeave, onDrop: handleDrop, onClick: handleClick, onKeyDown: handleKeyDown }, (!props.disabled && !props.noKeyboard ? { tabIndex: 0 } : {}), { role: "presentation", children: [jsxRuntime.jsx("input", { type: "file", multiple: props.multiple, style: { display: 'none' }, ref: inputRef, disabled: props.disabled, onChange: handleFileSelect, onClick: (e) => e.stopPropagation(), tabIndex: -1, accept: acceptAttr }), icon && iconProp !== false && (jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })), jsxRuntime.jsx("div", { className: "d-box-content", children: typeof children === 'function'
1294
+ }, className), style: style }, dataAttributes, { children: jsxRuntime.jsxs("div", Object.assign({ className: "d-box-file-dropzone", ref: rootRef, onDragEnter: handleDragEnter, onDragOver: (e) => e.preventDefault(), onDragLeave: handleDragLeave, onDrop: handleDrop, onClick: handleClick, onKeyDown: handleKeyDown }, (!props.disabled && !props.noKeyboard ? { tabIndex: 0 } : {}), { role: "presentation", children: [jsxRuntime.jsx("input", { type: "file", multiple: props.multiple, style: { display: 'none' }, ref: inputRef, disabled: props.disabled, onChange: handleFileSelect, onClick: (e) => e.stopPropagation(), tabIndex: -1, accept: acceptAttr }), icon && iconProp !== false && (jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass !== null && iconFamilyClass !== void 0 ? iconFamilyClass : familyClass, familyPrefix: iconFamilyPrefix !== null && iconFamilyPrefix !== void 0 ? iconFamilyPrefix : familyPrefix, materialStyle: iconMaterialStyle !== null && iconMaterialStyle !== void 0 ? iconMaterialStyle : materialStyle })), jsxRuntime.jsx("div", { className: "d-box-content", children: typeof children === 'function'
1128
1295
  ? children(openFileDialog)
1129
1296
  : children || (jsxRuntime.jsx("p", { className: "d-box-file-empty-text", children: "Drag and drop some files here, or click to select files" })) })] })) })), !!files.length && (jsxRuntime.jsx("ul", { className: "d-box-files", children: files.map((file, index) => (jsxRuntime.jsx(ForwardedDInput, { value: file.name, iconStart: "Paperclip", iconEnd: "Trash", readOnly: true, onIconEndClick: () => handleRemoveFile(index) }, `${file.name} ${index}`))) }))] }));
1130
1297
  }
1131
1298
 
1132
1299
  const DButton = React.forwardRef((props, ref) => {
1133
1300
  const { color = 'primary', size, variant = 'solid', text, children, iconStart, iconStartFamilyClass, iconStartFamilyPrefix, iconStartMaterialStyle, iconEnd, iconEndFamilyClass, iconEndFamilyPrefix, iconEndMaterialStyle, loading = false, loadingText, loadingAriaLabel, disabled = false, className, style, dataAttributes, onClick, type = 'button', target, rel, href, 'aria-label': ariaLabelProp } = props, rest = tslib.__rest(props, ["color", "size", "variant", "text", "children", "iconStart", "iconStartFamilyClass", "iconStartFamilyPrefix", "iconStartMaterialStyle", "iconEnd", "iconEndFamilyClass", "iconEndFamilyPrefix", "iconEndMaterialStyle", "loading", "loadingText", "loadingAriaLabel", "disabled", "className", "style", "dataAttributes", "onClick", "type", "target", "rel", "href", 'aria-label']);
1301
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
1134
1302
  // Responsive size resolution using useResponsiveProp
1135
1303
  const { responsivePropValue } = useResponsiveProp(true);
1136
1304
  const resolvedSize = React.useMemo(() => {
@@ -1184,7 +1352,7 @@ const DButton = React.forwardRef((props, ref) => {
1184
1352
  ref.current = node;
1185
1353
  }, className: classNames(classes, className), style: Object.assign(Object.assign({}, style), (loading && buttonWidth
1186
1354
  ? { minWidth: `${buttonWidth}px` }
1187
- : undefined)), "aria-label": ariaLabel, "aria-busy": loading, "aria-disabled": isDisabled, onClick: handleClick }, dataAttributes, { children: [loading && (jsxRuntime.jsxs("span", { className: "btn-loading", children: [jsxRuntime.jsx("span", { className: "spinner-border spinner-border-sm", "aria-hidden": "true" }), loadingText && jsxRuntime.jsx("span", { role: "status", children: loadingText })] })), !loading && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [iconStart && (jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle })), content, iconEnd && (jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }))] }))] })));
1355
+ : undefined)), "aria-label": ariaLabel, "aria-busy": loading, "aria-disabled": isDisabled, onClick: handleClick }, dataAttributes, { children: [loading && (jsxRuntime.jsxs("span", { className: "btn-loading", children: [jsxRuntime.jsx("span", { className: "spinner-border spinner-border-sm", "aria-hidden": "true" }), loadingText && jsxRuntime.jsx("span", { role: "status", children: loadingText })] })), !loading && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [iconStart && (jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass !== null && iconStartFamilyClass !== void 0 ? iconStartFamilyClass : familyClass, familyPrefix: iconStartFamilyPrefix !== null && iconStartFamilyPrefix !== void 0 ? iconStartFamilyPrefix : familyPrefix, materialStyle: iconStartMaterialStyle !== null && iconStartMaterialStyle !== void 0 ? iconStartMaterialStyle : materialStyle })), content, iconEnd && (jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass !== null && iconEndFamilyClass !== void 0 ? iconEndFamilyClass : familyClass, familyPrefix: iconEndFamilyPrefix !== null && iconEndFamilyPrefix !== void 0 ? iconEndFamilyPrefix : familyPrefix, materialStyle: iconEndMaterialStyle !== null && iconEndMaterialStyle !== void 0 ? iconEndMaterialStyle : materialStyle }))] }))] })));
1188
1356
  }
1189
1357
  return (jsxRuntime.jsxs("button", Object.assign({ ref: (node) => {
1190
1358
  buttonRef.current = node;
@@ -1198,12 +1366,51 @@ const DButton = React.forwardRef((props, ref) => {
1198
1366
  // eslint-disable-next-line react/button-has-type
1199
1367
  type: type, className: classNames(classes, className), style: Object.assign(Object.assign({}, style), (loading && buttonWidth
1200
1368
  ? { minWidth: `${buttonWidth}px` }
1201
- : undefined)), disabled: isDisabled, "aria-label": ariaLabel, "aria-busy": loading, "aria-disabled": isDisabled, onClick: handleClick }, dataAttributes, rest, { children: [loading && (jsxRuntime.jsxs("span", { className: "btn-loading", children: [jsxRuntime.jsx("span", { className: "spinner-border spinner-border-sm", "aria-hidden": "true" }), loadingText && jsxRuntime.jsx("span", { role: "status", children: loadingText })] })), !loading && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [iconStart && (jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle })), content, iconEnd && (jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }))] }))] })));
1369
+ : undefined)), disabled: isDisabled, "aria-label": ariaLabel, "aria-busy": loading, "aria-disabled": isDisabled, onClick: handleClick }, dataAttributes, rest, { children: [loading && (jsxRuntime.jsxs("span", { className: "btn-loading", children: [jsxRuntime.jsx("span", { className: "spinner-border spinner-border-sm", "aria-hidden": "true" }), loadingText && jsxRuntime.jsx("span", { role: "status", children: loadingText })] })), !loading && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [iconStart && (jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass !== null && iconStartFamilyClass !== void 0 ? iconStartFamilyClass : familyClass, familyPrefix: iconStartFamilyPrefix !== null && iconStartFamilyPrefix !== void 0 ? iconStartFamilyPrefix : familyPrefix, materialStyle: iconStartMaterialStyle !== null && iconStartMaterialStyle !== void 0 ? iconStartMaterialStyle : materialStyle })), content, iconEnd && (jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass !== null && iconEndFamilyClass !== void 0 ? iconEndFamilyClass : familyClass, familyPrefix: iconEndFamilyPrefix !== null && iconEndFamilyPrefix !== void 0 ? iconEndFamilyPrefix : familyPrefix, materialStyle: iconEndMaterialStyle !== null && iconEndMaterialStyle !== void 0 ? iconEndMaterialStyle : materialStyle }))] }))] })));
1202
1370
  });
1203
1371
  DButton.displayName = 'DButton';
1204
1372
 
1373
+ /**
1374
+ * Controls already reported, keyed by kind and icon, so the same unlabelled one
1375
+ * only warns once per page load however often it re-renders or however many
1376
+ * instances exist.
1377
+ */
1378
+ const warnedControls = new Set();
1379
+ /**
1380
+ * Warns, once per icon and only outside production builds, that an icon-only
1381
+ * button has no accessible name.
1382
+ *
1383
+ * The control has no text to fall back on and its icon is hidden from the
1384
+ * accessibility tree, so the name has to be given explicitly. `aria-label` is
1385
+ * the direct way; on a button `aria-labelledby` and `title` count too, since
1386
+ * `rest` reaches the DOM there, while an anchor drops them — hence `kind`, so
1387
+ * the advice matches what the element can actually receive.
1388
+ *
1389
+ * A legacy icon-font icon used to leak its ligature as the name by accident —
1390
+ * never a good one, being unlocalised and often meaningless ("more_vert") — and
1391
+ * no longer does, so the omission is now visible instead of silent.
1392
+ *
1393
+ * The `process.env.NODE_ENV` guard is what bundlers constant-fold, so the whole
1394
+ * call — and this module — drops out of a consumer's production bundle.
1395
+ */
1396
+ function warnMissingAccessibleName(icon, kind) {
1397
+ const key = `${kind}:${icon}`;
1398
+ if (warnedControls.has(key))
1399
+ return;
1400
+ warnedControls.add(key);
1401
+ const alternatives = kind === 'button'
1402
+ ? 'On a button, aria-labelledby or title work too. '
1403
+ : 'A link renders from the href branch, which does not forward aria-labelledby or title, so aria-label is the only option. ';
1404
+ // eslint-disable-next-line no-console
1405
+ console.warn(`[Dynamic UI] DButtonIcon: the "${icon}" ${kind} has no accessible name. `
1406
+ + 'Pass aria-label, since an icon-only control has no text to fall back on '
1407
+ + `and its icon is hidden from the accessibility tree. ${alternatives}`
1408
+ + 'It never appears in production builds.');
1409
+ }
1410
+
1205
1411
  function DButtonIcon(_a) {
1206
1412
  var { id, icon, size, className, variant, state, loadingAriaLabel, iconMaterialStyle, disabled = false, color = 'primary', loading = false, href, target, rel, stopPropagationEnabled = true, style, iconFamilyClass, iconFamilyPrefix, dataAttributes, onClick, 'aria-label': ariaLabelProp } = _a, rest = tslib.__rest(_a, ["id", "icon", "size", "className", "variant", "state", "loadingAriaLabel", "iconMaterialStyle", "disabled", "color", "loading", "href", "target", "rel", "stopPropagationEnabled", "style", "iconFamilyClass", "iconFamilyPrefix", "dataAttributes", "onClick", 'aria-label']);
1413
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
1207
1414
  const generateClasses = React.useMemo(() => {
1208
1415
  const variantClass = !variant || variant === 'solid'
1209
1416
  ? `btn-${color}`
@@ -1224,14 +1431,23 @@ function DButtonIcon(_a) {
1224
1431
  const ariaLabel = React.useMemo(() => (loading
1225
1432
  ? loadingAriaLabel || ariaLabelProp
1226
1433
  : ariaLabelProp), [loading, loadingAriaLabel, ariaLabelProp]);
1434
+ /**
1435
+ * `aria-labelledby` and `title` also name a control, but they travel in `rest`,
1436
+ * which only the button branch spreads — an anchor drops them, so there the
1437
+ * button really is unnamed and the warning still applies.
1438
+ */
1439
+ const hasAccessibleName = React.useMemo(() => !!ariaLabel || (!href && (!!rest['aria-labelledby'] || !!rest.title)), [ariaLabel, href, rest]);
1440
+ if (process.env.NODE_ENV !== 'production' && !hasAccessibleName) {
1441
+ warnMissingAccessibleName(icon, href ? 'link' : 'button');
1442
+ }
1227
1443
  if (href) {
1228
1444
  return (jsxRuntime.jsx("a", Object.assign({ id: id, href: href, target: target, rel: rel, className: classNames(generateClasses, className), style: style, onClick: clickHandler, "aria-label": ariaLabel, "aria-disabled": isDisabled }, dataAttributes, { children: loading
1229
1445
  ? (jsxRuntime.jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsxRuntime.jsx("span", { className: "visually-hidden", children: "Loading..." }) }))
1230
- : (jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })) })));
1446
+ : (jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass !== null && iconFamilyClass !== void 0 ? iconFamilyClass : familyClass, familyPrefix: iconFamilyPrefix !== null && iconFamilyPrefix !== void 0 ? iconFamilyPrefix : familyPrefix, materialStyle: iconMaterialStyle !== null && iconMaterialStyle !== void 0 ? iconMaterialStyle : materialStyle })) })));
1231
1447
  }
1232
1448
  return (jsxRuntime.jsx("button", Object.assign({ className: classNames(generateClasses, className), style: style, disabled: state === 'disabled' || loading, onClick: clickHandler, "aria-label": ariaLabel }, dataAttributes, rest, { children: loading
1233
1449
  ? (jsxRuntime.jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsxRuntime.jsx("span", { className: "visually-hidden", children: "Loading..." }) }))
1234
- : (jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })) })));
1450
+ : (jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass !== null && iconFamilyClass !== void 0 ? iconFamilyClass : familyClass, familyPrefix: iconFamilyPrefix !== null && iconFamilyPrefix !== void 0 ? iconFamilyPrefix : familyPrefix, materialStyle: iconMaterialStyle !== null && iconMaterialStyle !== void 0 ? iconMaterialStyle : materialStyle })) })));
1235
1451
  }
1236
1452
 
1237
1453
  function DCardHeader({ className, style, children, }) {
@@ -1294,12 +1510,12 @@ function DChip({ color = 'primary', text, icon, iconFamilyClass, iconFamilyPrefi
1294
1510
  'd-chip': true,
1295
1511
  [`d-chip-${color}`]: !!color,
1296
1512
  }), [color]);
1297
- const { iconMap: { xLg, }, } = useDContext();
1513
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { xLg, }, } = useDContext();
1298
1514
  const iconClose = React.useMemo(() => iconCloseProp || xLg, [iconCloseProp, xLg]);
1299
- return (jsxRuntime.jsxs("span", Object.assign({ className: classNames(generateClasses, className), style: style }, dataAttributes, { children: [icon && (jsxRuntime.jsx("div", { className: "d-chip-icon-container", children: jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle }) })), jsxRuntime.jsx("span", { children: text }), showClose && (jsxRuntime.jsx("button", { type: "button", className: "d-chip-icon-container", onClick: onClose, "aria-label": closeAriaLabel, children: jsxRuntime.jsx(DIcon, { icon: iconClose, familyClass: iconCloseFamilyClass, familyPrefix: iconCloseFamilyPrefix, materialStyle: iconCloseMaterialStyle }) }))] })));
1515
+ return (jsxRuntime.jsxs("span", Object.assign({ className: classNames(generateClasses, className), style: style }, dataAttributes, { children: [icon && (jsxRuntime.jsx("div", { className: "d-chip-icon-container", children: jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass !== null && iconFamilyClass !== void 0 ? iconFamilyClass : familyClass, familyPrefix: iconFamilyPrefix !== null && iconFamilyPrefix !== void 0 ? iconFamilyPrefix : familyPrefix, materialStyle: iconMaterialStyle !== null && iconMaterialStyle !== void 0 ? iconMaterialStyle : materialStyle }) })), jsxRuntime.jsx("span", { children: text }), showClose && (jsxRuntime.jsx("button", { type: "button", className: "d-chip-icon-container", onClick: onClose, "aria-label": closeAriaLabel, children: jsxRuntime.jsx(DIcon, { icon: iconClose, familyClass: iconCloseFamilyClass !== null && iconCloseFamilyClass !== void 0 ? iconCloseFamilyClass : familyClass, familyPrefix: iconCloseFamilyPrefix !== null && iconCloseFamilyPrefix !== void 0 ? iconCloseFamilyPrefix : familyPrefix, materialStyle: iconCloseMaterialStyle !== null && iconCloseMaterialStyle !== void 0 ? iconCloseMaterialStyle : materialStyle }) }))] })));
1300
1516
  }
1301
1517
 
1302
- function DCollapse({ id, className, style, Component, defaultCollapsed = true, onChange, children, iconOpen: iconOpenProp, iconClose: iconCloseProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle = false, dataAttributes, }) {
1518
+ function DCollapse({ id, className, style, Component, defaultCollapsed = true, onChange, children, iconOpen: iconOpenProp, iconClose: iconCloseProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle, dataAttributes, }) {
1303
1519
  const [collapsed, setCollapsed] = React.useState(defaultCollapsed);
1304
1520
  const onChangeCollapse = () => {
1305
1521
  setCollapsed((prev) => {
@@ -1313,10 +1529,10 @@ function DCollapse({ id, className, style, Component, defaultCollapsed = true, o
1313
1529
  React.useEffect(() => {
1314
1530
  setCollapsed(defaultCollapsed);
1315
1531
  }, [defaultCollapsed]);
1316
- const { iconMap: { chevronDown, chevronUp, }, } = useDContext();
1532
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { chevronDown, chevronUp, }, } = useDContext();
1317
1533
  const iconOpen = React.useMemo(() => iconOpenProp || chevronDown, [chevronDown, iconOpenProp]);
1318
1534
  const iconClose = React.useMemo(() => iconCloseProp || chevronUp, [chevronUp, iconCloseProp]);
1319
- return (jsxRuntime.jsxs("div", Object.assign({ id: id, className: classNames('collapse-container', className), style: style }, dataAttributes, { children: [jsxRuntime.jsxs("button", { className: "collapse-button", type: "button", onClick: onChangeCollapse, children: [jsxRuntime.jsx("div", { className: "flex-grow-1", children: Component }), jsxRuntime.jsx(DIcon, { color: "primary", size: "1.25rem", icon: collapsed ? iconOpen : iconClose, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })] }), jsxRuntime.jsx("div", { className: classNames('collapse-body-wrapper', {
1535
+ return (jsxRuntime.jsxs("div", Object.assign({ id: id, className: classNames('collapse-container', className), style: style }, dataAttributes, { children: [jsxRuntime.jsxs("button", { className: "collapse-button", type: "button", onClick: onChangeCollapse, children: [jsxRuntime.jsx("div", { className: "flex-grow-1", children: Component }), jsxRuntime.jsx(DIcon, { className: "collapse-icon", color: "primary", size: "1.25rem", icon: collapsed ? iconOpen : iconClose, familyClass: iconFamilyClass !== null && iconFamilyClass !== void 0 ? iconFamilyClass : familyClass, familyPrefix: iconFamilyPrefix !== null && iconFamilyPrefix !== void 0 ? iconFamilyPrefix : familyPrefix, materialStyle: iconMaterialStyle !== null && iconMaterialStyle !== void 0 ? iconMaterialStyle : materialStyle })] }), jsxRuntime.jsx("div", { className: classNames('collapse-body-wrapper', {
1320
1536
  show: !collapsed,
1321
1537
  }), children: jsxRuntime.jsx("div", { className: "collapse-body", children: children }) })] })));
1322
1538
  }
@@ -2107,9 +2323,9 @@ function DInputCheck(_a) {
2107
2323
  ]);
2108
2324
  React.useEffect(() => {
2109
2325
  if (innerRef.current) {
2110
- innerRef.current.indeterminate = Boolean(indeterminate);
2326
+ innerRef.current.indeterminate = type === 'checkbox' && Boolean(indeterminate);
2111
2327
  }
2112
- }, [indeterminate]);
2328
+ }, [indeterminate, type]);
2113
2329
  React.useEffect(() => {
2114
2330
  if (innerRef.current) {
2115
2331
  innerRef.current.checked = checked;
@@ -2302,10 +2518,18 @@ function DInputSelect({ id: idProp, name, label = '', className, style, options
2302
2518
  }), children: [iconStart && (jsxRuntime.jsx("button", { type: "button", className: "input-group-text", id: `${id}Start`, onClick: iconStartClickHandler, disabled: disabled || loading, "aria-label": iconStartAriaLabel, children: iconStart && (jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix })) })), dynamicComponent, iconEnd && !loading && (jsxRuntime.jsx("button", { type: "button", className: "input-group-text", id: `${id}End`, onClick: iconEndClickHandler, disabled: disabled || loading, "aria-label": iconEndAriaLabel, children: iconEnd && (jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix })) })), loading && (jsxRuntime.jsx("div", { className: "input-group-text form-control-icon loading", children: jsxRuntime.jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsxRuntime.jsx("span", { className: "visually-hidden", children: "Loading..." }) }) }))] }), hint && (jsxRuntime.jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
2303
2519
  }
2304
2520
 
2305
- function DInputSwitch({ id: idProp, label, ariaLabel, name, checked, disabled, invalid = false, valid = false, readonly, className, style, dataAttributes, inputClassName, onChange, }) {
2521
+ function DInputSwitch({ id: idProp, label, ariaLabel, name, checked, disabled, invalid = false, valid = false, hint, readonly, className, style, dataAttributes, inputClassName, onChange, }) {
2306
2522
  const innerId = React.useId();
2307
2523
  const id = React.useMemo(() => idProp || innerId, [idProp, innerId]);
2308
2524
  const [internalIsChecked, setInternalIsChecked] = React.useState(checked);
2525
+ const ariaDescribedby = React.useMemo(() => ([
2526
+ !!hint && `${id}Hint`,
2527
+ ]
2528
+ .filter(Boolean)
2529
+ .join(' ')), [
2530
+ id,
2531
+ hint,
2532
+ ]);
2309
2533
  React.useEffect(() => {
2310
2534
  setInternalIsChecked(checked);
2311
2535
  }, [checked]);
@@ -2314,10 +2538,10 @@ function DInputSwitch({ id: idProp, label, ariaLabel, name, checked, disabled, i
2314
2538
  setInternalIsChecked(value);
2315
2539
  onChange === null || onChange === void 0 ? void 0 : onChange(value);
2316
2540
  }, [onChange]);
2317
- return (jsxRuntime.jsxs("div", Object.assign({ className: classNames('form-check form-switch', className) }, dataAttributes, { children: [jsxRuntime.jsx("input", { id: id, name: name, onChange: readonly ? () => false : changeHandler, className: classNames('form-check-input', {
2541
+ return (jsxRuntime.jsxs("div", Object.assign({ className: classNames('form-check form-switch', className) }, dataAttributes, { children: [jsxRuntime.jsx("input", Object.assign({ id: id, name: name, onChange: readonly ? () => false : changeHandler, className: classNames('form-check-input', {
2318
2542
  'is-invalid': invalid,
2319
2543
  'is-valid': valid,
2320
- }, inputClassName), style: style, type: "checkbox", role: "switch", checked: internalIsChecked, disabled: disabled, "aria-label": ariaLabel }), label && (jsxRuntime.jsx("label", { className: "form-check-label", htmlFor: id, children: label }))] })));
2544
+ }, inputClassName), style: style, type: "checkbox", role: "switch", checked: internalIsChecked, disabled: disabled, "aria-label": ariaLabel }, ariaDescribedby && { 'aria-describedby': ariaDescribedby })), label && (jsxRuntime.jsx("label", { className: "form-check-label", htmlFor: id, children: label })), hint && (jsxRuntime.jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
2321
2545
  }
2322
2546
 
2323
2547
  function DInputRange(_a, ref) {
@@ -2358,6 +2582,7 @@ const ForwardedDInputRange = React.forwardRef(DInputRange);
2358
2582
  ForwardedDInputRange.displayName = 'DInputRange';
2359
2583
 
2360
2584
  function DListGroupItem({ as = 'li', action: actionProp, active, disabled, href, onClick, color, iconStart, iconStartFamilyClass, iconStartFamilyPrefix, iconStartMaterialStyle, iconEnd, iconEndFamilyClass, iconEndFamilyPrefix, iconEndMaterialStyle, children, className, style, dataAttributes, }) {
2585
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
2361
2586
  const Tag = React.useMemo(() => {
2362
2587
  if (href) {
2363
2588
  return 'a';
@@ -2386,7 +2611,7 @@ function DListGroupItem({ as = 'li', action: actionProp, active, disabled, href,
2386
2611
  }
2387
2612
  return Object.assign(Object.assign({}, active && { 'aria-current': true }), disabled && { 'aria-disabled': true });
2388
2613
  }, [Tag, active, disabled]);
2389
- return (jsxRuntime.jsxs(Tag, Object.assign({ className: classNames(generateClasses, className), style: style }, Tag === 'a' && href && { href }, onClick && { onClick }, ariaAttributes, dataAttributes, Tag === 'button' && { type: 'button' }, { children: [iconStart && (jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle })), children, iconEnd && (jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle, className: "ms-auto" }))] })));
2614
+ return (jsxRuntime.jsxs(Tag, Object.assign({ className: classNames(generateClasses, className), style: style }, Tag === 'a' && href && { href }, onClick && { onClick }, ariaAttributes, dataAttributes, Tag === 'button' && { type: 'button' }, { children: [iconStart && (jsxRuntime.jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass !== null && iconStartFamilyClass !== void 0 ? iconStartFamilyClass : familyClass, familyPrefix: iconStartFamilyPrefix !== null && iconStartFamilyPrefix !== void 0 ? iconStartFamilyPrefix : familyPrefix, materialStyle: iconStartMaterialStyle !== null && iconStartMaterialStyle !== void 0 ? iconStartMaterialStyle : materialStyle })), children, iconEnd && (jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass !== null && iconEndFamilyClass !== void 0 ? iconEndFamilyClass : familyClass, familyPrefix: iconEndFamilyPrefix !== null && iconEndFamilyPrefix !== void 0 ? iconEndFamilyPrefix : familyPrefix, materialStyle: iconEndMaterialStyle !== null && iconEndMaterialStyle !== void 0 ? iconEndMaterialStyle : materialStyle, className: "ms-auto" }))] })));
2390
2615
  }
2391
2616
 
2392
2617
  function DListGroup$1({ as = 'ul', numbered, flush, horizontal, children, className, style, dataAttributes, }) {
@@ -2413,10 +2638,11 @@ var DListGroup = Object.assign(DListGroup$1, {
2413
2638
  Item: DListGroupItem,
2414
2639
  });
2415
2640
 
2416
- function DModalHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, materialStyle = false, }) {
2417
- const { iconMap: { xLg, }, } = useDContext();
2641
+ function DModalHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, iconMaterialStyle, materialStyle: materialStyleProp, }) {
2642
+ var _a;
2643
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { xLg, }, } = useDContext();
2418
2644
  const icon = React.useMemo(() => iconProp || xLg, [iconProp, xLg]);
2419
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { className: classNames('modal-header', className), style: style, children: [jsxRuntime.jsx("div", { children: children }), showCloseButton && (jsxRuntime.jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: materialStyle }) }))] }), jsxRuntime.jsx("div", { className: "d-modal-separator" })] }));
2645
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { className: classNames('modal-header', className), style: style, children: [jsxRuntime.jsx("div", { children: children }), showCloseButton && (jsxRuntime.jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass !== null && iconFamilyClass !== void 0 ? iconFamilyClass : familyClass, familyPrefix: iconFamilyPrefix !== null && iconFamilyPrefix !== void 0 ? iconFamilyPrefix : familyPrefix, materialStyle: (_a = iconMaterialStyle !== null && iconMaterialStyle !== void 0 ? iconMaterialStyle : materialStyleProp) !== null && _a !== void 0 ? _a : materialStyle }) }))] }), jsxRuntime.jsx("div", { className: "d-modal-separator" })] }));
2420
2646
  }
2421
2647
 
2422
2648
  function DModalBody({ children, className, style, }) {
@@ -2457,10 +2683,11 @@ var DModal = Object.assign(DModal$1, {
2457
2683
  Footer: DModalFooter,
2458
2684
  });
2459
2685
 
2460
- function DOffcanvasHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, materialStyle = false, }) {
2461
- const { iconMap: { xLg, }, } = useDContext();
2686
+ function DOffcanvasHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, iconMaterialStyle, materialStyle: materialStyleProp, }) {
2687
+ var _a;
2688
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { xLg, }, } = useDContext();
2462
2689
  const icon = React.useMemo(() => iconProp || xLg, [iconProp, xLg]);
2463
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { className: classNames('offcanvas-header', className), style: style, children: [jsxRuntime.jsx("div", { children: children }), showCloseButton && (jsxRuntime.jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: materialStyle }) }))] }), jsxRuntime.jsx("div", { className: "d-offcanvas-separator" })] }));
2690
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { className: classNames('offcanvas-header', className), style: style, children: [jsxRuntime.jsx("div", { children: children }), showCloseButton && (jsxRuntime.jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconFamilyClass !== null && iconFamilyClass !== void 0 ? iconFamilyClass : familyClass, familyPrefix: iconFamilyPrefix !== null && iconFamilyPrefix !== void 0 ? iconFamilyPrefix : familyPrefix, materialStyle: (_a = iconMaterialStyle !== null && iconMaterialStyle !== void 0 ? iconMaterialStyle : materialStyleProp) !== null && _a !== void 0 ? _a : materialStyle }) }))] }), jsxRuntime.jsx("div", { className: "d-offcanvas-separator" })] }));
2464
2691
  }
2465
2692
 
2466
2693
  function DOffcanvasBody({ children, className, style, }) {
@@ -2601,8 +2828,8 @@ function DProgress({ className, style, currentValue, minValue = 0, maxValue = 10
2601
2828
  return (jsxRuntime.jsx("div", Object.assign({ className: classNames('progress', className), style: Object.assign({ height }, style) }, dataAttributes, { children: jsxRuntime.jsx("div", { className: classNames(generateClasses), role: "progressbar", "aria-label": "Progress bar", style: { width: formatProgress }, "aria-valuenow": currentValue, "aria-valuemin": minValue, "aria-valuemax": maxValue, children: !hideCurrentValue && formatProgress }) })));
2602
2829
  }
2603
2830
 
2604
- function DStepper$2({ options, currentStep, iconSuccess: iconSuccessProp, iconSuccessFamilyClass, iconSuccessFamilyPrefix, iconSuccessMaterialStyle = false, vertical = false, completed, alignStart = false, className, style, }) {
2605
- const { iconMap: { check, }, } = useDContext();
2831
+ function DStepper$2({ options, currentStep, iconSuccess: iconSuccessProp, iconSuccessFamilyClass, iconSuccessFamilyPrefix, iconSuccessMaterialStyle, vertical = false, completed, alignStart = false, className, style, }) {
2832
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { check, }, } = useDContext();
2606
2833
  const icon = React.useMemo(() => iconSuccessProp || check, [check, iconSuccessProp]);
2607
2834
  if (currentStep < 1 || currentStep > options.length) {
2608
2835
  throw new Error('Current step should be in the range from 1 to options length');
@@ -2617,7 +2844,7 @@ function DStepper$2({ options, currentStep, iconSuccess: iconSuccessProp, iconSu
2617
2844
  }), children: [jsxRuntime.jsx("div", { className: "d-step-value", children: jsxRuntime.jsxs("div", { className: classNames({
2618
2845
  'd-step-icon-container': true,
2619
2846
  'd-step-check': value < currentStep || completed,
2620
- }), children: [((value < currentStep) || completed) && (jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconSuccessFamilyClass, familyPrefix: iconSuccessFamilyPrefix, materialStyle: iconSuccessMaterialStyle, className: "d-step-icon" })), value] }) }), jsxRuntime.jsxs("div", { className: "d-step-text-container", children: [jsxRuntime.jsx("div", { className: "d-step-label", children: label }), description && (jsxRuntime.jsx("div", { className: "d-step-description", children: description }))] })] }, value))) }));
2847
+ }), children: [((value < currentStep) || completed) && (jsxRuntime.jsx(DIcon, { icon: icon, familyClass: iconSuccessFamilyClass !== null && iconSuccessFamilyClass !== void 0 ? iconSuccessFamilyClass : familyClass, familyPrefix: iconSuccessFamilyPrefix !== null && iconSuccessFamilyPrefix !== void 0 ? iconSuccessFamilyPrefix : familyPrefix, materialStyle: iconSuccessMaterialStyle !== null && iconSuccessMaterialStyle !== void 0 ? iconSuccessMaterialStyle : materialStyle, className: "d-step-icon" })), value] }) }), jsxRuntime.jsxs("div", { className: "d-step-text-container", children: [jsxRuntime.jsx("div", { className: "d-step-label", children: label }), description && (jsxRuntime.jsx("div", { className: "d-step-description", children: description }))] })] }, value))) }));
2621
2848
  }
2622
2849
 
2623
2850
  function DStepper$1({ options, currentStep, className, style, }) {
@@ -2650,13 +2877,20 @@ function DStepper$1({ options, currentStep, className, style, }) {
2650
2877
  return (jsxRuntime.jsxs("div", { className: classNames('d-stepper', className), style: style, children: [jsxRuntime.jsx("div", { className: "d-step-bar", style: { background: progressStyle }, children: jsxRuntime.jsx("p", { className: "d-step-number", children: `${currentStep}/${options.length}` }) }), jsxRuntime.jsx("div", { className: "d-step-info", children: Object.keys(currentOption).length > 0 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: "d-step-label", children: currentOption.label }), jsxRuntime.jsx("div", { className: "d-step-description", children: currentOption.description || '' })] })) })] }));
2651
2878
  }
2652
2879
 
2653
- function DStepper({ options, currentStep, iconSuccess, iconSuccessFamilyClass, iconSuccessFamilyPrefix, iconSuccessMaterialStyle = false, vertical = false, breakpoint = 'lg', className, completed = false, style, dataAttributes, }) {
2654
- return (jsxRuntime.jsxs("div", Object.assign({ className: className, style: style }, dataAttributes, { children: [jsxRuntime.jsx("div", { className: classNames('d-stepper-mobile', `d-block d-${breakpoint}-none`), children: jsxRuntime.jsx(DStepper$1, { options: options, currentStep: currentStep }) }), jsxRuntime.jsx("div", { className: classNames('d-stepper-desktop', `d-none d-${breakpoint}-block`), children: jsxRuntime.jsx(DStepper$2, { options: options, currentStep: currentStep, vertical: vertical, iconSuccess: iconSuccess, iconSuccessFamilyClass: iconSuccessFamilyClass, iconSuccessFamilyPrefix: iconSuccessFamilyPrefix, iconSuccessMaterialStyle: iconSuccessMaterialStyle, completed: completed }) })] })));
2880
+ function DStepper({ options, currentStep, iconSuccess, iconSuccessFamilyClass, iconSuccessFamilyPrefix, iconSuccessMaterialStyle, vertical = false, breakpoint = 'lg', className, completed = false, style, dataAttributes, }) {
2881
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
2882
+ return (jsxRuntime.jsxs("div", Object.assign({ className: className, style: style }, dataAttributes, { children: [jsxRuntime.jsx("div", { className: classNames('d-stepper-mobile', `d-block d-${breakpoint}-none`), children: jsxRuntime.jsx(DStepper$1, { options: options, currentStep: currentStep }) }), jsxRuntime.jsx("div", { className: classNames('d-stepper-desktop', `d-none d-${breakpoint}-block`), children: jsxRuntime.jsx(DStepper$2, { options: options, currentStep: currentStep, vertical: vertical, iconSuccess: iconSuccess, iconSuccessFamilyClass: iconSuccessFamilyClass !== null && iconSuccessFamilyClass !== void 0 ? iconSuccessFamilyClass : familyClass, iconSuccessFamilyPrefix: iconSuccessFamilyPrefix !== null && iconSuccessFamilyPrefix !== void 0 ? iconSuccessFamilyPrefix : familyPrefix, iconSuccessMaterialStyle: iconSuccessMaterialStyle !== null && iconSuccessMaterialStyle !== void 0 ? iconSuccessMaterialStyle : materialStyle, completed: completed }) })] })));
2655
2883
  }
2656
2884
 
2657
2885
  const ARROW_WIDTH = 8;
2658
2886
  const ARROW_HEIGHT = 4;
2659
2887
  const GAP$1 = 2;
2888
+ /**
2889
+ * Tooltip is an abstraction component that wraps any element (`Component`) and displays
2890
+ * floating contextual content (`children`) positioned relative to it using Floating UI.
2891
+ * Use it to add short, non-critical hints or descriptions triggered by hover, focus, or
2892
+ * click, without altering the surrounding layout.
2893
+ */
2660
2894
  function DTooltip({ className, childrenClassName, style, offSet = ARROW_HEIGHT + GAP$1, padding, withFocus = false, withClick = false, withHover = true, open = false, placement = 'top', size, Component, children, }) {
2661
2895
  const [isOpen, setIsOpen] = React.useState(open);
2662
2896
  const arrowRef = React.useRef(null);
@@ -2695,7 +2929,7 @@ function DTooltip({ className, childrenClassName, style, offSet = ARROW_HEIGHT +
2695
2929
  function DTimeline({ className, style, dataAttributes, items, }) {
2696
2930
  return (jsxRuntime.jsx("div", Object.assign({ style: style, className: classNames('d-timeline', className) }, dataAttributes, { children: items.map((item, index) => (jsxRuntime.jsxs("div", { className: classNames('d-timeline-item', {
2697
2931
  [`d-timeline-item-${item.status}`]: item.status,
2698
- }), children: [jsxRuntime.jsx("div", { className: "d-timeline-item-connector" }), jsxRuntime.jsx("div", { className: "d-timeline-item-icon", children: jsxRuntime.jsx(DIcon, { icon: item.icon || 'check', size: "1rem" }) }), jsxRuntime.jsxs("div", { className: "d-timeline-item-content", children: [jsxRuntime.jsx("div", { className: "d-timeline-item-title", children: item.title }), item.description && jsxRuntime.jsx("div", { className: "d-timeline-item-description", children: item.description }), item.time && jsxRuntime.jsx("div", { className: "d-timeline-item-time", children: item.time }), item.children] })] }, index))) })));
2932
+ }), children: [jsxRuntime.jsx("div", { className: "d-timeline-item-connector" }), jsxRuntime.jsx("div", { className: "d-timeline-item-icon", children: jsxRuntime.jsx(DIcon, { icon: item.icon || 'Check', size: "1rem" }) }), jsxRuntime.jsxs("div", { className: "d-timeline-item-content", children: [jsxRuntime.jsx("div", { className: "d-timeline-item-title", children: item.title }), item.description && jsxRuntime.jsx("div", { className: "d-timeline-item-description", children: item.description }), item.time && jsxRuntime.jsx("div", { className: "d-timeline-item-time", children: item.time }), item.children] })] }, index))) })));
2699
2933
  }
2700
2934
 
2701
2935
  const TabContext = React.createContext(undefined);
@@ -2939,11 +3173,132 @@ function validatePhoneNumber(phone) {
2939
3173
  }
2940
3174
  }
2941
3175
 
3176
+ const SAFE_SCHEMES = new Set(['http:', 'https:', 'mailto:', 'tel:']);
3177
+ /**
3178
+ * Characters the URL parser drops before resolving a URL, so they cannot be used to hide a
3179
+ * scheme-relative prefix or a dangerous scheme (e.g. `/<TAB>/evil.com`, `java<TAB>script:`).
3180
+ */
3181
+ const IGNORED_CHARS$1 = /[\t\n\r]/g;
3182
+ /**
3183
+ * Two leading separators in any combination. Browsers treat a leading `\` exactly like a
3184
+ * leading `/`, so `//`, `/\`, `\/` and `\\` all resolve to a scheme-relative URL.
3185
+ */
3186
+ const SCHEME_RELATIVE = /^[/\\]{2}/;
3187
+ const LEADING_SEPARATOR = /^[/\\]/;
3188
+ /**
3189
+ * Validates a `href` value and returns it only if it is safe to render as a link,
3190
+ * preventing XSS through unsafe URL schemes and scheme-relative URLs.
3191
+ *
3192
+ * Before validating, the value is trimmed and every tab, line feed and carriage return is
3193
+ * removed, because the URL parser ignores those characters too and they would otherwise
3194
+ * hide an unsafe value from the checks below.
3195
+ *
3196
+ * A `href` is considered safe when it is either:
3197
+ * - An absolute path starting with a single separator (e.g. `/accounts/42`). A leading `\`
3198
+ * is normalized to `/` in the returned value, since that is how the browser resolves it.
3199
+ * - A URL using one of the allowed schemes: `http:`, `https:`, `mailto:`, `tel:`.
3200
+ *
3201
+ * A `href` is rejected (returns `undefined`) when it is:
3202
+ * - Empty or made only of whitespace/ignored characters (`''`, `' '`).
3203
+ * - Scheme-relative (starts with two separators, e.g. `//evil.com`, `/\evil.com`,
3204
+ * `/<TAB>/evil.com`), since the browser would resolve it using the current protocol and it
3205
+ * can be used to redirect to an attacker-controlled host.
3206
+ * - Using a disallowed/dangerous scheme, such as `javascript:` or `data:`
3207
+ * (e.g. `javascript:alert(1)`, `data:text/html,<script>...</script>`).
3208
+ * - Not parseable as an absolute URL and not an absolute path, such as bare fragments
3209
+ * (`#anchor`) or scheme-less relative paths (`relative/path`). These cannot be validated
3210
+ * against `SAFE_SCHEMES`, so they are rejected rather than assumed safe.
3211
+ *
3212
+ * @param href - The raw URL or path to validate, typically coming from user input,
3213
+ * a CMS, or an external API.
3214
+ * @returns The sanitized `href` when safe, `undefined` otherwise.
3215
+ *
3216
+ * @example
3217
+ * sanitizeHref('/accounts/42'); // '/accounts/42'
3218
+ * sanitizeHref('https://example.com'); // 'https://example.com'
3219
+ * sanitizeHref('mailto:test@example.com'); // 'mailto:test@example.com'
3220
+ * sanitizeHref('//evil.com'); // undefined
3221
+ * sanitizeHref('/\\evil.com'); // undefined
3222
+ * sanitizeHref('javascript:alert(1)'); // undefined
3223
+ */
3224
+ function sanitizeHref(href) {
3225
+ const normalized = href.trim().replace(IGNORED_CHARS$1, '');
3226
+ if (!normalized)
3227
+ return undefined;
3228
+ if (SCHEME_RELATIVE.test(normalized))
3229
+ return undefined;
3230
+ if (LEADING_SEPARATOR.test(normalized))
3231
+ return `/${normalized.slice(1)}`;
3232
+ try {
3233
+ const { protocol } = new URL(normalized);
3234
+ return SAFE_SCHEMES.has(protocol) ? normalized : undefined;
3235
+ }
3236
+ catch (_a) {
3237
+ return undefined;
3238
+ }
3239
+ }
3240
+
3241
+ /**
3242
+ * Characters the URL parser drops before resolving a URL, so they cannot be used to hide a
3243
+ * scheme-relative prefix (e.g. `/<TAB>/evil.com`).
3244
+ */
3245
+ const IGNORED_CHARS = /[\t\n\r]/g;
3246
+ /**
3247
+ * Leading separators. Browsers treat a leading `\` exactly like a leading `/`, so both have
3248
+ * to be stripped to prevent scheme-relative URLs (`//evil.com`, `/\evil.com`, `\\evil.com`).
3249
+ */
3250
+ const LEADING_SEPARATORS = /^[/\\]+/;
3251
+ /**
3252
+ * Builds an internal URL from a `path` and a set of query `params`, normalizing leading
3253
+ * separators to prevent scheme-relative URLs (e.g. `//accounts` and `/\accounts` both become
3254
+ * `/accounts`).
3255
+ *
3256
+ * The `path` is trimmed and every tab, line feed and carriage return is removed before
3257
+ * building the result, because the URL parser ignores those characters too and they would
3258
+ * otherwise hide a scheme-relative prefix (`/<TAB>/evil.com` resolves to `//evil.com`).
3259
+ *
3260
+ * Handles the special case where `path` is the literal string `'#'`, which happens when
3261
+ * a Liquid template variable used as a link target is left unconfigured; in that case the
3262
+ * params are ignored and `'#'` is returned as-is instead of building a broken URL.
3263
+ *
3264
+ * @param path - The path to build the URL from. Leading separators are stripped before
3265
+ * building the result (`/accounts`, `//accounts` and `\accounts` are all treated as `accounts`).
3266
+ * @param params - Key/value pairs serialized as the query string.
3267
+ * @returns The resulting URL:
3268
+ * - `'#'` when `path` normalizes to `'#'` (`'#'`, `'/#'`), ignoring the params.
3269
+ * - `'/'` when `path` is empty and there are no params.
3270
+ * - `'/?<query>'` when `path` is empty and there are params.
3271
+ * - `'<path>'` or `'<path>?<query>'` when `path` starts with `#`, since a fragment must not be
3272
+ * prefixed with `/` (it would navigate away from the current document).
3273
+ * - `'/<path>'` or `'/<path>?<query>'` otherwise.
3274
+ *
3275
+ * @example
3276
+ * buildUrl('accounts', { account_id: '42' }); // '/accounts?account_id=42'
3277
+ * buildUrl('//accounts', {}); // '/accounts'
3278
+ * buildUrl('#', { account_id: '42' }); // '#'
3279
+ * buildUrl('#accounts', { account_id: '42' }); // '#accounts?account_id=42'
3280
+ * buildUrl('', { tab: 'movimientos' }); // '/?tab=movimientos'
3281
+ */
3282
+ function buildUrl(path, params) {
3283
+ const normalizedPath = path
3284
+ .trim()
3285
+ .replace(IGNORED_CHARS, '')
3286
+ .replace(LEADING_SEPARATORS, '');
3287
+ if (normalizedPath === '#')
3288
+ return '#';
3289
+ const query = new URLSearchParams(Object.entries(params).map(([key, value]) => [key, String(value)])).toString();
3290
+ if (normalizedPath === '')
3291
+ return query ? `/?${query}` : '/';
3292
+ const prefix = normalizedPath.startsWith('#') ? '' : '/';
3293
+ return `${prefix}${normalizedPath}${query ? `?${query}` : ''}`;
3294
+ }
3295
+
2942
3296
  function DInputPhone(_a, ref) {
2943
3297
  var { id: idProp, style, className, label = '', disabled = false, loading = false, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle, iconEnd, iconEndDisabled, iconEndFamilyClass, iconEndFamilyPrefix, iconEndAriaLabel, iconEndTabIndex, iconEndMaterialStyle, hint, size, invalid = false, valid = false, floatingLabel = false, inputEnd, value, placeholder = '', dataAttributes, onChange, onIconEndClick, countrySelectorProps, filteredCountries, defaultCountry = 'cl' } = _a, inputProps = tslib.__rest(_a, ["id", "style", "className", "label", "disabled", "loading", "iconFamilyClass", "iconFamilyPrefix", "iconMaterialStyle", "iconEnd", "iconEndDisabled", "iconEndFamilyClass", "iconEndFamilyPrefix", "iconEndAriaLabel", "iconEndTabIndex", "iconEndMaterialStyle", "hint", "size", "invalid", "valid", "floatingLabel", "inputEnd", "value", "placeholder", "dataAttributes", "onChange", "onIconEndClick", "countrySelectorProps", "filteredCountries", "defaultCountry"]);
2944
3298
  const innerRef = useProvidedRefOrCreate(ref);
2945
3299
  const innerId = React.useId();
2946
3300
  const id = React.useMemo(() => idProp || innerId, [idProp, innerId]);
3301
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
2947
3302
  const handleOnIconEndClick = React.useCallback(() => {
2948
3303
  onIconEndClick === null || onIconEndClick === void 0 ? void 0 : onIconEndClick(value);
2949
3304
  }, [onIconEndClick, value]);
@@ -3017,7 +3372,7 @@ function DInputPhone(_a, ref) {
3017
3372
  [`input-group-${size}`]: !!size,
3018
3373
  'input-group': true,
3019
3374
  'has-validation': invalid || valid,
3020
- }), children: [jsxRuntime.jsx(reactInternationalPhone.CountrySelector, Object.assign({}, countrySelectorProps, { selectedCountry: country.iso2, onSelect: ({ iso2 }) => setCountry(iso2), countries: countries, disabled: disabled || loading, className: classNames('input-group-text', countrySelectorProps === null || countrySelectorProps === void 0 ? void 0 : countrySelectorProps.className) })), dynamicComponent, (iconEnd && !loading) && (jsxRuntime.jsx("button", { type: "button", className: "input-group-text", id: `${id}End`, onClick: handleOnIconEndClick, disabled: disabled || loading || iconEndDisabled, "aria-label": iconEndAriaLabel, tabIndex: onIconEndClick ? iconEndTabIndex : -1, children: jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }) })), loading && (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}Loading`, children: jsxRuntime.jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsxRuntime.jsx("span", { className: "visually-hidden", children: "Loading..." }) }) })), !!inputEnd && (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}InputEnd`, children: inputEnd }))] }), hint && (jsxRuntime.jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
3375
+ }), children: [jsxRuntime.jsx(reactInternationalPhone.CountrySelector, Object.assign({}, countrySelectorProps, { selectedCountry: country.iso2, onSelect: ({ iso2 }) => setCountry(iso2), countries: countries, disabled: disabled || loading, className: classNames('input-group-text', countrySelectorProps === null || countrySelectorProps === void 0 ? void 0 : countrySelectorProps.className) })), dynamicComponent, (iconEnd && !loading) && (jsxRuntime.jsx("button", { type: "button", className: "input-group-text", id: `${id}End`, onClick: handleOnIconEndClick, disabled: disabled || loading || iconEndDisabled, "aria-label": iconEndAriaLabel, tabIndex: onIconEndClick ? iconEndTabIndex : -1, children: jsxRuntime.jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass !== null && iconEndFamilyClass !== void 0 ? iconEndFamilyClass : familyClass, familyPrefix: iconEndFamilyPrefix !== null && iconEndFamilyPrefix !== void 0 ? iconEndFamilyPrefix : familyPrefix, materialStyle: iconEndMaterialStyle !== null && iconEndMaterialStyle !== void 0 ? iconEndMaterialStyle : materialStyle }) })), loading && (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}Loading`, children: jsxRuntime.jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsxRuntime.jsx("span", { className: "visually-hidden", children: "Loading..." }) }) })), !!inputEnd && (jsxRuntime.jsx("div", { className: "input-group-text", id: `${id}InputEnd`, children: inputEnd }))] }), hint && (jsxRuntime.jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
3021
3376
  }
3022
3377
  const ForwardedDInputPhone = React.forwardRef(DInputPhone);
3023
3378
  ForwardedDInputPhone.displayName = 'DInputPhone';
@@ -3619,6 +3974,59 @@ function DConfirmModalContainer({ nodeId }) {
3619
3974
  return reactDom.createPortal(jsxRuntime.jsx(framerMotion.AnimatePresence, { children: entries.map((entry) => (jsxRuntime.jsxs(framerMotion.motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0, transition: { delay: 0.3 } }, transition: { duration: 0.15, ease: 'linear' }, children: [jsxRuntime.jsx("div", { className: "backdrop backdrop-confirm-modal", onClick: entry.onCloseAction, role: "presentation" }), jsxRuntime.jsx(DConfirmModalUI, { entry: entry })] }, entry.id))) }), portalNode);
3620
3975
  }
3621
3976
 
3977
+ /**
3978
+ * The lucide-react icons Dynamic UI renders on its own, without the consumer
3979
+ * asking for them by name.
3980
+ *
3981
+ * Two sources feed this list:
3982
+ *
3983
+ * - The `iconMap` defaults of `DContextProvider` (`src/contexts/DContext.tsx`),
3984
+ * used by close buttons, chevrons, alert states, input adornments and the
3985
+ * stepper checkmark.
3986
+ * - Names hard-coded in component JSX or in a prop default, such as
3987
+ * `DDropdown`'s toggle or `DVoucher`'s action buttons.
3988
+ *
3989
+ * Any bundler-level optimisation that narrows lucide-react down to the icons a
3990
+ * widget actually uses must keep this set, or Dynamic UI components break for
3991
+ * reasons the widget author cannot see in their own source. That is why the
3992
+ * list ships in the package as `dist/icons-core.json` and is exported here.
3993
+ *
3994
+ * `src/icons/coreIcons.spec.ts` scans `src/components/**` and fails when an
3995
+ * internally used icon name is missing from this list or absent from
3996
+ * lucide-react, so the two cannot drift apart.
3997
+ */
3998
+ const CORE_LUCIDE_ICONS = [
3999
+ // iconMap defaults — src/contexts/DContext.tsx
4000
+ 'AlertCircle',
4001
+ 'AlertTriangle',
4002
+ 'Calendar',
4003
+ 'Check',
4004
+ 'CheckCircle',
4005
+ 'ChevronDown',
4006
+ 'ChevronLeft',
4007
+ 'ChevronRight',
4008
+ 'ChevronUp',
4009
+ 'Eye',
4010
+ 'EyeOff',
4011
+ 'Info',
4012
+ 'Minus',
4013
+ 'Plus',
4014
+ 'Search',
4015
+ 'Upload',
4016
+ 'X',
4017
+ // Hard-coded in component JSX or in a prop default
4018
+ 'Circle',
4019
+ 'CircleCheck',
4020
+ 'CircleCheckBig',
4021
+ 'Download',
4022
+ 'FileText',
4023
+ 'MoreVertical',
4024
+ 'Paperclip',
4025
+ 'RefreshCw',
4026
+ 'Share2',
4027
+ 'Trash',
4028
+ ];
4029
+
3622
4030
  Object.defineProperty(exports, "getErrorMessage", {
3623
4031
  enumerable: true,
3624
4032
  get: function () { return reactErrorBoundary.getErrorMessage; }
@@ -3627,6 +4035,7 @@ Object.defineProperty(exports, "useErrorBoundary", {
3627
4035
  enumerable: true,
3628
4036
  get: function () { return reactErrorBoundary.useErrorBoundary; }
3629
4037
  });
4038
+ exports.CORE_LUCIDE_ICONS = CORE_LUCIDE_ICONS;
3630
4039
  exports.DAlert = DAlert;
3631
4040
  exports.DAvatar = DAvatar;
3632
4041
  exports.DBadge = DBadge;
@@ -3696,12 +4105,14 @@ exports.DVoucher = DVoucher;
3696
4105
  exports.EmptyState = EmptyState;
3697
4106
  exports.ErrorState = ErrorState;
3698
4107
  exports.LoadingState = LoadingState;
4108
+ exports.buildUrl = buildUrl;
3699
4109
  exports.changeQueryString = changeQueryString;
3700
4110
  exports.checkMediaQuery = checkMediaQuery;
3701
4111
  exports.configureI18n = configureI8n;
3702
4112
  exports.formatCurrency = formatCurrency;
3703
4113
  exports.getCssVariable = getCssVariable;
3704
4114
  exports.getQueryString = getQueryString;
4115
+ exports.sanitizeHref = sanitizeHref;
3705
4116
  exports.subscribeToMediaQuery = subscribeToMediaQuery;
3706
4117
  exports.useConfirmModal = useConfirmModal;
3707
4118
  exports.useCountdown = useCountdown;