@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
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Warns, once per icon and only outside production builds, that an icon-only
3
+ * button has no accessible name.
4
+ *
5
+ * The control has no text to fall back on and its icon is hidden from the
6
+ * accessibility tree, so the name has to be given explicitly. `aria-label` is
7
+ * the direct way; on a button `aria-labelledby` and `title` count too, since
8
+ * `rest` reaches the DOM there, while an anchor drops them — hence `kind`, so
9
+ * the advice matches what the element can actually receive.
10
+ *
11
+ * A legacy icon-font icon used to leak its ligature as the name by accident —
12
+ * never a good one, being unlocalised and often meaningless ("more_vert") — and
13
+ * no longer does, so the omission is now visible instead of silent.
14
+ *
15
+ * The `process.env.NODE_ENV` guard is what bundlers constant-fold, so the whole
16
+ * call — and this module — drops out of a consumer's production bundle.
17
+ */
18
+ export default function warnMissingAccessibleName(icon: string, kind: 'button' | 'link'): void;
@@ -1,5 +1,13 @@
1
1
  /// <reference types="react" />
2
2
  import type { DIconBaseProps } from '../DIconBase';
3
3
  type Props = DIconBaseProps;
4
+ /**
5
+ * Thin wrapper over `DIconBase` that fills the icon-font configuration
6
+ * (`familyClass`, `familyPrefix`, `materialStyle`) from `DContextProvider`
7
+ * whenever the caller does not pass it explicitly.
8
+ *
9
+ * Name resolution itself — registry, then lucide-react, then the icon-font
10
+ * family — lives in `DIconBase`, so both components behave identically.
11
+ */
4
12
  export default function DIcon({ icon, familyClass: propFamilyClass, familyPrefix: propFamilyPrefix, materialStyle: propMaterialStyle, ...props }: Props): import("react").JSX.Element;
5
13
  export {};
@@ -17,7 +17,49 @@ type Props = BaseProps & {
17
17
  familyClass?: string;
18
18
  familyPrefix?: string;
19
19
  strokeWidth?: number;
20
+ /**
21
+ * Hides the icon from the accessibility tree. Defaults to `true`, because
22
+ * an icon is almost always decorative: it sits next to a visible label, or
23
+ * inside a control that already carries its own accessible name.
24
+ *
25
+ * Pass `ariaLabel` instead when the icon itself is the only carrier of
26
+ * meaning. `ariaHidden` wins over `ariaLabel`, since hiding is absolute;
27
+ * `ariaHidden={false}` alongside an `ariaLabel` is not a conflict, as both
28
+ * expose the icon and the name is kept. Setting `ariaHidden={false}` on its
29
+ * own exposes an unnamed graphic and warns outside production builds.
30
+ *
31
+ * It is forwarded to the icon so a hidden `<svg>` follows the wrapper, but a
32
+ * registry component that hardcodes its own `aria-hidden` rather than
33
+ * spreading the props it receives stays hidden regardless.
34
+ */
35
+ ariaHidden?: boolean;
36
+ /**
37
+ * Accessible name for an icon that carries meaning on its own. Renders
38
+ * `role="img"` alongside it and drops the default `aria-hidden`.
39
+ */
40
+ ariaLabel?: string;
20
41
  };
21
42
  export type DIconBaseProps = Props;
22
- export default function DIconBase({ icon, color, style, className, size, useListenerSize, hasCircle, materialStyle, familyClass, familyPrefix, strokeWidth, dataAttributes, }: Props): import("react").JSX.Element;
43
+ /**
44
+ * Renders an icon, resolving the `icon` prop in this order:
45
+ *
46
+ * 1. **Icon registry** — a string name found in `DContextProvider`'s
47
+ * `iconRegistry` renders the component registered under it. A component
48
+ * passed directly skips this step and renders as-is.
49
+ * 2. **lucide-react** — a PascalCase name exported by lucide-react renders that
50
+ * icon. When `materialStyle` is on, this step is skipped and the name is
51
+ * emitted as the text content of the icon-font element instead.
52
+ * 3. **Icon-font family** — anything left over renders as
53
+ * `<i class="{familyClass} {familyPrefix}{name}">`, the legacy path for
54
+ * Material Symbols and Bootstrap Icons. Outside production builds, a name
55
+ * that reaches this step while the family is still the package default logs
56
+ * a one-time warning.
57
+ *
58
+ * A name that resolves nowhere and has no family configured renders `?`.
59
+ *
60
+ * Every path is hidden from the accessibility tree by default (`aria-hidden`),
61
+ * since icons are overwhelmingly decorative. See `ariaHidden` / `ariaLabel` to
62
+ * override that for an icon that carries meaning on its own.
63
+ */
64
+ export default function DIconBase({ icon: iconProp, color, style, className, size, useListenerSize, hasCircle, materialStyle, familyClass, familyPrefix, strokeWidth, ariaHidden, ariaLabel, dataAttributes, }: Props): import("react").JSX.Element;
23
65
  export {};
@@ -0,0 +1,14 @@
1
+ import type { IconComponent, IconValue } from '../interface';
2
+ /**
3
+ * Resolves a string icon name against the registry supplied through
4
+ * `DContextProvider`'s `iconRegistry` prop.
5
+ *
6
+ * This is the single implementation shared by `DIcon` and `DIconBase`, so both
7
+ * public entry points — and every Dynamic UI component that renders an icon
8
+ * through them — resolve names identically.
9
+ *
10
+ * A non-string `icon` is returned untouched: a component passed directly needs
11
+ * no lookup. A name missing from the registry is also returned untouched, so
12
+ * the caller can fall through to lucide-react and then to the icon-font family.
13
+ */
14
+ export default function resolveIconFromRegistry(icon: IconValue, iconRegistry?: Record<string, IconComponent>): IconValue;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Warns, once per name and only outside production builds, that an icon name
3
+ * resolved to neither the registry nor lucide-react and is falling back to the
4
+ * default icon font, which this package no longer ships.
5
+ *
6
+ * Whether that fallback renders depends on the host app: if it loads the font
7
+ * itself the `<i>` shows the glyph, and if it does not, nothing appears. The
8
+ * message states both possibilities instead of assuming the second.
9
+ *
10
+ * The `process.env.NODE_ENV` guard is what bundlers constant-fold, so the whole
11
+ * call — and this module — drops out of a consumer's production bundle.
12
+ */
13
+ export default function warnUnknownIcon(name: string, familyClass: string, familyPrefix: string): void;
@@ -12,6 +12,7 @@ type Props = ComponentPropsWithoutRef<'input'> & BaseProps & {
12
12
  invalid?: boolean;
13
13
  valid?: boolean;
14
14
  hint?: string;
15
+ /** Only applies when `type` is `checkbox`; ignored for `radio`. */
15
16
  indeterminate?: boolean;
16
17
  value?: string;
17
18
  onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import type { BaseProps } from '../interface';
3
- declare const ForwardedDInputRange: import("react").ForwardRefExoticComponent<Omit<Omit<Omit<import("react").DetailedHTMLProps<import("react").InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref">, "type">, "label" | keyof BaseProps | "ariaLabel" | "filledValue"> & BaseProps & {
3
+ declare const ForwardedDInputRange: import("react").ForwardRefExoticComponent<Omit<Omit<Omit<import("react").DetailedHTMLProps<import("react").InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref">, "type">, "label" | "ariaLabel" | keyof BaseProps | "filledValue"> & BaseProps & {
4
4
  label?: string | undefined;
5
5
  ariaLabel?: string | undefined;
6
6
  filledValue?: boolean | undefined;
@@ -10,8 +10,9 @@ type Props = BaseProps & {
10
10
  inputClassName?: string;
11
11
  invalid?: boolean;
12
12
  valid?: boolean;
13
+ hint?: string;
13
14
  readonly?: boolean;
14
15
  onChange?: (isChecked: boolean) => void;
15
16
  };
16
- export default function DInputSwitch({ id: idProp, label, ariaLabel, name, checked, disabled, invalid, valid, readonly, className, style, dataAttributes, inputClassName, onChange, }: Props): import("react").JSX.Element;
17
+ export default function DInputSwitch({ id: idProp, label, ariaLabel, name, checked, disabled, invalid, valid, hint, readonly, className, style, dataAttributes, inputClassName, onChange, }: Props): import("react").JSX.Element;
17
18
  export {};
@@ -3,8 +3,12 @@ import type { BaseProps, FamilyIconProps } from '../../interface';
3
3
  type Props = BaseProps & FamilyIconProps & PropsWithChildren<{
4
4
  showCloseButton?: boolean;
5
5
  icon?: string;
6
+ iconMaterialStyle?: boolean;
7
+ /**
8
+ * @deprecated Use `iconMaterialStyle` instead. It will be removed in a future major version.
9
+ */
6
10
  materialStyle?: boolean;
7
11
  onClose?: () => void;
8
12
  }>;
9
- export default function DModalHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, materialStyle, }: Props): import("react").JSX.Element;
13
+ export default function DModalHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, iconMaterialStyle, materialStyle: materialStyleProp, }: Props): import("react").JSX.Element;
10
14
  export {};
@@ -3,8 +3,12 @@ import type { BaseProps, FamilyIconProps } from '../../interface';
3
3
  type Props = BaseProps & FamilyIconProps & PropsWithChildren<{
4
4
  showCloseButton?: boolean;
5
5
  icon?: string;
6
+ iconMaterialStyle?: boolean;
7
+ /**
8
+ * @deprecated Use `iconMaterialStyle` instead. It will be removed in a future major version.
9
+ */
6
10
  materialStyle?: boolean;
7
11
  onClose?: () => void;
8
12
  }>;
9
- export default function DOffcanvasHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, materialStyle, }: Props): import("react").JSX.Element;
13
+ export default function DOffcanvasHeader({ showCloseButton, onClose, children, className, style, iconFamilyClass, iconFamilyPrefix, icon: iconProp, iconMaterialStyle, materialStyle: materialStyleProp, }: Props): import("react").JSX.Element;
10
14
  export {};
@@ -1,16 +1,51 @@
1
- import type { PropsWithChildren, ReactNode } from 'react';
1
+ import type { ReactNode } from 'react';
2
2
  import type { Placement } from '@floating-ui/react';
3
3
  import type { BaseProps, ComponentSize } from '../interface';
4
- export type Props = BaseProps & PropsWithChildren<{
4
+ export type Props = BaseProps & {
5
+ /** CSS class applied to the wrapper element that surrounds `Component` (the trigger). */
5
6
  childrenClassName?: string;
7
+ /**
8
+ * Distance in pixels between the trigger and the floating tooltip.
9
+ * Defaults to arrow height + gap.
10
+ */
6
11
  offSet?: number;
12
+ /** Virtual padding, in pixels, used to keep the tooltip within the viewport boundaries. */
7
13
  padding?: number;
14
+ /** When true, the tooltip opens when the pointer hovers over the trigger element. */
8
15
  withHover?: boolean;
16
+ /**
17
+ * When true, the tooltip opens when the trigger element receives keyboard focus
18
+ * (recommended for accessibility).
19
+ */
9
20
  withFocus?: boolean;
21
+ /** When true, the tooltip toggles open/closed when the trigger element is clicked. */
10
22
  withClick?: boolean;
23
+ /** Controls the initial open state of the tooltip. */
11
24
  open?: boolean;
25
+ /** Size of the tooltip content. Omit for the default size. */
12
26
  size?: ComponentSize;
27
+ /**
28
+ * Preferred position of the tooltip relative to the trigger element.
29
+ * Flips automatically if there isn't enough space.
30
+ */
13
31
  placement?: Placement;
32
+ /**
33
+ * Element that triggers the tooltip. It is rendered inside a wrapper `<div>`
34
+ * that holds the Floating UI reference and the interaction handlers, so the
35
+ * trigger area is that wrapper rather than this node itself. Style it with
36
+ * `childrenClassName`.
37
+ */
14
38
  Component: ReactNode;
15
- }>;
39
+ /**
40
+ * Floating content rendered inside the tooltip body. Keep it short and
41
+ * non-critical: the tooltip is only visible while it is open.
42
+ */
43
+ children?: ReactNode;
44
+ };
45
+ /**
46
+ * Tooltip is an abstraction component that wraps any element (`Component`) and displays
47
+ * floating contextual content (`children`) positioned relative to it using Floating UI.
48
+ * Use it to add short, non-critical hints or descriptions triggered by hover, focus, or
49
+ * click, without altering the surrounding layout.
50
+ */
16
51
  export default function DTooltip({ className, childrenClassName, style, offSet, padding, withFocus, withClick, withHover, open, placement, size, Component, children, }: Props): import("react").JSX.Element;
@@ -1 +1,11 @@
1
1
  export declare const PREFIX_BS = "bs-";
2
+ /**
3
+ * Default icon-font family configured by `DContextProvider`.
4
+ *
5
+ * `DIconBase` compares the family it receives against these values to tell an
6
+ * unconfigured consumer apart from one that deliberately opted into an icon
7
+ * font (Material Symbols, Bootstrap Icons). Only the former gets the
8
+ * development warning for an unresolved icon name.
9
+ */
10
+ export declare const DEFAULT_ICON_FAMILY_CLASS = "bi";
11
+ export declare const DEFAULT_ICON_FAMILY_PREFIX = "bi-";
@@ -0,0 +1,24 @@
1
+ /**
2
+ * The lucide-react icons Dynamic UI renders on its own, without the consumer
3
+ * asking for them by name.
4
+ *
5
+ * Two sources feed this list:
6
+ *
7
+ * - The `iconMap` defaults of `DContextProvider` (`src/contexts/DContext.tsx`),
8
+ * used by close buttons, chevrons, alert states, input adornments and the
9
+ * stepper checkmark.
10
+ * - Names hard-coded in component JSX or in a prop default, such as
11
+ * `DDropdown`'s toggle or `DVoucher`'s action buttons.
12
+ *
13
+ * Any bundler-level optimisation that narrows lucide-react down to the icons a
14
+ * widget actually uses must keep this set, or Dynamic UI components break for
15
+ * reasons the widget author cannot see in their own source. That is why the
16
+ * list ships in the package as `dist/icons-core.json` and is exported here.
17
+ *
18
+ * `src/icons/coreIcons.spec.ts` scans `src/components/**` and fails when an
19
+ * internally used icon name is missing from this list or absent from
20
+ * lucide-react, so the two cannot drift apart.
21
+ */
22
+ export declare const CORE_LUCIDE_ICONS: readonly ["AlertCircle", "AlertTriangle", "Calendar", "Check", "CheckCircle", "ChevronDown", "ChevronLeft", "ChevronRight", "ChevronUp", "Eye", "EyeOff", "Info", "Minus", "Plus", "Search", "Upload", "X", "Circle", "CircleCheck", "CircleCheckBig", "Download", "FileText", "MoreVertical", "Paperclip", "RefreshCw", "Share2", "Trash"];
23
+ /** A name from {@link CORE_LUCIDE_ICONS}. */
24
+ export type CoreLucideIcon = typeof CORE_LUCIDE_ICONS[number];
@@ -0,0 +1,2 @@
1
+ export { CORE_LUCIDE_ICONS } from './coreIcons';
2
+ export type { CoreLucideIcon } from './coreIcons';
@@ -2,3 +2,4 @@ export * from './components';
2
2
  export * from './contexts';
3
3
  export * from './utils';
4
4
  export * from './hooks';
5
+ export * from './icons';
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Builds an internal URL from a `path` and a set of query `params`, normalizing leading
3
+ * separators to prevent scheme-relative URLs (e.g. `//accounts` and `/\accounts` both become
4
+ * `/accounts`).
5
+ *
6
+ * The `path` is trimmed and every tab, line feed and carriage return is removed before
7
+ * building the result, because the URL parser ignores those characters too and they would
8
+ * otherwise hide a scheme-relative prefix (`/<TAB>/evil.com` resolves to `//evil.com`).
9
+ *
10
+ * Handles the special case where `path` is the literal string `'#'`, which happens when
11
+ * a Liquid template variable used as a link target is left unconfigured; in that case the
12
+ * params are ignored and `'#'` is returned as-is instead of building a broken URL.
13
+ *
14
+ * @param path - The path to build the URL from. Leading separators are stripped before
15
+ * building the result (`/accounts`, `//accounts` and `\accounts` are all treated as `accounts`).
16
+ * @param params - Key/value pairs serialized as the query string.
17
+ * @returns The resulting URL:
18
+ * - `'#'` when `path` normalizes to `'#'` (`'#'`, `'/#'`), ignoring the params.
19
+ * - `'/'` when `path` is empty and there are no params.
20
+ * - `'/?<query>'` when `path` is empty and there are params.
21
+ * - `'<path>'` or `'<path>?<query>'` when `path` starts with `#`, since a fragment must not be
22
+ * prefixed with `/` (it would navigate away from the current document).
23
+ * - `'/<path>'` or `'/<path>?<query>'` otherwise.
24
+ *
25
+ * @example
26
+ * buildUrl('accounts', { account_id: '42' }); // '/accounts?account_id=42'
27
+ * buildUrl('//accounts', {}); // '/accounts'
28
+ * buildUrl('#', { account_id: '42' }); // '#'
29
+ * buildUrl('#accounts', { account_id: '42' }); // '#accounts?account_id=42'
30
+ * buildUrl('', { tab: 'movimientos' }); // '/?tab=movimientos'
31
+ */
32
+ export default function buildUrl(path: string, params: Record<string, string | number>): string;
@@ -4,4 +4,6 @@ export { default as getQueryString } from './getQueryString';
4
4
  export { default as changeQueryString } from './changeQueryString';
5
5
  export { default as getCssVariable } from './getCssVariable';
6
6
  export { default as validatePhoneNumber } from './validatePhoneNumber';
7
+ export { default as sanitizeHref } from './sanitizeHref';
8
+ export { default as buildUrl } from './buildUrl';
7
9
  export * from './mediaQuery';
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Validates a `href` value and returns it only if it is safe to render as a link,
3
+ * preventing XSS through unsafe URL schemes and scheme-relative URLs.
4
+ *
5
+ * Before validating, the value is trimmed and every tab, line feed and carriage return is
6
+ * removed, because the URL parser ignores those characters too and they would otherwise
7
+ * hide an unsafe value from the checks below.
8
+ *
9
+ * A `href` is considered safe when it is either:
10
+ * - An absolute path starting with a single separator (e.g. `/accounts/42`). A leading `\`
11
+ * is normalized to `/` in the returned value, since that is how the browser resolves it.
12
+ * - A URL using one of the allowed schemes: `http:`, `https:`, `mailto:`, `tel:`.
13
+ *
14
+ * A `href` is rejected (returns `undefined`) when it is:
15
+ * - Empty or made only of whitespace/ignored characters (`''`, `' '`).
16
+ * - Scheme-relative (starts with two separators, e.g. `//evil.com`, `/\evil.com`,
17
+ * `/<TAB>/evil.com`), since the browser would resolve it using the current protocol and it
18
+ * can be used to redirect to an attacker-controlled host.
19
+ * - Using a disallowed/dangerous scheme, such as `javascript:` or `data:`
20
+ * (e.g. `javascript:alert(1)`, `data:text/html,<script>...</script>`).
21
+ * - Not parseable as an absolute URL and not an absolute path, such as bare fragments
22
+ * (`#anchor`) or scheme-less relative paths (`relative/path`). These cannot be validated
23
+ * against `SAFE_SCHEMES`, so they are rejected rather than assumed safe.
24
+ *
25
+ * @param href - The raw URL or path to validate, typically coming from user input,
26
+ * a CMS, or an external API.
27
+ * @returns The sanitized `href` when safe, `undefined` otherwise.
28
+ *
29
+ * @example
30
+ * sanitizeHref('/accounts/42'); // '/accounts/42'
31
+ * sanitizeHref('https://example.com'); // 'https://example.com'
32
+ * sanitizeHref('mailto:test@example.com'); // 'mailto:test@example.com'
33
+ * sanitizeHref('//evil.com'); // undefined
34
+ * sanitizeHref('/\\evil.com'); // undefined
35
+ * sanitizeHref('javascript:alert(1)'); // undefined
36
+ */
37
+ export default function sanitizeHref(href: string): string | undefined;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "sideEffects": [
4
4
  "*.css"
5
5
  ],
6
- "version": "2.8.0",
6
+ "version": "2.10.0",
7
7
  "description": "React Dynamic Framework",
8
8
  "license": "https://github.com/dynamic-framework/dynamic-ui/blob/master/LICENSE.md",
9
9
  "repository": {
@@ -40,14 +40,16 @@
40
40
  }
41
41
  ],
42
42
  "scripts": {
43
- "test": "jest",
44
- "test:watch": "jest --watch",
45
- "test:coverage": "jest --coverage",
43
+ "test": "jest --testPathPatterns=\\.spec\\.tsx?$",
44
+ "test:watch": "jest --testPathPatterns=\\.spec\\.tsx?$ --watch",
45
+ "test:coverage": "jest --testPathPatterns=\\.spec\\.tsx?$ --coverage",
46
+ "test:a11y": "jest --testPathPatterns=\\.a11y\\.test\\.tsx$",
46
47
  "test:storybook": "test-storybook",
47
- "build": "npm run clean && npm run build:react && npm run build:scss && npm run cp",
48
+ "build": "npm run clean && npm run build:react && npm run build:scss && npm run build:icons-core && npm run cp",
48
49
  "build:react": "tsc -p ./tsconfig.build.json && rollup -c rollup.config.mjs",
49
50
  "build:react:watch": "tsc -p ./tsconfig.build.json && rollup -c rollup.config.mjs",
50
51
  "build:scss": "node scripts/build-scss.js",
52
+ "build:icons-core": "npx tsx scripts/build-icons-core.ts",
51
53
  "build:scss:watch": "npx nodemon --watch src --ext scss --exec 'npm run build:scss'",
52
54
  "dev:ts": "tsc -p tsconfig.build.json",
53
55
  "dev:rollup": "rollup -c rollup.config.mjs",
@@ -80,13 +82,14 @@
80
82
  "prepare": "husky",
81
83
  "commitlint": "commitlint --edit",
82
84
  "verify": "node scripts/verify.js",
83
- "axe": "npx tsx scripts/generate-a11y-report.ts"
85
+ "axe": "npx tsx scripts/generate-a11y-report.ts",
86
+ "axe:browser": "npx tsx scripts/generate-a11y-browser-warnings.ts"
84
87
  },
85
88
  "engines": {
86
89
  "node": ">=22.0.0"
87
90
  },
88
91
  "main": "./dist/index.js",
89
- "module": "./dist/index.esm.js",
92
+ "module": "./dist/esm/index.js",
90
93
  "types": "./dist/types/index.d.ts",
91
94
  "files": [
92
95
  "dist/",
@@ -105,7 +108,6 @@
105
108
  "file-selector": "~2.1.2",
106
109
  "google-libphonenumber": "~3.2.43",
107
110
  "html2canvas": "^1.4.1",
108
- "jspdf": "^4.0.0",
109
111
  "lucide-react": "^0.553.0",
110
112
  "react-datepicker": "~8.3.0",
111
113
  "react-error-boundary": "^6.1.0",
@@ -130,6 +132,7 @@
130
132
  "@testing-library/user-event": "^14.6.1",
131
133
  "@types/google-libphonenumber": "~7.4.30",
132
134
  "@types/jest": "~29.5.12",
135
+ "@types/jest-axe": "^3.5.9",
133
136
  "@types/node": "^22.0.0",
134
137
  "@types/react": "^19.2.0",
135
138
  "@types/react-dom": "^19.2.0",
@@ -157,7 +160,7 @@
157
160
  "jest-axe": "^10.0.0",
158
161
  "jest-environment-jsdom": "^30.3.0",
159
162
  "lint-staged": "^15.2.10",
160
- "playwright": "^1.58.2",
163
+ "playwright": "1.61.1",
161
164
  "postcss-cli": "~10.1.0",
162
165
  "react": "~19.2.1",
163
166
  "react-docgen-typescript": "^2.4.0",
@@ -4,16 +4,12 @@
4
4
  flex: 1;
5
5
  }
6
6
 
7
+ // Deprecated by bootstrap 5.3, but still used in some components
7
8
  .text-muted {
8
9
  --#{$prefix}text-muted: var(--#{$prefix}gray-500);
9
10
  color: var(--#{$prefix}text-muted) !important;
10
11
  }
11
12
 
12
- .form-text {
13
- --#{$prefix}form-text: var(--#{$prefix}gray-500);
14
- color: var(--#{$prefix}form-text) !important;
15
- }
16
-
17
13
  .spinner-border {
18
14
  margin-top: 4px;
19
15
  margin-bottom: 4px;
@@ -91,6 +91,7 @@ $input-btn-border-width: var(--#{$prefix}border-width) !default;
91
91
  @import "cursors";
92
92
  @import "chips";
93
93
  @import "collapse-icon-text";
94
+ @import "box";
94
95
  @import "box-file";
95
96
  @import "datepicker";
96
97
  @import "input-phone";
@@ -0,0 +1,7 @@
1
+ // Box (DBox)
2
+
3
+ $box-component-bg: var(--#{$prefix}white) !default;
4
+ $box-component-border: 0 !default;
5
+ $box-component-border-radius: var(--#{$prefix}border-radius) !default;
6
+ $box-component-padding: var(--#{$prefix}ref-spacer-4) !default;
7
+ $box-component-shadow: var(--#{$prefix}box-shadow-sm) !default;
@@ -1,6 +1,6 @@
1
1
  // scss-docs-start form-text-variables
2
2
  $form-text-margin-top: var(--#{$prefix}ref-spacer-1) !default;
3
- $form-text-color: var(--#{$prefix}gray-400) !default;
3
+ $form-text-color: var(--#{$prefix}gray-500) !default;
4
4
  // scss-docs-end form-text-variables
5
5
 
6
6
  // scss-docs-start form-label-variables
@@ -81,8 +81,6 @@ $input-group-addon-border-color: transparent !default;
81
81
  // custom
82
82
  $input-group-sm-icon-size: $spacer-4 !default;
83
83
  $input-group-lg-icon-size: $spacer-6 !default;
84
- $form-text-padding-y: 0 !default;
85
- $form-text-padding-x: 0 !default;
86
84
  // end custom
87
85
 
88
86
  // scss-docs-start form-select-variables
@@ -1 +1,12 @@
1
- $box-shadow-lg: 0 10px 10px rgba(0, 0, 0, .02) !default;
1
+ // Shadows
2
+ //
3
+ // Bootstrap's shadow scale, declared here explicitly so the elevation ramp is
4
+ // visible in one place and can be retuned quickly. Keep it monotonic:
5
+ // `sm` < default < `lg`, otherwise the `.shadow-*` / `.hover:shadow-*`
6
+ // utilities stop matching what Bootstrap's docs show.
7
+ //
8
+ // scss-docs-start box-shadow-variables
9
+ $box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15) !default;
10
+ $box-shadow-sm: 0 .125rem .25rem rgba(0, 0, 0, .075) !default;
11
+ $box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, .175) !default;
12
+ // scss-docs-end box-shadow-variables
@@ -43,7 +43,6 @@
43
43
  @import "form-control";
44
44
  @import "form-range";
45
45
  @import "list-group";
46
- @import "form-text";
47
46
  @import "input-group";
48
47
  @import "buttons";
49
48
  @import "button-group";
@@ -8,10 +8,12 @@
8
8
  }
9
9
 
10
10
  .form-check {
11
+ // .form-check padding-start only accounts for the input width, the gap between
12
+ // the input and the label comes from .form-check-label's --bs-label-padding-x.
13
+ // The hint must repeat that offset to stay aligned with the label text.
11
14
  .form-text {
12
- --#{$prefix}form-text-padding: 0 var(--#{$prefix}ref-spacer-2);
13
-
14
15
  display: flex;
16
+ padding-inline: var(--#{$prefix}ref-spacer-2);
15
17
  }
16
18
 
17
19
  @each $state, $data in $form-validation-states {
@@ -1,9 +1,9 @@
1
1
  .d-box {
2
- --#{$prefix}box-component-bg: #{var(--#{$prefix}white)};
3
- --#{$prefix}box-component-border: 0;
4
- --#{$prefix}box-component-border-radius: #{var(--#{$prefix}border-radius)};
5
- --#{$prefix}box-component-padding: #{var(--#{$prefix}ref-spacer-4)};
6
- --#{$prefix}box-component-shadow: #{var(--#{$prefix}box-shadow-lg)};
2
+ --#{$prefix}box-component-bg: #{$box-component-bg};
3
+ --#{$prefix}box-component-border: #{$box-component-border};
4
+ --#{$prefix}box-component-border-radius: #{$box-component-border-radius};
5
+ --#{$prefix}box-component-padding: #{$box-component-padding};
6
+ --#{$prefix}box-component-shadow: #{$box-component-shadow};
7
7
 
8
8
  padding: var(--#{$prefix}box-component-padding);
9
9
  background-color: var(--#{$prefix}box-component-bg);
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,12 +0,0 @@
1
- .form-text {
2
- --#{$prefix}form-text-padding: #{$form-text-padding-y} #{$form-text-padding-x};
3
- --#{$prefix}form-text-gap: var(--#{$prefix}ref-spacer-1);
4
- --#{$prefix}form-text-color: #{$form-text-color};
5
-
6
- display: inline-flex;
7
- flex-direction: row;
8
- gap: var(--#{$prefix}form-text-gap);
9
- align-items: center;
10
- padding: var(--#{$prefix}form-text-padding);
11
- color: var(--#{$prefix}form-text-color);
12
- }