@pine-ds/core 4.5.0 → 4.7.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 (478) hide show
  1. package/components/attributes.js +1 -1
  2. package/components/mock-pds-modal.js +1 -1
  3. package/components/pds-combobox.js +1 -1
  4. package/components/pds-container.js +1 -1
  5. package/components/pds-copytext.js +1 -1
  6. package/components/pds-datepicker.js +1 -1
  7. package/components/pds-divider.js +1 -1
  8. package/components/pds-drawer-content.js +1 -1
  9. package/components/pds-drawer-footer.js +1 -1
  10. package/components/pds-drawer-header.js +1 -1
  11. package/components/pds-drawer.js +1 -1
  12. package/components/pds-dropdown-menu-item.js +1 -1
  13. package/components/pds-dropdown-menu-separator.js +1 -1
  14. package/components/pds-dropdown-menu.js +1 -1
  15. package/components/pds-filter.js +1 -1
  16. package/components/pds-filters.js +1 -1
  17. package/components/pds-icon2.js +1 -1
  18. package/components/pds-image.js +1 -1
  19. package/components/pds-input2.js +1 -1
  20. package/components/pds-link2.js +1 -1
  21. package/components/pds-loader2.js +1 -1
  22. package/components/pds-modal-content.js +1 -1
  23. package/components/pds-modal-footer.js +1 -1
  24. package/components/pds-modal-header.js +1 -1
  25. package/components/pds-modal2.js +1 -1
  26. package/components/pds-multiselect.js +1 -1
  27. package/components/pds-popover.js +1 -1
  28. package/components/pds-progress.js +1 -1
  29. package/components/pds-property.js +1 -1
  30. package/components/pds-radio-group.js +1 -1
  31. package/components/pds-radio.js +1 -1
  32. package/components/pds-row.js +1 -1
  33. package/components/pds-select.js +1 -1
  34. package/components/pds-sortable-item.js +1 -1
  35. package/components/pds-sortable.js +1 -1
  36. package/components/pds-switch.js +1 -1
  37. package/components/pds-tab.js +1 -1
  38. package/components/pds-table-body.js +1 -1
  39. package/components/pds-table-cell2.js +1 -1
  40. package/components/pds-table-head-cell2.js +1 -1
  41. package/components/pds-table-head.js +1 -1
  42. package/components/pds-table-row.js +1 -1
  43. package/components/pds-tabpanel.js +1 -1
  44. package/components/pds-tabs.js +1 -1
  45. package/components/pds-text2.js +1 -1
  46. package/components/pds-textarea.js +1 -1
  47. package/components/pds-toast.js +1 -1
  48. package/components/pds-tooltip.js +1 -1
  49. package/dist/cjs/{attributes-DXvaSETR.js → attributes-BJ7KBHql.js} +18 -11
  50. package/dist/cjs/{index-D-QQKB0y.js → index-5Azb8EQG.js} +1 -1
  51. package/dist/cjs/{index-BQjWfQXw.js → index-jl_Q819j.js} +1 -1
  52. package/dist/cjs/index.cjs.js +1 -1
  53. package/dist/cjs/keep-hydrated-CiXgkEYd.js +196 -0
  54. package/dist/cjs/loader.cjs.js +3 -3
  55. package/dist/cjs/mock-pds-modal.cjs.entry.js +3 -3
  56. package/dist/cjs/pds-accordion.cjs.entry.js +3 -3
  57. package/dist/cjs/pds-alert.cjs.entry.js +2 -2
  58. package/dist/cjs/pds-avatar.cjs.entry.js +3 -3
  59. package/dist/cjs/pds-box.cjs.entry.js +3 -3
  60. package/dist/cjs/pds-button.cjs.entry.js +3 -3
  61. package/dist/cjs/pds-checkbox.cjs.entry.js +4 -4
  62. package/dist/cjs/pds-chip.cjs.entry.js +4 -4
  63. package/dist/cjs/pds-combobox.cjs.entry.js +187 -28
  64. package/dist/cjs/pds-container.cjs.entry.js +3 -3
  65. package/dist/cjs/pds-copytext.cjs.entry.js +5 -5
  66. package/dist/cjs/pds-datepicker.cjs.entry.js +5 -5
  67. package/dist/cjs/pds-divider.cjs.entry.js +3 -3
  68. package/dist/cjs/pds-drawer-content.cjs.entry.js +3 -3
  69. package/dist/cjs/pds-drawer-footer.cjs.entry.js +3 -3
  70. package/dist/cjs/pds-drawer-header.cjs.entry.js +3 -3
  71. package/dist/cjs/pds-drawer.cjs.entry.js +25 -12
  72. package/dist/cjs/pds-dropdown-menu-item.cjs.entry.js +3 -3
  73. package/dist/cjs/pds-dropdown-menu-separator.cjs.entry.js +3 -3
  74. package/dist/cjs/pds-dropdown-menu.cjs.entry.js +24 -12
  75. package/dist/cjs/pds-filter.cjs.entry.js +4 -4
  76. package/dist/cjs/pds-filters.cjs.entry.js +3 -3
  77. package/dist/cjs/pds-icon.cjs.entry.js +27 -4
  78. package/dist/cjs/pds-image.cjs.entry.js +4 -4
  79. package/dist/cjs/pds-input.cjs.entry.js +6 -6
  80. package/dist/cjs/pds-link.cjs.entry.js +5 -5
  81. package/dist/cjs/pds-loader.cjs.entry.js +4 -4
  82. package/dist/cjs/pds-modal-content.cjs.entry.js +4 -4
  83. package/dist/cjs/pds-modal-footer.cjs.entry.js +3 -3
  84. package/dist/cjs/pds-modal-header.cjs.entry.js +3 -3
  85. package/dist/cjs/pds-modal.cjs.entry.js +118 -33
  86. package/dist/cjs/pds-multiselect.cjs.entry.js +9 -8
  87. package/dist/cjs/pds-popover.cjs.entry.js +227 -37
  88. package/dist/cjs/pds-progress.cjs.entry.js +4 -4
  89. package/dist/cjs/pds-property.cjs.entry.js +3 -3
  90. package/dist/cjs/pds-radio-group.cjs.entry.js +6 -6
  91. package/dist/cjs/pds-radio.cjs.entry.js +7 -7
  92. package/dist/cjs/pds-row.cjs.entry.js +4 -4
  93. package/dist/cjs/pds-select.cjs.entry.js +5 -5
  94. package/dist/cjs/pds-sortable-item.cjs.entry.js +5 -5
  95. package/dist/cjs/pds-sortable.cjs.entry.js +4 -4
  96. package/dist/cjs/pds-switch.cjs.entry.js +7 -7
  97. package/dist/cjs/pds-tab.cjs.entry.js +13 -2
  98. package/dist/cjs/pds-table-body.cjs.entry.js +3 -3
  99. package/dist/cjs/pds-table-cell.cjs.entry.js +4 -4
  100. package/dist/cjs/pds-table-head-cell.cjs.entry.js +5 -5
  101. package/dist/cjs/pds-table-head.cjs.entry.js +3 -3
  102. package/dist/cjs/pds-table-row.cjs.entry.js +3 -3
  103. package/dist/cjs/pds-table.cjs.entry.js +2 -2
  104. package/dist/cjs/pds-tabpanel.cjs.entry.js +15 -3
  105. package/dist/cjs/pds-tabs.cjs.entry.js +111 -7
  106. package/dist/cjs/pds-text.cjs.entry.js +3 -3
  107. package/dist/cjs/pds-textarea.cjs.entry.js +8 -8
  108. package/dist/cjs/pds-toast.cjs.entry.js +5 -5
  109. package/dist/cjs/pds-tooltip.cjs.entry.js +4 -4
  110. package/dist/cjs/pine-core.cjs.js +3 -3
  111. package/dist/collection/components/pds-combobox/grouped-options-panel.js +21 -3
  112. package/dist/collection/components/pds-combobox/pds-combobox.css +42 -13
  113. package/dist/collection/components/pds-combobox/pds-combobox.js +166 -23
  114. package/dist/collection/components/pds-combobox/stories/pds-combobox.stories.js +45 -0
  115. package/dist/collection/components/pds-container/pds-container.js +1 -1
  116. package/dist/collection/components/pds-copytext/pds-copytext.js +1 -1
  117. package/dist/collection/components/pds-datepicker/pds-datepicker.js +2 -2
  118. package/dist/collection/components/pds-divider/pds-divider.js +1 -1
  119. package/dist/collection/components/pds-drawer/pds-drawer-content/pds-drawer-content.js +1 -1
  120. package/dist/collection/components/pds-drawer/pds-drawer-footer/pds-drawer-footer.js +1 -1
  121. package/dist/collection/components/pds-drawer/pds-drawer-header/pds-drawer-header.js +1 -1
  122. package/dist/collection/components/pds-drawer/pds-drawer.css +4 -1
  123. package/dist/collection/components/pds-drawer/pds-drawer.js +54 -17
  124. package/dist/collection/components/pds-drawer/stories/pds-drawer.stories.js +6 -1
  125. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu-item/pds-dropdown-menu-item.js +1 -1
  126. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu-separator/pds-dropdown-menu-separator.js +1 -1
  127. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu.css +19 -5
  128. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu.js +30 -9
  129. package/dist/collection/components/pds-filters/pds-filter/pds-filter.js +1 -1
  130. package/dist/collection/components/pds-filters/pds-filters.js +1 -1
  131. package/dist/collection/components/pds-image/pds-image.js +2 -2
  132. package/dist/collection/components/pds-input/pds-input.js +2 -2
  133. package/dist/collection/components/pds-link/pds-link.js +2 -2
  134. package/dist/collection/components/pds-loader/pds-loader.js +1 -1
  135. package/dist/collection/components/pds-modal/pds-modal-content/pds-modal-content.js +2 -2
  136. package/dist/collection/components/pds-modal/pds-modal-footer/pds-modal-footer.js +1 -1
  137. package/dist/collection/components/pds-modal/pds-modal-header/pds-modal-header.js +1 -1
  138. package/dist/collection/components/pds-modal/pds-modal.js +117 -32
  139. package/dist/collection/components/pds-modal/test/mock-pds-modal.js +1 -1
  140. package/dist/collection/components/pds-multiselect/pds-multiselect.js +8 -7
  141. package/dist/collection/components/pds-popover/pds-popover.js +185 -35
  142. package/dist/collection/components/pds-progress/pds-progress.js +1 -1
  143. package/dist/collection/components/pds-property/pds-property.js +1 -1
  144. package/dist/collection/components/pds-radio/pds-radio.js +3 -3
  145. package/dist/collection/components/pds-radio-group/pds-radio-group.js +3 -3
  146. package/dist/collection/components/pds-row/pds-row.js +1 -1
  147. package/dist/collection/components/pds-select/pds-select.js +1 -1
  148. package/dist/collection/components/pds-sortable/pds-sortable-item/pds-sortable-item.js +1 -1
  149. package/dist/collection/components/pds-sortable/pds-sortable.js +1 -1
  150. package/dist/collection/components/pds-switch/pds-switch.js +3 -3
  151. package/dist/collection/components/pds-table/pds-table-body/pds-table-body.js +1 -1
  152. package/dist/collection/components/pds-table/pds-table-cell/pds-table-cell.js +2 -2
  153. package/dist/collection/components/pds-table/pds-table-head/pds-table-head.js +1 -1
  154. package/dist/collection/components/pds-table/pds-table-head-cell/pds-table-head-cell.js +2 -2
  155. package/dist/collection/components/pds-table/pds-table-row/pds-table-row.js +1 -1
  156. package/dist/collection/components/pds-tabs/pds-tab/pds-tab.js +11 -0
  157. package/dist/collection/components/pds-tabs/pds-tabpanel/pds-tabpanel.js +13 -1
  158. package/dist/collection/components/pds-tabs/pds-tabs.js +111 -7
  159. package/dist/collection/components/pds-text/pds-text.js +1 -1
  160. package/dist/collection/components/pds-textarea/pds-textarea.js +4 -4
  161. package/dist/collection/components/pds-toast/pds-toast.js +3 -3
  162. package/dist/collection/components/pds-tooltip/pds-tooltip.js +2 -2
  163. package/dist/collection/utils/attributes.js +18 -11
  164. package/dist/collection/utils/css.js +41 -0
  165. package/dist/collection/utils/keep-hydrated.js +133 -6
  166. package/dist/docs.json +56 -12
  167. package/dist/esm/{attributes-CF5K2pxn.js → attributes-WXw_I_uJ.js} +18 -11
  168. package/dist/esm/{index-DxI-61GK.js → index-BJXk71tO.js} +1 -1
  169. package/dist/esm/{index-2HMD-zUO.js → index-Cw9J31qd.js} +1 -1
  170. package/dist/esm/index.js +1 -1
  171. package/dist/esm/keep-hydrated-BLG6RDBt.js +190 -0
  172. package/dist/esm/loader.js +4 -4
  173. package/dist/esm/mock-pds-modal.entry.js +3 -3
  174. package/dist/esm/pds-accordion.entry.js +3 -3
  175. package/dist/esm/pds-alert.entry.js +2 -2
  176. package/dist/esm/pds-avatar.entry.js +3 -3
  177. package/dist/esm/pds-box.entry.js +3 -3
  178. package/dist/esm/pds-button.entry.js +3 -3
  179. package/dist/esm/pds-checkbox.entry.js +4 -4
  180. package/dist/esm/pds-chip.entry.js +4 -4
  181. package/dist/esm/pds-combobox.entry.js +187 -28
  182. package/dist/esm/pds-container.entry.js +3 -3
  183. package/dist/esm/pds-copytext.entry.js +5 -5
  184. package/dist/esm/pds-datepicker.entry.js +5 -5
  185. package/dist/esm/pds-divider.entry.js +3 -3
  186. package/dist/esm/pds-drawer-content.entry.js +3 -3
  187. package/dist/esm/pds-drawer-footer.entry.js +3 -3
  188. package/dist/esm/pds-drawer-header.entry.js +3 -3
  189. package/dist/esm/pds-drawer.entry.js +25 -12
  190. package/dist/esm/pds-dropdown-menu-item.entry.js +3 -3
  191. package/dist/esm/pds-dropdown-menu-separator.entry.js +3 -3
  192. package/dist/esm/pds-dropdown-menu.entry.js +24 -12
  193. package/dist/esm/pds-filter.entry.js +4 -4
  194. package/dist/esm/pds-filters.entry.js +3 -3
  195. package/dist/esm/pds-icon.entry.js +27 -4
  196. package/dist/esm/pds-image.entry.js +4 -4
  197. package/dist/esm/pds-input.entry.js +6 -6
  198. package/dist/esm/pds-link.entry.js +5 -5
  199. package/dist/esm/pds-loader.entry.js +4 -4
  200. package/dist/esm/pds-modal-content.entry.js +4 -4
  201. package/dist/esm/pds-modal-footer.entry.js +3 -3
  202. package/dist/esm/pds-modal-header.entry.js +3 -3
  203. package/dist/esm/pds-modal.entry.js +118 -33
  204. package/dist/esm/pds-multiselect.entry.js +9 -8
  205. package/dist/esm/pds-popover.entry.js +228 -38
  206. package/dist/esm/pds-progress.entry.js +4 -4
  207. package/dist/esm/pds-property.entry.js +3 -3
  208. package/dist/esm/pds-radio-group.entry.js +6 -6
  209. package/dist/esm/pds-radio.entry.js +7 -7
  210. package/dist/esm/pds-row.entry.js +4 -4
  211. package/dist/esm/pds-select.entry.js +5 -5
  212. package/dist/esm/pds-sortable-item.entry.js +5 -5
  213. package/dist/esm/pds-sortable.entry.js +4 -4
  214. package/dist/esm/pds-switch.entry.js +7 -7
  215. package/dist/esm/pds-tab.entry.js +13 -2
  216. package/dist/esm/pds-table-body.entry.js +3 -3
  217. package/dist/esm/pds-table-cell.entry.js +4 -4
  218. package/dist/esm/pds-table-head-cell.entry.js +5 -5
  219. package/dist/esm/pds-table-head.entry.js +3 -3
  220. package/dist/esm/pds-table-row.entry.js +3 -3
  221. package/dist/esm/pds-table.entry.js +2 -2
  222. package/dist/esm/pds-tabpanel.entry.js +15 -3
  223. package/dist/esm/pds-tabs.entry.js +111 -7
  224. package/dist/esm/pds-text.entry.js +3 -3
  225. package/dist/esm/pds-textarea.entry.js +8 -8
  226. package/dist/esm/pds-toast.entry.js +5 -5
  227. package/dist/esm/pds-tooltip.entry.js +4 -4
  228. package/dist/esm/pine-core.js +4 -4
  229. package/dist/esm-es5/attributes-WXw_I_uJ.js +1 -0
  230. package/dist/esm-es5/{index-2HMD-zUO.js → index-Cw9J31qd.js} +2 -2
  231. package/dist/esm-es5/index.js +1 -1
  232. package/dist/esm-es5/keep-hydrated-BLG6RDBt.js +1 -0
  233. package/dist/esm-es5/loader.js +1 -1
  234. package/dist/esm-es5/mock-pds-modal.entry.js +1 -1
  235. package/dist/esm-es5/pds-accordion.entry.js +1 -1
  236. package/dist/esm-es5/pds-alert.entry.js +1 -1
  237. package/dist/esm-es5/pds-avatar.entry.js +1 -1
  238. package/dist/esm-es5/pds-box.entry.js +1 -1
  239. package/dist/esm-es5/pds-button.entry.js +1 -1
  240. package/dist/esm-es5/pds-checkbox.entry.js +1 -1
  241. package/dist/esm-es5/pds-chip.entry.js +1 -1
  242. package/dist/esm-es5/pds-combobox.entry.js +2 -2
  243. package/dist/esm-es5/pds-container.entry.js +1 -1
  244. package/dist/esm-es5/pds-copytext.entry.js +1 -1
  245. package/dist/esm-es5/pds-datepicker.entry.js +1 -1
  246. package/dist/esm-es5/pds-divider.entry.js +1 -1
  247. package/dist/esm-es5/pds-drawer-content.entry.js +1 -1
  248. package/dist/esm-es5/pds-drawer-footer.entry.js +1 -1
  249. package/dist/esm-es5/pds-drawer-header.entry.js +1 -1
  250. package/dist/esm-es5/pds-drawer.entry.js +1 -1
  251. package/dist/esm-es5/pds-dropdown-menu-item.entry.js +1 -1
  252. package/dist/esm-es5/pds-dropdown-menu-separator.entry.js +1 -1
  253. package/dist/esm-es5/pds-dropdown-menu.entry.js +1 -1
  254. package/dist/esm-es5/pds-filter.entry.js +1 -1
  255. package/dist/esm-es5/pds-filters.entry.js +1 -1
  256. package/dist/esm-es5/pds-icon.entry.js +1 -1
  257. package/dist/esm-es5/pds-image.entry.js +1 -1
  258. package/dist/esm-es5/pds-input.entry.js +1 -1
  259. package/dist/esm-es5/pds-link.entry.js +1 -1
  260. package/dist/esm-es5/pds-loader.entry.js +1 -1
  261. package/dist/esm-es5/pds-modal-content.entry.js +1 -1
  262. package/dist/esm-es5/pds-modal-footer.entry.js +1 -1
  263. package/dist/esm-es5/pds-modal-header.entry.js +1 -1
  264. package/dist/esm-es5/pds-modal.entry.js +1 -1
  265. package/dist/esm-es5/pds-multiselect.entry.js +1 -1
  266. package/dist/esm-es5/pds-popover.entry.js +1 -1
  267. package/dist/esm-es5/pds-progress.entry.js +1 -1
  268. package/dist/esm-es5/pds-property.entry.js +1 -1
  269. package/dist/esm-es5/pds-radio-group.entry.js +1 -1
  270. package/dist/esm-es5/pds-radio.entry.js +1 -1
  271. package/dist/esm-es5/pds-row.entry.js +1 -1
  272. package/dist/esm-es5/pds-select.entry.js +1 -1
  273. package/dist/esm-es5/pds-sortable-item.entry.js +1 -1
  274. package/dist/esm-es5/pds-sortable.entry.js +2 -2
  275. package/dist/esm-es5/pds-switch.entry.js +1 -1
  276. package/dist/esm-es5/pds-tab.entry.js +1 -1
  277. package/dist/esm-es5/pds-table-body.entry.js +1 -1
  278. package/dist/esm-es5/pds-table-cell.entry.js +1 -1
  279. package/dist/esm-es5/pds-table-head-cell.entry.js +1 -1
  280. package/dist/esm-es5/pds-table-head.entry.js +1 -1
  281. package/dist/esm-es5/pds-table-row.entry.js +1 -1
  282. package/dist/esm-es5/pds-table.entry.js +1 -1
  283. package/dist/esm-es5/pds-tabpanel.entry.js +1 -1
  284. package/dist/esm-es5/pds-tabs.entry.js +1 -1
  285. package/dist/esm-es5/pds-text.entry.js +1 -1
  286. package/dist/esm-es5/pds-textarea.entry.js +1 -1
  287. package/dist/esm-es5/pds-toast.entry.js +1 -1
  288. package/dist/esm-es5/pds-tooltip.entry.js +1 -1
  289. package/dist/esm-es5/pine-core.js +1 -1
  290. package/dist/pine-core/index.esm.js +1 -1
  291. package/dist/pine-core/{p-9a7ee7cb.system.entry.js → p-0092444c.system.entry.js} +1 -1
  292. package/dist/pine-core/{p-d576e542.system.entry.js → p-01aa382c.system.entry.js} +1 -1
  293. package/dist/pine-core/{p-d69cfaa4.entry.js → p-02088776.entry.js} +1 -1
  294. package/dist/pine-core/p-049f126a.entry.js +1 -0
  295. package/dist/pine-core/{p-8b9d8fb5.system.entry.js → p-080cb087.system.entry.js} +1 -1
  296. package/dist/pine-core/{p-99317375.system.entry.js → p-0913f696.system.entry.js} +1 -1
  297. package/dist/pine-core/{p-5737182f.entry.js → p-0a84d220.entry.js} +1 -1
  298. package/dist/pine-core/{p-4c9cccdb.system.entry.js → p-0b71ecb6.system.entry.js} +2 -2
  299. package/dist/pine-core/{p-37d73369.system.entry.js → p-1437585e.system.entry.js} +1 -1
  300. package/dist/pine-core/p-153ba77b.entry.js +1 -0
  301. package/dist/pine-core/{p-22f041ee.system.entry.js → p-1ee86d87.system.entry.js} +1 -1
  302. package/dist/pine-core/{p-5decd81f.entry.js → p-208c7dbf.entry.js} +1 -1
  303. package/dist/pine-core/p-21fe6ee1.system.entry.js +1 -0
  304. package/dist/pine-core/p-24fbbb74.system.entry.js +1 -0
  305. package/dist/pine-core/{p-51dff046.system.entry.js → p-258770cf.system.entry.js} +1 -1
  306. package/dist/pine-core/{p-1f2e5958.entry.js → p-258d5e83.entry.js} +1 -1
  307. package/dist/pine-core/{p-4e05a4f0.entry.js → p-26642718.entry.js} +1 -1
  308. package/dist/pine-core/{p-1b13f69c.system.entry.js → p-2ac2457b.system.entry.js} +1 -1
  309. package/dist/pine-core/p-2cb5483a.system.entry.js +1 -0
  310. package/dist/pine-core/{p-1f263c0b.system.entry.js → p-341c38f1.system.entry.js} +1 -1
  311. package/dist/pine-core/{p-bd7da23e.system.entry.js → p-3a959459.system.entry.js} +1 -1
  312. package/dist/pine-core/{p-1e464117.entry.js → p-432d5ec7.entry.js} +1 -1
  313. package/dist/pine-core/{p-0de74105.entry.js → p-4849fda7.entry.js} +1 -1
  314. package/dist/pine-core/{p-f30d6192.system.entry.js → p-4d03d1e2.system.entry.js} +1 -1
  315. package/dist/pine-core/{p-2cb02706.entry.js → p-4de8f333.entry.js} +1 -1
  316. package/dist/pine-core/{p-152245fa.system.entry.js → p-4f94b4f1.system.entry.js} +1 -1
  317. package/dist/pine-core/{p-66cfef6d.system.entry.js → p-4fa63723.system.entry.js} +1 -1
  318. package/dist/pine-core/p-4fd454f6.entry.js +1 -0
  319. package/dist/pine-core/{p-70c6f0ed.system.entry.js → p-5442d983.system.entry.js} +1 -1
  320. package/dist/pine-core/{p-8027db25.entry.js → p-550c2fd3.entry.js} +1 -1
  321. package/dist/pine-core/{p-7d01e719.entry.js → p-55224683.entry.js} +1 -1
  322. package/dist/pine-core/{p-65e30a4c.entry.js → p-57a2f927.entry.js} +1 -1
  323. package/dist/pine-core/{p-721297b5.system.entry.js → p-5870b092.system.entry.js} +1 -1
  324. package/dist/pine-core/p-5a10784e.system.entry.js +3 -0
  325. package/dist/pine-core/{p-6d83ad2d.system.entry.js → p-5c90091e.system.entry.js} +1 -1
  326. package/dist/pine-core/p-602c197f.entry.js +1 -0
  327. package/dist/pine-core/{p-45fcc5b7.entry.js → p-6bf853c9.entry.js} +1 -1
  328. package/dist/pine-core/{p-5d014059.entry.js → p-6d3610f9.entry.js} +1 -1
  329. package/dist/pine-core/{p-343546b1.system.entry.js → p-6eec23a7.system.entry.js} +1 -1
  330. package/dist/pine-core/{p-5132b8a1.entry.js → p-72865997.entry.js} +1 -1
  331. package/dist/pine-core/p-74a05bcc.entry.js +1 -0
  332. package/dist/pine-core/p-75ee0403.entry.js +1 -0
  333. package/dist/pine-core/p-77395d62.system.entry.js +1 -0
  334. package/dist/pine-core/p-7a287635.system.entry.js +1 -0
  335. package/dist/pine-core/p-7a5b21d2.system.entry.js +1 -0
  336. package/dist/pine-core/{p-a83a6618.system.entry.js → p-7bf6563a.system.entry.js} +1 -1
  337. package/dist/pine-core/{p-71e3a89e.system.entry.js → p-8191498f.system.entry.js} +1 -1
  338. package/dist/pine-core/{p-0166c620.entry.js → p-82cf4ec6.entry.js} +1 -1
  339. package/dist/pine-core/{p-16c2aa63.entry.js → p-84e9b7da.entry.js} +1 -1
  340. package/dist/pine-core/{p-bdf68e53.system.entry.js → p-86040cac.system.entry.js} +1 -1
  341. package/dist/pine-core/p-875b0436.system.entry.js +1 -0
  342. package/dist/pine-core/{p-87f91e02.system.entry.js → p-8c8cc079.system.entry.js} +1 -1
  343. package/dist/pine-core/{p-ba1b79c7.system.entry.js → p-8cc302aa.system.entry.js} +1 -1
  344. package/dist/pine-core/{p-5b7f7760.entry.js → p-8d292b48.entry.js} +1 -1
  345. package/dist/pine-core/{p-650ccffb.entry.js → p-8f531063.entry.js} +1 -1
  346. package/dist/pine-core/p-9109b90a.entry.js +1 -0
  347. package/dist/pine-core/p-92ae6082.entry.js +1 -0
  348. package/dist/pine-core/p-94593f20.system.entry.js +1 -0
  349. package/dist/pine-core/p-945fb0b1.entry.js +1 -0
  350. package/dist/pine-core/{p-04fe5da7.system.entry.js → p-9880d251.system.entry.js} +1 -1
  351. package/dist/pine-core/p-99459e27.entry.js +1 -0
  352. package/dist/pine-core/{p-9835c74b.entry.js → p-9ab95438.entry.js} +1 -1
  353. package/dist/pine-core/{p-a6d09102.system.entry.js → p-9af131d6.system.entry.js} +1 -1
  354. package/dist/pine-core/{p-59491f98.entry.js → p-9dcd2cdb.entry.js} +1 -1
  355. package/dist/pine-core/{p-c00e46a5.system.entry.js → p-9e0f920a.system.entry.js} +1 -1
  356. package/dist/pine-core/p-BGLP3keB.js +1 -0
  357. package/dist/pine-core/p-BLG6RDBt.js +1 -0
  358. package/dist/pine-core/p-BR5nujVX.system.js +1 -0
  359. package/dist/pine-core/{p-BJlg6wq7.system.js → p-CGRdQc49.system.js} +2 -2
  360. package/dist/pine-core/{p-DeIDZHrg.js → p-CmSJytt1.js} +2 -2
  361. package/dist/pine-core/p-CuSNnuFu.system.js +1 -0
  362. package/dist/pine-core/{p-YQa3CeL9.system.js → p-Cy8cvR7I.system.js} +1 -1
  363. package/dist/pine-core/p-XW4H0W6i.system.js +1 -0
  364. package/dist/pine-core/p-a0344e30.entry.js +2 -0
  365. package/dist/pine-core/p-a0960b3d.system.entry.js +1 -0
  366. package/dist/pine-core/p-a1230a74.system.entry.js +1 -0
  367. package/dist/pine-core/{p-fbea5703.entry.js → p-a19cd59c.entry.js} +1 -1
  368. package/dist/pine-core/p-a787b34a.system.entry.js +1 -0
  369. package/dist/pine-core/p-a826f290.entry.js +1 -0
  370. package/dist/pine-core/{p-1ec4eeaf.system.entry.js → p-a85a6ab9.system.entry.js} +1 -1
  371. package/dist/pine-core/p-acce8eb2.entry.js +1 -0
  372. package/dist/pine-core/p-b1548a20.entry.js +1 -0
  373. package/dist/pine-core/p-b60ac7eb.system.entry.js +1 -0
  374. package/dist/pine-core/{p-93877d4a.entry.js → p-b69f04b7.entry.js} +1 -1
  375. package/dist/pine-core/p-b75b0d09.system.entry.js +1 -0
  376. package/dist/pine-core/{p-02857936.entry.js → p-b8e8a4ce.entry.js} +1 -1
  377. package/dist/pine-core/{p-622e91e3.entry.js → p-b914dde8.entry.js} +2 -2
  378. package/dist/pine-core/{p-5bc670be.system.entry.js → p-ba1f65c2.system.entry.js} +1 -1
  379. package/dist/pine-core/p-bb68431a.entry.js +1 -0
  380. package/dist/pine-core/{p-c8e89b61.system.entry.js → p-bd67156b.system.entry.js} +1 -1
  381. package/dist/pine-core/{p-db4319fd.entry.js → p-beb23781.entry.js} +1 -1
  382. package/dist/pine-core/p-bf30dec0.entry.js +1 -0
  383. package/dist/pine-core/p-bf5887e8.system.entry.js +1 -0
  384. package/dist/pine-core/{p-91f712f4.system.entry.js → p-bf7ee3b7.system.entry.js} +1 -1
  385. package/dist/pine-core/{p-b5838211.system.entry.js → p-c5c9ed36.system.entry.js} +1 -1
  386. package/dist/pine-core/{p-21115986.system.entry.js → p-cb6a3e4c.system.entry.js} +1 -1
  387. package/dist/pine-core/{p-1cf1fced.entry.js → p-cde8eb81.entry.js} +1 -1
  388. package/dist/pine-core/{p-1d75a9b1.system.entry.js → p-cf08a6dd.system.entry.js} +1 -1
  389. package/dist/pine-core/p-cfd012d4.entry.js +1 -0
  390. package/dist/pine-core/{p-5e8d73d4.entry.js → p-d2c91e7a.entry.js} +1 -1
  391. package/dist/pine-core/{p-7bbfb965.system.entry.js → p-db17c626.system.entry.js} +1 -1
  392. package/dist/pine-core/p-e0917a26.entry.js +1 -0
  393. package/dist/pine-core/p-e21ff692.entry.js +1 -0
  394. package/dist/pine-core/p-e5420660.entry.js +1 -0
  395. package/dist/pine-core/{p-585832b1.entry.js → p-e800a2b1.entry.js} +1 -1
  396. package/dist/pine-core/{p-8b0fbeb3.entry.js → p-e836a041.entry.js} +1 -1
  397. package/dist/pine-core/{p-506d3e80.entry.js → p-e8cb76e8.entry.js} +1 -1
  398. package/dist/pine-core/p-ea4d4741.system.entry.js +1 -0
  399. package/dist/pine-core/{p-419f57c9.entry.js → p-eb5465ce.entry.js} +1 -1
  400. package/dist/pine-core/{p-63119d23.entry.js → p-ebd0bff2.entry.js} +1 -1
  401. package/dist/pine-core/p-f029b7da.system.entry.js +1 -0
  402. package/dist/pine-core/{p-e337f32c.system.entry.js → p-f0d24298.system.entry.js} +1 -1
  403. package/dist/pine-core/{p-9b9f66b7.entry.js → p-f1702281.entry.js} +1 -1
  404. package/dist/pine-core/{p-238e5171.system.entry.js → p-f25e4731.system.entry.js} +1 -1
  405. package/dist/pine-core/{p-37d95be9.entry.js → p-f2c253d8.entry.js} +1 -1
  406. package/dist/pine-core/{p-a22091c4.system.entry.js → p-f77905aa.system.entry.js} +1 -1
  407. package/dist/pine-core/{p-bef04e15.system.entry.js → p-fc25b956.system.entry.js} +1 -1
  408. package/dist/pine-core/{p-f06ca8df.entry.js → p-ff3de72e.entry.js} +1 -1
  409. package/dist/pine-core/pine-core.esm.js +1 -1
  410. package/dist/pine-core/pine-core.js +1 -1
  411. package/dist/types/components/pds-combobox/combobox-interface.d.ts +8 -1
  412. package/dist/types/components/pds-combobox/grouped-options-panel.d.ts +7 -1
  413. package/dist/types/components/pds-combobox/pds-combobox.d.ts +32 -0
  414. package/dist/types/components/pds-drawer/pds-drawer.d.ts +21 -9
  415. package/dist/types/components/pds-dropdown-menu/pds-dropdown-menu.d.ts +5 -0
  416. package/dist/types/components/pds-modal/pds-modal.d.ts +10 -3
  417. package/dist/types/components/pds-multiselect/pds-multiselect.d.ts +2 -1
  418. package/dist/types/components/pds-popover/pds-popover.d.ts +31 -1
  419. package/dist/types/components/pds-tabs/pds-tab/pds-tab.d.ts +3 -0
  420. package/dist/types/components/pds-tabs/pds-tabpanel/pds-tabpanel.d.ts +3 -0
  421. package/dist/types/components/pds-tabs/pds-tabs.d.ts +14 -2
  422. package/dist/types/components.d.ts +50 -35
  423. package/dist/types/utils/attributes.d.ts +2 -2
  424. package/dist/types/utils/css.d.ts +7 -0
  425. package/dist/types/utils/keep-hydrated.d.ts +29 -2
  426. package/dist/vscode.html-data.json +13 -6
  427. package/hydrate/index.js +961 -213
  428. package/hydrate/index.mjs +961 -213
  429. package/package.json +2 -2
  430. package/dist/cjs/keep-hydrated-iLS88j1Z.js +0 -67
  431. package/dist/esm/keep-hydrated-Dv7ssOTc.js +0 -63
  432. package/dist/esm-es5/attributes-CF5K2pxn.js +0 -1
  433. package/dist/esm-es5/keep-hydrated-Dv7ssOTc.js +0 -1
  434. package/dist/pine-core/p-1cd0acf0.system.entry.js +0 -1
  435. package/dist/pine-core/p-207c94da.entry.js +0 -1
  436. package/dist/pine-core/p-2357758d.system.entry.js +0 -1
  437. package/dist/pine-core/p-281efc69.entry.js +0 -1
  438. package/dist/pine-core/p-2ac9e90a.system.entry.js +0 -1
  439. package/dist/pine-core/p-2f539379.system.entry.js +0 -3
  440. package/dist/pine-core/p-347ae53c.system.entry.js +0 -1
  441. package/dist/pine-core/p-34b575b6.entry.js +0 -2
  442. package/dist/pine-core/p-3b1d8fae.entry.js +0 -1
  443. package/dist/pine-core/p-4414d442.system.entry.js +0 -1
  444. package/dist/pine-core/p-4e67e68e.entry.js +0 -1
  445. package/dist/pine-core/p-539ef98c.entry.js +0 -1
  446. package/dist/pine-core/p-56576b6e.entry.js +0 -1
  447. package/dist/pine-core/p-5ac84b2f.entry.js +0 -1
  448. package/dist/pine-core/p-63854c10.system.entry.js +0 -1
  449. package/dist/pine-core/p-73bc6e9f.system.entry.js +0 -1
  450. package/dist/pine-core/p-798839f7.system.entry.js +0 -1
  451. package/dist/pine-core/p-7e115d33.system.entry.js +0 -1
  452. package/dist/pine-core/p-834c678e.system.entry.js +0 -1
  453. package/dist/pine-core/p-912487fa.entry.js +0 -1
  454. package/dist/pine-core/p-969488f5.system.entry.js +0 -1
  455. package/dist/pine-core/p-9bcdfac2.entry.js +0 -1
  456. package/dist/pine-core/p-9d33bb05.entry.js +0 -1
  457. package/dist/pine-core/p-BMFBF3sJ.system.js +0 -1
  458. package/dist/pine-core/p-D2MUS7JO.js +0 -1
  459. package/dist/pine-core/p-D2yHYrxQ.system.js +0 -1
  460. package/dist/pine-core/p-Dv7ssOTc.js +0 -1
  461. package/dist/pine-core/p-TyevV8iv.system.js +0 -1
  462. package/dist/pine-core/p-afd5e2d7.entry.js +0 -1
  463. package/dist/pine-core/p-bde53290.system.entry.js +0 -1
  464. package/dist/pine-core/p-bf1aea9f.system.entry.js +0 -1
  465. package/dist/pine-core/p-c9395f43.system.entry.js +0 -1
  466. package/dist/pine-core/p-d5dd5599.entry.js +0 -1
  467. package/dist/pine-core/p-dc81ffff.entry.js +0 -1
  468. package/dist/pine-core/p-e46f7541.system.entry.js +0 -1
  469. package/dist/pine-core/p-e7ba30dd.system.entry.js +0 -1
  470. package/dist/pine-core/p-ed3dd3d2.entry.js +0 -1
  471. package/dist/pine-core/p-eee4f146.entry.js +0 -1
  472. package/dist/pine-core/p-f01e35e2.entry.js +0 -1
  473. package/dist/pine-core/p-f2e0da9a.entry.js +0 -1
  474. package/dist/pine-core/p-fc6ac917.entry.js +0 -1
  475. package/dist/pine-core/p-ffe276ef.entry.js +0 -1
  476. /package/dist/esm-es5/{index-DxI-61GK.js → index-BJXk71tO.js} +0 -0
  477. /package/dist/pine-core/{p-DxI-61GK.js → p-BJXk71tO.js} +0 -0
  478. /package/dist/pine-core/{p-CnO10OxH.system.js → p-n3_ytl_p.system.js} +0 -0
package/hydrate/index.mjs CHANGED
@@ -150,6 +150,109 @@ const isStencilClass = (el, name) => {
150
150
  const classNamesOf = (classes) => typeof classes === 'string'
151
151
  ? classes.split(/\s+/).filter(Boolean)
152
152
  : Object.keys(classes).filter((name) => classes[name]);
153
+ // Each restore that writes something counts. A real strip costs one, but a script that undoes the
154
+ // restore as soon as it lands (from a MutationObserver) keeps both going forever, all in
155
+ // microtasks, so the page never renders or takes input. More writes than this before the next task
156
+ // means that kind of fight. A script that undoes it from a timer or animation frame gets a fresh
157
+ // budget each task; the page stays responsive then, so that fight isn't capped.
158
+ const MAX_RESTORES_PER_TASK = 5;
159
+ // Callbacks waiting for the next task, all run by one message. A MessageChannel message isn't slowed
160
+ // down like a timer is in a background tab (or frozen by test fake timers); a timer is the fallback
161
+ // where it's missing. One message for all of them, so a morph that strips many hosts doesn't open a
162
+ // channel for each.
163
+ const nextTaskCallbacks = new Set();
164
+ const runNextTaskCallbacks = () => {
165
+ const callbacks = Array.from(nextTaskCallbacks);
166
+ nextTaskCallbacks.clear();
167
+ callbacks.forEach((callback) => callback());
168
+ };
169
+ const onNextTask = (callback) => {
170
+ nextTaskCallbacks.add(callback);
171
+ if (nextTaskCallbacks.size > 1)
172
+ return;
173
+ if (typeof MessageChannel === 'undefined') {
174
+ setTimeout(runNextTaskCallbacks);
175
+ return;
176
+ }
177
+ const channel = new MessageChannel();
178
+ channel.port1.onmessage = () => {
179
+ channel.port1.close();
180
+ runNextTaskCallbacks();
181
+ };
182
+ channel.port2.postMessage(null);
183
+ };
184
+ /**
185
+ * The restore kind for a host's own classes, styles and attributes, shared by a component's own
186
+ * host restore and `keepPineHydrated`: one fight on a host's classes stops both, and warns once.
187
+ */
188
+ const HOST_RESTORE = 'host';
189
+ /**
190
+ * Remembers the Stencil classes an element has had, and returns all of them. A restore can't read
191
+ * them from the latest mutation alone: after a script's last strip they're gone from its old value
192
+ * too, and the next change would restore nothing.
193
+ */
194
+ const stencilClassesOf = (seen, el, oldValue) => {
195
+ [...classNamesOf(oldValue !== null && oldValue !== void 0 ? oldValue : ''), ...Array.from(el.classList)]
196
+ .filter((name) => isStencilClass(el, name))
197
+ .forEach((name) => seen.add(name));
198
+ return Array.from(seen);
199
+ };
200
+ // What each element has already been warned about, by kind of restore. A host with its own restore
201
+ // is also watched for its Stencil classes, so one fight on its classes stops both and needs one
202
+ // warning; a fight over a trigger's ARIA is a different kind, and warns on its own. On the global
203
+ // object, like `OBSERVER` below, so two copies of Pine on a page share it.
204
+ const WARNED = Symbol.for('@pine-ds/core/restoreWarnings');
205
+ const warnedKinds = () => {
206
+ var _a;
207
+ const store = globalThis;
208
+ return ((_a = store[WARNED]) !== null && _a !== void 0 ? _a : (store[WARNED] = new WeakMap()));
209
+ };
210
+ /** Whether `el` was already warned about for `kind`; records it if not. */
211
+ const alreadyWarned = (el, kind) => {
212
+ var _a;
213
+ const kinds = (_a = warnedKinds().get(el)) !== null && _a !== void 0 ? _a : new Set();
214
+ warnedKinds().set(el, kinds);
215
+ if (kinds.has(kind))
216
+ return true;
217
+ kinds.add(kind);
218
+ return false;
219
+ };
220
+ /**
221
+ * Wraps a restore callback, which returns whether it wrote anything, so that it writes at most
222
+ * `MAX_RESTORES_PER_TASK` times before the next task (until the message posted after its first write
223
+ * runs). Past that, another script is undoing every restore as soon as it lands, so it stops and
224
+ * lets that script win rather than hang the page. What that script left stays until something
225
+ * changes the element again: the count resets on the next task, so a later change is restored, but
226
+ * nothing is restored on its own. The first give-up warns, logging `el` so it can be found in
227
+ * devtools; later ones, and other restores of the same `kind` giving up on the same element, are
228
+ * silent.
229
+ * @param restore - Puts back what something removed; returns `true` if it wrote anything
230
+ * @param warning - What the console warning says was given up
231
+ * @param el - The element being restored, logged with the warning
232
+ * @param kind - What's being restored; one warning per element for each kind
233
+ */
234
+ const limitRestores = (restore, warning, el, kind = warning) => {
235
+ let writes = 0;
236
+ let warned = false;
237
+ return (...args) => {
238
+ if (writes >= MAX_RESTORES_PER_TASK) {
239
+ if (!warned) {
240
+ warned = true;
241
+ if (el && alreadyWarned(el, kind))
242
+ return;
243
+ // The warning as an argument, not the format string: it carries the tag name, which the HTML
244
+ // parser lets contain `%`.
245
+ console.warn('%s', warning, el);
246
+ }
247
+ return;
248
+ }
249
+ if (!restore(...args))
250
+ return;
251
+ if (writes === 0)
252
+ onNextTask(() => (writes = 0));
253
+ writes += 1;
254
+ };
255
+ };
153
256
  // On the global object, not in this module, so a page with two copies of Pine (the CDN build and a
154
257
  // bundled `@pine-ds/react`) still has one observer.
155
258
  const OBSERVER = Symbol.for('@pine-ds/core/keepPineHydrated');
@@ -160,8 +263,9 @@ const OBSERVER = Symbol.for('@pine-ds/core/keepPineHydrated');
160
263
  * host restore of their own. It only restores classes the element had, so it never runs ahead of
161
264
  * Stencil. It can't see inside shadow roots, which a morph doesn't reach either.
162
265
  *
163
- * A script that removes `hydrated` on purpose sees it come back, and one that removes it every time it
164
- * appears never settles: don't strip Pine's classes from a `MutationObserver`.
266
+ * A script that removes `hydrated` on purpose sees it come back. One that removes it every time it
267
+ * appears (from a `MutationObserver`, say) wins after a few rounds, and the component logs a console
268
+ * warning. The component then stays hidden, as that script left it, until its class changes again.
165
269
  *
166
270
  * Pine's global script calls this, so the CDN and `dist` builds get it on load. The custom-elements
167
271
  * build (`@pine-ds/core/components/*`, `@pine-ds/react`) has no global script: call it once yourself.
@@ -174,14 +278,37 @@ const keepPineHydrated = () => {
174
278
  const store = globalThis;
175
279
  if (store[OBSERVER])
176
280
  return;
281
+ // One capped restore per element, so a script fighting one component doesn't stop the others,
282
+ // and the Stencil classes each one has had.
283
+ const restores = new WeakMap();
284
+ const seen = new WeakMap();
285
+ const restoreFor = (el) => {
286
+ let restore = restores.get(el);
287
+ if (!restore) {
288
+ restore = limitRestores((names) => {
289
+ const missing = names.filter((name) => !el.classList.contains(name));
290
+ if (missing.length > 0)
291
+ el.classList.add(...missing);
292
+ return missing.length > 0;
293
+ }, `${el.localName}: stopped putting back its hydrated and scope classes, as another script keeps removing them.`, el, HOST_RESTORE);
294
+ restores.set(el, restore);
295
+ }
296
+ return restore;
297
+ };
177
298
  const observer = new MutationObserver((records) => {
178
299
  records.forEach(({ target, oldValue }) => {
179
300
  const el = target;
180
- if (oldValue == null || !el.localName.startsWith('pds-'))
301
+ if (!el.localName.startsWith('pds-'))
181
302
  return;
182
- const missing = classNamesOf(oldValue).filter((name) => isStencilClass(el, name) && !el.classList.contains(name));
183
- if (missing.length > 0)
184
- el.classList.add(...missing);
303
+ // No old value is a `class` being added. Stencil's first `hydrated` arrives that way, which
304
+ // needs nothing; for an element already seen, it's the class coming back after a removal.
305
+ if (oldValue == null && !seen.has(el))
306
+ return;
307
+ if (!seen.has(el))
308
+ seen.set(el, new Set());
309
+ const names = stencilClassesOf(seen.get(el), el, oldValue);
310
+ if (names.length > 0)
311
+ restoreFor(el)(names);
185
312
  });
186
313
  });
187
314
  // The document rather than its root element, so replacing `<html>` doesn't end the watch.
@@ -5603,7 +5730,7 @@ class MockPdsModal {
5603
5730
  'pds-modal__backdrop': true,
5604
5731
  'open': this.open,
5605
5732
  };
5606
- return (hAsync("div", { key: '1211583aae06cfa7726371ba18796d7704d9e468', class: backdropClasses }, hAsync("div", { key: '8376a213a21b8f5ee78b9e58e2265d27ce957307', class: modalClasses, role: "dialog", "aria-modal": "true", "aria-labelledby": this.componentId ? `${this.componentId}-heading` : null, part: "modal" }, hAsync("div", { key: '4dfcad52e69fa2f207ed09c3ee3a225a1d789e71', class: "pds-modal__header" }, hAsync("slot", { key: '8d9710b91f6f83bc20b2f93b9e4e9fa5f59ae2ce', name: "header" })), hAsync("div", { key: 'f3291bf921619eabb6d63aa80e006f94239325fc', class: "pds-modal-content" }, hAsync("slot", { key: '19dca53455f9943e394d8ed9ea722a1a591e5de6' })), hAsync("div", { key: '835caa9692b1109649edc7d4daf308bb10ed0cd9', class: "pds-modal__footer" }, hAsync("slot", { key: 'f30033b8f842923df9780b893d05428dc14452dc', name: "footer" })))));
5733
+ return (hAsync("div", { key: '3a526f6883d7e7df35985a145962f656621535c1', class: backdropClasses }, hAsync("div", { key: '3af0487dc8c8831903cd7c22ffbf3e708b067ad7', class: modalClasses, role: "dialog", "aria-modal": "true", "aria-labelledby": this.componentId ? `${this.componentId}-heading` : null, part: "modal" }, hAsync("div", { key: '94e6205042ee91dac0823901cc97b79e93a515f2', class: "pds-modal__header" }, hAsync("slot", { key: 'ca04b575ccceabd431e3f5c57189f17f9aae6089', name: "header" })), hAsync("div", { key: 'f8327a261e70b622add1dd4ee21b5f8e8d91e603', class: "pds-modal-content" }, hAsync("slot", { key: 'a1a9c30d0f5479b0004ace4544e3d96ae87465be' })), hAsync("div", { key: 'af5fa59922047eeec7cbf0a0e1ee4b472b16079c', class: "pds-modal__footer" }, hAsync("slot", { key: '3c469bf94bb3a26dfd8046a5eda481f9d55edca1', name: "footer" })))));
5607
5734
  }
5608
5735
  get el() { return getElement(this); }
5609
5736
  static get style() { return pdsModalCss$1(); }
@@ -5625,7 +5752,7 @@ class MockPdsModal {
5625
5752
  }; }
5626
5753
  }
5627
5754
 
5628
- /* pds-icons v10.5.1, ES Modules */
5755
+ /* pds-icons v10.6.0, ES Modules */
5629
5756
 
5630
5757
  const addCircle = "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='pdsicon'><path fill-rule='evenodd' d='M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12m11-5a1 1 0 0 1 1 1v3h3a1 1 0 1 1 0 2h-3v3a1 1 0 1 1-2 0v-3H8a1 1 0 1 1 0-2h3V8a1 1 0 0 1 1-1'/></svg>";
5631
5758
  const calendarSimple = "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='pdsicon'><path fill-rule='evenodd' d='M8 1a1 1 0 0 1 1 1v1h6V2a1 1 0 1 1 2 0v1.002c.476.003.891.013 1.252.042.562.046 1.079.145 1.564.392a4 4 0 0 1 1.748 1.748c.247.485.346 1.002.392 1.564C22 7.29 22 7.954 22 8.758v8.483c0 .805 0 1.47-.044 2.01-.046.563-.145 1.08-.392 1.565a4 4 0 0 1-1.748 1.748c-.485.247-1.002.346-1.564.392-.541.044-1.206.044-2.01.044H7.758c-.805 0-1.47 0-2.01-.044-.563-.046-1.08-.145-1.565-.392a4 4 0 0 1-1.748-1.748c-.247-.485-.346-1.002-.392-1.564C2 18.71 2 18.046 2 17.242V8.758c0-.805 0-1.47.044-2.01.046-.563.145-1.08.392-1.565a4 4 0 0 1 1.748-1.748c.485-.247 1.002-.346 1.564-.392.361-.03.777-.04 1.252-.042V2a1 1 0 0 1 1-1M7 5.002c-.446.003-.795.012-1.089.036-.438.035-.663.1-.819.18a2 2 0 0 0-.874.874c-.08.156-.145.38-.18.819C4 7.361 4 7.943 4 8.8V9h16v-.2c0-.857 0-1.439-.038-1.889-.035-.438-.1-.663-.18-.819a2 2 0 0 0-.874-.874c-.156-.08-.38-.145-.819-.18A15 15 0 0 0 17 5.002V6a1 1 0 1 1-2 0V5H9v1a1 1 0 1 1-2 0zM20 11H4v6.2c0 .857 0 1.439.038 1.889.035.438.1.663.18.819a2 2 0 0 0 .874.874c.156.08.38.145.819.18C6.361 21 6.943 21 7.8 21h8.4c.857 0 1.439 0 1.889-.038.438-.035.663-.1.819-.18a2 2 0 0 0 .874-.874c.08-.156.145-.38.18-.819.037-.45.038-1.032.038-1.889z'/></svg>";
@@ -6070,7 +6197,7 @@ const debounce = (func, wait = 0) => {
6070
6197
  * @param options.semanticMap - Optional mapping of semantic names to CSS variables
6071
6198
  * @returns Normalized color value or undefined for invalid inputs
6072
6199
  */
6073
- const normalizeColorValue = (value, options) => {
6200
+ const normalizeColorValue$1 = (value, options) => {
6074
6201
  if (!value)
6075
6202
  return undefined;
6076
6203
  const trimmed = value.trim();
@@ -6114,7 +6241,7 @@ const setColor = (color, customColors) => {
6114
6241
  // Merge defaults with any custom overrides so defaults are preserved
6115
6242
  const semanticMap = Object.assign(Object.assign({}, defaultColors), (customColors || {}));
6116
6243
  // Use the shared normalizer so components accept semantic names, raw tokens, var(...), or literals
6117
- const resolved = normalizeColorValue(color, { semanticMap });
6244
+ const resolved = normalizeColorValue$1(color, { semanticMap });
6118
6245
  // Ensure we never return an undefined style value; if unresolved, omit the property
6119
6246
  if (!resolved)
6120
6247
  return {};
@@ -6130,10 +6257,14 @@ const setColor = (color, customColors) => {
6130
6257
  * @param attributes - Attribute names and the values they should have
6131
6258
  */
6132
6259
  const setAttributesIfChanged = (el, attributes) => {
6260
+ let wrote = false;
6133
6261
  Object.entries(attributes).forEach(([name, value]) => {
6134
- if (el.getAttribute(name) !== value)
6262
+ if (el.getAttribute(name) !== value) {
6135
6263
  el.setAttribute(name, value);
6264
+ wrote = true;
6265
+ }
6136
6266
  });
6267
+ return wrote;
6137
6268
  };
6138
6269
  /**
6139
6270
  * Puts back any of `expected`'s classes or style properties that are missing from `el`. It only
@@ -6146,10 +6277,9 @@ const restoreHostStyling = (el, { classes, styles }) => {
6146
6277
  const missing = classes.filter((name) => !el.classList.contains(name));
6147
6278
  if (missing.length > 0)
6148
6279
  el.classList.add(...missing);
6149
- Object.entries(styles).forEach(([name, value]) => {
6150
- if (value && el.style.getPropertyValue(name) === '')
6151
- el.style.setProperty(name, value);
6152
- });
6280
+ const missingStyles = Object.entries(styles).filter(([name, value]) => value && el.style.getPropertyValue(name) === '');
6281
+ missingStyles.forEach(([name, value]) => el.style.setProperty(name, value));
6282
+ return missing.length > 0 || missingStyles.length > 0;
6153
6283
  };
6154
6284
  /**
6155
6285
  * Watches a component's own host and puts back what it rendered when something strips it. A DOM
@@ -6166,16 +6296,18 @@ const restoreHostStyling = (el, { classes, styles }) => {
6166
6296
  const keepHostStyling = (el, expected) => {
6167
6297
  if (typeof MutationObserver === 'undefined')
6168
6298
  return null;
6169
- const observer = new MutationObserver((records) => {
6299
+ const tag = el.tagName.toLowerCase();
6300
+ const seenStencilClasses = new Set();
6301
+ const observer = new MutationObserver(limitRestores((records) => {
6170
6302
  const styling = expected();
6171
6303
  // A strip takes Stencil's own classes too: without `hydrated` Stencil hides the component, and
6172
6304
  // without its scope classes a scoped component's CSS stops matching. Put back only the ones that
6173
6305
  // were there, so this never runs ahead of Stencil. `keepPineHydrated` does the same for every
6174
6306
  // component, but the custom-elements build only runs it if the consumer calls it, so keep this.
6175
6307
  const stencilClasses = records
6176
- .filter((record) => record.attributeName === 'class' && record.oldValue != null)
6177
- .flatMap((record) => classNamesOf(record.oldValue).filter((name) => isStencilClass(el, name)));
6178
- restoreHostStyling(el, Object.assign(Object.assign({}, styling), { classes: [...styling.classes, ...stencilClasses] }));
6308
+ .filter((record) => record.attributeName === 'class')
6309
+ .flatMap((record) => stencilClassesOf(seenStencilClasses, el, record.oldValue));
6310
+ let wrote = restoreHostStyling(el, Object.assign(Object.assign({}, styling), { classes: [...styling.classes, ...stencilClasses] }));
6179
6311
  // An attribute the component still renders comes back with the value it had, which is what
6180
6312
  // Stencil wrote (a boolean `true` lands as an empty value). One it stopped rendering stays
6181
6313
  // removed, since that was Stencil's own write.
@@ -6185,8 +6317,10 @@ const keepHostStyling = (el, expected) => {
6185
6317
  if (oldValue == null || rendered == null || rendered === false || el.hasAttribute(name))
6186
6318
  return;
6187
6319
  el.setAttribute(name, oldValue);
6320
+ wrote = true;
6188
6321
  });
6189
- });
6322
+ return wrote;
6323
+ }, `${tag}: stopped restoring its host, as another script keeps changing it. Use props instead.`, el, HOST_RESTORE));
6190
6324
  observer.observe(el, { attributes: true, attributeOldValue: true });
6191
6325
  return observer;
6192
6326
  };
@@ -6444,8 +6578,8 @@ class PdsBox {
6444
6578
  this.sizeXl == undefined ? 'pds-box' : ''}
6445
6579
  `;
6446
6580
  // Normalize so pds-box accepts --token, var(--token), or literals (no semantic names)
6447
- const normalizedBackground = normalizeColorValue(this.backgroundColor);
6448
- const normalizedBorder = normalizeColorValue(this.borderColor);
6581
+ const normalizedBackground = normalizeColorValue$1(this.backgroundColor);
6582
+ const normalizedBorder = normalizeColorValue$1(this.borderColor);
6449
6583
  const boxInlineStyles = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (normalizedBackground && { '--color-background-box': normalizedBackground })), (normalizedBorder && { '--color-border-box': normalizedBorder })), (this.minHeight && { '--sizing-min-height-box': this.minHeight })), (this.minWidth && { '--sizing-min-width-box': this.minWidth })), (this.flex && !['none', 'grow', 'shrink'].includes(this.flex) && { 'flex': this.flex }));
6450
6584
  this.hostKeeper.record(boxClasses, boxInlineStyles);
6451
6585
  return (hAsync(Host, { key: 'dc4d939daf38b24ecbfa0eb0a95ab67b97a85665', class: boxClasses, style: boxInlineStyles }));
@@ -9233,11 +9367,11 @@ class PdsChip {
9233
9367
  }
9234
9368
  // Custom properties rather than inline colors on the dot/icon, so a
9235
9369
  // consumer's ::part(dot) or ::part(icon) rule still wins over the prop.
9236
- const dotColor = normalizeColorValue(this.dotColor, { semanticMap: SENTIMENT_DOT_COLORS });
9370
+ const dotColor = normalizeColorValue$1(this.dotColor, { semanticMap: SENTIMENT_DOT_COLORS });
9237
9371
  if (dotColor !== undefined) {
9238
9372
  styles['--pds-chip-dot-color'] = dotColor;
9239
9373
  }
9240
- const iconColor = normalizeColorValue(this.iconColor, { semanticMap: SENTIMENT_DOT_COLORS });
9374
+ const iconColor = normalizeColorValue$1(this.iconColor, { semanticMap: SENTIMENT_DOT_COLORS });
9241
9375
  if (iconColor !== undefined) {
9242
9376
  styles['--pds-chip-icon-color'] = iconColor;
9243
9377
  }
@@ -10734,7 +10868,14 @@ const PINE_ICON_NAME$1 = /^[a-z0-9-]+$/i;
10734
10868
  * only ever passed to `pds-icon` as `name`.
10735
10869
  */
10736
10870
  function groupIconOf(optgroup) {
10737
- const icon = optgroup.getAttribute('data-icon');
10871
+ return iconOf(optgroup);
10872
+ }
10873
+ /** An option's `data-icon` when it's a Pine icon name, or null; the same check as a group's. */
10874
+ function optionIconOf(option) {
10875
+ return iconOf(option);
10876
+ }
10877
+ function iconOf(element) {
10878
+ const icon = element.getAttribute('data-icon');
10738
10879
  return icon !== null && PINE_ICON_NAME$1.test(icon) ? icon : null;
10739
10880
  }
10740
10881
  /** An option is disabled by its own `disabled` or its optgroup's, as in a native select. */
@@ -10752,8 +10893,12 @@ function isGroupDisabled(group) {
10752
10893
  * Groups the combobox's filtered items for the panel: each optgroup becomes one entry holding its
10753
10894
  * options, and ungrouped options stay where they are. Indexes count options in list order, the
10754
10895
  * same as the inline listbox, so `data-option-index` means the same thing in every mode.
10896
+ *
10897
+ * `position`, when given, orders the entries instead: an ungrouped option or an optgroup it knows
10898
+ * goes where it reports, and the rest keep their place after those. Options from the `options` prop
10899
+ * use it, so a row the data lists between two groups is drawn between them.
10755
10900
  */
10756
- function buildPanelEntries(items) {
10901
+ function buildPanelEntries(items, position) {
10757
10902
  const entries = [];
10758
10903
  const groups = new Map();
10759
10904
  let index = 0;
@@ -10775,7 +10920,14 @@ function buildPanelEntries(items) {
10775
10920
  entries.push({ kind: 'option', option, index: index++ });
10776
10921
  }
10777
10922
  });
10778
- return entries;
10923
+ if (position === undefined)
10924
+ return entries;
10925
+ const at = (entry) => { var _a; return (_a = position(entry.kind === 'group' ? entry.group.optgroup : entry.option)) !== null && _a !== void 0 ? _a : Infinity; };
10926
+ // Array.prototype.sort is stable, so entries with no position keep their order.
10927
+ return entries.sort((a, b) => {
10928
+ const [first, second] = [at(a), at(b)];
10929
+ return first === second ? 0 : first < second ? -1 : 1;
10930
+ });
10779
10931
  }
10780
10932
  /** The label of the optgroup an option sits in, or null for an ungrouped option. */
10781
10933
  function groupLabelOf(option) {
@@ -10983,7 +11135,7 @@ class FlyoutController {
10983
11135
  }
10984
11136
  }
10985
11137
 
10986
- const pdsComboboxCss = () => `:host{display:block}:host([aria-disabled=true]) .pds-combobox__input-icon{color:var(--pine-color-text-disabled);pointer-events:none}.pds-combobox{position:relative}.pds-combobox__label{color:var(--pine-color-text-label);display:block;font:var(--pine-typography-body-medium);letter-spacing:var(--pine-letter-spacing);-webkit-margin-after:var(--pine-dimension-2xs);margin-block-end:var(--pine-dimension-2xs)}.pds-combobox__input-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;position:relative;width:100%}.pds-combobox__input{background:var(--pine-color-background-container);border:var(--pine-border);border-radius:var(--pine-dimension-125);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--pine-color-text-strong);-ms-flex:1;flex:1;font:var(--pine-typography-body-medium);padding:var(--pine-dimension-xs) var(--pine-dimension-450) var(--pine-dimension-xs) var(--pine-dimension-150);-webkit-transition:border-color var(--pine-motion-duration-base) ease;transition:border-color var(--pine-motion-duration-base) ease;width:100%}.pds-combobox__input:hover:not(:disabled){border-color:var(--pine-color-border-hover)}.pds-combobox__input:disabled{background:var(--pine-color-background-container-disabled);border-color:var(--pine-color-border-disabled);color:var(--pine-color-text-disabled);cursor:not-allowed}.pds-combobox__input:disabled::-webkit-input-placeholder{color:var(--pine-color-text-placeholder-disabled)}.pds-combobox__input:disabled::-moz-placeholder{color:var(--pine-color-text-placeholder-disabled)}.pds-combobox__input:disabled:-ms-input-placeholder{color:var(--pine-color-text-placeholder-disabled)}.pds-combobox__input:disabled::-ms-input-placeholder{color:var(--pine-color-text-placeholder-disabled)}.pds-combobox__input:disabled::placeholder{color:var(--pine-color-text-placeholder-disabled)}.pds-combobox__input:focus-visible{border-color:var(--pine-color-border-active);outline:var(--pine-outline-focus);outline-offset:var(--pine-border-width)}.pds-combobox__input::-webkit-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__input::-moz-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__input:-ms-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__input::-ms-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__input::placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__input.pds-combobox__input--invalid{background:var(--pine-color-red-050);border-color:var(--pine-color-border-danger)}:host-context([data-theme=dark]) .pds-combobox__input.pds-combobox__input--invalid{background:var(--pine-color-red-950)}.pds-combobox__input.pds-combobox__input--invalid:hover:not(:disabled){border-color:var(--pine-color-border-danger)}.pds-combobox__input.pds-combobox__input--invalid:focus-visible{outline-color:var(--pine-color-focus-ring-danger)}.pds-combobox__input-icon{color:var(--pine-color-text-secondary);inset-inline-end:var(--pine-dimension-150);pointer-events:none;position:absolute;z-index:calc(var(--pine-z-index-raised) - 1)}.pds-combobox__helper{color:var(--pine-color-text-message);font:var(--pine-typography-body-sm-medium);-webkit-margin-before:var(--pine-dimension-2xs);margin-block-start:var(--pine-dimension-2xs)}.pds-combobox__error{-ms-flex-align:start;align-items:flex-start;color:var(--pine-color-text-message-danger);display:-ms-flexbox;display:flex;font:var(--pine-typography-body-sm-medium);gap:var(--pine-dimension-2xs);-webkit-margin-before:var(--pine-dimension-2xs);margin-block-start:var(--pine-dimension-2xs)}.pds-combobox__error pds-icon{-ms-flex-negative:0;flex-shrink:0;-webkit-margin-before:var(--pine-dimension-025);margin-block-start:var(--pine-dimension-025)}.pds-combobox__listbox{background:var(--pine-color-background-overlay);border:0;border-radius:var(--pine-dimension-125);-webkit-box-shadow:var(--pine-box-shadow);box-shadow:var(--pine-box-shadow);list-style:none;margin:0;min-width:220px;overflow-y:auto;padding:var(--pine-dimension-xs);position:absolute;z-index:var(--pine-z-index-raised)}.pds-combobox__option{-ms-flex-align:center;align-items:center;background:transparent;border-radius:var(--pine-dimension-125);color:var(--pine-color-text-secondary);cursor:pointer;display:-ms-flexbox;display:flex;font:var(--pine-typography-body-medium);-ms-flex-pack:justify;justify-content:space-between;padding:var(--pine-dimension-xs) var(--pine-dimension-sm);position:relative;-webkit-transition:background 0.15s;transition:background 0.15s}.pds-combobox__option[aria-selected=true]{background:var(--pine-color-background-muted)}.pds-combobox__option:focus-visible{outline:0}.pds-combobox__option.pds-combobox__option--layout .pds-combobox__option-layout-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;width:100%}.pds-combobox__option.pds-combobox__option--chip .pds-combobox__option-chip{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;width:100%}.pds-combobox__option:last-child{-webkit-margin-after:0;margin-block-end:0}.pds-combobox__option--highlighted,.pds-combobox__option[selected],.pds-combobox__option--selected{background:var(--pine-color-background-muted)}.pds-combobox__option--disabled,.pds-combobox__group-row--disabled>.pds-combobox__group-row-trigger,.pds-combobox__group-back--disabled>.pds-combobox__group-back-trigger,.pds-combobox__group--disabled>.pds-combobox__group-label{color:var(--pine-color-text-disabled)}.pds-combobox__option--disabled{cursor:not-allowed}.pds-combobox__option--disabled .pds-combobox__option-chip,.pds-combobox__option--disabled .pds-combobox__option-layout-wrapper{opacity:0.5}.pds-combobox__option-check{color:currentColor;font-size:var(--pine-dimension-150);-webkit-margin-start:var(--pine-dimension-150);margin-inline-start:var(--pine-dimension-150)}.pds-combobox__group-label{color:var(--pine-color-text-tertiary);cursor:default;font:var(--pine-typography-heading-caption);-webkit-margin-after:var(--pine-dimension-2xs);margin-block-end:var(--pine-dimension-2xs);-webkit-margin-before:var(--pine-dimension-150);margin-block-start:var(--pine-dimension-150);padding:var(--pine-dimension-2xs) var(--pine-dimension-sm);text-transform:uppercase}.pds-combobox__group-label:first-child{-webkit-margin-before:0;margin-block-start:0}.pds-combobox__group{list-style:none;-webkit-margin-before:var(--pine-dimension-150);margin-block-start:var(--pine-dimension-150)}.pds-combobox__group:first-child{-webkit-margin-before:0;margin-block-start:0}.pds-combobox__group-list{list-style:none;margin:0;padding:0}.pds-combobox__listbox--grouped .pds-combobox__group-list{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:var(--pine-dimension-2xs)}.pds-combobox__group-label--with-icon{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;gap:var(--pine-dimension-xs)}.pds-combobox__group-icon{-ms-flex-negative:0;flex-shrink:0}.pds-combobox__group-row{list-style:none;position:relative}.pds-combobox__group-row-trigger{-ms-flex-align:center;align-items:center;border-radius:var(--pine-dimension-125);color:var(--pine-color-text-secondary);cursor:pointer;display:-ms-flexbox;display:flex;font:var(--pine-typography-body-medium);gap:var(--pine-dimension-xs);-ms-flex-pack:justify;justify-content:space-between;padding:var(--pine-dimension-xs) var(--pine-dimension-sm);-webkit-transition:background 0.15s;transition:background 0.15s}.pds-combobox__group-row--open>.pds-combobox__group-row-trigger,.pds-combobox__group-row--has-selection>.pds-combobox__group-row-trigger,.pds-combobox__group-row--highlighted>.pds-combobox__group-row-trigger,.pds-combobox__group-back--highlighted>.pds-combobox__group-row-trigger,.pds-combobox__group-row-trigger:hover{background:var(--pine-color-background-muted)}.pds-combobox__listbox--drill-in,.pds-combobox__listbox--drill-out{overflow-x:hidden}.pds-combobox__listbox--drill-in>.pds-combobox__group-back{-webkit-animation:pds-combobox-drill-from-end var(--pine-motion-duration-base) var(--pine-motion-easing-out);animation:pds-combobox-drill-from-end var(--pine-motion-duration-base) var(--pine-motion-easing-out)}.pds-combobox__listbox--drill-out>li{-webkit-animation:pds-combobox-drill-from-start var(--pine-motion-duration-base) var(--pine-motion-easing-out);animation:pds-combobox-drill-from-start var(--pine-motion-duration-base) var(--pine-motion-easing-out)}@-webkit-keyframes pds-combobox-drill-from-end{from{opacity:0;-webkit-transform:translateX(var(--pine-dimension-sm));transform:translateX(var(--pine-dimension-sm))}}@keyframes pds-combobox-drill-from-end{from{opacity:0;-webkit-transform:translateX(var(--pine-dimension-sm));transform:translateX(var(--pine-dimension-sm))}}@-webkit-keyframes pds-combobox-drill-from-start{from{opacity:0;-webkit-transform:translateX(calc(var(--pine-dimension-sm) * -1));transform:translateX(calc(var(--pine-dimension-sm) * -1))}}@keyframes pds-combobox-drill-from-start{from{opacity:0;-webkit-transform:translateX(calc(var(--pine-dimension-sm) * -1));transform:translateX(calc(var(--pine-dimension-sm) * -1))}}.pds-combobox__group-row--keyboard>.pds-combobox__group-row-trigger,.pds-combobox__group-back--keyboard>.pds-combobox__group-row-trigger{outline:var(--pine-outline-focus);outline-offset:calc(var(--pine-border-width) * -2)}.pds-combobox__group-row-label{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;gap:var(--pine-dimension-xs);min-width:0}.pds-combobox__group-row-caret{-ms-flex-negative:0;flex-shrink:0}.pds-combobox__listbox--grouped,.pds-combobox__flyout{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:var(--pine-dimension-2xs);padding:var(--pine-dimension-2xs)}.pds-combobox__flyout{background:var(--pine-color-background-overlay);border-radius:var(--pine-dimension-125);-webkit-box-shadow:var(--pine-box-shadow);box-shadow:var(--pine-box-shadow);list-style:none;margin:0;overflow-y:auto;position:fixed;visibility:hidden;width:-webkit-max-content;width:-moz-max-content;width:max-content;z-index:1}.pds-combobox__listbox--with-search{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;overflow:hidden;padding:0}.pds-combobox__listbox-options{-ms-flex:1;flex:1;list-style:none;margin:0;min-height:0;overflow-y:auto;padding:var(--pine-dimension-xs)}.pds-combobox__listbox-options.pds-combobox__listbox--grouped{padding:var(--pine-dimension-2xs)}.pds-combobox__panel-search{-ms-flex-align:center;align-items:center;-webkit-border-after:var(--pine-border);border-block-end:var(--pine-border);border-block-end-color:var(--pine-color-border-subtle);display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;gap:var(--pine-dimension-xs);padding:var(--pine-dimension-sm)}.pds-combobox__panel-search pds-icon{color:var(--pine-color-text-muted);-ms-flex-negative:0;flex-shrink:0}.pds-combobox__panel-search:focus-within{border-block-end-color:var(--pine-color-border-active)}.pds-combobox__panel-search-input{background:transparent;border:0;color:var(--pine-color-text-strong);-ms-flex:1;flex:1;font:var(--pine-typography-body);letter-spacing:var(--pine-letter-spacing);min-width:0;outline:none;padding:0}.pds-combobox__panel-search-input::-webkit-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__panel-search-input::-moz-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__panel-search-input:-ms-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__panel-search-input::-ms-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__panel-search-input::placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__group-back{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:var(--pine-dimension-2xs);list-style:none}.pds-combobox__group-back-trigger{-ms-flex-pack:start;justify-content:flex-start}.pds-combobox__listbox-options--drilled-in.pds-combobox__listbox--grouped{-webkit-padding-before:0;padding-block-start:0}.pds-combobox__listbox-options--drilled-in:focus{outline:none}.pds-combobox__listbox-options--drilled-in:focus .pds-combobox__group-back-trigger{border-block-end-color:var(--pine-color-border-active)}:where(.pds-combobox__listbox-options--drilled-in) .pds-combobox__group-back-trigger{background-color:var(--pine-color-background-overlay);-webkit-border-after:var(--pine-border);border-block-end:var(--pine-border);border-block-end-color:var(--pine-color-border-subtle);border-radius:0;color:var(--pine-color-text-strong);font:var(--pine-typography-body);inset-block-start:0;letter-spacing:var(--pine-letter-spacing);margin-inline:calc(var(--pine-dimension-2xs) * -1);padding:var(--pine-dimension-sm);position:-webkit-sticky;position:sticky;z-index:1}.pds-combobox__drill-in-options{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:var(--pine-dimension-2xs);list-style:none;margin:0;padding:0}.visually-hidden{border:0;clip:rect(0 0 0 0);-webkit-clip-path:polygon(0 0, 0 0, 0 0);clip-path:polygon(0 0, 0 0, 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.pds-combobox__loading{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:var(--pine-dimension-150)}.pds-combobox__empty{color:var(--pine-color-text-tertiary);padding:var(--pine-dimension-150) var(--pine-dimension-sm);text-align:center}.pds-combobox__load-more{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:var(--pine-dimension-150)}:host(.pds-combobox-dropdown-portal) .pds-combobox__listbox{position:fixed;z-index:var(--pine-z-index-priority)}.pds-combobox__button-trigger{-ms-flex-align:center;align-items:center;background:var(--color-background-default, var(--pine-color-secondary));border:var(--pine-border);border-radius:var(--pine-border-radius-full);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--color-text-default, var(--pine-color-text-inverse-emphasis));cursor:pointer;display:-ms-flexbox;display:flex;font:var(--pine-typography-body-medium);-ms-flex-pack:justify;justify-content:space-between;min-height:var(--pine-dimension-450);outline:none;padding:0 var(--pine-dimension-sm);-webkit-transition:border-color 0.15s, background 0.15s, -webkit-box-shadow 0.15s;transition:border-color 0.15s, background 0.15s, -webkit-box-shadow 0.15s;transition:border-color 0.15s, box-shadow 0.15s, background 0.15s;transition:border-color 0.15s, box-shadow 0.15s, background 0.15s, -webkit-box-shadow 0.15s;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.pds-combobox__button-trigger .pds-combobox__button-trigger-layout-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.pds-combobox__button-trigger .trigger-content{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;width:100%}.pds-combobox__button-trigger:focus-visible{border-color:var(--color-border-focus, var(--pine-color-border));-webkit-box-shadow:0 0 0 2px var(--color-outline, var(--pine-color-focus-ring));box-shadow:0 0 0 2px var(--color-outline, var(--pine-color-focus-ring))}.pds-combobox__button-trigger:hover{background:var(--color-background-hover, var(--pine-color-secondary-hover));border-color:var(--color-border-hover, var(--pine-color-border-hover))}.pds-combobox__button-trigger[aria-disabled=true],.pds-combobox__button-trigger:disabled{background:var(--color-background-disabled, var(--pine-color-secondary-disabled));border-color:var(--color-border-disabled, var(--pine-color-border-disabled));color:var(--color-text-disabled, var(--pine-color-text-secondary-disabled));cursor:not-allowed;opacity:0.6}.pds-combobox__button-trigger-label{color:inherit;-ms-flex:1 1 auto;flex:1 1 auto;text-align:start}.pds-combobox__button-trigger--input-shape{border-radius:var(--pine-dimension-125);font:var(--pine-typography-body);letter-spacing:var(--pine-letter-spacing);min-height:var(--pine-dimension-450);padding:calc(var(--pine-dimension-xs) - var(--pine-border-width)) var(--pine-dimension-150)}.pds-combobox__button-trigger--secondary.pds-combobox__button-trigger--input-shape:not([aria-disabled=true]) .pds-combobox__button-trigger-label--placeholder{color:var(--pine-color-text-muted)}.pds-combobox__button-trigger-chevron{color:currentColor;-webkit-margin-start:var(--pine-dimension-150);margin-inline-start:var(--pine-dimension-150)}.pds-combobox__button-trigger--primary{--color-background-default:var(--pine-color-primary);--color-background-hover:var(--pine-color-primary-hover);--color-background-disabled:var(--pine-color-primary-disabled);--color-border-default:var(--pine-color-primary);--color-border-hover:var(--pine-color-primary-hover);--color-border-disabled:var(--pine-color-primary-disabled);--color-border-focus:var(--pine-color-primary);--color-text-default:var(--pine-color-text-primary);--color-text-disabled:var(--pine-color-text-primary-disabled);--color-outline:var(--pine-color-focus-ring)}.pds-combobox__button-trigger--accent{--color-background-default:var(--pine-color-accent);--color-background-hover:var(--pine-color-accent-hover);--color-background-disabled:var(--pine-color-accent-disabled);--color-border-default:var(--pine-color-accent);--color-border-hover:var(--pine-color-accent-hover);--color-border-disabled:var(--pine-color-accent-disabled);--color-border-focus:var(--pine-color-accent);--color-text-default:var(--pine-color-text-primary);--color-text-disabled:var(--pine-color-text-accent-disabled);--color-outline:var(--pine-color-focus-ring)}.pds-combobox__button-trigger--secondary{--color-background-default:var(--pine-color-secondary);--color-background-hover:var(--pine-color-secondary-hover);--color-background-disabled:var(--pine-color-secondary-disabled);--color-border-default:var(--pine-color-border);--color-border-hover:var(--pine-color-border-hover);--color-border-disabled:var(--pine-color-border-disabled);--color-border-focus:var(--pine-color-border);--color-text-default:var(--pine-color-text-secondary);--color-text-disabled:var(--pine-color-text-secondary-disabled);--color-outline:var(--pine-color-focus-ring)}.pds-combobox__button-trigger--destructive{--color-background-default:var(--pine-color-danger);--color-background-hover:var(--pine-color-danger-hover);--color-background-disabled:var(--pine-color-danger-disabled);--color-border-default:var(--pine-color-danger);--color-border-hover:var(--pine-color-danger-hover);--color-border-disabled:var(--pine-color-danger-disabled);--color-border-focus:var(--pine-color-danger);--color-text-default:var(--pine-color-white);--color-text-disabled:var(--pine-color-text-danger-disabled);--color-outline:var(--pine-color-focus-ring-danger)}[data-layout]{border-radius:var(--pine-dimension-125);padding-block:var(--pine-dimension-xs)}.pds-combobox__chip-trigger{-ms-flex-align:center;align-items:center;border-radius:var(--pine-dimension-sm);-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:-ms-inline-flexbox;display:inline-flex;font:var(--pine-typography-body-medium);-ms-flex-pack:justify;justify-content:space-between;outline:none;padding-block:var(--pine-dimension-025);padding-inline:var(--pine-dimension-150);-webkit-transition:all 0.15s ease;transition:all 0.15s ease;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.pds-combobox__chip-trigger .pds-combobox__chip-trigger-layout-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.pds-combobox__chip-trigger .trigger-content{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;width:100%}.pds-combobox__chip-trigger:focus-visible{outline:var(--pine-outline-focus);outline-offset:var(--pine-border-width)}.pds-combobox__chip-trigger[aria-disabled=true]{cursor:not-allowed;opacity:0.6}.pds-combobox__chip-trigger-label{color:inherit;-ms-flex:1 1 auto;flex:1 1 auto;text-align:start}.pds-combobox__chip-trigger-chevron{color:currentColor;-webkit-margin-start:var(--pine-dimension-150);margin-inline-start:var(--pine-dimension-150)}.pds-combobox__chip-trigger-icon{-webkit-margin-end:var(--pine-dimension-2xs);margin-inline-end:var(--pine-dimension-2xs)}.pds-combobox__chip-trigger--neutral,.pds-combobox__chip-trigger--accent,.pds-combobox__chip-trigger--success,.pds-combobox__chip-trigger--warning,.pds-combobox__chip-trigger--danger,.pds-combobox__chip-trigger--info{background:var(--chip-bg);border:var(--pine-border-width) solid var(--chip-border);color:var(--chip-text)}.pds-combobox__chip-trigger--neutral:hover:not([aria-disabled=true]),.pds-combobox__chip-trigger--accent:hover:not([aria-disabled=true]),.pds-combobox__chip-trigger--success:hover:not([aria-disabled=true]),.pds-combobox__chip-trigger--warning:hover:not([aria-disabled=true]),.pds-combobox__chip-trigger--danger:hover:not([aria-disabled=true]),.pds-combobox__chip-trigger--info:hover:not([aria-disabled=true]){background:var(--chip-bg-hover)}.pds-combobox__chip-trigger--neutral:focus-visible,.pds-combobox__chip-trigger--accent:focus-visible,.pds-combobox__chip-trigger--success:focus-visible,.pds-combobox__chip-trigger--warning:focus-visible,.pds-combobox__chip-trigger--danger:focus-visible,.pds-combobox__chip-trigger--info:focus-visible{border-color:var(--chip-border)}.pds-combobox__chip-trigger--neutral{--chip-bg:var(--pine-chip-color-neutral);--chip-bg-hover:var(--pine-chip-color-neutral-hover);--chip-border:var(--pine-chip-color-neutral-hover);--chip-text:var(--pine-color-text-neutral)}.pds-combobox__chip-trigger--accent{--chip-bg:var(--pine-chip-color-accent);--chip-bg-hover:var(--pine-chip-color-accent-hover);--chip-border:var(--pine-chip-color-accent-hover);--chip-text:var(--pine-color-text-accent)}.pds-combobox__chip-trigger--success{--chip-bg:var(--pine-chip-color-success);--chip-bg-hover:var(--pine-chip-color-success-hover);--chip-border:var(--pine-chip-color-success-hover);--chip-text:var(--pine-color-text-success)}.pds-combobox__chip-trigger--warning{--chip-bg:var(--pine-chip-color-warning);--chip-bg-hover:var(--pine-chip-color-warning-hover);--chip-border:var(--pine-chip-color-warning-hover);--chip-text:var(--pine-color-text-warning)}.pds-combobox__chip-trigger--danger{--chip-bg:var(--pine-chip-color-danger);--chip-bg-hover:var(--pine-chip-color-danger-hover);--chip-border:var(--pine-chip-color-danger-hover);--chip-text:var(--pine-color-text-danger)}.pds-combobox__chip-trigger--info{--chip-bg:var(--pine-chip-color-info);--chip-bg-hover:var(--pine-chip-color-info-hover);--chip-border:var(--pine-chip-color-info-hover);--chip-text:var(--pine-color-text-info)}.pds-combobox__chip-trigger--brand{background:-webkit-gradient(linear, left top, right top, from(#FF3E14), to(#6B62F2));background:linear-gradient(90deg, #FF3E14 0%, #6B62F2 100%);border:0;color:var(--pine-color-text-neutral);padding:1px;position:relative}.pds-combobox__chip-trigger--brand .pds-combobox__chip-trigger-label{background:rgba(255, 255, 255, 0.9);border-radius:calc(var(--pine-dimension-sm) - 1px);color:var(--pine-color-text-neutral);font-weight:var(--pine-font-weight-medium);padding:var(--pine-dimension-025) var(--pine-dimension-150);position:relative;z-index:1}.pds-combobox__chip-trigger--brand .pds-combobox__chip-trigger-chevron{position:relative;z-index:1}.pds-combobox__chip-trigger--brand:hover:not([aria-disabled=true]) .pds-combobox__chip-trigger-label{background:rgba(255, 255, 255, 0.8)}.pds-combobox__chip-trigger--dropdown:not(.pds-combobox__chip-trigger--brand){padding:var(--pine-dimension-none)}.pds-combobox__chip-trigger--dropdown:not(.pds-combobox__chip-trigger--brand) .pds-combobox__chip-trigger-label{padding:var(--pine-dimension-025) var(--pine-dimension-150)}.pds-combobox__chip-trigger--large .pds-combobox__chip-trigger-label{font-family:var(--pine-font-family-heading);font-size:var(--pine-font-size-heading-6);font-weight:var(--pine-font-weight-medium);letter-spacing:var(--pine-letter-spacing-heading-6)}.pds-combobox__chip-trigger--dot .pds-combobox__chip-trigger-label::before{border:var(--pine-border-width) solid transparent;border-radius:var(--pine-border-radius-full);content:"";display:inline-block;height:var(--pine-dimension-2xs);-webkit-margin-end:var(--pine-dimension-2xs);margin-inline-end:var(--pine-dimension-2xs);width:var(--pine-dimension-2xs)}`;
11138
+ const pdsComboboxCss = () => `:host{display:block}:host([aria-disabled=true]) .pds-combobox__input-icon{color:var(--pine-color-text-disabled);pointer-events:none}.pds-combobox{position:relative}.pds-combobox__label{color:var(--pine-color-text-label);display:block;font:var(--pine-typography-body-medium);letter-spacing:var(--pine-letter-spacing);-webkit-margin-after:var(--pine-dimension-2xs);margin-block-end:var(--pine-dimension-2xs)}.pds-combobox__input-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;position:relative;width:100%}.pds-combobox__input{background:var(--pine-color-background-container);border:var(--pine-border);border-radius:var(--pine-dimension-125);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--pine-color-text-strong);-ms-flex:1;flex:1;font:var(--pine-typography-body-medium);padding:var(--pine-dimension-xs) var(--pine-dimension-450) var(--pine-dimension-xs) var(--pine-dimension-150);-webkit-transition:border-color var(--pine-motion-duration-base) ease;transition:border-color var(--pine-motion-duration-base) ease;width:100%}.pds-combobox__input:hover:not(:disabled){border-color:var(--pine-color-border-hover)}.pds-combobox__input:disabled{background:var(--pine-color-background-container-disabled);border-color:var(--pine-color-border-disabled);color:var(--pine-color-text-disabled);cursor:not-allowed}.pds-combobox__input:disabled::-webkit-input-placeholder{color:var(--pine-color-text-placeholder-disabled)}.pds-combobox__input:disabled::-moz-placeholder{color:var(--pine-color-text-placeholder-disabled)}.pds-combobox__input:disabled:-ms-input-placeholder{color:var(--pine-color-text-placeholder-disabled)}.pds-combobox__input:disabled::-ms-input-placeholder{color:var(--pine-color-text-placeholder-disabled)}.pds-combobox__input:disabled::placeholder{color:var(--pine-color-text-placeholder-disabled)}.pds-combobox__input:focus-visible{border-color:var(--pine-color-border-active);outline:var(--pine-outline-focus);outline-offset:var(--pine-border-width)}.pds-combobox__input::-webkit-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__input::-moz-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__input:-ms-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__input::-ms-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__input::placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__input.pds-combobox__input--invalid{background:var(--pine-color-red-050);border-color:var(--pine-color-border-danger)}:host-context([data-theme=dark]) .pds-combobox__input.pds-combobox__input--invalid{background:var(--pine-color-red-950)}.pds-combobox__input.pds-combobox__input--invalid:hover:not(:disabled){border-color:var(--pine-color-border-danger)}.pds-combobox__input.pds-combobox__input--invalid:focus-visible{outline-color:var(--pine-color-focus-ring-danger)}.pds-combobox__input-icon{color:var(--pine-color-text-secondary);inset-inline-end:var(--pine-dimension-150);pointer-events:none;position:absolute;z-index:calc(var(--pine-z-index-raised) - 1)}.pds-combobox__helper{color:var(--pine-color-text-message);font:var(--pine-typography-body-sm-medium);-webkit-margin-before:var(--pine-dimension-2xs);margin-block-start:var(--pine-dimension-2xs)}.pds-combobox__error{-ms-flex-align:start;align-items:flex-start;color:var(--pine-color-text-message-danger);display:-ms-flexbox;display:flex;font:var(--pine-typography-body-sm-medium);gap:var(--pine-dimension-2xs);-webkit-margin-before:var(--pine-dimension-2xs);margin-block-start:var(--pine-dimension-2xs)}.pds-combobox__error pds-icon{-ms-flex-negative:0;flex-shrink:0;-webkit-margin-before:var(--pine-dimension-025);margin-block-start:var(--pine-dimension-025)}.pds-combobox__listbox{background:var(--pine-color-background-overlay);border:0;border-radius:var(--pine-dimension-125);-webkit-box-shadow:var(--pine-box-shadow);box-shadow:var(--pine-box-shadow);list-style:none;margin:0;min-width:220px;overflow-y:auto;padding:var(--pine-dimension-xs);position:absolute;z-index:var(--pine-z-index-raised)}.pds-combobox__option{-ms-flex-align:center;align-items:center;background:transparent;border-radius:var(--pine-dimension-125);color:var(--pine-color-text-secondary);cursor:pointer;display:-ms-flexbox;display:flex;font:var(--pine-typography-body-medium);-ms-flex-pack:justify;justify-content:space-between;padding:var(--pine-dimension-xs) var(--pine-dimension-sm);position:relative;-webkit-transition:background 0.15s;transition:background 0.15s}.pds-combobox__option[aria-selected=true]{background:var(--pine-color-background-muted)}.pds-combobox__option:focus-visible{outline:0}.pds-combobox__option.pds-combobox__option--layout .pds-combobox__option-layout-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;width:100%}.pds-combobox__option.pds-combobox__option--chip .pds-combobox__option-chip{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;width:100%}.pds-combobox__option:last-child{-webkit-margin-after:0;margin-block-end:0}.pds-combobox__option--highlighted,.pds-combobox__option[selected],.pds-combobox__option--selected{background:var(--pine-color-background-muted)}.pds-combobox__option--disabled,.pds-combobox__group-row--disabled>.pds-combobox__group-row-trigger,.pds-combobox__group-back--disabled>.pds-combobox__group-back-trigger,.pds-combobox__group--disabled>.pds-combobox__group-label{color:var(--pine-color-text-disabled)}.pds-combobox__option--disabled{cursor:not-allowed}.pds-combobox__option--disabled .pds-combobox__option-chip,.pds-combobox__option--disabled .pds-combobox__option-layout-wrapper{opacity:0.5}.pds-combobox__option-label{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;gap:var(--pine-dimension-xs);min-width:0;overflow-wrap:anywhere}.pds-combobox__option-icon{-ms-flex-negative:0;flex-shrink:0}.pds-combobox__option-check{color:currentColor;font-size:var(--pine-dimension-150);-webkit-margin-start:var(--pine-dimension-150);margin-inline-start:var(--pine-dimension-150)}.pds-combobox__group-label{color:var(--pine-color-text-tertiary);cursor:default;font:var(--pine-typography-heading-caption);-webkit-margin-after:var(--pine-dimension-2xs);margin-block-end:var(--pine-dimension-2xs);-webkit-margin-before:var(--pine-dimension-150);margin-block-start:var(--pine-dimension-150);padding:var(--pine-dimension-2xs) var(--pine-dimension-sm);text-transform:uppercase}.pds-combobox__group-label:first-child{-webkit-margin-before:0;margin-block-start:0}.pds-combobox__group{list-style:none;-webkit-margin-before:var(--pine-dimension-150);margin-block-start:var(--pine-dimension-150)}.pds-combobox__group:first-child{-webkit-margin-before:0;margin-block-start:0}.pds-combobox__group-list{list-style:none;margin:0;padding:0}.pds-combobox__listbox--grouped .pds-combobox__group-list{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:var(--pine-dimension-2xs)}.pds-combobox__group-label--with-icon{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;gap:var(--pine-dimension-xs)}.pds-combobox__group-icon{-ms-flex-negative:0;flex-shrink:0}.pds-combobox__group-row{list-style:none;position:relative}.pds-combobox__group-row-trigger{-ms-flex-align:center;align-items:center;border-radius:var(--pine-dimension-125);color:var(--pine-color-text-secondary);cursor:pointer;display:-ms-flexbox;display:flex;font:var(--pine-typography-body-medium);gap:var(--pine-dimension-xs);-ms-flex-pack:justify;justify-content:space-between;padding:var(--pine-dimension-xs) var(--pine-dimension-sm);-webkit-transition:background 0.15s;transition:background 0.15s}.pds-combobox__group-row--open>.pds-combobox__group-row-trigger,.pds-combobox__group-row--has-selection>.pds-combobox__group-row-trigger,.pds-combobox__group-row--highlighted>.pds-combobox__group-row-trigger,.pds-combobox__group-back--highlighted>.pds-combobox__group-row-trigger{background:var(--pine-color-background-muted)}.pds-combobox__listbox--pointer-hover .pds-combobox__group-row-trigger:hover{background:var(--pine-color-background-muted)}.pds-combobox__listbox--drill-in,.pds-combobox__listbox--drill-out{overflow-x:hidden}.pds-combobox__listbox--drill-in,.pds-combobox__listbox--drill-out:dir(rtl){--pds-combobox-drill-from:var(--pine-dimension-sm)}.pds-combobox__listbox--drill-out,.pds-combobox__listbox--drill-in:dir(rtl){--pds-combobox-drill-from:calc(var(--pine-dimension-sm) * -1)}.pds-combobox__listbox--drill-in .pds-combobox__drill-in-options>li,.pds-combobox__listbox--drill-in .pds-combobox__group-back-trigger,.pds-combobox__listbox--drill-out>li{-webkit-animation:pds-combobox-drill var(--pine-motion-duration-base) var(--pine-motion-easing-out);animation:pds-combobox-drill var(--pine-motion-duration-base) var(--pine-motion-easing-out)}@-webkit-keyframes pds-combobox-drill{from{opacity:0;-webkit-transform:translateX(var(--pds-combobox-drill-from));transform:translateX(var(--pds-combobox-drill-from))}}@keyframes pds-combobox-drill{from{opacity:0;-webkit-transform:translateX(var(--pds-combobox-drill-from));transform:translateX(var(--pds-combobox-drill-from))}}.pds-combobox__group-row--keyboard>.pds-combobox__group-row-trigger,.pds-combobox__group-back--keyboard>.pds-combobox__group-row-trigger{outline:var(--pine-outline-focus);outline-offset:calc(var(--pine-border-width) * -2)}.pds-combobox__group-row-label{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;gap:var(--pine-dimension-xs);min-width:0}.pds-combobox__group-row-caret{-ms-flex-negative:0;flex-shrink:0}.pds-combobox__listbox--grouped,.pds-combobox__flyout{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:var(--pine-dimension-2xs);padding:var(--pine-dimension-2xs)}.pds-combobox__flyout{background:var(--pine-color-background-overlay);border-radius:var(--pine-dimension-125);-webkit-box-shadow:var(--pine-box-shadow);box-shadow:var(--pine-box-shadow);list-style:none;margin:0;overflow-y:auto;position:fixed;visibility:hidden;width:-webkit-max-content;width:-moz-max-content;width:max-content;z-index:1}.pds-combobox__listbox--with-search{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;overflow:hidden;padding:0}.pds-combobox__listbox-options{-ms-flex:1;flex:1;list-style:none;margin:0;min-height:0;overflow-y:auto;padding:var(--pine-dimension-xs)}.pds-combobox__listbox-options.pds-combobox__listbox--grouped{padding:var(--pine-dimension-2xs)}.pds-combobox__panel-search{-ms-flex-align:center;align-items:center;-webkit-border-after:var(--pine-border);border-block-end:var(--pine-border);border-block-end-color:var(--pine-color-border-subtle);display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;gap:var(--pine-dimension-xs);padding:var(--pine-dimension-sm)}.pds-combobox__panel-search pds-icon{color:var(--pine-color-text-muted);-ms-flex-negative:0;flex-shrink:0}.pds-combobox__panel-search:focus-within{border-block-end-color:var(--pine-color-border-active)}.pds-combobox__panel-search-input{background:transparent;border:0;color:var(--pine-color-text-strong);-ms-flex:1;flex:1;font:var(--pine-typography-body);letter-spacing:var(--pine-letter-spacing);min-width:0;outline:none;padding:0}.pds-combobox__panel-search-input::-webkit-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__panel-search-input::-moz-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__panel-search-input:-ms-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__panel-search-input::-ms-input-placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__panel-search-input::placeholder{color:var(--pine-color-text-placeholder)}.pds-combobox__group-back{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:var(--pine-dimension-2xs);list-style:none}.pds-combobox__group-back-trigger{-ms-flex-pack:start;justify-content:flex-start}.pds-combobox__listbox-options--drilled-in.pds-combobox__listbox--grouped{-webkit-padding-before:0;padding-block-start:0}.pds-combobox__listbox-options--drilled-in:focus{outline:none}.pds-combobox__listbox-options--drilled-in:focus .pds-combobox__group-back-trigger{border-block-end-color:var(--pine-color-border-active)}:where(.pds-combobox__listbox-options--drilled-in) .pds-combobox__group-back-trigger{background-color:var(--pine-color-background-overlay);-webkit-border-after:var(--pine-border);border-block-end:var(--pine-border);border-block-end-color:var(--pine-color-border-subtle);border-radius:0;color:var(--pine-color-text-strong);font:var(--pine-typography-body);inset-block-start:0;letter-spacing:var(--pine-letter-spacing);margin-inline:calc(var(--pine-dimension-2xs) * -1);padding:var(--pine-dimension-sm);position:-webkit-sticky;position:sticky;z-index:1}.pds-combobox__drill-in-options{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:var(--pine-dimension-2xs);list-style:none;margin:0;padding:0}.visually-hidden{border:0;clip:rect(0 0 0 0);-webkit-clip-path:polygon(0 0, 0 0, 0 0);clip-path:polygon(0 0, 0 0, 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.pds-combobox__loading{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:var(--pine-dimension-150)}.pds-combobox__empty{color:var(--pine-color-text-tertiary);padding:var(--pine-dimension-150) var(--pine-dimension-sm);text-align:center}.pds-combobox__load-more{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:var(--pine-dimension-150)}:host(.pds-combobox-dropdown-portal) .pds-combobox__listbox{position:fixed;z-index:var(--pine-z-index-priority)}.pds-combobox__button-trigger{-ms-flex-align:center;align-items:center;background:var(--color-background-default, var(--pine-color-secondary));border:var(--pine-border);border-radius:var(--pine-border-radius-full);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--color-text-default, var(--pine-color-text-inverse-emphasis));cursor:pointer;display:-ms-flexbox;display:flex;font:var(--pine-typography-body-medium);-ms-flex-pack:justify;justify-content:space-between;min-height:var(--pine-dimension-450);outline:none;padding:0 var(--pine-dimension-sm);-webkit-transition:border-color 0.15s, background 0.15s, -webkit-box-shadow 0.15s;transition:border-color 0.15s, background 0.15s, -webkit-box-shadow 0.15s;transition:border-color 0.15s, box-shadow 0.15s, background 0.15s;transition:border-color 0.15s, box-shadow 0.15s, background 0.15s, -webkit-box-shadow 0.15s;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.pds-combobox__button-trigger .pds-combobox__button-trigger-layout-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.pds-combobox__button-trigger .trigger-content{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;width:100%}.pds-combobox__button-trigger:focus-visible{border-color:var(--color-border-focus, var(--pine-color-border));-webkit-box-shadow:0 0 0 2px var(--color-outline, var(--pine-color-focus-ring));box-shadow:0 0 0 2px var(--color-outline, var(--pine-color-focus-ring))}.pds-combobox__button-trigger:hover{background:var(--color-background-hover, var(--pine-color-secondary-hover));border-color:var(--color-border-hover, var(--pine-color-border-hover))}.pds-combobox__button-trigger[aria-disabled=true],.pds-combobox__button-trigger:disabled{background:var(--color-background-disabled, var(--pine-color-secondary-disabled));border-color:var(--color-border-disabled, var(--pine-color-border-disabled));color:var(--color-text-disabled, var(--pine-color-text-secondary-disabled));cursor:not-allowed;opacity:0.6}.pds-combobox__button-trigger-label{color:inherit;-ms-flex:1 1 auto;flex:1 1 auto;min-width:0;overflow-wrap:anywhere;text-align:start}.pds-combobox__button-trigger-label--with-icon{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;gap:var(--pine-dimension-xs)}.pds-combobox__button-trigger-icon{-ms-flex-negative:0;flex-shrink:0}.pds-combobox__button-trigger--input-shape{border-radius:var(--pine-dimension-125);font:var(--pine-typography-body);letter-spacing:var(--pine-letter-spacing);min-height:var(--pine-dimension-450);padding:calc(var(--pine-dimension-xs) - var(--pine-border-width)) var(--pine-dimension-150)}.pds-combobox__button-trigger--secondary.pds-combobox__button-trigger--input-shape:not([aria-disabled=true]) .pds-combobox__button-trigger-label--placeholder{color:var(--pine-color-text-muted)}.pds-combobox__button-trigger-chevron{color:currentColor;-webkit-margin-start:var(--pine-dimension-150);margin-inline-start:var(--pine-dimension-150)}.pds-combobox__button-trigger--primary{--color-background-default:var(--pine-color-primary);--color-background-hover:var(--pine-color-primary-hover);--color-background-disabled:var(--pine-color-primary-disabled);--color-border-default:var(--pine-color-primary);--color-border-hover:var(--pine-color-primary-hover);--color-border-disabled:var(--pine-color-primary-disabled);--color-border-focus:var(--pine-color-primary);--color-text-default:var(--pine-color-text-primary);--color-text-disabled:var(--pine-color-text-primary-disabled);--color-outline:var(--pine-color-focus-ring)}.pds-combobox__button-trigger--accent{--color-background-default:var(--pine-color-accent);--color-background-hover:var(--pine-color-accent-hover);--color-background-disabled:var(--pine-color-accent-disabled);--color-border-default:var(--pine-color-accent);--color-border-hover:var(--pine-color-accent-hover);--color-border-disabled:var(--pine-color-accent-disabled);--color-border-focus:var(--pine-color-accent);--color-text-default:var(--pine-color-text-primary);--color-text-disabled:var(--pine-color-text-accent-disabled);--color-outline:var(--pine-color-focus-ring)}.pds-combobox__button-trigger--secondary{--color-background-default:var(--pine-color-secondary);--color-background-hover:var(--pine-color-secondary-hover);--color-background-disabled:var(--pine-color-secondary-disabled);--color-border-default:var(--pine-color-border);--color-border-hover:var(--pine-color-border-hover);--color-border-disabled:var(--pine-color-border-disabled);--color-border-focus:var(--pine-color-border);--color-text-default:var(--pine-color-text-secondary);--color-text-disabled:var(--pine-color-text-secondary-disabled);--color-outline:var(--pine-color-focus-ring)}.pds-combobox__button-trigger--destructive{--color-background-default:var(--pine-color-danger);--color-background-hover:var(--pine-color-danger-hover);--color-background-disabled:var(--pine-color-danger-disabled);--color-border-default:var(--pine-color-danger);--color-border-hover:var(--pine-color-danger-hover);--color-border-disabled:var(--pine-color-danger-disabled);--color-border-focus:var(--pine-color-danger);--color-text-default:var(--pine-color-white);--color-text-disabled:var(--pine-color-text-danger-disabled);--color-outline:var(--pine-color-focus-ring-danger)}[data-layout]{border-radius:var(--pine-dimension-125);padding-block:var(--pine-dimension-xs)}.pds-combobox__chip-trigger{-ms-flex-align:center;align-items:center;border-radius:var(--pine-dimension-sm);-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:-ms-inline-flexbox;display:inline-flex;font:var(--pine-typography-body-medium);-ms-flex-pack:justify;justify-content:space-between;outline:none;padding-block:var(--pine-dimension-025);padding-inline:var(--pine-dimension-150);-webkit-transition:all 0.15s ease;transition:all 0.15s ease;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.pds-combobox__chip-trigger .pds-combobox__chip-trigger-layout-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.pds-combobox__chip-trigger .trigger-content{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;width:100%}.pds-combobox__chip-trigger:focus-visible{outline:var(--pine-outline-focus);outline-offset:var(--pine-border-width)}.pds-combobox__chip-trigger[aria-disabled=true]{cursor:not-allowed;opacity:0.6}.pds-combobox__chip-trigger-label{color:inherit;-ms-flex:1 1 auto;flex:1 1 auto;text-align:start}.pds-combobox__chip-trigger-chevron{color:currentColor;-webkit-margin-start:var(--pine-dimension-150);margin-inline-start:var(--pine-dimension-150)}.pds-combobox__chip-trigger-icon{-webkit-margin-end:var(--pine-dimension-2xs);margin-inline-end:var(--pine-dimension-2xs)}.pds-combobox__chip-trigger--neutral,.pds-combobox__chip-trigger--accent,.pds-combobox__chip-trigger--success,.pds-combobox__chip-trigger--warning,.pds-combobox__chip-trigger--danger,.pds-combobox__chip-trigger--info{background:var(--chip-bg);border:var(--pine-border-width) solid var(--chip-border);color:var(--chip-text)}.pds-combobox__chip-trigger--neutral:hover:not([aria-disabled=true]),.pds-combobox__chip-trigger--accent:hover:not([aria-disabled=true]),.pds-combobox__chip-trigger--success:hover:not([aria-disabled=true]),.pds-combobox__chip-trigger--warning:hover:not([aria-disabled=true]),.pds-combobox__chip-trigger--danger:hover:not([aria-disabled=true]),.pds-combobox__chip-trigger--info:hover:not([aria-disabled=true]){background:var(--chip-bg-hover)}.pds-combobox__chip-trigger--neutral:focus-visible,.pds-combobox__chip-trigger--accent:focus-visible,.pds-combobox__chip-trigger--success:focus-visible,.pds-combobox__chip-trigger--warning:focus-visible,.pds-combobox__chip-trigger--danger:focus-visible,.pds-combobox__chip-trigger--info:focus-visible{border-color:var(--chip-border)}.pds-combobox__chip-trigger--neutral{--chip-bg:var(--pine-chip-color-neutral);--chip-bg-hover:var(--pine-chip-color-neutral-hover);--chip-border:var(--pine-chip-color-neutral-hover);--chip-text:var(--pine-color-text-neutral)}.pds-combobox__chip-trigger--accent{--chip-bg:var(--pine-chip-color-accent);--chip-bg-hover:var(--pine-chip-color-accent-hover);--chip-border:var(--pine-chip-color-accent-hover);--chip-text:var(--pine-color-text-accent)}.pds-combobox__chip-trigger--success{--chip-bg:var(--pine-chip-color-success);--chip-bg-hover:var(--pine-chip-color-success-hover);--chip-border:var(--pine-chip-color-success-hover);--chip-text:var(--pine-color-text-success)}.pds-combobox__chip-trigger--warning{--chip-bg:var(--pine-chip-color-warning);--chip-bg-hover:var(--pine-chip-color-warning-hover);--chip-border:var(--pine-chip-color-warning-hover);--chip-text:var(--pine-color-text-warning)}.pds-combobox__chip-trigger--danger{--chip-bg:var(--pine-chip-color-danger);--chip-bg-hover:var(--pine-chip-color-danger-hover);--chip-border:var(--pine-chip-color-danger-hover);--chip-text:var(--pine-color-text-danger)}.pds-combobox__chip-trigger--info{--chip-bg:var(--pine-chip-color-info);--chip-bg-hover:var(--pine-chip-color-info-hover);--chip-border:var(--pine-chip-color-info-hover);--chip-text:var(--pine-color-text-info)}.pds-combobox__chip-trigger--brand{background:-webkit-gradient(linear, left top, right top, from(#FF3E14), to(#6B62F2));background:linear-gradient(90deg, #FF3E14 0%, #6B62F2 100%);border:0;color:var(--pine-color-text-neutral);padding:1px;position:relative}.pds-combobox__chip-trigger--brand .pds-combobox__chip-trigger-label{background:rgba(255, 255, 255, 0.9);border-radius:calc(var(--pine-dimension-sm) - 1px);color:var(--pine-color-text-neutral);font-weight:var(--pine-font-weight-medium);padding:var(--pine-dimension-025) var(--pine-dimension-150);position:relative;z-index:1}.pds-combobox__chip-trigger--brand .pds-combobox__chip-trigger-chevron{position:relative;z-index:1}.pds-combobox__chip-trigger--brand:hover:not([aria-disabled=true]) .pds-combobox__chip-trigger-label{background:rgba(255, 255, 255, 0.8)}.pds-combobox__chip-trigger--dropdown:not(.pds-combobox__chip-trigger--brand){padding:var(--pine-dimension-none)}.pds-combobox__chip-trigger--dropdown:not(.pds-combobox__chip-trigger--brand) .pds-combobox__chip-trigger-label{padding:var(--pine-dimension-025) var(--pine-dimension-150)}.pds-combobox__chip-trigger--large .pds-combobox__chip-trigger-label{font-family:var(--pine-font-family-heading);font-size:var(--pine-font-size-heading-6);font-weight:var(--pine-font-weight-medium);letter-spacing:var(--pine-letter-spacing-heading-6)}.pds-combobox__chip-trigger--dot .pds-combobox__chip-trigger-label::before{border:var(--pine-border-width) solid transparent;border-radius:var(--pine-border-radius-full);content:"";display:inline-block;height:var(--pine-dimension-2xs);-webkit-margin-end:var(--pine-dimension-2xs);margin-inline-end:var(--pine-dimension-2xs);width:var(--pine-dimension-2xs)}`;
10987
11139
 
10988
11140
  /**
10989
11141
  * @slot option - Option elements for the combobox dropdown
@@ -11191,6 +11343,17 @@ class PdsCombobox {
11191
11343
  this.highlightedGroup = null;
11192
11344
  /** The keys, not the pointer, moved the highlight last; the focus ring shows only then. */
11193
11345
  this.keyboardNavigating = false;
11346
+ /**
11347
+ * A drill-in group row the first arrow showed rather than moved past. `aria-activedescendant`
11348
+ * already pointed at it, so the status region says it instead.
11349
+ */
11350
+ this.revealedGroupLabel = null;
11351
+ /**
11352
+ * The pointer in the panel can hover: a mouse or pen, not touch. Touch browsers keep a tapped row
11353
+ * hovered, so group rows shade on `:hover` only for a pointer that can hover. Checked on the
11354
+ * pointer itself rather than `(hover: hover)`, which a touch-first device with a trackpad fails.
11355
+ */
11356
+ this.pointerCanHover = true;
11194
11357
  /**
11195
11358
  * What's typed in the dropdown's own search field (`panelSearch`).
11196
11359
  */
@@ -11235,6 +11398,11 @@ class PdsCombobox {
11235
11398
  });
11236
11399
  /** The groups in the flyout panel's last render, so a row's index finds its optgroup. */
11237
11400
  this.renderedGroups = [];
11401
+ /**
11402
+ * Where each ungrouped option and optgroup built from the `options` prop came in the data, so
11403
+ * the flyout and drill-in panels draw them in that order. Slotted markup is already in order.
11404
+ */
11405
+ this.panelPositions = new WeakMap();
11238
11406
  /** Room for a flyout was checked for this open. */
11239
11407
  this.flyoutRoomChecked = false;
11240
11408
  /** The highlighted option sits in a flyout that hasn't rendered yet; focus it after the next render. */
@@ -11248,10 +11416,14 @@ class PdsCombobox {
11248
11416
  * the list shows every option until the user types (then normal filtering applies).
11249
11417
  */
11250
11418
  this.expandFilterListWhileOpen = false;
11419
+ this.onPanelPointer = (event) => {
11420
+ const canHover = event.pointerType !== 'touch';
11421
+ if (this.pointerCanHover !== canHover)
11422
+ this.pointerCanHover = canHover;
11423
+ };
11251
11424
  this.onDrillAnimationEnd = (event) => {
11252
- var _a;
11253
11425
  // Only the slide's own end: slotted consumer content can animate inside the list too.
11254
- if ((_a = event.animationName) === null || _a === void 0 ? void 0 : _a.startsWith('pds-combobox-drill'))
11426
+ if (event.animationName === 'pds-combobox-drill')
11255
11427
  this.drillDirection = null;
11256
11428
  };
11257
11429
  /** `<label for>` only works on the input trigger; for a div trigger a click on the label focuses it. */
@@ -11451,6 +11623,9 @@ class PdsCombobox {
11451
11623
  };
11452
11624
  // Handler for button trigger click
11453
11625
  this.onButtonTriggerClick = () => {
11626
+ // The button and chip triggers are divs, so a click reaches them even while disabled.
11627
+ if (this.disabled)
11628
+ return;
11454
11629
  this.isOpen = !this.isOpen;
11455
11630
  if (this.isOpen) {
11456
11631
  this.prepareExpandFilterListOnOpen();
@@ -11470,6 +11645,13 @@ class PdsCombobox {
11470
11645
  };
11471
11646
  // Handler for button trigger keyboard events
11472
11647
  this.onButtonTriggerKeyDown = (e) => {
11648
+ // Disabled takes it out of the tab order, but setFocus() or a click can still focus it.
11649
+ if (this.disabled) {
11650
+ // Keep Space from scrolling the page, as on a native disabled button.
11651
+ if (e.key === ' ')
11652
+ e.preventDefault();
11653
+ return;
11654
+ }
11473
11655
  // Escape closes an open group before the dropdown. Other keys reach the tree through handleKeyDown.
11474
11656
  if (this.isOpen && e.key === 'Escape' && this.handleGroupedPanelKey(e))
11475
11657
  return;
@@ -11490,8 +11672,9 @@ class PdsCombobox {
11490
11672
  }, 0);
11491
11673
  }
11492
11674
  else if (e.key === 'Escape') {
11493
- e.preventDefault();
11675
+ // Only an open dropdown claims Escape; a closed one leaves it to a modal or popover around it.
11494
11676
  if (this.isOpen) {
11677
+ e.preventDefault();
11495
11678
  this.isOpen = false;
11496
11679
  this.highlightedIndex = -1;
11497
11680
  this.clearExpandFilterList();
@@ -11670,6 +11853,31 @@ class PdsCombobox {
11670
11853
  this.focusPanel(panelFocusEl);
11671
11854
  }
11672
11855
  }
11856
+ /**
11857
+ * Scrolls just enough to show `el`, as `scrollIntoView({ block: 'nearest' })` does. In the drill-in
11858
+ * panel it scrolls the list alone, and never sideways: while a drill-in slide offsets a row past
11859
+ * the list's edge, `scrollIntoView` also scrolls the list horizontally to reach it, which eats most
11860
+ * of the slide. There it keeps clear of the sticky row back, through the scroll padding set for it,
11861
+ * but doesn't scroll the page or a scrolling ancestor.
11862
+ */
11863
+ scrollIntoViewNearest(el, smooth) {
11864
+ const behavior = smooth ? 'smooth' : 'auto';
11865
+ if (!this.showsGroupedPanel || this.effectiveGroupDisplay !== 'drill-in') {
11866
+ el.scrollIntoView({ block: 'nearest', behavior });
11867
+ return;
11868
+ }
11869
+ const list = this.usesPanelSearch ? this.panelTreeEl : this.listboxEl;
11870
+ if (!list)
11871
+ return;
11872
+ const offset = el.getBoundingClientRect().top - list.getBoundingClientRect().top - list.clientTop;
11873
+ // The padding keeps rows clear of the sticky row back; the row back itself doesn't need it.
11874
+ const padding = el.classList.contains('pds-combobox__group-back-trigger') ? 0 : parseFloat(list.style.scrollPaddingBlockStart) || 0;
11875
+ const top = list.scrollTop + offset - padding;
11876
+ const bottom = list.scrollTop + offset + el.offsetHeight - list.clientHeight;
11877
+ const target = top < list.scrollTop ? top : bottom > list.scrollTop ? bottom : null;
11878
+ if (target !== null)
11879
+ list.scrollTo({ top: target, behavior });
11880
+ }
11673
11881
  focusPanel(el) {
11674
11882
  var _a, _b;
11675
11883
  this.panelFocusEl = el;
@@ -11690,6 +11898,7 @@ class PdsCombobox {
11690
11898
  }
11691
11899
  openGroupChanged(next, previous) {
11692
11900
  this.handPanelFocusToList();
11901
+ this.revealedGroupLabel = null;
11693
11902
  // Only moves between the drill-in panel's views slide; search results don't.
11694
11903
  if (!this.isOpen || this.effectiveGroupDisplay !== 'drill-in' || !this.showsGroupedPanel)
11695
11904
  return;
@@ -11710,8 +11919,25 @@ class PdsCombobox {
11710
11919
  if (this.isOpen && this.hidesPanelSearch && this.panelTreeEl)
11711
11920
  this.focusPanel(this.panelTreeEl);
11712
11921
  }
11922
+ disabledChanged(disabled) {
11923
+ var _a, _b, _c, _d, _e;
11924
+ if (!disabled || !this.isOpen)
11925
+ return;
11926
+ const shadowActive = (_b = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.activeElement) !== null && _b !== void 0 ? _b : null;
11927
+ const focusInDropdown = !!((_d = (_c = this.portalEl) === null || _c === void 0 ? void 0 : _c.shadowRoot) === null || _d === void 0 ? void 0 : _d.activeElement) || (!!shadowActive && !!((_e = this.listboxEl) === null || _e === void 0 ? void 0 : _e.contains(shadowActive)));
11928
+ this.isOpen = false;
11929
+ this.highlightedIndex = -1;
11930
+ this.isArrowKeyNavigationMode = false;
11931
+ this.clearExpandFilterList();
11932
+ this.updateAriaActiveDescendant();
11933
+ // Closing removes the search field or option that held focus. A button or chip trigger can still
11934
+ // take it (aria-disabled), so focus doesn't fall to the page; a disabled input can't, as natively.
11935
+ if (focusInDropdown && this.trigger !== 'input')
11936
+ this.restoreFocusToTrigger();
11937
+ }
11713
11938
  isOpenChanged(isOpen) {
11714
11939
  if (!isOpen) {
11940
+ this.revealedGroupLabel = null;
11715
11941
  this.drillDirection = null;
11716
11942
  this.openGroup = null;
11717
11943
  this.highlightedGroup = null;
@@ -11990,20 +12216,25 @@ class PdsCombobox {
11990
12216
  // slotted markup would be, so grouping, filtering and labels work the same either way. Each
11991
12217
  // group is listed where it first appears with all of its options, even when the data
11992
12218
  // interleaves groups, so an option never renders under another group's label. Ungrouped
11993
- // options come first, so none reads as part of the group above it.
12219
+ // options come first, so none reads as part of the group above it. The flyout and drill-in
12220
+ // panels draw groups as rows, where that can't happen, so they keep the data's order instead.
11994
12221
  const asyncOptions = this.options || this.internalOptions;
11995
12222
  const groups = new Map();
11996
12223
  const ungrouped = [];
11997
12224
  const groupEntries = [];
11998
- asyncOptions.forEach(opt => {
12225
+ this.panelPositions = new WeakMap();
12226
+ asyncOptions.forEach((opt, position) => {
11999
12227
  const optionEl = document.createElement('option');
12000
12228
  optionEl.value = String(opt.id);
12001
12229
  optionEl.textContent = opt.text;
12002
12230
  if (opt.disabled === true)
12003
12231
  optionEl.setAttribute('disabled', '');
12004
12232
  // Only strings group an option or name an icon; anything else from JS is ignored, not coerced.
12233
+ if (typeof opt.icon === 'string' && opt.icon !== '')
12234
+ optionEl.setAttribute('data-icon', opt.icon);
12005
12235
  if (typeof opt.group !== 'string' || opt.group === '') {
12006
12236
  ungrouped.push(optionEl);
12237
+ this.panelPositions.set(optionEl, position);
12007
12238
  return;
12008
12239
  }
12009
12240
  let optgroup = groups.get(opt.group);
@@ -12012,6 +12243,7 @@ class PdsCombobox {
12012
12243
  optgroup.label = opt.group;
12013
12244
  groups.set(opt.group, optgroup);
12014
12245
  groupEntries.push(optgroup);
12246
+ this.panelPositions.set(optgroup, position);
12015
12247
  }
12016
12248
  if (!optgroup.hasAttribute('data-icon') && typeof opt.groupIcon === 'string' && opt.groupIcon !== '') {
12017
12249
  optgroup.setAttribute('data-icon', opt.groupIcon);
@@ -12476,6 +12708,7 @@ class PdsCombobox {
12476
12708
  handleGroupedPanelKey(e) {
12477
12709
  if (!this.showsGroupedPanel)
12478
12710
  return false;
12711
+ const highlightShown = this.keyboardNavigating;
12479
12712
  this.keyboardNavigating = true;
12480
12713
  // In the input trigger, Left and Right still move the caret through typed text, and Space,
12481
12714
  // Home and End edit it, as they do in the panel's search field.
@@ -12485,23 +12718,32 @@ class PdsCombobox {
12485
12718
  if (e.key === ' ' || e.key === 'Home' || e.key === 'End')
12486
12719
  return false;
12487
12720
  }
12488
- const entries = buildPanelEntries(this.filteredItems);
12721
+ const entries = this.panelEntries();
12489
12722
  const drilledIn = this.effectiveGroupDisplay === 'drill-in' && this.openGroup !== null;
12490
12723
  const current = this.currentPanelItem();
12491
12724
  const column = panelColumn(entries, this.openGroup, current, drilledIn);
12492
12725
  if (column.length === 0)
12493
12726
  return false;
12494
12727
  const position = current === null ? -1 : column.indexOf(current);
12728
+ // Drill-in doesn't shade a group row the pointer or a click-open highlighted, so the first Up or
12729
+ // Down shows that row rather than moving past one the user never saw.
12730
+ const unseenRow = !highlightShown && this.effectiveGroupDisplay === 'drill-in' && current !== null && typeof current !== 'number' && current !== this.openGroup;
12495
12731
  const moveTo = (to) => {
12496
12732
  e.preventDefault();
12497
12733
  this.highlightPanelItem(column[Math.max(0, Math.min(column.length - 1, to))]);
12734
+ this.revealedGroupLabel = null;
12735
+ return true;
12736
+ };
12737
+ const reveal = () => {
12738
+ e.preventDefault();
12739
+ this.revealedGroupLabel = current.label;
12498
12740
  return true;
12499
12741
  };
12500
12742
  switch (e.key) {
12501
12743
  case 'ArrowDown':
12502
- return moveTo(position < 0 ? 0 : position + 1);
12744
+ return unseenRow ? reveal() : moveTo(position < 0 ? 0 : position + 1);
12503
12745
  case 'ArrowUp':
12504
- return moveTo(position < 0 ? column.length - 1 : position - 1);
12746
+ return unseenRow ? reveal() : moveTo(position < 0 ? column.length - 1 : position - 1);
12505
12747
  case 'Home':
12506
12748
  return moveTo(0);
12507
12749
  case 'End':
@@ -12634,7 +12876,7 @@ class PdsCombobox {
12634
12876
  // In the grouped panel, the first row with something to choose: a group stays closed until
12635
12877
  // it's opened.
12636
12878
  if (this.showsGroupedPanel) {
12637
- const first = buildPanelEntries(this.filteredItems).find(entry => entry.kind === 'group' ? !isGroupDisabled(entry.group) : !isOptionDisabled(entry.option));
12879
+ const first = this.panelEntries().find(entry => entry.kind === 'group' ? !isGroupDisabled(entry.group) : !isOptionDisabled(entry.option));
12638
12880
  this.highlightedIndex = (first === null || first === void 0 ? void 0 : first.kind) === 'option' ? first.index : -1;
12639
12881
  this.highlightedGroup = (first === null || first === void 0 ? void 0 : first.kind) === 'group' ? first.group.optgroup : null;
12640
12882
  return;
@@ -12699,8 +12941,13 @@ class PdsCombobox {
12699
12941
  }
12700
12942
  // Matched by id, not a selector: componentId is consumer text and may not be selector-safe.
12701
12943
  const id = this.groupDomId(groupRow);
12702
- (_a = Array.from(this.listboxEl.querySelectorAll('[role="treeitem"]'))
12703
- .find(row => row.id === id)) === null || _a === void 0 ? void 0 : _a.scrollIntoView({ block: 'nearest' });
12944
+ const row = Array.from(this.listboxEl.querySelectorAll('[role="treeitem"]'))
12945
+ .find(item => item.id === id);
12946
+ // The row's trigger, not its item: the row back's item wraps the group's options, and showing
12947
+ // all of a group taller than the list would scroll the row back itself out of view.
12948
+ const trigger = Array.from((_a = row === null || row === void 0 ? void 0 : row.children) !== null && _a !== void 0 ? _a : []).find(child => child.classList.contains('pds-combobox__group-row-trigger'));
12949
+ if (trigger)
12950
+ this.scrollIntoViewNearest(trigger, false);
12704
12951
  this.updateAriaActiveDescendant();
12705
12952
  return;
12706
12953
  }
@@ -12751,7 +12998,7 @@ class PdsCombobox {
12751
12998
  this.flyout.reveal(flyout, currentOption);
12752
12999
  }
12753
13000
  else {
12754
- currentOption.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
13001
+ this.scrollIntoViewNearest(currentOption, true);
12755
13002
  }
12756
13003
  }
12757
13004
  // Always update aria-activedescendant on the trigger element
@@ -12848,6 +13095,8 @@ class PdsCombobox {
12848
13095
  this.highlightedIndex = -1;
12849
13096
  this.highlightedGroup = group;
12850
13097
  this.keyboardNavigating = false;
13098
+ // So revealing this row again later is announced again.
13099
+ this.revealedGroupLabel = null;
12851
13100
  }
12852
13101
  // Get the label of the selected option
12853
13102
  get selectedLabel() {
@@ -13003,7 +13252,8 @@ class PdsCombobox {
13003
13252
  'pds-combobox__listbox--grouped': this.groupDisplay !== 'inline',
13004
13253
  'pds-combobox__listbox--drill-in': this.drillDirection === 'in',
13005
13254
  'pds-combobox__listbox--drill-out': this.drillDirection === 'out',
13006
- }, onAnimationEnd: this.onDrillAnimationEnd, role: this.showsGroupedPanel ? 'tree' : 'listbox', id: this.listboxId, "aria-label": this.label || 'Options', "aria-multiselectable": "false",
13255
+ 'pds-combobox__listbox--pointer-hover': this.pointerCanHover,
13256
+ }, onAnimationEnd: this.onDrillAnimationEnd, onPointerMove: this.onPanelPointer, onPointerDown: this.onPanelPointer, role: this.showsGroupedPanel ? 'tree' : 'listbox', id: this.listboxId, "aria-label": this.label || 'Options', "aria-multiselectable": "false",
13007
13257
  // Focusable but out of the tab order with panel search, so it can take focus when a
13008
13258
  // drilled-in group hides the field. Dropping it while focused would blur the list and close.
13009
13259
  tabIndex: withSearch ? -1 : undefined, "aria-activedescendant": listTakesFocus ? this.activeDescendantId : undefined, onKeyDown: withSearch ? this.onPanelTreeKeyDown : undefined, ref: el => {
@@ -13169,7 +13419,21 @@ class PdsCombobox {
13169
13419
  'pds-combobox__option--layout': isLayout,
13170
13420
  'pds-combobox__option--chip': isChip,
13171
13421
  'pds-combobox__option--disabled': isDisabled,
13172
- }, "data-option-index": index, onMouseDown: this.onOptionMouseDown, onClick: this.onOptionClick, onMouseEnter: this.onOptionMouseEnter, onKeyDown: this.onOptionKeyDown }, isLayout ? (hAsync("pds-box", { class: "pds-combobox__option-layout-wrapper", innerHTML: this.getOptionLayoutContent(option) })) : isChip ? (this.renderOptionChip(option)) : (this.getOptionLabel(option)), isSelected && hAsync("pds-icon", { icon: "check", size: "regular", class: "pds-combobox__option-check" })));
13422
+ }, "data-option-index": index, onMouseDown: this.onOptionMouseDown, onClick: this.onOptionClick, onMouseEnter: this.onOptionMouseEnter, onKeyDown: this.onOptionKeyDown }, isLayout ? (hAsync("pds-box", { class: "pds-combobox__option-layout-wrapper", innerHTML: this.getOptionLayoutContent(option) })) : isChip ? (this.renderOptionChip(option)) : (this.renderOptionLabel(option)), isSelected && hAsync("pds-icon", { icon: "check", size: "regular", class: "pds-combobox__option-check" })));
13423
+ }
13424
+ /** An option's text, after its `data-icon` when it has one. */
13425
+ renderOptionLabel(option) {
13426
+ const icon = optionIconOf(option);
13427
+ if (icon === null)
13428
+ return this.getOptionLabel(option);
13429
+ return (hAsync("span", { class: "pds-combobox__option-label" }, hAsync("pds-icon", { name: icon, size: "regular", "aria-hidden": "true", class: "pds-combobox__option-icon" }), this.getOptionLabel(option)));
13430
+ }
13431
+ /** The grouped panel's rows, in the order the panel draws them and the keyboard moves through. */
13432
+ panelEntries() {
13433
+ // Slotted markup is already in order; only options from data record positions.
13434
+ if (this.options === undefined && !this.asyncUrl)
13435
+ return buildPanelEntries(this.filteredItems);
13436
+ return buildPanelEntries(this.filteredItems, element => this.panelPositions.get(element));
13173
13437
  }
13174
13438
  /**
13175
13439
  * `flyout`: one row per group, its options in a flyout beside it. `drill-in`: the same rows, and
@@ -13177,7 +13441,7 @@ class PdsCombobox {
13177
13441
  * it's a tree: the rows and ungrouped options are level 1, a group's options level 2.
13178
13442
  */
13179
13443
  renderGroupedPanel() {
13180
- const entries = buildPanelEntries(this.filteredItems);
13444
+ const entries = this.panelEntries();
13181
13445
  const setsize = entries.length;
13182
13446
  if (this.effectiveGroupDisplay === 'drill-in' && this.openGroup !== null) {
13183
13447
  const position = entries.findIndex(entry => entry.kind === 'group' && entry.group.optgroup === this.openGroup);
@@ -13208,22 +13472,26 @@ class PdsCombobox {
13208
13472
  return (hAsync("li", { key: "group-back", id: id, class: {
13209
13473
  'pds-combobox__group-back': true,
13210
13474
  'pds-combobox__group-back--disabled': disabled,
13211
- 'pds-combobox__group-back--highlighted': this.highlightedGroupRow === group.optgroup,
13475
+ // As the group rows: shaded for the keys, and by `:hover` for the pointer.
13476
+ 'pds-combobox__group-back--highlighted': this.keyboardNavigating && this.highlightedGroupRow === group.optgroup,
13212
13477
  'pds-combobox__group-back--keyboard': this.keyboardNavigating && this.highlightedGroupRow === group.optgroup,
13213
13478
  }, role: "treeitem", "aria-expanded": "true", "aria-disabled": disabled ? 'true' : undefined, "aria-level": 1, "aria-posinset": posinset, "aria-setsize": setsize, "aria-labelledby": `${id}-label` }, hAsync("div", { class: "pds-combobox__group-row-trigger pds-combobox__group-back-trigger", onMouseDown: this.onOptionMouseDown, onMouseEnter: this.onGroupBackMouseEnter, onClick: this.onGroupBackClick }, hAsync("span", { class: "pds-combobox__group-row-label", id: `${id}-label` }, hAsync("pds-icon", { name: "caret-left", size: "regular", "aria-hidden": "true", class: "pds-combobox__group-row-caret" }), hAsync("span", { class: "visually-hidden" }, this.drillInBackLabel, ": "), group.label)), hAsync("ul", { class: "pds-combobox__drill-in-options", role: "group", "aria-label": group.label }, this.renderGroupOptions(group))));
13214
13479
  }
13215
13480
  renderGroupRow(group, groupIndex, { posinset, setsize }) {
13216
13481
  const flyout = this.effectiveGroupDisplay === 'flyout';
13217
13482
  const isOpen = flyout && this.openGroup === group.optgroup;
13218
- const hasSelection = group.options.some(({ option }) => this.isOptionSelected(option));
13483
+ // Drill-in shades a group row only for the keys: not for the group holding the selection, or the
13484
+ // row the pointer or a click-open left highlighted, which read as picked. `:hover` covers the pointer.
13485
+ const hasSelection = flyout && group.options.some(({ option }) => this.isOptionSelected(option));
13486
+ const isCurrent = this.highlightedGroupRow === group.optgroup;
13219
13487
  const disabled = isGroupDisabled(group);
13220
13488
  const id = this.groupDomId(group.optgroup);
13221
13489
  return (hAsync("li", { key: `group-${groupIndex}`, id: id, class: {
13222
13490
  'pds-combobox__group-row': true,
13223
13491
  'pds-combobox__group-row--open': isOpen,
13224
13492
  'pds-combobox__group-row--has-selection': hasSelection,
13225
- 'pds-combobox__group-row--highlighted': this.highlightedGroupRow === group.optgroup,
13226
- 'pds-combobox__group-row--keyboard': this.keyboardNavigating && this.highlightedGroupRow === group.optgroup,
13493
+ 'pds-combobox__group-row--highlighted': isCurrent && (flyout || this.keyboardNavigating),
13494
+ 'pds-combobox__group-row--keyboard': isCurrent && this.keyboardNavigating,
13227
13495
  'pds-combobox__group-row--disabled': disabled,
13228
13496
  }, role: "treeitem", "aria-expanded": isOpen ? 'true' : 'false', "aria-disabled": disabled ? 'true' : undefined, "aria-level": 1, "aria-posinset": posinset, "aria-setsize": setsize, "aria-labelledby": `${id}-label`, "data-group-index": groupIndex, onMouseEnter: flyout ? this.onGroupRowMouseEnter : undefined, onMouseLeave: flyout ? this.onGroupRowMouseLeave : undefined }, hAsync("div", { class: "pds-combobox__group-row-trigger", "data-group-index": groupIndex, onMouseDown: this.onOptionMouseDown, onMouseEnter: this.onGroupRowTriggerMouseEnter, onClick: this.onGroupRowClick }, hAsync("span", { class: "pds-combobox__group-row-label", id: `${id}-label` }, group.icon !== null && (
13229
13497
  // `name`, not `icon`: `icon` also loads URLs and data: SVGs, unsanitized.
@@ -13239,7 +13507,23 @@ class PdsCombobox {
13239
13507
  }
13240
13508
  // Helper method to render default text content
13241
13509
  renderDefaultContent() {
13242
- return (hAsync("span", { class: { 'pds-combobox__button-trigger-label': true, 'pds-combobox__button-trigger-label--placeholder': !this.selectedLabel } }, this.selectedLabel || this.placeholder));
13510
+ const icon = this.selectedIcon;
13511
+ return (hAsync("span", { class: {
13512
+ 'pds-combobox__button-trigger-label': true,
13513
+ 'pds-combobox__button-trigger-label--placeholder': !this.selectedLabel,
13514
+ 'pds-combobox__button-trigger-label--with-icon': icon !== null,
13515
+ } }, icon !== null && (
13516
+ // `name`, not `icon`: `icon` also loads URLs and data: SVGs, unsanitized.
13517
+ hAsync("pds-icon", { name: icon, size: "regular", "aria-hidden": "true", class: "pds-combobox__button-trigger-icon" })), this.selectedLabel || this.placeholder));
13518
+ }
13519
+ /** The selection's icon for the button trigger: the option's own, or else its group's. */
13520
+ get selectedIcon() {
13521
+ var _a;
13522
+ const option = this.selectedOption;
13523
+ if (!option)
13524
+ return null;
13525
+ const optgroup = parentOptgroupOf(option);
13526
+ return (_a = optionIconOf(option)) !== null && _a !== void 0 ? _a : (optgroup !== null ? groupIconOf(optgroup) : null);
13243
13527
  }
13244
13528
  // Helper method to check if we should show layout content
13245
13529
  shouldShowLayoutContent() {
@@ -13357,6 +13641,7 @@ class PdsCombobox {
13357
13641
  ];
13358
13642
  }
13359
13643
  render() {
13644
+ var _a;
13360
13645
  const triggerClass = [
13361
13646
  'pds-combobox__button-trigger',
13362
13647
  `pds-combobox__button-trigger--${this.triggerVariant}`,
@@ -13364,13 +13649,18 @@ class PdsCombobox {
13364
13649
  ]
13365
13650
  .filter(Boolean)
13366
13651
  .join(' ');
13367
- return (hAsync(Host, { key: '960558b36010eb059c98acc37439656f2f7ff657', "aria-disabled": this.disabled ? 'true' : null }, hAsync("div", { key: 'b0abcd004aa98b630819cfdd0cfb85ebde2ee2f8', class: "pds-combobox", tabIndex: -1, onFocusout: this.onComboboxFocusOut, part: "combobox" }, this.hasVisibleLabel && (hAsync("label", { key: 'ae42f12fe4d0c498c99c0baae7673ff90e1be576', htmlFor: this.trigger === 'input' ? this.componentId : undefined, id: this.labelId, class: "pds-combobox__label", onClick: this.onLabelClick }, this.label)), this.trigger === 'input' ? (hAsync("div", { class: "pds-combobox__input-wrapper", style: { width: this.triggerWidth } }, hAsync("input", { ref: el => {
13652
+ return (hAsync(Host, { key: 'c3bda161c67bab75f306c7f38435d279e5a88756', "aria-disabled": this.disabled ? 'true' : null }, hAsync("div", { key: '92b3f83c14a7296b3b2671eaef538a15743f695f', class: "pds-combobox", tabIndex: -1, onFocusout: this.onComboboxFocusOut, part: "combobox" }, this.hasVisibleLabel && (hAsync("label", { key: '4a2dba09dd6db9893e21346b861b4c6cb891112b', htmlFor: this.trigger === 'input' ? this.componentId : undefined, id: this.labelId, class: "pds-combobox__label", onClick: this.onLabelClick }, this.label)), this.trigger === 'input' ? (hAsync("div", { class: "pds-combobox__input-wrapper", style: { width: this.triggerWidth } }, hAsync("input", { ref: el => {
13368
13653
  this.inputEl = el;
13369
13654
  this.triggerEl = el;
13370
13655
  }, class: {
13371
13656
  'pds-combobox__input': true,
13372
13657
  'pds-combobox__input--invalid': this.isInvalid(),
13373
- }, type: "text", role: "combobox", "aria-autocomplete": "list", "aria-haspopup": this.inputPopupRole === 'tree' ? 'tree' : undefined, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.hideLabel ? this.label : undefined, id: this.componentId, value: this.displayText, placeholder: this.placeholder, disabled: this.disabled, onInput: this.handleInput, onClick: this.handleInputClick, onKeyDown: this.handleKeyDown, autocomplete: "off", part: "input" }), hAsync("pds-icon", { icon: "enlarge", "aria-hidden": "true", class: "pds-combobox__input-icon" }))) : this.trigger === 'chip' ? (hAsync("div", { class: this.getChipTriggerClass(), style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, ref: el => (this.triggerEl = el), part: "chip-trigger" }, this.renderChipTriggerContent())) : (hAsync("div", { class: triggerClass, style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, ref: el => (this.triggerEl = el), part: "button-trigger" }, this.renderButtonTriggerContent())), this.renderMessages(), hAsync("div", { key: 'ab0dba6db0a989cb2e41632cb8412062f96c38cd', style: { display: 'none' } }, hAsync("slot", { key: '337461c5ead6dda1d04911fd4b5a23b1dc6b9726', onSlotchange: () => this.updateOptions() })), this.renderDropdown(), this.groupDisplay !== 'inline' && (hAsync("span", { key: 'd8d82d69381548b2e3266d9109c98ab0397b22e0', class: "visually-hidden", role: "status", "aria-live": "polite" }, this.isOpen && this.effectiveGroupDisplay === 'drill-in' && this.openGroup !== null ? this.openGroup.label : '')))));
13658
+ }, type: "text", role: "combobox", "aria-autocomplete": "list", "aria-haspopup": this.inputPopupRole === 'tree' ? 'tree' : undefined, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.hideLabel ? this.label : undefined, id: this.componentId, value: this.displayText, placeholder: this.placeholder, disabled: this.disabled, onInput: this.handleInput, onClick: this.handleInputClick, onKeyDown: this.handleKeyDown, autocomplete: "off", part: "input" }), hAsync("pds-icon", { icon: "enlarge", "aria-hidden": "true", class: "pds-combobox__input-icon" }))) : this.trigger === 'chip' ? (hAsync("div", { class: this.getChipTriggerClass(), style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, ref: el => (this.triggerEl = el), part: "chip-trigger" }, this.renderChipTriggerContent())) : (hAsync("div", { class: triggerClass, style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, ref: el => (this.triggerEl = el), part: "button-trigger" }, this.renderButtonTriggerContent())), this.renderMessages(), hAsync("div", { key: 'b8d358339bb26037b6c3c464bd4e13fe978f7857', style: { display: 'none' } }, hAsync("slot", { key: '4aa4c2b8f2b57e13d1e958cc745c61e39e800529', onSlotchange: () => this.updateOptions() })), this.renderDropdown(), this.groupDisplay !== 'inline' && [
13659
+ hAsync("span", { key: "drill-status", class: "visually-hidden", role: "status", "aria-live": "polite" }, this.isOpen && this.effectiveGroupDisplay === 'drill-in' && this.openGroup !== null ? this.openGroup.label : ''),
13660
+ // Its own region: sharing one, revealing a row then opening it would leave the text the
13661
+ // same, and opening the group would go unannounced.
13662
+ hAsync("span", { key: "reveal-status", class: "visually-hidden", role: "status", "aria-live": "polite" }, this.isOpen ? (_a = this.revealedGroupLabel) !== null && _a !== void 0 ? _a : '' : ''),
13663
+ ])));
13374
13664
  }
13375
13665
  static get formAssociated() { return true; }
13376
13666
  get el() { return getElement(this); }
@@ -13384,6 +13674,9 @@ class PdsCombobox {
13384
13674
  "flyoutFallback": [{
13385
13675
  "flyoutFallbackChanged": 0
13386
13676
  }],
13677
+ "disabled": [{
13678
+ "disabledChanged": 0
13679
+ }],
13387
13680
  "isOpen": [{
13388
13681
  "isOpenChanged": 0
13389
13682
  }],
@@ -13453,6 +13746,8 @@ class PdsCombobox {
13453
13746
  "drillDirection": [32],
13454
13747
  "highlightedGroup": [32],
13455
13748
  "keyboardNavigating": [32],
13749
+ "revealedGroupLabel": [32],
13750
+ "pointerCanHover": [32],
13456
13751
  "panelQuery": [32],
13457
13752
  "flyoutFallback": [32],
13458
13753
  "selectedOption": [32],
@@ -13500,7 +13795,7 @@ class PdsContainer {
13500
13795
  hostStyle['--pine-container-max-width'] = customSize;
13501
13796
  if (!this.centered)
13502
13797
  hostStyle['margin-inline'] = '0';
13503
- return (hAsync(Host, { key: '8a01369c4d1817dd083b1ac714ff7c02920f817e', class: { [`pds-container--${this.size}`]: isNamed }, style: Object.keys(hostStyle).length ? hostStyle : undefined }, hAsync(Tag, { key: '7428cb0040896dc11004065cf91ae9d3c3a99c49', part: "container" }, hAsync("slot", { key: '5a5b5bbc87c03afc23f1c9a0523fced8c0795efb' }))));
13798
+ return (hAsync(Host, { key: '8a9b10b5d0e348b73f8a6bd7933083c596df10d8', class: { [`pds-container--${this.size}`]: isNamed }, style: Object.keys(hostStyle).length ? hostStyle : undefined }, hAsync(Tag, { key: '55fb22be49377c4cccf08381e7cf954a3f097d08', part: "container" }, hAsync("slot", { key: '4cd9c4fa74a2c6a056e076ab67a0279c395b5c79' }))));
13504
13799
  }
13505
13800
  static get style() { return pdsContainerCss(); }
13506
13801
  static get cmpMeta() { return {
@@ -13620,7 +13915,7 @@ class PdsCopytext {
13620
13915
  render() {
13621
13916
  const hostClass = this.classNames();
13622
13917
  this.hostKeeper.record(hostClass);
13623
- return (hAsync(Host, { key: '1c43941f808f58a53f1c445e0f5693985c793c35', class: hostClass, id: this.componentId }, hAsync("pds-button", { key: 'd771d2587a11f1b27bded17b5df5e649ea93cd90', type: "button", variant: "unstyled", onClick: this.handleClick }, hAsync("span", { key: '0d4fd25220cac636b328fd1ee1aba40d07296265', ref: (el) => this.valueSpanEl = el }, this.value), hAsync("pds-icon", { key: '832a044c10843bb90833301cc3f3ea1f7b755f42', "aria-hidden": "true", icon: copy, size: "16px" }))));
13918
+ return (hAsync(Host, { key: 'd9bd40af6e435d606841cb551341eab33c5983b7', class: hostClass, id: this.componentId }, hAsync("pds-button", { key: '7a42b32678fccb2cbe0d7a68a5da6d5fe5276a4a', type: "button", variant: "unstyled", onClick: this.handleClick }, hAsync("span", { key: '732db283b8075ebad8e1daff70692bac2978aade', ref: (el) => this.valueSpanEl = el }, this.value), hAsync("pds-icon", { key: 'ebfd34b9b5a47b78783302ce97d752af09e3f3e3', "aria-hidden": "true", icon: copy, size: "16px" }))));
13624
13919
  }
13625
13920
  get el() { return getElement(this); }
13626
13921
  static get watchers() { return {
@@ -15622,14 +15917,14 @@ class PdsDatepicker {
15622
15917
  }
15623
15918
  render() {
15624
15919
  const locale = this.resolvedLocale;
15625
- return (hAsync(Host, { key: 'a761f0ca6eeedcac3e4bd90760aa9781cd37dcdc', class: { 'pds-datepicker--range': this.range, 'pds-datepicker--time': this.timePicker }, "full-width": this.fullWidth ? 'true' : null, onFocusin: this.onHostFocusIn, onFocusout: this.onHostFocusOut }, hAsync("pds-input", { key: '2eb04f9fd4e2f7a2437145d250c629c2cc8a0bf6', ref: (el) => (this.inputEl = el), componentId: this.baseId, label: this.label, hideLabel: this.hideLabel, helperMessage: this.helperMessage, errorMessage: this.errorMessage, invalid: this.invalid || !!this.textError || !!this.valueError(), disabled: this.disabled, readonly: this.readonly, required: this.required, placeholder: this.fieldPlaceholder, fullWidth: this.fullWidth, autocomplete: "off", value: this.text, onClick: this.onFieldClick, onPdsInput: this.onTextInput, onPdsChange: this.onTextChange, onPdsKeyDown: this.onTextKeyDown, onPdsFocus: this.stopInnerEvent, onPdsBlur: this.stopInnerEvent }, this.clearable && !!this.value && this.isInteractive && (hAsync("button", {
15920
+ return (hAsync(Host, { key: '82ffd88b7741a90edc28b66a7384178eb2a9a86c', class: { 'pds-datepicker--range': this.range, 'pds-datepicker--time': this.timePicker }, "full-width": this.fullWidth ? 'true' : null, onFocusin: this.onHostFocusIn, onFocusout: this.onHostFocusOut }, hAsync("pds-input", { key: 'f2b9aad64d1fe8d94327cc3d4f87cd6904eb3076', ref: (el) => (this.inputEl = el), componentId: this.baseId, label: this.label, hideLabel: this.hideLabel, helperMessage: this.helperMessage, errorMessage: this.errorMessage, invalid: this.invalid || !!this.textError || !!this.valueError(), disabled: this.disabled, readonly: this.readonly, required: this.required, placeholder: this.fieldPlaceholder, fullWidth: this.fullWidth, autocomplete: "off", value: this.text, onClick: this.onFieldClick, onPdsInput: this.onTextInput, onPdsChange: this.onTextChange, onPdsKeyDown: this.onTextKeyDown, onPdsFocus: this.stopInnerEvent, onPdsBlur: this.stopInnerEvent }, this.clearable && !!this.value && this.isInteractive && (hAsync("button", {
15626
15921
  // Keyed, as is the calendar button: when Clear appears after a pick, the focused
15627
15922
  // calendar button must stay that button rather than be reused as Clear.
15628
15923
  key: "clear", slot: "suffix", type: "button", class: "pds-datepicker__clear", ref: (el) => (this.clearEl = el), "aria-label": this.label ? `${this.clearLabel} ${this.label}` : this.clearLabel,
15629
15924
  // Out of the tab order, as a native search field's clear button is: Tab from a field
15630
15925
  // just emptied would land on it as the change removes it, dropping focus to the page.
15631
15926
  tabindex: "-1", onMouseDown: this.onClearMouseDown, onClick: this.onClearClick
15632
- }, hAsync("pds-icon", { key: '98c325fbba8ea78b2d409bc77099db3206738508', icon: remove, "aria-hidden": "true" }))), hAsync("button", { key: "trigger", slot: "suffix", type: "button", class: "pds-datepicker__trigger", ref: (el) => (this.triggerEl = el), "aria-label": this.triggerAccessibleName(locale), "aria-haspopup": "dialog", "aria-expanded": this.isOpen ? 'true' : 'false', disabled: !this.isInteractive, onClick: this.onTriggerClick, onKeyDown: this.onTriggerKeyDown }, hAsync("pds-icon", { key: 'cb8483febe1b485058b7bb4271b749981a7747a1', icon: calendarSimple, "aria-hidden": "true" }))), this.isOpen && this.renderCalendar(locale)));
15927
+ }, hAsync("pds-icon", { key: 'f2c784e9d6577d4900b7641ee58aa43f5922fc75', icon: remove, "aria-hidden": "true" }))), hAsync("button", { key: "trigger", slot: "suffix", type: "button", class: "pds-datepicker__trigger", ref: (el) => (this.triggerEl = el), "aria-label": this.triggerAccessibleName(locale), "aria-haspopup": "dialog", "aria-expanded": this.isOpen ? 'true' : 'false', disabled: !this.isInteractive, onClick: this.onTriggerClick, onKeyDown: this.onTriggerKeyDown }, hAsync("pds-icon", { key: '98b2e773240c8ea2bbd5a1acfa3c9ba74cb7917b', icon: calendarSimple, "aria-hidden": "true" }))), this.isOpen && this.renderCalendar(locale)));
15633
15928
  }
15634
15929
  static get formAssociated() { return true; }
15635
15930
  get el() { return getElement(this); }
@@ -15771,7 +16066,7 @@ class PdsDivider {
15771
16066
  return classNames.join(' ');
15772
16067
  }
15773
16068
  render() {
15774
- return (hAsync(Host, { key: '072cc8552bd33c4a00d216f15a5a848cfc97fd92', id: this.componentId }, this.hasLabel ? (hAsync("div", { class: this.classNames(), role: "separator", "aria-label": this.label }, hAsync("span", { class: "pds-divider__label", part: "label", "aria-hidden": "true" }, this.label))) : (hAsync("hr", { class: this.classNames() }))));
16069
+ return (hAsync(Host, { key: 'ef2a5ee85e8f37036be5b8df490683636ffb66f0', id: this.componentId }, this.hasLabel ? (hAsync("div", { class: this.classNames(), role: "separator", "aria-label": this.label }, hAsync("span", { class: "pds-divider__label", part: "label", "aria-hidden": "true" }, this.label))) : (hAsync("hr", { class: this.classNames() }))));
15775
16070
  }
15776
16071
  static get style() { return pdsDividerCss(); }
15777
16072
  static get cmpMeta() { return {
@@ -15815,22 +16110,24 @@ function unwrapReconnectedContent(container, selector, contentSelector) {
15815
16110
  }
15816
16111
  }
15817
16112
 
15818
- const pdsDrawerCss = () => `.pds-drawer__modal>.pds-modal__backdrop{-ms-flex-align:stretch;align-items:stretch;background-color:transparent;pointer-events:none}@supports ((-webkit-backdrop-filter: blur(3px)) or (backdrop-filter: blur(3px))){.pds-drawer__modal>.pds-modal__backdrop{-webkit-backdrop-filter:none;backdrop-filter:none}}.pds-drawer__modal>.pds-modal__backdrop[aria-modal]::before{content:none}.pds-drawer__modal>.pds-modal__backdrop>.pds-modal{border-radius:0;height:100%;margin:0;max-height:100%;max-width:100%;pointer-events:auto;width:var(--pds-drawer-width, 500px)}.pds-drawer{display:contents}.pds-drawer.pds-drawer--end .pds-drawer__modal>.pds-modal__backdrop{-ms-flex-pack:end;justify-content:flex-end}.pds-drawer.pds-drawer--start .pds-drawer__modal>.pds-modal__backdrop{-ms-flex-pack:start;justify-content:flex-start}.pds-drawer.pds-drawer--sm{--pds-drawer-width:360px}.pds-drawer.pds-drawer--md{--pds-drawer-width:500px}`;
16113
+ const pdsDrawerCss = () => `.pds-drawer__modal>.pds-modal__backdrop{-ms-flex-align:stretch;align-items:stretch}.pds-drawer__modal:not(.pds-drawer__modal--modal)>.pds-modal__backdrop{background-color:transparent;pointer-events:none}@supports ((-webkit-backdrop-filter: blur(3px)) or (backdrop-filter: blur(3px))){.pds-drawer__modal:not(.pds-drawer__modal--modal)>.pds-modal__backdrop{-webkit-backdrop-filter:none;backdrop-filter:none}}.pds-drawer__modal>.pds-modal__backdrop[aria-modal]::before{content:none}.pds-drawer__modal>.pds-modal__backdrop>.pds-modal{border-radius:0;height:100%;margin:0;max-height:100%;max-width:100%;pointer-events:auto;width:var(--pds-drawer-width, 500px)}.pds-drawer{display:contents}.pds-drawer.pds-drawer--end .pds-drawer__modal>.pds-modal__backdrop{-ms-flex-pack:end;justify-content:flex-end}.pds-drawer.pds-drawer--start .pds-drawer__modal>.pds-modal__backdrop{-ms-flex-pack:start;justify-content:flex-start}.pds-drawer.pds-drawer--sm{--pds-drawer-width:360px}.pds-drawer.pds-drawer--md{--pds-drawer-width:500px}`;
15819
16114
 
15820
- // Known selectors for content Pine components portal to document.body rather
15821
- // than rendering in place — pds-popover, pds-tooltip, pds-combobox's dropdown.
16115
+ // Known selectors for content Pine components portal out of place rather than
16116
+ // rendering where they are — pds-tooltip and pds-combobox's dropdown in
16117
+ // document.body, pds-popover in the body or the open dialog it's in.
15822
16118
  // A pointerdown landing on one of these is not "outside" the drawer in the
15823
16119
  // sense light dismiss cares about: it belongs to an overlay something inside
15824
16120
  // the drawer opened, even though it is not a DOM descendant of the drawer.
15825
16121
  const PORTALED_OVERLAY_SELECTOR = '.pds-popover, .pds-tooltip, .pds-combobox-dropdown-portal';
15826
16122
  /**
15827
- * A non-modal side panel composed from `pds-modal`.
16123
+ * A side panel composed from `pds-modal`, non-modal by default.
15828
16124
  *
15829
- * Unlike `pds-modal`, the page stays interactive while a drawer is open: no
15830
- * dimming, no blur, no scroll lock, no click blocking. `pds-drawer` renders a
15831
- * `pds-modal` internally with `disableTopLayer` always on and its backdrop
15832
- * suppressed, and adds the edge, width and dismiss behavior a side panel
15833
- * needs on top. It does not reimplement focus, Escape or dialog semantics —
16125
+ * By default, unlike `pds-modal`, the page stays interactive while a drawer
16126
+ * is open: no dimming, no blur, no scroll lock, no click blocking.
16127
+ * `pds-drawer` renders a `pds-modal` internally with `disableTopLayer` on and
16128
+ * its backdrop suppressed, and adds the edge, width and dismiss behavior a
16129
+ * side panel needs on top. With `modal`, it opens that `pds-modal` in the top
16130
+ * layer instead and keeps its backdrop. It does not reimplement focus, Escape or dialog semantics —
15834
16131
  * those come from `pds-modal` unchanged.
15835
16132
  * @lightDom renders-markup
15836
16133
  */
@@ -15861,8 +16158,18 @@ class PdsDrawer {
15861
16158
  */
15862
16159
  this.scrollable = true;
15863
16160
  /**
15864
- * Whether the drawer can be dismissed with a pointerdown outside it.
15865
- * Replaces `pds-modal`'s `backdropDismiss` — there is no backdrop to click.
16161
+ * Whether the drawer is modal. A modal drawer dims the page behind it with a
16162
+ * backdrop, makes the page inert, and keeps focus inside the drawer, like
16163
+ * `pds-modal`. Use it for a task the page should wait on. Leave it off for a
16164
+ * panel people work alongside the page. Read when the drawer opens; changing
16165
+ * it while the drawer is open is not supported.
16166
+ * @default false
16167
+ */
16168
+ this.modal = false;
16169
+ /**
16170
+ * Whether the drawer can be dismissed with a pointerdown outside it (in a
16171
+ * `modal` drawer, a click on its backdrop).
16172
+ * Replaces `pds-modal`'s `backdropDismiss`.
15866
16173
  * This also gates Escape, matching how `backdropDismiss` gates Escape on
15867
16174
  * `pds-modal` today: setting this to `false` means the close button is the
15868
16175
  * only way out.
@@ -15881,7 +16188,8 @@ class PdsDrawer {
15881
16188
  * background event while the user is mid-task elsewhere on the page —
15882
16189
  * moving focus there would interrupt them, and the page stays live under
15883
16190
  * a non-modal drawer, so it is a genuine data-entry risk, not just an
15884
- * annoyance.
16191
+ * annoyance. A `modal` drawer ignores `none`: the page behind it is inert,
16192
+ * so focus starts in the drawer.
15885
16193
  * @default 'auto'
15886
16194
  */
15887
16195
  this.initialFocus = 'auto';
@@ -15927,7 +16235,8 @@ class PdsDrawer {
15927
16235
  // page underneath stays genuinely clickable, which means a click there
15928
16236
  // never reaches pds-modal's backdrop element at all.
15929
16237
  handleOutsidePointerDown(e) {
15930
- if (!this.lightDismiss || !this.open)
16238
+ // A modal drawer's backdrop takes the click instead, through pds-modal.
16239
+ if (this.modal || !this.lightDismiss || !this.open)
15931
16240
  return;
15932
16241
  const target = e.target;
15933
16242
  if (!target)
@@ -15937,7 +16246,7 @@ class PdsDrawer {
15937
16246
  if (target.closest(PORTALED_OVERLAY_SELECTOR))
15938
16247
  return;
15939
16248
  // A datepicker's portaled calendar counts as inside only when its datepicker is in the drawer,
15940
- // or in an overlay portaled from it (a pds-popover in the drawer puts its content on the body).
16249
+ // or in an overlay portaled from it (a pds-popover in the drawer puts its content beside it).
15941
16250
  const calendar = target.closest('.pds-datepicker-calendar-portal');
15942
16251
  const owner = calendar === null || calendar === void 0 ? void 0 : calendar.pdsDatepicker;
15943
16252
  if (owner && (containsComposed$1(this.el, owner) || closest$1(PORTALED_OVERLAY_SELECTOR, owner)))
@@ -15953,11 +16262,11 @@ class PdsDrawer {
15953
16262
  this.open = false;
15954
16263
  }
15955
16264
  render() {
15956
- return (hAsync(Host, { key: '166bc90b45d29f64f11b6840e7c6ae798bf14261', class: {
16265
+ return (hAsync(Host, { key: '287bf043c991209488eb1b617031acffb59ff9af', class: {
15957
16266
  'pds-drawer': true,
15958
16267
  [`pds-drawer--${this.side}`]: true,
15959
16268
  [`pds-drawer--${this.size}`]: true,
15960
- } }, hAsync("pds-modal", { key: '2faa1cee1f34a85e9df0cabb8e78803982414982', class: "pds-drawer__modal", ref: (el) => (this.modalEl = el), componentId: this.componentId, open: this.open, scrollable: this.scrollable, disableTopLayer: true, backdropDismiss: this.lightDismiss, disableInitialFocus: this.initialFocus === 'none' }, hAsync("slot", { key: '93968e612756c398f6d1faf9383f6c88c420da28' }))));
16269
+ } }, hAsync("pds-modal", { key: 'cd86fb552353f5cc12fb36fc956033432a91847c', class: { 'pds-drawer__modal': true, 'pds-drawer__modal--modal': this.modal }, ref: (el) => (this.modalEl = el), componentId: this.componentId, open: this.open, scrollable: this.scrollable, disableTopLayer: !this.modal, backdropDismiss: this.lightDismiss, disableInitialFocus: !this.modal && this.initialFocus === 'none' }, hAsync("slot", { key: '56bbe9b5c26b10b07c0f503ba147899a57a5de85' }))));
15961
16270
  }
15962
16271
  get el() { return getElement(this); }
15963
16272
  static get style() { return pdsDrawerCss(); }
@@ -15970,6 +16279,7 @@ class PdsDrawer {
15970
16279
  "side": [1],
15971
16280
  "size": [1],
15972
16281
  "scrollable": [4],
16282
+ "modal": [4],
15973
16283
  "lightDismiss": [4, "light-dismiss"],
15974
16284
  "initialFocus": [1, "initial-focus"]
15975
16285
  },
@@ -15997,7 +16307,7 @@ class PdsDrawerContent {
15997
16307
  unwrapReconnectedContent(this.el.querySelector('.pds-drawer-content'), '.pds-drawer-content');
15998
16308
  }
15999
16309
  render() {
16000
- return (hAsync("div", { key: 'b15b087506c1292f9d67e531e8d935069749c09d', class: "pds-drawer-content" }, hAsync("slot", { key: '9c60ca75c7905e7e994f9c41eee213b962afb833' })));
16310
+ return (hAsync("div", { key: 'f307939ab0a94f6a0d8a3675c658def0ded68b98', class: "pds-drawer-content" }, hAsync("slot", { key: 'dadac08ac15bb8ded98ea982511e2d57bea9bdca' })));
16001
16311
  }
16002
16312
  get el() { return getElement(this); }
16003
16313
  static get style() { return pdsDrawerContentCss(); }
@@ -16025,7 +16335,7 @@ class PdsDrawerFooter {
16025
16335
  unwrapReconnectedContent(this.el.querySelector('.pds-drawer__footer'), '.pds-drawer__footer');
16026
16336
  }
16027
16337
  render() {
16028
- return (hAsync("footer", { key: 'a4eec0aff617c605b94f8d3b9ec1e2d98cded6fb', class: "pds-drawer__footer" }, hAsync("slot", { key: '6dc379c940e37edfd05d99728be9dff58ca1d717' })));
16338
+ return (hAsync("footer", { key: 'b58c68d88b467e8baa3682d16f97076d06ea2414', class: "pds-drawer__footer" }, hAsync("slot", { key: 'ff2306202c14029b397d40b5bb3d672a8aa571c0' })));
16029
16339
  }
16030
16340
  get el() { return getElement(this); }
16031
16341
  static get style() { return pdsDrawerFooterCss(); }
@@ -16053,7 +16363,7 @@ class PdsDrawerHeader {
16053
16363
  unwrapReconnectedContent(this.el.querySelector('.pds-drawer__header'), '.pds-drawer__header');
16054
16364
  }
16055
16365
  render() {
16056
- return (hAsync("header", { key: '6b9338e5dbf7a7e580c11b28c95ca53693528382', class: "pds-drawer__header" }, hAsync("slot", { key: '0990fbcf94c0c438b98cf1e8945f1e2fd9aa33dc' })));
16366
+ return (hAsync("header", { key: '280e6ca734317d5733e4c595431c8070eff13d58', class: "pds-drawer__header" }, hAsync("slot", { key: 'cc6af6084600c4dc60d7bd99e040376abdf5ffe3' })));
16057
16367
  }
16058
16368
  get el() { return getElement(this); }
16059
16369
  static get style() { return pdsDrawerHeaderCss(); }
@@ -16067,9 +16377,10 @@ class PdsDrawerHeader {
16067
16377
  }; }
16068
16378
  }
16069
16379
 
16070
- const pdsDropdownMenuCss = () => `:host{display:block}.is-hidden{display:none}.pds-dropdown-menu--panel{background-color:var(--pine-color-background-overlay);border-radius:var(--pine-dimension-xs);left:var(--pine-dimension-none);min-width:170px;padding:var(--pine-dimension-xs);position:fixed;z-index:var(--pine-z-index-overlay)}:host-context([data-theme=dark]) .pds-dropdown-menu--panel{border:var(--pine-border)}::slotted(a),::slotted(button){-ms-flex-align:center;align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;border-radius:var(--pine-dimension-xs) !important;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--pine-color-text) !important;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;font:var(--pine-typography-body-medium) !important;gap:var(--pine-dimension-xs);margin:calc(var(--pine-border-width) + 2px) !important;padding:var(--pine-dimension-xs) !important;text-align:start;text-decoration:none !important;width:calc(100% - (var(--pine-border-width) + 2px) * 2)}::slotted(.destructive){color:var(--pine-color-danger) !important}::slotted([aria-disabled=true]),::slotted([disabled]:not([disabled=false])){cursor:not-allowed;opacity:0.5;pointer-events:none}`;
16380
+ const pdsDropdownMenuCss = () => `:host{display:block}.is-hidden{display:none}.pds-dropdown-menu--panel{background-color:var(--pine-color-background-overlay);border-radius:var(--pine-dimension-xs);left:var(--pine-dimension-none);min-width:170px;padding:var(--pine-dimension-xs);position:fixed;z-index:var(--pine-z-index-overlay)}:host-context([data-theme=dark]) .pds-dropdown-menu--panel{border:var(--pine-border)}.pds-dropdown-menu__header{-webkit-border-after:var(--pine-border-width-thin) solid var(--pine-color-border);border-block-end:var(--pine-border-width-thin) solid var(--pine-color-border);-webkit-margin-after:var(--pine-dimension-xs);margin-block-end:var(--pine-dimension-xs);margin-inline:calc(var(--pine-dimension-xs) * -1);-webkit-padding-after:var(--pine-dimension-xs);padding-block-end:var(--pine-dimension-xs);padding-inline:calc(var(--pine-dimension-xs) * 2 + var(--pine-border-width) + 2px);text-align:start}.pds-dropdown-menu__items{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}::slotted(a:not([slot=header])),::slotted(button:not([slot=header])){-ms-flex-align:center;align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;border-radius:var(--pine-dimension-xs) !important;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--pine-color-text) !important;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;font:var(--pine-typography-body-medium) !important;gap:var(--pine-dimension-xs);margin:calc(var(--pine-border-width) + 2px) !important;padding:var(--pine-dimension-xs) !important;text-align:start;text-decoration:none !important;width:calc(100% - (var(--pine-border-width) + 2px) * 2)}::slotted(.destructive:not([slot=header])){color:var(--pine-color-danger) !important}::slotted([aria-disabled=true]:not([slot=header])),::slotted([disabled]:not([disabled=false]):not([slot=header])){cursor:not-allowed;opacity:0.5;pointer-events:none}`;
16071
16381
 
16072
16382
  /**
16383
+ * @slot header - Non-interactive content displayed above the menu items inside the dropdown panel. It renders outside the menu role, so assistive tech reads it as plain content rather than as a menu item.
16073
16384
  * @part menu-panel - Exposes the dropdown menu container for styling.
16074
16385
  */
16075
16386
  class PdsDropdownMenu {
@@ -16080,6 +16391,7 @@ class PdsDropdownMenu {
16080
16391
  this.cleanupAutoUpdate = null;
16081
16392
  this.triggerObserver = null;
16082
16393
  this.currentFocusIndex = -1;
16394
+ this.hasHeader = false;
16083
16395
  /**
16084
16396
  * The placement of the dropdown panel relative to the trigger.
16085
16397
  */
@@ -16098,8 +16410,11 @@ class PdsDropdownMenu {
16098
16410
  // Writes the trigger's ARIA from the menu's state, so the observer's own callback doesn't loop.
16099
16411
  this.syncTriggerAria = () => {
16100
16412
  if (!this.triggerEl)
16101
- return;
16102
- setAttributesIfChanged(this.triggerEl, { 'aria-haspopup': 'menu', 'aria-expanded': String(this.isOpen) });
16413
+ return false;
16414
+ return setAttributesIfChanged(this.triggerEl, { 'aria-haspopup': 'menu', 'aria-expanded': String(this.isOpen) });
16415
+ };
16416
+ this.handleHeaderSlotChange = (event) => {
16417
+ this.hasHeader = event.target.assignedElements().length > 0;
16103
16418
  };
16104
16419
  this.handleSlotChange = (event) => {
16105
16420
  this.slotEl = event.target;
@@ -16178,6 +16493,9 @@ class PdsDropdownMenu {
16178
16493
  this.toggleDropdown();
16179
16494
  };
16180
16495
  }
16496
+ componentWillLoad() {
16497
+ this.hasHeader = Array.from(this.host.children).some(el => el.getAttribute('slot') === 'header');
16498
+ }
16181
16499
  componentDidRender() {
16182
16500
  var _a;
16183
16501
  this.panelEl = (_a = this.host.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('pds-box');
@@ -16206,7 +16524,8 @@ class PdsDropdownMenu {
16206
16524
  this.triggerObserver = null;
16207
16525
  if (!this.triggerEl || typeof MutationObserver === 'undefined')
16208
16526
  return;
16209
- this.triggerObserver = new MutationObserver(this.syncTriggerAria);
16527
+ // Capped against a script that keeps undoing it; opening and closing still write it directly.
16528
+ this.triggerObserver = new MutationObserver(limitRestores(this.syncTriggerAria, 'pds-dropdown-menu: stopped restoring its trigger ARIA, as another script keeps changing it. It may be wrong until the menu opens or closes.', this.triggerEl));
16210
16529
  this.triggerObserver.observe(this.triggerEl, {
16211
16530
  attributes: true,
16212
16531
  attributeFilter: ['aria-haspopup', 'aria-expanded'],
@@ -16312,15 +16631,19 @@ class PdsDropdownMenu {
16312
16631
  this.focusItemByIndex(prevIndex);
16313
16632
  }
16314
16633
  }
16634
+ // Escape is taken in document's capture phase, before a modal around the menu hears it on
16635
+ // document and closes too.
16636
+ handleEscapeKeyDown(event) {
16637
+ if (!this.isOpen || event.key !== 'Escape' || event.defaultPrevented)
16638
+ return;
16639
+ event.preventDefault();
16640
+ this.closeDropdown();
16641
+ }
16315
16642
  // Handle keyboard events for the dropdown
16316
16643
  handleKeyDown(event) {
16317
16644
  if (!this.isOpen)
16318
16645
  return;
16319
16646
  switch (event.key) {
16320
- case 'Escape':
16321
- event.preventDefault();
16322
- this.closeDropdown();
16323
- break;
16324
16647
  case 'ArrowDown':
16325
16648
  event.preventDefault();
16326
16649
  this.focusNextItem();
@@ -16412,7 +16735,7 @@ class PdsDropdownMenu {
16412
16735
  }
16413
16736
  }
16414
16737
  render() {
16415
- return (hAsync(Host, { key: '9d67972cf15c22bc666c32b86dcd8f143160ee0a', id: this.componentId }, hAsync("slot", { key: 'e9cbc0612ce0e8c2bf55e1dc7930eda075fcc173', name: "trigger", onSlotchange: this.handleTriggerSlotChange }), hAsync("pds-box", { key: '6fed3f11cf962a97f8ebb3cc69bd76efb425c464', "border-radius": "sm", display: "flex", direction: "column", class: "pds-dropdown-menu--panel is-hidden", shadow: "100", role: "menu", "aria-orientation": "vertical", part: "menu-panel" }, hAsync("slot", { key: 'b8757512713b913f3ee56d9518897e7ed3c3b830', onSlotchange: this.handleSlotChange }))));
16738
+ return (hAsync(Host, { key: '18dac4d59ea236fe171f4c16f6571cb1547059c6', id: this.componentId }, hAsync("slot", { key: '95201a75a33ccb70dbd51a5cf9d78c76ebf26f65', name: "trigger", onSlotchange: this.handleTriggerSlotChange }), hAsync("pds-box", { key: '7fc588f40f607ad81ad70bf74a525d078d32a80b', "border-radius": "sm", display: "flex", direction: "column", class: "pds-dropdown-menu--panel is-hidden", shadow: "100", part: "menu-panel" }, hAsync("div", { key: '73d13d94edccb68db7b703f930b50f729334efa8', class: { 'pds-dropdown-menu__header': true, 'is-hidden': !this.hasHeader } }, hAsync("slot", { key: '7066f3a6f71c8961326f38f0509f1c0cc17098ae', name: "header", onSlotchange: this.handleHeaderSlotChange })), hAsync("div", { key: '9f07ec488b688c58c6422b575015ccd364075fe8', class: "pds-dropdown-menu__items", role: "menu", "aria-orientation": "vertical" }, hAsync("slot", { key: 'd0aad3f9ac3b58779669411523adbb8878dec61c', onSlotchange: this.handleSlotChange })))));
16416
16739
  }
16417
16740
  get host() { return getElement(this); }
16418
16741
  static get style() { return pdsDropdownMenuCss(); }
@@ -16422,9 +16745,10 @@ class PdsDropdownMenu {
16422
16745
  "$members$": {
16423
16746
  "componentId": [1, "component-id"],
16424
16747
  "placement": [1],
16425
- "currentFocusIndex": [32]
16748
+ "currentFocusIndex": [32],
16749
+ "hasHeader": [32]
16426
16750
  },
16427
- "$listeners$": [[8, "keydown", "handleKeyDown"], [8, "click", "handleWindowClick"]],
16751
+ "$listeners$": [[6, "keydown", "handleEscapeKeyDown"], [8, "keydown", "handleKeyDown"], [8, "click", "handleWindowClick"]],
16428
16752
  "$lazyBundleId$": "-",
16429
16753
  "$attrsToReflect$": []
16430
16754
  }; }
@@ -16507,7 +16831,7 @@ class PdsDropdownMenuItem {
16507
16831
  }, tabIndex: this.disabled ? -1 : 0, type: "button", part: "button", onKeyDown: this.handleKeyDown, onFocus: this.handleFocus, onBlur: this.handleBlur, disabled: this.disabled, "aria-disabled": this.disabled ? 'true' : null }, hAsync("slot", null)));
16508
16832
  }
16509
16833
  render() {
16510
- return (hAsync(Host, { key: 'cf22f97df3869d59820ba0deff9a21bfee2628b8', id: this.componentId, class: { 'is-disabled': this.disabled, 'destructive': !this.disabled && this.destructive }, onClick: () => !this.disabled && this.handleClick(), role: "none", tabIndex: -1, "aria-disabled": this.disabled ? 'true' : null }, this.renderElement()));
16834
+ return (hAsync(Host, { key: '33bd645d7c9547e3fd07429cf795302e6a482296', id: this.componentId, class: { 'is-disabled': this.disabled, 'destructive': !this.disabled && this.destructive }, onClick: () => !this.disabled && this.handleClick(), role: "none", tabIndex: -1, "aria-disabled": this.disabled ? 'true' : null }, this.renderElement()));
16511
16835
  }
16512
16836
  get host() { return getElement(this); }
16513
16837
  static get style() { return pdsDropdownMenuItemCss(); }
@@ -16543,7 +16867,7 @@ class PdsDropdownMenuSeparator {
16543
16867
  this.disabled = false;
16544
16868
  }
16545
16869
  render() {
16546
- return (hAsync(Host, { key: '63bd5fd3112b1030d1e86b331a659ab3a92dd387', id: this.componentId }, hAsync("hr", { key: '0a8504d34a9b91db03abdddd86ce918c00534410' })));
16870
+ return (hAsync(Host, { key: '60407a2edc8b4667d39cbd1ba9a859d09b0b8ff1', id: this.componentId }, hAsync("hr", { key: '8485d1c8508c5fe5e3635505f25e278f45f45b82' })));
16547
16871
  }
16548
16872
  static get style() { return pdsDropdownMenuSeparatorCss(); }
16549
16873
  static get cmpMeta() { return {
@@ -17123,7 +17447,7 @@ class PdsFilter {
17123
17447
  return null;
17124
17448
  }
17125
17449
  render() {
17126
- return (hAsync(Host, { key: '4abb55453c9ab4cd49b21a23047aa5ee4ab70056', id: this.componentId }, hAsync("button", { key: 'e6b6bd81ca3f9d23f490219cf8e81f0bdf511798', class: this.getTriggerClasses(), type: "button", popoverTarget: this.variant !== 'clear' ? `${this.componentId}-popover` : undefined, popoverTargetAction: this.variant !== 'clear' ? 'toggle' : undefined, onKeyDown: this.variant === 'clear' ? this.handleKeyDown : undefined, onClick: (event) => this.handleClick(event), part: "button", "aria-expanded": this.isOpen ? 'true' : 'false', "aria-haspopup": this.variant !== 'clear' ? 'true' : undefined, "aria-controls": this.variant !== 'clear' ? `${this.componentId}-popover` : undefined }, hAsync("span", { key: '4cea081451f50508cef36e90d4c88cbd94933287', class: "pds-filter__button-content", part: "button-content" }, this.renderIcon(), this.text && (hAsync("span", { key: '479f84087e7969fa555475b240f5e70ce5bcf136', class: "pds-filter__button-text", part: "button-text" }, this.text)), this.renderDropdownIcon())), this.variant !== 'clear' && (hAsync("div", { key: '85aec3d5d7b33a0cfb3602412238830929902eb1', ref: el => this.popoverEl = el, id: `${this.componentId}-popover`, class: "pds-filter__popover", popover: "auto", part: "popover" }, hAsync("slot", { key: 'ede4c3866bfdce974e0d21c6e6a3ae22aee47d2c' })))));
17450
+ return (hAsync(Host, { key: '3cae951aee1f9c75f3e207cf6c68633a23f8f6dc', id: this.componentId }, hAsync("button", { key: 'f4c644710dc936248995be9a49cef8ad13031d61', class: this.getTriggerClasses(), type: "button", popoverTarget: this.variant !== 'clear' ? `${this.componentId}-popover` : undefined, popoverTargetAction: this.variant !== 'clear' ? 'toggle' : undefined, onKeyDown: this.variant === 'clear' ? this.handleKeyDown : undefined, onClick: (event) => this.handleClick(event), part: "button", "aria-expanded": this.isOpen ? 'true' : 'false', "aria-haspopup": this.variant !== 'clear' ? 'true' : undefined, "aria-controls": this.variant !== 'clear' ? `${this.componentId}-popover` : undefined }, hAsync("span", { key: '2dd87e53f363118becc762051ea1be664258b8b6', class: "pds-filter__button-content", part: "button-content" }, this.renderIcon(), this.text && (hAsync("span", { key: '733ceb5e07198e844fbdc1af294d2046c4c571d8', class: "pds-filter__button-text", part: "button-text" }, this.text)), this.renderDropdownIcon())), this.variant !== 'clear' && (hAsync("div", { key: 'beb65a21192c6f5c16703aec7ab9a92ea378ef3c', ref: el => this.popoverEl = el, id: `${this.componentId}-popover`, class: "pds-filter__popover", popover: "auto", part: "popover" }, hAsync("slot", { key: '5a481cc6b143b059a5fc33d377abe5ab79aefb4e' })))));
17127
17451
  }
17128
17452
  get el() { return getElement(this); }
17129
17453
  static get style() { return pdsFilterCss(); }
@@ -17155,7 +17479,7 @@ class PdsFilters {
17155
17479
  registerInstance(this, hostRef);
17156
17480
  }
17157
17481
  render() {
17158
- return (hAsync(Host, { key: '5587c41a5ca93cc48399d7c1af0762d4a3516b4d', id: this.componentId }, hAsync("div", { key: '43ee499b9c3f49b52cf18beee8ac5cf97b8ad49a', class: "pds-filters" }, hAsync("slot", { key: '79a452042d7aa7e0492d80fd773f71fb820c2211' }))));
17482
+ return (hAsync(Host, { key: '8688235fe7cdea1b4fc540156ff21bb9711b41b6', id: this.componentId }, hAsync("div", { key: 'e51a37977df8c31f99b28d8c7e4bedb0d63e53c6', class: "pds-filters" }, hAsync("slot", { key: '8ce936da4d3f0213408090bc3eeb011920f9aa6c' }))));
17159
17483
  }
17160
17484
  static get style() { return pdsFiltersCss(); }
17161
17485
  static get cmpMeta() { return {
@@ -17284,6 +17608,28 @@ const isRTL = (hostEl) => {
17284
17608
  const isSrc = (str) => str.length > 0 && /(\/|\.)/.test(str);
17285
17609
  const isStr = (val) => typeof val === 'string'; // eslint-disable-line @typescript-eslint/no-explicit-any
17286
17610
  const toLower = (val) => val.toLowerCase();
17611
+ /**
17612
+ * Normalizes a color value for use as a CSS custom property value: a bare
17613
+ * design token (--pine-color-foo) is wrapped in var(...), an already-wrapped
17614
+ * var(--token) is passed through unchanged, and anything else (a literal CSS
17615
+ * color, or currentColor) is passed through as-is. Mirrors the equivalent
17616
+ * utility in the `pine` repo's `libs/core/src/utils/utils.ts`
17617
+ * (`normalizeColorValue`) — duplicated here rather than imported because
17618
+ * `@pine-ds/core` already depends on `@pine-ds/icons`, so the reverse
17619
+ * dependency would be circular.
17620
+ */
17621
+ const normalizeColorValue = (value) => {
17622
+ if (!isStr(value))
17623
+ return undefined;
17624
+ const trimmed = value.trim();
17625
+ if (trimmed === '')
17626
+ return undefined;
17627
+ if (trimmed.startsWith('var('))
17628
+ return trimmed;
17629
+ if (trimmed.startsWith('--'))
17630
+ return `var(${trimmed})`;
17631
+ return trimmed;
17632
+ };
17287
17633
  /**
17288
17634
  * Elements inside of web components sometimes need to inherit global attributes
17289
17635
  * set on the host. For example, the inner input in `pds-input` should inherit
@@ -17445,9 +17791,10 @@ class PdsIcon {
17445
17791
  this.setupInitialAriaLabel();
17446
17792
  }
17447
17793
  setCSSVariables() {
17794
+ var _a;
17448
17795
  this.el.style.setProperty(`--dimension-icon-height`, this.iconSize());
17449
17796
  this.el.style.setProperty(`--dimension-icon-width`, this.iconSize());
17450
- this.el.style.setProperty(`--color-icon-fill`, typeof this.color !== 'undefined' ? this.color : 'currentColor');
17797
+ this.el.style.setProperty(`--color-icon-fill`, (_a = normalizeColorValue(this.color)) !== null && _a !== void 0 ? _a : 'currentColor');
17451
17798
  }
17452
17799
  connectedCallback() {
17453
17800
  // Handle re-connection during client-side navigation
@@ -17492,7 +17839,7 @@ class PdsIcon {
17492
17839
  const shouldFlip = flipRtl || shouldIconAutoFlip;
17493
17840
  // Use inherited aria-label if provided, otherwise fall back to auto-generated one
17494
17841
  const finalAriaLabel = inheritedAttributes['aria-label'] || ariaLabel;
17495
- return (hAsync(Host, Object.assign({ key: '43aa73531314e6529a887468e69362430d006229', "aria-label": finalAriaLabel !== undefined && !this.hasAriaHidden() ? finalAriaLabel : null, alt: "", role: "img", class: Object.assign(Object.assign({}, createColorClasses(this.color)), { 'flip-rtl': shouldFlip, 'icon-rtl': shouldFlip && isRTL(this.el) }) }, inheritedAttributes), (hAsync("div", { class: "icon-inner" }))));
17842
+ return (hAsync(Host, Object.assign({ key: '3af1c02235a2645bc3bb300831b19779cca78827', "aria-label": finalAriaLabel !== undefined && !this.hasAriaHidden() ? finalAriaLabel : null, alt: "", role: "img", class: Object.assign(Object.assign({}, createColorClasses(this.color)), { 'flip-rtl': shouldFlip, 'icon-rtl': shouldFlip && isRTL(this.el) }) }, inheritedAttributes), (hAsync("div", { class: "icon-inner" }))));
17496
17843
  }
17497
17844
  /*****
17498
17845
  * Private Methods
@@ -17628,9 +17975,9 @@ class PdsImage {
17628
17975
  this.loading = 'eager';
17629
17976
  }
17630
17977
  render() {
17631
- return (hAsync(Host, { key: 'fff1a796e59b8e666069e56390e174d7d2861f03', class: {
17978
+ return (hAsync(Host, { key: '1e8bb3882c2a629004ce1441e85d5c5a75a84e98', class: {
17632
17979
  'pds-image': true,
17633
- }, id: this.componentId }, hAsync("img", { key: 'dbeda9da5adca51c58ec5a807cde673d6b479d0f', alt: this.alt, height: this.height, loading: this.loading, sizes: this.sizes, src: this.src, srcset: this.srcset, width: this.width })));
17980
+ }, id: this.componentId }, hAsync("img", { key: 'b50b19d51431d45027c7a918a4ba4c38493741d5', alt: this.alt, height: this.height, loading: this.loading, sizes: this.sizes, src: this.src, srcset: this.srcset, width: this.width })));
17634
17981
  }
17635
17982
  static get style() { return pdsImageCss(); }
17636
17983
  static get cmpMeta() { return {
@@ -17950,10 +18297,10 @@ class PdsInput {
17950
18297
  'has-prepend': this.hasPrepend,
17951
18298
  'has-append': this.hasAppend,
17952
18299
  };
17953
- return (hAsync(Host, { key: '8c0829cc3502e5fa1fe52584d84b9345fcb0f3fd', "aria-disabled": this.disabled ? 'true' : null, "aria-readonly": this.readonly ? 'true' : null, "has-prefix": this.hasPrefix ? 'true' : null, "has-suffix": this.hasSuffix ? 'true' : null, "has-prepend": this.hasPrepend ? 'true' : null, "has-append": this.hasAppend ? 'true' : null, "has-action": this.hasAction && !this.hideLabel ? 'true' : null, "full-width": this.fullWidth ? 'true' : null }, hAsync("div", { key: 'cf754e6fc72d2cf900e541a469a8e0ba62851538', class: "pds-input" }, label && (hAsync("div", { key: 'f55793898eb2840322ec9a79daed186420ef0d90', class: {
18300
+ return (hAsync(Host, { key: '75eb8bc6cda5e947f8677ebefe7995688f03f947', "aria-disabled": this.disabled ? 'true' : null, "aria-readonly": this.readonly ? 'true' : null, "has-prefix": this.hasPrefix ? 'true' : null, "has-suffix": this.hasSuffix ? 'true' : null, "has-prepend": this.hasPrepend ? 'true' : null, "has-append": this.hasAppend ? 'true' : null, "has-action": this.hasAction && !this.hideLabel ? 'true' : null, "full-width": this.fullWidth ? 'true' : null }, hAsync("div", { key: '93d7f90b9a64daccea1533abc08a8cb18825b828', class: "pds-input" }, label && (hAsync("div", { key: '948109b3bfa1a1b8171572da9160425e3e35a7a6', class: {
17954
18301
  'pds-input__label-wrapper': true,
17955
18302
  'visually-hidden': this.hideLabel,
17956
- } }, hAsync("label", { key: '2a7deac2a9443b1a648133a799b69414b96314e3', htmlFor: componentId, class: "pds-input__label" }, hAsync("span", { key: '75dc7787e0132c4f62272307867a8066f9cf6ce2' }, label, this.required && hAsync("span", { key: 'c7c413addd2b3f275031596598b030c02f647969', class: "pds-input__required-indicator" }, " *"))), !this.hideLabel && this.renderAction())), hAsync("div", { key: 'eaf09d07c4fbc84ef835d2c7b4f00e252394f5ed', class: inputWrapperClasses }, this.renderPrepend(), this.renderPrefix(), hAsync("input", Object.assign({ key: 'dca2390b44e430f0ab1d29daa4ce630ac3b12881', ref: (input) => (this.nativeInput = input), class: "pds-input__field", "aria-describedby": assignDescription(componentId, invalid, helperMessage, errorMessage), "aria-invalid": invalid ? "true" : undefined, autocomplete: this.autocomplete, disabled: disabled, id: componentId, max: this.max, maxlength: this.maxlength, min: this.min, minlength: this.minlength, name: this.name, pattern: this.pattern, placeholder: this.placeholder, readOnly: this.readonly, required: this.required, step: this.step, type: this.type, value: value, onInput: this.onInputEvent, onChange: this.onChangeEvent, onBlur: this.onBlurEvent, onFocus: this.onFocusEvent, onKeyDown: this.onKeyDownEvent, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd }, this.inheritedAttributes)), this.renderSuffix(), this.renderAppend()), helperMessage && (hAsync("p", { key: '0bd7859f44185ed0c1478833518cb5829ffea4ad', class: "pds-input__helper-message", id: messageId(componentId, 'helper') }, helperMessage)), errorMessage && (hAsync("p", { key: 'c40016f5bb03e292e01430c2940aff0ebb98abb5', class: "pds-input__error-message", id: messageId(componentId, 'error') }, hAsync("pds-icon", { key: '54985d775ddf951b50cae4796b7847e98de7434f', "aria-hidden": "true", icon: danger, size: "small" }), errorMessage)))));
18303
+ } }, hAsync("label", { key: 'bb0e6c6febb97ad4aa3942ac5e67ac42dc1bde0a', htmlFor: componentId, class: "pds-input__label" }, hAsync("span", { key: 'c6a122f829aa3b92ccb715c3f3975f6baadb3028' }, label, this.required && hAsync("span", { key: 'dce7d1a9c010a545992734bd238e9f6a4ca7b4ce', class: "pds-input__required-indicator" }, " *"))), !this.hideLabel && this.renderAction())), hAsync("div", { key: '1b92ab5d649a4a9cf8112ea9b8a8a1095714f6d0', class: inputWrapperClasses }, this.renderPrepend(), this.renderPrefix(), hAsync("input", Object.assign({ key: 'bc3c4b907312149d375bb78f9912e4501da59348', ref: (input) => (this.nativeInput = input), class: "pds-input__field", "aria-describedby": assignDescription(componentId, invalid, helperMessage, errorMessage), "aria-invalid": invalid ? "true" : undefined, autocomplete: this.autocomplete, disabled: disabled, id: componentId, max: this.max, maxlength: this.maxlength, min: this.min, minlength: this.minlength, name: this.name, pattern: this.pattern, placeholder: this.placeholder, readOnly: this.readonly, required: this.required, step: this.step, type: this.type, value: value, onInput: this.onInputEvent, onChange: this.onChangeEvent, onBlur: this.onBlurEvent, onFocus: this.onFocusEvent, onKeyDown: this.onKeyDownEvent, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd }, this.inheritedAttributes)), this.renderSuffix(), this.renderAppend()), helperMessage && (hAsync("p", { key: 'f7bcbafc17a20310d602fce14a0adad522acbcb1', class: "pds-input__helper-message", id: messageId(componentId, 'helper') }, helperMessage)), errorMessage && (hAsync("p", { key: 'bbbd6dc3203b89e5759587147de74d2ce3ce6177', class: "pds-input__error-message", id: messageId(componentId, 'error') }, hAsync("pds-icon", { key: '68a6a92c82c1756ad99f431e0cb56756e3cdf75c', "aria-hidden": "true", icon: danger, size: "small" }), errorMessage)))));
17957
18304
  }
17958
18305
  static get formAssociated() { return true; }
17959
18306
  get el() { return getElement(this); }
@@ -18065,8 +18412,8 @@ class PdsLink {
18065
18412
  const targetValue = this.target || (this.external ? '_blank' : undefined);
18066
18413
  const showExternalIcon = this.external;
18067
18414
  const relValue = targetValue === '_blank' ? 'noopener noreferrer' : undefined;
18068
- return (hAsync("a", { key: '4757dc775fb132ea1fed93fed8e3cd18c77d45af', class: this.classNames(), download: this.download, href: this.href, id: this.componentId, part: "link", "aria-current": this.active ? 'page' : undefined, target: targetValue, rel: relValue, style: this.setLinkStyles(), "data-turbo": this.turbo || undefined, "data-turbo-frame": this.turboFrame || undefined, "data-turbo-action": this.turboAction || undefined, "data-turbo-method": this.turboMethod || undefined, "data-turbo-confirm": this.turboConfirm || undefined, "data-turbo-stream": this.turboStream || undefined, "data-turbo-prefetch": this.turboPrefetch || undefined, "data-turbo-preload": this.turboPreload || undefined }, hAsync("slot", { key: '88e5a1ef3b0fc384f7449979029fa45c627aab99' }, this.href), showExternalIcon &&
18069
- hAsync("pds-icon", { key: '6f1b9cf0dab342ea09c1f52c605228ef4d04f829', icon: launch, size: this.fontSize })));
18415
+ return (hAsync("a", { key: '3b6f9d19d7f50d0606cf5f3c3a97b85ee4aa63b0', class: this.classNames(), download: this.download, href: this.href, id: this.componentId, part: "link", "aria-current": this.active ? 'page' : undefined, target: targetValue, rel: relValue, style: this.setLinkStyles(), "data-turbo": this.turbo || undefined, "data-turbo-frame": this.turboFrame || undefined, "data-turbo-action": this.turboAction || undefined, "data-turbo-method": this.turboMethod || undefined, "data-turbo-confirm": this.turboConfirm || undefined, "data-turbo-stream": this.turboStream || undefined, "data-turbo-prefetch": this.turboPrefetch || undefined, "data-turbo-preload": this.turboPreload || undefined }, hAsync("slot", { key: 'a265f1c4c9b6ff089b23906d8f650bfd65b25013' }, this.href), showExternalIcon &&
18416
+ hAsync("pds-icon", { key: '9553a8256b6811296ea4b762e32662c1a2f4aecf', icon: launch, size: this.fontSize })));
18070
18417
  }
18071
18418
  static get style() { return pdsLinkCss(); }
18072
18419
  static get cmpMeta() { return {
@@ -18165,7 +18512,7 @@ class PdsLoader {
18165
18512
  'aria-live': 'polite',
18166
18513
  };
18167
18514
  this.hostKeeper.record(hostClass, {}, hostAttributes);
18168
- return (hAsync(Host, Object.assign({ key: '81f97b8a6adf4d2c0e5516aa2af9054e200629e1', class: hostClass }, hostAttributes), this.variant === 'spinner' && (hAsync("div", { key: '6e25806c83d6ddeb1141acdd083654867c6ff8a2', class: "pds-loader--spinner" }, hAsync("svg", { key: '4798f27facfcf57da8d408319527fc6083489107', style: this.getSvgStyle(), viewBox: "0 0 200 200", fill: "none", part: "loader-svg" }, hAsync("defs", { key: '0c64abfabc18ccd51ef41017e088f6ec10736d61' }, hAsync("linearGradient", { key: '3aa61edf6250dc827bf925938b69008860f96596', id: "spinner-secondHalf" }, hAsync("stop", { key: '2693d8a866492ef4ca98cbc4beb5f9f1a34a8b52', offset: "0%", "stop-opacity": "0", "stop-color": "currentColor" }), hAsync("stop", { key: 'ae229fdc73733e4d6ab15a6663e67b574bd49b40', offset: "100%", "stop-opacity": "0.5", "stop-color": "currentColor" })), hAsync("linearGradient", { key: '8ddbb46a1a387113d74a82cc4e3e0e9c7e12d573', id: "spinner-firstHalf" }, hAsync("stop", { key: 'd166a3c1ae37c3afa898351683b07f5c4d0ee906', offset: "0%", "stop-opacity": "1", "stop-color": "currentColor" }), hAsync("stop", { key: 'e4c9790bc9a645d752aa56c238fb8708310208b5', offset: "100%", "stop-opacity": "0.5", "stop-color": "currentColor" }))), hAsync("g", { key: '8b3897ff925d4207f9060e2fb69afa657b1b8fe3', class: "pds-loader__spinner-path" }, hAsync("path", { key: '603ef195d1fc64d2059d9fbfeb9b14e2bdb1cabe', stroke: "url(#spinner-secondHalf)", d: "M 4 100 A 96 96 0 0 1 196 100" }), hAsync("path", { key: 'a649ac9538248f5a22d48008377e18f4407efad9', stroke: "url(#spinner-firstHalf)", d: "M 196 100 A 96 96 0 0 1 4 100" }), hAsync("path", { key: '37f3772b61d1459959cc4d8c0b5c729dbd6953ff', stroke: "currentColor", "stroke-linecap": "round", d: "M 4 100 A 96 96 0 0 1 4 98" }))))), this.variant === 'typing' && (hAsync("div", { key: 'e510c2e6498a5542ce6e6573fdc03e8770121cd7', class: "pds-loader--typing" }, hAsync("span", { key: 'bbf4f5a328175f06b221d9abc73118505a09455d' }), hAsync("span", { key: '9a7e80b28e1455ef9d0c1bdb330a6425a3037709' }), hAsync("span", { key: 'f8aa1eb4f822a6d0e2a14a982bbe99866a97815b' }))), hAsync("div", { key: '3492189495798a2ea861d0dcb460f1b25d43d565', class: `pds-loader__label ${this.showLabel ? '' : 'pds-loader--hidden'}` }, hAsync("slot", { key: 'c1a19415b513a2a5f76a53d64b0ef5fbb4a5d100', name: "label" }, "Loading..."))));
18515
+ return (hAsync(Host, Object.assign({ key: 'c42c1aeec5c8db9a1065f35492734a8cb265f3ce', class: hostClass }, hostAttributes), this.variant === 'spinner' && (hAsync("div", { key: 'dc1b7943709d03e02467cca0817fb6a7ad5ed10a', class: "pds-loader--spinner" }, hAsync("svg", { key: 'db38e607541ac1eb91be87b2cd0240341c8fb51d', style: this.getSvgStyle(), viewBox: "0 0 200 200", fill: "none", part: "loader-svg" }, hAsync("defs", { key: 'd734ef70b0039758a25881c22bb3e6453ac40012' }, hAsync("linearGradient", { key: '697627f516c5f7b4cd5351dd39de231c0cb9e429', id: "spinner-secondHalf" }, hAsync("stop", { key: '03082c0ec354685eebf7d0132202d54b083d26df', offset: "0%", "stop-opacity": "0", "stop-color": "currentColor" }), hAsync("stop", { key: '181b661b36aeb44943e20dec513f7265a9487004', offset: "100%", "stop-opacity": "0.5", "stop-color": "currentColor" })), hAsync("linearGradient", { key: '67f6c51aefe99bcbfdb741290337364501fc4fcb', id: "spinner-firstHalf" }, hAsync("stop", { key: 'cb6adf27ecb06b42ba572a702153de960491b0b6', offset: "0%", "stop-opacity": "1", "stop-color": "currentColor" }), hAsync("stop", { key: 'aeebabfa1ac00391937388feefa120bd0bb4d26c', offset: "100%", "stop-opacity": "0.5", "stop-color": "currentColor" }))), hAsync("g", { key: 'f06ca75e4df171b6db426fce9bc34076cfee5bca', class: "pds-loader__spinner-path" }, hAsync("path", { key: 'a278b37de8f77a1000efecb62b89e3f751712a98', stroke: "url(#spinner-secondHalf)", d: "M 4 100 A 96 96 0 0 1 196 100" }), hAsync("path", { key: 'a035add4d01b60bcebf7625c8730d6a41ddf40ff', stroke: "url(#spinner-firstHalf)", d: "M 196 100 A 96 96 0 0 1 4 100" }), hAsync("path", { key: '1189c8299d33a2a6bb6a8345b60f22bf4ad9beee', stroke: "currentColor", "stroke-linecap": "round", d: "M 4 100 A 96 96 0 0 1 4 98" }))))), this.variant === 'typing' && (hAsync("div", { key: '39826fae20e8826d9c73cf57ba938583d610e1ea', class: "pds-loader--typing" }, hAsync("span", { key: '8f2b837c79548a1080710a7cc30c3be3a051e1dd' }), hAsync("span", { key: '8efb1193ef51f110950861767eccc3896e90b81e' }), hAsync("span", { key: '366f2d205adbb043691c253cff17d2d29d56a2cc' }))), hAsync("div", { key: 'aeaa4aa12863b34088e84fd2791c2ce32dc05248', class: `pds-loader__label ${this.showLabel ? '' : 'pds-loader--hidden'}` }, hAsync("slot", { key: '7a8ec45aed1cd6f9e60f4db2ec5376439fa41c81', name: "label" }, "Loading..."))));
18169
18516
  }
18170
18517
  get el() { return getElement(this); }
18171
18518
  static get watchers() { return {
@@ -18270,8 +18617,36 @@ function containsComposed(ancestor, node) {
18270
18617
  }
18271
18618
  return false;
18272
18619
  }
18620
+ /**
18621
+ * Every open modal, with the order it opened in, which ranks top-layer modals and the modals
18622
+ * inside them. Kept here rather than queried from the document, which can't see a modal inside
18623
+ * another component's shadow root.
18624
+ */
18625
+ const openModals = new Map();
18626
+ let openSequence = 0;
18627
+ /** Whether an open auto popover's panel sits in `root`, including inside shadow roots under it. */
18628
+ function hasOpenPopover(root) {
18629
+ if (root.querySelector('[data-pds-popover-open]'))
18630
+ return true;
18631
+ return Array.from(root.querySelectorAll('*')).some(el => !!el.shadowRoot && hasOpenPopover(el.shadowRoot));
18632
+ }
18633
+ /**
18634
+ * Whether `a` comes before `b` in the page. `compareDocumentPosition` is arbitrary across a shadow
18635
+ * boundary, so each side climbs to its host until both are in the same tree.
18636
+ */
18637
+ function precedesComposed(a, b) {
18638
+ // A document has no host, which ends each climb.
18639
+ for (let x = a; x; x = x.getRootNode().host) {
18640
+ for (let y = b; y; y = y.getRootNode().host) {
18641
+ if (x.getRootNode() === y.getRootNode()) {
18642
+ return !!(x.compareDocumentPosition(y) & Node.DOCUMENT_POSITION_FOLLOWING);
18643
+ }
18644
+ }
18645
+ }
18646
+ return false;
18647
+ }
18273
18648
  /** The focused element, followed down through shadow roots to the control that has focus. */
18274
- function deepActiveElement() {
18649
+ function deepActiveElement$1() {
18275
18650
  var _a;
18276
18651
  let active = document.activeElement;
18277
18652
  while ((_a = active === null || active === void 0 ? void 0 : active.shadowRoot) === null || _a === void 0 ? void 0 : _a.activeElement)
@@ -18288,7 +18663,8 @@ class PdsModal {
18288
18663
  this.pdsModalClose = createEvent(this, "pdsModalClose");
18289
18664
  this.focusableElements = [];
18290
18665
  /**
18291
- * Whether the modal can be dismissed by clicking the backdrop
18666
+ * Whether the modal can be dismissed by clicking the backdrop, pressing Escape, or the browser's
18667
+ * own close request (such as a back gesture)
18292
18668
  * @default true
18293
18669
  */
18294
18670
  this.backdropDismiss = true;
@@ -18336,19 +18712,33 @@ class PdsModal {
18336
18712
  * Stores the list of focusable elements in the modal
18337
18713
  */
18338
18714
  this.focusableElementsArray = [];
18715
+ // The browser's own close request (an Escape nothing prevented, a back gesture) would close the
18716
+ // dialog without updating `open`, so close it through hideModal() instead, or not at all.
18717
+ this.handleCancel = (e) => {
18718
+ e.preventDefault();
18719
+ if (!this.open)
18720
+ return;
18721
+ // The request reaches the top-layer dialog even when a disableTopLayer modal inside it is on
18722
+ // top; that one closes first, as it would on Escape.
18723
+ const top = this.innermostOpenModal();
18724
+ const target = (top && containsComposed(this.el, top) ? top : this.el);
18725
+ if (target.backdropDismiss)
18726
+ target.hideModal();
18727
+ };
18339
18728
  this.handleBackdropClick = (e) => {
18340
18729
  if (!this.backdropDismiss || !this.open)
18341
18730
  return;
18342
- if (e.target.classList.contains('pds-modal__backdrop')) {
18731
+ // This modal's own backdrop; a nested modal's backdrop handles its own clicks.
18732
+ if (e.target === this.modalRef) {
18343
18733
  e.stopPropagation();
18344
18734
  // Only close if this is the innermost modal
18345
- if (this.isInnermostModal()) {
18735
+ if (this.innermostOpenModal() === this.el) {
18346
18736
  this.hideModal();
18347
18737
  }
18348
18738
  }
18349
18739
  };
18350
18740
  this.handleKeyDown = (e) => {
18351
- var _a, _b, _c;
18741
+ var _a, _b, _c, _d;
18352
18742
  // If the modal is not open, don't handle any keyboard events
18353
18743
  if (!this.open)
18354
18744
  return;
@@ -18371,24 +18761,39 @@ class PdsModal {
18371
18761
  if (!('__pdsActiveElementAtEscape' in eventSnapshot)) {
18372
18762
  const activeAtDispatch = document.activeElement;
18373
18763
  eventSnapshot.__pdsActiveElementAtEscape = activeAtDispatch;
18764
+ // Followed into shadow roots: for a modal inside one, document.activeElement is only the host.
18765
+ eventSnapshot.__pdsDeepActiveElementAtEscape = deepActiveElement$1();
18374
18766
  const topLayerDialog = (_a = activeAtDispatch === null || activeAtDispatch === void 0 ? void 0 : activeAtDispatch.closest('dialog')) !== null && _a !== void 0 ? _a : null;
18375
18767
  eventSnapshot.__pdsTopLayerDialogAtEscape = topLayerDialog;
18376
18768
  eventSnapshot.__pdsTopLayerDialogWasModalAtEscape = !!(topLayerDialog && topLayerDialog.matches(':modal'));
18769
+ // A control that closed on this Escape (a combobox on its own element, a dropdown menu or
18770
+ // multiselect in document's capture phase) has prevented it before this bubble listener.
18771
+ // Read before any modal prevents it below.
18772
+ eventSnapshot.__pdsEscapeHandledInside = e.defaultPrevented;
18773
+ // Which modal is innermost is read once too: the inner one closing first would make its
18774
+ // outer modal the innermost by the time that modal's listener runs.
18775
+ eventSnapshot.__pdsInnermostModalAtEscape = this.innermostOpenModal();
18377
18776
  }
18777
+ if (eventSnapshot.__pdsEscapeHandledInside)
18778
+ return;
18378
18779
  // Leave Escape to a genuinely stacked-above overlay (disableTopLayer's
18379
18780
  // reason for existing) — not just to anything outside this modal.
18380
18781
  const active = eventSnapshot.__pdsActiveElementAtEscape;
18381
18782
  if (this.disableTopLayer &&
18382
18783
  active &&
18383
18784
  active !== document.body &&
18384
- !this.el.contains(active) &&
18385
- this.isStackedAboveOverlay(active, (_b = eventSnapshot.__pdsTopLayerDialogAtEscape) !== null && _b !== void 0 ? _b : null, (_c = eventSnapshot.__pdsTopLayerDialogWasModalAtEscape) !== null && _c !== void 0 ? _c : false)) {
18785
+ !containsComposed(this.el, (_b = eventSnapshot.__pdsDeepActiveElementAtEscape) !== null && _b !== void 0 ? _b : active) &&
18786
+ this.isStackedAboveOverlay(active, (_c = eventSnapshot.__pdsTopLayerDialogAtEscape) !== null && _c !== void 0 ? _c : null, (_d = eventSnapshot.__pdsTopLayerDialogWasModalAtEscape) !== null && _d !== void 0 ? _d : false)) {
18386
18787
  return;
18387
18788
  }
18789
+ // An open popover inside takes Escape from its own document listener, which runs after this
18790
+ // one, so leave the key for it. Its preventDefault() keeps the native dialog open.
18791
+ if (this.modalRef && hasOpenPopover(this.modalRef))
18792
+ return;
18388
18793
  // Always prevent native dialog close behavior
18389
18794
  e.preventDefault();
18390
18795
  // Only close if backdropDismiss is enabled and this is the innermost modal
18391
- if (this.backdropDismiss && this.isInnermostModal()) {
18796
+ if (this.backdropDismiss && eventSnapshot.__pdsInnermostModalAtEscape === this.el) {
18392
18797
  this.hideModal();
18393
18798
  }
18394
18799
  return;
@@ -18408,7 +18813,7 @@ class PdsModal {
18408
18813
  // Every open modal hears this keydown. When focus is in a modal dialog opened above this one,
18409
18814
  // that dialog traps Tab: this modal's list also holds its controls, so it would wrap first. A
18410
18815
  // non-modal dialog inside (a disableTopLayer modal) doesn't trap, so this one still does.
18411
- const activeElement = deepActiveElement();
18816
+ const activeElement = deepActiveElement$1();
18412
18817
  if (!activeElement || this.modalDialogAbove(activeElement))
18413
18818
  return;
18414
18819
  // Content can change while the modal is open (rows fetched in, sections shown), so the
@@ -18448,8 +18853,6 @@ class PdsModal {
18448
18853
  }
18449
18854
  componentDidLoad() {
18450
18855
  this.modalRef = this.el.querySelector('.pds-modal__backdrop');
18451
- // Add keyboard event listener
18452
- document.addEventListener('keydown', this.handleKeyDown);
18453
18856
  // @Watch('open') only fires on a later change, not the prop's initial
18454
18857
  // value — a modal mounted with `open` already true (static markup, or a
18455
18858
  // framework passing it on first render) would otherwise never call
@@ -18465,9 +18868,18 @@ class PdsModal {
18465
18868
  componentDidRender() {
18466
18869
  unwrapReconnectedContent(this.el.querySelector('.pds-modal'), 'dialog.pds-modal__backdrop', '.pds-modal');
18467
18870
  }
18871
+ // Here rather than in componentDidLoad, which runs once: a modal taken out of the page and put
18872
+ // back (a morph or a framework moving it) gets its keyboard handling, and its place among the
18873
+ // open modals, back too. Adding the same listener twice is a no-op.
18874
+ connectedCallback() {
18875
+ document.addEventListener('keydown', this.handleKeyDown);
18876
+ if (this.open && !openModals.has(this.el))
18877
+ openModals.set(this.el, ++openSequence);
18878
+ }
18468
18879
  disconnectedCallback() {
18469
18880
  // Clean up event listener
18470
18881
  document.removeEventListener('keydown', this.handleKeyDown);
18882
+ openModals.delete(this.el);
18471
18883
  }
18472
18884
  handleOpenChange(newValue) {
18473
18885
  if (newValue) {
@@ -18532,6 +18944,9 @@ class PdsModal {
18532
18944
  this.modalRef.showModal();
18533
18945
  }
18534
18946
  this.open = true;
18947
+ // Showing an open modal again doesn't move it above one opened after it.
18948
+ if (!openModals.has(this.el))
18949
+ openModals.set(this.el, ++openSequence);
18535
18950
  // Update focusable elements and set initial focus
18536
18951
  // Using a longer timeout to ensure all components are fully rendered
18537
18952
  setTimeout(() => {
@@ -18594,6 +19009,7 @@ class PdsModal {
18594
19009
  const focusAlreadyMovedElsewhere = activeElement !== null && activeElement !== document.body && !this.modalRef.contains(activeElement);
18595
19010
  this.modalRef.close();
18596
19011
  this.open = false;
19012
+ openModals.delete(this.el);
18597
19013
  // Restore focus to the element that was focused before the modal was opened
18598
19014
  if (!focusAlreadyMovedElsewhere &&
18599
19015
  this.previousActiveElement &&
@@ -18612,7 +19028,9 @@ class PdsModal {
18612
19028
  */
18613
19029
  getBackdropZIndex(modal) {
18614
19030
  const backdrop = modal.querySelector('.pds-modal__backdrop');
18615
- return backdrop ? parseInt(getComputedStyle(backdrop).zIndex, 10) : -1;
19031
+ // `auto` (no z-index token loaded) parses to NaN, which no comparison can rank.
19032
+ const zIndex = backdrop ? parseInt(getComputedStyle(backdrop).zIndex, 10) : -1;
19033
+ return Number.isNaN(zIndex) ? 0 : zIndex;
18616
19034
  }
18617
19035
  /**
18618
19036
  * Whether `active` sits inside a surface actually stacked above this modal.
@@ -18639,7 +19057,8 @@ class PdsModal {
18639
19057
  * lose that evidence depending on listener order.
18640
19058
  */
18641
19059
  isStackedAboveOverlay(active, topLayerDialog, topLayerDialogWasModal) {
18642
- if (topLayerDialog && topLayerDialog !== this.modalRef && topLayerDialogWasModal) {
19060
+ // A top-layer dialog this modal sits inside is underneath it, not an overlay above.
19061
+ if (topLayerDialog && topLayerDialog !== this.modalRef && topLayerDialogWasModal && !containsComposed(topLayerDialog, this.el)) {
18643
19062
  return true;
18644
19063
  }
18645
19064
  const ownZIndex = this.getBackdropZIndex(this.el);
@@ -18655,24 +19074,37 @@ class PdsModal {
18655
19074
  return false;
18656
19075
  }
18657
19076
  /**
18658
- * Checks if this modal is the innermost (highest z-index) modal
19077
+ * The open modal that takes Escape or a backdrop click, among those with no other open modal
19078
+ * inside them (a nested modal's backdrop can share its outer modal's z-index). A top-layer dialog
19079
+ * (or a modal inside one) paints above anything outside it, and within the top layer the last
19080
+ * opened is on top. Modals in the same layer (the page, or one top-layer dialog) then rank by
19081
+ * the highest backdrop, then the one later in the page.
18659
19082
  */
18660
- isInnermostModal() {
18661
- // Find all open modals
18662
- const openModals = Array.from(document.querySelectorAll('pds-modal')).filter(modal => modal.open);
18663
- if (openModals.length === 0)
18664
- return false;
18665
- // Get this modal's backdrop element
18666
- const thisBackdrop = this.el.querySelector('.pds-modal__backdrop');
18667
- if (!thisBackdrop)
18668
- return false;
18669
- // Get computed z-index of all open modal backdrops
18670
- const modalZIndexes = openModals.map(modal => this.getBackdropZIndex(modal));
18671
- // Get the highest z-index
18672
- const maxZIndex = Math.max(...modalZIndexes);
18673
- // Check if this modal's backdrop has the highest z-index
18674
- const thisZIndex = this.getBackdropZIndex(this.el);
18675
- return thisZIndex === maxZIndex;
19083
+ innermostOpenModal() {
19084
+ const open = Array.from(openModals.keys()).filter(modal => modal.isConnected);
19085
+ const innermost = open.filter(modal => !open.some(other => other !== modal && containsComposed(modal, other)));
19086
+ const byDocumentOrder = [...innermost].sort((a, b) => (precedesComposed(a, b) ? -1 : 1));
19087
+ // A modal inside a top-layer dialog paints in that dialog's place in the top layer, even when it
19088
+ // isn't in the top layer itself (disableTopLayer), so that dialog's open order ranks it first.
19089
+ const rank = (modal) => {
19090
+ var _a;
19091
+ const backdrop = modal.querySelector('.pds-modal__backdrop');
19092
+ const topLayerDialog = backdrop ? closest$1('dialog:modal', backdrop) : null;
19093
+ const topLayerModal = topLayerDialog === null || topLayerDialog === void 0 ? void 0 : topLayerDialog.closest('pds-modal');
19094
+ const layer = topLayerDialog ? ((_a = (topLayerModal && openModals.get(topLayerModal))) !== null && _a !== void 0 ? _a : 0) : 0;
19095
+ return [topLayerDialog ? 1 : 0, layer, this.getBackdropZIndex(modal), byDocumentOrder.indexOf(modal)];
19096
+ };
19097
+ let top = null;
19098
+ let topRank = [-1, -1, -1, -1];
19099
+ for (const modal of innermost) {
19100
+ const modalRank = rank(modal);
19101
+ const above = modalRank.findIndex((value, i) => value !== topRank[i]);
19102
+ if (above >= 0 && modalRank[above] > topRank[above]) {
19103
+ top = modal;
19104
+ topRank = modalRank;
19105
+ }
19106
+ }
19107
+ return top;
18676
19108
  }
18677
19109
  /** Whether a modal dialog other than this one sits between the focused element and this modal. */
18678
19110
  modalDialogAbove(active) {
@@ -18712,14 +19144,14 @@ class PdsModal {
18712
19144
  }
18713
19145
  render() {
18714
19146
  const [sizeClass = 'md', customSize] = this.resolveSize();
18715
- return (hAsync("dialog", { key: 'b6714c7e77d80bf2370f2170ffce029abe147d81', class: {
19147
+ return (hAsync("dialog", { key: '0633d4e8a7cb81f2f9280e754564960a00a4d60b', class: {
18716
19148
  'pds-modal__backdrop': true,
18717
19149
  'open': this.open
18718
- }, "aria-modal": this.disableTopLayer ? 'false' : 'true', "aria-labelledby": `${this.componentId}-heading`, onClick: this.handleBackdropClick }, hAsync("div", { key: '8c3319f53dd8c79c9e952785277e9e82e28b651e', class: {
19150
+ }, "aria-modal": this.disableTopLayer ? 'false' : 'true', "aria-labelledby": `${this.componentId}-heading`, onClick: this.handleBackdropClick, onCancel: this.handleCancel }, hAsync("div", { key: '466f8a3476cf066817554f47ec7d3a0e3ab10b89', class: {
18719
19151
  'pds-modal': true,
18720
19152
  [`pds-modal--${sizeClass}`]: true,
18721
19153
  'pds-modal--scrollable': this.scrollable
18722
- }, style: customSize !== undefined ? { '--pds-modal-max-width': customSize } : undefined, part: "modal" }, hAsync("slot", { key: '8c6f9cc1a20b515659344ad041512de52761800d' }))));
19154
+ }, style: customSize !== undefined ? { '--pds-modal-max-width': customSize } : undefined, part: "modal" }, hAsync("slot", { key: '01ca45c96540416216a1082bad52b137720f0f4d' }))));
18723
19155
  }
18724
19156
  get el() { return getElement(this); }
18725
19157
  static get watchers() { return {
@@ -18936,10 +19368,10 @@ class PdsModalContent {
18936
19368
  render() {
18937
19369
  // Only apply max-height style if it's not 'none'
18938
19370
  const styleObj = this.contentMaxHeight !== 'none' ? { maxHeight: this.contentMaxHeight } : {};
18939
- return (hAsync(Host, { key: 'f66dbdd08d6af3f87b0a6e8f30e1948b2f674e34' }, hAsync("div", { key: 'ac0469cbfe48002d5bc7f401e0dc30926cfd4421', class: {
19371
+ return (hAsync(Host, { key: 'd41d5632eb6a2dafe921546af60f835d3545cc4f' }, hAsync("div", { key: '741ac9f28149039ecf5051142a939ab62ef26a87', class: {
18940
19372
  'pds-modal-content': true,
18941
19373
  [`pds-modal-content--border-${this.border}`]: true
18942
- }, style: styleObj, tabindex: "-1" }, hAsync("slot", { key: '26a8a45ab4dcd0349da68304fa3cacc64603208a' }))));
19374
+ }, style: styleObj, tabindex: "-1" }, hAsync("slot", { key: '090a52e9425d4df61c2d8216cc19f0925babdffe' }))));
18943
19375
  }
18944
19376
  get el() { return getElement(this); }
18945
19377
  static get style() { return pdsModalContentCss(); }
@@ -18970,7 +19402,7 @@ class PdsModalFooter {
18970
19402
  unwrapReconnectedContent(this.el.querySelector('.pds-modal__footer'), '.pds-modal__footer');
18971
19403
  }
18972
19404
  render() {
18973
- return (hAsync("footer", { key: '1148892c2d6b9a461f6c04a670fceda76c1be53a', class: "pds-modal__footer" }, hAsync("slot", { key: 'ccd754674c82c415f8c056c9dda6327df35dbd03' })));
19405
+ return (hAsync("footer", { key: '030153b84f1ea1cb133c9ccec3ad86583995974f', class: "pds-modal__footer" }, hAsync("slot", { key: '3a479e7047f3e845a65c37d60539648c8ff78602' })));
18974
19406
  }
18975
19407
  get el() { return getElement(this); }
18976
19408
  static get style() { return pdsModalFooterCss(); }
@@ -18998,7 +19430,7 @@ class PdsModalHeader {
18998
19430
  unwrapReconnectedContent(this.el.querySelector('.pds-modal__header'), '.pds-modal__header');
18999
19431
  }
19000
19432
  render() {
19001
- return (hAsync("header", { key: '030153b84f1ea1cb133c9ccec3ad86583995974f', class: "pds-modal__header" }, hAsync("slot", { key: '3a479e7047f3e845a65c37d60539648c8ff78602' })));
19433
+ return (hAsync("header", { key: 'ee3ac5fb9b00a943aa86c3434ea07291b74d776c', class: "pds-modal__header" }, hAsync("slot", { key: '0b0f7ff257635723099c536648a826be8dcc05e7' })));
19002
19434
  }
19003
19435
  get el() { return getElement(this); }
19004
19436
  static get style() { return pdsModalHeaderCss(); }
@@ -19552,11 +19984,12 @@ class PdsMultiselect {
19552
19984
  }
19553
19985
  /**
19554
19986
  * Handle global keyboard events for accessibility.
19555
- * Closes dropdown on Escape key press regardless of focus location.
19987
+ * Closes dropdown on Escape key press regardless of focus location. Taken in document's capture
19988
+ * phase, before a modal around the multiselect hears it on document and closes too.
19556
19989
  */
19557
19990
  handleWindowKeyDown(event) {
19558
19991
  var _a;
19559
- if (!this.isOpen)
19992
+ if (!this.isOpen || event.defaultPrevented)
19560
19993
  return;
19561
19994
  if (event.key === 'Escape') {
19562
19995
  event.preventDefault();
@@ -20246,10 +20679,10 @@ class PdsMultiselect {
20246
20679
  }
20247
20680
  render() {
20248
20681
  const hasSelections = this.selectedItems.length > 0;
20249
- return (hAsync(Host, { key: '295354c218d03a512ee87a9f19d2267a59731eb1', "aria-disabled": this.disabled ? 'true' : null }, hAsync("div", { key: '8696c02fad869239fa85dcec7f92a3efb402c963', class: "pds-multiselect", onFocusout: this.handleContainerFocusOut }, this.label && (hAsync("label", { key: '2a9cc565c5dbcf78305eb65e94d795669fb0f93b', id: `${this.componentId}-label`, htmlFor: this.componentId, class: {
20682
+ return (hAsync(Host, { key: 'fcc35a82c16d5cf35a49ce997f19618104f9cc45', "aria-disabled": this.disabled ? 'true' : null }, hAsync("div", { key: '72d1fdf759d9173f54bac80ec50aff651fd2b357', class: "pds-multiselect", onFocusout: this.handleContainerFocusOut }, this.label && (hAsync("label", { key: 'e28f02c2beb23dc2c0deefadbd0645b20d938d91', id: `${this.componentId}-label`, htmlFor: this.componentId, class: {
20250
20683
  'pds-multiselect__label': true,
20251
20684
  'visually-hidden': this.hideLabel,
20252
- } }, this.label)), hAsync("div", { key: '9358ebffb50e74fe4ceb9ca1c13cf819cc3e96e6', class: "pds-multiselect__wrapper", ref: el => (this.containerEl = el), style: { width: this.triggerWidth } }, this.slottedTriggerEl ? (hAsync("slot", { name: "trigger" })) : this.selectedDisplay === 'pill' && this.pillPosition === 'inline' ? (hAsync("div", { ref: el => (this.pillInlineTriggerEl = el || undefined), part: "trigger", class: {
20685
+ } }, this.label)), hAsync("div", { key: '06539bf2c4b8da2889505a9f042d5cd6721b1853', class: "pds-multiselect__wrapper", ref: el => (this.containerEl = el), style: { width: this.triggerWidth } }, this.slottedTriggerEl ? (hAsync("slot", { name: "trigger" })) : this.selectedDisplay === 'pill' && this.pillPosition === 'inline' ? (hAsync("div", { ref: el => (this.pillInlineTriggerEl = el || undefined), part: "trigger", class: {
20253
20686
  'pds-multiselect__trigger': true,
20254
20687
  'pds-multiselect__trigger--open': this.isOpen,
20255
20688
  'pds-multiselect__trigger--disabled': this.disabled,
@@ -20265,7 +20698,7 @@ class PdsMultiselect {
20265
20698
  }, id: this.componentId, disabled: this.disabled, "aria-required": this.required ? 'true' : undefined, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-haspopup": "listbox", "aria-describedby": assignDescription(this.componentId, this.invalid || !!this.errorMessage, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid || !!this.errorMessage ? 'true' : undefined, onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeyDown }, hAsync("span", { class: {
20266
20699
  'pds-multiselect__trigger-text': true,
20267
20700
  'pds-multiselect__trigger-text--placeholder': !hasSelections || (this.selectedDisplay === 'pill' && this.pillPosition === 'below'),
20268
- } }, this.getTriggerText()), hAsync("pds-icon", { "aria-hidden": "true", class: "pds-multiselect__icon", icon: enlarge }))), this.renderDropdown()), this.selectedDisplay === 'pill' && this.pillPosition === 'below' && this.renderBelowPills(), hAsync("span", { key: '722da251199792366dc72b6c7f016e24ae807b30', class: "visually-hidden", "aria-live": "polite", "aria-atomic": "true" }, this.removalAnnouncement), this.helperMessage && !(this.errorMessage && this.errorMessage.length > 0) && (hAsync("p", { key: '7b4da9b2e04f53f3e8f245c119135f3b664897ec', class: "pds-multiselect__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)), this.errorMessage && (hAsync("p", { key: '95a152f6a350eee2f67dbab2930f19e583ca3b85', class: "pds-multiselect__error", id: messageId(this.componentId, 'error') }, hAsync("pds-icon", { key: '7b9cded907054757a6f054d0d325811a2199e496', icon: danger, size: "small" }), this.errorMessage)), hAsync("div", { key: '8b07974c8e2d838d76c17c3a52ba4282fb101968', style: { display: 'none' } }, hAsync("slot", { key: '0a34d582bc4dd780072f00ac13bfdce7e297191e' })))));
20701
+ } }, this.getTriggerText()), hAsync("pds-icon", { "aria-hidden": "true", class: "pds-multiselect__icon", icon: enlarge }))), this.renderDropdown()), this.selectedDisplay === 'pill' && this.pillPosition === 'below' && this.renderBelowPills(), hAsync("span", { key: '3364fc00bc744fcd599436a9cb6dc563564d89d9', class: "visually-hidden", "aria-live": "polite", "aria-atomic": "true" }, this.removalAnnouncement), this.helperMessage && !(this.errorMessage && this.errorMessage.length > 0) && (hAsync("p", { key: 'bf712c65b9acb66e2998a43686fed408fc1ff48a', class: "pds-multiselect__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)), this.errorMessage && (hAsync("p", { key: 'b485db6c2c3ae312cce2b90db60e850ad6dfdcf5', class: "pds-multiselect__error", id: messageId(this.componentId, 'error') }, hAsync("pds-icon", { key: '20daf861cf9584f33f5a9574e9581acc487e7dfe', icon: danger, size: "small" }), this.errorMessage)), hAsync("div", { key: '018d333254771695a8c191f1cea40af6e78427a2', style: { display: 'none' } }, hAsync("slot", { key: '2ef4a01fbe5d294a9ead5cc1183c28341834539b' })))));
20269
20702
  }
20270
20703
  static get formAssociated() { return true; }
20271
20704
  get el() { return getElement(this); }
@@ -20355,14 +20788,66 @@ class PdsMultiselect {
20355
20788
  "clear": [64],
20356
20789
  "refreshOptions": [64]
20357
20790
  },
20358
- "$listeners$": [[8, "keydown", "handleWindowKeyDown"]],
20791
+ "$listeners$": [[6, "keydown", "handleWindowKeyDown"]],
20359
20792
  "$lazyBundleId$": "-",
20360
20793
  "$attrsToReflect$": []
20361
20794
  }; }
20362
20795
  }
20363
20796
 
20797
+ /**
20798
+ * Escapes a string so it's safe to interpolate into a CSS identifier (an id selector like `#${id}`)
20799
+ * or into CSS text (a stylesheet rule referencing that id). Equivalent to the native `CSS.escape`,
20800
+ * reimplemented because Stencil's unit-test DOM (`newSpecPage`'s mock-doc) doesn't provide it.
20801
+ * @param value - The string to escape, e.g. a consumer-supplied id
20802
+ */
20803
+ const cssEscape = (value) => {
20804
+ const string = String(value);
20805
+ const length = string.length;
20806
+ const firstCodeUnit = string.charCodeAt(0);
20807
+ let result = '';
20808
+ for (let index = 0; index < length; index++) {
20809
+ const codeUnit = string.charCodeAt(index);
20810
+ if (codeUnit === 0x0000) {
20811
+ result += '�';
20812
+ continue;
20813
+ }
20814
+ if ((codeUnit >= 0x0001 && codeUnit <= 0x001f) ||
20815
+ codeUnit === 0x007f ||
20816
+ (index === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||
20817
+ (index === 1 && codeUnit >= 0x0030 && codeUnit <= 0x0039 && firstCodeUnit === 0x002d)) {
20818
+ result += `\\${codeUnit.toString(16)} `;
20819
+ continue;
20820
+ }
20821
+ if (index === 0 && length === 1 && codeUnit === 0x002d) {
20822
+ result += `\\${string.charAt(index)}`;
20823
+ continue;
20824
+ }
20825
+ if (codeUnit >= 0x0080 ||
20826
+ codeUnit === 0x002d ||
20827
+ codeUnit === 0x005f ||
20828
+ (codeUnit >= 0x0030 && codeUnit <= 0x0039) ||
20829
+ (codeUnit >= 0x0041 && codeUnit <= 0x005a) ||
20830
+ (codeUnit >= 0x0061 && codeUnit <= 0x007a)) {
20831
+ result += string.charAt(index);
20832
+ continue;
20833
+ }
20834
+ result += `\\${string.charAt(index)}`;
20835
+ }
20836
+ return result;
20837
+ };
20838
+
20364
20839
  const pdsPopoverCss = () => `:host{--sizing-max-width-default:352px;display:inline-block}:host .pds-popover__trigger-wrapper{display:inline-block}:host .pds-popover__content-slot-wrapper{display:none}`;
20365
20840
 
20841
+ /** Open auto popovers, in the order they opened: Escape goes to the last one it applies to. */
20842
+ const openAutoPopovers = [];
20843
+ /** The focused element, followed down through shadow roots to the control that has focus. */
20844
+ function deepActiveElement() {
20845
+ var _a;
20846
+ let active = document.activeElement;
20847
+ while ((_a = active === null || active === void 0 ? void 0 : active.shadowRoot) === null || _a === void 0 ? void 0 : _a.activeElement)
20848
+ active = active.shadowRoot.activeElement;
20849
+ return active;
20850
+ }
20366
20851
  /**
20367
20852
  * @slot trigger - The trigger element for the popover
20368
20853
  * @slot (default) - The content to display inside the popover
@@ -20398,7 +20883,7 @@ class PdsPopover {
20398
20883
  */
20399
20884
  this.triggerObserver = null;
20400
20885
  /**
20401
- * Portal element rendered in document.body
20886
+ * Portal element: in document.body, or in the open dialog the popover is in
20402
20887
  */
20403
20888
  this.portalEl = null;
20404
20889
  /**
@@ -20494,6 +20979,26 @@ class PdsPopover {
20494
20979
  break;
20495
20980
  }
20496
20981
  };
20982
+ /** The focus style copied into a shadow root the panel opened in, which `document.head` can't reach. */
20983
+ this.shadowFocusStyle = null;
20984
+ /** The dialog the panel was opened in, closed along with it. */
20985
+ this.watchedDialog = null;
20986
+ this.onDialogClose = () => {
20987
+ this.hide();
20988
+ };
20989
+ /**
20990
+ * Inside a dialog, the panel can sit in a form that wraps the dialog, which a body portal never
20991
+ * did. A submit from the panel (a button in it, or Enter in a field in it) is stopped, so the
20992
+ * panel behaves as it does in the body.
20993
+ */
20994
+ this.handleSubmitFromPanel = (event) => {
20995
+ if (!this.portalEl || !containsComposed$1(event.target, this.portalEl))
20996
+ return;
20997
+ if (containsComposed$1(this.portalEl, event.submitter) || containsComposed$1(this.portalEl, deepActiveElement())) {
20998
+ event.preventDefault();
20999
+ event.stopPropagation();
21000
+ }
21001
+ };
20497
21002
  }
20498
21003
  restorePlacementDefault(newValue) {
20499
21004
  this.placement = restoreReflectedDefault(this.el, 'placement', newValue, 'right');
@@ -20530,7 +21035,8 @@ class PdsPopover {
20530
21035
  this.triggerObserver = null;
20531
21036
  if (this.triggerEl == null || typeof MutationObserver === 'undefined')
20532
21037
  return;
20533
- this.triggerObserver = new MutationObserver(() => this.linkTriggerToPortal());
21038
+ // Capped against a script that keeps undoing it; opening and closing still write it directly.
21039
+ this.triggerObserver = new MutationObserver(limitRestores(() => this.linkTriggerToPortal(), 'pds-popover: stopped restoring its trigger ARIA, as another script keeps changing it. It may be wrong until the popover opens or closes.', this.triggerEl));
20534
21040
  this.triggerObserver.observe(this.triggerEl, {
20535
21041
  attributes: true,
20536
21042
  attributeFilter: ['aria-expanded', 'aria-controls'],
@@ -20540,9 +21046,9 @@ class PdsPopover {
20540
21046
  // This mirrors the native Popover API's accessibility behavior
20541
21047
  linkTriggerToPortal() {
20542
21048
  if (this.triggerEl == null || this.portalEl == null)
20543
- return;
21049
+ return false;
20544
21050
  // Skips values already in place, so the trigger observer's own callback doesn't loop.
20545
- setAttributesIfChanged(this.triggerEl, { 'aria-expanded': String(this.active), 'aria-controls': this.portalEl.id });
21051
+ return setAttributesIfChanged(this.triggerEl, { 'aria-expanded': String(this.active), 'aria-controls': this.portalEl.id });
20546
21052
  }
20547
21053
  // componentDidLoad doesn't run again when a popover comes back, so rebuild whatever
20548
21054
  // disconnectedCallback tore down. Each step is a no-op when nothing was.
@@ -20555,19 +21061,23 @@ class PdsPopover {
20555
21061
  (_a = this.triggerEl) === null || _a === void 0 ? void 0 : _a.addEventListener('click', this.handleTriggerClick);
20556
21062
  this.observeTrigger();
20557
21063
  this.linkTriggerToPortal();
20558
- // Still open after a move: the trigger moved, so the portal follows it.
21064
+ // Still open after a move: the trigger moved, so the portal follows it, into the dialog it
21065
+ // is in now, if any.
20559
21066
  if (this.active) {
21067
+ this.placePortal();
20560
21068
  requestAnimationFrame(() => this.handlePopoverPositioning());
20561
21069
  }
20562
21070
  }
20563
21071
  disconnectedCallback() {
20564
21072
  var _a;
20565
21073
  // Moved in one operation (a DOM morph, or a framework reparenting it), the popover is
20566
- // already back in the page. Its portal is in <body>, untouched, so it stays open, with focus
20567
- // where it was.
21074
+ // already back in the page. Its portal is outside the popover, so it stays open, with focus
21075
+ // where it was; connectedCallback moves it to follow the popover.
20568
21076
  if (this.el.isConnected)
20569
21077
  return;
20570
21078
  this.isComponentMounted = false;
21079
+ this.unwatchDialogClose();
21080
+ this.forgetOpen();
20571
21081
  // Open, the content sits in the portal; put it back before the portal goes. Only listeners on
20572
21082
  // the popover itself hear the close event now, but those are the ones mirroring its state.
20573
21083
  if (this.active) {
@@ -20588,6 +21098,7 @@ class PdsPopover {
20588
21098
  // Clean up all event listeners
20589
21099
  this.removeLightDismissListeners();
20590
21100
  this.removeScrollAndResizeListeners();
21101
+ document.removeEventListener('submit', this.handleSubmitFromPanel, true);
20591
21102
  // Clear any pending debounce timers
20592
21103
  this.clearDebounceTimers();
20593
21104
  // Remove portal from DOM
@@ -20632,9 +21143,6 @@ class PdsPopover {
20632
21143
  else {
20633
21144
  this.portalEl.id = `${this.componentId}-portal`;
20634
21145
  }
20635
- // Add accessibility attributes for screen readers
20636
- // Note: Native Popover API doesn't add a specific role, keeping semantic HTML
20637
- this.portalEl.setAttribute('aria-modal', 'false'); // Not a modal, can interact with rest of page
20638
21146
  // Append to body
20639
21147
  document.body.appendChild(this.portalEl);
20640
21148
  // Add global focus styles to match Pine design system
@@ -20649,22 +21157,25 @@ class PdsPopover {
20649
21157
  if (!this.portalEl)
20650
21158
  return;
20651
21159
  const portalId = this.portalEl.id;
21160
+ // componentId comes from the consumer, so it can carry characters cssEscape needs to
21161
+ // neutralize before the id is used as a selector or interpolated into stylesheet text.
21162
+ const escapedPortalId = cssEscape(portalId);
20652
21163
  // Check if style element already exists
20653
- const existingStyle = document.querySelector(`style[data-pds-popover-focus="${portalId}"]`);
21164
+ const existingStyle = document.querySelector(`style[data-pds-popover-focus="${escapedPortalId}"]`);
20654
21165
  if (existingStyle)
20655
21166
  return;
20656
21167
  // Create style element with Pine's focus ring styles and dark mode border
20657
21168
  const styleEl = document.createElement('style');
20658
21169
  styleEl.setAttribute('data-pds-popover-focus', portalId);
20659
21170
  styleEl.textContent = `
20660
- #${portalId}:focus {
21171
+ #${escapedPortalId}:focus {
20661
21172
  outline: var(--pine-outline-focus, 2px solid var(--pine-color-focus-ring, #6366f1)) !important;
20662
21173
  outline-offset: var(--pine-border-width, 1px);
20663
21174
  }
20664
- #${portalId}:focus:not(:focus-visible) {
21175
+ #${escapedPortalId}:focus:not(:focus-visible) {
20665
21176
  outline: none;
20666
21177
  }
20667
- [data-theme="dark"] #${portalId} {
21178
+ [data-theme="dark"] #${escapedPortalId} {
20668
21179
  border: var(--pine-border);
20669
21180
  }
20670
21181
  `;
@@ -20715,7 +21226,27 @@ class PdsPopover {
20715
21226
  // Clear tracking array
20716
21227
  this.movedNodes = [];
20717
21228
  }
21229
+ copyFocusStylesInto(root) {
21230
+ var _a, _b, _c;
21231
+ // Outside a shadow root the document's own style applies, so drop a copy left in one.
21232
+ if (!(root instanceof ShadowRoot)) {
21233
+ (_a = this.shadowFocusStyle) === null || _a === void 0 ? void 0 : _a.remove();
21234
+ this.shadowFocusStyle = null;
21235
+ return;
21236
+ }
21237
+ if (((_b = this.shadowFocusStyle) === null || _b === void 0 ? void 0 : _b.parentNode) === root || !this.portalEl)
21238
+ return;
21239
+ const source = document.querySelector(`style[data-pds-popover-focus="${cssEscape(this.portalEl.id)}"]`);
21240
+ if (!source)
21241
+ return;
21242
+ (_c = this.shadowFocusStyle) === null || _c === void 0 ? void 0 : _c.remove();
21243
+ this.shadowFocusStyle = source.cloneNode(true);
21244
+ root.appendChild(this.shadowFocusStyle);
21245
+ }
20718
21246
  removePortal() {
21247
+ var _a;
21248
+ (_a = this.shadowFocusStyle) === null || _a === void 0 ? void 0 : _a.remove();
21249
+ this.shadowFocusStyle = null;
20719
21250
  if (this.portalEl) {
20720
21251
  // Remove the portal element from DOM
20721
21252
  if (this.portalEl.parentNode) {
@@ -20723,7 +21254,7 @@ class PdsPopover {
20723
21254
  }
20724
21255
  // Remove the associated focus style element
20725
21256
  const portalId = this.portalEl.id;
20726
- const styleEl = document.querySelector(`style[data-pds-popover-focus="${portalId}"]`);
21257
+ const styleEl = document.querySelector(`style[data-pds-popover-focus="${cssEscape(portalId)}"]`);
20727
21258
  if (styleEl && styleEl.parentNode) {
20728
21259
  styleEl.parentNode.removeChild(styleEl);
20729
21260
  }
@@ -20740,9 +21271,13 @@ class PdsPopover {
20740
21271
  // Record open timestamp to prevent immediate close from opening click
20741
21272
  this.openTimestamp = Date.now();
20742
21273
  this.linkTriggerToPortal();
21274
+ this.placePortal();
20743
21275
  // Update portal content with latest slot content
20744
21276
  this.updatePortalContent();
20745
- // Show portal
21277
+ // Show portal. The attribute tells a modal around it that this popover takes Escape first; only
21278
+ // an auto popover listens for Escape.
21279
+ if (this.popoverType === 'auto')
21280
+ this.portalEl.setAttribute('data-pds-popover-open', '');
20746
21281
  this.portalEl.style.display = 'block';
20747
21282
  this.portalEl.style.opacity = '1';
20748
21283
  this.portalEl.style.visibility = 'visible';
@@ -20754,8 +21289,10 @@ class PdsPopover {
20754
21289
  });
20755
21290
  // Add scroll and resize listeners for repositioning (always)
20756
21291
  this.addScrollAndResizeListeners();
21292
+ document.addEventListener('submit', this.handleSubmitFromPanel, true);
20757
21293
  // Add document listeners for light dismiss and escape key (auto type only)
20758
21294
  if (this.popoverType === 'auto') {
21295
+ openAutoPopovers.push(this);
20759
21296
  this.addLightDismissListeners();
20760
21297
  }
20761
21298
  // Emit open event
@@ -20771,12 +21308,16 @@ class PdsPopover {
20771
21308
  if (!this.active || !this.portalEl)
20772
21309
  return;
20773
21310
  this.active = false;
20774
- // Restoring the content drops its focus to the body, so check where focus is first.
20775
- const focusWasInside = this.portalEl.contains(document.activeElement);
21311
+ this.unwatchDialogClose();
21312
+ // Restoring the content drops its focus to the body, so check where focus is first. In a
21313
+ // shadow root, document.activeElement is only its host.
21314
+ const focusWasInside = containsComposed$1(this.portalEl, deepActiveElement());
20776
21315
  this.linkTriggerToPortal();
20777
21316
  // Restore content back to original slot positions
20778
21317
  this.restorePortalContent();
20779
- // Hide portal
21318
+ // Hide portal. The dark-mode border set in a shadow root is worked out again on the next open.
21319
+ this.portalEl.style.border = '';
21320
+ this.portalEl.removeAttribute('data-pds-popover-open');
20780
21321
  this.portalEl.style.display = 'none';
20781
21322
  this.portalEl.style.opacity = '0';
20782
21323
  this.portalEl.style.visibility = 'hidden';
@@ -20786,8 +21327,10 @@ class PdsPopover {
20786
21327
  this.returnFocusToTrigger();
20787
21328
  }
20788
21329
  // Remove all listeners
21330
+ this.forgetOpen();
20789
21331
  this.removeLightDismissListeners();
20790
21332
  this.removeScrollAndResizeListeners();
21333
+ document.removeEventListener('submit', this.handleSubmitFromPanel, true);
20791
21334
  // Clear any pending timers
20792
21335
  this.clearDebounceTimers();
20793
21336
  // Emit close event
@@ -20807,6 +21350,59 @@ class PdsPopover {
20807
21350
  this.show();
20808
21351
  }
20809
21352
  }
21353
+ /**
21354
+ * Puts the panel where it shows above everything around the popover. In an open dialog, it goes
21355
+ * inside it: a modal dialog sits in the top layer above the body and makes the rest of the page
21356
+ * inert, and a non-modal one sits above it by z-index. Right after the popover, it's next in the
21357
+ * Tab order. In another component's slot, though, it would have no slot to render in, and in a
21358
+ * form its buttons would submit it, so there it goes at the end of the dialog.
21359
+ */
21360
+ placePortal() {
21361
+ var _a, _b;
21362
+ if (!this.portalEl)
21363
+ return;
21364
+ const dialog = closest$1('dialog[open]', this.el);
21365
+ if (!dialog) {
21366
+ this.unwatchDialogClose();
21367
+ this.portalEl.style.border = '';
21368
+ if (this.portalEl.parentElement !== document.body)
21369
+ document.body.appendChild(this.portalEl);
21370
+ this.copyFocusStylesInto(document);
21371
+ return;
21372
+ }
21373
+ const form = closest$1('form', this.el);
21374
+ const besidePopover = !((_a = this.el.parentElement) === null || _a === void 0 ? void 0 : _a.shadowRoot) && !(form && containsComposed$1(dialog, form));
21375
+ if (besidePopover) {
21376
+ if (this.el.nextElementSibling !== this.portalEl)
21377
+ (_b = this.el.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(this.portalEl, this.el.nextSibling);
21378
+ }
21379
+ else if (this.portalEl.parentNode !== dialog) {
21380
+ dialog.appendChild(this.portalEl);
21381
+ }
21382
+ this.watchDialogClose(dialog);
21383
+ const root = this.portalEl.getRootNode();
21384
+ this.copyFocusStylesInto(root);
21385
+ // In a shadow root, the copied dark-mode rule can't see a [data-theme="dark"] on the page.
21386
+ this.portalEl.style.border = root instanceof ShadowRoot && closest$1('[data-theme="dark"]', this.el) ? 'var(--pine-border)' : '';
21387
+ }
21388
+ forgetOpen() {
21389
+ const index = openAutoPopovers.indexOf(this);
21390
+ if (index >= 0)
21391
+ openAutoPopovers.splice(index, 1);
21392
+ }
21393
+ /**
21394
+ * Whether an Escape is this popover's. One from a dialog the popover isn't in belongs to that
21395
+ * dialog when it's above it: a top-layer dialog or a pds-modal. A plain non-modal dialog inside
21396
+ * the popover's modal doesn't close on Escape, so the popover takes it.
21397
+ */
21398
+ takesEscapeFrom(event) {
21399
+ var _a, _b;
21400
+ const origin = ((_b = (_a = event.composedPath) === null || _a === void 0 ? void 0 : _a.call(event)[0]) !== null && _b !== void 0 ? _b : event.target);
21401
+ const dialog = closest$1('dialog[open]', origin);
21402
+ if (!dialog || containsComposed$1(dialog, this.portalEl))
21403
+ return true;
21404
+ return !(dialog.classList.contains('pds-modal__backdrop') || dialog.matches(':modal'));
21405
+ }
20810
21406
  /**
20811
21407
  * Adds light dismiss listeners (click outside and escape key)
20812
21408
  */
@@ -20815,6 +21411,19 @@ class PdsPopover {
20815
21411
  document.addEventListener('click', this.boundClickOutsideHandler, true);
20816
21412
  document.addEventListener('keydown', this.boundEscapeKeyHandler);
20817
21413
  }
21414
+ /** Closes the popover when the dialog it opened in closes, so it isn't left open inside. */
21415
+ watchDialogClose(dialog) {
21416
+ if (this.watchedDialog === dialog)
21417
+ return;
21418
+ this.unwatchDialogClose();
21419
+ this.watchedDialog = dialog;
21420
+ dialog.addEventListener('close', this.onDialogClose);
21421
+ }
21422
+ unwatchDialogClose() {
21423
+ var _a;
21424
+ (_a = this.watchedDialog) === null || _a === void 0 ? void 0 : _a.removeEventListener('close', this.onDialogClose);
21425
+ this.watchedDialog = null;
21426
+ }
20818
21427
  /**
20819
21428
  * Removes light dismiss listeners
20820
21429
  */
@@ -20840,7 +21449,7 @@ class PdsPopover {
20840
21449
  * Handles clicks outside the popover for light dismiss (auto type only)
20841
21450
  */
20842
21451
  handleClickOutside(event) {
20843
- var _a, _b, _c, _d;
21452
+ var _a, _b;
20844
21453
  // Ignore events that occurred at or before the popover opened
20845
21454
  // This prevents the opening click from immediately closing the popover
20846
21455
  // Convert event.timeStamp (DOMHighResTimeStamp from performance.now()) to epoch time
@@ -20851,16 +21460,18 @@ class PdsPopover {
20851
21460
  if (eventTime <= this.openTimestamp) {
20852
21461
  return;
20853
21462
  }
20854
- const target = event.target;
21463
+ // In a shadow root, event.target is only its host.
21464
+ const target = ((_b = (_a = event.composedPath) === null || _a === void 0 ? void 0 : _a.call(event)[0]) !== null && _b !== void 0 ? _b : event.target);
20855
21465
  // A datepicker's calendar is portaled to the body: a click in the calendar of a datepicker
20856
- // inside this popover, in its content or its trigger, isn't outside it.
20857
- const calendar = (_b = (_a = target).closest) === null || _b === void 0 ? void 0 : _b.call(_a, '.pds-datepicker-calendar-portal');
21466
+ // inside this popover, in its content or its trigger, isn't outside it. The target can be
21467
+ // inside the calendar's shadow root, so look up across it.
21468
+ const calendar = closest$1('.pds-datepicker-calendar-portal', target);
20858
21469
  const owner = calendar === null || calendar === void 0 ? void 0 : calendar.pdsDatepicker;
20859
21470
  if (owner && (containsComposed$1(this.portalEl, owner) || containsComposed$1(this.triggerEl, owner)))
20860
21471
  return;
20861
21472
  // Check if click is outside both the popover portal and the trigger
20862
- const clickedInsidePopover = (_c = this.portalEl) === null || _c === void 0 ? void 0 : _c.contains(target);
20863
- const clickedInsideTrigger = (_d = this.triggerEl) === null || _d === void 0 ? void 0 : _d.contains(target);
21473
+ const clickedInsidePopover = containsComposed$1(this.portalEl, target);
21474
+ const clickedInsideTrigger = containsComposed$1(this.triggerEl, target);
20864
21475
  if (!clickedInsidePopover && !clickedInsideTrigger) {
20865
21476
  this.hide();
20866
21477
  }
@@ -20881,14 +21492,19 @@ class PdsPopover {
20881
21492
  * Mirrors native Popover API: Escape closes and returns focus to trigger
20882
21493
  */
20883
21494
  handleEscapeKey(event) {
20884
- if (event.key === 'Escape') {
20885
- // Prevent default Escape behavior and stop propagation
20886
- // This mirrors native Popover API which handles Escape exclusively
20887
- event.preventDefault();
20888
- event.stopPropagation();
20889
- // Close popover and return focus to trigger
20890
- this.hide();
20891
- }
21495
+ // A control inside that closes on Escape (a datepicker, a combobox) has handled it already.
21496
+ if (event.key !== 'Escape' || event.defaultPrevented)
21497
+ return;
21498
+ // Like the native Popover API, Escape closes only the top popover: the last one opened that
21499
+ // it applies to. Every open popover hears it, so each checks whether it's that one.
21500
+ const top = [...openAutoPopovers].reverse().find(popover => popover.takesEscapeFrom(event));
21501
+ if (top !== this)
21502
+ return;
21503
+ // Take the key, so the dialog or modal around it doesn't close too.
21504
+ event.preventDefault();
21505
+ event.stopPropagation();
21506
+ // Close popover and return focus to trigger
21507
+ this.hide();
20892
21508
  }
20893
21509
  /**
20894
21510
  * Handles scroll events to reposition the popover (debounced for performance)
@@ -20993,13 +21609,20 @@ class PdsPopover {
20993
21609
  }
20994
21610
  this.portalEl.style.top = `${top}px`;
20995
21611
  this.portalEl.style.left = `${left}px`;
21612
+ // `position: fixed` measures from the viewport unless an ancestor becomes its containing block,
21613
+ // as a modal dialog does with its backdrop filter. Shift by however far it landed from the spot.
21614
+ const placed = this.portalEl.getBoundingClientRect();
21615
+ if (Math.abs(placed.top - top) > 0.5 || Math.abs(placed.left - left) > 0.5) {
21616
+ this.portalEl.style.top = `${2 * top - placed.top}px`;
21617
+ this.portalEl.style.left = `${2 * left - placed.left}px`;
21618
+ }
20996
21619
  // Reset the repositioning guard after a short delay
20997
21620
  setTimeout(() => {
20998
21621
  this.isRepositioning = false;
20999
21622
  }, 16); // ~1 frame at 60fps
21000
21623
  }
21001
21624
  render() {
21002
- return (hAsync(Host, { key: '66347d4922274d25504e5be134b36f05a3f12fdc', id: this.componentId }, hAsync("span", { key: '8f29d54d58cf0c66f86470c77c676716f1ab056f', class: "pds-popover__trigger-wrapper" }, hAsync("slot", { key: '5c89b687cfc01e67d3c11835e77755de88f03584', name: "trigger", onSlotchange: this.handleTriggerSlotChange })), hAsync("div", { key: '0ca9aff3021720098d86ec29eb69cbf149ef79a9', class: "pds-popover__content-slot-wrapper" }, hAsync("slot", { key: 'b73c3324d3322c41c68161e9ada51499c0e49cb0', onSlotchange: this.handleContentSlotChange }))));
21625
+ return (hAsync(Host, { key: 'da8a0c715df1199231b1265085f3f9ae0234032d', id: this.componentId }, hAsync("span", { key: 'f35023492399420829cec2e88556462f5ac1663e', class: "pds-popover__trigger-wrapper" }, hAsync("slot", { key: '38ebe92eebb87665467b3f92ff94dc8095450063', name: "trigger", onSlotchange: this.handleTriggerSlotChange })), hAsync("div", { key: '8917930f4520544d14bbd68b4c7936dd60af19e3', class: "pds-popover__content-slot-wrapper" }, hAsync("slot", { key: '28d3f9112256edd95721a79a7072a9e35a3712bf', onSlotchange: this.handleContentSlotChange }))));
21003
21626
  }
21004
21627
  get el() { return getElement(this); }
21005
21628
  static get watchers() { return {
@@ -21061,10 +21684,10 @@ class PdsProgress {
21061
21684
  this.hostKeeper.disconnect();
21062
21685
  }
21063
21686
  render() {
21064
- const normalizedFillColor = normalizeColorValue(this.fillColor);
21687
+ const normalizedFillColor = normalizeColorValue$1(this.fillColor);
21065
21688
  const hostClass = this.animated ? { 'is-animated': this.animated } : '';
21066
21689
  this.hostKeeper.record(hostClass);
21067
- return (hAsync(Host, { key: '5573a5c48eee2f7968835db92afdaebb73c1b85e', class: hostClass }, hAsync("div", { key: 'bb5cf260495be798f4272673884336022c28441e', class: "pds-progress" }, hAsync("label", { key: '017efa649ada73ec724b930e06bbf1ab19a18f61', class: "pds-progress__label", htmlFor: this.componentId }, this.label), hAsync("progress", { key: 'e648d910b072b7b2ca1c4a92c0832bf6e2ef5406', id: this.componentId, max: "100", style: normalizedFillColor ? { '--color-progress-fill': normalizedFillColor } : {}, value: this.percent })), this.showPercent && hAsync("div", { key: '1f9f1733ff2cd6e2ec81e9a46759ff451cf158f7', class: "pds-progress__percentage" }, this.percent, "%")));
21690
+ return (hAsync(Host, { key: 'a224e1e9bc50433553ab8bf4b0d772f01148ee76', class: hostClass }, hAsync("div", { key: '261742044f3d68c204cbf640cc4447eb6d74df11', class: "pds-progress" }, hAsync("label", { key: 'd686bdc6ab450bf8c14dd56077525a3139593f46', class: "pds-progress__label", htmlFor: this.componentId }, this.label), hAsync("progress", { key: 'c716e977a952a628aec600fa680aa9c3b8d0e996', id: this.componentId, max: "100", style: normalizedFillColor ? { '--color-progress-fill': normalizedFillColor } : {}, value: this.percent })), this.showPercent && hAsync("div", { key: '44176a580b435f69993be4a60ee2e888b87e10fb', class: "pds-progress__percentage" }, this.percent, "%")));
21068
21691
  }
21069
21692
  get el() { return getElement(this); }
21070
21693
  static get style() { return pdsProgressCss(); }
@@ -21099,7 +21722,7 @@ class PdsProperty {
21099
21722
  this.icon = 'star';
21100
21723
  }
21101
21724
  render() {
21102
- return (hAsync(Host, { key: '0f6195faaaf3adb11ad14f09a36c78f94e2bdf65', id: this.componentId }, hAsync("pds-box", { key: '0a9670c0e38065f5fbe035b81703e21155396ff8', "align-items": "center", gap: "xs" }, hAsync("pds-icon", { key: '13b497e8670bc5210a752b8c24b9fd6397b1a8c9', icon: this.icon, size: "var(--pine-dimension-sm)", "aria-hidden": "true" }), hAsync("slot", { key: 'a9b3cf5fd830b7551f68866a62341670f8b61b34' }))));
21725
+ return (hAsync(Host, { key: 'd599b62be4bacf1d89afcc26b14fc93bdc9bb3a4', id: this.componentId }, hAsync("pds-box", { key: 'd7f80f6598615c761d672893c8acab09bd9ea33f', "align-items": "center", gap: "xs" }, hAsync("pds-icon", { key: '15a6a6545c2cd2332bd830451106b7b08adc39ff', icon: this.icon, size: "var(--pine-dimension-sm)", "aria-hidden": "true" }), hAsync("slot", { key: '4e5661563b99ec56189447faabcdd1ae631159b2' }))));
21103
21726
  }
21104
21727
  static get style() { return pdsPropertyCss(); }
21105
21728
  static get cmpMeta() { return {
@@ -21218,13 +21841,13 @@ class PdsRadio {
21218
21841
  }
21219
21842
  render() {
21220
21843
  const renderLabelAndMessages = () => [
21221
- hAsync("label", { htmlFor: this.componentId, key: `${this.componentId}-label` }, hAsync("input", { key: 'add893cd82f79b9398589bd5c0a72d5ae4a90475', "aria-describedby": assignDescription(this.componentId, this.invalid, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid ? "true" : undefined, type: "radio", id: this.componentId, name: this.name, value: this.value, checked: this.checked, required: this.required, disabled: this.disabled, onChange: this.handleRadioChange, class: this.hasImage() ? 'visually-hidden' : '' }), hAsync("span", { key: 'b58eed8681d1932397d38ffe82515987e6486e08', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)),
21844
+ hAsync("label", { htmlFor: this.componentId, key: `${this.componentId}-label` }, hAsync("input", { key: 'ccd618855831bcee309e815f2cd2712fd4e8fe1f', "aria-describedby": assignDescription(this.componentId, this.invalid, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid ? "true" : undefined, type: "radio", id: this.componentId, name: this.name, value: this.value, checked: this.checked, required: this.required, disabled: this.disabled, onChange: this.handleRadioChange, class: this.hasImage() ? 'visually-hidden' : '' }), hAsync("span", { key: '2e372a880c28f48fb804bac2518208082c141fad', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)),
21222
21845
  this.helperMessage && (hAsync("div", { key: `${this.componentId}-helper`, class: 'pds-radio__message', id: messageId(this.componentId, 'helper') }, this.helperMessage)),
21223
- this.errorMessage && (hAsync("div", { key: `${this.componentId}-error`, class: `pds-radio__message pds-radio__message--error`, id: messageId(this.componentId, 'error'), "aria-live": "assertive" }, hAsync("pds-icon", { key: '7374924219e59eab46a7ced9e7062c3e674b4451', icon: danger, size: "small" }), this.errorMessage))
21846
+ this.errorMessage && (hAsync("div", { key: `${this.componentId}-error`, class: `pds-radio__message pds-radio__message--error`, id: messageId(this.componentId, 'error'), "aria-live": "assertive" }, hAsync("pds-icon", { key: '889d502575f6a162f450b6b58d76a6f6f1c74e4b', icon: danger, size: "small" }), this.errorMessage))
21224
21847
  ];
21225
21848
  const hostClass = this.classNames();
21226
21849
  this.hostKeeper.record(hostClass);
21227
- return (hAsync(Host, { key: '24269923f168d1d39ebfc1994619736f0dc8087a', class: hostClass }, this.hasImage() && (hAsync("div", { key: '74a72bef89aa012047cbf3a1744fcd33f13bb464', class: "pds-radio__image-container", part: "image-container" }, hAsync("slot", { key: '99dbcfdac86cb7c012fd44eab607217e21304bab', name: "image", onSlotchange: () => (this._hasImage = this.hasImageSlot()) }))), this.hasImage() ? (hAsync("div", { class: "pds-radio__content-wrapper" }, renderLabelAndMessages())) : (renderLabelAndMessages())));
21850
+ return (hAsync(Host, { key: '374003032b28407581a55f1fb0a304c49acf3c16', class: hostClass }, this.hasImage() && (hAsync("div", { key: '7eeb516267de1afcfa85fc7567999db488c2f4f5', class: "pds-radio__image-container", part: "image-container" }, hAsync("slot", { key: 'a312fea06f0c015bffab3bb392ff04d4913fd1c0', name: "image", onSlotchange: () => (this._hasImage = this.hasImageSlot()) }))), this.hasImage() ? (hAsync("div", { class: "pds-radio__content-wrapper" }, renderLabelAndMessages())) : (renderLabelAndMessages())));
21228
21851
  }
21229
21852
  get el() { return getElement(this); }
21230
21853
  static get style() { return labelCss$3() + pdsRadioCss(); }
@@ -21416,13 +22039,13 @@ class PdsRadioGroup {
21416
22039
  render() {
21417
22040
  const gapValue = this.getGapValue();
21418
22041
  const ariaDescribedBy = this.getAriaDescribedBy();
21419
- return (hAsync(Host, { key: '9dc78eb36bbc1b872f4320203dbbc64e43816ebf', class: this.classNames(), id: this._groupId, role: "group", "aria-describedby": ariaDescribedBy, style: {
22042
+ return (hAsync(Host, { key: 'bf8063c1a99e272bb3f6bc647998a6ef103f8a71', class: this.classNames(), id: this._groupId, role: "group", "aria-describedby": ariaDescribedBy, style: {
21420
22043
  '--pds-radio-group-gap': gapValue,
21421
- } }, this.groupLabel && (hAsync("div", { key: '7b6f95608dcf356b141ef5d590ff3070f83b5975', class: "pds-radio-group__label" }, this.groupLabel)), hAsync("div", { key: '6e1a634c9b81ca3f3bbbe9c6590bcd4efc97e6ea', class: {
22044
+ } }, this.groupLabel && (hAsync("div", { key: '8564ed3f8f99cdc1a0e5b189aacc6960923eb5f7', class: "pds-radio-group__label" }, this.groupLabel)), hAsync("div", { key: '2309c9373790182cde030c1dbda88fa3bdcaaf12', class: {
21422
22045
  'pds-radio-group__radios': true,
21423
22046
  'pds-radio-group__radios--row': this.direction === 'row',
21424
22047
  'pds-radio-group__radios--column': this.direction === 'column',
21425
- } }, hAsync("slot", { key: 'b5b16148f3c77d425a50b7ada8a822e9919ef5c5', onSlotchange: () => this.updateChildRadios() })), this.helperMessage && (hAsync("div", { key: 'ca6b98f926b8d7a53fda630170ac037c99f5ee85', class: "pds-radio-group__message", id: messageId(this._groupId, 'helper') }, this.helperMessage)), this.errorMessage && (hAsync("div", { key: '37b57e2622370364e619ea090712a7b79fe79501', class: "pds-radio-group__message pds-radio-group__message--error", id: messageId(this._groupId, 'error'), "aria-live": "assertive" }, hAsync("pds-icon", { key: '6a362d048a67312b1b227f71cc4b8f821ae0817e', icon: danger, size: "small" }), this.errorMessage))));
22048
+ } }, hAsync("slot", { key: 'd88dde3c631e25c01bc7b6d3ef5d517255fabd1a', onSlotchange: () => this.updateChildRadios() })), this.helperMessage && (hAsync("div", { key: 'a229214ed01663b0fc34f35e27c7148b4eb412ab', class: "pds-radio-group__message", id: messageId(this._groupId, 'helper') }, this.helperMessage)), this.errorMessage && (hAsync("div", { key: 'dc092f2e6dbef0cb369cf00a6eccf9a095a0313d', class: "pds-radio-group__message pds-radio-group__message--error", id: messageId(this._groupId, 'error'), "aria-live": "assertive" }, hAsync("pds-icon", { key: 'd242da328731e55fa52d8e624fdfc750bfa6cce4', icon: danger, size: "small" }), this.errorMessage))));
21426
22049
  }
21427
22050
  get el() { return getElement(this); }
21428
22051
  static get watchers() { return {
@@ -21531,7 +22154,7 @@ class PdsRow {
21531
22154
  'min-height': this.minHeight,
21532
22155
  }));
21533
22156
  this.hostKeeper.record(`pds-row ${rowClasses}`, rowInlineStyles);
21534
- return hAsync(Host, { key: 'ee3a32ae1376919c7c2d1fcf186a1b7c272ee085', class: `pds-row ${rowClasses}`, style: rowInlineStyles });
22157
+ return hAsync(Host, { key: '78a505fef7132f9545916155d2485a6d2df8f4a5', class: `pds-row ${rowClasses}`, style: rowInlineStyles });
21535
22158
  }
21536
22159
  get el() { return getElement(this); }
21537
22160
  static get style() { return pdsRowCss(); }
@@ -21803,7 +22426,7 @@ class PdsSelect {
21803
22426
  'has-action': hasAction && !this.hideLabel ? 'true' : null,
21804
22427
  };
21805
22428
  this.hostKeeper.record(hostClass, {}, hostAttributes);
21806
- return (hAsync(Host, Object.assign({ key: 'c99bfc000ad351298e154554a8b22635b1abb718', class: hostClass }, hostAttributes), hAsync("div", { key: '35374b150cbef745c6a6068ba5a2fde0803c0314', class: "pds-select" }, !this.hideLabel && (hAsync("div", { key: 'a3b9bae451c5c384606790a29bf8ab5fc70427c0', class: "pds-select__label-wrapper" }, hAsync("label", { key: '80d7740a05a6d3cce6d51224169eb6c2501c4896', htmlFor: this.componentId }, hAsync("span", { key: 'a51c02d7c84f75bb168889dab50cae807271c63d', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)), hasAction && this.renderAction())), hAsync("select", { key: '11444dad795bd02c008252a60e701125861e4af0', "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-label": this.hideLabel ? this.label : undefined, autocomplete: this.autocomplete || undefined, class: "pds-select__field", disabled: this.disabled, id: this.componentId, multiple: this.multiple, name: this.name, onBlur: this.onBlur, onChange: this.onSelectUpdate, onFocus: this.onFocus, onKeyDown: this.onKeyDown, part: "select", required: this.required, ref: (el) => (this.selectEl = el) }), hAsync("div", { key: 'ce54fa1df287d96a7503bb19cd2ba6c74a6da638', "aria-hidden": "true", class: "hidden", ref: (el) => (this.slotContainer = el) }, hAsync("slot", { key: '22c55e78999076a37d43fb708dabc7379dd4cee3', onSlotchange: this.handleSlotChange })), this.renderMessages(), !this.multiple && hAsync("pds-icon", { key: '45628074fbcdb259b8bba42299082423309a6968', "aria-hidden": "true", class: "pds-select__select-icon", icon: enlarge }))));
22429
+ return (hAsync(Host, Object.assign({ key: '343ed671e67dd1d6f9eb284b07e06d59877c64e9', class: hostClass }, hostAttributes), hAsync("div", { key: '650aed0869b02f658feb16ee99f17e1cd22e5a8e', class: "pds-select" }, !this.hideLabel && (hAsync("div", { key: '74739461acbea33c92279ec8ec9042d6af1773c1', class: "pds-select__label-wrapper" }, hAsync("label", { key: '1ad96ffd243000358edfbd79054ee770e1ba97d3', htmlFor: this.componentId }, hAsync("span", { key: 'b832868db4f9cd4fd2f8313054d2e96e106189ab', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)), hasAction && this.renderAction())), hAsync("select", { key: 'e83c1a1a0a5646fc8abf9e50bc374f52b56be773', "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-label": this.hideLabel ? this.label : undefined, autocomplete: this.autocomplete || undefined, class: "pds-select__field", disabled: this.disabled, id: this.componentId, multiple: this.multiple, name: this.name, onBlur: this.onBlur, onChange: this.onSelectUpdate, onFocus: this.onFocus, onKeyDown: this.onKeyDown, part: "select", required: this.required, ref: (el) => (this.selectEl = el) }), hAsync("div", { key: 'a34880120b88124b5122350856d023368f96abf7', "aria-hidden": "true", class: "hidden", ref: (el) => (this.slotContainer = el) }, hAsync("slot", { key: 'df6abaf6a630761a32b263813181ff3453757e0d', onSlotchange: this.handleSlotChange })), this.renderMessages(), !this.multiple && hAsync("pds-icon", { key: 'f9197284ef9965d693242a652b583f48bc3d7097', "aria-hidden": "true", class: "pds-select__select-icon", icon: enlarge }))));
21807
22430
  }
21808
22431
  static get formAssociated() { return true; }
21809
22432
  get el() { return getElement(this); }
@@ -24562,7 +25185,7 @@ class PdsSortable {
24562
25185
  render() {
24563
25186
  const classNames = this.classNames();
24564
25187
  this.hostKeeper.record(classNames);
24565
- return (hAsync(Host, { key: 'fb6e9a79babf01980c04ee7208d195510493a7dc', class: classNames, id: this.componentId }, hAsync("slot", { key: '5735ca3af531a736f07d1fafde8ae544d00a75bb' })));
25188
+ return (hAsync(Host, { key: 'a0e532d31561748b4632a6be9163562f990af804', class: classNames, id: this.componentId }, hAsync("slot", { key: 'd1b0defb683f841e6708374fff4bf62eb7fd5080' })));
24566
25189
  }
24567
25190
  get el() { return getElement(this); }
24568
25191
  static get watchers() { return {
@@ -24637,7 +25260,7 @@ class PdsSortableItem {
24637
25260
  }
24638
25261
  render() {
24639
25262
  this.hostKeeper.record('pds-sortable-item');
24640
- return (hAsync(Host, { key: '3f9098a7c938bfa6443f08fb8b0a7c7217230890', class: "pds-sortable-item", id: this.componentId }, this.showHandle && (hAsync("div", { key: '77718a6867ddd8bc029bb3ef995f6ee9a5999ce7', class: "pds-sortable-item__handle" }, hAsync("pds-icon", { key: 'aad7f46e776ece85858798f8f1a1a50c9022b84f', "aria-hidden": "true", icon: handle }))), hAsync("slot", { key: 'afa9346ec8fd7aa6132a15dd44d3b1cae24500b9' }), this.enableActions && (hAsync("div", { key: 'c28c85391117542999c12d673879768394002c90', class: "pds-sortable-item__actions" }, hAsync("slot", { key: '88ab53f3ba4ed47715e31935b861d9ab42342b32', name: "sortable-item-actions" })))));
25263
+ return (hAsync(Host, { key: '2065ccb474ae4b7032edc3c37aa6855f3048909d', class: "pds-sortable-item", id: this.componentId }, this.showHandle && (hAsync("div", { key: '32385cc94837a3d0bc1c496615135c79274afe35', class: "pds-sortable-item__handle" }, hAsync("pds-icon", { key: 'ea94e28b2867aa20622ca073dc31d3b4a11eebbb', "aria-hidden": "true", icon: handle }))), hAsync("slot", { key: 'fb18aa90be0b8fa3832a5dd2b02a7b571205341f' }), this.enableActions && (hAsync("div", { key: '4c6e59d77a7b2183552533a544f4a70ce0cc7011', class: "pds-sortable-item__actions" }, hAsync("slot", { key: '497b1ff88436175d9365a28032e109b6fa118e44', name: "sortable-item-actions" })))));
24641
25264
  }
24642
25265
  get el() { return getElement(this); }
24643
25266
  static get style() { return pdsSortableItemCss(); }
@@ -24760,9 +25383,9 @@ class PdsSwitch {
24760
25383
  const hostClass = this.switchClassNames();
24761
25384
  const ariaDisabled = this.disabled ? 'true' : null;
24762
25385
  this.hostKeeper.record(hostClass, {}, { 'aria-disabled': ariaDisabled });
24763
- return (hAsync(Host, { key: '6d4b51307f2619a99981e344f782f69871aabf0f', class: hostClass, "aria-disabled": ariaDisabled }, hAsync("label", { key: '068ef3759e2bc3d9870cff36714de0e9cf558b2b', htmlFor: this.componentId }, hAsync("input", Object.assign({ key: 'aa28fb67332bb2d81c09b6c749c1cb0f079e327f', "aria-describedby": assignDescription(this.componentId, this.invalid, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid ? "true" : undefined, checked: this.checked, class: "pds-switch__input", disabled: this.disabled, id: this.componentId, name: this.name ? this.name : this.componentId, onChange: this.onSwitchUpdate, required: this.required, type: "checkbox", value: this.value }, this.inheritedAttributes)), hAsync("span", { key: 'd237980a9ce2abc04d57085df022f28dfa2768e4', class: this.hideLabel ? 'visually-hidden' : '' }, hAsync("slot", { key: '83d0e2110cfdcd3208319302af237178dfd419a4', name: "label", onSlotchange: this.updateHasLabelSlot }), !this.hasLabelSlot && this.label)), this.helperMessage &&
24764
- hAsync("div", { key: '137d9e5626b34ade33f68c4c24c3dcb154500dc6', class: `pds-switch__message`, id: messageId(this.componentId, 'helper') }, this.helperMessage), this.errorMessage &&
24765
- hAsync("div", { key: '64c3b8884d0568e26953f67a95d045aa5731c41f', class: `pds-switch__message pds-switch__message--error`, id: messageId(this.componentId, 'error'), "aria-live": "assertive" }, hAsync("pds-icon", { key: 'f99f8045eb33d0c60518f3b4c6a0183170a50f4a', icon: danger, size: "small" }), this.errorMessage)));
25386
+ return (hAsync(Host, { key: 'ee8576e523348ff9eed1b6087626849bb0966608', class: hostClass, "aria-disabled": ariaDisabled }, hAsync("label", { key: '09433b5356d718be65f4f2eb61f35fff1d000e10', htmlFor: this.componentId }, hAsync("input", Object.assign({ key: 'f996a0fad56119674cfb7d95e1444bf411b64396', "aria-describedby": assignDescription(this.componentId, this.invalid, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid ? "true" : undefined, checked: this.checked, class: "pds-switch__input", disabled: this.disabled, id: this.componentId, name: this.name ? this.name : this.componentId, onChange: this.onSwitchUpdate, required: this.required, type: "checkbox", value: this.value }, this.inheritedAttributes)), hAsync("span", { key: '4b23305d3cc0f5b37b23c6b79a14cfba57c16816', class: this.hideLabel ? 'visually-hidden' : '' }, hAsync("slot", { key: '258b5ccf0d4b01518df3a37772d694cb37569ffa', name: "label", onSlotchange: this.updateHasLabelSlot }), !this.hasLabelSlot && this.label)), this.helperMessage &&
25387
+ hAsync("div", { key: 'c8196fa2ce832de3a8c6d987a78fd65d791c4c59', class: `pds-switch__message`, id: messageId(this.componentId, 'helper') }, this.helperMessage), this.errorMessage &&
25388
+ hAsync("div", { key: '948894dd2e642689af6cad545a0b31f7c4711d87', class: `pds-switch__message pds-switch__message--error`, id: messageId(this.componentId, 'error'), "aria-live": "assertive" }, hAsync("pds-icon", { key: 'd4b72b49bfd38a396b8f7c0686e1b2ef92d65491', icon: danger, size: "small" }), this.errorMessage)));
24766
25389
  }
24767
25390
  static get formAssociated() { return true; }
24768
25391
  get el() { return getElement(this); }
@@ -24804,6 +25427,7 @@ class PdsTab {
24804
25427
  constructor(hostRef) {
24805
25428
  registerInstance(this, hostRef);
24806
25429
  this.pdsTabClick = createEvent(this, "pdsTabClick");
25430
+ this.hostKeeper = new HostStylingKeeper();
24807
25431
  /**
24808
25432
  * Determines the tab's disabled state.
24809
25433
  * @defaultValue false
@@ -24822,6 +25446,12 @@ class PdsTab {
24822
25446
  /** @internal */
24823
25447
  this.selected = false;
24824
25448
  }
25449
+ connectedCallback() {
25450
+ this.hostKeeper.connect(this.el);
25451
+ }
25452
+ disconnectedCallback() {
25453
+ this.hostKeeper.disconnect();
25454
+ }
24825
25455
  // Unwraps a nested <a>/<button> left by a page-cache (Turbo, bfcache) reconnect.
24826
25456
  componentDidRender() {
24827
25457
  unwrapReconnectedContent(this.el.querySelector('.pds-tab__content'), 'a.pds-tab, button.pds-tab', '.pds-tab__content');
@@ -24857,6 +25487,9 @@ class PdsTab {
24857
25487
  return classes.filter(Boolean).join(' ');
24858
25488
  }
24859
25489
  render() {
25490
+ // The docs show consumers omitting `slot`, so server HTML doesn't carry it — a DOM morph
25491
+ // that strips it leaves this tab unslotted, and pds-tabs has no default slot. Put it back.
25492
+ this.hostKeeper.record('', {}, { slot: 'tabs' });
24860
25493
  const availabilityTabEdgeInlineStart = (hAsync("span", { class: "pds-tab-edge", role: "presentation" }));
24861
25494
  const availabilityTabEdgeInlineEnd = (hAsync("span", { class: "pds-tab-edge pds-tab-edge--end", role: "presentation" }));
24862
25495
  const content = (hAsync(Fragment, null, this.variant === "availability" && availabilityTabEdgeInlineStart, this.variant === "availability" && availabilityTabEdgeInlineEnd, hAsync("div", { class: "pds-tab__content" }, hAsync("slot", null))));
@@ -25176,7 +25809,7 @@ class PdsTableBody {
25176
25809
  registerInstance(this, hostRef);
25177
25810
  }
25178
25811
  render() {
25179
- return (hAsync(Host, { key: '0278bf4c680e9054748039dddbbb5cfcce3bb4e6', role: "rowgroup", part: "body" }, hAsync("slot", { key: '44cf68f3b0dff78312a3d31d898209544ce8131e' })));
25812
+ return (hAsync(Host, { key: '817532e93c8f91ef64cd0f90aa6c4372c3b7d83f', role: "rowgroup", part: "body" }, hAsync("slot", { key: '296ba876c6716e85252a06008bd55d59624223e3' })));
25180
25813
  }
25181
25814
  static get style() { return pdsTableBodyCss(); }
25182
25815
  static get cmpMeta() { return {
@@ -25314,11 +25947,11 @@ class PdsTableCell {
25314
25947
  return classNames.join(' ');
25315
25948
  }
25316
25949
  render() {
25317
- return (hAsync(Host, { key: 'c32bd43c6080e9a8a98578016973de9025e5d367', class: this.classNames(), role: "gridcell", part: "cell", style: this.tableRef &&
25950
+ return (hAsync(Host, { key: 'bedaeeb5723299656f872a760ed1dd80c7fe8793', class: this.classNames(), role: "gridcell", part: "cell", style: this.tableRef &&
25318
25951
  this.tableRef.fixedColumn &&
25319
25952
  this.tableRef.selectable
25320
25953
  ? { '--fixed-cell-position': '40px' }
25321
- : {} }, hAsync("slot", { key: '5b2af30784f41dcc7a0f66187f222ec2472f207f' })));
25954
+ : {} }, hAsync("slot", { key: '45182ee3e004097660432f552780b3d27671bd46' })));
25322
25955
  }
25323
25956
  get hostElement() { return getElement(this); }
25324
25957
  static get watchers() { return {
@@ -25387,7 +26020,7 @@ class PdsTableHead {
25387
26020
  }
25388
26021
  }
25389
26022
  render() {
25390
- return (hAsync(Host, { key: 'ca88406002f440e9b9eefa639dac056e85403bd8', role: "row", part: "head" }, this.tableRef && this.tableRef.selectable && (hAsync("pds-table-head-cell", { key: '7c1939791a0573c6eccdec66d7b6d5de122a42c1', part: this.tableRef.selectable ? 'checkbox-cell' : '' }, !this.tableRef.disableSelectAll && (hAsync("pds-checkbox", { key: '3a8581bbf9b5fc26396937e7d0bab370f6078090', componentId: this.generateUniqueId(), indeterminate: this.indeterminate, onInput: this.handleInput, label: "Select All Rows", hideLabel: true, checked: this.isSelected, part: "select-all-checkbox" })))), hAsync("slot", { key: 'a736a10378936d4e4de5b139f3f57a345483c1bb' })));
26023
+ return (hAsync(Host, { key: 'de3faae735e90f5fde1258b5acb826f5f9dbd170', role: "row", part: "head" }, this.tableRef && this.tableRef.selectable && (hAsync("pds-table-head-cell", { key: 'e590e57c8b37ec0ad18e96077401c4692bbd45a4', part: this.tableRef.selectable ? 'checkbox-cell' : '' }, !this.tableRef.disableSelectAll && (hAsync("pds-checkbox", { key: '44ca7eda63185672939909e121a86e6502080a7d', componentId: this.generateUniqueId(), indeterminate: this.indeterminate, onInput: this.handleInput, label: "Select All Rows", hideLabel: true, checked: this.isSelected, part: "select-all-checkbox" })))), hAsync("slot", { key: '0671df85d7989cff7266bfd3d1b4d62b332d2e81' })));
25391
26024
  }
25392
26025
  get hostElement() { return getElement(this); }
25393
26026
  static get style() { return pdsTableHeadCss(); }
@@ -25608,11 +26241,11 @@ class PdsTableHeadCell {
25608
26241
  return classNames.join(' ');
25609
26242
  }
25610
26243
  render() {
25611
- return (hAsync(Host, { key: 'de7b2fb674def0a8046e1940488d435176dc9851', class: this.classNames(), role: "columnheader", onClick: this.toggleSort, part: "head-cell", style: this.tableRef &&
26244
+ return (hAsync(Host, { key: '13de42d136c5b037cd1545cd5b789b4660e23b87', class: this.classNames(), role: "columnheader", onClick: this.toggleSort, part: "head-cell", style: this.tableRef &&
25612
26245
  this.tableRef.fixedColumn &&
25613
26246
  this.tableRef.selectable
25614
26247
  ? { '--fixed-cell-position': '40px' }
25615
- : {} }, hAsync("slot", { key: '4ada173faf7d106cca34920540703a1d04f7e5bd' }), this.sortable && this.isActive && (hAsync("pds-icon", { key: '1b0e87d74b6fa359e901a8e66479f37a88cdcf1c', icon: this.sortingDirection === 'asc' ? upSmall : downSmall, part: "sort-icon" }))));
26248
+ : {} }, hAsync("slot", { key: '96084d87a34d7b601a8e8325f344f1fe6601204e' }), this.sortable && this.isActive && (hAsync("pds-icon", { key: 'cba838fa029b280561676c2b57af7f8f00055511', icon: this.sortingDirection === 'asc' ? upSmall : downSmall, part: "sort-icon" }))));
25616
26249
  }
25617
26250
  get hostElement() { return getElement(this); }
25618
26251
  static get style() { return pdsTableHeadCellCss(); }
@@ -25778,7 +26411,7 @@ class PdsTableRow {
25778
26411
  }
25779
26412
  }
25780
26413
  render() {
25781
- return (hAsync(Host, { key: '16ca08eefa74468559a1c084b7619836f01b27af', class: this.classNames(), role: "row", part: "row" }, this.tableRef && this.tableRef.selectable && (hAsync("pds-table-cell", { key: '4b4d2ae15d519e08cd6710ddb6759923d478457c', part: this.tableRef.fixedColumn ? 'checkbox-cell' : 'checkbox-cell', class: this.tableRef.selectable ? 'has-checkbox' : '' }, hAsync("pds-checkbox", { key: '78b9a731113cce82c59f40713561033f563ffc5f', componentId: this.generateUniqueId(), onPdsCheckboxChange: this.handleCheckboxChange, indeterminate: this.indeterminate, label: "Select Row", hideLabel: true, checked: this.isSelected, part: "row-checkbox" }))), hAsync("slot", { key: '5522f2335912f59013e9fc1e1fc6070d645cd519' })));
26414
+ return (hAsync(Host, { key: '5323521abc5c2464299cf77520fb38ec81297866', class: this.classNames(), role: "row", part: "row" }, this.tableRef && this.tableRef.selectable && (hAsync("pds-table-cell", { key: 'eb94dd282f885d3466b6177b2454cbcc4f932466', part: this.tableRef.fixedColumn ? 'checkbox-cell' : 'checkbox-cell', class: this.tableRef.selectable ? 'has-checkbox' : '' }, hAsync("pds-checkbox", { key: '222eaaedd4bebddc18cebf01bf4da81004773a96', componentId: this.generateUniqueId(), onPdsCheckboxChange: this.handleCheckboxChange, indeterminate: this.indeterminate, label: "Select Row", hideLabel: true, checked: this.isSelected, part: "row-checkbox" }))), hAsync("slot", { key: '010f222fa02b1809ff818f7a030c2a12fc3e3abb' })));
25782
26415
  }
25783
26416
  get hostElement() { return getElement(this); }
25784
26417
  static get style() { return pdsTableRowCss(); }
@@ -25805,6 +26438,7 @@ const pdsTabpanelCss = () => `:host{display:block}:host(.pds-tabpanel--stretch-a
25805
26438
  class PdsTabpanel {
25806
26439
  constructor(hostRef) {
25807
26440
  registerInstance(this, hostRef);
26441
+ this.hostKeeper = new HostStylingKeeper();
25808
26442
  /**
25809
26443
  * Keeps track of the tabpanel selected state, this property is passed by parent component
25810
26444
  */
@@ -25816,12 +26450,22 @@ class PdsTabpanel {
25816
26450
  /** @internal */
25817
26451
  this.stretch = false;
25818
26452
  }
26453
+ connectedCallback() {
26454
+ this.hostKeeper.connect(this.el);
26455
+ }
26456
+ disconnectedCallback() {
26457
+ this.hostKeeper.disconnect();
26458
+ }
25819
26459
  // Unwraps a nested .pds-tabpanel left by a page-cache (Turbo, bfcache) reconnect.
25820
26460
  componentDidRender() {
25821
26461
  unwrapReconnectedContent(this.el.querySelector('.pds-tabpanel'), '.pds-tabpanel');
25822
26462
  }
25823
26463
  render() {
25824
- return (hAsync(Host, { key: '87b00d828c9cddbcccd5d6e89dab7541a3c5c839', slot: "tabpanels", class: this.stretch && this.selected ? "pds-tabpanel--stretch-active" : undefined }, hAsync("div", { key: 'd7058a727d010351c73b5287f45991d48ef71151', role: "tabpanel", id: this.parentComponentId + "__" + this.name + '-panel', tabindex: "0", "aria-labelledby": this.parentComponentId + "__" + this.name, class: this.selected ? "pds-tabpanel is-active" : "pds-tabpanel" }, hAsync("slot", { key: '97861fcd8432206a1115135fad919d75dc327112' }))));
26464
+ const hostClass = this.stretch && this.selected ? "pds-tabpanel--stretch-active" : "";
26465
+ // The docs show consumers omitting `slot`, so server HTML doesn't carry it — a DOM morph
26466
+ // that strips it (and the stretch-active class) leaves this panel unslotted. Put both back.
26467
+ this.hostKeeper.record(hostClass, {}, { slot: 'tabpanels' });
26468
+ return (hAsync(Host, { key: '5d867e31d0f5f14e18f1c81035991c90bb5fe529', slot: "tabpanels", class: hostClass || undefined }, hAsync("div", { key: '255d37a73089904cfb170cd89f7b829756f6295f', role: "tabpanel", id: this.parentComponentId + "__" + this.name + '-panel', tabindex: "0", "aria-labelledby": this.parentComponentId + "__" + this.name, class: this.selected ? "pds-tabpanel is-active" : "pds-tabpanel" }, hAsync("slot", { key: '714d3d0cf0fc6173e243a2b077d9b9918ae4acf9' }))));
25825
26469
  }
25826
26470
  get el() { return getElement(this); }
25827
26471
  static get style() { return pdsTabpanelCss(); }
@@ -25852,6 +26496,35 @@ class PdsTabs {
25852
26496
  constructor(hostRef) {
25853
26497
  registerInstance(this, hostRef);
25854
26498
  this.hostKeeper = new HostStylingKeeper();
26499
+ this.slotChangeScheduled = false;
26500
+ // The tab that most recently had focus, tracked continuously via `focusin` rather
26501
+ // than sampled inside handleSlotChange: removing a focused element blurs it to
26502
+ // <body> synchronously, but slotchange only fires later (a microtask checkpoint),
26503
+ // by which point the sample would already read <body>.
26504
+ this.lastFocusedTab = null;
26505
+ this.handleFocusIn = (event) => {
26506
+ var _a;
26507
+ const tab = (_a = event.target) === null || _a === void 0 ? void 0 : _a.closest('pds-tab');
26508
+ if (tab && tab.closest('pds-tabs') === this.el) {
26509
+ this.lastFocusedTab = tab;
26510
+ }
26511
+ };
26512
+ // Focus that leaves a tab forgets it, so replacing the tab later doesn't pull focus back,
26513
+ // including focus that moves into a panel. Focus moving to another tab is tracked again
26514
+ // by focusin, which follows focusout. Removing a focused tab also fires focusout (with no
26515
+ // relatedTarget), while the tab is still connected, so that case is checked a microtask
26516
+ // later: a tab that's gone by then was removed, and is kept so its focus can be restored.
26517
+ this.handleFocusOut = (event) => {
26518
+ const tab = this.lastFocusedTab;
26519
+ if (event.relatedTarget) {
26520
+ this.lastFocusedTab = null;
26521
+ return;
26522
+ }
26523
+ queueMicrotask(() => {
26524
+ if (this.lastFocusedTab === tab && (tab === null || tab === void 0 ? void 0 : tab.isConnected))
26525
+ this.lastFocusedTab = null;
26526
+ });
26527
+ };
25855
26528
  /**
25856
26529
  * Adds a divider rule beneath the tab list.
25857
26530
  * @defaultValue false
@@ -25871,12 +26544,44 @@ class PdsTabs {
25871
26544
  * @defaultValue false
25872
26545
  */
25873
26546
  this.nav = false;
26547
+ // The tabs and tabpanels slots fire slotchange separately, even for the same morph
26548
+ // (both swapped together). Coalesce same-tick firings into one re-collection pass
26549
+ // with a microtask, the way a single DOM mutation already only triggers one event.
26550
+ this.handleSlotChange = () => {
26551
+ if (this.slotChangeScheduled)
26552
+ return;
26553
+ this.slotChangeScheduled = true;
26554
+ this.activeTabNameBeforeSlotChange = this.activeTabName;
26555
+ queueMicrotask(() => {
26556
+ this.slotChangeScheduled = false;
26557
+ this.recollectAfterSlotChange();
26558
+ });
26559
+ };
25874
26560
  }
25875
26561
  connectedCallback() {
25876
26562
  this.hostKeeper.connect(this.el);
26563
+ this.el.addEventListener('focusin', this.handleFocusIn);
26564
+ this.el.addEventListener('focusout', this.handleFocusOut);
26565
+ // componentDidLoad only runs once, so a reconnect (the element moved in the DOM) re-attaches
26566
+ // the slotchange listeners disconnectedCallback removed. Before the first render the slots
26567
+ // don't exist yet, so this is a no-op and componentDidLoad attaches them.
26568
+ const isReconnect = this.tabsSlot != null;
26569
+ this.setupSlotChangeListeners();
26570
+ // Content can change while detached, with no listener to see it — re-collect now
26571
+ // instead of waiting on a slotchange that may never come if nothing changes again.
26572
+ if (isReconnect)
26573
+ this.handleSlotChange();
25877
26574
  }
25878
26575
  disconnectedCallback() {
26576
+ var _a, _b;
25879
26577
  this.hostKeeper.disconnect();
26578
+ this.el.removeEventListener('focusin', this.handleFocusIn);
26579
+ this.el.removeEventListener('focusout', this.handleFocusOut);
26580
+ (_a = this.tabsSlot) === null || _a === void 0 ? void 0 : _a.removeEventListener('slotchange', this.handleSlotChange);
26581
+ (_b = this.tabPanelsSlot) === null || _b === void 0 ? void 0 : _b.removeEventListener('slotchange', this.handleSlotChange);
26582
+ }
26583
+ componentDidLoad() {
26584
+ this.setupSlotChangeListeners();
25880
26585
  }
25881
26586
  tabClickHandler(event) {
25882
26587
  if (this.componentId === event.detail[1]) {
@@ -25904,8 +26609,8 @@ class PdsTabs {
25904
26609
  // Navigation mode is an explicit, single source of truth: `nav` drives both the
25905
26610
  // container (<nav> of links vs role=tablist of buttons) and every child tab (via
25906
26611
  // `navMode`), so the tabs present when the strip initializes can't mix the two.
25907
- // (Child discovery is load-time only, like `variant`/`id`; tabs added after load
25908
- // aren't managed.)
26612
+ // Unlike child discovery (re-run on slotchange), `nav` itself isn't watched — it's
26613
+ // a load-time mode switch, not something a consumer is expected to toggle live.
25909
26614
  get isNav() {
25910
26615
  return !!this.nav;
25911
26616
  }
@@ -25958,9 +26663,52 @@ class PdsTabs {
25958
26663
  this.tabs = allTabs.filter(tab => tab.closest('pds-tabs') === this.el);
25959
26664
  this.tabPanels = allTabPanels.filter(panel => panel.closest('pds-tabs') === this.el);
25960
26665
  }
26666
+ // The initial collection (componentWillLoad) only sees tabs/panels present at load.
26667
+ // A tab or panel added, removed or replaced afterwards — including by a DOM morph
26668
+ // swapping in a fresh copy — needs to be re-collected the same way pds-dropdown-menu,
26669
+ // pds-select and pds-multiselect already do for their own slotted content.
26670
+ setupSlotChangeListeners() {
26671
+ var _a, _b, _c, _d;
26672
+ this.tabsSlot = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('slot[name="tabs"]');
26673
+ this.tabPanelsSlot = (_b = this.el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('slot[name="tabpanels"]');
26674
+ (_c = this.tabsSlot) === null || _c === void 0 ? void 0 : _c.addEventListener('slotchange', this.handleSlotChange);
26675
+ (_d = this.tabPanelsSlot) === null || _d === void 0 ? void 0 : _d.addEventListener('slotchange', this.handleSlotChange);
26676
+ }
26677
+ recollectAfterSlotChange() {
26678
+ const previousActiveTabName = this.activeTabNameBeforeSlotChange;
26679
+ // A removed node stays referenced but disconnected — checked before
26680
+ // findAllChildren() re-collects, since that doesn't affect this either way.
26681
+ const focusedTabWasRemoved = !this.isNav && this.lastFocusedTab != null && !this.lastFocusedTab.isConnected;
26682
+ this.findAllChildren();
26683
+ this.warnOnNavConfig();
26684
+ // Keep the current selection if it still exists. Otherwise clear it so
26685
+ // passPropsToChildren() falls back to the first enabled tab, the same way
26686
+ // it does when a consumer never set activeTabName in the first place.
26687
+ if (previousActiveTabName != null && !this.tabs.some((tab) => tab.name === previousActiveTabName)) {
26688
+ this.activeTabName = undefined;
26689
+ }
26690
+ this.passPropsToChildren();
26691
+ // If the tab that last had focus was removed (e.g. replaced by a fresh copy),
26692
+ // the browser already silently dropped focus to <body> — restore it to the new
26693
+ // active tab's button so keyboard/screen-reader users don't lose their place.
26694
+ // Deferred a frame since a freshly-created pds-tab's button doesn't exist until
26695
+ // its own render completes; re-checked then in case focus moved on its own, to
26696
+ // the tabs or anywhere else — only focus the removal dropped to <body> is restored.
26697
+ if (focusedTabWasRemoved) {
26698
+ this.lastFocusedTab = null;
26699
+ requestAnimationFrame(() => {
26700
+ var _a;
26701
+ const active = document.activeElement;
26702
+ if (active && active !== document.body)
26703
+ return;
26704
+ const newActiveTab = this.tabs.find((tab) => tab.name === this.activeTabName);
26705
+ (_a = newActiveTab === null || newActiveTab === void 0 ? void 0 : newActiveTab.querySelector('button')) === null || _a === void 0 ? void 0 : _a.focus();
26706
+ });
26707
+ }
26708
+ }
25961
26709
  propGeneration(child, index = 0) {
25962
26710
  child.parentComponentId = this.componentId.toString();
25963
- child.variant = this.variant.toString();
26711
+ child.variant = this.variant;
25964
26712
  child.selected = (this.activeTabName === child.name) ? true : false;
25965
26713
  child['index'] = index;
25966
26714
  }
@@ -26016,7 +26764,7 @@ class PdsTabs {
26016
26764
  // Only the classes: `active-tab-name` backs the mutable activeTabName prop, so a morph that drops
26017
26765
  // it is a prop change, not a strip.
26018
26766
  this.hostKeeper.record(hostClass);
26019
- return (hAsync(Host, { key: 'ea26bc4e4cadd4621511afa01ca2a353a053fd0e', "active-tab-name": this.activeTabName, class: hostClass, id: this.componentId }, tabList, hAsync("slot", { key: '3f920708c647920af3d0d50f74b5409d30d70af8', name: "tabpanels" })));
26767
+ return (hAsync(Host, { key: '91a9a5cf4348b73ef5ec21430db20468fb67906c', "active-tab-name": this.activeTabName, class: hostClass, id: this.componentId }, tabList, hAsync("slot", { key: 'f0ec002e513f3e91956e905c23e35dae0e6328ad', name: "tabpanels" })));
26020
26768
  }
26021
26769
  get el() { return getElement(this); }
26022
26770
  static get style() { return pdsTabsCss(); }
@@ -26142,7 +26890,7 @@ class PdsText {
26142
26890
  ? `pds-text--decoration-${this.decoration}`
26143
26891
  : ''}
26144
26892
  `;
26145
- return (hAsync(Tag, { key: '98269ec5b06387f89026a4f1327688c611b25a46', ref: (el) => (this.contentEl = el), style: this.color && setColor(this.color), class: typeClasses, part: "content" }, hAsync("slot", { key: '73b6169bdd25a73930d1a01db3a0b5359491ab67' })));
26893
+ return (hAsync(Tag, { key: '6ae89af63963745cd4e8fa734a62f37bc27c59ac', ref: (el) => (this.contentEl = el), style: this.color && setColor(this.color), class: typeClasses, part: "content" }, hAsync("slot", { key: '008f5852aeb4b43cff1a2fea9be9d8fbba9f7934' })));
26146
26894
  }
26147
26895
  get el() { return getElement(this); }
26148
26896
  static get watchers() { return {
@@ -26488,10 +27236,10 @@ class PdsTextarea {
26488
27236
  }
26489
27237
  render() {
26490
27238
  const value = this.getValue();
26491
- return (hAsync(Host, { key: '2544624ceb5a51981954b76eb7a96f8bf0a258b5', "aria-disabled": this.disabled ? 'true' : null, "aria-readonly": this.readonly ? 'true' : null, "has-action": this.hasAction && !this.hideLabel ? 'true' : null }, hAsync("div", { key: 'e85e356a15dd11bbea276b122e67da23342e6ceb', class: "pds-textarea" }, this.label &&
26492
- hAsync("div", { key: '452e96073c2045c2cb2dfa0c9ef7f7102096ab51', class: "pds-textarea__label-wrapper" }, hAsync("label", { key: '84f88bb8211120801cab8b0d7a4915a128fadbfb', htmlFor: this.componentId }, hAsync("span", { key: '43038785de0cb8c833ccd546a00bfc8879c94ecb', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)), !this.hideLabel && this.renderAction()), hAsync("div", { key: '868a11635731026168c1ff75d81121ddb96ab7a6', class: "pds-textarea__field-wrapper" }, hAsync("textarea", Object.assign({ key: '80cb7da264045aba177d20f18df31b274afbf485', ref: (el) => this.nativeTextarea = el, "aria-describedby": assignDescription(this.componentId, this.invalid, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid ? "true" : undefined, autocomplete: this.autocomplete, class: this.textareaClassNames(), disabled: this.disabled, id: this.componentId, maxlength: this.maxLength, name: this.name, placeholder: this.placeholder, readOnly: this.readonly, required: this.required, rows: this.rows, onBlur: this.onBlur, onChange: this.onTextareaChange, onFocus: this.onFocus, onInput: this.onInput, onKeyDown: this.onKeyDown }, this.inheritedAttributes), value), this.renderCharacterCounter()), this.helperMessage &&
26493
- hAsync("p", { key: '493b4378b668a96c7c66cbf2435f9c9d06bd0a72', class: "pds-textarea__helper-message", id: messageId(this.componentId, 'helper') }, this.helperMessage), this.invalid &&
26494
- hAsync("p", { key: 'ae6826d389a2a92fbff8de62a0fd55811764eb15', "aria-live": "assertive", class: "pds-textarea__error-message", id: messageId(this.componentId, 'error') }, hAsync("pds-icon", { key: 'e3dd638311ee2617c8b8ae5743b4e87e5a773ebd', icon: danger, size: "small" }), this.errorMessage))));
27239
+ return (hAsync(Host, { key: '5933dab0c3cd25b1cf2f6851ece8e8064bc7f3b9', "aria-disabled": this.disabled ? 'true' : null, "aria-readonly": this.readonly ? 'true' : null, "has-action": this.hasAction && !this.hideLabel ? 'true' : null }, hAsync("div", { key: '4f1752514d8e5b0f0e3439515cb9e5f043607da1', class: "pds-textarea" }, this.label &&
27240
+ hAsync("div", { key: 'd4e6df0b381d781b70eeae72ff2f0e9428c0d901', class: "pds-textarea__label-wrapper" }, hAsync("label", { key: '747d82067eb571d02840cfd981865821099f288b', htmlFor: this.componentId }, hAsync("span", { key: 'bfab6e8ede66d0169dd020b7dd97e125aba417b0', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)), !this.hideLabel && this.renderAction()), hAsync("div", { key: 'a18611c03270e7491c1af69f931419c832192c06', class: "pds-textarea__field-wrapper" }, hAsync("textarea", Object.assign({ key: '868382c7b04a4e59c0daa9d98afcdc9048f6224f', ref: (el) => this.nativeTextarea = el, "aria-describedby": assignDescription(this.componentId, this.invalid, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid ? "true" : undefined, autocomplete: this.autocomplete, class: this.textareaClassNames(), disabled: this.disabled, id: this.componentId, maxlength: this.maxLength, name: this.name, placeholder: this.placeholder, readOnly: this.readonly, required: this.required, rows: this.rows, onBlur: this.onBlur, onChange: this.onTextareaChange, onFocus: this.onFocus, onInput: this.onInput, onKeyDown: this.onKeyDown }, this.inheritedAttributes), value), this.renderCharacterCounter()), this.helperMessage &&
27241
+ hAsync("p", { key: 'dcb36f21443d2a782c25b7c29c4ce6215f3b212b', class: "pds-textarea__helper-message", id: messageId(this.componentId, 'helper') }, this.helperMessage), this.invalid &&
27242
+ hAsync("p", { key: 'be30fb1a38453296e26b775955389c0ec569df67', "aria-live": "assertive", class: "pds-textarea__error-message", id: messageId(this.componentId, 'error') }, hAsync("pds-icon", { key: 'd93dce10d9d9db5815ac5f331848940aed735ba0', icon: danger, size: "small" }), this.errorMessage))));
26495
27243
  }
26496
27244
  static get formAssociated() { return true; }
26497
27245
  get el() { return getElement(this); }
@@ -26665,13 +27413,13 @@ class PdsToast {
26665
27413
  return this.icon && hAsync("pds-icon", { name: this.icon, class: "pds-toast__icon" });
26666
27414
  }
26667
27415
  render() {
26668
- return (hAsync(Host, { key: '250f871e3dfe412a11e8fe4c0e43c5ef7d886e9b', hidden: !this.isVisible }, hAsync("div", { key: '8c9d995cd597544a3c6ded08d18e09ff4619b364', class: {
27416
+ return (hAsync(Host, { key: '754a4583cefca47a3d3fea7dab036c06ea8aabcd', hidden: !this.isVisible }, hAsync("div", { key: '8ac294344ca459202c0883e724e09a4218342cc4', class: {
26669
27417
  'pds-toast': true,
26670
27418
  [`pds-toast--${this.type}`]: this.type !== 'default',
26671
27419
  'pds-toast--animating-out': this.isAnimatingOut
26672
- }, role: "alert", "aria-live": "polite" }, this.renderIcon(), hAsync("span", { key: '83c4cad9b619ca0ad77721b7472e240719459290', class: "pds-toast__message" }, hAsync("slot", { key: 'c2420b955c89eb8e32dd4a1aa8d89bbbbf1b9ca9' })), this.dismissible && (hAsync("button", { key: '940bb9f1d235d7c31a334bec9aefdfdbd1c5ccfd', type: "button", part: "dismiss", class: "pds-toast__button", onClick: () => {
27420
+ }, role: "alert", "aria-live": "polite" }, this.renderIcon(), hAsync("span", { key: 'eaf615d41c138e2c73088d29bac9349f49a63ba7', class: "pds-toast__message" }, hAsync("slot", { key: '33973447154d80b016f5a7954b0473db03228379' })), this.dismissible && (hAsync("button", { key: 'e189834633e1e648282ee43633fd05e53ce38869', type: "button", part: "dismiss", class: "pds-toast__button", onClick: () => {
26673
27421
  this.dismiss();
26674
- }, "aria-label": this.dismissLabel }, hAsync("pds-icon", { key: 'f6b68f4cf9df23b367ade351dd4f00fc6f6e6442', name: "remove" }))))));
27422
+ }, "aria-label": this.dismissLabel }, hAsync("pds-icon", { key: '623a0e4d56e30781fb31bcd085511c17a4777edc', name: "remove" }))))));
26675
27423
  }
26676
27424
  get el() { return getElement(this); }
26677
27425
  static get watchers() { return {
@@ -27046,9 +27794,9 @@ class PdsTooltip {
27046
27794
  }
27047
27795
  render() {
27048
27796
  const hostId = this.componentId || undefined;
27049
- return (hAsync(Host, { key: 'e80abb11248d9bf6aec1ae738c61692594975630', id: hostId, class: { 'pds-tooltip--is-open': this.opened } }, hAsync("span", { key: '9ff484925a1792302eee230a5c37a0268d536935', class: "pds-tooltip__trigger", onMouseEnter: this.handleShow, onMouseLeave: this.handleHide,
27797
+ return (hAsync(Host, { key: '2e28dff93cd22fd3816d71b67e38883061a8b2bc', id: hostId, class: { 'pds-tooltip--is-open': this.opened } }, hAsync("span", { key: '9e7ea50427587f61dcea1ea97e10d71f4d0c9d92', class: "pds-tooltip__trigger", onMouseEnter: this.handleShow, onMouseLeave: this.handleHide,
27050
27798
  /* focusin/out bubble; ensure keyboard users see tooltips */
27051
- onFocusin: this.handleShow, onFocusout: this.handleHide, ref: el => this.triggerEl = el }, hAsync("slot", { key: '738c314a816e82fd81a0c0e9895d51af45b75eb2' })), hAsync("div", { key: '5b0477cd433cae0b53c4d5ce5767dc703be28ee0', class: "pds-tooltip__content-slot-wrapper", hidden: true }, hAsync("slot", { key: '51ad497357c1d1547bba69d07fd7fa1b675c021f', name: "content" }))));
27799
+ onFocusin: this.handleShow, onFocusout: this.handleHide, ref: el => this.triggerEl = el }, hAsync("slot", { key: '08c1ff63c91b97b4df1362eb9b2e42b6fd556b11' })), hAsync("div", { key: '5cfe25e21d1f096b76335570fbb930a7bc8c95f8', class: "pds-tooltip__content-slot-wrapper", hidden: true }, hAsync("slot", { key: 'e7e8728d7c8a0c74933cef070aa38f88a1f53a32', name: "content" }))));
27052
27800
  }
27053
27801
  get el() { return getElement(this); }
27054
27802
  static get watchers() { return {