@dubai-design-system/components-js 5.0.3 → 5.1.1

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 (316) hide show
  1. package/CHANGELOG.md +233 -1
  2. package/MIGRATION.md +423 -0
  3. package/dist/cjs/dda-accordion.cjs.entry.js +12 -7
  4. package/dist/cjs/dda-alert.cjs.entry.js +20 -3
  5. package/dist/cjs/dda-attach-file.cjs.entry.js +24 -8
  6. package/dist/cjs/dda-avatar.cjs.entry.js +23 -12
  7. package/dist/cjs/dda-banner.cjs.entry.js +14 -5
  8. package/dist/cjs/dda-breadcrumb.cjs.entry.js +22 -10
  9. package/dist/cjs/dda-button.cjs.entry.js +16 -9
  10. package/dist/cjs/dda-checkbox.cjs.entry.js +5 -4
  11. package/dist/cjs/dda-chip.cjs.entry.js +8 -3
  12. package/dist/cjs/dda-credit-card.cjs.entry.js +5 -3
  13. package/dist/cjs/dda-creditcard-field.cjs.entry.js +26 -8
  14. package/dist/cjs/dda-dropdown.cjs.entry.js +31 -5
  15. package/dist/cjs/dda-footer.cjs.entry.js +9 -3
  16. package/dist/cjs/dda-header.cjs.entry.js +88 -8
  17. package/dist/cjs/dda-home-banner.cjs.entry.js +11 -5
  18. package/dist/cjs/dda-horizontal-stepper.cjs.entry.js +22 -5
  19. package/dist/cjs/dda-input.cjs.entry.js +17 -10
  20. package/dist/cjs/dda-link-button_2.cjs.entry.js +21 -13
  21. package/dist/cjs/dda-number-field.cjs.entry.js +20 -8
  22. package/dist/cjs/dda-pagination.cjs.entry.js +21 -11
  23. package/dist/cjs/dda-phonefield.cjs.entry.js +27 -9
  24. package/dist/cjs/dda-progressbar.cjs.entry.js +8 -3
  25. package/dist/cjs/dda-range-slider.cjs.entry.js +15 -3
  26. package/dist/cjs/dda-search-input.cjs.entry.js +27 -12
  27. package/dist/cjs/dda-segmented-tabs.cjs.entry.js +54 -6
  28. package/dist/cjs/dda-select.cjs.entry.js +40 -8
  29. package/dist/cjs/dda-sticky-footer.cjs.entry.js +20 -3
  30. package/dist/cjs/dda-tabs.cjs.entry.js +10 -4
  31. package/dist/cjs/dda-textarea.cjs.entry.js +22 -12
  32. package/dist/cjs/dda-toggle.cjs.entry.js +5 -4
  33. package/dist/cjs/dda-tooltip.cjs.entry.js +6 -4
  34. package/dist/cjs/dda-ui-card.cjs.entry.js +19 -2
  35. package/dist/cjs/dda-vertical-stepper.cjs.entry.js +23 -3
  36. package/dist/cjs/dda.cjs.js +2 -2
  37. package/dist/cjs/index-Bgd2iAET.js +2116 -0
  38. package/dist/cjs/loader.cjs.js +2 -2
  39. package/dist/cjs/unique-id-DahNGdQy.js +14 -0
  40. package/dist/collection/collection-manifest.json +1 -1
  41. package/dist/collection/components/dda-accordion/dda-accordion.js +16 -11
  42. package/dist/collection/components/dda-alert/dda-alert.js +74 -17
  43. package/dist/collection/components/dda-alert/dda-alert.stories.js +2 -8
  44. package/dist/collection/components/dda-attach-file/dda-attach-file.js +35 -19
  45. package/dist/collection/components/dda-attach-file/dda-attach-file.stories.js +0 -9
  46. package/dist/collection/components/dda-avatar/dda-avatar.js +53 -25
  47. package/dist/collection/components/dda-avatar/dda-avatar.stories.js +1 -1
  48. package/dist/collection/components/dda-banner/dda-banner.css +35 -0
  49. package/dist/collection/components/dda-banner/dda-banner.js +34 -5
  50. package/dist/collection/components/dda-breadcrumb/dda-breadcrumb.js +49 -12
  51. package/dist/collection/components/dda-button/dda-button.js +29 -22
  52. package/dist/collection/components/dda-checkbox/dda-checkbox.css +13 -0
  53. package/dist/collection/components/dda-checkbox/dda-checkbox.js +13 -12
  54. package/dist/collection/components/dda-checkbox/dda-checkbox.stories.js +0 -11
  55. package/dist/collection/components/dda-chip/dda-chip.js +34 -9
  56. package/dist/collection/components/dda-chip/dda-chip.stories.js +0 -11
  57. package/dist/collection/components/dda-credit-card/dda-credit-card.js +10 -8
  58. package/dist/collection/components/dda-creditcard-field/dda-creditcard-field.js +58 -23
  59. package/dist/collection/components/dda-creditcard-field/dda-creditcard-field.stories.js +1 -10
  60. package/dist/collection/components/dda-dropdown/dda-dropdown.js +90 -18
  61. package/dist/collection/components/dda-dropdown/dda-dropdown.stories.js +0 -4
  62. package/dist/collection/components/dda-footer/dda-footer.js +57 -10
  63. package/dist/collection/components/dda-footer/dda-footer.stories.js +5 -4
  64. package/dist/collection/components/dda-header/dda-header.css +11 -0
  65. package/dist/collection/components/dda-header/dda-header.js +232 -37
  66. package/dist/collection/components/dda-header/dda-header.stories.js +12 -21
  67. package/dist/collection/components/dda-home-banner/dda-home-banner.js +8 -2
  68. package/dist/collection/components/dda-home-banner/home-banner.css +23 -2
  69. package/dist/collection/components/dda-input/dda-input.js +47 -21
  70. package/dist/collection/components/dda-input/dda-input.stories.js +0 -13
  71. package/dist/collection/components/dda-link-button/dda-link-button.js +30 -23
  72. package/dist/collection/components/dda-number-field/dda-number-field.js +54 -22
  73. package/dist/collection/components/dda-number-field/dda-number-field.stories.js +0 -9
  74. package/dist/collection/components/dda-pagination/dda-pagination.js +95 -28
  75. package/dist/collection/components/dda-pagination/dda-pagination.stories.js +24 -24
  76. package/dist/collection/components/dda-phonefield/dda-phonefield.js +62 -24
  77. package/dist/collection/components/dda-phonefield/dda-phonefield.stories.js +0 -13
  78. package/dist/collection/components/dda-progressbar/dda-progressbar.js +13 -8
  79. package/dist/collection/components/dda-radiobutton/dda-radiobutton.css +156 -25
  80. package/dist/collection/components/dda-radiobutton/dda-radiobutton.js +13 -12
  81. package/dist/collection/components/dda-radiobutton/dda-radiobutton.stories.js +5 -16
  82. package/dist/collection/components/dda-range-slider/dda-range-slider.js +29 -17
  83. package/dist/collection/components/dda-search-input/dda-search-input.js +61 -26
  84. package/dist/collection/components/dda-search-input/dda-search-input.stories.js +0 -9
  85. package/dist/collection/components/dda-select/dda-select.js +78 -20
  86. package/dist/collection/components/dda-sticky-footer/dda-sticky-footer.js +80 -43
  87. package/dist/collection/components/dda-sticky-footer/dda-sticky-footer.stories.js +1 -1
  88. package/dist/collection/components/dda-tabs/dda-tabs.js +21 -15
  89. package/dist/collection/components/dda-tabs/dda-tabs.stories.js +3 -10
  90. package/dist/collection/components/dda-textarea/dda-textarea.js +33 -23
  91. package/dist/collection/components/dda-textarea/dda-textarea.stories.js +0 -9
  92. package/dist/collection/components/dda-toggle/dda-toggle.css +9 -0
  93. package/dist/collection/components/dda-toggle/dda-toggle.js +47 -8
  94. package/dist/collection/components/dda-toggle/dda-toggle.stories.js +10 -22
  95. package/dist/collection/components/dda-tooltip/dda-tooltip.js +9 -7
  96. package/dist/collection/components/dda-ui-card/dda-ui-card.js +55 -13
  97. package/dist/collection/components/segmented-groups/dda-segmented-tabs/dda-segmented-tabs.js +79 -11
  98. package/dist/collection/components/stepper/dda-horizontal-stepper/dda-horizontal-stepper.css +4 -1
  99. package/dist/collection/components/stepper/dda-horizontal-stepper/dda-horizontal-stepper.js +24 -6
  100. package/dist/collection/components/stepper/dda-horizontal-stepper/dda-horizontal-stepper.stories.js +2 -2
  101. package/dist/collection/components/stepper/dda-vertical-stepper/dda-vertical-stepper.js +49 -6
  102. package/dist/collection/components/stepper/dda-vertical-stepper/dda-vertical-stepper.stories.js +2 -2
  103. package/dist/collection/global/global.css +152 -25
  104. package/dist/collection/global/input.css +56 -2
  105. package/dist/collection/storybook/component-api.js +15 -0
  106. package/dist/collection/utils/placeholder-color.js +89 -0
  107. package/dist/collection/utils/unique-id.js +10 -0
  108. package/dist/components/dda-accordion.js +1 -1
  109. package/dist/components/dda-alert.js +1 -1
  110. package/dist/components/dda-attach-file.js +1 -1
  111. package/dist/components/dda-avatar.js +1 -1
  112. package/dist/components/dda-banner.js +1 -1
  113. package/dist/components/dda-breadcrumb.js +1 -1
  114. package/dist/components/dda-button.js +1 -1
  115. package/dist/components/dda-checkbox.js +1 -1
  116. package/dist/components/dda-chip.js +1 -1
  117. package/dist/components/dda-credit-card.js +1 -1
  118. package/dist/components/dda-creditcard-field.js +1 -1
  119. package/dist/components/dda-dropdown.js +1 -1
  120. package/dist/components/dda-footer.js +1 -1
  121. package/dist/components/dda-header.js +1 -1
  122. package/dist/components/dda-home-banner.js +1 -1
  123. package/dist/components/dda-horizontal-stepper.js +1 -1
  124. package/dist/components/dda-input.js +1 -1
  125. package/dist/components/dda-link-button.js +1 -1
  126. package/dist/components/dda-number-field.js +1 -1
  127. package/dist/components/dda-pagination.js +1 -1
  128. package/dist/components/dda-phonefield.js +1 -1
  129. package/dist/components/dda-progressbar.js +1 -1
  130. package/dist/components/dda-radiobutton.js +1 -1
  131. package/dist/components/dda-range-slider.js +1 -1
  132. package/dist/components/dda-search-input.js +1 -1
  133. package/dist/components/dda-segmented-tabs.js +1 -1
  134. package/dist/components/dda-select.js +1 -1
  135. package/dist/components/dda-sticky-footer.js +1 -1
  136. package/dist/components/dda-tabs.js +1 -1
  137. package/dist/components/dda-textarea.js +1 -1
  138. package/dist/components/dda-toggle.js +1 -1
  139. package/dist/components/dda-tooltip.js +1 -1
  140. package/dist/components/dda-ui-card.js +1 -1
  141. package/dist/components/dda-vertical-stepper.js +1 -1
  142. package/dist/components/index.js +1 -1
  143. package/dist/components/p-B-I003EB.js +1 -0
  144. package/dist/components/p-Bc2V1U4_.js +1 -0
  145. package/dist/components/p-Bzqf-PpF.js +1 -0
  146. package/dist/components/p-D-CHT-as.js +1 -0
  147. package/dist/components/p-DJw8qV7U.js +1 -0
  148. package/dist/components/p-DpwQ9sGp.js +1 -0
  149. package/dist/dda/dda.css +2 -2
  150. package/dist/dda/dda.esm.js +1 -1
  151. package/dist/dda/p-03400387.entry.js +1 -0
  152. package/dist/dda/p-04bcda8a.entry.js +1 -0
  153. package/dist/dda/p-18a3d7b1.entry.js +1 -0
  154. package/dist/dda/p-1f7b8486.entry.js +1 -0
  155. package/dist/dda/p-3024288f.entry.js +1 -0
  156. package/dist/dda/p-41b8ed7d.entry.js +1 -0
  157. package/dist/dda/p-56f60336.entry.js +1 -0
  158. package/dist/dda/p-65776d80.entry.js +1 -0
  159. package/dist/dda/p-73611084.entry.js +1 -0
  160. package/dist/dda/p-7ad8cde9.entry.js +1 -0
  161. package/dist/dda/p-8134e59d.entry.js +1 -0
  162. package/dist/dda/p-8494fd9e.entry.js +1 -0
  163. package/dist/dda/p-876d55b2.entry.js +1 -0
  164. package/dist/dda/p-88d884a8.entry.js +1 -0
  165. package/dist/dda/p-8b25ae94.entry.js +1 -0
  166. package/dist/dda/p-8f376986.entry.js +1 -0
  167. package/dist/dda/p-90019b80.entry.js +1 -0
  168. package/dist/dda/p-92fa4777.entry.js +1 -0
  169. package/dist/dda/p-97431faf.entry.js +1 -0
  170. package/dist/dda/p-B-I003EB.js +1 -0
  171. package/dist/dda/p-D6L6zgH9.js +2 -0
  172. package/dist/dda/p-a5456de2.entry.js +1 -0
  173. package/dist/dda/p-aa7b4c13.entry.js +1 -0
  174. package/dist/dda/p-ad40eb27.entry.js +1 -0
  175. package/dist/dda/p-c055f0d2.entry.js +1 -0
  176. package/dist/dda/p-c42c8733.entry.js +1 -0
  177. package/dist/dda/p-c77282be.entry.js +1 -0
  178. package/dist/dda/p-ca64abe6.entry.js +1 -0
  179. package/dist/dda/p-ceca8088.entry.js +1 -0
  180. package/dist/dda/p-d6786b43.entry.js +1 -0
  181. package/dist/dda/p-e2113e42.entry.js +1 -0
  182. package/dist/dda/p-ee862207.entry.js +1 -0
  183. package/dist/dda/p-ef38e28b.entry.js +1 -0
  184. package/dist/dda/p-f43fb910.entry.js +1 -0
  185. package/dist/dda/p-fb4db977.entry.js +1 -0
  186. package/dist/esm/dda-accordion.entry.js +12 -7
  187. package/dist/esm/dda-alert.entry.js +20 -3
  188. package/dist/esm/dda-attach-file.entry.js +24 -8
  189. package/dist/esm/dda-avatar.entry.js +23 -12
  190. package/dist/esm/dda-banner.entry.js +14 -5
  191. package/dist/esm/dda-breadcrumb.entry.js +22 -10
  192. package/dist/esm/dda-button.entry.js +16 -9
  193. package/dist/esm/dda-checkbox.entry.js +5 -4
  194. package/dist/esm/dda-chip.entry.js +8 -3
  195. package/dist/esm/dda-credit-card.entry.js +5 -3
  196. package/dist/esm/dda-creditcard-field.entry.js +26 -8
  197. package/dist/esm/dda-dropdown.entry.js +31 -5
  198. package/dist/esm/dda-footer.entry.js +9 -3
  199. package/dist/esm/dda-header.entry.js +88 -8
  200. package/dist/esm/dda-home-banner.entry.js +11 -5
  201. package/dist/esm/dda-horizontal-stepper.entry.js +22 -5
  202. package/dist/esm/dda-input.entry.js +17 -10
  203. package/dist/esm/dda-link-button_2.entry.js +21 -13
  204. package/dist/esm/dda-number-field.entry.js +20 -8
  205. package/dist/esm/dda-pagination.entry.js +21 -11
  206. package/dist/esm/dda-phonefield.entry.js +27 -9
  207. package/dist/esm/dda-progressbar.entry.js +8 -3
  208. package/dist/esm/dda-range-slider.entry.js +15 -3
  209. package/dist/esm/dda-search-input.entry.js +27 -12
  210. package/dist/esm/dda-segmented-tabs.entry.js +54 -6
  211. package/dist/esm/dda-select.entry.js +40 -8
  212. package/dist/esm/dda-sticky-footer.entry.js +20 -3
  213. package/dist/esm/dda-tabs.entry.js +10 -4
  214. package/dist/esm/dda-textarea.entry.js +22 -12
  215. package/dist/esm/dda-toggle.entry.js +5 -4
  216. package/dist/esm/dda-tooltip.entry.js +6 -4
  217. package/dist/esm/dda-ui-card.entry.js +19 -2
  218. package/dist/esm/dda-vertical-stepper.entry.js +23 -3
  219. package/dist/esm/dda.js +3 -3
  220. package/dist/esm/index-D6L6zgH9.js +2106 -0
  221. package/dist/esm/loader.js +3 -3
  222. package/dist/esm/unique-id-B-I003EB.js +12 -0
  223. package/dist/types/components/dda-accordion/dda-accordion.d.ts +6 -0
  224. package/dist/types/components/dda-alert/dda-alert.d.ts +21 -0
  225. package/dist/types/components/dda-attach-file/dda-attach-file.d.ts +17 -0
  226. package/dist/types/components/dda-attach-file/dda-attach-file.stories.d.ts +0 -4
  227. package/dist/types/components/dda-avatar/dda-avatar.d.ts +20 -0
  228. package/dist/types/components/dda-banner/dda-banner.d.ts +5 -0
  229. package/dist/types/components/dda-breadcrumb/dda-breadcrumb.d.ts +12 -6
  230. package/dist/types/components/dda-button/dda-button.d.ts +15 -4
  231. package/dist/types/components/dda-checkbox/dda-checkbox.d.ts +11 -0
  232. package/dist/types/components/dda-checkbox/dda-checkbox.stories.d.ts +0 -10
  233. package/dist/types/components/dda-chip/dda-chip.d.ts +10 -0
  234. package/dist/types/components/dda-chip/dda-chip.stories.d.ts +0 -6
  235. package/dist/types/components/dda-credit-card/dda-credit-card.d.ts +7 -0
  236. package/dist/types/components/dda-creditcard-field/dda-creditcard-field.d.ts +24 -0
  237. package/dist/types/components/dda-creditcard-field/dda-creditcard-field.stories.d.ts +0 -6
  238. package/dist/types/components/dda-dropdown/dda-dropdown.d.ts +25 -0
  239. package/dist/types/components/dda-dropdown/dda-dropdown.stories.d.ts +0 -4
  240. package/dist/types/components/dda-footer/dda-footer.d.ts +13 -0
  241. package/dist/types/components/dda-header/dda-header.d.ts +62 -0
  242. package/dist/types/components/dda-header/dda-header.stories.d.ts +6 -0
  243. package/dist/types/components/dda-home-banner/dda-home-banner.d.ts +1 -0
  244. package/dist/types/components/dda-input/dda-input.d.ts +18 -0
  245. package/dist/types/components/dda-input/dda-input.stories.d.ts +0 -6
  246. package/dist/types/components/dda-link-button/dda-link-button.d.ts +14 -3
  247. package/dist/types/components/dda-number-field/dda-number-field.d.ts +21 -0
  248. package/dist/types/components/dda-number-field/dda-number-field.stories.d.ts +0 -6
  249. package/dist/types/components/dda-pagination/dda-pagination.d.ts +26 -0
  250. package/dist/types/components/dda-phonefield/dda-phonefield.d.ts +21 -0
  251. package/dist/types/components/dda-phonefield/dda-phonefield.stories.d.ts +0 -6
  252. package/dist/types/components/dda-progressbar/dda-progressbar.d.ts +7 -0
  253. package/dist/types/components/dda-radiobutton/dda-radiobutton.d.ts +11 -0
  254. package/dist/types/components/dda-radiobutton/dda-radiobutton.stories.d.ts +5 -15
  255. package/dist/types/components/dda-range-slider/dda-range-slider.d.ts +16 -0
  256. package/dist/types/components/dda-search-input/dda-search-input.d.ts +21 -0
  257. package/dist/types/components/dda-search-input/dda-search-input.stories.d.ts +0 -6
  258. package/dist/types/components/dda-select/dda-select.d.ts +23 -0
  259. package/dist/types/components/dda-sticky-footer/dda-sticky-footer.d.ts +46 -3
  260. package/dist/types/components/dda-tabs/dda-tabs.d.ts +12 -1
  261. package/dist/types/components/dda-tabs/dda-tabs.stories.d.ts +0 -4
  262. package/dist/types/components/dda-textarea/dda-textarea.d.ts +16 -0
  263. package/dist/types/components/dda-textarea/dda-textarea.stories.d.ts +0 -6
  264. package/dist/types/components/dda-toggle/dda-toggle.d.ts +11 -0
  265. package/dist/types/components/dda-toggle/dda-toggle.stories.d.ts +2 -12
  266. package/dist/types/components/dda-tooltip/dda-tooltip.d.ts +5 -0
  267. package/dist/types/components/dda-ui-card/dda-ui-card.d.ts +13 -1
  268. package/dist/types/components/segmented-groups/dda-segmented-tabs/dda-segmented-tabs.d.ts +19 -2
  269. package/dist/types/components/stepper/dda-horizontal-stepper/dda-horizontal-stepper.d.ts +6 -0
  270. package/dist/types/components/stepper/dda-vertical-stepper/dda-vertical-stepper.d.ts +8 -0
  271. package/dist/types/components.d.ts +2373 -38
  272. package/dist/types/utils/placeholder-color.d.ts +10 -0
  273. package/dist/types/utils/unique-id.d.ts +6 -0
  274. package/package.json +4 -3
  275. package/readme.md +6 -0
  276. package/dist/cjs/index-CDUC0Pdj.js +0 -1986
  277. package/dist/components/p-9UeqjDnY.js +0 -1
  278. package/dist/components/p-CrTEb7xH.js +0 -1
  279. package/dist/components/p-DldlmGnP.js +0 -1
  280. package/dist/components/p-NvTw9Mx1.js +0 -1
  281. package/dist/components/p-i15-_er0.js +0 -1
  282. package/dist/dda/p-016e4090.entry.js +0 -1
  283. package/dist/dda/p-0229b303.entry.js +0 -1
  284. package/dist/dda/p-05a6f90d.entry.js +0 -1
  285. package/dist/dda/p-1c9a6035.entry.js +0 -1
  286. package/dist/dda/p-2c313105.entry.js +0 -1
  287. package/dist/dda/p-2cec7be6.entry.js +0 -1
  288. package/dist/dda/p-2f4ace4c.entry.js +0 -1
  289. package/dist/dda/p-360a0577.entry.js +0 -1
  290. package/dist/dda/p-3e49128d.entry.js +0 -1
  291. package/dist/dda/p-3fa27728.entry.js +0 -1
  292. package/dist/dda/p-43e1c12f.entry.js +0 -1
  293. package/dist/dda/p-4428417d.entry.js +0 -1
  294. package/dist/dda/p-44ce832e.entry.js +0 -1
  295. package/dist/dda/p-560a3f0c.entry.js +0 -1
  296. package/dist/dda/p-5712bbd9.entry.js +0 -1
  297. package/dist/dda/p-626d7e7b.entry.js +0 -1
  298. package/dist/dda/p-68008c64.entry.js +0 -1
  299. package/dist/dda/p-6f3d9f78.entry.js +0 -1
  300. package/dist/dda/p-79db1218.entry.js +0 -1
  301. package/dist/dda/p-84911fab.entry.js +0 -1
  302. package/dist/dda/p-90d9648b.entry.js +0 -1
  303. package/dist/dda/p-91040abe.entry.js +0 -1
  304. package/dist/dda/p-Cq6A4mXg.js +0 -2
  305. package/dist/dda/p-a1421a54.entry.js +0 -1
  306. package/dist/dda/p-a22b1c56.entry.js +0 -1
  307. package/dist/dda/p-aa0e9035.entry.js +0 -1
  308. package/dist/dda/p-b2981646.entry.js +0 -1
  309. package/dist/dda/p-c1f45887.entry.js +0 -1
  310. package/dist/dda/p-c50e1141.entry.js +0 -1
  311. package/dist/dda/p-d8a9cab1.entry.js +0 -1
  312. package/dist/dda/p-dd966009.entry.js +0 -1
  313. package/dist/dda/p-ed099201.entry.js +0 -1
  314. package/dist/dda/p-f4bd2b2e.entry.js +0 -1
  315. package/dist/dda/p-fc30c60e.entry.js +0 -1
  316. package/dist/esm/index-Cq6A4mXg.js +0 -1976
package/CHANGELOG.md CHANGED
@@ -4,6 +4,238 @@ All notable changes to the Dubai Design System packages are documented in this f
4
4
  All four published packages (`components-js`, `components-react`, `components-vue`,
5
5
  `components-angular`) share a version and release together.
6
6
 
7
+ ## 5.1.1 (2026-09-18)
8
+
9
+ A patch release. It fixes the transparent header on scroll, video slides in the home banner, and
10
+ focus hidden under the sticky footer, and adds an `autocomplete` prop to `dda-input`.
11
+
12
+ ### Features
13
+
14
+ - **dda-input: new `autocomplete` prop.** It sets the `autocomplete` attribute of the inner
15
+ `<input>`, so browsers can fill in fields such as `name`, `email` and `tel`. Set it on every
16
+ field that asks for information about the user (WCAG 1.3.5, Identify Input Purpose). There is no
17
+ default: without the prop, the input has no `autocomplete` attribute, the same as before.
18
+
19
+ ### Bug Fixes
20
+
21
+ - **dda-home-banner: video slides fill the banner.** The slide media rule styled only `<img>`,
22
+ so a `<video>` in a `<slide>` did not cover the slide. `<video>` now gets the same full-size
23
+ `object-fit: cover` rule as `<img>`.
24
+ - **dda-header: the transparent style shows only at the top of the page.** On a page with
25
+ `<body class="transparent">`, the header became transparent again with its black gradient
26
+ when you scrolled up in the middle of the page, over the page content. The header now adds a
27
+ `dda-scrolled` class to itself when the page is not at the top, and the transparent rules
28
+ apply only without that class. Below the top, the header uses the standard white style.
29
+ - **dda-sticky-footer: the bar no longer hides focused content (WCAG 2.4.11).** The fixed bar
30
+ covered the bottom 64px of the viewport, so a control there could get keyboard focus under
31
+ it. The page now sets `scroll-padding-bottom` and a `body` `padding-bottom` from
32
+ `--dda-sticky-footer-height`. Focused and scrolled-to elements stay above the bar, and the
33
+ end of the page scrolls clear of it. Pages without the component are not affected.
34
+
35
+ ### Behaviour Changes
36
+
37
+ - **Transparent header selectors are more specific.** The rules that were `.transparent X` are
38
+ now `.transparent dda-header:not(.dda-scrolled) X`. If you override the transparent header in
39
+ your own CSS with `.transparent ...` selectors, add `dda-header:not(.dda-scrolled)` to them,
40
+ or they will no longer win.
41
+
42
+ ## 5.1.0 (2026-09-14)
43
+
44
+ A minor release. It adds a working header search, and fixes issues a consumer reported after
45
+ upgrading to 5.0.3 plus layout and API faults found while building a vanilla JS sample site
46
+ against the published package. The two `dda-header` navigation faults were also present in
47
+ 3.12.x; they are fixed here, not newly introduced.
48
+
49
+ **Upgrading?** `MIGRATION.md`, which ships next to this file, has a step-by-step guide from
50
+ 5.0.x, 4.1.0 and 3.x, with the searches to run and the attributes to change.
51
+
52
+ ### Features
53
+
54
+ - **dda-header: the search works.** The desktop field is now a `<form role="search">`, so
55
+ Enter submits. Every non-empty search emits a cancelable `searchSubmit` event with
56
+ `detail.query`. The new `search_action` prop sends the search to a results page with a
57
+ plain GET, using `search_input_name` (default `q`) as the parameter, so static sites need no
58
+ JavaScript; cancel the event to route inside an app. On phone-width screens the search button
59
+ now opens a search field under the header, with `aria-expanded`, focus moved into the field,
60
+ and Escape or a close button to dismiss it.
61
+ - **Components report user choices.** New events: dda-pagination `pageChange`
62
+ (`{ page }`), dda-select `selectionChange` (`{ value }`, only when the value changes),
63
+ dda-dropdown and dda-avatar `optionSelect` (`{ value }`, on every pick), and
64
+ dda-creditcard-field `valueChange` (`{ value }`). dda-ui-card now fires its `linkClick` event,
65
+ which was declared but never emitted (detail: the click `MouseEvent`), and dda-tabs `tabClick`
66
+ is typed as the tab index it always sent. The props these components update themselves
67
+ (`current_page`, `total_pages`, `selected`, `value`) are declared mutable.
68
+ - **New props for data that was hardcoded or unreachable:** `dda-toggle` `title_text` and
69
+ `supporting`, `dda-footer` `logo-description`, `dda-breadcrumb` `breadcrumbs`, and
70
+ `dda-vertical-stepper` `current_step` (details below).
71
+
72
+ ### Accessibility
73
+
74
+ Fixes from an axe-core and accessibility-tree audit of a sample site built on the package.
75
+
76
+ - **Icon names are no longer read aloud (1.1.1, 4.1.2).** Decorative Material icons in
77
+ dda-button, dda-link-button, dda-accordion, dda-checkbox, dda-chip, dda-pagination, dda-tabs,
78
+ dda-segmented-tabs, dda-select, dda-dropdown, dda-number-field, dda-phonefield,
79
+ dda-search-input, dda-textarea, dda-alert, dda-ui-card and dda-header are `aria-hidden`, so a
80
+ button reads "Continue", not "Continue arrow_forward".
81
+ - **Icon-only controls have names.** New label props with English defaults:
82
+ dda-alert `close_button_label` ("Close"), dda-chip `close_button_label` ("Remove"),
83
+ dda-search-input `clear_button_label` ("Clear search"), dda-pagination
84
+ `previous_button_label` / `next_button_label` ("Previous page" / "Next page"),
85
+ dda-dropdown / dda-number-field / dda-phonefield `toggle_button_label`, dda-header
86
+ `menu_button_label` ("Menu", replacing the text "hamburger menu text"), and dda-segmented-tabs
87
+ `icon_labels` for icon-only segments. Toggles that open a list set `aria-expanded`, and
88
+ dda-pagination marks the current page with `aria-current="page"`.
89
+ - **Form labels are connected without an id prop (1.3.1, 4.1.2).** Found with WAVE. The
90
+ fields rendered `<label for={input_id}>` and `<input id={input_id}>`, so without the prop the
91
+ label pointed nowhere. dda-input, dda-textarea, dda-search-input, dda-attach-file,
92
+ dda-number-field, dda-phonefield, dda-creditcard-field, dda-select, dda-dropdown and
93
+ dda-range-slider now generate a unique id when `input_id` / `button_id` / the slider ids are
94
+ not set; the props still win when set.
95
+ - **dda-select and dda-dropdown announce the chosen value.** The label no longer names the
96
+ trigger through `for`; the trigger uses `aria-labelledby` (label, then its own text), so a
97
+ screen reader hears "Topic, General question", not only "Topic".
98
+ - **dda-attach-file works with a keyboard and screen reader (2.1.1).** The file input was
99
+ `display: none`. It is now visually hidden but focusable, the "Choose File" control shows a
100
+ focus ring, the input is named "Choose file" without a visible label, and the remove button
101
+ is named "Remove <file name>". The input stays in the page after a file is chosen, so a native
102
+ form submit includes the file.
103
+ - **dda-phonefield is a telephone input.** It was `type="number"`, announced as a spin button,
104
+ changed by arrow keys, and dropped leading zeros. It is now `type="tel"` with
105
+ `autocomplete="tel-national"` by default, and country options have unique ids.
106
+ - **dda-range-slider inputs are named** "Minimum" and "Maximum" by default, and are no longer
107
+ wrapped in empty `<label>` elements.
108
+ - **dda-textarea in rich text mode** no longer points its label's `for` at the editor `<div>`.
109
+ - **Keyboard focus is visible on dda-checkbox and dda-toggle (2.4.7).**
110
+ - **dda-banner is reachable by keyboard (2.1.1).** The slide row is one focusable, named
111
+ region (`aria_label`, default "Slides") with a focus ring.
112
+ - **Placeholder text meets 4.5:1 (1.4.3).** Grouped and single fields use
113
+ `--dda-on-surface-variant-40`: 6.49:1 in light theme and 7.46:1 in dark theme, up from 3.18:1.
114
+ - **dda-home-banner text stays readable over any photo (1.4.3).** A built-in scrim sits behind
115
+ the slide text, mirrored for right-to-left pages.
116
+ - **Links in running text are underlined (1.4.1).** `dda.css` removed every link underline;
117
+ unclassed links inside `p`, `td`, `dd`, `blockquote` and `figcaption` now keep one.
118
+ - **Heading levels can follow the page outline.** New `heading_level` prop on dda-alert
119
+ (default 4), dda-footer (default 4) and dda-ui-card (default 3, was a fixed `h1`).
120
+ - **dda-sticky-footer is an `<aside>` named "Quick actions"** (`aria_label`), so it no longer
121
+ adds a second footer landmark. Its services image is decorative when the text is shown.
122
+ - **dda-header:** the language buttons carry `lang` (`language_lang`, default `ar`); the
123
+ side-menu language button uses `language_text`; the ReadSpeaker item is rendered only when
124
+ `read-speaker-link` is set; and logo links use `first-logo-href` / `second-logo-href`
125
+ (default `/`, previously `#`).
126
+
127
+ ### Bug Fixes
128
+
129
+ - **Headings rendered at body size.** `legacy-compat.css` sized `h1`–`h6`, `.h1`–`.h6` and
130
+ `.dda-h1`–`.dda-h6` with `--font-h1`…`--font-h6 !important`, and the same file used
131
+ `--font-body`, `--font-caption`, `--font-display`, `--font-small`, `--line-height-*`,
132
+ `--font-weight-*` and `--gap-*`. None of these were defined, so every heading, the legacy
133
+ caption and body classes, the Light/Regular/Medium/Bold weights and `.dda-gap-xs/-lg` fell
134
+ back to inherited values. They are now defined as aliases of the current tokens (with zero
135
+ specificity, so a site's own values still win), and the heading, body and caption rules no
136
+ longer use `!important`, so component classes keep their own sizes. Present since 5.0.0.
137
+ - **dda-home-banner: the slide title was tiny on laptop screens.** A rule in `dda.css` for
138
+ landscape screens up to 1600px wide set the slide title to 1.2rem and the subtitle to 1rem,
139
+ so most laptops showed a 19px hero title instead of the display size (36px at a 16px base).
140
+ The rule now applies only to short landscape screens (600px tall or less), such as a phone on
141
+ its side, where the full-height banner cannot fit the large title.
142
+ - **dda-home-banner: the slide controls were hidden behind the quick-link cards.** The cards
143
+ rise by the sticky footer height (new in this release), but the previous/next/pause controls
144
+ and dots stayed at a fixed offset, so on large screens they sat under the white cards: invisible,
145
+ yet still clickable. The controls now rise by the same `--dda-sticky-footer-height`.
146
+ - **dda-header: the transparent header gradient blocked taps.** Its 250px decorative gradient
147
+ reaches below the header and caught pointer events, so on short landscape screens the slide
148
+ call-to-action under it could not be clicked. The gradient now ignores pointer events.
149
+ - **Crashes on missing data.** dda-credit-card no longer throws without `card_number` (it
150
+ shows `****`) and renders the card-type image only when `card_type` is set.
151
+ dda-horizontal-stepper, dda-vertical-stepper and dda-segmented-tabs no longer throw on a
152
+ missing or invalid JSON attribute, re-render when `steps`, `items` or `selected_index`
153
+ change, and segmented tabs accept non-string items.
154
+ - **dda-header: the page scrolled behind the open side menu.** While the hamburger menu is
155
+ open, the page underneath no longer scrolls on touch or wheel input; the menu itself still
156
+ does. The lock is released when the menu closes by any route and when the header is removed.
157
+
158
+ - **dda-header: the top menu was invisible at the site root.** When
159
+ `location.pathname` was `/`, the header added the `transparent` class to its own
160
+ `<header>`. The link and icon rules matched and turned the menu white, but the background
161
+ rule needs a `.transparent` *ancestor* and never matched, so the header stayed white. The
162
+ quick links were white on white on every site's home page.
163
+ - **dda-header: side-menu submenu links did not navigate.** Every link below the first level
164
+ of `side-menu-items` cancelled its click to toggle a submenu, including links with no
165
+ submenu. Those links now navigate. Links that open a submenu still toggle it.
166
+ - **dda-banner: slides rendered unstyled.** The component shipped only
167
+ `:host { display: block }`, so slides stacked as bare images. They now sit in a horizontal
168
+ row that scrolls and snaps one slide at a time. Smooth scrolling is off under
169
+ `prefers-reduced-motion`.
170
+ - **dda-banner: a missing or invalid `slides` attribute threw.** It now renders an empty
171
+ banner and logs no error.
172
+ - **dda-horizontal-stepper: the active line ran past the stepper on the last step.** The
173
+ connector drawn after the active step has no next step to reach on the last one, so it
174
+ widened the page. The last step no longer draws it.
175
+ - **dda-vertical-stepper: `current_step` was ignored.** The prop was `current_Step`, whose
176
+ HTML attribute is `current_-step`, so the `current_step` attribute used in the docs never
177
+ moved the active step. `current_step` is now a real prop. `current_Step` (and
178
+ `current_-step`) keep working as a deprecated alias; `current_step` wins when both are set.
179
+ - **dda-number-field, dda-phonefield: the fields overflowed narrow containers.** The grouped
180
+ `<input>` kept its intrinsic width, so the number field's currency button sat outside the
181
+ field and the phone field grew past its grid cell. The input now shrinks to the space left.
182
+ The rule is in the shared `input.css`, so every grouped field benefits.
183
+ - **dda-radiobutton: the circle was invisible without `size`.** It took its dimensions only
184
+ from `size="sm|md|lg"`. It now defaults to the `md` size (21px).
185
+ - **dda-footer: the text under the logo was hardcoded.** It always read "Design outstanding
186
+ interfaces with advanced Figma features in a matter of minutes." It now comes from the new
187
+ `logo-description` attribute (`logoDescription` property).
188
+ - **dda-toggle: the label text was hardcoded.** Every toggle showed "Radio Button Title" and
189
+ "Supporting Text". The text now comes from the new `title_text` and `supporting` props, the
190
+ names `dda-checkbox` and `dda-radiobutton` already use.
191
+ - **dda-breadcrumb: the items could only be set with the `data-breadcrumbs` attribute.** It
192
+ was read once and was not a prop, so frameworks and scripts could not set the items as a
193
+ property, and later changes did not re-render. The new `breadcrumbs` prop takes an array or
194
+ a JSON string and re-renders when it changes. `data-breadcrumbs` still works when the prop is
195
+ not set, and invalid JSON renders no items instead of throwing.
196
+ - **dda-sticky-footer: the fixed bar covered the home-page quick-link cards.**
197
+ `.quick-links-wrap` sat 45px above the bottom of the banner, less than the bar's height, so
198
+ at 1366×900 the bar hid the bottom 52px of the cards. The sticky footer now sets
199
+ `--dda-sticky-footer-height` on `:root`, and `.quick-links-wrap` adds it to its offset. Pages
200
+ without a sticky footer, and the stacked layout below 992px, keep the 45px offset.
201
+ - **dda.css: Material icons in quick-link cards had no size.** `.quick-links .link-item` sized
202
+ only `svg` icons. Material Icons `<i>` glyphs now get the same size, spacing and color.
203
+
204
+ ### Behaviour Changes
205
+
206
+ - **dda-header no longer chooses the transparent style from the URL.** To show the
207
+ transparent header over a dark hero, set the class on an ancestor, as the static templates
208
+ do: `<body class="transparent">`. The header now renders both the colored and the white
209
+ logo, and CSS shows the correct one. The old automatic style never showed a transparent
210
+ background, so no page that rendered correctly before changes.
211
+ - **dda-home-banner logs a console warning when it finds no `<slide>` children.** Only
212
+ `<slide>` elements are shown; a banner built from `<div>` or card elements used to render
213
+ blank without a hint.
214
+ - **dda-footer shows no text under the logo unless `logo-description` is set.** Sites that
215
+ kept the placeholder sentence lose it; set `logo-description` to show your own text.
216
+ - **dda-toggle shows no label text unless `title_text` or `supporting` is set.** Set
217
+ `title_text` for a visible label, or keep `aria_label` for an accessible name only.
218
+ - **dda-sticky-footer writes `--dda-sticky-footer-height` on `:root`** while it is on the
219
+ page, and removes it when it is removed.
220
+ - **dda-header search no longer renders `id="ddaSearch"`.** Each header gets its own input
221
+ ids, so two headers on a page no longer clash. Code that used
222
+ `getElementById('ddaSearch')` should listen for `searchSubmit` instead.
223
+ - **dda-header adds `dda-scroll-lock` to `<html>` while the side menu is open,** which sets
224
+ `overflow: hidden` on `html` and `body`.
225
+ - **dda-ui-card renders its title as `h3`, not `h1`.** Set `heading_level` to keep another level.
226
+ - **dda-sticky-footer renders `<aside>`, not `<footer>`.** Selectors such as
227
+ `dda-sticky-footer footer` must use the `.dda-footer` class.
228
+ - **dda-header logo links point to `/` by default,** not `#`. Set `first-logo-href` and
229
+ `second-logo-href` for another URL.
230
+ - **dda-header hides the ReadSpeaker item when `read-speaker-link` is not set.** It did nothing
231
+ without the link.
232
+ - **Placeholder text is darker, links in running text are underlined, and home-banner slides
233
+ have a scrim.** These are deliberate contrast fixes; check pages that restyled them.
234
+ - **Headings are larger.** With the heading fix, `h1`–`h6` follow the type scale (for example
235
+ `h1` 57px and `h3` 40px at a 16px base) instead of 16px, and component titles use their own
236
+ sizes (alert title 24px, card title 18px, footer title 36px). Check pages that relied on
237
+ headings rendering at body size.
238
+
7
239
  ## 5.0.3 (2026-09-08)
8
240
 
9
241
  An accessibility release for `dda-header`. The search and accessibility controls in the
@@ -127,7 +359,7 @@ stylesheet produced a 404 for all twelve font URLs and fell back to `sans-serif`
127
359
 
128
360
  A full accessibility and correctness review of all 34 components. This is a **major**
129
361
  release: several fixes change the rendered DOM, remove hardcoded ids, or alter which CSS
130
- selectors match. **See [MIGRATION.md](../../MIGRATION.md) for what to change in your own code.**
362
+ selectors match. **See `MIGRATION.md`, which ships next to this file, for what to change in your own code.**
131
363
  `docs/a11y/consumer-impact.md` has the verified, itemised list with file and line
132
364
  citations, and `docs/a11y/findings.md` records the 51 findings behind them.
133
365
 
package/MIGRATION.md ADDED
@@ -0,0 +1,423 @@
1
+ # Upgrading to 5.1
2
+
3
+ This guide takes you from any earlier release of the Dubai Design System packages to
4
+ **5.1.0**. It ships inside `@dubai-design-system/components-js` as `MIGRATION.md`, next to
5
+ `CHANGELOG.md`.
6
+
7
+ All four packages share one version and must be upgraded together:
8
+ `@dubai-design-system/components-js`, `components-react`, `components-vue` and
9
+ `components-angular`.
10
+
11
+ ---
12
+
13
+ ## 1. Find your starting point
14
+
15
+ Check the version you have now:
16
+
17
+ ```bash
18
+ npm ls @dubai-design-system/components-js
19
+ ```
20
+
21
+ Then read the sections for your version, in this order:
22
+
23
+ | You are on | Read |
24
+ | --- | --- |
25
+ | **5.0.x** (5.0.0 – 5.0.3) | [Every upgrade](#2-every-upgrade-checklist) → [5.0.x to 5.1.0](#3-from-50x-to-510) |
26
+ | **4.1.0** | [Every upgrade](#2-every-upgrade-checklist) → [From 4.1.0](#5-from-410) → [From 3.x](#6-from-3x-to-50) → [5.0.x to 5.1.0](#3-from-50x-to-510) |
27
+ | **3.x** (3.12.16 or earlier) | [Every upgrade](#2-every-upgrade-checklist) → [From 3.x](#6-from-3x-to-50) → [Notes from 5.0.1](#4-notes-from-501-fonts-and-the-stylesheet) → [5.0.x to 5.1.0](#3-from-50x-to-510) |
28
+
29
+ Most pages need only a few attribute changes. The changes that can break something
30
+ **silently**, with no error in the console, are marked **Silent**. Search for those first.
31
+
32
+ ---
33
+
34
+ ## 2. Every upgrade: checklist
35
+
36
+ Do these whatever version you start from.
37
+
38
+ - [ ] **Install the same exact version of every DDA package.**
39
+
40
+ ```bash
41
+ npm install @dubai-design-system/components-js@5.1.0
42
+ # and, if you use a wrapper:
43
+ npm install @dubai-design-system/components-react@5.1.0 # or -vue / -angular
44
+ ```
45
+
46
+ - [ ] **Load `dda.css`.** It carries the global styles and the Dubai typeface. From npm:
47
+ `import '@dubai-design-system/components-js/dist/dda/dda.css';`. From the CDN, see
48
+ [CDN users](#7-cdn-users).
49
+ - [ ] **Load the icon fonts.** `dda.css` ships no icon font. Without these links, icons render
50
+ as words such as `chevron_right`.
51
+
52
+ ```html
53
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
54
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" rel="stylesheet">
55
+ ```
56
+
57
+ - [ ] **If you bundle with Vite or Rollup, do not use the lazy loader.**
58
+ `defineCustomElements()` from `components-js/loader` (and the Vue plugin, which calls it)
59
+ loads component chunks with dynamic imports these bundlers cannot follow, so the
60
+ components never render. Import each component you use instead:
61
+
62
+ ```js
63
+ import '@dubai-design-system/components-js/dist/components/dda-header.js';
64
+ import '@dubai-design-system/components-js/dist/components/dda-button.js';
65
+ ```
66
+
67
+ The CDN loader and the React wrapper are not affected.
68
+
69
+ - [ ] **If you self-host `dda.css`,** copy `dist/assets/fonts/` next to it and keep the
70
+ relative path `../assets/fonts/dubai/`, or the Dubai typeface does not load.
71
+ - [ ] **Clear any cached copy of the old package** (CDN edge cache, service worker, build
72
+ cache) and load every page type once: home page, a content page, a form, and a page on a
73
+ phone-width screen.
74
+
75
+ ---
76
+
77
+ ## 3. From 5.0.x to 5.1.0
78
+
79
+ ### Triage: run these first
80
+
81
+ ```bash
82
+ # header: the old fixed search id is gone
83
+ grep -rn "ddaSearch" src/
84
+
85
+ # header: pages that relied on the automatic transparent style at "/"
86
+ grep -rln "<dda-header" src/
87
+
88
+ # vertical stepper: the prop that used to work
89
+ grep -rn "current_-step\|current_Step" src/
90
+
91
+ # components that showed placeholder text you may have relied on
92
+ grep -rn "<dda-toggle\|<dda-footer" src/
93
+
94
+ # manual offsets you may have added around the home-page quick links
95
+ grep -rn "quick-links-wrap" src/
96
+ ```
97
+
98
+ ### Changes that need action
99
+
100
+ **`dda-header` no longer turns transparent by itself at `/`.** **Silent.**
101
+ Before 5.1.0 the header added a `transparent` class to itself on the site root. That made the
102
+ menu links white while the header stayed white, so the top menu was invisible on every home
103
+ page. The header now never guesses from the URL.
104
+
105
+ - To keep a transparent header over a dark hero image, add the class to an ancestor:
106
+
107
+ ```html
108
+ <body class="transparent">
109
+ ```
110
+
111
+ - The header now renders both logos and CSS shows the right one. If you set only
112
+ `first-logo-src`, it is also used on the transparent header; set `first-logo-white-src`
113
+ (and `second-logo-white-src`) for a white version.
114
+
115
+ **`dda-header` search is now a real search.** **Silent** if you scripted the old field.
116
+ The old field was not in a form and did nothing. It is now a `<form role="search">`:
117
+
118
+ - `id="ddaSearch"` is gone. Every header gets its own ids, so two headers on a page no
119
+ longer clash. Replace `document.getElementById('ddaSearch')` with the new event.
120
+ - Pressing Enter emits a cancelable `searchSubmit` event with `detail.query`.
121
+ - Set `search_action` to a results page and the browser goes there with the query, no
122
+ JavaScript needed. The parameter name is `search_input_name`, default `q`.
123
+ - On phone-width screens the search button now opens a search field under the header.
124
+
125
+ ```html
126
+ <!-- static site: results page reads ?q= -->
127
+ <dda-header search_action="/search.html"></dda-header>
128
+ ```
129
+
130
+ ```js
131
+ // app with its own router
132
+ header.addEventListener('searchSubmit', (event) => {
133
+ event.preventDefault();
134
+ router.push(`/search?q=${encodeURIComponent(event.detail.query)}`);
135
+ });
136
+ ```
137
+
138
+ In React the event is `onSearchSubmit`.
139
+
140
+ **`dda-toggle` shows no label unless you set one.**
141
+ It used to show the fixed text "Radio Button Title" and "Supporting Text". Set the new props:
142
+
143
+ ```html
144
+ <dda-toggle input_id="news" title_text="Newsletter" supporting="One email a month"></dda-toggle>
145
+ ```
146
+
147
+ Keep `aria_label` when there is no visible label.
148
+
149
+ **`dda-footer` shows no text under the logo unless you set it.**
150
+ It used to show the fixed sentence "Design outstanding interfaces with advanced Figma
151
+ features in a matter of minutes." Set `logo-description` (`logoDescription` in JavaScript and
152
+ the wrappers) to show your own text.
153
+
154
+ **`dda-vertical-stepper` reads `current_step`.**
155
+ The old prop was `current_Step`, and its HTML attribute was `current_-step`, so the documented
156
+ `current_step` attribute did nothing. `current_step` now works. It counts from 0: `1` is the
157
+ second step. `current_Step` and `current_-step` still work but are deprecated; move to
158
+ `current_step`.
159
+
160
+ **Side-menu links below the first level now navigate.**
161
+ Before 5.1.0 every nested `side-menu-items` link cancelled its click. Links without a
162
+ `subMenu` now go to their `href`. Check that nested items have real URLs; `"#"` now jumps to
163
+ the top of the page.
164
+
165
+ **Accessibility fixes that change markup.** **Silent** if your CSS or scripts target the old markup.
166
+
167
+ - `dda-sticky-footer` renders `<aside aria-label="Quick actions">`, not `<footer>`. Replace
168
+ selectors such as `dda-sticky-footer footer` with `dda-sticky-footer .dda-footer`.
169
+ - `dda-ui-card` renders its title as `h3`, not `h1`. Set `heading_level` (1–6) to match your
170
+ page outline, and target `.dda-card-title`, not `h1`.
171
+ - `dda-header` logo links go to `/` instead of `#`. Set `first-logo-href` and
172
+ `second-logo-href`, especially if your site is served under a subpath, where `/` leaves it. The ReadSpeaker item shows only when `read-speaker-link` is set.
173
+ - `dda-phonefield` renders `type="tel"`, not `type="number"`, and `autocomplete` defaults to
174
+ `tel-national`. Code that read `valueAsNumber` or relied on the number spinner must read the
175
+ string value instead; set `autocomplete="tel"` to keep the old hint.
176
+ - `dda-select` and `dda-dropdown` labels have no `for` attribute any more; the trigger is named
177
+ with `aria-labelledby`. Clicking the label still opens the list. `dda-range-slider` inputs are
178
+ wrapped in `<span>`, not `<label>`.
179
+ - `dda-attach-file` always renders its file input (visually hidden). Selectors that assumed
180
+ the input disappears after a file is chosen must change.
181
+ - Icon-only buttons now have English default names ("Close", "Remove", "Clear search",
182
+ "Previous page", "Next page", "Menu"). On an Arabic page, set the matching `*_label` props.
183
+
184
+ ### Changes to check, no code change expected
185
+
186
+ - **Headings are larger.** Before 5.1.0 an undefined token made every heading, `.dda-h1`–`.dda-h6`
187
+ and component title render at body size (16px). Headings now follow the type scale (`h1`
188
+ 57px, `h2` 48px, `h3` 40px at a 16px base) and component titles use their own sizes. If a page
189
+ looks too large, set a smaller heading level or class rather than restyling the tokens; to
190
+ change the scale itself, override `--dda-h1`…`--dda-h6`.
191
+
192
+ - **The page no longer scrolls behind the open hamburger menu.** While the menu is open, the
193
+ header adds `dda-scroll-lock` to `<html>`, which sets `overflow: hidden` on `html` and
194
+ `body`. If your own CSS sets `overflow` on `html` or `body`, check the open menu on a phone.
195
+ - **`dda-sticky-footer` sets `--dda-sticky-footer-height` on `:root`,** and the home-page
196
+ `.quick-links-wrap` adds it to its bottom offset, so the cards sit above the fixed bar.
197
+ Remove any offset you added yourself.
198
+ - **`dda-radiobutton` shows its circle without `size`.** It defaults to the `md` size (21px).
199
+ Radios without `size` were invisible before.
200
+ - **`dda-number-field` and `dda-phonefield` fit narrow containers.** The input now shrinks, so
201
+ the currency button stays inside the field.
202
+ - **`dda-horizontal-stepper`** no longer draws a line past its right edge on the last step,
203
+ which widened the page.
204
+ - **`dda-banner`** lays out its slides as a horizontal row that scrolls and snaps, instead of
205
+ stacked images. A missing `slides` attribute no longer throws.
206
+ - **`dda-home-banner`** logs a console warning when it has no `<slide>` children. Only
207
+ `<slide>` elements are shown.
208
+ - **Material icons in `.quick-links .link-item`** get the same size as SVG icons.
209
+ - **Placeholder text is darker** (4.5:1 contrast or better), **links inside paragraphs and table
210
+ cells are underlined**, and **home-banner slides have a dark scrim behind the text.** If you
211
+ restyled any of these, check that your override still meets contrast.
212
+ - **`dda-checkbox` and `dda-toggle` show a focus ring** under keyboard focus, and the
213
+ `dda-banner` slide row is a keyboard tab stop.
214
+
215
+ ### New, optional
216
+
217
+ | Component | Addition | Use it to |
218
+ | --- | --- | --- |
219
+ | `dda-header` | `search_action` prop, `searchSubmit` event | Send searches to a results page or your router |
220
+ | `dda-breadcrumb` | `breadcrumbs` prop (array or JSON string) | Set items from JavaScript or a framework; `data-breadcrumbs` still works |
221
+ | `dda-toggle` | `title_text`, `supporting` | Show a visible label |
222
+ | `dda-footer` | `logo-description` | Show text under the footer logo |
223
+ | `dda-vertical-stepper` | `current_step` | Set the active step |
224
+ | `dda-alert`, `dda-footer`, `dda-ui-card` | `heading_level` | Match the heading level to your page |
225
+ | `dda-alert`, `dda-chip`, `dda-search-input`, `dda-pagination`, `dda-dropdown`, `dda-number-field`, `dda-phonefield`, `dda-header` | `*_label` props | Name icon-only buttons, e.g. in Arabic |
226
+ | `dda-segmented-tabs` | `icon_labels` | Name icon-only segments |
227
+ | `dda-header` | `first-logo-href`, `second-logo-href`, `language_lang` | Logo link targets, language of the language button |
228
+ | `dda-banner`, `dda-sticky-footer` | `aria_label` | Name the slide region / quick actions |
229
+ | `dda-pagination` | `pageChange` event | React when the user changes page |
230
+ | `dda-select` | `selectionChange` event | React when the selected value changes |
231
+ | `dda-dropdown`, `dda-avatar` | `optionSelect` event | React to a menu pick |
232
+ | `dda-creditcard-field` | `valueChange` event | Read the value as the user types |
233
+ | `dda-ui-card` | `linkClick` event (now fired) | Track or intercept card link clicks |
234
+
235
+ ---
236
+
237
+ ## 4. Notes from 5.0.1: fonts and the stylesheet
238
+
239
+ Read this if you start from 5.0.0 or earlier.
240
+
241
+ - The Dubai typeface is declared only in `dist/dda/dda.css`. A page that loads the components
242
+ but not `dda.css` falls back to a sans-serif font. Load `dda.css`.
243
+ - The font files ship in `dist/assets/fonts/dubai/` as `woff2`, `woff` and `ttf`. The old `eot`
244
+ and `svg` formats are gone; they served only Internet Explorer and very old Safari.
245
+ - The React and Vue wrappers published with 5.0.0 missed some props and events
246
+ (`autocomplete`, `input_id`, `selected_index`, `segmentChange`). 5.0.1 and later have them.
247
+
248
+ ---
249
+
250
+ ## 5. From 4.1.0
251
+
252
+ `4.1.0` was published in February 2025 and was never tagged `latest`; most sites never used it.
253
+ It is a separate build and is not documented component by component. Known differences:
254
+
255
+ - It has no `dda-banner`, `dda-home-banner` or `dda-ui-card`.
256
+ - It publishes no `dist/dda/dda.css`. Add it (see the checklist).
257
+ - Its `dda-header` is an older implementation. Re-check the header on desktop and on a phone.
258
+
259
+ Treat a 4.1.0 site like a 3.x site: follow [From 3.x](#6-from-3x-to-50), then
260
+ [5.0.x to 5.1.0](#3-from-50x-to-510), and check every page visually.
261
+
262
+ ---
263
+
264
+ ## 6. From 3.x to 5.0
265
+
266
+ **Why there is no 4.x to upgrade through:** `4.1.0` already existed on npm, so the next major
267
+ skipped to 5 to keep `^4` ranges from resolving to that older build.
268
+
269
+ Most consumers need to change nothing here. These changes affect you only if you wrote CSS or
270
+ JavaScript that reaches inside a component's rendered markup, or used one of the fixed ids the
271
+ components used to emit.
272
+
273
+ ### Triage
274
+
275
+ ```bash
276
+ # hardcoded ids these components used to emit
277
+ grep -rn "getElementById('search')\|getElementById(\"search\")\|#search\b" src/
278
+ grep -rn "getElementById('editor')\|getElementById(\"editor\")\|#editor\b" src/
279
+
280
+ # reaching into a shadow root that no longer exists
281
+ grep -rn "shadowRoot" src/ | grep -i "footer"
282
+ grep -rn "::part(" src/
283
+
284
+ # selectors keyed on an element type that changed
285
+ grep -rn "div\.accordion-header\|span\.chip-close\|div\.dots" src/
286
+ grep -rn "\.dda-avatar\s*>\|\.dda-avatar >" src/
287
+ ```
288
+
289
+ Then load a page in dark theme and look at the footers. If they looked unstyled before, they
290
+ are now fully styled; that is the intended fix.
291
+
292
+ ### Breaking changes
293
+
294
+ #### `dda-footer` and `dda-sticky-footer` no longer use shadow DOM
295
+
296
+ They rendered as **unstyled raw HTML** in 3.x: their shadow stylesheet was empty and global
297
+ CSS could not reach inside. They now render fully styled.
298
+
299
+ | | 3.x | 5.0 and later |
300
+ |---|---|---|
301
+ | `element.shadowRoot` | a `ShadowRoot` | `null` |
302
+ | `::part(...)` | targetable | nothing to target |
303
+ | Appearance | unstyled | fully styled |
304
+
305
+ **Migrate:** delete any `shadowRoot` traversal or `::part()` rules for these two and style them
306
+ with ordinary selectors. **Re-check your footer layout visually**; this is a total visual
307
+ change.
308
+
309
+ #### Hardcoded ids removed: `#search` and `#editor` — **Silent**
310
+
311
+ `dda-search-input` emitted `id="search"` and `dda-textarea` emitted `id="editor"` on every
312
+ instance, which gave duplicate ids as soon as a page used two.
313
+
314
+ ```html
315
+ <!-- 3.x: the id was implicit -->
316
+ <dda-search-input label="Find"></dda-search-input>
317
+ <script>document.getElementById('search').focus()</script>
318
+
319
+ <!-- 5.0 and later: you supply the id -->
320
+ <dda-search-input label="Find" input_id="site-search"></dda-search-input>
321
+ <script>document.getElementById('site-search').focus()</script>
322
+ ```
323
+
324
+ **Migrate:** set `input_id` (both components) to the id your code expects.
325
+ `getElementById` just returns `null`, so search for these rather than waiting for an error.
326
+
327
+ #### `dda-search-input`'s label now points at the input
328
+
329
+ In 3.x the visible `<label for>` targeted the clear button. It now targets the text field.
330
+ **Migrate:** set `input_id`; without it the label has nothing to point at.
331
+
332
+ #### `dda-avatar` wraps its content in `.avatar-trigger`
333
+
334
+ ```html
335
+ <!-- 3.x -->
336
+ <dda-avatar><div class="dda-avatar"><img …></div></dda-avatar>
337
+
338
+ <!-- 5.0 and later: a wrapper always sits between -->
339
+ <dda-avatar><div class="dda-avatar">
340
+ <button class="avatar-trigger"><img …></button> <!-- when `options` is set -->
341
+ <div class="avatar-trigger"><img …></div> <!-- when it is not -->
342
+ </div></dda-avatar>
343
+ ```
344
+
345
+ **Migrate:** replace direct-child selectors (`.dda-avatar > img`) with descendant selectors
346
+ (`.dda-avatar img`).
347
+
348
+ #### Element types changed on three controls
349
+
350
+ These were `div`/`span` elements with a click handler and no keyboard access.
351
+
352
+ | Component | 3.x | 5.0 and later | Class |
353
+ |---|---|---|---|
354
+ | `dda-accordion` | `div.accordion-header` | `button.accordion-header` | unchanged |
355
+ | `dda-chip` | `span.chip-close` | `button.chip-close` | unchanged |
356
+ | `dda-home-banner` | `div.dots` (direct `ul` child) | `li > button.dots` | unchanged |
357
+
358
+ **Migrate:** drop the element type from your selectors (`.accordion-header`, not
359
+ `div.accordion-header`). For the banner dots, also drop any direct-child combinator: there is
360
+ now an `<li>` in between.
361
+
362
+ ### Behaviour changes to check
363
+
364
+ - **`dda-header` sets `scroll-padding-top` on `:root`** (170px; 100px below 767px), so keyboard
365
+ focus cannot land behind the fixed header. Every anchor jump and `scrollIntoView()` on the
366
+ page is offset. Remove any manual compensation or you will double-offset.
367
+ - **`dda-home-banner` writes `inert` and `aria-hidden` onto your `<slide>` elements.** Slides
368
+ that are not showing cannot be focused or clicked. It also became a working carousel, with
369
+ autoplay, previous/next/pause controls and a live region.
370
+ - **`dda-segmented-tabs` selects its first segment on load.** In 3.x it had no interactivity.
371
+ - **`dda-sticky-footer` marks itself `inert` while scroll-hidden.**
372
+ - **`dda-tabs`:** `aria_label` names the tab group; each tab is named by its own text.
373
+ - **`dda-pagination`:** dot spacing 8px → 15px, so the control is wider.
374
+ - **`dda-tooltip`:** `Escape` dismisses an open tooltip.
375
+ - **Dark theme:** `--dda-primary-variant-95` and `--dda-color-warning-40` changed value. Info
376
+ alerts get a deeper fill; warning alerts a brighter amber.
377
+ - **Muted and disabled text is darker in light theme,** for readable contrast. Disabled
378
+ controls look more present than before; that is deliberate.
379
+ - **`dda-header`'s accessibility icon** changed from `accessible_forward` to `accessibility`.
380
+
381
+ ### New props from 5.0
382
+
383
+ | Component | Prop | Why |
384
+ |---|---|---|
385
+ | `dda-search-input`, `dda-textarea` | `input_id` | Restores a removed hardcoded id |
386
+ | `dda-creditcard-field`, `dda-phonefield` | `autocomplete` | Browser autofill |
387
+ | `dda-progressbar` | `aria_label` | Names the progress bar for screen readers |
388
+ | `dda-home-banner` | `autoplay`, `interval`, label props | The carousel is real now |
389
+ | `dda-segmented-tabs` | `selected_index` | Choose the initially selected segment |
390
+
391
+ ### `dda.css` if you used `@latest` on the CDN
392
+
393
+ `dist/dda/dda.css` was **missing from 3.12.16**, and the CDN served a stale cached copy from an
394
+ older release. 5.0.0 and later ship the file again, as a superset of that copy: every class in
395
+ it is still present. Those legacy rules are kept for compatibility and will be removed only in
396
+ a future major release, with notice.
397
+
398
+ ---
399
+
400
+ ## 7. CDN users
401
+
402
+ jsDelivr syncs from npm automatically. Always use an **exact version**: replace `X.X.X` with
403
+ the version you are upgrading to.
404
+
405
+ ```html
406
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@dubai-design-system/components-js@X.X.X/dist/dda/dda.css" />
407
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" />
408
+ <script type="module">
409
+ import { defineCustomElements } from 'https://cdn.jsdelivr.net/npm/@dubai-design-system/components-js@X.X.X/loader/index.es2017.js';
410
+ defineCustomElements();
411
+ </script>
412
+ ```
413
+
414
+ Do **not** use `@latest` or leave the version out. jsDelivr caches version aliases, and an
415
+ unversioned loader URL loads chunks from mixed versions, which stops components rendering.
416
+
417
+ ---
418
+
419
+ ## If something breaks that is not listed here
420
+
421
+ Note the component, the version you came from, the browser, and what you expected to see, and
422
+ report it to the Dubai Design System team. An undocumented change is a gap in this guide, not
423
+ your mistake.