@dubai-design-system/components-js 5.1.1 → 5.3.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 (259) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/MIGRATION.md +196 -15
  3. package/dist/cjs/dda-accordion.cjs.entry.js +3 -3
  4. package/dist/cjs/dda-alert.cjs.entry.js +3 -3
  5. package/dist/cjs/dda-attach-file.cjs.entry.js +3 -3
  6. package/dist/cjs/dda-avatar.cjs.entry.js +7 -7
  7. package/dist/cjs/dda-banner-card.cjs.entry.js +26 -0
  8. package/dist/cjs/dda-banner.cjs.entry.js +3 -3
  9. package/dist/cjs/dda-breadcrumb.cjs.entry.js +2 -2
  10. package/dist/cjs/dda-button.cjs.entry.js +3 -3
  11. package/dist/cjs/dda-checkbox.cjs.entry.js +3 -3
  12. package/dist/cjs/dda-chip.cjs.entry.js +3 -3
  13. package/dist/cjs/dda-credit-card.cjs.entry.js +3 -3
  14. package/dist/cjs/dda-creditcard-field.cjs.entry.js +3 -3
  15. package/dist/cjs/dda-dropdown.cjs.entry.js +3 -3
  16. package/dist/cjs/dda-footer.cjs.entry.js +3 -3
  17. package/dist/cjs/dda-header.cjs.entry.js +201 -14
  18. package/dist/cjs/dda-home-banner.cjs.entry.js +5 -5
  19. package/dist/cjs/dda-home-carousel.cjs.entry.js +28 -0
  20. package/dist/cjs/dda-horizontal-stepper.cjs.entry.js +3 -3
  21. package/dist/cjs/dda-input.cjs.entry.js +3 -3
  22. package/dist/cjs/dda-link-button_2.cjs.entry.js +6 -6
  23. package/dist/cjs/dda-number-field.cjs.entry.js +3 -3
  24. package/dist/cjs/dda-pagination.cjs.entry.js +3 -3
  25. package/dist/cjs/dda-phonefield.cjs.entry.js +3 -3
  26. package/dist/cjs/dda-progressbar.cjs.entry.js +3 -3
  27. package/dist/cjs/dda-range-slider.cjs.entry.js +3 -3
  28. package/dist/cjs/dda-search-input.cjs.entry.js +3 -3
  29. package/dist/cjs/dda-segmented-tabs.cjs.entry.js +4 -4
  30. package/dist/cjs/dda-select.cjs.entry.js +3 -3
  31. package/dist/cjs/dda-sticky-footer.cjs.entry.js +52 -4
  32. package/dist/cjs/dda-tabs.cjs.entry.js +3 -3
  33. package/dist/cjs/dda-textarea.cjs.entry.js +4 -4
  34. package/dist/cjs/dda-toggle.cjs.entry.js +3 -3
  35. package/dist/cjs/dda-tooltip.cjs.entry.js +3 -3
  36. package/dist/cjs/dda-ui-card.cjs.entry.js +2 -2
  37. package/dist/cjs/dda-vertical-stepper.cjs.entry.js +2 -2
  38. package/dist/cjs/dda.cjs.js +2 -2
  39. package/dist/cjs/{index-Bgd2iAET.js → index-DD8fdSxb.js} +1 -1
  40. package/dist/cjs/loader.cjs.js +2 -2
  41. package/dist/cjs/parse-json-prop-B0KWD8qe.js +38 -0
  42. package/dist/collection/collection-manifest.json +5 -3
  43. package/dist/collection/components/dda-accordion/dda-accordion.js +1 -1
  44. package/dist/collection/components/dda-alert/dda-alert.js +1 -1
  45. package/dist/collection/components/dda-alert/dda-alert.stories.js +27 -20
  46. package/dist/collection/components/dda-attach-file/dda-attach-file.js +1 -1
  47. package/dist/collection/components/dda-avatar/dda-avatar.js +5 -5
  48. package/dist/collection/components/dda-banner/dda-banner.js +1 -1
  49. package/dist/collection/components/dda-banner-card/dda-banner-card.js +243 -0
  50. package/dist/collection/components/dda-button/dda-button.js +1 -1
  51. package/dist/collection/components/dda-checkbox/dda-checkbox.js +1 -1
  52. package/dist/collection/components/dda-chip/dda-chip.js +1 -1
  53. package/dist/collection/components/dda-credit-card/dda-credit-card.js +1 -1
  54. package/dist/collection/components/dda-creditcard-field/dda-creditcard-field.js +1 -1
  55. package/dist/collection/components/dda-dropdown/dda-dropdown.js +1 -1
  56. package/dist/collection/components/dda-footer/dda-footer.js +1 -1
  57. package/dist/collection/components/dda-header/dda-header.js +853 -81
  58. package/dist/collection/components/dda-header/dda-header.stories.js +219 -33
  59. package/dist/collection/components/dda-header/nav-model.js +69 -0
  60. package/dist/collection/components/dda-home-banner/dda-home-banner.js +2 -2
  61. package/dist/collection/components/dda-home-banner/home-banner.css +12 -2
  62. package/dist/collection/components/dda-home-carousel/dda-home-carousel.js +164 -0
  63. package/dist/collection/components/dda-home-carousel/dda-home-carousel.stories.js +24 -0
  64. package/dist/collection/components/dda-input/dda-input.js +1 -1
  65. package/dist/collection/components/dda-link-button/dda-link-button.js +2 -2
  66. package/dist/collection/components/dda-number-field/dda-number-field.js +1 -1
  67. package/dist/collection/components/dda-pagination/dda-pagination.js +1 -1
  68. package/dist/collection/components/dda-phonefield/dda-phonefield.js +1 -1
  69. package/dist/collection/components/dda-progressbar/dda-progressbar.js +1 -1
  70. package/dist/collection/components/dda-radiobutton/dda-radiobutton.css +355 -9
  71. package/dist/collection/components/dda-radiobutton/dda-radiobutton.js +1 -1
  72. package/dist/collection/components/dda-range-slider/dda-range-slider.js +2 -2
  73. package/dist/collection/components/dda-search-input/dda-search-input.js +1 -1
  74. package/dist/collection/components/dda-select/dda-select.js +1 -1
  75. package/dist/collection/components/dda-sticky-footer/dda-sticky-footer.js +511 -9
  76. package/dist/collection/components/dda-sticky-footer/dda-sticky-footer.stories.js +24 -2
  77. package/dist/collection/components/dda-tabs/dda-tabs.js +1 -1
  78. package/dist/collection/components/dda-textarea/dda-textarea.js +2 -2
  79. package/dist/collection/components/dda-toggle/dda-toggle.js +1 -1
  80. package/dist/collection/components/dda-tooltip/dda-tooltip.js +1 -1
  81. package/dist/collection/components/dda-ui-card/dda-ui-card.js +1 -1
  82. package/dist/collection/components/segmented-groups/dda-segmented-tabs/dda-segmented-tabs.css +29 -9
  83. package/dist/collection/components/segmented-groups/dda-segmented-tabs/dda-segmented-tabs.js +1 -1
  84. package/dist/collection/components/stepper/dda-horizontal-stepper/dda-horizontal-stepper.js +1 -1
  85. package/dist/collection/components/stepper/dda-vertical-stepper/dda-vertical-stepper.js +1 -1
  86. package/dist/collection/global/global.css +355 -9
  87. package/dist/collection/utils/parse-json-prop.js +34 -0
  88. package/dist/components/dda-accordion.js +1 -1
  89. package/dist/components/dda-alert.js +1 -1
  90. package/dist/components/dda-attach-file.js +1 -1
  91. package/dist/components/dda-avatar.js +1 -1
  92. package/dist/components/dda-banner-card.d.ts +11 -0
  93. package/dist/components/dda-banner-card.js +1 -0
  94. package/dist/components/dda-banner.js +1 -1
  95. package/dist/components/dda-breadcrumb.js +1 -1
  96. package/dist/components/dda-button.js +1 -1
  97. package/dist/components/dda-checkbox.js +1 -1
  98. package/dist/components/dda-chip.js +1 -1
  99. package/dist/components/dda-credit-card.js +1 -1
  100. package/dist/components/dda-creditcard-field.js +1 -1
  101. package/dist/components/dda-dropdown.js +1 -1
  102. package/dist/components/dda-footer.js +1 -1
  103. package/dist/components/dda-header.js +1 -1
  104. package/dist/components/dda-home-banner.js +1 -1
  105. package/dist/components/dda-home-carousel.d.ts +11 -0
  106. package/dist/components/dda-home-carousel.js +1 -0
  107. package/dist/components/dda-horizontal-stepper.js +1 -1
  108. package/dist/components/dda-input.js +1 -1
  109. package/dist/components/dda-link-button.js +1 -1
  110. package/dist/components/dda-number-field.js +1 -1
  111. package/dist/components/dda-pagination.js +1 -1
  112. package/dist/components/dda-phonefield.js +1 -1
  113. package/dist/components/dda-progressbar.js +1 -1
  114. package/dist/components/dda-radiobutton.js +1 -1
  115. package/dist/components/dda-range-slider.js +1 -1
  116. package/dist/components/dda-search-input.js +1 -1
  117. package/dist/components/dda-segmented-tabs.js +1 -1
  118. package/dist/components/dda-select.js +1 -1
  119. package/dist/components/dda-sticky-footer.js +1 -1
  120. package/dist/components/dda-tabs.js +1 -1
  121. package/dist/components/dda-textarea.js +1 -1
  122. package/dist/components/dda-toggle.js +1 -1
  123. package/dist/components/dda-tooltip.js +1 -1
  124. package/dist/components/dda-ui-card.js +1 -1
  125. package/dist/components/dda-vertical-stepper.js +1 -1
  126. package/dist/components/index.js +1 -1
  127. package/dist/components/p-BCtBptNq.js +1 -0
  128. package/dist/components/p-BP6BxgDV.js +1 -0
  129. package/dist/components/p-BZzFtOHg.js +1 -0
  130. package/dist/components/p-CvcFE821.js +1 -0
  131. package/dist/components/p-D3e_hki9.js +1 -0
  132. package/dist/components/p-DCwxgkNU.js +1 -0
  133. package/dist/components/p-R9p4F9Pi.js +1 -0
  134. package/dist/dda/dda.css +1 -53
  135. package/dist/dda/dda.esm.js +1 -1
  136. package/dist/dda/p-0480f0a9.entry.js +1 -0
  137. package/dist/dda/p-06188c4c.entry.js +1 -0
  138. package/dist/dda/p-08e1892a.entry.js +1 -0
  139. package/dist/dda/p-10c5a752.entry.js +1 -0
  140. package/dist/dda/p-169ba650.entry.js +1 -0
  141. package/dist/dda/p-25058697.entry.js +1 -0
  142. package/dist/dda/p-32a7c588.entry.js +1 -0
  143. package/dist/dda/{p-fb4db977.entry.js → p-333205aa.entry.js} +1 -1
  144. package/dist/dda/p-46df4933.entry.js +1 -0
  145. package/dist/dda/p-47322b02.entry.js +1 -0
  146. package/dist/dda/{p-04bcda8a.entry.js → p-4e717a2e.entry.js} +1 -1
  147. package/dist/dda/p-5840fad9.entry.js +1 -0
  148. package/dist/dda/p-5bb62ef7.entry.js +1 -0
  149. package/dist/dda/p-5e757702.entry.js +1 -0
  150. package/dist/dda/p-6430c363.entry.js +1 -0
  151. package/dist/dda/p-6d4f5672.entry.js +1 -0
  152. package/dist/dda/p-6db5588a.entry.js +1 -0
  153. package/dist/dda/p-76859bf8.entry.js +1 -0
  154. package/dist/dda/p-7c1abbd2.entry.js +1 -0
  155. package/dist/dda/p-7ffce954.entry.js +1 -0
  156. package/dist/dda/p-8108c4ed.entry.js +1 -0
  157. package/dist/dda/p-8852dafb.entry.js +1 -0
  158. package/dist/dda/p-8dbbc0ca.entry.js +1 -0
  159. package/dist/dda/p-95100f73.entry.js +1 -0
  160. package/dist/dda/p-9a4e34d1.entry.js +1 -0
  161. package/dist/dda/p-9b234635.entry.js +1 -0
  162. package/dist/dda/p-9d9834ff.entry.js +1 -0
  163. package/dist/dda/p-9f01cb56.entry.js +1 -0
  164. package/dist/dda/p-9ff8dc84.entry.js +1 -0
  165. package/dist/dda/p-BnrqwGTj.js +2 -0
  166. package/dist/dda/p-CvcFE821.js +1 -0
  167. package/dist/dda/p-a8a1ee5d.entry.js +1 -0
  168. package/dist/dda/p-b37f40a9.entry.js +1 -0
  169. package/dist/dda/{p-c77282be.entry.js → p-eaffd32d.entry.js} +1 -1
  170. package/dist/dda/p-f2efc121.entry.js +1 -0
  171. package/dist/dda/p-faed59dd.entry.js +1 -0
  172. package/dist/dda/p-fb00dec4.entry.js +1 -0
  173. package/dist/esm/dda-accordion.entry.js +3 -3
  174. package/dist/esm/dda-alert.entry.js +3 -3
  175. package/dist/esm/dda-attach-file.entry.js +3 -3
  176. package/dist/esm/dda-avatar.entry.js +7 -7
  177. package/dist/esm/dda-banner-card.entry.js +24 -0
  178. package/dist/esm/dda-banner.entry.js +3 -3
  179. package/dist/esm/dda-breadcrumb.entry.js +2 -2
  180. package/dist/esm/dda-button.entry.js +3 -3
  181. package/dist/esm/dda-checkbox.entry.js +3 -3
  182. package/dist/esm/dda-chip.entry.js +3 -3
  183. package/dist/esm/dda-credit-card.entry.js +3 -3
  184. package/dist/esm/dda-creditcard-field.entry.js +3 -3
  185. package/dist/esm/dda-dropdown.entry.js +3 -3
  186. package/dist/esm/dda-footer.entry.js +3 -3
  187. package/dist/esm/dda-header.entry.js +201 -14
  188. package/dist/esm/dda-home-banner.entry.js +5 -5
  189. package/dist/esm/dda-home-carousel.entry.js +26 -0
  190. package/dist/esm/dda-horizontal-stepper.entry.js +3 -3
  191. package/dist/esm/dda-input.entry.js +3 -3
  192. package/dist/esm/dda-link-button_2.entry.js +6 -6
  193. package/dist/esm/dda-number-field.entry.js +3 -3
  194. package/dist/esm/dda-pagination.entry.js +3 -3
  195. package/dist/esm/dda-phonefield.entry.js +3 -3
  196. package/dist/esm/dda-progressbar.entry.js +3 -3
  197. package/dist/esm/dda-range-slider.entry.js +3 -3
  198. package/dist/esm/dda-search-input.entry.js +3 -3
  199. package/dist/esm/dda-segmented-tabs.entry.js +4 -4
  200. package/dist/esm/dda-select.entry.js +3 -3
  201. package/dist/esm/dda-sticky-footer.entry.js +52 -4
  202. package/dist/esm/dda-tabs.entry.js +3 -3
  203. package/dist/esm/dda-textarea.entry.js +4 -4
  204. package/dist/esm/dda-toggle.entry.js +3 -3
  205. package/dist/esm/dda-tooltip.entry.js +3 -3
  206. package/dist/esm/dda-ui-card.entry.js +2 -2
  207. package/dist/esm/dda-vertical-stepper.entry.js +2 -2
  208. package/dist/esm/dda.js +3 -3
  209. package/dist/esm/{index-D6L6zgH9.js → index-BnrqwGTj.js} +1 -1
  210. package/dist/esm/loader.js +3 -3
  211. package/dist/esm/parse-json-prop-CvcFE821.js +36 -0
  212. package/dist/types/components/dda-alert/dda-alert.stories.d.ts +5 -1
  213. package/dist/types/components/dda-banner-card/dda-banner-card.d.ts +25 -0
  214. package/dist/types/components/dda-header/dda-header.d.ts +117 -5
  215. package/dist/types/components/dda-header/dda-header.stories.d.ts +206 -0
  216. package/dist/types/components/dda-header/nav-model.d.ts +19 -0
  217. package/dist/types/components/dda-home-carousel/dda-home-carousel.d.ts +29 -0
  218. package/dist/types/components/dda-home-carousel/dda-home-carousel.stories.d.ts +20 -0
  219. package/dist/types/components/dda-sticky-footer/dda-sticky-footer.d.ts +75 -5
  220. package/dist/types/components/dda-sticky-footer/dda-sticky-footer.stories.d.ts +17 -0
  221. package/dist/types/components.d.ts +747 -21
  222. package/dist/types/utils/parse-json-prop.d.ts +1 -0
  223. package/package.json +3 -1
  224. package/dist/components/p-Bc2V1U4_.js +0 -1
  225. package/dist/components/p-Bzqf-PpF.js +0 -1
  226. package/dist/components/p-D-CHT-as.js +0 -1
  227. package/dist/components/p-DJw8qV7U.js +0 -1
  228. package/dist/components/p-DpwQ9sGp.js +0 -1
  229. package/dist/dda/p-03400387.entry.js +0 -1
  230. package/dist/dda/p-18a3d7b1.entry.js +0 -1
  231. package/dist/dda/p-1f7b8486.entry.js +0 -1
  232. package/dist/dda/p-3024288f.entry.js +0 -1
  233. package/dist/dda/p-41b8ed7d.entry.js +0 -1
  234. package/dist/dda/p-56f60336.entry.js +0 -1
  235. package/dist/dda/p-65776d80.entry.js +0 -1
  236. package/dist/dda/p-73611084.entry.js +0 -1
  237. package/dist/dda/p-7ad8cde9.entry.js +0 -1
  238. package/dist/dda/p-8134e59d.entry.js +0 -1
  239. package/dist/dda/p-8494fd9e.entry.js +0 -1
  240. package/dist/dda/p-876d55b2.entry.js +0 -1
  241. package/dist/dda/p-88d884a8.entry.js +0 -1
  242. package/dist/dda/p-8b25ae94.entry.js +0 -1
  243. package/dist/dda/p-8f376986.entry.js +0 -1
  244. package/dist/dda/p-90019b80.entry.js +0 -1
  245. package/dist/dda/p-92fa4777.entry.js +0 -1
  246. package/dist/dda/p-97431faf.entry.js +0 -1
  247. package/dist/dda/p-D6L6zgH9.js +0 -2
  248. package/dist/dda/p-a5456de2.entry.js +0 -1
  249. package/dist/dda/p-aa7b4c13.entry.js +0 -1
  250. package/dist/dda/p-ad40eb27.entry.js +0 -1
  251. package/dist/dda/p-c055f0d2.entry.js +0 -1
  252. package/dist/dda/p-c42c8733.entry.js +0 -1
  253. package/dist/dda/p-ca64abe6.entry.js +0 -1
  254. package/dist/dda/p-ceca8088.entry.js +0 -1
  255. package/dist/dda/p-d6786b43.entry.js +0 -1
  256. package/dist/dda/p-e2113e42.entry.js +0 -1
  257. package/dist/dda/p-ee862207.entry.js +0 -1
  258. package/dist/dda/p-ef38e28b.entry.js +0 -1
  259. package/dist/dda/p-f43fb910.entry.js +0 -1
@@ -13,7 +13,15 @@ export default {
13
13
  hideMiddleSection: {
14
14
  control: { type: 'boolean' },
15
15
  description: 'Hides the middle section of the footer',
16
- }
16
+ },
17
+ locationButtonIcon: {
18
+ control: { type: 'text' },
19
+ description: 'Material Symbols icon of the location link, shown when the location image is empty',
20
+ },
21
+ newsButtonIcon: {
22
+ control: { type: 'text' },
23
+ description: 'Material Symbols icon of the news link, shown when the news image is empty',
24
+ },
17
25
  },
18
26
  component: 'dda-sticky-footer',
19
27
  parameters: {
@@ -114,7 +122,7 @@ Default.args = {
114
122
  newsButtonHref: '#',
115
123
  newsButtonText: 'News',
116
124
  newsButtonSrc: news_pin,
117
- newsButtonIcon: 'news_on',
125
+ newsButtonIcon: 'newspaper',
118
126
  aiIconHref: '#',
119
127
  aiIconSrc: digital_ai,
120
128
  aiIconAlt: 'Digital AI',
@@ -125,3 +133,17 @@ Default.args = {
125
133
  chatIconTooltip: 'Online Chat',
126
134
  hideMiddleSection: false,
127
135
  };
136
+ // The location and news links show a Material Symbols icon when their image is not set.
137
+ export const MaterialIcons = Template.bind({});
138
+ MaterialIcons.args = Object.assign(Object.assign({}, Default.args), { locationButtonSrc: '', locationButtonIcon: 'location_on', newsButtonSrc: '', newsButtonIcon: 'newspaper' });
139
+ // 3.x lists: any number of middle logos, right links with icons and text, and the "more" button
140
+ // that collects the right links on phones. `Template` returns a string, so the extra attributes
141
+ // are added to that string.
142
+ const listAttributes = `more-icon="more_horiz" more-icon-family="material-icons"
143
+ middle-link='${JSON.stringify([1, 2, 3, 4].map(n => ({ LogoTooltip: `Logo ${n}`, href: '#', src: digital_logo, alt: `Logo ${n}` })))}'
144
+ right-link='${JSON.stringify([
145
+ { RightLinkTooltip: 'Newsroom', href: '#', LinkText: 'Newsroom', IconFamily: 'material-icons', IconName: 'feed' },
146
+ { RightLinkTooltip: 'Contact us', href: '#', LinkText: 'Contact us', IconFamily: 'material-icons', IconName: 'call' },
147
+ ])}'`;
148
+ export const Lists3x = args => Template(args).replace('<dda-sticky-footer', `<dda-sticky-footer ${listAttributes}`);
149
+ Lists3x.args = Object.assign(Object.assign({}, Default.args), { locationButtonSrc: '', newsButtonSrc: '' });
@@ -44,7 +44,7 @@ export class DdaTabs {
44
44
  }
45
45
  }
46
46
  render() {
47
- return (h(Host, { key: '08043e9d39b5ad9a620384b4f917245ddff9924e' }, h("div", { key: '2ed3614f6f932a43c4601201c2bf02483e161a0e', role: "group", "aria-label": this.aria_label, class: `dda-tabs-container ${this.hover_style} ${this.custom_class} ${this.component_mode}` }, this.parsedTabs.map((title, index) => (h("button", { id: this.button_id, name: this.button_name, type: "button", "aria-pressed": this.active_tab === index ? 'true' : 'false', class: `dda-tab-item ${this.active_tab === index ? 'active' : ''}`, onClick: () => this.setActiveTab(index) }, this.type === 'text-icon' && h("i", { class: `material-icons`, "aria-hidden": "true" }, this.parsedIcons[index] || ""), h("span", null, title)))))));
47
+ return (h(Host, { key: '5e604aeca69071b4163a54f8f5a6f3a49c36112b' }, h("div", { key: '9b08673fc84df116c5b5c055e4ce1ff47127b978', role: "group", "aria-label": this.aria_label, class: `dda-tabs-container ${this.hover_style} ${this.custom_class} ${this.component_mode}` }, this.parsedTabs.map((title, index) => (h("button", { id: this.button_id, name: this.button_name, type: "button", "aria-pressed": this.active_tab === index ? 'true' : 'false', class: `dda-tab-item ${this.active_tab === index ? 'active' : ''}`, onClick: () => this.setActiveTab(index) }, this.type === 'text-icon' && h("i", { class: `material-icons`, "aria-hidden": "true" }, this.parsedIcons[index] || ""), h("span", null, title)))))));
48
48
  }
49
49
  static get is() { return "dda-tabs"; }
50
50
  static get originalStyleUrls() {
@@ -119,7 +119,7 @@ export class DdaTextarea {
119
119
  this.custom_class, this.component_mode, this.textarea_name,
120
120
  ].filter(Boolean).join(' ');
121
121
  const id = this.inputId;
122
- return (h(Host, { key: '36d3524d56afd5ec4839df413c7c4a9f73c02349' }, h("div", { key: 'b549320f31064d89f9c3cb93100e00209ffec631', class: textareaClass }, this.label && h("label", { key: '507594fc98f36d10d2b0cc7e728d2789d19acffd', id: this.labelId, htmlFor: this.enable_rich_editor ? undefined : id, class: "dda-input-label" }, this.label), this.enable_rich_editor ? (
122
+ return (h(Host, { key: 'c5edab142a6817b728721f1a12e6582050d29410' }, h("div", { key: '67bf7f7bbef0f412b85f5040cce9c5cafcb8c890', class: textareaClass }, this.label && h("label", { key: 'e41f2bb1556278cd8bc733418eea6031ca66cc3d', id: this.labelId, htmlFor: this.enable_rich_editor ? undefined : id, class: "dda-input-label" }, this.label), this.enable_rich_editor ? (
123
123
  // F-015: previously a bare `<div id="editor">` — the visible
124
124
  // label's `for` cannot target a non-labelable <div>, and even
125
125
  // aria-labelledby here would be wrong: Quill turns this
@@ -127,7 +127,7 @@ export class DdaTextarea {
127
127
  // as a child `.ql-editor`, which is what AT and Tab actually
128
128
  // land on. The ARIA lives on quill.root (.ql-editor), applied
129
129
  // imperatively in syncRichEditorA11y() after mount.
130
- h("div", { id: id, class: "dda-richeditor-field" })) : (h("textarea", { id: id, name: this.textarea_name, "aria-label": this.aria_label, placeholder: this.placeholder, value: this.value, onInput: (event) => this.handleInput(event), class: "dda-input-field dda-input-textarea", maxLength: this.max_characters, "aria-describedby": this.describedBy, "aria-invalid": this.error_message ? 'true' : undefined })), this.helper_text && (h("div", { key: '4931a7959dcc63311c7bf39d9f48345705153b2b', id: this.helperId, class: "dda-helper-text" }, h("span", { key: '0611a1223915e8c25963ea0d2084b8d12ea4e505', class: "dda-flex dda-align-center dda-gap-2" }, h("i", { key: 'c52d7a98fa16609999310aa9603185ea4249d642', class: "material-icons material-symbols-outlined", "aria-hidden": "true" }, "info"), " ", this.helper_text), h("span", { key: 'c68c8d582a5d2a8f365fb31c3dd63f92280624ea', class: "dda-letter-count" }, this.characterCount, " / ", this.max_characters))), this.error_message && (h("div", { key: '2a1476454a2b11836afbdcd46d78b49a0704f701', id: this.errorId, class: "dda-error-message" }, h("span", { key: '0009df8437058f165415719e25705b23b90f2610', class: "dda-flex dda-align-center dda-gap-2" }, h("i", { key: '283e095c1acbc957dbdc8ed3ed28cd717b05616d', class: "material-icons material-symbols-outlined", "aria-hidden": "true" }, "info"), " ", this.error_message), h("span", { key: '2fc7cfb38f4ed9d3676acfa6c5f48fc772aff8cd', class: "dda-letter-count" }, this.characterCount, " / ", this.max_characters))))));
130
+ h("div", { id: id, class: "dda-richeditor-field" })) : (h("textarea", { id: id, name: this.textarea_name, "aria-label": this.aria_label, placeholder: this.placeholder, value: this.value, onInput: (event) => this.handleInput(event), class: "dda-input-field dda-input-textarea", maxLength: this.max_characters, "aria-describedby": this.describedBy, "aria-invalid": this.error_message ? 'true' : undefined })), this.helper_text && (h("div", { key: 'f31f3c2467bcf9b65296f5c0117ebc5d27c4fdab', id: this.helperId, class: "dda-helper-text" }, h("span", { key: '6e419e51c55c6427a7f9ae33d93b7b7a1639ea54', class: "dda-flex dda-align-center dda-gap-2" }, h("i", { key: 'c9804b5734d99b02abf438119aa668b8facf8110', class: "material-icons material-symbols-outlined", "aria-hidden": "true" }, "info"), " ", this.helper_text), h("span", { key: 'da29cc16cd25173e1834b61c5bfc1d11e878fa1d', class: "dda-letter-count" }, this.characterCount, " / ", this.max_characters))), this.error_message && (h("div", { key: 'a9e908888326a4bf968798fdc58df5706732ef12', id: this.errorId, class: "dda-error-message" }, h("span", { key: 'a03685c802486a01e2797740e459b636365778f8', class: "dda-flex dda-align-center dda-gap-2" }, h("i", { key: '845e5de4faceee90c1ce7f828eb298344f152418', class: "material-icons material-symbols-outlined", "aria-hidden": "true" }, "info"), " ", this.error_message), h("span", { key: '044631e0c851953de8334d51087d5c7cb430a1e3', class: "dda-letter-count" }, this.characterCount, " / ", this.max_characters))))));
131
131
  }
132
132
  static get is() { return "dda-textarea"; }
133
133
  static get originalStyleUrls() {
@@ -11,7 +11,7 @@ export class DdaToggle {
11
11
  this.custom_class ? `${this.custom_class}` : '',
12
12
  this.component_mode,
13
13
  ].filter(Boolean).join(' ');
14
- return (h(Host, { key: 'dea39431c86169e24d54733a62c769eeaa2b689a' }, h("label", { key: '3cacd3f24b5f943148c08d49507367f447360130', class: toggleClass, htmlFor: this.input_id }, h("input", { key: '05ddb8d7855baa638d27a2e75e958b0925cb6133', "aria-label": this.aria_label, type: "checkbox", id: this.input_id, name: this.group_name, checked: this.checked }), h("span", { key: '94a53389d2bc3e2a0865f4eabe144957088f3c9e', class: "toggle" }), (this.title_text || this.supporting) && (h("p", { key: 'f2c763dfde5598c8c38aa6ded502246915d6697c' }, this.title_text && h("span", { key: '1226a811dccc581837743c79b698ee553eb561b8', class: "toggle-title" }, this.title_text), this.supporting && h("span", { key: '53b895d6524528f56a1b8c0e85fcd1292a2295a4', class: "toggle-supporting" }, this.supporting))))));
14
+ return (h(Host, { key: '594a044248a1ea4f445ed239d97c56a1976e167a' }, h("label", { key: '2d20d01b337379355004d902b60d9b499f9055fc', class: toggleClass, htmlFor: this.input_id }, h("input", { key: '081734cff68c6228fc7daa23ce821e7ac5bc817f', "aria-label": this.aria_label, type: "checkbox", id: this.input_id, name: this.group_name, checked: this.checked }), h("span", { key: '7c41a8ece7705f6fb3bb779dcdca7e09ca7df610', class: "toggle" }), (this.title_text || this.supporting) && (h("p", { key: 'cdf4855501fa3d62d2371179fdb7a28070b1f0ce' }, this.title_text && h("span", { key: '019febd23f5964bd936d3edca64e7d2010a7dfab', class: "toggle-title" }, this.title_text), this.supporting && h("span", { key: 'a5bdee7e1ccc27ab2279e5ae9e5cab37aa32f709', class: "toggle-supporting" }, this.supporting))))));
15
15
  }
16
16
  static get is() { return "dda-toggle"; }
17
17
  static get originalStyleUrls() {
@@ -31,7 +31,7 @@ export class DdaTooltip {
31
31
  this.el.removeEventListener('mouseleave', this.resetDismissed);
32
32
  }
33
33
  render() {
34
- return (h(Host, { key: '2ed16ceb8feae5e30c32f8f6233b4af58bcaf7a9' }, h("div", { key: '5dae51f2ac993d030be0c2287552f6979eb14ca5', class: `dda-tooltip-container ${this.custom_class} ${this.component_mode} ${this.dismissed ? 'dismissed' : ''}` }, h("slot", { key: '18c1f46d365c677fe0ca88bf4582e7899b08df0d' }), h("div", { key: 'df7107e2d43c930942faea1c5e574cbe6fea9608', class: `dda-tooltip-box ${this.position}` }, h("strong", { key: 'abf766e5920575854a064b25b4f63536c9fd6cdf' }, this.title_text), h("p", { key: '7fb2ba0d0f7ce6ceff058b5c56df509acab10e24' }, this.description)))));
34
+ return (h(Host, { key: '6f9ecc5f00431d9bcd4d94ac3ec2636901540a6c' }, h("div", { key: 'cd08883c43bf2b03965b0d3c96a13e78aa690f02', class: `dda-tooltip-container ${this.custom_class} ${this.component_mode} ${this.dismissed ? 'dismissed' : ''}` }, h("slot", { key: '21ee3779a3bdef7ac2f53089e2e43b57634a60e0' }), h("div", { key: 'cda784b2367e27f3b6856ec67ad2a68058a7aed2', class: `dda-tooltip-box ${this.position}` }, h("strong", { key: 'c8dc3672a03fc16589aadc1da1757bbb72f699c5' }, this.title_text), h("p", { key: 'a5082ddd48a0e60d07007bad1909ec7605d6ef95' }, this.description)))));
35
35
  }
36
36
  static get is() { return "dda-tooltip"; }
37
37
  static get originalStyleUrls() {
@@ -28,7 +28,7 @@ export class DdaUiCard {
28
28
  }
29
29
  render() {
30
30
  const HeadingTag = this.headingTag;
31
- return (h(Host, { key: 'f2a0d78609b1432f94a712b2d69690ed10c422b3' }, h("div", { key: 'bc36fddf6be566d97d23530740e5de9f32bb192e', class: 'dda-card' }, h("div", { key: '55b2f3a35669305d0dcf5c3fe9bdd3dd70a444a1', class: 'dda-card-body' }, this.type !== 'custom' && (h("div", { key: 'e6298ad703d39c3ed69ab64070db7d2580529d33' }, !!this.icon && (h("span", { key: '2f1b9f7570d5ab46f857cebb594a1d71cf83a341', class: 'dda-card-icon' }, h("i", { key: 'efda1c1873e48cae86bbd9feb5a90c7529f3db49', class: 'material-icons', "aria-hidden": "true" }, this.icon))), !!this.image && (h("span", { key: '802a4ca867e351b24af54b4da78ec12c2d18b890', class: 'dda-card-icon' }, h("img", { key: 'ff6975cf36520a9c3ddbecc16252bcc0769a1597', src: this.image, alt: this.maintitle }))), !!this.maintitle && h(HeadingTag, { key: 'd769a32b303d689217aa77973804347fb3488b02', class: 'dda-card-title' }, this.maintitle), !!this.subtitle && h("p", { key: '0bdaa58c5ea5db75c20c7b0031dad48ce7d1ed96', class: 'dda-card-text-muted' }, this.subtitle), !!this.link && (h("a", { key: '87d11b05cef8ab0b01de355d22b1ef9297a80302', href: this.link, class: 'dda-card-link', onClick: (event) => this.linkClick.emit(event) }, this.linktext, ' ', this.linkicon && (h("span", { key: '8cb9e3c6e51769fca7fa47d22d61a98164209002' }, h("i", { key: 'ba556e79ad6176ee2b79097a78ad826d9c02ecee', class: 'material-icons', "aria-hidden": "true" }, this.linkicon))))))), h("slot", { key: '11921fac820a992ed35e0dab39bcd36a39b2244f' })))));
31
+ return (h(Host, { key: '1bbdb967a31df80eb8d5bc04764a1caf1fa198b3' }, h("div", { key: 'daf4a4e9096e7a2bbd17b90e890cd12b034fb0fa', class: 'dda-card' }, h("div", { key: '36a0c9f0f2744a761d951e245741fe427a17d0c1', class: 'dda-card-body' }, this.type !== 'custom' && (h("div", { key: '9062bafbd3168c130be10eb44d8154a8f66c68e8' }, !!this.icon && (h("span", { key: '2c0b9b94601f3a53dd9fe0480b8dbd95d427afea', class: 'dda-card-icon' }, h("i", { key: 'd1f692ab879ca203c0361ca96f1e92694417bf8d', class: 'material-icons', "aria-hidden": "true" }, this.icon))), !!this.image && (h("span", { key: '63b3fd072c5417695eba7b883be27b1f1d848841', class: 'dda-card-icon' }, h("img", { key: '7860e1a3df40a4fa4d35b06c1fb58f66f554563c', src: this.image, alt: this.maintitle }))), !!this.maintitle && h(HeadingTag, { key: '0202e3ef4cc6dbed859f11c63d76c9df5a2c2340', class: 'dda-card-title' }, this.maintitle), !!this.subtitle && h("p", { key: 'd376be8224e3f0c48bf56d0e067e3e875352df98', class: 'dda-card-text-muted' }, this.subtitle), !!this.link && (h("a", { key: '47be07e6756f019a12385aab8ee5063848fc2f56', href: this.link, class: 'dda-card-link', onClick: (event) => this.linkClick.emit(event) }, this.linktext, ' ', this.linkicon && (h("span", { key: '5ee32e96529e3d5badad707cb9c1293b113e3370' }, h("i", { key: 'd1eb863f78293d3af3ed4b1df56c18126538c4b0', class: 'material-icons', "aria-hidden": "true" }, this.linkicon))))))), h("slot", { key: 'd0c885254ad24cbfda489377950ae178bf0cb134' })))));
32
32
  }
33
33
  static get is() { return "dda-ui-card"; }
34
34
  static get originalStyleUrls() {
@@ -1,42 +1,51 @@
1
1
  .dda-segmented-group {
2
2
  display: inline-flex;
3
+ /* A group wider than its container scrolls inside itself, not the page. The scroll box
4
+ also clips the segments to the rounded corners. */
5
+ max-width: 100%;
6
+ overflow-x: auto;
7
+ scrollbar-width: thin;
3
8
  border: solid 1px var(--dda-surface-90);
4
9
  border-radius: 8px;
5
- overflow: hidden;
6
10
  }
7
- .light-mode.dda-segmented-group{
11
+ .light-mode.dda-segmented-group {
8
12
  border: solid 1px var(--dda-neutral-90);
9
13
  }
10
14
  .dda-segmented-item {
11
15
  display: flex;
12
- height: 40px;
16
+ /* Labels stay on one line; the group scrolls instead of the segments shrinking. */
17
+ flex: none;
18
+ white-space: nowrap;
19
+ min-height: 40px;
13
20
  padding: 5px 16px;
14
21
  border: transparent;
15
22
  border-inline-start: solid 1px var(--dda-surface-90);
16
23
  background-color: var(--dda-surface-100);
24
+ /* Browsers give a button the system font; take the page font (Dubai) instead. */
25
+ font-family: inherit;
17
26
  font-size: 16px;
18
27
  color: var(--dda-on-surface-variant-30);
19
28
  cursor: pointer;
20
29
  align-items: center;
21
30
  }
22
- .light-mode .dda-segmented-item{
31
+ .light-mode .dda-segmented-item {
23
32
  background-color: var(--dda-neutral-100);
24
33
  color: var(--dda-neutral-variant-30);
25
34
  border-inline-start: solid 1px var(--dda-neutral-90);
26
35
  }
27
- .dda-segmented-group .dda-segmented-item:first-child{
36
+ .dda-segmented-group .dda-segmented-item:first-child {
28
37
  border: transparent;
29
38
  }
30
- .dda-segmented-group.square{
39
+ .dda-segmented-group.square {
31
40
  border-radius: 8px;
32
41
  }
33
- .dda-segmented-group.rounded{
42
+ .dda-segmented-group.rounded {
34
43
  border-radius: 40px;
35
44
  }
36
45
  .dda-segmented-item:hover {
37
46
  color: var(--dda-color-primary-40);
38
47
  }
39
- .light-mode .dda-segmented-item:hover{
48
+ .light-mode .dda-segmented-item:hover {
40
49
  color: var(--dda-primary-40);
41
50
  }
42
51
  .dda-segmented-item.active {
@@ -49,4 +58,15 @@
49
58
  }
50
59
  .dda-segmented-item i {
51
60
  font-size: 18px;
52
- }
61
+ }
62
+ /* The ring is drawn inside the segment, because the group's scroll box clips anything
63
+ outside it. The inner light band keeps the ring visible on the selected (filled) segment. */
64
+ .dda-segmented-item:focus-visible {
65
+ outline: 3px solid var(--dda-on-surface-0);
66
+ outline-offset: -3px;
67
+ box-shadow: inset 0 0 0 5px var(--dda-surface-100);
68
+ }
69
+ .light-mode .dda-segmented-item:focus-visible {
70
+ outline-color: var(--dda-neutral-0);
71
+ box-shadow: inset 0 0 0 5px var(--dda-neutral-100);
72
+ }
@@ -69,7 +69,7 @@ export class DdaSegmentedTabs {
69
69
  this.segmentChange.emit(index);
70
70
  }
71
71
  render() {
72
- return (h("div", { key: '023156550fa2d88603176644fc99b4cb3950c275', role: "group", "aria-label": this.aria_label, class: `dda-segmented-group ${this.custom_class} ${this.radius_type} ${this.component_mode}` }, this.parsedItems.map((item, index) => {
72
+ return (h("div", { key: '53f6f24a1b70fed2a4b1bf12f01d04ea40a61cc6', role: "group", "aria-label": this.aria_label, class: `dda-segmented-group ${this.custom_class} ${this.radius_type} ${this.component_mode}` }, this.parsedItems.map((item, index) => {
73
73
  const isSelected = index === this.active_index;
74
74
  const className = `dda-segmented-item${isSelected ? ' active' : ''}`;
75
75
  return item.startsWith('fo') ? (h("button", { name: this.button_name, type: "button", class: className, "aria-pressed": isSelected ? 'true' : 'false', "aria-label": this.iconLabel(item, index), onClick: () => this.selectSegment(index) }, h("i", { class: "material-icons material-symbols-outlined", "aria-hidden": "true" }, item))) : (h("button", { name: this.button_name, type: "button", class: className, "aria-pressed": isSelected ? 'true' : 'false', onClick: () => this.selectSegment(index) }, item));
@@ -20,7 +20,7 @@ export class DdaHorizontalStepper {
20
20
  }
21
21
  }
22
22
  render() {
23
- return (h(Host, { key: 'a5f2c88bb692cb7b5dafa69664f2e8f864ef7891' }, h("div", { key: '17a44cd43fa1d20bb34509c5d5e1722c47937a12', class: `${this.custom_class} ${this.component_mode} h-stepper-container` }, this.parsedSteps.map((step, index) => (h("div", { class: `h-step ${index === this.current_step ? 'active' : ''} ${index < this.current_step ? 'completed' : ''}` }, h("div", { class: "h-step-indicator" }, h("div", { class: "circle" })), h("div", { class: "h-step-content" }, h("div", { class: "h-step-title" }, step.title), h("div", { class: "h-step-subtitle" }, step.subtitle), h("div", { class: "h-step-description" }, step.description))))))));
23
+ return (h(Host, { key: '10e1418182c1cf52a9415bf84fbceae00b011add' }, h("div", { key: 'dbbc4fb5892954834c15512f76c551a7827b81e1', class: `${this.custom_class} ${this.component_mode} h-stepper-container` }, this.parsedSteps.map((step, index) => (h("div", { class: `h-step ${index === this.current_step ? 'active' : ''} ${index < this.current_step ? 'completed' : ''}` }, h("div", { class: "h-step-indicator" }, h("div", { class: "circle" })), h("div", { class: "h-step-content" }, h("div", { class: "h-step-title" }, step.title), h("div", { class: "h-step-subtitle" }, step.subtitle), h("div", { class: "h-step-description" }, step.description))))))));
24
24
  }
25
25
  static get is() { return "dda-horizontal-stepper"; }
26
26
  static get originalStyleUrls() {
@@ -24,7 +24,7 @@ export class DdaVerticalStepper {
24
24
  render() {
25
25
  var _a;
26
26
  const current = (_a = this.current_step) !== null && _a !== void 0 ? _a : this.current_Step;
27
- return (h(Host, { key: '35d930b7e0eef90b1f0c6e8dce9fa49065b4fb6e' }, h("div", { key: '690ea598a073d296066e661d31a769802a5bcbdf', class: `${this.custom_class} ${this.component_mode} v-stepper-container` }, this.parsedSteps.map((step, index) => (h("div", { class: `v-step ${index <= current ? 'active' : ''}` }, h("div", { class: "v-step-indicator" }, h("div", { class: "icon" }, h("i", { class: `material-icons` }, step.icon))), h("div", { class: "v-step-content" }, h("div", { class: "v-step-title" }, step.title), h("div", { class: "v-step-subtitle" }, step.subtitle), h("div", { class: "v-step-description" }, step.description)), h("div", { class: "v-step-arrow" }, h("i", { class: "material-icons material-symbols-outlined" }, "chevron_right"))))))));
27
+ return (h(Host, { key: '8d8d30895491f4053370c1fa392f81a8c8df91ac' }, h("div", { key: '558f122ea5c72cadb35efc70d31cd18ec1271ca1', class: `${this.custom_class} ${this.component_mode} v-stepper-container` }, this.parsedSteps.map((step, index) => (h("div", { class: `v-step ${index <= current ? 'active' : ''}` }, h("div", { class: "v-step-indicator" }, h("div", { class: "icon" }, h("i", { class: `material-icons` }, step.icon))), h("div", { class: "v-step-content" }, h("div", { class: "v-step-title" }, step.title), h("div", { class: "v-step-subtitle" }, step.subtitle), h("div", { class: "v-step-description" }, step.description)), h("div", { class: "v-step-arrow" }, h("i", { class: "material-icons material-symbols-outlined" }, "chevron_right"))))))));
28
28
  }
29
29
  static get is() { return "dda-vertical-stepper"; }
30
30
  static get originalStyleUrls() {
@@ -711,24 +711,97 @@
711
711
  padding: 50px 20px 70px 20px;
712
712
  }
713
713
 
714
- .quick-links-wrap {
714
+ /* Small screens: the cards sit on the banner this far above the sticky footer bar, at this height.
715
+ dda-home-banner's .slider-nav reads the same two values to stay 16px above the cards. */
716
+ :root {
717
+ --dda-quick-links-gap-sm: 12px;
718
+ --dda-quick-links-card-height-sm: 112px;
719
+ }
720
+
721
+ :is(.quick-links-wrap, .dda-home-quick-links-wrap) {
715
722
  width: 100%;
716
723
  position: absolute;
717
- /* dda-sticky-footer sets --dda-sticky-footer-height; the cards sit above the fixed bar. */
718
- bottom: calc(45px + var(--dda-sticky-footer-height, 0px));
724
+ /* dda-sticky-footer sets --dda-sticky-footer-height; the cards sit above the fixed bar.
725
+ The row's bottom padding (below) is part of the 69px. The banner's .slider-nav sits 205px
726
+ above this offset (274px in home-banner.css); change both together. */
727
+ bottom: calc(69px - var(--dda-quick-links-pad-bottom) + var(--dda-sticky-footer-height, 0px));
719
728
  z-index: 1;
720
729
  }
721
730
 
731
+ /* The width of the fade on each edge that has more cards to scroll to. */
732
+ @property --dda-quick-links-fade-start {
733
+ syntax: '<length>';
734
+ inherits: false;
735
+ initial-value: 0px;
736
+ }
737
+ @property --dda-quick-links-fade-end {
738
+ syntax: '<length>';
739
+ inherits: false;
740
+ initial-value: 0px;
741
+ }
742
+
743
+ /* One row of cards. When the cards do not fit, the row scrolls sideways. A card cut at the edge,
744
+ a fade on each edge with more cards, and a thin scrollbar show that the row scrolls. */
745
+ :is(.quick-links-wrap, .dda-home-quick-links-wrap),
746
+ .quick-links {
747
+ /* Room inside the row for the hover lift (12px above) and the pointer (9px below);
748
+ a scrolling box clips anything outside it. */
749
+ --dda-quick-links-pad-top: 12px;
750
+ --dda-quick-links-pad-bottom: 12px;
751
+ --dda-quick-links-fade: 32px;
752
+ }
722
753
  .quick-links {
723
754
  width: 90vw;
724
755
  margin: 0 auto;
725
756
  display: flex;
726
757
  gap: 8px;
727
- padding: 0 20px;
758
+ padding: var(--dda-quick-links-pad-top) 20px var(--dda-quick-links-pad-bottom);
759
+ overflow-x: auto;
760
+ overflow-y: hidden;
761
+ overscroll-behavior-x: contain;
762
+ scroll-snap-type: x mandatory;
763
+ /* A card that snaps or takes focus stops clear of the fade. */
764
+ scroll-padding-inline: calc(var(--dda-quick-links-fade) + 4px);
765
+ scrollbar-width: thin;
766
+ scrollbar-color: rgba(255, 255, 255, 0.7) transparent;
767
+ }
768
+
769
+ /* Fades show only where the row can scroll, and follow the scroll position. Browsers without
770
+ scroll-driven animations show no fade; the cut card and the scrollbar still show. */
771
+ @supports (animation-timeline: scroll()) {
772
+ .quick-links {
773
+ -webkit-mask-image: linear-gradient(to right, transparent, #000 var(--dda-quick-links-fade-start), #000 calc(100% - var(--dda-quick-links-fade-end)), transparent);
774
+ mask-image: linear-gradient(to right, transparent, #000 var(--dda-quick-links-fade-start), #000 calc(100% - var(--dda-quick-links-fade-end)), transparent);
775
+ animation: dda-quick-links-fade linear both;
776
+ animation-timeline: scroll(self inline);
777
+ }
778
+ /* In RTL the row starts on the right. */
779
+ [dir='rtl'] .quick-links {
780
+ -webkit-mask-image: linear-gradient(to left, transparent, #000 var(--dda-quick-links-fade-start), #000 calc(100% - var(--dda-quick-links-fade-end)), transparent);
781
+ mask-image: linear-gradient(to left, transparent, #000 var(--dda-quick-links-fade-start), #000 calc(100% - var(--dda-quick-links-fade-end)), transparent);
782
+ }
783
+ }
784
+ @keyframes dda-quick-links-fade {
785
+ 0% {
786
+ --dda-quick-links-fade-start: 0px;
787
+ --dda-quick-links-fade-end: var(--dda-quick-links-fade);
788
+ }
789
+ 10%,
790
+ 90% {
791
+ --dda-quick-links-fade-start: var(--dda-quick-links-fade);
792
+ --dda-quick-links-fade-end: var(--dda-quick-links-fade);
793
+ }
794
+ 100% {
795
+ --dda-quick-links-fade-start: var(--dda-quick-links-fade);
796
+ --dda-quick-links-fade-end: 0px;
797
+ }
728
798
  }
729
799
 
730
800
  .quick-links .link-item {
731
- width: 100%;
801
+ /* Cards share the row when they fit and are never narrower than 220px. */
802
+ flex: 1 0 220px;
803
+ min-width: 0;
804
+ scroll-snap-align: start;
732
805
  height: 170px;
733
806
  display: block;
734
807
  background: var(--dda-surface-100);
@@ -792,16 +865,21 @@
792
865
  .slide-content p {
793
866
  width: 100%;
794
867
  }
795
- .quick-links-wrap {
868
+ :is(.quick-links-wrap, .dda-home-quick-links-wrap) {
796
869
  position: relative;
797
870
  /* In normal flow the cards do not sit over the fixed bar, so keep the original offset. */
798
871
  bottom: 45px;
799
872
  }
800
- .quick-links-wrap .quick-links {
801
- display: grid;
802
- padding: 20px 20px;
873
+ /* Below the banner, on the page background: the row spans the screen, and each card is
874
+ narrower than the row so the next card shows at the edge. */
875
+ :is(.quick-links-wrap, .dda-home-quick-links-wrap) .quick-links {
876
+ width: 100%;
877
+ box-sizing: border-box;
878
+ padding: 20px 20px var(--dda-quick-links-pad-bottom);
879
+ scrollbar-color: var(--dda-on-surface-variant-40) transparent;
803
880
  }
804
881
  .quick-links .link-item {
882
+ flex: 0 0 min(75%, 300px);
805
883
  height: auto;
806
884
  margin: 0px;
807
885
  border: solid 1px #ddd;
@@ -874,6 +952,97 @@
874
952
  max-width: 90vw !important;
875
953
  }
876
954
 
955
+ /* 992px and below, on screens taller than 600px: the cards sit on the banner, above the sticky
956
+ footer bar, as on desktop. They are compact so they cover less of the slide, and the slide
957
+ controls move above them (home-banner.css). On short landscape screens the banner cannot hold
958
+ the text, the controls and the cards, so the cards stay under it (the rules above). */
959
+ @media screen and (max-width: 992px) and (min-height: 601px) {
960
+ :is(.quick-links-wrap, .dda-home-quick-links-wrap) {
961
+ position: absolute;
962
+ /* The row's bottom padding is part of the gap above the bar. */
963
+ bottom: calc(var(--dda-quick-links-gap-sm) - var(--dda-quick-links-pad-bottom) + var(--dda-sticky-footer-height, 0px));
964
+ }
965
+ :is(.quick-links-wrap, .dda-home-quick-links-wrap) .quick-links {
966
+ padding-top: var(--dda-quick-links-pad-top);
967
+ scrollbar-color: rgba(255, 255, 255, 0.7) transparent;
968
+ }
969
+ .quick-links .link-item {
970
+ height: var(--dda-quick-links-card-height-sm);
971
+ padding: 16px;
972
+ border: 0;
973
+ }
974
+ .quick-links .link-item i {
975
+ font-size: 24px;
976
+ margin-bottom: 8px;
977
+ }
978
+ .quick-links .link-item svg {
979
+ height: 24px;
980
+ margin-bottom: 8px;
981
+ }
982
+ .quick-links .link-item .title {
983
+ font-size: var(--dda-fs-body-lg);
984
+ }
985
+ .quick-links .link-item .subtitle {
986
+ font-size: var(--dda-fs-body-sm);
987
+ white-space: nowrap;
988
+ overflow: hidden;
989
+ text-overflow: ellipsis;
990
+ }
991
+ }
992
+
993
+ /* dda-home-carousel: its list is a .quick-links row; each <li> holds one dda-banner-card. */
994
+ ul.quick-links {
995
+ margin-block: 0;
996
+ list-style: none;
997
+ }
998
+ .quick-links > .dda-home-carousel-item {
999
+ flex: 0 0 max(220px, calc((100% - (var(--dda-home-carousel-per-view, 5) - 1) * 8px) / var(--dda-home-carousel-per-view, 5)));
1000
+ display: flex;
1001
+ scroll-snap-align: start;
1002
+ list-style: none;
1003
+ }
1004
+ .dda-home-carousel-item dda-banner-card {
1005
+ display: flex;
1006
+ width: 100%;
1007
+ }
1008
+ .dda-home-carousel-item .link-item {
1009
+ width: 100%;
1010
+ flex: 1 1 auto;
1011
+ }
1012
+ /* A card without a URL is a <button>: remove the browser button look. */
1013
+ button.link-item {
1014
+ border: 0;
1015
+ font: inherit;
1016
+ text-align: start;
1017
+ cursor: pointer;
1018
+ }
1019
+ .quick-links .link-item img {
1020
+ display: block;
1021
+ height: 35px;
1022
+ width: auto;
1023
+ margin-bottom: 15px;
1024
+ }
1025
+ .quick-links .link-item:focus-visible {
1026
+ outline: 2px solid var(--dda-color-primary-40);
1027
+ outline-offset: 2px;
1028
+ margin-top: -12px;
1029
+ }
1030
+ @media screen and (max-width: 992px) and (min-height: 601px) {
1031
+ .quick-links > .dda-home-carousel-item {
1032
+ flex: 0 0 min(75%, 300px);
1033
+ }
1034
+ .quick-links .link-item img {
1035
+ height: 24px;
1036
+ margin-bottom: 8px;
1037
+ }
1038
+ }
1039
+ @media only screen and (orientation: landscape) and (max-width: 1600px) {
1040
+ .quick-links .link-item img {
1041
+ height: 20px;
1042
+ margin-bottom: 5px;
1043
+ }
1044
+ }
1045
+
877
1046
  .dda-card {
878
1047
  position: relative;
879
1048
  display: -ms-flexbox;
@@ -2136,6 +2305,10 @@ body {
2136
2305
  .foot-icon-btn a img {
2137
2306
  height: 32px;
2138
2307
  }
2308
+
2309
+ .foot-icon-btn a i {
2310
+ font-size: 32px;
2311
+ }
2139
2312
  .dda-footer-item ul li.foot-menu{
2140
2313
  padding: 0 5px;
2141
2314
  }
@@ -2212,6 +2385,10 @@ body {
2212
2385
  .foot-icon-btn a img {
2213
2386
  height: 24px;
2214
2387
  }
2388
+
2389
+ .foot-icon-btn a i {
2390
+ font-size: 24px;
2391
+ }
2215
2392
  }
2216
2393
 
2217
2394
  @media (max-width: 1200px) {}
@@ -2222,6 +2399,77 @@ body {
2222
2399
  }
2223
2400
  }
2224
2401
 
2402
+ /* dubai.ae: a wordmark on desktop, a small icon at 992px and below. */
2403
+ .dda-footer .dubaiae-text-icon {
2404
+ height: 18px;
2405
+ }
2406
+ .dda-footer .dubaiae-small-icon {
2407
+ height: 24px;
2408
+ display: none;
2409
+ }
2410
+ /* The "more" button exists only with more-icon; it is shown at 992px and below. */
2411
+ .dda-footer-right {
2412
+ position: relative;
2413
+ }
2414
+ .dda-footer-right button.show-right-icon {
2415
+ display: none;
2416
+ }
2417
+ @media (max-width: 992px) {
2418
+ .dda-footer .dubaiae-text-icon {
2419
+ display: none;
2420
+ }
2421
+ .dda-footer .dubaiae-small-icon {
2422
+ display: block;
2423
+ }
2424
+ .dda-footer-right button.show-right-icon {
2425
+ display: flex;
2426
+ align-items: center;
2427
+ justify-content: center;
2428
+ width: 48px;
2429
+ height: 48px;
2430
+ background: #ffffff;
2431
+ border: 0;
2432
+ border-radius: 50px;
2433
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
2434
+ color: var(--dda-on-surface-variant-30);
2435
+ cursor: pointer;
2436
+ }
2437
+ .dda-footer-right button.show-right-icon i {
2438
+ font-size: 34px;
2439
+ }
2440
+ .dda-footer-right button.show-right-icon:focus-visible {
2441
+ outline: none;
2442
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px rgba(0, 0, 0, 0.65);
2443
+ }
2444
+ .dda-footer.has-more-button .dda-footer-right .foot-right_links {
2445
+ position: absolute;
2446
+ bottom: 59px;
2447
+ inset-inline-end: 0;
2448
+ display: flex;
2449
+ flex-direction: column;
2450
+ gap: 10px;
2451
+ height: 0;
2452
+ overflow: hidden;
2453
+ }
2454
+ .dda-footer.has-more-button .dda-footer-right .foot-right_links.show-dda-icon {
2455
+ height: auto;
2456
+ overflow: visible;
2457
+ }
2458
+ .dda-footer.has-more-button .foot-right_links li {
2459
+ opacity: 0;
2460
+ transform: translateY(20px);
2461
+ }
2462
+ .dda-footer.has-more-button .foot-right_links.show-dda-icon li {
2463
+ opacity: 1;
2464
+ transform: translateY(0);
2465
+ }
2466
+ }
2467
+ @media (max-width: 992px) and (prefers-reduced-motion: no-preference) {
2468
+ .dda-footer.has-more-button .foot-right_links li {
2469
+ transition: opacity 0.4s ease, transform 0.4s ease;
2470
+ }
2471
+ }
2472
+
2225
2473
  .dda-dashboard-sidebar {
2226
2474
  position: fixed;
2227
2475
  top: 0;
@@ -3562,6 +3810,104 @@ ul.main_side_menu .main_sub_menu .main_sub_menu .main_sub_menu {
3562
3810
  }
3563
3811
  }
3564
3812
 
3813
+ /* 3.x dropdown submenus (quick-links items with "type": "dda_default_submenu"). */
3814
+ .dda-mega-menu > li {
3815
+ position: relative;
3816
+ }
3817
+ /* The <ul> scrolls; the third-level panel is its sibling, so the scroll does not clip it.
3818
+ The fixed width puts the panel (inset-inline-start: 100%) against the edge of the <ul>. */
3819
+ .dda-default-submenu {
3820
+ display: none;
3821
+ width: 350px;
3822
+ position: absolute;
3823
+ top: 100%;
3824
+ inset-inline-start: 0;
3825
+ padding-top: 5px;
3826
+ z-index: 5;
3827
+ }
3828
+ .dda-default-submenu.is-visible {
3829
+ display: block;
3830
+ }
3831
+ .dda-default-submenu > ul {
3832
+ width: 100%;
3833
+ max-width: 350px;
3834
+ max-height: 325px;
3835
+ overflow-y: auto;
3836
+ margin: 0;
3837
+ padding: 10px;
3838
+ list-style: none;
3839
+ background-color: var(--dda-surface-100);
3840
+ border-radius: 5px;
3841
+ box-shadow: 0 6px 7px 0 rgba(0, 0, 0, 0.13);
3842
+ }
3843
+ .dda-default-submenu li {
3844
+ list-style: none;
3845
+ position: relative;
3846
+ margin-bottom: 1px;
3847
+ }
3848
+ .dda-default-submenu a {
3849
+ position: relative;
3850
+ display: block;
3851
+ padding: 10px 7px;
3852
+ padding-inline-end: 24px;
3853
+ border-radius: 8px;
3854
+ font-size: var(--dda-fs-body-lg);
3855
+ font-weight: var(--dda-fw-400);
3856
+ color: var(--dda-on-surface-0);
3857
+ }
3858
+ .dda-default-submenu li:hover > a,
3859
+ .dda-default-submenu a.active {
3860
+ background-color: var(--dda-on-primary-98);
3861
+ color: var(--dda-on-primary-variant-40);
3862
+ }
3863
+ .dda-default-submenu a:focus-visible {
3864
+ outline: 2px solid var(--dda-color-primary-40);
3865
+ outline-offset: 0;
3866
+ }
3867
+ .dda-default-submenu a.has-submenu::after {
3868
+ content: '';
3869
+ width: 6px;
3870
+ height: 6px;
3871
+ border-right: solid 1px var(--dda-color-primary-40);
3872
+ border-bottom: solid 1px var(--dda-color-primary-40);
3873
+ position: absolute;
3874
+ top: 50%;
3875
+ inset-inline-end: 9px;
3876
+ margin-top: -4.5px;
3877
+ transform: rotate(-45deg);
3878
+ }
3879
+ [dir='rtl'] .dda-default-submenu a.has-submenu::after {
3880
+ transform: rotate(135deg);
3881
+ }
3882
+ .dda-default-subsubmenu {
3883
+ display: none;
3884
+ width: 300px;
3885
+ position: absolute;
3886
+ top: 0;
3887
+ inset-inline-start: 100%;
3888
+ padding-inline-start: 15px;
3889
+ }
3890
+ .dda-default-subsubmenu.is-visible {
3891
+ display: block;
3892
+ }
3893
+ .dda-default-subsubmenu-content {
3894
+ padding: 10px;
3895
+ background-color: var(--dda-surface-100);
3896
+ border-radius: 5px;
3897
+ box-shadow: 0 6px 7px 0 rgba(0, 0, 0, 0.13);
3898
+ }
3899
+ .dda-default-subsubmenu-content ul {
3900
+ margin: 0;
3901
+ padding: 0;
3902
+ }
3903
+ .dda-submenu-title {
3904
+ display: block;
3905
+ padding: 5px 8px 10px;
3906
+ margin-bottom: 5px;
3907
+ border-bottom: solid 1px var(--dda-surface-variant-80);
3908
+ font-weight: var(--dda-fw-700);
3909
+ }
3910
+
3565
3911
 
3566
3912
  :root{
3567
3913
  --font-family-main: 'Dubai', sans-serif;