@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.esm.js CHANGED
@@ -25,6 +25,16 @@ import i18n from 'i18next';
25
25
  import { initReactI18next } from 'react-i18next';
26
26
 
27
27
  const PREFIX_BS = 'bs-';
28
+ /**
29
+ * Default icon-font family configured by `DContextProvider`.
30
+ *
31
+ * `DIconBase` compares the family it receives against these values to tell an
32
+ * unconfigured consumer apart from one that deliberately opted into an icon
33
+ * font (Material Symbols, Bootstrap Icons). Only the former gets the
34
+ * development warning for an unresolved icon name.
35
+ */
36
+ const DEFAULT_ICON_FAMILY_CLASS = 'bi';
37
+ const DEFAULT_ICON_FAMILY_PREFIX = 'bi-';
28
38
 
29
39
  /* eslint-disable no-lonely-if */
30
40
  function useDisableBodyScrollEffect(disable) {
@@ -306,8 +316,8 @@ const DEFAULT_STATE = {
306
316
  decimal: '.',
307
317
  },
308
318
  icon: {
309
- familyClass: 'bi',
310
- familyPrefix: 'bi-',
319
+ familyClass: DEFAULT_ICON_FAMILY_CLASS,
320
+ familyPrefix: DEFAULT_ICON_FAMILY_PREFIX,
311
321
  materialStyle: false,
312
322
  },
313
323
  iconRegistry: undefined,
@@ -412,6 +422,79 @@ function useDContext() {
412
422
  return useContext(DContext);
413
423
  }
414
424
 
425
+ /**
426
+ * Resolves a string icon name against the registry supplied through
427
+ * `DContextProvider`'s `iconRegistry` prop.
428
+ *
429
+ * This is the single implementation shared by `DIcon` and `DIconBase`, so both
430
+ * public entry points — and every Dynamic UI component that renders an icon
431
+ * through them — resolve names identically.
432
+ *
433
+ * A non-string `icon` is returned untouched: a component passed directly needs
434
+ * no lookup. A name missing from the registry is also returned untouched, so
435
+ * the caller can fall through to lucide-react and then to the icon-font family.
436
+ */
437
+ function resolveIconFromRegistry(icon, iconRegistry) {
438
+ if (typeof icon !== 'string')
439
+ return icon;
440
+ return (iconRegistry === null || iconRegistry === void 0 ? void 0 : iconRegistry[icon]) || icon;
441
+ }
442
+
443
+ /**
444
+ * Names already reported, so a name repeated across renders or across many
445
+ * instances only warns once per page load.
446
+ */
447
+ const warnedIconNames = new Set();
448
+ /**
449
+ * True when the icon-font family is the one `DContextProvider` defaults to.
450
+ *
451
+ * The warning is limited to that case so a consumer who configured a different
452
+ * font — Material Symbols, for instance — is not told about names that font
453
+ * resolves perfectly well.
454
+ *
455
+ * It cannot tell "never configured a font" apart from "configured exactly the
456
+ * defaults", and those defaults are also the standard Bootstrap Icons setup, so
457
+ * a consumer who deliberately uses Bootstrap Icons is warned too. The message
458
+ * says so; silencing that case would need a new context flag, which is beyond
459
+ * what this helper should decide.
460
+ */
461
+ function isDefaultIconFamily(familyClass, familyPrefix) {
462
+ return familyClass === DEFAULT_ICON_FAMILY_CLASS
463
+ && familyPrefix === DEFAULT_ICON_FAMILY_PREFIX;
464
+ }
465
+ /**
466
+ * Warns, once per name and only outside production builds, that an icon name
467
+ * resolved to neither the registry nor lucide-react and is falling back to the
468
+ * default icon font, which this package no longer ships.
469
+ *
470
+ * Whether that fallback renders depends on the host app: if it loads the font
471
+ * itself the `<i>` shows the glyph, and if it does not, nothing appears. The
472
+ * message states both possibilities instead of assuming the second.
473
+ *
474
+ * The `process.env.NODE_ENV` guard is what bundlers constant-fold, so the whole
475
+ * call — and this module — drops out of a consumer's production bundle.
476
+ */
477
+ function warnUnknownIcon(name, familyClass, familyPrefix) {
478
+ if (!isDefaultIconFamily(familyClass, familyPrefix))
479
+ return;
480
+ if (warnedIconNames.has(name))
481
+ return;
482
+ warnedIconNames.add(name);
483
+ const fallbackClass = `${DEFAULT_ICON_FAMILY_CLASS} ${DEFAULT_ICON_FAMILY_PREFIX}${name}`;
484
+ // eslint-disable-next-line no-console
485
+ console.warn(`[Dynamic UI] Icon "${name}" is not in the icon registry and is not a `
486
+ + 'lucide-react export, so it falls back to the default icon font: '
487
+ + `<i class="${fallbackClass}">. That renders only if your app loads that `
488
+ + 'font, which this package stopped shipping in v2.0.0. '
489
+ + 'If the icon is missing, pass a PascalCase lucide-react name such as '
490
+ + '"Home", or register the component with '
491
+ + '<DContextProvider iconRegistry={{ MyIcon }}>. '
492
+ + `If you use the "${DEFAULT_ICON_FAMILY_CLASS}" font on purpose, this is a `
493
+ + 'false positive: the warning fires whenever the configured family equals '
494
+ + 'the package default, which is also the standard Bootstrap Icons setup. '
495
+ + 'It never appears in production builds.');
496
+ }
497
+
415
498
  function subscribeToMediaQuery(query, callback) {
416
499
  const mediaQueryList = window.matchMedia(query);
417
500
  mediaQueryList.addEventListener('change', callback);
@@ -501,7 +584,31 @@ function useResponsiveProp(useListener = false) {
501
584
  function isIconComponent(value) {
502
585
  return typeof value !== 'string' && isValidElementType(value);
503
586
  }
504
- function DIconBase({ icon, color, style, className, size, useListenerSize = false, hasCircle = false, materialStyle = false, familyClass, familyPrefix, strokeWidth = 2, dataAttributes, }) {
587
+ /**
588
+ * Renders an icon, resolving the `icon` prop in this order:
589
+ *
590
+ * 1. **Icon registry** — a string name found in `DContextProvider`'s
591
+ * `iconRegistry` renders the component registered under it. A component
592
+ * passed directly skips this step and renders as-is.
593
+ * 2. **lucide-react** — a PascalCase name exported by lucide-react renders that
594
+ * icon. When `materialStyle` is on, this step is skipped and the name is
595
+ * emitted as the text content of the icon-font element instead.
596
+ * 3. **Icon-font family** — anything left over renders as
597
+ * `<i class="{familyClass} {familyPrefix}{name}">`, the legacy path for
598
+ * Material Symbols and Bootstrap Icons. Outside production builds, a name
599
+ * that reaches this step while the family is still the package default logs
600
+ * a one-time warning.
601
+ *
602
+ * A name that resolves nowhere and has no family configured renders `?`.
603
+ *
604
+ * Every path is hidden from the accessibility tree by default (`aria-hidden`),
605
+ * since icons are overwhelmingly decorative. See `ariaHidden` / `ariaLabel` to
606
+ * override that for an icon that carries meaning on its own.
607
+ */
608
+ function DIconBase({ icon: iconProp, color, style, className, size, useListenerSize = false, hasCircle = false, materialStyle = false, familyClass, familyPrefix, strokeWidth = 2, ariaHidden, ariaLabel, dataAttributes, }) {
609
+ const { iconRegistry } = useDContext();
610
+ // The registry wins over every other source, including Material icons.
611
+ const icon = resolveIconFromRegistry(iconProp, iconRegistry);
505
612
  // If materialStyle is true, use Material Design icons (legacy)
506
613
  const isStringIcon = typeof icon === 'string';
507
614
  const useMaterialIcons = materialStyle && isStringIcon;
@@ -523,6 +630,61 @@ function DIconBase({ icon, color, style, className, size, useListenerSize = fals
523
630
  }, [responsivePropValue, size]);
524
631
  const generateStyleVariables = 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]);
525
632
  const generateClasses = 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]);
633
+ /**
634
+ * Decorative by default. `ariaHidden` and `ariaLabel` are not symmetric:
635
+ * hiding is absolute, so `ariaHidden` wins over a name, but `ariaHidden={false}`
636
+ * and `ariaLabel` agree — both expose the icon — and the name is honoured.
637
+ */
638
+ const accessibilityProps = useMemo(() => {
639
+ // Hiding is absolute: it wins over a name.
640
+ if (ariaHidden === true)
641
+ return { 'aria-hidden': true };
642
+ // A name exposes the icon, which is also what `ariaHidden={false}` asks for.
643
+ if (ariaLabel)
644
+ return { role: 'img', 'aria-label': ariaLabel };
645
+ // Exposed with no name: an explicit opt-out of the default, warned about below.
646
+ if (ariaHidden === false)
647
+ return {};
648
+ return { 'aria-hidden': true };
649
+ }, [ariaHidden, ariaLabel]);
650
+ /**
651
+ * `dataAttributes` is typed to `data-*`, but casting through it was the only
652
+ * way to reach the DOM before `ariaHidden` existed, so it still wins over the
653
+ * computed values — and therefore decides the effective state below.
654
+ */
655
+ const domAttributes = useMemo(() => (Object.assign(Object.assign({}, accessibilityProps), dataAttributes)), [accessibilityProps, dataAttributes]);
656
+ /**
657
+ * lucide-react hides its own `<svg>` unless it receives an a11y prop, and a
658
+ * registry component may do the same, which would keep the graphic out of the
659
+ * tree even when this wrapper is not hidden. Only matters when the icon is
660
+ * exposed without a name: under `role="img"` the wrapper is a leaf, so a
661
+ * hidden child changes nothing.
662
+ *
663
+ * A registry component that hardcodes `aria-hidden` on its own `<svg>` instead
664
+ * of spreading props still wins — nothing here can reach inside it.
665
+ */
666
+ const isExposedWithoutName = useMemo(() => {
667
+ const attributes = domAttributes;
668
+ const hidden = attributes['aria-hidden'];
669
+ return hidden !== true && hidden !== 'true' && !attributes.role;
670
+ }, [domAttributes]);
671
+ /**
672
+ * Diagnostics read the effective state, so a `dataAttributes` override that
673
+ * hides the icon after all is not reported as exposing it. Memoised like the
674
+ * values above, so re-rendering with the same props does not repeat them.
675
+ */
676
+ useMemo(() => {
677
+ if (process.env.NODE_ENV === 'production')
678
+ return;
679
+ if (ariaHidden === true && ariaLabel) {
680
+ // eslint-disable-next-line no-console
681
+ console.warn(`DIcon: ariaLabel "${ariaLabel}" is ignored because ariaHidden is true. Drop ariaHidden to expose the name.`);
682
+ }
683
+ if (ariaHidden === false && isExposedWithoutName) {
684
+ // eslint-disable-next-line no-console
685
+ console.warn('DIcon: ariaHidden={false} without an ariaLabel exposes an unnamed graphic to assistive technology. Pass ariaLabel to name it.');
686
+ }
687
+ }, [ariaHidden, ariaLabel, isExposedWithoutName]);
526
688
  const iconSize = useMemo(() => {
527
689
  if (resolvedSize) {
528
690
  const numSize = parseInt(resolvedSize, 10);
@@ -532,43 +694,46 @@ function DIconBase({ icon, color, style, className, size, useListenerSize = fals
532
694
  }, [resolvedSize]);
533
695
  // Render Material Design icon (legacy support)
534
696
  if (useMaterialIcons) {
535
- return (jsx("i", Object.assign({ className: classNames(generateClasses, familyClass), style: generateStyleVariables }, dataAttributes, { children: isStringIcon ? icon : null })));
697
+ return (jsx("i", Object.assign({ className: classNames(generateClasses, familyClass), style: generateStyleVariables }, domAttributes, { children: isStringIcon ? icon : null })));
536
698
  }
537
699
  if (isIconComponent(icon)) {
538
- return (jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, dataAttributes, { children: createElement(icon, {
539
- width: resolvedSize || 24,
540
- height: resolvedSize || 24,
541
- strokeWidth,
542
- }) })));
700
+ return (jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, domAttributes, { children: createElement(icon, Object.assign({ width: resolvedSize || 24, height: resolvedSize || 24, strokeWidth }, isExposedWithoutName && { 'aria-hidden': false })) })));
543
701
  }
544
702
  // Render Lucide icon
545
703
  if (!LucideIcon) {
546
- if (isStringIcon && familyClass && familyPrefix) {
547
- return (jsx("i", Object.assign({ className: classNames(generateClasses, familyClass, `${familyPrefix}${icon}`), style: generateStyleVariables }, dataAttributes)));
704
+ if (typeof icon === 'string' && familyClass && familyPrefix) {
705
+ if (process.env.NODE_ENV !== 'production') {
706
+ warnUnknownIcon(icon, familyClass, familyPrefix);
707
+ }
708
+ return (jsx("i", Object.assign({ className: classNames(generateClasses, familyClass, `${familyPrefix}${icon}`), style: generateStyleVariables }, domAttributes)));
548
709
  }
549
710
  // eslint-disable-next-line no-console
550
711
  console.warn(`Icon "${String(icon)}" not found in Lucide. Make sure to use PascalCase names (e.g., "Home", "User", "Settings")`);
551
- return (jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, dataAttributes, { children: "?" })));
712
+ return (jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, domAttributes, { children: "?" })));
552
713
  }
553
- return (jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, dataAttributes, { children: jsx(LucideIcon, { size: iconSize || 24, strokeWidth: strokeWidth }) })));
714
+ return (jsx("span", Object.assign({ className: classNames(generateClasses), style: generateStyleVariables }, domAttributes, { children: jsx(LucideIcon, Object.assign({ size: iconSize || 24, strokeWidth: strokeWidth }, isExposedWithoutName && { 'aria-hidden': false })) })));
554
715
  }
555
716
 
717
+ /**
718
+ * Thin wrapper over `DIconBase` that fills the icon-font configuration
719
+ * (`familyClass`, `familyPrefix`, `materialStyle`) from `DContextProvider`
720
+ * whenever the caller does not pass it explicitly.
721
+ *
722
+ * Name resolution itself — registry, then lucide-react, then the icon-font
723
+ * family — lives in `DIconBase`, so both components behave identically.
724
+ */
556
725
  function DIcon(_a) {
557
726
  var { icon, familyClass: propFamilyClass, familyPrefix: propFamilyPrefix, materialStyle: propMaterialStyle } = _a, props = __rest(_a, ["icon", "familyClass", "familyPrefix", "materialStyle"]);
558
- const { icon: { familyClass, familyPrefix, materialStyle, }, iconRegistry, } = useDContext();
559
- const registryIcon = typeof icon === 'string'
560
- ? iconRegistry === null || iconRegistry === void 0 ? void 0 : iconRegistry[icon]
561
- : undefined;
562
- const resolvedIcon = registryIcon || icon;
563
- return (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)));
727
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
728
+ return (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)));
564
729
  }
565
730
 
566
- function DAlert({ color = 'success', icon: iconProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle = false, iconClose: iconCloseProp, iconCloseFamilyClass, iconCloseFamilyPrefix, iconCloseMaterialStyle = false, showClose, onClose, children, id, className, style, dataAttributes, }) {
567
- const { iconMap: { alert, xLg, }, } = useDContext();
731
+ function DAlert({ color = 'success', icon: iconProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle, iconClose: iconCloseProp, iconCloseFamilyClass, iconCloseFamilyPrefix, iconCloseMaterialStyle, showClose, onClose, children, id, className, style, dataAttributes, }) {
732
+ const { icon: { materialStyle, familyClass, familyPrefix, }, iconMap: { alert, xLg, }, } = useDContext();
568
733
  const icon = useMemo(() => iconProp || alert[color], [alert, iconProp, color]);
569
734
  const iconClose = useMemo(() => (iconCloseProp || xLg), [iconCloseProp, xLg]);
570
735
  const generateClasses = useMemo(() => (Object.assign({ alert: true, [`alert-${color}`]: true, 'fade show': !!showClose }, className && { [className]: true })), [color, showClose, className]);
571
- return (jsxs("div", Object.assign({ className: classNames(generateClasses), style: style, role: "alert", id: id }, dataAttributes, { children: [icon && (jsx(DIcon, { className: "alert-icon", icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })), jsx("div", { className: "alert-text", children: children }), showClose && (jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: jsx(DIcon, { icon: iconClose, familyClass: iconCloseFamilyClass, familyPrefix: iconCloseFamilyPrefix, materialStyle: iconCloseMaterialStyle }) }))] })));
736
+ return (jsxs("div", Object.assign({ className: classNames(generateClasses), style: style, role: "alert", id: id }, dataAttributes, { children: [icon && (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 })), jsx("div", { className: "alert-text", children: children }), showClose && (jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: 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 }) }))] })));
572
737
  }
573
738
 
574
739
  function DAvatar({ id, size, image, name: nameProp, useNameAsInitials = false, className, style, dataAttributes, }) {
@@ -590,6 +755,7 @@ function DAvatar({ id, size, image, name: nameProp, useNameAsInitials = false, c
590
755
 
591
756
  function DBadge(props) {
592
757
  const { text, soft = false, color = 'primary', id, rounded, className, size, style, iconStart, iconEnd, iconMaterialStyle, iconFamilyClass, iconFamilyPrefix, dataAttributes, } = props;
758
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
593
759
  // Responsive size resolution using useResponsiveProp
594
760
  const { responsivePropValue } = useResponsiveProp(true);
595
761
  const resolvedSize = useMemo(() => {
@@ -606,7 +772,7 @@ function DBadge(props) {
606
772
  'rounded-pill': !!rounded,
607
773
  [`badge-${resolvedSize}`]: !!resolvedSize,
608
774
  }), [rounded, soft, color, resolvedSize]);
609
- return (jsxs("span", Object.assign({ className: classNames(generateClasses, className), style: style }, id && { id }, dataAttributes, { children: [iconStart && (jsx(DIcon, { icon: iconStart, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })), jsx("span", { children: text }), iconEnd && (jsx(DIcon, { icon: iconEnd, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle }))] })));
775
+ return (jsxs("span", Object.assign({ className: classNames(generateClasses, className), style: style }, id && { id }, dataAttributes, { children: [iconStart && (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 })), jsx("span", { children: text }), iconEnd && (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 }))] })));
610
776
  }
611
777
 
612
778
  function DBox({ className, style, children, dataAttributes, }) {
@@ -638,6 +804,7 @@ function DInput(_a, ref) {
638
804
  const inputRef = useProvidedRefOrCreate(ref);
639
805
  const innerId = useId();
640
806
  const id = useMemo(() => idProp || innerId, [idProp, innerId]);
807
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
641
808
  const handleOnChange = useCallback((event) => {
642
809
  onChange === null || onChange === void 0 ? void 0 : onChange(event.currentTarget.value);
643
810
  }, [onChange]);
@@ -700,7 +867,7 @@ function DInput(_a, ref) {
700
867
  [`input-group-${size}`]: !!size,
701
868
  'input-group': true,
702
869
  'has-validation': invalid || valid,
703
- }), children: [!!inputStart && (jsx("div", { className: "input-group-text", id: `${id}InputStart`, children: inputStart })), iconStart && (onIconStartClick ? (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: jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle }) })) : (jsx("div", { className: "input-group-text", id: `${id}Start`, "aria-hidden": "true", tabIndex: -1, children: jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle }) }))), dynamicComponent, (iconEnd && !loading) && (onIconEndClick ? (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: jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }) })) : (jsx("div", { className: "input-group-text", id: `${id}End`, "aria-hidden": "true", tabIndex: -1, children: jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }) }))), loading && (jsx("div", { className: "input-group-text", id: `${id}Loading`, children: jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", "data-testid": "loading-spinner", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }) })), !!inputEnd && (jsx("div", { className: "input-group-text", id: `${id}InputEnd`, children: inputEnd }))] }), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
870
+ }), children: [!!inputStart && (jsx("div", { className: "input-group-text", id: `${id}InputStart`, children: inputStart })), iconStart && (onIconStartClick ? (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: 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 }) })) : (jsx("div", { className: "input-group-text", id: `${id}Start`, tabIndex: -1, children: 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 ? (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: 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 }) })) : (jsx("div", { className: "input-group-text", id: `${id}End`, tabIndex: -1, children: 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 && (jsx("div", { className: "input-group-text", id: `${id}Loading`, children: jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", "data-testid": "loading-spinner", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }) })), !!inputEnd && (jsx("div", { className: "input-group-text", id: `${id}InputEnd`, children: inputEnd }))] }), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
704
871
  }
705
872
  const ForwardedDInput = forwardRef(DInput);
706
873
  ForwardedDInput.displayName = 'DInput';
@@ -1096,7 +1263,7 @@ function useDBoxFile(props) {
1096
1263
 
1097
1264
  function DBoxFile(_a) {
1098
1265
  var { icon: iconProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle, children, className, style, dataAttributes } = _a, props = __rest(_a, ["icon", "iconFamilyClass", "iconFamilyPrefix", "iconMaterialStyle", "children", "className", "style", "dataAttributes"]);
1099
- const { iconMap: { upload } } = useDContext();
1266
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { upload }, } = useDContext();
1100
1267
  const icon = useMemo(() => iconProp || upload, [iconProp, upload]);
1101
1268
  const { inputRef, rootRef, isDragValid, isDragInvalid, acceptAttr, files, handleFileSelect, handleDrop, handleDragEnter, handleDragLeave, handleClick, handleKeyDown, handleRemoveFile, openFileDialog, } = useDBoxFile(props);
1102
1269
  return (jsxs(Fragment, { children: [jsx("section", Object.assign({ className: classNames('d-box-file', {
@@ -1104,13 +1271,14 @@ function DBoxFile(_a) {
1104
1271
  'd-box-file-disabled': props.disabled,
1105
1272
  'd-box-file-valid': isDragValid,
1106
1273
  'd-box-file-invalid': isDragInvalid,
1107
- }, className), style: style }, dataAttributes, { children: 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: [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 && (jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })), jsx("div", { className: "d-box-content", children: typeof children === 'function'
1274
+ }, className), style: style }, dataAttributes, { children: 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: [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 && (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 })), jsx("div", { className: "d-box-content", children: typeof children === 'function'
1108
1275
  ? children(openFileDialog)
1109
1276
  : children || (jsx("p", { className: "d-box-file-empty-text", children: "Drag and drop some files here, or click to select files" })) })] })) })), !!files.length && (jsx("ul", { className: "d-box-files", children: files.map((file, index) => (jsx(ForwardedDInput, { value: file.name, iconStart: "Paperclip", iconEnd: "Trash", readOnly: true, onIconEndClick: () => handleRemoveFile(index) }, `${file.name} ${index}`))) }))] }));
1110
1277
  }
1111
1278
 
1112
1279
  const DButton = forwardRef((props, ref) => {
1113
1280
  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 = __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']);
1281
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
1114
1282
  // Responsive size resolution using useResponsiveProp
1115
1283
  const { responsivePropValue } = useResponsiveProp(true);
1116
1284
  const resolvedSize = useMemo(() => {
@@ -1164,7 +1332,7 @@ const DButton = forwardRef((props, ref) => {
1164
1332
  ref.current = node;
1165
1333
  }, className: classNames(classes, className), style: Object.assign(Object.assign({}, style), (loading && buttonWidth
1166
1334
  ? { minWidth: `${buttonWidth}px` }
1167
- : undefined)), "aria-label": ariaLabel, "aria-busy": loading, "aria-disabled": isDisabled, onClick: handleClick }, dataAttributes, { children: [loading && (jsxs("span", { className: "btn-loading", children: [jsx("span", { className: "spinner-border spinner-border-sm", "aria-hidden": "true" }), loadingText && jsx("span", { role: "status", children: loadingText })] })), !loading && (jsxs(Fragment, { children: [iconStart && (jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle })), content, iconEnd && (jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }))] }))] })));
1335
+ : undefined)), "aria-label": ariaLabel, "aria-busy": loading, "aria-disabled": isDisabled, onClick: handleClick }, dataAttributes, { children: [loading && (jsxs("span", { className: "btn-loading", children: [jsx("span", { className: "spinner-border spinner-border-sm", "aria-hidden": "true" }), loadingText && jsx("span", { role: "status", children: loadingText })] })), !loading && (jsxs(Fragment, { children: [iconStart && (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 && (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 }))] }))] })));
1168
1336
  }
1169
1337
  return (jsxs("button", Object.assign({ ref: (node) => {
1170
1338
  buttonRef.current = node;
@@ -1178,12 +1346,51 @@ const DButton = forwardRef((props, ref) => {
1178
1346
  // eslint-disable-next-line react/button-has-type
1179
1347
  type: type, className: classNames(classes, className), style: Object.assign(Object.assign({}, style), (loading && buttonWidth
1180
1348
  ? { minWidth: `${buttonWidth}px` }
1181
- : undefined)), disabled: isDisabled, "aria-label": ariaLabel, "aria-busy": loading, "aria-disabled": isDisabled, onClick: handleClick }, dataAttributes, rest, { children: [loading && (jsxs("span", { className: "btn-loading", children: [jsx("span", { className: "spinner-border spinner-border-sm", "aria-hidden": "true" }), loadingText && jsx("span", { role: "status", children: loadingText })] })), !loading && (jsxs(Fragment, { children: [iconStart && (jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle })), content, iconEnd && (jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }))] }))] })));
1349
+ : undefined)), disabled: isDisabled, "aria-label": ariaLabel, "aria-busy": loading, "aria-disabled": isDisabled, onClick: handleClick }, dataAttributes, rest, { children: [loading && (jsxs("span", { className: "btn-loading", children: [jsx("span", { className: "spinner-border spinner-border-sm", "aria-hidden": "true" }), loadingText && jsx("span", { role: "status", children: loadingText })] })), !loading && (jsxs(Fragment, { children: [iconStart && (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 && (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 }))] }))] })));
1182
1350
  });
1183
1351
  DButton.displayName = 'DButton';
1184
1352
 
1353
+ /**
1354
+ * Controls already reported, keyed by kind and icon, so the same unlabelled one
1355
+ * only warns once per page load however often it re-renders or however many
1356
+ * instances exist.
1357
+ */
1358
+ const warnedControls = new Set();
1359
+ /**
1360
+ * Warns, once per icon and only outside production builds, that an icon-only
1361
+ * button has no accessible name.
1362
+ *
1363
+ * The control has no text to fall back on and its icon is hidden from the
1364
+ * accessibility tree, so the name has to be given explicitly. `aria-label` is
1365
+ * the direct way; on a button `aria-labelledby` and `title` count too, since
1366
+ * `rest` reaches the DOM there, while an anchor drops them — hence `kind`, so
1367
+ * the advice matches what the element can actually receive.
1368
+ *
1369
+ * A legacy icon-font icon used to leak its ligature as the name by accident —
1370
+ * never a good one, being unlocalised and often meaningless ("more_vert") — and
1371
+ * no longer does, so the omission is now visible instead of silent.
1372
+ *
1373
+ * The `process.env.NODE_ENV` guard is what bundlers constant-fold, so the whole
1374
+ * call — and this module — drops out of a consumer's production bundle.
1375
+ */
1376
+ function warnMissingAccessibleName(icon, kind) {
1377
+ const key = `${kind}:${icon}`;
1378
+ if (warnedControls.has(key))
1379
+ return;
1380
+ warnedControls.add(key);
1381
+ const alternatives = kind === 'button'
1382
+ ? 'On a button, aria-labelledby or title work too. '
1383
+ : 'A link renders from the href branch, which does not forward aria-labelledby or title, so aria-label is the only option. ';
1384
+ // eslint-disable-next-line no-console
1385
+ console.warn(`[Dynamic UI] DButtonIcon: the "${icon}" ${kind} has no accessible name. `
1386
+ + 'Pass aria-label, since an icon-only control has no text to fall back on '
1387
+ + `and its icon is hidden from the accessibility tree. ${alternatives}`
1388
+ + 'It never appears in production builds.');
1389
+ }
1390
+
1185
1391
  function DButtonIcon(_a) {
1186
1392
  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 = __rest(_a, ["id", "icon", "size", "className", "variant", "state", "loadingAriaLabel", "iconMaterialStyle", "disabled", "color", "loading", "href", "target", "rel", "stopPropagationEnabled", "style", "iconFamilyClass", "iconFamilyPrefix", "dataAttributes", "onClick", 'aria-label']);
1393
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
1187
1394
  const generateClasses = useMemo(() => {
1188
1395
  const variantClass = !variant || variant === 'solid'
1189
1396
  ? `btn-${color}`
@@ -1204,14 +1411,23 @@ function DButtonIcon(_a) {
1204
1411
  const ariaLabel = useMemo(() => (loading
1205
1412
  ? loadingAriaLabel || ariaLabelProp
1206
1413
  : ariaLabelProp), [loading, loadingAriaLabel, ariaLabelProp]);
1414
+ /**
1415
+ * `aria-labelledby` and `title` also name a control, but they travel in `rest`,
1416
+ * which only the button branch spreads — an anchor drops them, so there the
1417
+ * button really is unnamed and the warning still applies.
1418
+ */
1419
+ const hasAccessibleName = useMemo(() => !!ariaLabel || (!href && (!!rest['aria-labelledby'] || !!rest.title)), [ariaLabel, href, rest]);
1420
+ if (process.env.NODE_ENV !== 'production' && !hasAccessibleName) {
1421
+ warnMissingAccessibleName(icon, href ? 'link' : 'button');
1422
+ }
1207
1423
  if (href) {
1208
1424
  return (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
1209
1425
  ? (jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }))
1210
- : (jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })) })));
1426
+ : (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 })) })));
1211
1427
  }
1212
1428
  return (jsx("button", Object.assign({ className: classNames(generateClasses, className), style: style, disabled: state === 'disabled' || loading, onClick: clickHandler, "aria-label": ariaLabel }, dataAttributes, rest, { children: loading
1213
1429
  ? (jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }))
1214
- : (jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })) })));
1430
+ : (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 })) })));
1215
1431
  }
1216
1432
 
1217
1433
  function DCardHeader({ className, style, children, }) {
@@ -1274,12 +1490,12 @@ function DChip({ color = 'primary', text, icon, iconFamilyClass, iconFamilyPrefi
1274
1490
  'd-chip': true,
1275
1491
  [`d-chip-${color}`]: !!color,
1276
1492
  }), [color]);
1277
- const { iconMap: { xLg, }, } = useDContext();
1493
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { xLg, }, } = useDContext();
1278
1494
  const iconClose = useMemo(() => iconCloseProp || xLg, [iconCloseProp, xLg]);
1279
- return (jsxs("span", Object.assign({ className: classNames(generateClasses, className), style: style }, dataAttributes, { children: [icon && (jsx("div", { className: "d-chip-icon-container", children: jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle }) })), jsx("span", { children: text }), showClose && (jsx("button", { type: "button", className: "d-chip-icon-container", onClick: onClose, "aria-label": closeAriaLabel, children: jsx(DIcon, { icon: iconClose, familyClass: iconCloseFamilyClass, familyPrefix: iconCloseFamilyPrefix, materialStyle: iconCloseMaterialStyle }) }))] })));
1495
+ return (jsxs("span", Object.assign({ className: classNames(generateClasses, className), style: style }, dataAttributes, { children: [icon && (jsx("div", { className: "d-chip-icon-container", children: 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 }) })), jsx("span", { children: text }), showClose && (jsx("button", { type: "button", className: "d-chip-icon-container", onClick: onClose, "aria-label": closeAriaLabel, children: 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 }) }))] })));
1280
1496
  }
1281
1497
 
1282
- function DCollapse({ id, className, style, Component, defaultCollapsed = true, onChange, children, iconOpen: iconOpenProp, iconClose: iconCloseProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle = false, dataAttributes, }) {
1498
+ function DCollapse({ id, className, style, Component, defaultCollapsed = true, onChange, children, iconOpen: iconOpenProp, iconClose: iconCloseProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle, dataAttributes, }) {
1283
1499
  const [collapsed, setCollapsed] = useState(defaultCollapsed);
1284
1500
  const onChangeCollapse = () => {
1285
1501
  setCollapsed((prev) => {
@@ -1293,10 +1509,10 @@ function DCollapse({ id, className, style, Component, defaultCollapsed = true, o
1293
1509
  useEffect(() => {
1294
1510
  setCollapsed(defaultCollapsed);
1295
1511
  }, [defaultCollapsed]);
1296
- const { iconMap: { chevronDown, chevronUp, }, } = useDContext();
1512
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { chevronDown, chevronUp, }, } = useDContext();
1297
1513
  const iconOpen = useMemo(() => iconOpenProp || chevronDown, [chevronDown, iconOpenProp]);
1298
1514
  const iconClose = useMemo(() => iconCloseProp || chevronUp, [chevronUp, iconCloseProp]);
1299
- return (jsxs("div", Object.assign({ id: id, className: classNames('collapse-container', className), style: style }, dataAttributes, { children: [jsxs("button", { className: "collapse-button", type: "button", onClick: onChangeCollapse, children: [jsx("div", { className: "flex-grow-1", children: Component }), jsx(DIcon, { color: "primary", size: "1.25rem", icon: collapsed ? iconOpen : iconClose, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })] }), jsx("div", { className: classNames('collapse-body-wrapper', {
1515
+ return (jsxs("div", Object.assign({ id: id, className: classNames('collapse-container', className), style: style }, dataAttributes, { children: [jsxs("button", { className: "collapse-button", type: "button", onClick: onChangeCollapse, children: [jsx("div", { className: "flex-grow-1", children: Component }), 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 })] }), jsx("div", { className: classNames('collapse-body-wrapper', {
1300
1516
  show: !collapsed,
1301
1517
  }), children: jsx("div", { className: "collapse-body", children: children }) })] })));
1302
1518
  }
@@ -2087,9 +2303,9 @@ function DInputCheck(_a) {
2087
2303
  ]);
2088
2304
  useEffect(() => {
2089
2305
  if (innerRef.current) {
2090
- innerRef.current.indeterminate = Boolean(indeterminate);
2306
+ innerRef.current.indeterminate = type === 'checkbox' && Boolean(indeterminate);
2091
2307
  }
2092
- }, [indeterminate]);
2308
+ }, [indeterminate, type]);
2093
2309
  useEffect(() => {
2094
2310
  if (innerRef.current) {
2095
2311
  innerRef.current.checked = checked;
@@ -2282,10 +2498,18 @@ function DInputSelect({ id: idProp, name, label = '', className, style, options
2282
2498
  }), children: [iconStart && (jsx("button", { type: "button", className: "input-group-text", id: `${id}Start`, onClick: iconStartClickHandler, disabled: disabled || loading, "aria-label": iconStartAriaLabel, children: iconStart && (jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix })) })), dynamicComponent, iconEnd && !loading && (jsx("button", { type: "button", className: "input-group-text", id: `${id}End`, onClick: iconEndClickHandler, disabled: disabled || loading, "aria-label": iconEndAriaLabel, children: iconEnd && (jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix })) })), loading && (jsx("div", { className: "input-group-text form-control-icon loading", children: jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }) }))] }), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
2283
2499
  }
2284
2500
 
2285
- function DInputSwitch({ id: idProp, label, ariaLabel, name, checked, disabled, invalid = false, valid = false, readonly, className, style, dataAttributes, inputClassName, onChange, }) {
2501
+ function DInputSwitch({ id: idProp, label, ariaLabel, name, checked, disabled, invalid = false, valid = false, hint, readonly, className, style, dataAttributes, inputClassName, onChange, }) {
2286
2502
  const innerId = useId();
2287
2503
  const id = useMemo(() => idProp || innerId, [idProp, innerId]);
2288
2504
  const [internalIsChecked, setInternalIsChecked] = useState(checked);
2505
+ const ariaDescribedby = useMemo(() => ([
2506
+ !!hint && `${id}Hint`,
2507
+ ]
2508
+ .filter(Boolean)
2509
+ .join(' ')), [
2510
+ id,
2511
+ hint,
2512
+ ]);
2289
2513
  useEffect(() => {
2290
2514
  setInternalIsChecked(checked);
2291
2515
  }, [checked]);
@@ -2294,10 +2518,10 @@ function DInputSwitch({ id: idProp, label, ariaLabel, name, checked, disabled, i
2294
2518
  setInternalIsChecked(value);
2295
2519
  onChange === null || onChange === void 0 ? void 0 : onChange(value);
2296
2520
  }, [onChange]);
2297
- return (jsxs("div", Object.assign({ className: classNames('form-check form-switch', className) }, dataAttributes, { children: [jsx("input", { id: id, name: name, onChange: readonly ? () => false : changeHandler, className: classNames('form-check-input', {
2521
+ return (jsxs("div", Object.assign({ className: classNames('form-check form-switch', className) }, dataAttributes, { children: [jsx("input", Object.assign({ id: id, name: name, onChange: readonly ? () => false : changeHandler, className: classNames('form-check-input', {
2298
2522
  'is-invalid': invalid,
2299
2523
  'is-valid': valid,
2300
- }, inputClassName), style: style, type: "checkbox", role: "switch", checked: internalIsChecked, disabled: disabled, "aria-label": ariaLabel }), label && (jsx("label", { className: "form-check-label", htmlFor: id, children: label }))] })));
2524
+ }, inputClassName), style: style, type: "checkbox", role: "switch", checked: internalIsChecked, disabled: disabled, "aria-label": ariaLabel }, ariaDescribedby && { 'aria-describedby': ariaDescribedby })), label && (jsx("label", { className: "form-check-label", htmlFor: id, children: label })), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
2301
2525
  }
2302
2526
 
2303
2527
  function DInputRange(_a, ref) {
@@ -2338,6 +2562,7 @@ const ForwardedDInputRange = forwardRef(DInputRange);
2338
2562
  ForwardedDInputRange.displayName = 'DInputRange';
2339
2563
 
2340
2564
  function DListGroupItem({ as = 'li', action: actionProp, active, disabled, href, onClick, color, iconStart, iconStartFamilyClass, iconStartFamilyPrefix, iconStartMaterialStyle, iconEnd, iconEndFamilyClass, iconEndFamilyPrefix, iconEndMaterialStyle, children, className, style, dataAttributes, }) {
2565
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
2341
2566
  const Tag = useMemo(() => {
2342
2567
  if (href) {
2343
2568
  return 'a';
@@ -2366,7 +2591,7 @@ function DListGroupItem({ as = 'li', action: actionProp, active, disabled, href,
2366
2591
  }
2367
2592
  return Object.assign(Object.assign({}, active && { 'aria-current': true }), disabled && { 'aria-disabled': true });
2368
2593
  }, [Tag, active, disabled]);
2369
- return (jsxs(Tag, Object.assign({ className: classNames(generateClasses, className), style: style }, Tag === 'a' && href && { href }, onClick && { onClick }, ariaAttributes, dataAttributes, Tag === 'button' && { type: 'button' }, { children: [iconStart && (jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle })), children, iconEnd && (jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle, className: "ms-auto" }))] })));
2594
+ return (jsxs(Tag, Object.assign({ className: classNames(generateClasses, className), style: style }, Tag === 'a' && href && { href }, onClick && { onClick }, ariaAttributes, dataAttributes, Tag === 'button' && { type: 'button' }, { children: [iconStart && (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 && (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" }))] })));
2370
2595
  }
2371
2596
 
2372
2597
  function DListGroup({ as = 'ul', numbered, flush, horizontal, children, className, style, dataAttributes, }) {
@@ -2393,10 +2618,11 @@ var DListGroup$1 = Object.assign(DListGroup, {
2393
2618
  Item: DListGroupItem,
2394
2619
  });
2395
2620
 
2396
- function DModalHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, materialStyle = false, }) {
2397
- const { iconMap: { xLg, }, } = useDContext();
2621
+ function DModalHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, iconMaterialStyle, materialStyle: materialStyleProp, }) {
2622
+ var _a;
2623
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { xLg, }, } = useDContext();
2398
2624
  const icon = useMemo(() => iconProp || xLg, [iconProp, xLg]);
2399
- return (jsxs(Fragment, { children: [jsxs("div", { className: classNames('modal-header', className), style: style, children: [jsx("div", { children: children }), showCloseButton && (jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: materialStyle }) }))] }), jsx("div", { className: "d-modal-separator" })] }));
2625
+ return (jsxs(Fragment, { children: [jsxs("div", { className: classNames('modal-header', className), style: style, children: [jsx("div", { children: children }), showCloseButton && (jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: 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 }) }))] }), jsx("div", { className: "d-modal-separator" })] }));
2400
2626
  }
2401
2627
 
2402
2628
  function DModalBody({ children, className, style, }) {
@@ -2437,10 +2663,11 @@ var DModal$1 = Object.assign(DModal, {
2437
2663
  Footer: DModalFooter,
2438
2664
  });
2439
2665
 
2440
- function DOffcanvasHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, materialStyle = false, }) {
2441
- const { iconMap: { xLg, }, } = useDContext();
2666
+ function DOffcanvasHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, iconMaterialStyle, materialStyle: materialStyleProp, }) {
2667
+ var _a;
2668
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { xLg, }, } = useDContext();
2442
2669
  const icon = useMemo(() => iconProp || xLg, [iconProp, xLg]);
2443
- return (jsxs(Fragment, { children: [jsxs("div", { className: classNames('offcanvas-header', className), style: style, children: [jsx("div", { children: children }), showCloseButton && (jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: materialStyle }) }))] }), jsx("div", { className: "d-offcanvas-separator" })] }));
2670
+ return (jsxs(Fragment, { children: [jsxs("div", { className: classNames('offcanvas-header', className), style: style, children: [jsx("div", { children: children }), showCloseButton && (jsx("button", { type: "button", className: "d-close", "aria-label": "Close", onClick: onClose, children: 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 }) }))] }), jsx("div", { className: "d-offcanvas-separator" })] }));
2444
2671
  }
2445
2672
 
2446
2673
  function DOffcanvasBody({ children, className, style, }) {
@@ -2581,8 +2808,8 @@ function DProgress({ className, style, currentValue, minValue = 0, maxValue = 10
2581
2808
  return (jsx("div", Object.assign({ className: classNames('progress', className), style: Object.assign({ height }, style) }, dataAttributes, { children: 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 }) })));
2582
2809
  }
2583
2810
 
2584
- function DStepper$2({ options, currentStep, iconSuccess: iconSuccessProp, iconSuccessFamilyClass, iconSuccessFamilyPrefix, iconSuccessMaterialStyle = false, vertical = false, completed, alignStart = false, className, style, }) {
2585
- const { iconMap: { check, }, } = useDContext();
2811
+ function DStepper$2({ options, currentStep, iconSuccess: iconSuccessProp, iconSuccessFamilyClass, iconSuccessFamilyPrefix, iconSuccessMaterialStyle, vertical = false, completed, alignStart = false, className, style, }) {
2812
+ const { icon: { familyClass, familyPrefix, materialStyle, }, iconMap: { check, }, } = useDContext();
2586
2813
  const icon = useMemo(() => iconSuccessProp || check, [check, iconSuccessProp]);
2587
2814
  if (currentStep < 1 || currentStep > options.length) {
2588
2815
  throw new Error('Current step should be in the range from 1 to options length');
@@ -2597,7 +2824,7 @@ function DStepper$2({ options, currentStep, iconSuccess: iconSuccessProp, iconSu
2597
2824
  }), children: [jsx("div", { className: "d-step-value", children: jsxs("div", { className: classNames({
2598
2825
  'd-step-icon-container': true,
2599
2826
  'd-step-check': value < currentStep || completed,
2600
- }), children: [((value < currentStep) || completed) && (jsx(DIcon, { icon: icon, familyClass: iconSuccessFamilyClass, familyPrefix: iconSuccessFamilyPrefix, materialStyle: iconSuccessMaterialStyle, className: "d-step-icon" })), value] }) }), jsxs("div", { className: "d-step-text-container", children: [jsx("div", { className: "d-step-label", children: label }), description && (jsx("div", { className: "d-step-description", children: description }))] })] }, value))) }));
2827
+ }), children: [((value < currentStep) || completed) && (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] }) }), jsxs("div", { className: "d-step-text-container", children: [jsx("div", { className: "d-step-label", children: label }), description && (jsx("div", { className: "d-step-description", children: description }))] })] }, value))) }));
2601
2828
  }
2602
2829
 
2603
2830
  function DStepper$1({ options, currentStep, className, style, }) {
@@ -2630,13 +2857,20 @@ function DStepper$1({ options, currentStep, className, style, }) {
2630
2857
  return (jsxs("div", { className: classNames('d-stepper', className), style: style, children: [jsx("div", { className: "d-step-bar", style: { background: progressStyle }, children: jsx("p", { className: "d-step-number", children: `${currentStep}/${options.length}` }) }), jsx("div", { className: "d-step-info", children: Object.keys(currentOption).length > 0 && (jsxs(Fragment, { children: [jsx("div", { className: "d-step-label", children: currentOption.label }), jsx("div", { className: "d-step-description", children: currentOption.description || '' })] })) })] }));
2631
2858
  }
2632
2859
 
2633
- function DStepper({ options, currentStep, iconSuccess, iconSuccessFamilyClass, iconSuccessFamilyPrefix, iconSuccessMaterialStyle = false, vertical = false, breakpoint = 'lg', className, completed = false, style, dataAttributes, }) {
2634
- return (jsxs("div", Object.assign({ className: className, style: style }, dataAttributes, { children: [jsx("div", { className: classNames('d-stepper-mobile', `d-block d-${breakpoint}-none`), children: jsx(DStepper$1, { options: options, currentStep: currentStep }) }), jsx("div", { className: classNames('d-stepper-desktop', `d-none d-${breakpoint}-block`), children: jsx(DStepper$2, { options: options, currentStep: currentStep, vertical: vertical, iconSuccess: iconSuccess, iconSuccessFamilyClass: iconSuccessFamilyClass, iconSuccessFamilyPrefix: iconSuccessFamilyPrefix, iconSuccessMaterialStyle: iconSuccessMaterialStyle, completed: completed }) })] })));
2860
+ function DStepper({ options, currentStep, iconSuccess, iconSuccessFamilyClass, iconSuccessFamilyPrefix, iconSuccessMaterialStyle, vertical = false, breakpoint = 'lg', className, completed = false, style, dataAttributes, }) {
2861
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
2862
+ return (jsxs("div", Object.assign({ className: className, style: style }, dataAttributes, { children: [jsx("div", { className: classNames('d-stepper-mobile', `d-block d-${breakpoint}-none`), children: jsx(DStepper$1, { options: options, currentStep: currentStep }) }), jsx("div", { className: classNames('d-stepper-desktop', `d-none d-${breakpoint}-block`), children: 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 }) })] })));
2635
2863
  }
2636
2864
 
2637
2865
  const ARROW_WIDTH = 8;
2638
2866
  const ARROW_HEIGHT = 4;
2639
2867
  const GAP$1 = 2;
2868
+ /**
2869
+ * Tooltip is an abstraction component that wraps any element (`Component`) and displays
2870
+ * floating contextual content (`children`) positioned relative to it using Floating UI.
2871
+ * Use it to add short, non-critical hints or descriptions triggered by hover, focus, or
2872
+ * click, without altering the surrounding layout.
2873
+ */
2640
2874
  function DTooltip({ className, childrenClassName, style, offSet = ARROW_HEIGHT + GAP$1, padding, withFocus = false, withClick = false, withHover = true, open = false, placement = 'top', size, Component, children, }) {
2641
2875
  const [isOpen, setIsOpen] = useState(open);
2642
2876
  const arrowRef = useRef(null);
@@ -2675,7 +2909,7 @@ function DTooltip({ className, childrenClassName, style, offSet = ARROW_HEIGHT +
2675
2909
  function DTimeline({ className, style, dataAttributes, items, }) {
2676
2910
  return (jsx("div", Object.assign({ style: style, className: classNames('d-timeline', className) }, dataAttributes, { children: items.map((item, index) => (jsxs("div", { className: classNames('d-timeline-item', {
2677
2911
  [`d-timeline-item-${item.status}`]: item.status,
2678
- }), children: [jsx("div", { className: "d-timeline-item-connector" }), jsx("div", { className: "d-timeline-item-icon", children: jsx(DIcon, { icon: item.icon || 'check', size: "1rem" }) }), jsxs("div", { className: "d-timeline-item-content", children: [jsx("div", { className: "d-timeline-item-title", children: item.title }), item.description && jsx("div", { className: "d-timeline-item-description", children: item.description }), item.time && jsx("div", { className: "d-timeline-item-time", children: item.time }), item.children] })] }, index))) })));
2912
+ }), children: [jsx("div", { className: "d-timeline-item-connector" }), jsx("div", { className: "d-timeline-item-icon", children: jsx(DIcon, { icon: item.icon || 'Check', size: "1rem" }) }), jsxs("div", { className: "d-timeline-item-content", children: [jsx("div", { className: "d-timeline-item-title", children: item.title }), item.description && jsx("div", { className: "d-timeline-item-description", children: item.description }), item.time && jsx("div", { className: "d-timeline-item-time", children: item.time }), item.children] })] }, index))) })));
2679
2913
  }
2680
2914
 
2681
2915
  const TabContext = createContext(undefined);
@@ -2919,11 +3153,132 @@ function validatePhoneNumber(phone) {
2919
3153
  }
2920
3154
  }
2921
3155
 
3156
+ const SAFE_SCHEMES = new Set(['http:', 'https:', 'mailto:', 'tel:']);
3157
+ /**
3158
+ * Characters the URL parser drops before resolving a URL, so they cannot be used to hide a
3159
+ * scheme-relative prefix or a dangerous scheme (e.g. `/<TAB>/evil.com`, `java<TAB>script:`).
3160
+ */
3161
+ const IGNORED_CHARS$1 = /[\t\n\r]/g;
3162
+ /**
3163
+ * Two leading separators in any combination. Browsers treat a leading `\` exactly like a
3164
+ * leading `/`, so `//`, `/\`, `\/` and `\\` all resolve to a scheme-relative URL.
3165
+ */
3166
+ const SCHEME_RELATIVE = /^[/\\]{2}/;
3167
+ const LEADING_SEPARATOR = /^[/\\]/;
3168
+ /**
3169
+ * Validates a `href` value and returns it only if it is safe to render as a link,
3170
+ * preventing XSS through unsafe URL schemes and scheme-relative URLs.
3171
+ *
3172
+ * Before validating, the value is trimmed and every tab, line feed and carriage return is
3173
+ * removed, because the URL parser ignores those characters too and they would otherwise
3174
+ * hide an unsafe value from the checks below.
3175
+ *
3176
+ * A `href` is considered safe when it is either:
3177
+ * - An absolute path starting with a single separator (e.g. `/accounts/42`). A leading `\`
3178
+ * is normalized to `/` in the returned value, since that is how the browser resolves it.
3179
+ * - A URL using one of the allowed schemes: `http:`, `https:`, `mailto:`, `tel:`.
3180
+ *
3181
+ * A `href` is rejected (returns `undefined`) when it is:
3182
+ * - Empty or made only of whitespace/ignored characters (`''`, `' '`).
3183
+ * - Scheme-relative (starts with two separators, e.g. `//evil.com`, `/\evil.com`,
3184
+ * `/<TAB>/evil.com`), since the browser would resolve it using the current protocol and it
3185
+ * can be used to redirect to an attacker-controlled host.
3186
+ * - Using a disallowed/dangerous scheme, such as `javascript:` or `data:`
3187
+ * (e.g. `javascript:alert(1)`, `data:text/html,<script>...</script>`).
3188
+ * - Not parseable as an absolute URL and not an absolute path, such as bare fragments
3189
+ * (`#anchor`) or scheme-less relative paths (`relative/path`). These cannot be validated
3190
+ * against `SAFE_SCHEMES`, so they are rejected rather than assumed safe.
3191
+ *
3192
+ * @param href - The raw URL or path to validate, typically coming from user input,
3193
+ * a CMS, or an external API.
3194
+ * @returns The sanitized `href` when safe, `undefined` otherwise.
3195
+ *
3196
+ * @example
3197
+ * sanitizeHref('/accounts/42'); // '/accounts/42'
3198
+ * sanitizeHref('https://example.com'); // 'https://example.com'
3199
+ * sanitizeHref('mailto:test@example.com'); // 'mailto:test@example.com'
3200
+ * sanitizeHref('//evil.com'); // undefined
3201
+ * sanitizeHref('/\\evil.com'); // undefined
3202
+ * sanitizeHref('javascript:alert(1)'); // undefined
3203
+ */
3204
+ function sanitizeHref(href) {
3205
+ const normalized = href.trim().replace(IGNORED_CHARS$1, '');
3206
+ if (!normalized)
3207
+ return undefined;
3208
+ if (SCHEME_RELATIVE.test(normalized))
3209
+ return undefined;
3210
+ if (LEADING_SEPARATOR.test(normalized))
3211
+ return `/${normalized.slice(1)}`;
3212
+ try {
3213
+ const { protocol } = new URL(normalized);
3214
+ return SAFE_SCHEMES.has(protocol) ? normalized : undefined;
3215
+ }
3216
+ catch (_a) {
3217
+ return undefined;
3218
+ }
3219
+ }
3220
+
3221
+ /**
3222
+ * Characters the URL parser drops before resolving a URL, so they cannot be used to hide a
3223
+ * scheme-relative prefix (e.g. `/<TAB>/evil.com`).
3224
+ */
3225
+ const IGNORED_CHARS = /[\t\n\r]/g;
3226
+ /**
3227
+ * Leading separators. Browsers treat a leading `\` exactly like a leading `/`, so both have
3228
+ * to be stripped to prevent scheme-relative URLs (`//evil.com`, `/\evil.com`, `\\evil.com`).
3229
+ */
3230
+ const LEADING_SEPARATORS = /^[/\\]+/;
3231
+ /**
3232
+ * Builds an internal URL from a `path` and a set of query `params`, normalizing leading
3233
+ * separators to prevent scheme-relative URLs (e.g. `//accounts` and `/\accounts` both become
3234
+ * `/accounts`).
3235
+ *
3236
+ * The `path` is trimmed and every tab, line feed and carriage return is removed before
3237
+ * building the result, because the URL parser ignores those characters too and they would
3238
+ * otherwise hide a scheme-relative prefix (`/<TAB>/evil.com` resolves to `//evil.com`).
3239
+ *
3240
+ * Handles the special case where `path` is the literal string `'#'`, which happens when
3241
+ * a Liquid template variable used as a link target is left unconfigured; in that case the
3242
+ * params are ignored and `'#'` is returned as-is instead of building a broken URL.
3243
+ *
3244
+ * @param path - The path to build the URL from. Leading separators are stripped before
3245
+ * building the result (`/accounts`, `//accounts` and `\accounts` are all treated as `accounts`).
3246
+ * @param params - Key/value pairs serialized as the query string.
3247
+ * @returns The resulting URL:
3248
+ * - `'#'` when `path` normalizes to `'#'` (`'#'`, `'/#'`), ignoring the params.
3249
+ * - `'/'` when `path` is empty and there are no params.
3250
+ * - `'/?<query>'` when `path` is empty and there are params.
3251
+ * - `'<path>'` or `'<path>?<query>'` when `path` starts with `#`, since a fragment must not be
3252
+ * prefixed with `/` (it would navigate away from the current document).
3253
+ * - `'/<path>'` or `'/<path>?<query>'` otherwise.
3254
+ *
3255
+ * @example
3256
+ * buildUrl('accounts', { account_id: '42' }); // '/accounts?account_id=42'
3257
+ * buildUrl('//accounts', {}); // '/accounts'
3258
+ * buildUrl('#', { account_id: '42' }); // '#'
3259
+ * buildUrl('#accounts', { account_id: '42' }); // '#accounts?account_id=42'
3260
+ * buildUrl('', { tab: 'movimientos' }); // '/?tab=movimientos'
3261
+ */
3262
+ function buildUrl(path, params) {
3263
+ const normalizedPath = path
3264
+ .trim()
3265
+ .replace(IGNORED_CHARS, '')
3266
+ .replace(LEADING_SEPARATORS, '');
3267
+ if (normalizedPath === '#')
3268
+ return '#';
3269
+ const query = new URLSearchParams(Object.entries(params).map(([key, value]) => [key, String(value)])).toString();
3270
+ if (normalizedPath === '')
3271
+ return query ? `/?${query}` : '/';
3272
+ const prefix = normalizedPath.startsWith('#') ? '' : '/';
3273
+ return `${prefix}${normalizedPath}${query ? `?${query}` : ''}`;
3274
+ }
3275
+
2922
3276
  function DInputPhone(_a, ref) {
2923
3277
  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 = __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"]);
2924
3278
  const innerRef = useProvidedRefOrCreate(ref);
2925
3279
  const innerId = useId();
2926
3280
  const id = useMemo(() => idProp || innerId, [idProp, innerId]);
3281
+ const { icon: { familyClass, familyPrefix, materialStyle, }, } = useDContext();
2927
3282
  const handleOnIconEndClick = useCallback(() => {
2928
3283
  onIconEndClick === null || onIconEndClick === void 0 ? void 0 : onIconEndClick(value);
2929
3284
  }, [onIconEndClick, value]);
@@ -2997,7 +3352,7 @@ function DInputPhone(_a, ref) {
2997
3352
  [`input-group-${size}`]: !!size,
2998
3353
  'input-group': true,
2999
3354
  'has-validation': invalid || valid,
3000
- }), children: [jsx(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) && (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: jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }) })), loading && (jsx("div", { className: "input-group-text", id: `${id}Loading`, children: jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }) })), !!inputEnd && (jsx("div", { className: "input-group-text", id: `${id}InputEnd`, children: inputEnd }))] }), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
3355
+ }), children: [jsx(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) && (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: 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 && (jsx("div", { className: "input-group-text", id: `${id}Loading`, children: jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }) })), !!inputEnd && (jsx("div", { className: "input-group-text", id: `${id}InputEnd`, children: inputEnd }))] }), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
3001
3356
  }
3002
3357
  const ForwardedDInputPhone = forwardRef(DInputPhone);
3003
3358
  ForwardedDInputPhone.displayName = 'DInputPhone';
@@ -3599,5 +3954,58 @@ function DConfirmModalContainer({ nodeId }) {
3599
3954
  return createPortal(jsx(AnimatePresence, { children: entries.map((entry) => (jsxs(motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0, transition: { delay: 0.3 } }, transition: { duration: 0.15, ease: 'linear' }, children: [jsx("div", { className: "backdrop backdrop-confirm-modal", onClick: entry.onCloseAction, role: "presentation" }), jsx(DConfirmModalUI, { entry: entry })] }, entry.id))) }), portalNode);
3600
3955
  }
3601
3956
 
3602
- export { DAlert, DAvatar, DBadge, DBox, DBoxFile, DButton, DButtonIcon, DCard$1 as DCard, DCardBody, DCardFooter, DCardHeader, DCarousel$1 as DCarousel, DCarouselSlide, DChip, DCollapse, DConfirmModalContainer, DContext, DContextProvider, DCreditCard, DCurrencyText, DDataStateWrapper, DDatePicker, DDropdown, DErrorBoundary, DIcon, DIconBase, ForwardedDInput as DInput, DInputCheck, ForwardedDInputCounter as DInputCounter, ForwardedDInputCurrency as DInputCurrency, ForwardedDInputMask as DInputMask, ForwardedDInputPassword as DInputPassword, ForwardedDInputPhone as DInputPhone, DInputPin, ForwardedDInputRange as DInputRange, ForwardedDInputSearch as DInputSearch, DInputSelect, DInputSwitch, DLayout$1 as DLayout, DLayoutPane, DListGroup$1 as DListGroup, DListGroupItem, DModal$1 as DModal, DModalBody, DModalFooter, DModalHeader, DOffcanvas$1 as DOffcanvas, DOffcanvasBody, DOffcanvasFooter, DOffcanvasHeader, DOtp, DPaginator, DPasswordStrengthMeter, DPopover, DProgress, DSelect$1 as DSelect, DStepper, DStepper$2 as DStepperDesktop, DStepper$1 as DStepperMobile, DTabContent, DTabs$1 as DTabs, DTimeline, DToast$1 as DToast, DToastContainer, DTooltip, DVoucher, EmptyState, ErrorState, LoadingState, changeQueryString, checkMediaQuery, configureI8n as configureI18n, formatCurrency, getCssVariable, getQueryString, subscribeToMediaQuery, useConfirmModal, useCountdown, useDContext, useDPortalContext, useDToast, useDisableBodyScrollEffect, useDisableInputWheel, useFormatCurrency, useInputCurrency, useItemSelection, useMediaBreakpointUpLg, useMediaBreakpointUpMd, useMediaBreakpointUpSm, useMediaBreakpointUpXl, useMediaBreakpointUpXs, useMediaBreakpointUpXxl, useMediaQuery, useOtp, useProvidedRefOrCreate, useScreenshot, useScreenshotDownload, useScreenshotWebShare, useStackState, useTabContext, validatePhoneNumber };
3957
+ /**
3958
+ * The lucide-react icons Dynamic UI renders on its own, without the consumer
3959
+ * asking for them by name.
3960
+ *
3961
+ * Two sources feed this list:
3962
+ *
3963
+ * - The `iconMap` defaults of `DContextProvider` (`src/contexts/DContext.tsx`),
3964
+ * used by close buttons, chevrons, alert states, input adornments and the
3965
+ * stepper checkmark.
3966
+ * - Names hard-coded in component JSX or in a prop default, such as
3967
+ * `DDropdown`'s toggle or `DVoucher`'s action buttons.
3968
+ *
3969
+ * Any bundler-level optimisation that narrows lucide-react down to the icons a
3970
+ * widget actually uses must keep this set, or Dynamic UI components break for
3971
+ * reasons the widget author cannot see in their own source. That is why the
3972
+ * list ships in the package as `dist/icons-core.json` and is exported here.
3973
+ *
3974
+ * `src/icons/coreIcons.spec.ts` scans `src/components/**` and fails when an
3975
+ * internally used icon name is missing from this list or absent from
3976
+ * lucide-react, so the two cannot drift apart.
3977
+ */
3978
+ const CORE_LUCIDE_ICONS = [
3979
+ // iconMap defaults — src/contexts/DContext.tsx
3980
+ 'AlertCircle',
3981
+ 'AlertTriangle',
3982
+ 'Calendar',
3983
+ 'Check',
3984
+ 'CheckCircle',
3985
+ 'ChevronDown',
3986
+ 'ChevronLeft',
3987
+ 'ChevronRight',
3988
+ 'ChevronUp',
3989
+ 'Eye',
3990
+ 'EyeOff',
3991
+ 'Info',
3992
+ 'Minus',
3993
+ 'Plus',
3994
+ 'Search',
3995
+ 'Upload',
3996
+ 'X',
3997
+ // Hard-coded in component JSX or in a prop default
3998
+ 'Circle',
3999
+ 'CircleCheck',
4000
+ 'CircleCheckBig',
4001
+ 'Download',
4002
+ 'FileText',
4003
+ 'MoreVertical',
4004
+ 'Paperclip',
4005
+ 'RefreshCw',
4006
+ 'Share2',
4007
+ 'Trash',
4008
+ ];
4009
+
4010
+ export { CORE_LUCIDE_ICONS, DAlert, DAvatar, DBadge, DBox, DBoxFile, DButton, DButtonIcon, DCard$1 as DCard, DCardBody, DCardFooter, DCardHeader, DCarousel$1 as DCarousel, DCarouselSlide, DChip, DCollapse, DConfirmModalContainer, DContext, DContextProvider, DCreditCard, DCurrencyText, DDataStateWrapper, DDatePicker, DDropdown, DErrorBoundary, DIcon, DIconBase, ForwardedDInput as DInput, DInputCheck, ForwardedDInputCounter as DInputCounter, ForwardedDInputCurrency as DInputCurrency, ForwardedDInputMask as DInputMask, ForwardedDInputPassword as DInputPassword, ForwardedDInputPhone as DInputPhone, DInputPin, ForwardedDInputRange as DInputRange, ForwardedDInputSearch as DInputSearch, DInputSelect, DInputSwitch, DLayout$1 as DLayout, DLayoutPane, DListGroup$1 as DListGroup, DListGroupItem, DModal$1 as DModal, DModalBody, DModalFooter, DModalHeader, DOffcanvas$1 as DOffcanvas, DOffcanvasBody, DOffcanvasFooter, DOffcanvasHeader, DOtp, DPaginator, DPasswordStrengthMeter, DPopover, DProgress, DSelect$1 as DSelect, DStepper, DStepper$2 as DStepperDesktop, DStepper$1 as DStepperMobile, DTabContent, DTabs$1 as DTabs, DTimeline, DToast$1 as DToast, DToastContainer, DTooltip, DVoucher, EmptyState, ErrorState, LoadingState, buildUrl, changeQueryString, checkMediaQuery, configureI8n as configureI18n, formatCurrency, getCssVariable, getQueryString, sanitizeHref, subscribeToMediaQuery, useConfirmModal, useCountdown, useDContext, useDPortalContext, useDToast, useDisableBodyScrollEffect, useDisableInputWheel, useFormatCurrency, useInputCurrency, useItemSelection, useMediaBreakpointUpLg, useMediaBreakpointUpMd, useMediaBreakpointUpSm, useMediaBreakpointUpXl, useMediaBreakpointUpXs, useMediaBreakpointUpXxl, useMediaQuery, useOtp, useProvidedRefOrCreate, useScreenshot, useScreenshotDownload, useScreenshotWebShare, useStackState, useTabContext, validatePhoneNumber };
3603
4011
  //# sourceMappingURL=index.esm.js.map