@carbon/web-components 2.54.0 → 2.55.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/custom-elements.json +198 -157
  2. package/es/components/accordion/accordion.scss.js +1 -1
  3. package/es/components/ai-label/ai-label.scss.js +1 -1
  4. package/es/components/ai-skeleton/ai-skeleton.scss.js +1 -1
  5. package/es/components/badge-indicator/badge-indicator.scss.js +1 -1
  6. package/es/components/breadcrumb/breadcrumb.scss.js +1 -1
  7. package/es/components/button/button.d.ts +1 -1
  8. package/es/components/button/button.js +1 -1
  9. package/es/components/button/button.js.map +1 -1
  10. package/es/components/button/button.scss.js +1 -1
  11. package/es/components/checkbox/checkbox.scss.js +1 -1
  12. package/es/components/code-snippet/code-snippet.scss.js +1 -1
  13. package/es/components/combo-box/combo-box.scss.js +1 -1
  14. package/es/components/combo-button/combo-button.scss.js +1 -1
  15. package/es/components/contained-list/contained-list.scss.js +1 -1
  16. package/es/components/content-switcher/content-switcher.scss.js +1 -1
  17. package/es/components/copy-button/copy-button.scss.js +1 -1
  18. package/es/components/data-table/data-table.scss.js +1 -1
  19. package/es/components/date-picker/date-picker.scss.js +1 -1
  20. package/es/components/date-picker/date-picker.scss.js.map +1 -1
  21. package/es/components/dialog/dialog-body.js +1 -1
  22. package/es/components/dialog/dialog-close-button.js +1 -1
  23. package/es/components/dialog/dialog-footer.js +1 -1
  24. package/es/components/dialog/dialog-subtitle.js +1 -1
  25. package/es/components/dialog/dialog-title.js +1 -1
  26. package/es/components/dialog/dialog.d.ts +18 -7
  27. package/es/components/dialog/dialog.d.ts.map +1 -1
  28. package/es/components/dialog/dialog.js +51 -17
  29. package/es/components/dialog/dialog.js.map +1 -1
  30. package/es/components/dialog/dialog.scss.js +1 -1
  31. package/es/components/dialog/dialog.scss.js.map +1 -1
  32. package/es/components/dropdown/dropdown.scss.js +1 -1
  33. package/es/components/feature-flags/index.d.ts.map +1 -1
  34. package/es/components/feature-flags/index.js +8 -3
  35. package/es/components/feature-flags/index.js.map +1 -1
  36. package/es/components/file-uploader/file-uploader-button.d.ts.map +1 -1
  37. package/es/components/file-uploader/file-uploader-button.js +3 -2
  38. package/es/components/file-uploader/file-uploader-button.js.map +1 -1
  39. package/es/components/file-uploader/file-uploader-drop-container.d.ts +1 -1
  40. package/es/components/file-uploader/file-uploader-drop-container.d.ts.map +1 -1
  41. package/es/components/file-uploader/file-uploader-drop-container.js +3 -2
  42. package/es/components/file-uploader/file-uploader-drop-container.js.map +1 -1
  43. package/es/components/file-uploader/file-uploader-item.d.ts +4 -0
  44. package/es/components/file-uploader/file-uploader-item.d.ts.map +1 -1
  45. package/es/components/file-uploader/file-uploader-item.js +6 -0
  46. package/es/components/file-uploader/file-uploader-item.js.map +1 -1
  47. package/es/components/file-uploader/file-uploader.scss.js +1 -1
  48. package/es/components/file-uploader/file-uploader.scss.js.map +1 -1
  49. package/es/components/fluid-combo-box/fluid-combo-box.scss.js +1 -1
  50. package/es/components/fluid-dropdown/fluid-dropdown.scss.js +1 -1
  51. package/es/components/fluid-form/fluid-form.scss.js +1 -1
  52. package/es/components/fluid-multi-select/fluid-multi-select.scss.js +1 -1
  53. package/es/components/fluid-number-input/fluid-number-input.scss.js +1 -1
  54. package/es/components/fluid-password-input/fluid-password-input.scss.js +1 -1
  55. package/es/components/fluid-search/fluid-search.scss.js +1 -1
  56. package/es/components/fluid-select/fluid-select.scss.js +1 -1
  57. package/es/components/fluid-text-input/fluid-text-input.scss.js +1 -1
  58. package/es/components/fluid-textarea/fluid-textarea.scss.js +1 -1
  59. package/es/components/fluid-time-picker/fluid-time-picker.scss.js +1 -1
  60. package/es/components/form/form-item.scss.js +1 -1
  61. package/es/components/form/form.scss.js +1 -1
  62. package/es/components/form-group/form-group.scss.js +1 -1
  63. package/es/components/heading/heading.scss.js +1 -1
  64. package/es/components/icon-button/icon-button.scss.js +1 -1
  65. package/es/components/icon-indicator/icon-indicator.scss.js +1 -1
  66. package/es/components/inline-loading/inline-loading.scss.js +1 -1
  67. package/es/components/link/link.d.ts +1 -1
  68. package/es/components/link/link.d.ts.map +1 -1
  69. package/es/components/link/link.js.map +1 -1
  70. package/es/components/link/link.scss.js +1 -1
  71. package/es/components/list/list.scss.js +1 -1
  72. package/es/components/loading/loading.scss.js +1 -1
  73. package/es/components/menu/menu-item.scss.js +1 -1
  74. package/es/components/menu/menu.scss.js +1 -1
  75. package/es/components/menu-button/menu-button.scss.js +1 -1
  76. package/es/components/modal/modal-base.d.ts +144 -0
  77. package/es/components/modal/modal-base.d.ts.map +1 -0
  78. package/es/components/modal/modal-base.js +229 -0
  79. package/es/components/modal/modal-base.js.map +1 -0
  80. package/es/components/modal/modal.d.ts +15 -89
  81. package/es/components/modal/modal.d.ts.map +1 -1
  82. package/es/components/modal/modal.js +66 -169
  83. package/es/components/modal/modal.js.map +1 -1
  84. package/es/components/modal/modal.scss.js +1 -1
  85. package/es/components/modal/modal.scss.js.map +1 -1
  86. package/es/components/multi-select/multi-select.scss.js +1 -1
  87. package/es/components/notification/actionable-notification.scss.js +1 -1
  88. package/es/components/notification/inline-notification.scss.js +1 -1
  89. package/es/components/notification/toast-notification.scss.js +1 -1
  90. package/es/components/number-input/number-input.scss.js +1 -1
  91. package/es/components/overflow-menu/overflow-menu.scss.js +1 -1
  92. package/es/components/page-header/index.d.ts +4 -0
  93. package/es/components/page-header/index.d.ts.map +1 -1
  94. package/es/components/page-header/page-header-breadcrumb.d.ts +7 -0
  95. package/es/components/page-header/page-header-breadcrumb.d.ts.map +1 -1
  96. package/es/components/page-header/page-header-breadcrumb.js +7 -0
  97. package/es/components/page-header/page-header-breadcrumb.js.map +1 -1
  98. package/es/components/page-header/page-header-content-text.d.ts +7 -0
  99. package/es/components/page-header/page-header-content-text.d.ts.map +1 -1
  100. package/es/components/page-header/page-header-content-text.js +7 -0
  101. package/es/components/page-header/page-header-content-text.js.map +1 -1
  102. package/es/components/page-header/page-header-content.d.ts +7 -0
  103. package/es/components/page-header/page-header-content.d.ts.map +1 -1
  104. package/es/components/page-header/page-header-content.js +7 -0
  105. package/es/components/page-header/page-header-content.js.map +1 -1
  106. package/es/components/page-header/page-header-hero-image.d.ts +7 -0
  107. package/es/components/page-header/page-header-hero-image.d.ts.map +1 -1
  108. package/es/components/page-header/page-header-hero-image.js +7 -0
  109. package/es/components/page-header/page-header-hero-image.js.map +1 -1
  110. package/es/components/page-header/page-header-tabs.d.ts +7 -0
  111. package/es/components/page-header/page-header-tabs.d.ts.map +1 -1
  112. package/es/components/page-header/page-header-tabs.js +7 -0
  113. package/es/components/page-header/page-header-tabs.js.map +1 -1
  114. package/es/components/page-header/page-header.d.ts +7 -0
  115. package/es/components/page-header/page-header.d.ts.map +1 -1
  116. package/es/components/page-header/page-header.js +7 -0
  117. package/es/components/page-header/page-header.js.map +1 -1
  118. package/es/components/page-header/page-header.scss.js +1 -1
  119. package/es/components/page-header/page-header.scss.js.map +1 -1
  120. package/es/components/pagination/pagination.scss.js +1 -1
  121. package/es/components/pagination-nav/pagination-nav.scss.js +1 -1
  122. package/es/components/password-input/password-input.scss.js +1 -1
  123. package/es/components/popover/popover.scss.js +1 -1
  124. package/es/components/progress-bar/progress-bar.scss.js +1 -1
  125. package/es/components/progress-indicator/progress-indicator.scss.js +1 -1
  126. package/es/components/radio-button/radio-button.scss.js +1 -1
  127. package/es/components/search/search.d.ts +4 -0
  128. package/es/components/search/search.d.ts.map +1 -1
  129. package/es/components/search/search.js +4 -1
  130. package/es/components/search/search.js.map +1 -1
  131. package/es/components/search/search.scss.js +1 -1
  132. package/es/components/select/select.scss.js +1 -1
  133. package/es/components/shape-indicator/shape-indicator.scss.js +1 -1
  134. package/es/components/side-panel/side-panel.d.ts +1 -1
  135. package/es/components/side-panel/side-panel.js +1 -1
  136. package/es/components/side-panel/side-panel.js.map +1 -1
  137. package/es/components/skeleton-icon/skeleton-icon.scss.js +1 -1
  138. package/es/components/skeleton-placeholder/skeleton-placeholder.scss.js +1 -1
  139. package/es/components/skeleton-text/skeleton-text.scss.js +1 -1
  140. package/es/components/skip-to-content/skip-to-content.scss.js +1 -1
  141. package/es/components/slider/slider.scss.js +1 -1
  142. package/es/components/slug/slug.scss.js +1 -1
  143. package/es/components/stack/stack.scss.js +1 -1
  144. package/es/components/structured-list/structured-list.scss.js +1 -1
  145. package/es/components/tabs/stories/tabs-wrapper.d.ts +4 -0
  146. package/es/components/tabs/stories/tabs-wrapper.d.ts.map +1 -1
  147. package/es/components/tabs/stories/tabs-wrapper.js +22 -10
  148. package/es/components/tabs/stories/tabs-wrapper.js.map +1 -1
  149. package/es/components/tabs/tab.d.ts +34 -1
  150. package/es/components/tabs/tab.d.ts.map +1 -1
  151. package/es/components/tabs/tab.js +36 -3
  152. package/es/components/tabs/tab.js.map +1 -1
  153. package/es/components/tabs/tabs.d.ts +12 -0
  154. package/es/components/tabs/tabs.d.ts.map +1 -1
  155. package/es/components/tabs/tabs.js +36 -10
  156. package/es/components/tabs/tabs.js.map +1 -1
  157. package/es/components/tabs/tabs.scss.js +1 -1
  158. package/es/components/tabs/tabs.scss.js.map +1 -1
  159. package/es/components/tag/tag.scss.js +1 -1
  160. package/es/components/tearsheet/tearsheet.d.ts +1 -1
  161. package/es/components/tearsheet/tearsheet.js +1 -1
  162. package/es/components/tearsheet/tearsheet.js.map +1 -1
  163. package/es/components/text-input/text-input.scss.js +1 -1
  164. package/es/components/textarea/textarea.scss.js +1 -1
  165. package/es/components/tile/clickable-tile.d.ts +1 -1
  166. package/es/components/tile/clickable-tile.d.ts.map +1 -1
  167. package/es/components/tile/clickable-tile.js +6 -1
  168. package/es/components/tile/clickable-tile.js.map +1 -1
  169. package/es/components/tile/radio-tile.d.ts +4 -1
  170. package/es/components/tile/radio-tile.d.ts.map +1 -1
  171. package/es/components/tile/radio-tile.js +23 -6
  172. package/es/components/tile/radio-tile.js.map +1 -1
  173. package/es/components/tile/tile.scss.js +1 -1
  174. package/es/components/tile/tile.scss.js.map +1 -1
  175. package/es/components/time-picker/time-picker.scss.js +1 -1
  176. package/es/components/toggle/toggle.scss.js +1 -1
  177. package/es/components/toggle-tip/toggletip.scss.js +1 -1
  178. package/es/components/tooltip/tooltip.scss.js +1 -1
  179. package/es/components/tree-view/tree-view.scss.js +1 -1
  180. package/es/components/ui-shell/header.scss.js +1 -1
  181. package/es/components/ui-shell/side-nav.scss.js +1 -1
  182. package/es/globals/decorators/carbon-element.js.map +1 -1
  183. package/es/index.js +1 -1
  184. package/es-custom/components/accordion/accordion.scss.js +1 -1
  185. package/es-custom/components/ai-label/ai-label.scss.js +1 -1
  186. package/es-custom/components/ai-skeleton/ai-skeleton.scss.js +1 -1
  187. package/es-custom/components/badge-indicator/badge-indicator.scss.js +1 -1
  188. package/es-custom/components/breadcrumb/breadcrumb.scss.js +1 -1
  189. package/es-custom/components/button/button.d.ts +1 -1
  190. package/es-custom/components/button/button.js +1 -1
  191. package/es-custom/components/button/button.js.map +1 -1
  192. package/es-custom/components/button/button.scss.js +1 -1
  193. package/es-custom/components/checkbox/checkbox.scss.js +1 -1
  194. package/es-custom/components/code-snippet/code-snippet.scss.js +1 -1
  195. package/es-custom/components/combo-box/combo-box.scss.js +1 -1
  196. package/es-custom/components/combo-button/combo-button.scss.js +1 -1
  197. package/es-custom/components/contained-list/contained-list.scss.js +1 -1
  198. package/es-custom/components/content-switcher/content-switcher.scss.js +1 -1
  199. package/es-custom/components/copy-button/copy-button.scss.js +1 -1
  200. package/es-custom/components/data-table/data-table.scss.js +1 -1
  201. package/es-custom/components/date-picker/date-picker.scss.js +1 -1
  202. package/es-custom/components/date-picker/date-picker.scss.js.map +1 -1
  203. package/es-custom/components/dialog/dialog-body.js +1 -1
  204. package/es-custom/components/dialog/dialog-close-button.js +1 -1
  205. package/es-custom/components/dialog/dialog-footer.js +1 -1
  206. package/es-custom/components/dialog/dialog-subtitle.js +1 -1
  207. package/es-custom/components/dialog/dialog-title.js +1 -1
  208. package/es-custom/components/dialog/dialog.d.ts +18 -7
  209. package/es-custom/components/dialog/dialog.d.ts.map +1 -1
  210. package/es-custom/components/dialog/dialog.js +51 -17
  211. package/es-custom/components/dialog/dialog.js.map +1 -1
  212. package/es-custom/components/dialog/dialog.scss.js +1 -1
  213. package/es-custom/components/dialog/dialog.scss.js.map +1 -1
  214. package/es-custom/components/dropdown/dropdown.scss.js +1 -1
  215. package/es-custom/components/feature-flags/index.d.ts.map +1 -1
  216. package/es-custom/components/feature-flags/index.js +8 -3
  217. package/es-custom/components/feature-flags/index.js.map +1 -1
  218. package/es-custom/components/file-uploader/file-uploader-button.d.ts.map +1 -1
  219. package/es-custom/components/file-uploader/file-uploader-button.js +3 -2
  220. package/es-custom/components/file-uploader/file-uploader-button.js.map +1 -1
  221. package/es-custom/components/file-uploader/file-uploader-drop-container.d.ts +1 -1
  222. package/es-custom/components/file-uploader/file-uploader-drop-container.d.ts.map +1 -1
  223. package/es-custom/components/file-uploader/file-uploader-drop-container.js +3 -2
  224. package/es-custom/components/file-uploader/file-uploader-drop-container.js.map +1 -1
  225. package/es-custom/components/file-uploader/file-uploader-item.d.ts +4 -0
  226. package/es-custom/components/file-uploader/file-uploader-item.d.ts.map +1 -1
  227. package/es-custom/components/file-uploader/file-uploader-item.js +6 -0
  228. package/es-custom/components/file-uploader/file-uploader-item.js.map +1 -1
  229. package/es-custom/components/file-uploader/file-uploader.scss.js +1 -1
  230. package/es-custom/components/file-uploader/file-uploader.scss.js.map +1 -1
  231. package/es-custom/components/fluid-combo-box/fluid-combo-box.scss.js +1 -1
  232. package/es-custom/components/fluid-dropdown/fluid-dropdown.scss.js +1 -1
  233. package/es-custom/components/fluid-form/fluid-form.scss.js +1 -1
  234. package/es-custom/components/fluid-multi-select/fluid-multi-select.scss.js +1 -1
  235. package/es-custom/components/fluid-number-input/fluid-number-input.scss.js +1 -1
  236. package/es-custom/components/fluid-password-input/fluid-password-input.scss.js +1 -1
  237. package/es-custom/components/fluid-search/fluid-search.scss.js +1 -1
  238. package/es-custom/components/fluid-select/fluid-select.scss.js +1 -1
  239. package/es-custom/components/fluid-text-input/fluid-text-input.scss.js +1 -1
  240. package/es-custom/components/fluid-textarea/fluid-textarea.scss.js +1 -1
  241. package/es-custom/components/fluid-time-picker/fluid-time-picker.scss.js +1 -1
  242. package/es-custom/components/form/form-item.scss.js +1 -1
  243. package/es-custom/components/form/form.scss.js +1 -1
  244. package/es-custom/components/form-group/form-group.scss.js +1 -1
  245. package/es-custom/components/heading/heading.scss.js +1 -1
  246. package/es-custom/components/icon-button/icon-button.scss.js +1 -1
  247. package/es-custom/components/icon-indicator/icon-indicator.scss.js +1 -1
  248. package/es-custom/components/inline-loading/inline-loading.scss.js +1 -1
  249. package/es-custom/components/link/link.d.ts +1 -1
  250. package/es-custom/components/link/link.d.ts.map +1 -1
  251. package/es-custom/components/link/link.js.map +1 -1
  252. package/es-custom/components/link/link.scss.js +1 -1
  253. package/es-custom/components/list/list.scss.js +1 -1
  254. package/es-custom/components/loading/loading.scss.js +1 -1
  255. package/es-custom/components/menu/menu-item.scss.js +1 -1
  256. package/es-custom/components/menu/menu.scss.js +1 -1
  257. package/es-custom/components/menu-button/menu-button.scss.js +1 -1
  258. package/es-custom/components/modal/modal-base.d.ts +144 -0
  259. package/es-custom/components/modal/modal-base.d.ts.map +1 -0
  260. package/es-custom/components/modal/modal-base.js +229 -0
  261. package/es-custom/components/modal/modal-base.js.map +1 -0
  262. package/es-custom/components/modal/modal.d.ts +15 -89
  263. package/es-custom/components/modal/modal.d.ts.map +1 -1
  264. package/es-custom/components/modal/modal.js +66 -169
  265. package/es-custom/components/modal/modal.js.map +1 -1
  266. package/es-custom/components/modal/modal.scss.js +1 -1
  267. package/es-custom/components/modal/modal.scss.js.map +1 -1
  268. package/es-custom/components/multi-select/multi-select.scss.js +1 -1
  269. package/es-custom/components/notification/actionable-notification.scss.js +1 -1
  270. package/es-custom/components/notification/inline-notification.scss.js +1 -1
  271. package/es-custom/components/notification/toast-notification.scss.js +1 -1
  272. package/es-custom/components/number-input/number-input.scss.js +1 -1
  273. package/es-custom/components/overflow-menu/overflow-menu.scss.js +1 -1
  274. package/es-custom/components/page-header/index.d.ts +4 -0
  275. package/es-custom/components/page-header/index.d.ts.map +1 -1
  276. package/es-custom/components/page-header/page-header-breadcrumb.d.ts +7 -0
  277. package/es-custom/components/page-header/page-header-breadcrumb.d.ts.map +1 -1
  278. package/es-custom/components/page-header/page-header-breadcrumb.js +7 -0
  279. package/es-custom/components/page-header/page-header-breadcrumb.js.map +1 -1
  280. package/es-custom/components/page-header/page-header-content-text.d.ts +7 -0
  281. package/es-custom/components/page-header/page-header-content-text.d.ts.map +1 -1
  282. package/es-custom/components/page-header/page-header-content-text.js +7 -0
  283. package/es-custom/components/page-header/page-header-content-text.js.map +1 -1
  284. package/es-custom/components/page-header/page-header-content.d.ts +7 -0
  285. package/es-custom/components/page-header/page-header-content.d.ts.map +1 -1
  286. package/es-custom/components/page-header/page-header-content.js +7 -0
  287. package/es-custom/components/page-header/page-header-content.js.map +1 -1
  288. package/es-custom/components/page-header/page-header-hero-image.d.ts +7 -0
  289. package/es-custom/components/page-header/page-header-hero-image.d.ts.map +1 -1
  290. package/es-custom/components/page-header/page-header-hero-image.js +7 -0
  291. package/es-custom/components/page-header/page-header-hero-image.js.map +1 -1
  292. package/es-custom/components/page-header/page-header-tabs.d.ts +7 -0
  293. package/es-custom/components/page-header/page-header-tabs.d.ts.map +1 -1
  294. package/es-custom/components/page-header/page-header-tabs.js +7 -0
  295. package/es-custom/components/page-header/page-header-tabs.js.map +1 -1
  296. package/es-custom/components/page-header/page-header.d.ts +7 -0
  297. package/es-custom/components/page-header/page-header.d.ts.map +1 -1
  298. package/es-custom/components/page-header/page-header.js +7 -0
  299. package/es-custom/components/page-header/page-header.js.map +1 -1
  300. package/es-custom/components/page-header/page-header.scss.js +1 -1
  301. package/es-custom/components/page-header/page-header.scss.js.map +1 -1
  302. package/es-custom/components/pagination/pagination.scss.js +1 -1
  303. package/es-custom/components/pagination-nav/pagination-nav.scss.js +1 -1
  304. package/es-custom/components/password-input/password-input.scss.js +1 -1
  305. package/es-custom/components/popover/popover.scss.js +1 -1
  306. package/es-custom/components/progress-bar/progress-bar.scss.js +1 -1
  307. package/es-custom/components/progress-indicator/progress-indicator.scss.js +1 -1
  308. package/es-custom/components/radio-button/radio-button.scss.js +1 -1
  309. package/es-custom/components/search/search.d.ts +4 -0
  310. package/es-custom/components/search/search.d.ts.map +1 -1
  311. package/es-custom/components/search/search.js +4 -1
  312. package/es-custom/components/search/search.js.map +1 -1
  313. package/es-custom/components/search/search.scss.js +1 -1
  314. package/es-custom/components/select/select.scss.js +1 -1
  315. package/es-custom/components/shape-indicator/shape-indicator.scss.js +1 -1
  316. package/es-custom/components/side-panel/side-panel.d.ts +1 -1
  317. package/es-custom/components/side-panel/side-panel.js +1 -1
  318. package/es-custom/components/side-panel/side-panel.js.map +1 -1
  319. package/es-custom/components/skeleton-icon/skeleton-icon.scss.js +1 -1
  320. package/es-custom/components/skeleton-placeholder/skeleton-placeholder.scss.js +1 -1
  321. package/es-custom/components/skeleton-text/skeleton-text.scss.js +1 -1
  322. package/es-custom/components/skip-to-content/skip-to-content.scss.js +1 -1
  323. package/es-custom/components/slider/slider.scss.js +1 -1
  324. package/es-custom/components/slug/slug.scss.js +1 -1
  325. package/es-custom/components/stack/stack.scss.js +1 -1
  326. package/es-custom/components/structured-list/structured-list.scss.js +1 -1
  327. package/es-custom/components/tabs/stories/tabs-wrapper.d.ts +4 -0
  328. package/es-custom/components/tabs/stories/tabs-wrapper.d.ts.map +1 -1
  329. package/es-custom/components/tabs/stories/tabs-wrapper.js +22 -10
  330. package/es-custom/components/tabs/stories/tabs-wrapper.js.map +1 -1
  331. package/es-custom/components/tabs/tab.d.ts +34 -1
  332. package/es-custom/components/tabs/tab.d.ts.map +1 -1
  333. package/es-custom/components/tabs/tab.js +36 -3
  334. package/es-custom/components/tabs/tab.js.map +1 -1
  335. package/es-custom/components/tabs/tabs.d.ts +12 -0
  336. package/es-custom/components/tabs/tabs.d.ts.map +1 -1
  337. package/es-custom/components/tabs/tabs.js +36 -10
  338. package/es-custom/components/tabs/tabs.js.map +1 -1
  339. package/es-custom/components/tabs/tabs.scss.js +1 -1
  340. package/es-custom/components/tabs/tabs.scss.js.map +1 -1
  341. package/es-custom/components/tag/tag.scss.js +1 -1
  342. package/es-custom/components/tearsheet/tearsheet.d.ts +1 -1
  343. package/es-custom/components/tearsheet/tearsheet.js +1 -1
  344. package/es-custom/components/tearsheet/tearsheet.js.map +1 -1
  345. package/es-custom/components/text-input/text-input.scss.js +1 -1
  346. package/es-custom/components/textarea/textarea.scss.js +1 -1
  347. package/es-custom/components/tile/clickable-tile.d.ts +1 -1
  348. package/es-custom/components/tile/clickable-tile.d.ts.map +1 -1
  349. package/es-custom/components/tile/clickable-tile.js +6 -1
  350. package/es-custom/components/tile/clickable-tile.js.map +1 -1
  351. package/es-custom/components/tile/radio-tile.d.ts +4 -1
  352. package/es-custom/components/tile/radio-tile.d.ts.map +1 -1
  353. package/es-custom/components/tile/radio-tile.js +23 -6
  354. package/es-custom/components/tile/radio-tile.js.map +1 -1
  355. package/es-custom/components/tile/tile.scss.js +1 -1
  356. package/es-custom/components/tile/tile.scss.js.map +1 -1
  357. package/es-custom/components/time-picker/time-picker.scss.js +1 -1
  358. package/es-custom/components/toggle/toggle.scss.js +1 -1
  359. package/es-custom/components/toggle-tip/toggletip.scss.js +1 -1
  360. package/es-custom/components/tooltip/tooltip.scss.js +1 -1
  361. package/es-custom/components/tree-view/tree-view.scss.js +1 -1
  362. package/es-custom/components/ui-shell/header.scss.js +1 -1
  363. package/es-custom/components/ui-shell/side-nav.scss.js +1 -1
  364. package/es-custom/globals/decorators/carbon-element.js.map +1 -1
  365. package/es-custom/index.js +1 -1
  366. package/lib/components/button/button.d.ts +1 -1
  367. package/lib/components/dialog/dialog.d.ts +18 -7
  368. package/lib/components/dialog/dialog.d.ts.map +1 -1
  369. package/lib/components/feature-flags/index.d.ts.map +1 -1
  370. package/lib/components/file-uploader/file-uploader-button.d.ts.map +1 -1
  371. package/lib/components/file-uploader/file-uploader-drop-container.d.ts +1 -1
  372. package/lib/components/file-uploader/file-uploader-drop-container.d.ts.map +1 -1
  373. package/lib/components/file-uploader/file-uploader-item.d.ts +4 -0
  374. package/lib/components/file-uploader/file-uploader-item.d.ts.map +1 -1
  375. package/lib/components/link/link.d.ts +1 -1
  376. package/lib/components/link/link.d.ts.map +1 -1
  377. package/lib/components/modal/modal-base.d.ts +144 -0
  378. package/lib/components/modal/modal-base.d.ts.map +1 -0
  379. package/lib/components/modal/modal.d.ts +15 -89
  380. package/lib/components/modal/modal.d.ts.map +1 -1
  381. package/lib/components/page-header/index.d.ts +4 -0
  382. package/lib/components/page-header/index.d.ts.map +1 -1
  383. package/lib/components/page-header/page-header-breadcrumb.d.ts +7 -0
  384. package/lib/components/page-header/page-header-breadcrumb.d.ts.map +1 -1
  385. package/lib/components/page-header/page-header-content-text.d.ts +7 -0
  386. package/lib/components/page-header/page-header-content-text.d.ts.map +1 -1
  387. package/lib/components/page-header/page-header-content.d.ts +7 -0
  388. package/lib/components/page-header/page-header-content.d.ts.map +1 -1
  389. package/lib/components/page-header/page-header-hero-image.d.ts +7 -0
  390. package/lib/components/page-header/page-header-hero-image.d.ts.map +1 -1
  391. package/lib/components/page-header/page-header-tabs.d.ts +7 -0
  392. package/lib/components/page-header/page-header-tabs.d.ts.map +1 -1
  393. package/lib/components/page-header/page-header.d.ts +7 -0
  394. package/lib/components/page-header/page-header.d.ts.map +1 -1
  395. package/lib/components/search/search.d.ts +4 -0
  396. package/lib/components/search/search.d.ts.map +1 -1
  397. package/lib/components/side-panel/side-panel.d.ts +1 -1
  398. package/lib/components/tabs/stories/tabs-wrapper.d.ts +4 -0
  399. package/lib/components/tabs/stories/tabs-wrapper.d.ts.map +1 -1
  400. package/lib/components/tabs/tab.d.ts +34 -1
  401. package/lib/components/tabs/tab.d.ts.map +1 -1
  402. package/lib/components/tabs/tabs.d.ts +12 -0
  403. package/lib/components/tabs/tabs.d.ts.map +1 -1
  404. package/lib/components/tearsheet/tearsheet.d.ts +1 -1
  405. package/lib/components/tile/clickable-tile.d.ts +1 -1
  406. package/lib/components/tile/clickable-tile.d.ts.map +1 -1
  407. package/lib/components/tile/radio-tile.d.ts +4 -1
  408. package/lib/components/tile/radio-tile.d.ts.map +1 -1
  409. package/package.json +9 -9
  410. package/scss/components/date-picker/date-picker.scss +2 -1
  411. package/scss/components/dialog/dialog.scss +10 -4
  412. package/scss/components/file-uploader/file-uploader.scss +4 -0
  413. package/scss/components/modal/modal.scss +28 -1
  414. package/scss/components/page-header/page-header.scss +2 -0
  415. package/scss/components/tabs/tabs.scss +121 -1
  416. package/scss/components/tile/tile.scss +67 -1
  417. package/telemetry.yml +10 -6
@@ -5,15 +5,15 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import { selectorTabbable } from "../../globals/settings.js";
8
+ import "../../globals/settings.js";
9
9
  import { carbonElement } from "../../globals/decorators/carbon-element.js";
10
10
  import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.126.0/helpers/decorate.js";
11
11
  import HostListener from "../../globals/decorators/host-listener.js";
12
- import HostListenerMixin from "../../globals/mixins/host-listener.js";
13
12
  import { MODAL_SIZE } from "./defs.js";
14
13
  import modal_default$1 from "./modal.scss.js";
15
- import "../inline-loading/index.js";
16
- import { LitElement, html } from "lit";
14
+ import { CDSModalBase } from "./modal-base.js";
15
+ import "../dialog/dialog.js";
16
+ import { html } from "lit";
17
17
  import { property } from "lit/decorators.js";
18
18
  import { classMap } from "lit/directives/class-map.js";
19
19
  //#region src/components/modal/modal.ts
@@ -33,19 +33,17 @@ import { classMap } from "lit/directives/class-map.js";
33
33
  * Cancellation of this event stops the user-initiated action of closing this modal.
34
34
  * @fires cds-modal-closed - The custom event fired after this modal is closed upon a user gesture.
35
35
  */
36
- let CDSModal = class CDSModal extends HostListenerMixin(LitElement) {
36
+ let CDSModal = class CDSModal extends CDSModalBase {
37
37
  constructor(..._args) {
38
38
  super(..._args);
39
- this._launcher = null;
40
- this._loadingEl = null;
41
- this.WORKING_LOADING_STATUSES = [
42
- "active",
43
- "finished",
44
- "error"
45
- ];
39
+ this.enableDialogElement = false;
46
40
  this._handleClick = (event) => {
47
41
  if (event.composedPath().indexOf(this.shadowRoot) < 0 && !this.preventCloseOnClickOutside) this._handleUserInitiatedClose(event.target);
48
42
  };
43
+ this._handleKeydown = ({ key, target }) => {
44
+ if (!this.open || this.enableDialogElement) return;
45
+ if (key === "Esc" || key === "Escape") this._handleUserInitiatedClose(target);
46
+ };
49
47
  this._handleHostKeydown = (event) => {
50
48
  const target = event.target;
51
49
  const { primaryButton } = this._getFooterElements();
@@ -56,6 +54,7 @@ let CDSModal = class CDSModal extends HostListenerMixin(LitElement) {
56
54
  return;
57
55
  }
58
56
  }
57
+ if (this.enableDialogElement) return;
59
58
  if (event.key === "Tab") {
60
59
  const { first: _firstElement, last: _lastElement } = this.getFocusable();
61
60
  if (event.shiftKey && (this.shadowRoot?.activeElement === _firstElement || document.activeElement === _firstElement)) {
@@ -67,9 +66,25 @@ let CDSModal = class CDSModal extends HostListenerMixin(LitElement) {
67
66
  }
68
67
  }
69
68
  };
70
- this._handleKeydown = ({ key, target }) => {
71
- if (!this.open) return;
72
- if (key === "Esc" || key === "Escape") this._handleUserInitiatedClose(target);
69
+ this._handleDialogClosed = (event) => {
70
+ event.stopPropagation();
71
+ this.open = false;
72
+ this.dispatchEvent(new CustomEvent(this.constructor.eventClose, {
73
+ bubbles: true,
74
+ cancelable: true,
75
+ composed: true,
76
+ detail: event.detail
77
+ }));
78
+ };
79
+ this._handleDialogBeingClosed = (event) => {
80
+ event.stopPropagation();
81
+ const modalEvent = new CustomEvent(this.constructor.eventBeforeClose, {
82
+ bubbles: true,
83
+ cancelable: true,
84
+ composed: true,
85
+ detail: event.detail
86
+ });
87
+ if (!this.dispatchEvent(modalEvent)) event.preventDefault();
73
88
  };
74
89
  this.alert = false;
75
90
  this.ariaLabel = null;
@@ -78,110 +93,7 @@ let CDSModal = class CDSModal extends HostListenerMixin(LitElement) {
78
93
  this.hasScrollingContent = false;
79
94
  this.open = false;
80
95
  this.size = "md";
81
- this.preventCloseOnClickOutside = false;
82
- this.loadingStatus = "inactive";
83
- this.loadingDescription = "";
84
- this.loadingSuccessDelay = 1500;
85
- this.loadingIconDescription = "Loading";
86
96
  this.shouldSubmitOnEnter = false;
87
- this.preventClose = false;
88
- }
89
- /**
90
- * Get focusable elements.
91
- *
92
- * Querying all tabbable items.
93
- *
94
- * @returns {{first: HTMLElement, last: HTMLElement, all: HTMLElement[]}} Returns an object with various elements.
95
- */
96
- getFocusable() {
97
- const elements = [];
98
- const tabbableItems = this.querySelectorAll(selectorTabbable);
99
- if (tabbableItems?.length) elements.push(...tabbableItems);
100
- const all = elements?.filter((el) => typeof el?.focus === "function");
101
- return {
102
- first: all[0],
103
- last: all[all.length - 1],
104
- all
105
- };
106
- }
107
- /**
108
- * Handles `click` event on the modal container.
109
- *
110
- * @param event The event.
111
- */
112
- _handleClickContainer(event) {
113
- if (event.target.matches(this.constructor.selectorCloseButton) && !this.preventClose) this._handleUserInitiatedClose(event.target);
114
- }
115
- /**
116
- * Handles user-initiated close request of this modal.
117
- *
118
- * @param triggeredBy The element that triggered this close request.
119
- */
120
- _handleUserInitiatedClose(triggeredBy) {
121
- if (this.open) {
122
- const init = {
123
- bubbles: true,
124
- cancelable: true,
125
- composed: true,
126
- detail: { triggeredBy }
127
- };
128
- if (this.dispatchEvent(new CustomEvent(this.constructor.eventBeforeClose, init))) {
129
- this.open = false;
130
- this.dispatchEvent(new CustomEvent(this.constructor.eventClose, init));
131
- }
132
- }
133
- }
134
- /**
135
- * Handles `slotchange` event.
136
- */
137
- _handleSlotChange() {
138
- if (this.querySelector(`cds-modal-footer`)) this.setAttribute("has-footer", "");
139
- else this.removeAttribute("has-footer");
140
- }
141
- _initializeLoadingEl(footer) {
142
- if (!footer) return null;
143
- if (!this._loadingEl && this.WORKING_LOADING_STATUSES.includes(this.loadingStatus)) {
144
- const el = document.createElement(`cds-inline-loading`);
145
- el.setAttribute("controlled", "");
146
- el.setAttribute("aria-live", "off");
147
- footer.appendChild(el);
148
- this._loadingEl = el;
149
- }
150
- return this._loadingEl;
151
- }
152
- _getFooterElements() {
153
- return {
154
- footer: this.querySelector(`cds-modal-footer`),
155
- primaryButton: this.querySelector(`cds-modal-footer-button[kind="primary"]`) || this.querySelector(`cds-modal-footer-button[kind="danger"]`) || null,
156
- secondaryButtons: Array.from(this.querySelectorAll(`cds-modal-footer-button[kind="secondary"]`))
157
- };
158
- }
159
- _updateLoadingElement() {
160
- const { footer, primaryButton, secondaryButtons } = this._getFooterElements();
161
- const loader = this._initializeLoadingEl(footer);
162
- if (!footer || !loader || !primaryButton) return;
163
- if (this.WORKING_LOADING_STATUSES.includes(this.loadingStatus)) {
164
- loader.style.display = "inline-flex";
165
- loader.setAttribute("status", String(this.loadingStatus));
166
- loader.setAttribute("aria-live", "assertive");
167
- loader.setAttribute("icon-description", String(this.loadingIconDescription));
168
- loader.textContent = this.loadingDescription;
169
- primaryButton.style.display = "none";
170
- if (secondaryButtons[0]) if (!footer.hasAttribute("has-three-buttons")) secondaryButtons[0].setAttribute("disabled", "");
171
- else secondaryButtons.forEach((b) => b.removeAttribute("disabled"));
172
- if (this.loadingStatus === "finished") setTimeout(() => {
173
- this.dispatchEvent(new CustomEvent(this.constructor.eventOnLoadingSuccess, {
174
- bubbles: true,
175
- cancelable: true,
176
- composed: true
177
- }));
178
- }, this.loadingSuccessDelay);
179
- } else if (this.loadingStatus === "inactive") {
180
- loader.style.display = "none";
181
- loader.setAttribute("aria-live", "off");
182
- if (primaryButton) primaryButton.style.display = "";
183
- if (secondaryButtons) secondaryButtons.forEach((b) => b.removeAttribute("disabled"));
184
- }
185
97
  }
186
98
  async firstUpdated() {
187
99
  if (!this.querySelector(this.constructor.selectorModalBody)) {
@@ -247,7 +159,7 @@ let CDSModal = class CDSModal extends HostListenerMixin(LitElement) {
247
159
  super.disconnectedCallback?.();
248
160
  }
249
161
  render() {
250
- const { alert, size, hasScrollingContent } = this;
162
+ const { alert, size, hasScrollingContent, enableDialogElement } = this;
251
163
  const containerClass = this.containerClass.split(" ").filter(Boolean).reduce((acc, item) => ({
252
164
  ...acc,
253
165
  [item]: true
@@ -257,19 +169,35 @@ let CDSModal = class CDSModal extends HostListenerMixin(LitElement) {
257
169
  [`cds--modal-container--${size}`]: size,
258
170
  ...containerClass
259
171
  });
260
- return html`
261
- <div
262
- aria-label=${this._computeAriaLabel()}
263
- part="dialog"
264
- class=${containerClasses}
265
- aria-modal=${true}
266
- role="${alert ? "alert" : "dialog"}"
267
- tabindex="-1"
268
- @click=${this._handleClickContainer}>
269
- <slot @slotchange="${this._handleSlotChange}"></slot>
270
- ${hasScrollingContent ? html` <div class="cds--modal-content--overflow-indicator"></div> ` : ``}
271
- </div>
272
- `;
172
+ const ariaLabel = this._computeAriaLabel();
173
+ if (enableDialogElement) return html`
174
+ <cds-dialog
175
+ .open=${this.open}
176
+ .alert=${this.alert}
177
+ .preventCloseOnClickOutside=${this.preventCloseOnClickOutside}
178
+ .preventClose=${this.preventClose}
179
+ role="${alert ? "alertdialog" : "dialog"}"
180
+ aria-label=${ariaLabel}
181
+ modal-controlled
182
+ @cds-dialog-closed=${this._handleDialogClosed}
183
+ @cds-dialog-beingclosed=${this._handleDialogBeingClosed}>
184
+ <slot @slotchange="${this._handleSlotChange}"></slot>
185
+ ${hasScrollingContent ? html` <div class="cds--modal-content--overflow-indicator"></div> ` : ``}
186
+ </cds-dialog>
187
+ `;
188
+ else return html`
189
+ <div
190
+ aria-label=${ariaLabel}
191
+ part="dialog"
192
+ class=${containerClasses}
193
+ aria-modal=${true}
194
+ role="${alert ? "alert" : "dialog"}"
195
+ tabindex="-1"
196
+ @click=${this._handleClickContainer}>
197
+ <slot @slotchange="${this._handleSlotChange}"></slot>
198
+ ${hasScrollingContent ? html` <div class="cds--modal-content--overflow-indicator"></div> ` : ``}
199
+ </div>
200
+ `;
273
201
  }
274
202
  async updated(changedProperties) {
275
203
  if (changedProperties.has("open")) {
@@ -313,12 +241,6 @@ let CDSModal = class CDSModal extends HostListenerMixin(LitElement) {
313
241
  return `[data-modal-close],cds-modal-close-button`;
314
242
  }
315
243
  /**
316
- * A selector selecting tabbable nodes.
317
- */
318
- static get selectorTabbable() {
319
- return selectorTabbable;
320
- }
321
- /**
322
244
  * A selector selecting the nodes that should be focused when modal gets open.
323
245
  */
324
246
  static get selectorPrimaryFocus() {
@@ -343,19 +265,18 @@ let CDSModal = class CDSModal extends HostListenerMixin(LitElement) {
343
265
  static get eventClose() {
344
266
  return `cds-modal-closed`;
345
267
  }
346
- /**
347
- * The name of the custom event fired when this modal reaches a `finished` loading state
348
- */
349
- static get eventOnLoadingSuccess() {
350
- return `cds-modal-on-loadingsuccess`;
351
- }
352
268
  static {
353
269
  this.styles = modal_default$1;
354
270
  }
355
271
  };
272
+ __decorate([property({
273
+ type: Boolean,
274
+ reflect: true,
275
+ attribute: "enable-dialog-element"
276
+ })], CDSModal.prototype, "enableDialogElement", void 0);
356
277
  __decorate([HostListener("click")], CDSModal.prototype, "_handleClick", void 0);
357
- __decorate([HostListener("keydown")], CDSModal.prototype, "_handleHostKeydown", void 0);
358
278
  __decorate([HostListener("document:keydown")], CDSModal.prototype, "_handleKeydown", void 0);
279
+ __decorate([HostListener("keydown")], CDSModal.prototype, "_handleHostKeydown", void 0);
359
280
  __decorate([property({
360
281
  type: Boolean,
361
282
  reflect: true
@@ -377,35 +298,11 @@ __decorate([property({
377
298
  reflect: true
378
299
  })], CDSModal.prototype, "open", void 0);
379
300
  __decorate([property({ reflect: true })], CDSModal.prototype, "size", void 0);
380
- __decorate([property({
381
- type: Boolean,
382
- attribute: "prevent-close-on-click-outside"
383
- })], CDSModal.prototype, "preventCloseOnClickOutside", void 0);
384
- __decorate([property({
385
- reflect: true,
386
- attribute: "loading-status"
387
- })], CDSModal.prototype, "loadingStatus", void 0);
388
- __decorate([property({
389
- type: String,
390
- attribute: "loading-description"
391
- })], CDSModal.prototype, "loadingDescription", void 0);
392
- __decorate([property({
393
- type: Number,
394
- attribute: "loading-success-delay"
395
- })], CDSModal.prototype, "loadingSuccessDelay", void 0);
396
- __decorate([property({
397
- type: String,
398
- attribute: "loading-icon-description"
399
- })], CDSModal.prototype, "loadingIconDescription", void 0);
400
301
  __decorate([property({
401
302
  type: Boolean,
402
303
  reflect: true,
403
304
  attribute: "should-submit-on-enter"
404
305
  })], CDSModal.prototype, "shouldSubmitOnEnter", void 0);
405
- __decorate([property({
406
- type: Boolean,
407
- attribute: "prevent-close"
408
- })], CDSModal.prototype, "preventClose", void 0);
409
306
  CDSModal = __decorate([carbonElement(`cds-modal`)], CDSModal);
410
307
  var modal_default = CDSModal;
411
308
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"modal.js","names":["styles","customElement"],"sources":["../../../src/components/modal/modal.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2019, 2026\n *\n * This source code is licensed under the Apache-2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { classMap } from 'lit/directives/class-map.js';\nimport { LitElement, html } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { prefix } from '../../globals/settings';\nimport HostListener from '../../globals/decorators/host-listener';\nimport HostListenerMixin from '../../globals/mixins/host-listener';\nimport { MODAL_SIZE } from './defs';\nimport styles from './modal.scss?lit';\nimport { selectorTabbable } from '../../globals/settings';\nimport { carbonElement as customElement } from '../../globals/decorators/carbon-element';\nimport '../inline-loading';\nimport CDSModalFooter from './modal-footer';\n\nexport { MODAL_SIZE };\n\n/**\n * Modal.\n *\n * @element cds-modal\n * @csspart dialog The dialog.\n * @fires cds-modal-beingclosed\n * The custom event fired before this modal is being closed upon a user gesture.\n * Cancellation of this event stops the user-initiated action of closing this modal.\n * @fires cds-modal-closed - The custom event fired after this modal is closed upon a user gesture.\n */\n@customElement(`${prefix}-modal`)\nclass CDSModal extends HostListenerMixin(LitElement) {\n /**\n * The element that had focus before this modal gets open.\n */\n protected _launcher: Element | null = null;\n\n /**\n * The inline loading element that renders when `loading-status` is not `inactive`\n */\n private _loadingEl: HTMLElement | null = null;\n\n /**\n * MutationObserver that observes the modal-footer\n */\n private _footerObserver?: MutationObserver;\n\n /**\n * MutationObserver that observes the modal-header\n */\n private _headerObserver?: MutationObserver;\n\n /**\n * Loading statuses that are not `inactive`\n */\n private WORKING_LOADING_STATUSES = ['active', 'finished', 'error'];\n\n /**\n * Handles `click` event on this element.\n *\n * @param event The event.\n */\n @HostListener('click')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore: The decorator refers to this method but TS thinks this method is not referred to\n protected _handleClick = (event: MouseEvent) => {\n if (\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n event.composedPath().indexOf(this.shadowRoot!) < 0 &&\n !this.preventCloseOnClickOutside\n ) {\n this._handleUserInitiatedClose(event.target);\n }\n };\n\n /**\n * Handle the keydown event.\n * Trap the focus inside the side-panel by tracking keydown.key == `Tab`\n *\n * @param {KeyboardEvent} event The keyboard event object.\n */\n @HostListener('keydown')\n protected _handleHostKeydown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n const { primaryButton } = this._getFooterElements();\n\n if (\n this.open &&\n this.shouldSubmitOnEnter &&\n event.key === 'Enter' &&\n target &&\n document.activeElement !== primaryButton\n ) {\n const closeButton = (this.constructor as typeof CDSModal)\n .selectorCloseButton;\n\n const targetIsCloseButton =\n !!target.closest(closeButton) ||\n !!document.activeElement?.closest?.(closeButton);\n\n if (!targetIsCloseButton) {\n primaryButton?.click();\n return;\n }\n }\n if (event.key === 'Tab') {\n const { first: _firstElement, last: _lastElement } = this.getFocusable();\n\n if (\n event.shiftKey &&\n (this.shadowRoot?.activeElement === _firstElement ||\n document.activeElement === _firstElement)\n ) {\n event.preventDefault();\n\n _lastElement?.focus();\n } else if (!event.shiftKey && document.activeElement === _lastElement) {\n event.preventDefault();\n\n _firstElement?.focus();\n }\n }\n };\n\n @HostListener('document:keydown')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore: The decorator refers to this method but TS thinks this method is not referred to\n protected _handleKeydown = ({ key, target }: KeyboardEvent) => {\n if (!this.open) return;\n\n if (key === 'Esc' || key === 'Escape') {\n this._handleUserInitiatedClose(target);\n }\n };\n\n /**\n * Get focusable elements.\n *\n * Querying all tabbable items.\n *\n * @returns {{first: HTMLElement, last: HTMLElement, all: HTMLElement[]}} Returns an object with various elements.\n */\n protected getFocusable(): {\n first: HTMLElement | undefined;\n last: HTMLElement | undefined;\n all: HTMLElement[];\n } {\n const elements: HTMLElement[] = [];\n\n // Add tabbable elements inside light DOM\n const tabbableItems = this.querySelectorAll<HTMLElement>(selectorTabbable);\n if (tabbableItems?.length) {\n elements.push(...tabbableItems);\n }\n\n // Flatten NodeList arrays and filter for focusable items\n const all = elements?.filter(\n (el): el is HTMLElement => typeof el?.focus === 'function'\n );\n\n return {\n first: all[0],\n last: all[all.length - 1],\n all,\n };\n }\n\n /**\n * Handles `click` event on the modal container.\n *\n * @param event The event.\n */\n protected _handleClickContainer(event: MouseEvent) {\n if (\n (event.target as Element).matches(\n (this.constructor as typeof CDSModal).selectorCloseButton\n ) &&\n !this.preventClose\n ) {\n this._handleUserInitiatedClose(event.target);\n }\n }\n\n /**\n * Handles user-initiated close request of this modal.\n *\n * @param triggeredBy The element that triggered this close request.\n */\n protected _handleUserInitiatedClose(triggeredBy: EventTarget | null) {\n if (this.open) {\n const init = {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: {\n triggeredBy,\n },\n };\n if (\n this.dispatchEvent(\n new CustomEvent(\n (this.constructor as typeof CDSModal).eventBeforeClose,\n init\n )\n )\n ) {\n this.open = false;\n this.dispatchEvent(\n new CustomEvent(\n (this.constructor as typeof CDSModal).eventClose,\n init\n )\n );\n }\n }\n }\n\n /**\n * Handles `slotchange` event.\n */\n protected _handleSlotChange() {\n if (this.querySelector(`${prefix}-modal-footer`)) {\n this.setAttribute('has-footer', '');\n } else {\n this.removeAttribute('has-footer');\n }\n }\n\n /**\n * Specify whether the Modal is displaying an alert, error or warning.\n * Should go hand in hand with the danger prop.\n */\n @property({ type: Boolean, reflect: true })\n alert = false;\n\n /**\n * Specify text for the accessibility label of the header\n */\n @property({ attribute: 'aria-label' })\n ariaLabel: string | null = null;\n\n /**\n * The additional CSS class names for the container <div> of the element.\n */\n @property({ attribute: 'container-class' })\n containerClass = '';\n\n /**\n * Specify whether or not the Modal content should have any inner padding.\n */\n @property({ type: Boolean, reflect: true, attribute: 'full-width' })\n fullWidth = false;\n\n /**\n * Specify whether the modal contains scrolling content\n */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'has-scrolling-content',\n })\n hasScrollingContent = false;\n\n /**\n * `true` if the modal should be open.\n */\n @property({ type: Boolean, reflect: true })\n open = false;\n\n /**\n * Modal size.\n */\n @property({ reflect: true })\n size = MODAL_SIZE.MEDIUM;\n\n /**\n * Prevent closing on click outside of modal\n */\n @property({ type: Boolean, attribute: 'prevent-close-on-click-outside' })\n preventCloseOnClickOutside = false;\n\n /**\n * Specify the loading status\n */\n @property({ reflect: true, attribute: 'loading-status' })\n loadingStatus: 'inactive' | 'active' | 'finished' | 'error' = 'inactive';\n\n /**\n * Specify the description for the loading text\n */\n @property({ type: String, attribute: 'loading-description' })\n loadingDescription = '';\n\n /**\n * Provide a delay for the setTimeout for success\n */\n @property({ type: Number, attribute: 'loading-success-delay' })\n loadingSuccessDelay = 1500;\n\n /**\n * Specify the description for the loading icon\n */\n @property({ type: String, attribute: 'loading-icon-description' })\n loadingIconDescription = 'Loading';\n\n /**\n * Specify if Enter key should be used as \"submit\" action that clicks the primary footer button\n */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'should-submit-on-enter',\n })\n shouldSubmitOnEnter = false;\n\n /**\n * Prevent the modal from closing after clicking the close button\n */\n @property({ type: Boolean, attribute: 'prevent-close' })\n preventClose = false;\n\n // Initializes the inline-loading element\n private _initializeLoadingEl(footer: CDSModalFooter) {\n if (!footer) return null;\n\n if (\n !this._loadingEl &&\n this.WORKING_LOADING_STATUSES.includes(this.loadingStatus)\n ) {\n const el = document.createElement(`${prefix}-inline-loading`);\n el.setAttribute('controlled', '');\n el.setAttribute('aria-live', 'off');\n footer.appendChild(el);\n this._loadingEl = el as HTMLElement;\n }\n return this._loadingEl;\n }\n\n protected _getFooterElements() {\n const footer = this.querySelector(`${prefix}-modal-footer`);\n\n const primaryButton =\n this.querySelector<HTMLElement>(\n `${prefix}-modal-footer-button[kind=\"primary\"]`\n ) ||\n this.querySelector<HTMLElement>(\n `${prefix}-modal-footer-button[kind=\"danger\"]`\n ) ||\n null;\n\n const secondaryButtons = Array.from(\n this.querySelectorAll<HTMLElement>(\n `${prefix}-modal-footer-button[kind=\"secondary\"]`\n )\n );\n\n return { footer, primaryButton, secondaryButtons };\n }\n\n // Updates the inline loading element in the modal footer\n private _updateLoadingElement() {\n const { footer, primaryButton, secondaryButtons } =\n this._getFooterElements();\n\n const loader = this._initializeLoadingEl(footer as CDSModalFooter);\n if (!footer || !loader || !primaryButton) return;\n\n if (this.WORKING_LOADING_STATUSES.includes(this.loadingStatus)) {\n loader.style.display = 'inline-flex';\n loader.setAttribute('status', String(this.loadingStatus));\n loader.setAttribute('aria-live', 'assertive');\n loader.setAttribute(\n 'icon-description',\n String(this.loadingIconDescription)\n );\n loader.textContent = this.loadingDescription;\n primaryButton.style.display = 'none';\n\n if (secondaryButtons[0]) {\n if (!footer.hasAttribute('has-three-buttons')) {\n secondaryButtons[0].setAttribute('disabled', '');\n } else {\n secondaryButtons.forEach((b) => b.removeAttribute('disabled'));\n }\n }\n\n if (this.loadingStatus === 'finished') {\n // fire event for successful load\n setTimeout(() => {\n this.dispatchEvent(\n new CustomEvent(\n (this.constructor as typeof CDSModal).eventOnLoadingSuccess,\n {\n bubbles: true,\n cancelable: true,\n composed: true,\n }\n )\n );\n }, this.loadingSuccessDelay);\n }\n } else if (this.loadingStatus === 'inactive') {\n loader.style.display = 'none';\n loader.setAttribute('aria-live', 'off');\n\n if (primaryButton) primaryButton.style.display = '';\n if (secondaryButtons)\n secondaryButtons.forEach((b) => b.removeAttribute('disabled'));\n }\n }\n\n async firstUpdated() {\n const body = this.querySelector(\n (this.constructor as typeof CDSModal).selectorModalBody\n );\n\n if (!body) {\n const bodyElement = document.createElement(\n (this.constructor as typeof CDSModal).selectorModalBody\n );\n this.appendChild(bodyElement);\n }\n }\n\n /**\n * Computes the aria-label of the modal based on (in order of highest to lowest precedence):\n * - `modal-label`\n * - `aria-label`\n * - `modal-heading`\n */\n private _computeAriaLabel(): string {\n const labelEl = this.querySelector(`${prefix}-modal-label`);\n const label = labelEl?.textContent?.trim();\n if (label) return label;\n\n const ariaLabel = this.ariaLabel?.trim();\n if (ariaLabel) return ariaLabel;\n\n const headingEl = this.querySelector(`${prefix}-modal-heading`);\n const heading = headingEl?.textContent?.trim();\n return heading || '';\n }\n\n /**\n * Observes the modal footer's `has-three-buttons` attribute to account for cases\n * where the loading status and the amount of footer-buttons\n * are being changed dynamically\n */\n private _observeFooter() {\n const footer = this.querySelector(`${prefix}-modal-footer`);\n if (!footer) return;\n\n this._footerObserver = new MutationObserver(() => {\n this._updateLoadingElement();\n });\n this._footerObserver.observe(footer, {\n attributes: true,\n childList: true,\n attributeFilter: ['has-three-buttons'],\n });\n }\n\n /**\n * Observes the modal header to account for cases where the modal-heading,\n * modal-label, and/or `aria-label` are dynamically changing\n * to update the `aria-label` put on the modal\n */\n private _observeHeader() {\n const header = this.querySelector(`${prefix}-modal-header`);\n if (!header) return;\n\n this._headerObserver = new MutationObserver(() => {\n this.requestUpdate('ariaLabel');\n });\n this._headerObserver.observe(header, {\n subtree: true,\n characterData: true,\n childList: true,\n });\n }\n\n connectedCallback() {\n super.connectedCallback?.();\n this._observeFooter();\n this._observeHeader();\n }\n\n disconnectedCallback() {\n this._footerObserver?.disconnect();\n this._headerObserver?.disconnect();\n super.disconnectedCallback?.();\n }\n\n render() {\n const { alert, size, hasScrollingContent } = this;\n const containerClass = this.containerClass\n .split(' ')\n .filter(Boolean)\n .reduce((acc, item) => ({ ...acc, [item]: true }), {});\n const containerClasses = classMap({\n [`${prefix}--modal-container`]: true,\n [`${prefix}--modal-container--${size}`]: size,\n ...containerClass,\n });\n return html`\n <div\n aria-label=${this._computeAriaLabel()}\n part=\"dialog\"\n class=${containerClasses}\n aria-modal=${true}\n role=\"${alert ? 'alert' : 'dialog'}\"\n tabindex=\"-1\"\n @click=${this._handleClickContainer}>\n <slot @slotchange=\"${this._handleSlotChange}\"></slot>\n ${hasScrollingContent\n ? html` <div class=\"cds--modal-content--overflow-indicator\"></div> `\n : ``}\n </div>\n `;\n }\n\n async updated(changedProperties) {\n if (changedProperties.has('open')) {\n if (this.open) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this._launcher = this.ownerDocument!.activeElement;\n const primaryFocusNode = this.querySelector(\n (this.constructor as typeof CDSModal).selectorPrimaryFocus\n );\n await (this.constructor as typeof CDSModal)._delay();\n if (primaryFocusNode) {\n // For cases where a `carbon-web-components` component (e.g. `<cds-button>`) being `primaryFocusNode`,\n // where its first update/render cycle that makes it focusable happens after `<cds-modal>`'s first update/render cycle\n (primaryFocusNode as HTMLElement).focus();\n } else {\n const { primaryButton, secondaryButtons } = this._getFooterElements();\n\n if (primaryButton) {\n const kind = primaryButton?.getAttribute('kind');\n\n if (kind === 'danger' && secondaryButtons[0]) {\n secondaryButtons[0].focus();\n } else {\n primaryButton.focus();\n }\n } else {\n const { first } = this.getFocusable();\n\n first?.focus();\n }\n }\n } else if (\n this._launcher &&\n typeof (this._launcher as HTMLElement).focus === 'function'\n ) {\n (this._launcher as HTMLElement).focus();\n this._launcher = null;\n }\n }\n if (\n changedProperties.has('loadingStatus') ||\n changedProperties.has('loadingDescription') ||\n changedProperties.has('loadingSuccessDelay') ||\n changedProperties.has('loadingIconDescription')\n ) {\n await (this.constructor as typeof CDSModal)._delay();\n this._updateLoadingElement();\n }\n }\n\n /**\n * @param ms The number of milliseconds.\n * @returns A promise that is resolves after the given milliseconds.\n */\n protected static _delay(ms = 0) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n }\n\n /**\n * A selector selecting buttons that should close this modal.\n */\n static get selectorCloseButton() {\n return `[data-modal-close],${prefix}-modal-close-button`;\n }\n\n /**\n * A selector selecting tabbable nodes.\n */\n static get selectorTabbable() {\n return selectorTabbable;\n }\n\n /**\n * A selector selecting the nodes that should be focused when modal gets open.\n */\n static get selectorPrimaryFocus() {\n return `[data-modal-primary-focus],${prefix}-modal-footer ${prefix}-button[kind=\"primary\"]`;\n }\n\n /**\n * A selector selecting the modal body component\n */\n static get selectorModalBody() {\n return `${prefix}-modal-body`;\n }\n\n /**\n * The name of the custom event fired before this modal is being closed upon a user gesture.\n * Cancellation of this event stops the user-initiated action of closing this modal.\n */\n static get eventBeforeClose() {\n return `${prefix}-modal-beingclosed`;\n }\n\n /**\n * The name of the custom event fired after this modal is closed upon a user gesture.\n */\n static get eventClose() {\n return `${prefix}-modal-closed`;\n }\n\n /**\n * The name of the custom event fired when this modal reaches a `finished` loading state\n */\n static get eventOnLoadingSuccess() {\n return `${prefix}-modal-on-loadingsuccess`;\n }\n\n static styles = styles;\n}\n\nexport default CDSModal;\n"],"mappings":"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"}
1
+ {"version":3,"file":"modal.js","names":["styles","customElement"],"sources":["../../../src/components/modal/modal.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2019, 2026\n *\n * This source code is licensed under the Apache-2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { classMap } from 'lit/directives/class-map.js';\nimport { html } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { prefix } from '../../globals/settings';\nimport HostListener from '../../globals/decorators/host-listener';\nimport { MODAL_SIZE } from './defs';\nimport styles from './modal.scss?lit';\nimport { carbonElement as customElement } from '../../globals/decorators/carbon-element';\nimport CDSModalBase from './modal-base';\nimport '../dialog/dialog';\n\nexport { MODAL_SIZE };\n\n/**\n * Modal.\n *\n * @element cds-modal\n * @csspart dialog The dialog.\n * @fires cds-modal-beingclosed\n * The custom event fired before this modal is being closed upon a user gesture.\n * Cancellation of this event stops the user-initiated action of closing this modal.\n * @fires cds-modal-closed - The custom event fired after this modal is closed upon a user gesture.\n */\n@customElement(`${prefix}-modal`)\nclass CDSModal extends CDSModalBase {\n /**\n * Enable the use of native dialog element instead of div with role=\"dialog\"\n */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'enable-dialog-element',\n })\n enableDialogElement = false;\n\n /**\n * MutationObserver that observes the modal-footer\n */\n private _footerObserver?: MutationObserver;\n\n /**\n * MutationObserver that observes the modal-header\n */\n private _headerObserver?: MutationObserver;\n\n /**\n * Handles `click` event on this element.\n *\n * @param event The event.\n */\n @HostListener('click')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore: The decorator refers to this method but TS thinks this method is not referred to\n protected _handleClick = (event: MouseEvent) => {\n if (\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n event.composedPath().indexOf(this.shadowRoot!) < 0 &&\n !this.preventCloseOnClickOutside\n ) {\n this._handleUserInitiatedClose(event.target);\n }\n };\n\n @HostListener('document:keydown')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore: The decorator refers to this method but TS thinks this method is not referred to\n protected _handleKeydown = ({ key, target }: KeyboardEvent) => {\n // let the Dialog handle the event if using `enable-dialog-element` feature flag\n if (!this.open || this.enableDialogElement) return;\n\n if (key === 'Esc' || key === 'Escape') {\n this._handleUserInitiatedClose(target);\n }\n };\n\n /**\n * Handle the keydown event.\n * Trap the focus inside the side-panel by tracking keydown.key == `Tab`\n *\n * @param {KeyboardEvent} event The keyboard event object.\n */\n @HostListener('keydown')\n protected _handleHostKeydown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n const { primaryButton } = this._getFooterElements();\n\n if (\n this.open &&\n this.shouldSubmitOnEnter &&\n event.key === 'Enter' &&\n target &&\n document.activeElement !== primaryButton\n ) {\n const closeButton = (this.constructor as typeof CDSModal)\n .selectorCloseButton;\n\n const targetIsCloseButton =\n !!target.closest(closeButton) ||\n !!document.activeElement?.closest?.(closeButton);\n\n if (!targetIsCloseButton) {\n primaryButton?.click();\n return;\n }\n }\n\n if (this.enableDialogElement) return;\n\n if (event.key === 'Tab') {\n const { first: _firstElement, last: _lastElement } = this.getFocusable();\n\n if (\n event.shiftKey &&\n (this.shadowRoot?.activeElement === _firstElement ||\n document.activeElement === _firstElement)\n ) {\n event.preventDefault();\n\n _lastElement?.focus();\n } else if (!event.shiftKey && document.activeElement === _lastElement) {\n event.preventDefault();\n\n _firstElement?.focus();\n }\n }\n };\n\n /**\n * `enable-dialog-element`\n *\n * Handles `cds-dialog-closed` event from the nested dialog element.\n * Syncs the open state when the dialog closes, and stops the propagation of the\n * event in favour of `cds-modal-closed`\n */\n protected _handleDialogClosed = (event: CustomEvent) => {\n event.stopPropagation();\n\n this.open = false;\n\n // fire modal closed event\n this.dispatchEvent(\n new CustomEvent((this.constructor as typeof CDSModal).eventClose, {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: event.detail,\n })\n );\n };\n\n /**\n * `enable-dialog-element`\n *\n * Handles `cds-dialog-beingclosed` event from the nested dialog element.\n * Stops the propagation of the event in favour of `cds-modal-beingclosed`\n */\n protected _handleDialogBeingClosed = (event: CustomEvent) => {\n event.stopPropagation();\n\n const modalEvent = new CustomEvent(\n (this.constructor as typeof CDSModal).eventBeforeClose,\n {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: event.detail,\n }\n );\n\n // allow the user to cancel the beingclosed event\n if (!this.dispatchEvent(modalEvent)) {\n event.preventDefault();\n }\n };\n\n /**\n * Specify whether the Modal is displaying an alert, error or warning.\n * Should go hand in hand with the danger prop.\n */\n @property({ type: Boolean, reflect: true })\n alert = false;\n\n /**\n * Specify text for the accessibility label of the header\n */\n @property({ attribute: 'aria-label' })\n ariaLabel: string | null = null;\n\n /**\n * The additional CSS class names for the container <div> of the element.\n */\n @property({ attribute: 'container-class' })\n containerClass = '';\n\n /**\n * Specify whether or not the Modal content should have any inner padding.\n */\n @property({ type: Boolean, reflect: true, attribute: 'full-width' })\n fullWidth = false;\n\n /**\n * Specify whether the modal contains scrolling content\n */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'has-scrolling-content',\n })\n hasScrollingContent = false;\n\n /**\n * `true` if the modal should be open.\n */\n @property({ type: Boolean, reflect: true })\n open = false;\n\n /**\n * Modal size.\n */\n @property({ reflect: true })\n size = MODAL_SIZE.MEDIUM;\n\n /**\n * Specify if Enter key should be used as \"submit\" action that clicks the primary footer button\n */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'should-submit-on-enter',\n })\n shouldSubmitOnEnter = false;\n\n async firstUpdated() {\n const body = this.querySelector(\n (this.constructor as typeof CDSModal).selectorModalBody\n );\n\n if (!body) {\n const bodyElement = document.createElement(\n (this.constructor as typeof CDSModal).selectorModalBody\n );\n this.appendChild(bodyElement);\n }\n }\n\n /**\n * Computes the aria-label of the modal based on (in order of highest to lowest precedence):\n * - `modal-label`\n * - `aria-label`\n * - `modal-heading`\n */\n private _computeAriaLabel(): string {\n const labelEl = this.querySelector(`${prefix}-modal-label`);\n const label = labelEl?.textContent?.trim();\n if (label) return label;\n\n const ariaLabel = this.ariaLabel?.trim();\n if (ariaLabel) return ariaLabel;\n\n const headingEl = this.querySelector(`${prefix}-modal-heading`);\n const heading = headingEl?.textContent?.trim();\n return heading || '';\n }\n\n /**\n * Observes the modal footer's `has-three-buttons` attribute to account for cases\n * where the loading status and the amount of footer-buttons\n * are being changed dynamically\n */\n private _observeFooter() {\n const footer = this.querySelector(`${prefix}-modal-footer`);\n if (!footer) return;\n\n this._footerObserver = new MutationObserver(() => {\n this._updateLoadingElement();\n });\n this._footerObserver.observe(footer, {\n attributes: true,\n childList: true,\n attributeFilter: ['has-three-buttons'],\n });\n }\n\n /**\n * Observes the modal header to account for cases where the modal-heading,\n * modal-label, and/or `aria-label` are dynamically changing\n * to update the `aria-label` put on the modal\n */\n private _observeHeader() {\n const header = this.querySelector(`${prefix}-modal-header`);\n if (!header) return;\n\n this._headerObserver = new MutationObserver(() => {\n this.requestUpdate('ariaLabel');\n });\n this._headerObserver.observe(header, {\n subtree: true,\n characterData: true,\n childList: true,\n });\n }\n\n connectedCallback() {\n super.connectedCallback?.();\n this._observeFooter();\n this._observeHeader();\n }\n\n disconnectedCallback() {\n this._footerObserver?.disconnect();\n this._headerObserver?.disconnect();\n super.disconnectedCallback?.();\n }\n\n render() {\n const { alert, size, hasScrollingContent, enableDialogElement } = this;\n const containerClass = this.containerClass\n .split(' ')\n .filter(Boolean)\n .reduce((acc, item) => ({ ...acc, [item]: true }), {});\n const containerClasses = classMap({\n [`${prefix}--modal-container`]: true,\n [`${prefix}--modal-container--${size}`]: size,\n ...containerClass,\n });\n\n const ariaLabel = this._computeAriaLabel();\n\n if (enableDialogElement) {\n return html`\n <cds-dialog\n .open=${this.open}\n .alert=${this.alert}\n .preventCloseOnClickOutside=${this.preventCloseOnClickOutside}\n .preventClose=${this.preventClose}\n role=\"${alert ? 'alertdialog' : 'dialog'}\"\n aria-label=${ariaLabel}\n modal-controlled\n @cds-dialog-closed=${this._handleDialogClosed}\n @cds-dialog-beingclosed=${this._handleDialogBeingClosed}>\n <slot @slotchange=\"${this._handleSlotChange}\"></slot>\n ${hasScrollingContent\n ? html` <div class=\"cds--modal-content--overflow-indicator\"></div> `\n : ``}\n </cds-dialog>\n `;\n } else {\n return html`\n <div\n aria-label=${ariaLabel}\n part=\"dialog\"\n class=${containerClasses}\n aria-modal=${true}\n role=\"${alert ? 'alert' : 'dialog'}\"\n tabindex=\"-1\"\n @click=${this._handleClickContainer}>\n <slot @slotchange=\"${this._handleSlotChange}\"></slot>\n ${hasScrollingContent\n ? html` <div class=\"cds--modal-content--overflow-indicator\"></div> `\n : ``}\n </div>\n `;\n }\n }\n\n async updated(changedProperties) {\n if (changedProperties.has('open')) {\n if (this.open) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this._launcher = this.ownerDocument!.activeElement;\n const primaryFocusNode = this.querySelector(\n (this.constructor as typeof CDSModal).selectorPrimaryFocus\n );\n await (this.constructor as typeof CDSModal)._delay();\n if (primaryFocusNode) {\n // For cases where a `carbon-web-components` component (e.g. `<cds-button>`) being `primaryFocusNode`,\n // where its first update/render cycle that makes it focusable happens after `<cds-modal>`'s first update/render cycle\n (primaryFocusNode as HTMLElement).focus();\n } else {\n const { primaryButton, secondaryButtons } = this._getFooterElements();\n\n if (primaryButton) {\n const kind = primaryButton?.getAttribute('kind');\n\n if (kind === 'danger' && secondaryButtons[0]) {\n secondaryButtons[0].focus();\n } else {\n primaryButton.focus();\n }\n } else {\n const { first } = this.getFocusable();\n\n first?.focus();\n }\n }\n } else if (\n this._launcher &&\n typeof (this._launcher as HTMLElement).focus === 'function'\n ) {\n (this._launcher as HTMLElement).focus();\n this._launcher = null;\n }\n }\n if (\n changedProperties.has('loadingStatus') ||\n changedProperties.has('loadingDescription') ||\n changedProperties.has('loadingSuccessDelay') ||\n changedProperties.has('loadingIconDescription')\n ) {\n await (this.constructor as typeof CDSModal)._delay();\n this._updateLoadingElement();\n }\n }\n\n /**\n * @param ms The number of milliseconds.\n * @returns A promise that is resolves after the given milliseconds.\n */\n protected static _delay(ms = 0) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n }\n\n /**\n * A selector selecting buttons that should close this modal.\n */\n static get selectorCloseButton() {\n return `[data-modal-close],${prefix}-modal-close-button`;\n }\n\n /**\n * A selector selecting the nodes that should be focused when modal gets open.\n */\n static get selectorPrimaryFocus() {\n return `[data-modal-primary-focus],${prefix}-modal-footer ${prefix}-button[kind=\"primary\"]`;\n }\n\n /**\n * A selector selecting the modal body component\n */\n static get selectorModalBody() {\n return `${prefix}-modal-body`;\n }\n\n /**\n * The name of the custom event fired before this modal is being closed upon a user gesture.\n * Cancellation of this event stops the user-initiated action of closing this modal.\n */\n static get eventBeforeClose() {\n return `${prefix}-modal-beingclosed`;\n }\n\n /**\n * The name of the custom event fired after this modal is closed upon a user gesture.\n */\n static get eventClose() {\n return `${prefix}-modal-closed`;\n }\n\n static styles = styles;\n}\n\nexport default CDSModal;\n"],"mappings":"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"}