@pine-ds/core 4.9.0 → 4.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/components/mock-pds-modal.js +1 -1
  2. package/components/pds-chip2.js +1 -1
  3. package/components/pds-datepicker.js +1 -1
  4. package/components/pds-icon2.js +1 -1
  5. package/components/pds-link2.js +1 -1
  6. package/components/pds-modal2.js +1 -1
  7. package/components/pds-multiselect.js +1 -1
  8. package/components/pds-radio-group.js +1 -1
  9. package/components/pds-text2.js +1 -1
  10. package/components/pds-tooltip.js +1 -1
  11. package/components/portal-target.js +1 -0
  12. package/components/tabbable.js +1 -1
  13. package/components/truncation-tooltip.js +1 -1
  14. package/dist/cjs/{index-Do70atou.js → index-BDnbr0DK.js} +1 -1
  15. package/dist/cjs/{index-BsWY_xEJ.js → index-D9iJuJCP.js} +12 -0
  16. package/dist/cjs/loader.cjs.js +2 -2
  17. package/dist/cjs/mock-pds-modal.cjs.entry.js +2 -2
  18. package/dist/cjs/pds-accordion.cjs.entry.js +2 -2
  19. package/dist/cjs/pds-alert.cjs.entry.js +1 -1
  20. package/dist/cjs/pds-avatar.cjs.entry.js +2 -2
  21. package/dist/cjs/pds-box.cjs.entry.js +1 -1
  22. package/dist/cjs/pds-button.cjs.entry.js +2 -2
  23. package/dist/cjs/pds-checkbox.cjs.entry.js +2 -2
  24. package/dist/cjs/pds-chip.cjs.entry.js +6 -8
  25. package/dist/cjs/pds-combobox.cjs.entry.js +1 -1
  26. package/dist/cjs/pds-container.cjs.entry.js +1 -1
  27. package/dist/cjs/pds-copytext.cjs.entry.js +4 -3
  28. package/dist/cjs/pds-datepicker.cjs.entry.js +4 -41
  29. package/dist/cjs/pds-divider.cjs.entry.js +1 -1
  30. package/dist/cjs/pds-drawer-content.cjs.entry.js +1 -1
  31. package/dist/cjs/pds-drawer-footer.cjs.entry.js +1 -1
  32. package/dist/cjs/pds-drawer-header.cjs.entry.js +1 -1
  33. package/dist/cjs/pds-drawer.cjs.entry.js +1 -1
  34. package/dist/cjs/pds-dropdown-menu-item.cjs.entry.js +1 -1
  35. package/dist/cjs/pds-dropdown-menu-separator.cjs.entry.js +1 -1
  36. package/dist/cjs/pds-dropdown-menu.cjs.entry.js +1 -1
  37. package/dist/cjs/pds-filter.cjs.entry.js +2 -2
  38. package/dist/cjs/pds-filters.cjs.entry.js +1 -1
  39. package/dist/cjs/pds-icon.cjs.entry.js +54 -21
  40. package/dist/cjs/pds-image.cjs.entry.js +1 -1
  41. package/dist/cjs/pds-input.cjs.entry.js +2 -2
  42. package/dist/cjs/pds-link.cjs.entry.js +3 -3
  43. package/dist/cjs/pds-loader.cjs.entry.js +1 -1
  44. package/dist/cjs/pds-modal-content.cjs.entry.js +1 -1
  45. package/dist/cjs/pds-modal-footer.cjs.entry.js +1 -1
  46. package/dist/cjs/pds-modal-header.cjs.entry.js +1 -1
  47. package/dist/cjs/pds-modal.cjs.entry.js +3 -3
  48. package/dist/cjs/pds-multiselect.cjs.entry.js +11 -5
  49. package/dist/cjs/pds-popover.cjs.entry.js +2 -2
  50. package/dist/cjs/pds-progress.cjs.entry.js +1 -1
  51. package/dist/cjs/pds-property.cjs.entry.js +1 -1
  52. package/dist/cjs/pds-radio-group.cjs.entry.js +66 -5
  53. package/dist/cjs/pds-radio.cjs.entry.js +2 -2
  54. package/dist/cjs/pds-row.cjs.entry.js +1 -1
  55. package/dist/cjs/pds-select.cjs.entry.js +2 -2
  56. package/dist/cjs/pds-sortable-item.cjs.entry.js +2 -2
  57. package/dist/cjs/pds-sortable.cjs.entry.js +1 -1
  58. package/dist/cjs/pds-switch.cjs.entry.js +2 -2
  59. package/dist/cjs/pds-tab.cjs.entry.js +1 -1
  60. package/dist/cjs/pds-table-body.cjs.entry.js +1 -1
  61. package/dist/cjs/pds-table-cell.cjs.entry.js +3 -2
  62. package/dist/cjs/pds-table-head-cell.cjs.entry.js +2 -2
  63. package/dist/cjs/pds-table-head.cjs.entry.js +1 -1
  64. package/dist/cjs/pds-table-row.cjs.entry.js +1 -1
  65. package/dist/cjs/pds-table.cjs.entry.js +1 -1
  66. package/dist/cjs/pds-tabpanel.cjs.entry.js +1 -1
  67. package/dist/cjs/pds-tabs.cjs.entry.js +1 -1
  68. package/dist/cjs/pds-text.cjs.entry.js +29 -3
  69. package/dist/cjs/pds-textarea.cjs.entry.js +2 -2
  70. package/dist/cjs/pds-toast.cjs.entry.js +1 -1
  71. package/dist/cjs/pds-tooltip.cjs.entry.js +16 -5
  72. package/dist/cjs/pine-core.cjs.js +2 -2
  73. package/dist/cjs/portal-target-e8WQ6dLx.js +70 -0
  74. package/dist/cjs/{tabbable-CddSt_Hi.js → tabbable-BrrrGvdG.js} +2 -1
  75. package/dist/cjs/{truncation-tooltip-O5nQmXPw.js → truncation-tooltip-DdB78RIe.js} +43 -3
  76. package/dist/collection/components/pds-chip/pds-chip.js +2 -5
  77. package/dist/collection/components/pds-datepicker/calendar-portal.js +1 -38
  78. package/dist/collection/components/pds-link/pds-link.css +1 -1
  79. package/dist/collection/components/pds-link/stories/pds-link.stories.js +48 -0
  80. package/dist/collection/components/pds-modal/pds-modal.css +1 -1
  81. package/dist/collection/components/pds-multiselect/pds-multiselect.js +9 -3
  82. package/dist/collection/components/pds-radio-group/pds-radio-group.js +65 -4
  83. package/dist/collection/components/pds-text/pds-text.js +28 -3
  84. package/dist/collection/components/pds-text/stories/pds-text.stories.js +16 -0
  85. package/dist/collection/components/pds-tooltip/pds-tooltip.css +11 -0
  86. package/dist/collection/components/pds-tooltip/pds-tooltip.js +14 -3
  87. package/dist/collection/components/pds-tooltip/stories/pds-tooltip.stories.js +30 -0
  88. package/dist/collection/utils/portal-target.js +64 -0
  89. package/dist/collection/utils/tabbable.js +2 -1
  90. package/dist/collection/utils/truncation-tooltip.js +42 -3
  91. package/dist/docs.json +2 -2
  92. package/dist/esm/{index-BFSwd-GQ.js → index-4_RRPJTO.js} +12 -1
  93. package/dist/esm/{index-m3pqpeWg.js → index-DvN3tyZp.js} +1 -1
  94. package/dist/esm/loader.js +3 -3
  95. package/dist/esm/mock-pds-modal.entry.js +2 -2
  96. package/dist/esm/pds-accordion.entry.js +2 -2
  97. package/dist/esm/pds-alert.entry.js +1 -1
  98. package/dist/esm/pds-avatar.entry.js +2 -2
  99. package/dist/esm/pds-box.entry.js +1 -1
  100. package/dist/esm/pds-button.entry.js +2 -2
  101. package/dist/esm/pds-checkbox.entry.js +2 -2
  102. package/dist/esm/pds-chip.entry.js +5 -7
  103. package/dist/esm/pds-combobox.entry.js +1 -1
  104. package/dist/esm/pds-container.entry.js +1 -1
  105. package/dist/esm/pds-copytext.entry.js +4 -3
  106. package/dist/esm/pds-datepicker.entry.js +3 -40
  107. package/dist/esm/pds-divider.entry.js +1 -1
  108. package/dist/esm/pds-drawer-content.entry.js +1 -1
  109. package/dist/esm/pds-drawer-footer.entry.js +1 -1
  110. package/dist/esm/pds-drawer-header.entry.js +1 -1
  111. package/dist/esm/pds-drawer.entry.js +1 -1
  112. package/dist/esm/pds-dropdown-menu-item.entry.js +1 -1
  113. package/dist/esm/pds-dropdown-menu-separator.entry.js +1 -1
  114. package/dist/esm/pds-dropdown-menu.entry.js +1 -1
  115. package/dist/esm/pds-filter.entry.js +2 -2
  116. package/dist/esm/pds-filters.entry.js +1 -1
  117. package/dist/esm/pds-icon.entry.js +54 -21
  118. package/dist/esm/pds-image.entry.js +1 -1
  119. package/dist/esm/pds-input.entry.js +2 -2
  120. package/dist/esm/pds-link.entry.js +3 -3
  121. package/dist/esm/pds-loader.entry.js +1 -1
  122. package/dist/esm/pds-modal-content.entry.js +1 -1
  123. package/dist/esm/pds-modal-footer.entry.js +1 -1
  124. package/dist/esm/pds-modal-header.entry.js +1 -1
  125. package/dist/esm/pds-modal.entry.js +3 -3
  126. package/dist/esm/pds-multiselect.entry.js +11 -5
  127. package/dist/esm/pds-popover.entry.js +2 -2
  128. package/dist/esm/pds-progress.entry.js +1 -1
  129. package/dist/esm/pds-property.entry.js +1 -1
  130. package/dist/esm/pds-radio-group.entry.js +66 -5
  131. package/dist/esm/pds-radio.entry.js +2 -2
  132. package/dist/esm/pds-row.entry.js +1 -1
  133. package/dist/esm/pds-select.entry.js +2 -2
  134. package/dist/esm/pds-sortable-item.entry.js +2 -2
  135. package/dist/esm/pds-sortable.entry.js +1 -1
  136. package/dist/esm/pds-switch.entry.js +2 -2
  137. package/dist/esm/pds-tab.entry.js +1 -1
  138. package/dist/esm/pds-table-body.entry.js +1 -1
  139. package/dist/esm/pds-table-cell.entry.js +3 -2
  140. package/dist/esm/pds-table-head-cell.entry.js +2 -2
  141. package/dist/esm/pds-table-head.entry.js +1 -1
  142. package/dist/esm/pds-table-row.entry.js +1 -1
  143. package/dist/esm/pds-table.entry.js +1 -1
  144. package/dist/esm/pds-tabpanel.entry.js +1 -1
  145. package/dist/esm/pds-tabs.entry.js +1 -1
  146. package/dist/esm/pds-text.entry.js +29 -3
  147. package/dist/esm/pds-textarea.entry.js +2 -2
  148. package/dist/esm/pds-toast.entry.js +1 -1
  149. package/dist/esm/pds-tooltip.entry.js +16 -5
  150. package/dist/esm/pine-core.js +3 -3
  151. package/dist/esm/portal-target-CKRzRKdO.js +66 -0
  152. package/dist/esm/{tabbable-DCKBKRUy.js → tabbable-C6ZWpp3v.js} +2 -1
  153. package/dist/esm/{truncation-tooltip-D_gvhB9r.js → truncation-tooltip-CRSdYzpA.js} +43 -4
  154. package/dist/esm-es5/{index-BFSwd-GQ.js → index-4_RRPJTO.js} +1 -1
  155. package/dist/esm-es5/loader.js +1 -1
  156. package/dist/esm-es5/mock-pds-modal.entry.js +1 -1
  157. package/dist/esm-es5/pds-accordion.entry.js +1 -1
  158. package/dist/esm-es5/pds-alert.entry.js +1 -1
  159. package/dist/esm-es5/pds-avatar.entry.js +1 -1
  160. package/dist/esm-es5/pds-box.entry.js +1 -1
  161. package/dist/esm-es5/pds-button.entry.js +1 -1
  162. package/dist/esm-es5/pds-checkbox.entry.js +1 -1
  163. package/dist/esm-es5/pds-chip.entry.js +1 -1
  164. package/dist/esm-es5/pds-combobox.entry.js +2 -2
  165. package/dist/esm-es5/pds-container.entry.js +1 -1
  166. package/dist/esm-es5/pds-copytext.entry.js +1 -1
  167. package/dist/esm-es5/pds-datepicker.entry.js +1 -1
  168. package/dist/esm-es5/pds-divider.entry.js +1 -1
  169. package/dist/esm-es5/pds-drawer-content.entry.js +1 -1
  170. package/dist/esm-es5/pds-drawer-footer.entry.js +1 -1
  171. package/dist/esm-es5/pds-drawer-header.entry.js +1 -1
  172. package/dist/esm-es5/pds-drawer.entry.js +1 -1
  173. package/dist/esm-es5/pds-dropdown-menu-item.entry.js +1 -1
  174. package/dist/esm-es5/pds-dropdown-menu-separator.entry.js +1 -1
  175. package/dist/esm-es5/pds-dropdown-menu.entry.js +1 -1
  176. package/dist/esm-es5/pds-filter.entry.js +1 -1
  177. package/dist/esm-es5/pds-filters.entry.js +1 -1
  178. package/dist/esm-es5/pds-icon.entry.js +1 -1
  179. package/dist/esm-es5/pds-image.entry.js +1 -1
  180. package/dist/esm-es5/pds-input.entry.js +1 -1
  181. package/dist/esm-es5/pds-link.entry.js +1 -1
  182. package/dist/esm-es5/pds-loader.entry.js +1 -1
  183. package/dist/esm-es5/pds-modal-content.entry.js +1 -1
  184. package/dist/esm-es5/pds-modal-footer.entry.js +1 -1
  185. package/dist/esm-es5/pds-modal-header.entry.js +1 -1
  186. package/dist/esm-es5/pds-modal.entry.js +1 -1
  187. package/dist/esm-es5/pds-multiselect.entry.js +1 -1
  188. package/dist/esm-es5/pds-popover.entry.js +1 -1
  189. package/dist/esm-es5/pds-progress.entry.js +1 -1
  190. package/dist/esm-es5/pds-property.entry.js +1 -1
  191. package/dist/esm-es5/pds-radio-group.entry.js +1 -1
  192. package/dist/esm-es5/pds-radio.entry.js +1 -1
  193. package/dist/esm-es5/pds-row.entry.js +1 -1
  194. package/dist/esm-es5/pds-select.entry.js +1 -1
  195. package/dist/esm-es5/pds-sortable-item.entry.js +1 -1
  196. package/dist/esm-es5/pds-sortable.entry.js +1 -1
  197. package/dist/esm-es5/pds-switch.entry.js +1 -1
  198. package/dist/esm-es5/pds-tab.entry.js +1 -1
  199. package/dist/esm-es5/pds-table-body.entry.js +1 -1
  200. package/dist/esm-es5/pds-table-cell.entry.js +1 -1
  201. package/dist/esm-es5/pds-table-head-cell.entry.js +1 -1
  202. package/dist/esm-es5/pds-table-head.entry.js +1 -1
  203. package/dist/esm-es5/pds-table-row.entry.js +1 -1
  204. package/dist/esm-es5/pds-table.entry.js +1 -1
  205. package/dist/esm-es5/pds-tabpanel.entry.js +1 -1
  206. package/dist/esm-es5/pds-tabs.entry.js +1 -1
  207. package/dist/esm-es5/pds-text.entry.js +1 -1
  208. package/dist/esm-es5/pds-textarea.entry.js +1 -1
  209. package/dist/esm-es5/pds-toast.entry.js +1 -1
  210. package/dist/esm-es5/pds-tooltip.entry.js +1 -1
  211. package/dist/esm-es5/pine-core.js +1 -1
  212. package/dist/esm-es5/portal-target-CKRzRKdO.js +1 -0
  213. package/dist/esm-es5/tabbable-C6ZWpp3v.js +1 -0
  214. package/dist/esm-es5/truncation-tooltip-CRSdYzpA.js +1 -0
  215. package/dist/pine-core/{p-7a19477e.system.entry.js → p-01f1cdaf.system.entry.js} +1 -1
  216. package/dist/pine-core/{p-ee449a4b.entry.js → p-07323107.entry.js} +1 -1
  217. package/dist/pine-core/{p-14d872d3.entry.js → p-08b8e941.entry.js} +1 -1
  218. package/dist/pine-core/p-0d5f0ab5.system.entry.js +1 -0
  219. package/dist/pine-core/{p-3cc19ea8.system.entry.js → p-1415c988.system.entry.js} +1 -1
  220. package/dist/pine-core/{p-de176bd9.entry.js → p-143b33a6.entry.js} +1 -1
  221. package/dist/pine-core/{p-e9a53a88.system.entry.js → p-14dedf01.system.entry.js} +1 -1
  222. package/dist/pine-core/{p-60d27247.system.entry.js → p-19cf1d91.system.entry.js} +1 -1
  223. package/dist/pine-core/{p-bcf57566.entry.js → p-1ca8d183.entry.js} +1 -1
  224. package/dist/pine-core/p-1cc39908.system.entry.js +1 -0
  225. package/dist/pine-core/{p-11e7d660.entry.js → p-1e3ef425.entry.js} +1 -1
  226. package/dist/pine-core/{p-98cc327b.entry.js → p-1f62bb71.entry.js} +2 -2
  227. package/dist/pine-core/p-20079552.system.entry.js +1 -0
  228. package/dist/pine-core/{p-6f34ad9c.entry.js → p-2a18852f.entry.js} +1 -1
  229. package/dist/pine-core/{p-3ce7e72e.system.entry.js → p-2b9622c1.system.entry.js} +1 -1
  230. package/dist/pine-core/{p-9fbcba0d.entry.js → p-2dd30d12.entry.js} +1 -1
  231. package/dist/pine-core/{p-8b97dd57.system.entry.js → p-3306dc5a.system.entry.js} +1 -1
  232. package/dist/pine-core/{p-ce554098.entry.js → p-3610cb3b.entry.js} +1 -1
  233. package/dist/pine-core/{p-eb93cc6e.entry.js → p-37718637.entry.js} +1 -1
  234. package/dist/pine-core/{p-b6edfdfe.entry.js → p-383d84f4.entry.js} +2 -2
  235. package/dist/pine-core/{p-079c39d1.entry.js → p-39276663.entry.js} +1 -1
  236. package/dist/pine-core/{p-89fefe36.entry.js → p-39e57657.entry.js} +1 -1
  237. package/dist/pine-core/{p-ef4d8fea.entry.js → p-3c229091.entry.js} +1 -1
  238. package/dist/pine-core/p-3d34b967.system.entry.js +1 -0
  239. package/dist/pine-core/p-3e30a761.entry.js +1 -0
  240. package/dist/pine-core/{p-d8bedb58.system.entry.js → p-3f8bd3fb.system.entry.js} +1 -1
  241. package/dist/pine-core/{p-6845867f.system.entry.js → p-42d43c3f.system.entry.js} +1 -1
  242. package/dist/pine-core/{p-4ee44585.system.entry.js → p-42f70f93.system.entry.js} +1 -1
  243. package/dist/pine-core/{p-0bd61097.system.entry.js → p-4a90b9c8.system.entry.js} +1 -1
  244. package/dist/pine-core/{p-64283f7b.entry.js → p-4cfe922b.entry.js} +1 -1
  245. package/dist/pine-core/p-4d1a8803.entry.js +1 -0
  246. package/dist/pine-core/p-4d47023c.system.entry.js +1 -0
  247. package/dist/pine-core/{p-b037dcbd.system.entry.js → p-4d98bc0c.system.entry.js} +1 -1
  248. package/dist/pine-core/{p-3556f6ad.entry.js → p-50ddadbf.entry.js} +1 -1
  249. package/dist/pine-core/{p-1e5648bf.system.entry.js → p-548bce53.system.entry.js} +1 -1
  250. package/dist/pine-core/{p-ebf74c43.system.entry.js → p-54f1e86f.system.entry.js} +1 -1
  251. package/dist/pine-core/{p-92a8cf7d.entry.js → p-590df41a.entry.js} +1 -1
  252. package/dist/pine-core/{p-f549f2bc.entry.js → p-5946203c.entry.js} +1 -1
  253. package/dist/pine-core/{p-d7db749a.system.entry.js → p-5f181694.system.entry.js} +1 -1
  254. package/dist/pine-core/{p-9713d6a5.system.entry.js → p-60a30975.system.entry.js} +1 -1
  255. package/dist/pine-core/{p-d94ebe84.entry.js → p-61cfdbb2.entry.js} +1 -1
  256. package/dist/pine-core/p-62aa6a78.system.entry.js +1 -0
  257. package/dist/pine-core/{p-cb560aab.system.entry.js → p-63f85859.system.entry.js} +1 -1
  258. package/dist/pine-core/{p-001d4b86.entry.js → p-64bcb378.entry.js} +1 -1
  259. package/dist/pine-core/{p-bdde1e53.entry.js → p-67999353.entry.js} +1 -1
  260. package/dist/pine-core/{p-be3b4f12.system.entry.js → p-67f795d5.system.entry.js} +1 -1
  261. package/dist/pine-core/{p-6b6ae1be.entry.js → p-6a1aa8d3.entry.js} +1 -1
  262. package/dist/pine-core/p-6f4ab1ea.system.entry.js +1 -0
  263. package/dist/pine-core/{p-110b4051.system.entry.js → p-724baba3.system.entry.js} +1 -1
  264. package/dist/pine-core/p-72659a0e.system.entry.js +1 -0
  265. package/dist/pine-core/{p-08bbd3e6.system.entry.js → p-73efb1ed.system.entry.js} +1 -1
  266. package/dist/pine-core/p-7a51f15e.entry.js +1 -0
  267. package/dist/pine-core/p-7b978fff.system.entry.js +1 -0
  268. package/dist/pine-core/p-8436cbfb.entry.js +1 -0
  269. package/dist/pine-core/{p-ced6a814.system.entry.js → p-849ec281.system.entry.js} +1 -1
  270. package/dist/pine-core/p-87a32ded.system.entry.js +1 -0
  271. package/dist/pine-core/{p-f09f27ab.system.entry.js → p-89d38a82.system.entry.js} +1 -1
  272. package/dist/pine-core/{p-6602b4d0.entry.js → p-8ade17ce.entry.js} +1 -1
  273. package/dist/pine-core/{p-ebf0c51b.system.entry.js → p-8afd5f5b.system.entry.js} +1 -1
  274. package/dist/pine-core/{p-9fe4a64a.entry.js → p-8e7f75e6.entry.js} +1 -1
  275. package/dist/pine-core/{p-b9d71b76.entry.js → p-8fb520df.entry.js} +1 -1
  276. package/dist/pine-core/{p-3b5b8f73.entry.js → p-92115e88.entry.js} +1 -1
  277. package/dist/pine-core/p-93fd7dd8.system.entry.js +1 -0
  278. package/dist/pine-core/{p-239774c9.entry.js → p-947582e1.entry.js} +1 -1
  279. package/dist/pine-core/{p-98843402.system.entry.js → p-94c9b7d1.system.entry.js} +1 -1
  280. package/dist/pine-core/p-973c3ac0.entry.js +1 -0
  281. package/dist/pine-core/p-97653e60.entry.js +1 -0
  282. package/dist/pine-core/{p-7073146f.entry.js → p-97b73359.entry.js} +1 -1
  283. package/dist/pine-core/{p-bfdfbe9f.entry.js → p-99530cb5.entry.js} +1 -1
  284. package/dist/pine-core/p-9a776443.entry.js +1 -0
  285. package/dist/pine-core/{p-50af67ea.system.entry.js → p-9b32727a.system.entry.js} +1 -1
  286. package/dist/pine-core/{p-CjRCtzPD.system.js → p-BK1sLRfg.system.js} +1 -1
  287. package/dist/pine-core/p-C6ZWpp3v.js +1 -0
  288. package/dist/pine-core/p-CKRzRKdO.js +1 -0
  289. package/dist/pine-core/p-DQyF6v9Q.system.js +1 -0
  290. package/dist/pine-core/p-DwQ5Tjis.js +1 -0
  291. package/dist/pine-core/{p-BplEmwUQ.js → p-M31tvpDN.js} +2 -2
  292. package/dist/pine-core/{p-DXO1yd32.system.js → p-XK45dzWR.system.js} +1 -1
  293. package/dist/pine-core/{p-d9243653.system.entry.js → p-a09c9c5e.system.entry.js} +1 -1
  294. package/dist/pine-core/{p-55fce29e.entry.js → p-a4ce12ef.entry.js} +1 -1
  295. package/dist/pine-core/{p-dea2a254.entry.js → p-a594c41f.entry.js} +1 -1
  296. package/dist/pine-core/{p-2d5b1deb.entry.js → p-a9d96e22.entry.js} +1 -1
  297. package/dist/pine-core/{p-e1fdd53a.system.entry.js → p-ad5208a4.system.entry.js} +1 -1
  298. package/dist/pine-core/{p-9a8d2985.system.entry.js → p-b3d4f97a.system.entry.js} +2 -2
  299. package/dist/pine-core/{p-25bf2f26.system.entry.js → p-bcc378ba.system.entry.js} +2 -2
  300. package/dist/pine-core/{p-3f62581a.system.entry.js → p-bd7dc317.system.entry.js} +1 -1
  301. package/dist/pine-core/p-beb7a430.entry.js +1 -0
  302. package/dist/pine-core/p-bfa34194.entry.js +1 -0
  303. package/dist/pine-core/{p-5c46553f.system.entry.js → p-c2afe4f3.system.entry.js} +1 -1
  304. package/dist/pine-core/{p-17fc76e7.system.entry.js → p-c5e1eb3c.system.entry.js} +1 -1
  305. package/dist/pine-core/{p-7a14473e.entry.js → p-c7a53c4f.entry.js} +1 -1
  306. package/dist/pine-core/{p-5967d9fa.system.entry.js → p-c8a0b562.system.entry.js} +1 -1
  307. package/dist/pine-core/{p-735b3631.entry.js → p-c9ae7964.entry.js} +1 -1
  308. package/dist/pine-core/{p-b243767b.system.entry.js → p-cb9baf78.system.entry.js} +1 -1
  309. package/dist/pine-core/{p-6d64e6c7.entry.js → p-ce9fa14b.entry.js} +1 -1
  310. package/dist/pine-core/{p-68fdfb8f.system.entry.js → p-d018dc60.system.entry.js} +1 -1
  311. package/dist/pine-core/p-d47b2a6a.system.entry.js +1 -0
  312. package/dist/pine-core/{p-0790dd0d.system.entry.js → p-d48fe5a0.system.entry.js} +1 -1
  313. package/dist/pine-core/{p-414faecf.entry.js → p-d6f338e0.entry.js} +1 -1
  314. package/dist/pine-core/{p-b7cbd913.system.entry.js → p-d920d759.system.entry.js} +1 -1
  315. package/dist/pine-core/{p-87642228.entry.js → p-d9719e37.entry.js} +1 -1
  316. package/dist/pine-core/{p-f2c487e6.entry.js → p-db7fb5a3.entry.js} +1 -1
  317. package/dist/pine-core/{p-a7d25143.entry.js → p-e1d1b5d8.entry.js} +1 -1
  318. package/dist/pine-core/p-e3de6a1d.entry.js +1 -0
  319. package/dist/pine-core/{p-2c0047cd.entry.js → p-e7002cee.entry.js} +1 -1
  320. package/dist/pine-core/{p-5133e8be.system.entry.js → p-e82f758f.system.entry.js} +1 -1
  321. package/dist/pine-core/p-e84fa9ed.entry.js +1 -0
  322. package/dist/pine-core/{p-9dbc017f.system.entry.js → p-eb4f0daa.system.entry.js} +1 -1
  323. package/dist/pine-core/p-eeYeEogd.system.js +1 -0
  324. package/dist/pine-core/{p-b33ad96e.system.entry.js → p-eecd9ad8.system.entry.js} +1 -1
  325. package/dist/pine-core/{p-06279b93.system.entry.js → p-ef0eba9b.system.entry.js} +1 -1
  326. package/dist/pine-core/{p-0c60f577.system.entry.js → p-ef3a855f.system.entry.js} +1 -1
  327. package/dist/pine-core/{p-fc743f6e.entry.js → p-f018af99.entry.js} +1 -1
  328. package/dist/pine-core/{p-6dad76cb.system.entry.js → p-f11cce27.system.entry.js} +1 -1
  329. package/dist/pine-core/{p-bda7e3be.entry.js → p-f6f4fd42.entry.js} +1 -1
  330. package/dist/pine-core/{p-7fcf3d37.entry.js → p-f71d71ca.entry.js} +1 -1
  331. package/dist/pine-core/p-f9063262.system.entry.js +1 -0
  332. package/dist/pine-core/p-f99bd77f.entry.js +1 -0
  333. package/dist/pine-core/p-wB2y8gR7.system.js +1 -0
  334. package/dist/pine-core/pine-core.esm.js +1 -1
  335. package/dist/pine-core/pine-core.js +1 -1
  336. package/dist/types/components/pds-datepicker/calendar-portal.d.ts +0 -7
  337. package/dist/types/components/pds-radio-group/pds-radio-group.d.ts +8 -0
  338. package/dist/types/components/pds-text/pds-text.d.ts +4 -0
  339. package/dist/types/components/pds-tooltip/pds-tooltip.d.ts +1 -0
  340. package/dist/types/components.d.ts +2 -2
  341. package/dist/types/utils/portal-target.d.ts +17 -0
  342. package/dist/types/utils/truncation-tooltip.d.ts +5 -2
  343. package/dist/vscode.html-data.json +3 -3
  344. package/hydrate/index.js +258 -82
  345. package/hydrate/index.mjs +258 -82
  346. package/package.json +2 -2
  347. package/dist/esm-es5/tabbable-DCKBKRUy.js +0 -1
  348. package/dist/esm-es5/truncation-tooltip-D_gvhB9r.js +0 -1
  349. package/dist/pine-core/p-07b4524e.entry.js +0 -1
  350. package/dist/pine-core/p-22ae92f7.system.entry.js +0 -1
  351. package/dist/pine-core/p-272b24ad.system.entry.js +0 -1
  352. package/dist/pine-core/p-38b87aa2.system.entry.js +0 -1
  353. package/dist/pine-core/p-3afb1208.entry.js +0 -1
  354. package/dist/pine-core/p-463a29fa.entry.js +0 -1
  355. package/dist/pine-core/p-568a9a79.system.entry.js +0 -1
  356. package/dist/pine-core/p-5ce5836e.system.entry.js +0 -1
  357. package/dist/pine-core/p-5f3242c8.system.entry.js +0 -1
  358. package/dist/pine-core/p-60e3b1af.entry.js +0 -1
  359. package/dist/pine-core/p-7d3a20ba.entry.js +0 -1
  360. package/dist/pine-core/p-9201b497.system.entry.js +0 -1
  361. package/dist/pine-core/p-94597b73.entry.js +0 -1
  362. package/dist/pine-core/p-97be00f4.system.entry.js +0 -1
  363. package/dist/pine-core/p-9a8971e2.system.entry.js +0 -1
  364. package/dist/pine-core/p-CirzxZ33.js +0 -1
  365. package/dist/pine-core/p-D52aRqFx.system.js +0 -1
  366. package/dist/pine-core/p-DCKBKRUy.js +0 -1
  367. package/dist/pine-core/p-a2078add.entry.js +0 -1
  368. package/dist/pine-core/p-a48b025a.system.entry.js +0 -1
  369. package/dist/pine-core/p-ad3b1ec3.entry.js +0 -1
  370. package/dist/pine-core/p-b017eb99.system.entry.js +0 -1
  371. package/dist/pine-core/p-c02a32ec.entry.js +0 -1
  372. package/dist/pine-core/p-c1da80e5.entry.js +0 -1
  373. package/dist/pine-core/p-c233866c.system.entry.js +0 -1
  374. package/dist/pine-core/p-d7930540.entry.js +0 -1
  375. package/dist/pine-core/p-dfadfcd1.entry.js +0 -1
  376. package/dist/pine-core/p-e70cb112.system.entry.js +0 -1
  377. package/dist/pine-core/p-wXfuz0Bd.system.js +0 -1
  378. /package/dist/esm-es5/{index-m3pqpeWg.js → index-DvN3tyZp.js} +0 -0
  379. /package/dist/pine-core/{p-m3pqpeWg.js → p-DvN3tyZp.js} +0 -0
  380. /package/dist/pine-core/{p-DaCT2ssj.system.js → p-vFsJv75D.system.js} +0 -0
package/hydrate/index.js CHANGED
@@ -5648,7 +5648,7 @@ var setScopedSSR = (opts) => {
5648
5648
  var needsScopedSSR = () => scopedSSR;
5649
5649
  var scopedSSR = false;
5650
5650
 
5651
- const pdsModalCss$1 = () => `.pds-modal__backdrop{-ms-flex-align:start;align-items:flex-start;background-color:rgba(0, 0, 0, 0.4);border:0;display:-ms-flexbox;display:flex;height:100%;inset:0;-ms-flex-pack:center;justify-content:center;margin:0;max-height:100%;max-width:100%;opacity:0;padding:0;position:fixed;-webkit-transition:opacity var(--pine-motion-duration-base) var(--pine-motion-easing-in), visibility var(--pine-motion-duration-base) var(--pine-motion-easing-in);transition:opacity var(--pine-motion-duration-base) var(--pine-motion-easing-in), visibility var(--pine-motion-duration-base) var(--pine-motion-easing-in);visibility:hidden;width:100%;z-index:var(--pine-z-index-modal)}@supports ((-webkit-backdrop-filter: blur(3px)) or (backdrop-filter: blur(3px))){.pds-modal__backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}}pds-modal .pds-modal__backdrop{z-index:var(--pine-z-index-priority)}.pds-modal__backdrop::-webkit-backdrop{background:transparent}.pds-modal__backdrop::-ms-backdrop{background:transparent}.pds-modal__backdrop::backdrop{background:transparent}.pds-modal__backdrop[aria-modal=false]{overflow:auto;-ms-scroll-chaining:none;overscroll-behavior:contain}@supports ((-webkit-backdrop-filter: blur(3px)) or (backdrop-filter: blur(3px))){.pds-modal__backdrop[aria-modal=false]{-webkit-backdrop-filter:none;backdrop-filter:none}.pds-modal__backdrop[aria-modal=false]::before{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);content:"";inset:0;position:fixed;z-index:-1}}.pds-modal__backdrop.open{opacity:1;-webkit-transition-timing-function:var(--pine-motion-easing-out);transition-timing-function:var(--pine-motion-easing-out);visibility:visible}.pds-modal{background:var(--pine-color-background-overlay);border-radius:var(--pine-dimension-sm);-webkit-box-shadow:var(--pine-box-shadow-400);box-shadow:var(--pine-box-shadow-400);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:var(--pine-dimension-md);max-height:none;width:100%}.pds-modal.pds-modal--scrollable{max-height:calc(100vh - (5vh + 96px))}@supports (height: 100dvh){.pds-modal.pds-modal--scrollable{max-height:calc(100dvh - (5dvh + 96px))}}@media (min-width: 992px){.pds-modal{-webkit-margin-before:6vh;margin-block-start:6vh}@supports (height: 100dvh){.pds-modal{-webkit-margin-before:6dvh;margin-block-start:6dvh}}}@media (min-width: 1200px){.pds-modal{-webkit-margin-before:8vh;margin-block-start:8vh}@supports (height: 100dvh){.pds-modal{-webkit-margin-before:8dvh;margin-block-start:8dvh}}}.pds-modal--sm{max-width:520px}.pds-modal--md{max-width:700px}.pds-modal--lg{max-width:900px}.pds-modal--custom{max-width:var(--pds-modal-max-width, 700px)}.pds-modal--fullscreen{border-radius:0;height:100%;margin:0;max-height:100vh;max-width:100%}@supports (height: 100dvh){.pds-modal--fullscreen{max-height:100dvh}}.pds-modal--fullscreen.pds-modal--scrollable{max-height:100vh}@supports (height: 100dvh){.pds-modal--fullscreen.pds-modal--scrollable{max-height:100dvh}}.pds-modal--fullscreen .pds-modal-content{-ms-flex:1;flex:1}.pds-modal--scrollable pds-modal-content{-webkit-border-after:1px solid transparent;border-block-end:1px solid transparent;-webkit-border-before:1px solid transparent;border-block-start:1px solid transparent;overflow-y:auto}.pds-modal:not(.pds-modal--scrollable) pds-modal-content{overflow-y:visible}`;
5651
+ const pdsModalCss$1 = () => `.pds-modal__backdrop{-ms-flex-align:start;align-items:flex-start;background-color:rgba(0, 0, 0, 0.4);border:0;display:-ms-flexbox;display:flex;height:100%;inset:0;-ms-flex-pack:center;justify-content:center;margin:0;max-height:100%;max-width:100%;opacity:0;padding:0;position:fixed;-webkit-transition:opacity var(--pine-motion-duration-base) var(--pine-motion-easing-in), visibility var(--pine-motion-duration-base) var(--pine-motion-easing-in);transition:opacity var(--pine-motion-duration-base) var(--pine-motion-easing-in), visibility var(--pine-motion-duration-base) var(--pine-motion-easing-in);visibility:hidden;width:100%;z-index:var(--pine-z-index-modal)}@supports ((-webkit-backdrop-filter: blur(3px)) or (backdrop-filter: blur(3px))){.pds-modal__backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}}pds-modal pds-modal .pds-modal__backdrop{z-index:var(--pine-z-index-priority)}.pds-modal__backdrop::-webkit-backdrop{background:transparent}.pds-modal__backdrop::-ms-backdrop{background:transparent}.pds-modal__backdrop::backdrop{background:transparent}.pds-modal__backdrop[aria-modal=false]{overflow:auto;-ms-scroll-chaining:none;overscroll-behavior:contain}@supports ((-webkit-backdrop-filter: blur(3px)) or (backdrop-filter: blur(3px))){.pds-modal__backdrop[aria-modal=false]{-webkit-backdrop-filter:none;backdrop-filter:none}.pds-modal__backdrop[aria-modal=false]::before{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);content:"";inset:0;position:fixed;z-index:-1}}.pds-modal__backdrop.open{opacity:1;-webkit-transition-timing-function:var(--pine-motion-easing-out);transition-timing-function:var(--pine-motion-easing-out);visibility:visible}.pds-modal{background:var(--pine-color-background-overlay);border-radius:var(--pine-dimension-sm);-webkit-box-shadow:var(--pine-box-shadow-400);box-shadow:var(--pine-box-shadow-400);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:var(--pine-dimension-md);max-height:none;width:100%}.pds-modal.pds-modal--scrollable{max-height:calc(100vh - (5vh + 96px))}@supports (height: 100dvh){.pds-modal.pds-modal--scrollable{max-height:calc(100dvh - (5dvh + 96px))}}@media (min-width: 992px){.pds-modal{-webkit-margin-before:6vh;margin-block-start:6vh}@supports (height: 100dvh){.pds-modal{-webkit-margin-before:6dvh;margin-block-start:6dvh}}}@media (min-width: 1200px){.pds-modal{-webkit-margin-before:8vh;margin-block-start:8vh}@supports (height: 100dvh){.pds-modal{-webkit-margin-before:8dvh;margin-block-start:8dvh}}}.pds-modal--sm{max-width:520px}.pds-modal--md{max-width:700px}.pds-modal--lg{max-width:900px}.pds-modal--custom{max-width:var(--pds-modal-max-width, 700px)}.pds-modal--fullscreen{border-radius:0;height:100%;margin:0;max-height:100vh;max-width:100%}@supports (height: 100dvh){.pds-modal--fullscreen{max-height:100dvh}}.pds-modal--fullscreen.pds-modal--scrollable{max-height:100vh}@supports (height: 100dvh){.pds-modal--fullscreen.pds-modal--scrollable{max-height:100dvh}}.pds-modal--fullscreen .pds-modal-content{-ms-flex:1;flex:1}.pds-modal--scrollable pds-modal-content{-webkit-border-after:1px solid transparent;border-block-end:1px solid transparent;-webkit-border-before:1px solid transparent;border-block-start:1px solid transparent;overflow-y:auto}.pds-modal:not(.pds-modal--scrollable) pds-modal-content{overflow-y:visible}`;
5652
5652
 
5653
5653
  /**
5654
5654
  * Mock PdsModal component for testing purposes
@@ -5754,7 +5754,7 @@ class MockPdsModal {
5754
5754
  }; }
5755
5755
  }
5756
5756
 
5757
- /* pds-icons v10.7.0, ES Modules */
5757
+ /* pds-icons v10.8.0, ES Modules */
5758
5758
 
5759
5759
  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>";
5760
5760
  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>";
@@ -8998,6 +8998,74 @@ const computePosition = (reference, floating, options) => {
8998
8998
  });
8999
8999
  };
9000
9000
 
9001
+ /**
9002
+ * The native `<dialog>` or open `popover` (as pds-filter's) an element sits in, so a popup portaled
9003
+ * there shares its top layer and a click in it isn't outside it; otherwise `document.body`.
9004
+ * `closest()` stops at shadow boundaries and misses one that only wraps slotted content, so this
9005
+ * walks assigned slots and shadow hosts, as pds-combobox does. `isHost` picks which ancestor counts.
9006
+ */
9007
+ function findPortalTarget(from, isHost = isOpenDialogOrPopover) {
9008
+ const seen = new Set();
9009
+ let current = from;
9010
+ while (current && !seen.has(current)) {
9011
+ seen.add(current);
9012
+ if (current.nodeType === Node.ELEMENT_NODE && isHost(current)) {
9013
+ return current;
9014
+ }
9015
+ const assigned = current.nodeType === Node.ELEMENT_NODE ? current.assignedSlot : null;
9016
+ if (assigned) {
9017
+ current = assigned;
9018
+ continue;
9019
+ }
9020
+ const parent = current.parentNode;
9021
+ current = parent instanceof ShadowRoot ? parent.host : parent;
9022
+ }
9023
+ return document.body;
9024
+ }
9025
+ /**
9026
+ * A modal dialog or open popover, which paints in the top layer above anything in the body, that
9027
+ * sits in the document itself: the document's stylesheets don't reach into a shadow root.
9028
+ */
9029
+ function isTopLayerInDocument(el) {
9030
+ if (el.getRootNode() !== el.ownerDocument)
9031
+ return false;
9032
+ return matchesSafely(el, ':modal') || matchesSafely(el, ':popover-open');
9033
+ }
9034
+ /**
9035
+ * Calls `onClose` once `host` leaves the top layer (its dialog closes or its popover hides), and
9036
+ * returns a function that stops listening.
9037
+ */
9038
+ function onTopLayerClose(host, onClose) {
9039
+ const check = () => {
9040
+ if (!isTopLayerInDocument(host))
9041
+ onClose();
9042
+ };
9043
+ host.addEventListener('close', check);
9044
+ host.addEventListener('toggle', check);
9045
+ return () => {
9046
+ host.removeEventListener('close', check);
9047
+ host.removeEventListener('toggle', check);
9048
+ };
9049
+ }
9050
+ function isOpenDialogOrPopover(el) {
9051
+ // Only an open dialog: inside a closed one, the popup would be hidden with it.
9052
+ if (el.localName === 'dialog')
9053
+ return el.open;
9054
+ return el.hasAttribute('popover') && matchesSafely(el, ':popover-open');
9055
+ }
9056
+ function matchesSafely(el, selector) {
9057
+ try {
9058
+ return el.matches(selector);
9059
+ }
9060
+ catch (_a) {
9061
+ // A browser without the selector (no Popover API, or no :modal): no top layer to share.
9062
+ return false;
9063
+ }
9064
+ }
9065
+
9066
+ // Controls that clipped text can sit inside that already take focus, so the text adds no tab stop of its own.
9067
+ // Not any `[tabindex]`: a focusable scroll region full of chips would show every chip's tooltip at once.
9068
+ const FOCUSABLE_WRAPPER = 'a[href], button, summary, pds-button, pds-link, pds-tab, pds-dropdown-menu-item, [role="option"]';
9001
9069
  /** CSS class prefix used for truncation tooltip portal elements */
9002
9070
  const TOOLTIP_CLASS = 'pds-truncation-tooltip';
9003
9071
  /**
@@ -9007,7 +9075,8 @@ const TOOLTIP_CLASS = 'pds-truncation-tooltip';
9007
9075
  *
9008
9076
  * Z-Index Strategy:
9009
9077
  * Uses --pine-z-index-nuclear (9999) to ensure tooltips appear above all other UI elements.
9010
- * This is necessary because tooltips are portaled to document.body and must overlay:
9078
+ * This is necessary because tooltips are portaled to document.body, or into the modal dialog or
9079
+ * open popover around the host (the top layer, which no z-index reaches from the body), and must overlay:
9011
9080
  * - Modal dialogs
9012
9081
  * - Dropdown menus
9013
9082
  * - Other floating UI elements
@@ -9047,6 +9116,15 @@ function injectStyles() {
9047
9116
  opacity: 1;
9048
9117
  visibility: visible;
9049
9118
  }
9119
+ :is(dialog, [popover]) > .${TOOLTIP_CLASS} {
9120
+ font-style: normal;
9121
+ font-weight: normal;
9122
+ text-align: start;
9123
+ text-indent: 0;
9124
+ text-transform: none;
9125
+ white-space: normal;
9126
+ word-spacing: normal;
9127
+ }
9050
9128
  `;
9051
9129
  document.head.appendChild(style);
9052
9130
  }
@@ -9073,7 +9151,8 @@ function isFocusVisible(el) {
9073
9151
  *
9074
9152
  * When the element's text overflows, hovering the host element or giving it
9075
9153
  * keyboard focus will display a tooltip showing the full text content. The
9076
- * tooltip is rendered as a portal on document.body and positioned with Floating UI.
9154
+ * tooltip is rendered as a portal on document.body, or in the modal dialog or open popover around
9155
+ * the host, and positioned with Floating UI.
9077
9156
  *
9078
9157
  * Also owns the element's `tabindex` while it is clipped — see syncTabIndex.
9079
9158
  *
@@ -9083,6 +9162,7 @@ function setupTruncationTooltip(options) {
9083
9162
  const { hostEl, contentEl, getTooltipText, placement = 'top', reference = hostEl, manageTabIndex = true, focusEl = hostEl } = options;
9084
9163
  injectStyles();
9085
9164
  let portalEl = null;
9165
+ let stopWatchingPortalHost = null;
9086
9166
  let isHovering = false;
9087
9167
  let isHoveringPortal = false;
9088
9168
  let isFocused = false;
@@ -9161,7 +9241,11 @@ function setupTruncationTooltip(options) {
9161
9241
  contentDiv.className = `${TOOLTIP_CLASS}__content`;
9162
9242
  contentDiv.textContent = text.trim();
9163
9243
  portalEl.appendChild(contentDiv);
9164
- document.body.appendChild(portalEl);
9244
+ const portalHost = findPortalTarget(hostEl, isTopLayerInDocument);
9245
+ portalHost.appendChild(portalEl);
9246
+ // Closing that host moves no pointer, so a tooltip opened by touch would outlive it unseen.
9247
+ if (portalHost !== document.body)
9248
+ stopWatchingPortalHost = onTopLayerClose(portalHost, closeWithPortalHost);
9165
9249
  // Allow the user to hover into the tooltip to select/copy text
9166
9250
  portalEl.addEventListener('mouseenter', handlePortalMouseEnter);
9167
9251
  portalEl.addEventListener('mouseleave', handlePortalMouseLeave);
@@ -9200,6 +9284,10 @@ function setupTruncationTooltip(options) {
9200
9284
  }
9201
9285
  }
9202
9286
  function removePortal() {
9287
+ if (stopWatchingPortalHost !== null) {
9288
+ stopWatchingPortalHost();
9289
+ stopWatchingPortalHost = null;
9290
+ }
9203
9291
  if (portalEl) {
9204
9292
  portalEl.removeEventListener('mouseenter', handlePortalMouseEnter);
9205
9293
  portalEl.removeEventListener('mouseleave', handlePortalMouseLeave);
@@ -9233,6 +9321,14 @@ function setupTruncationTooltip(options) {
9233
9321
  return;
9234
9322
  removePortal();
9235
9323
  }
9324
+ // Hover and focus can't outlast a host that's no longer shown, so none of them keeps it open.
9325
+ function closeWithPortalHost() {
9326
+ isHovering = false;
9327
+ isHoveringPortal = false;
9328
+ isFocused = false;
9329
+ cancelHideTimeout();
9330
+ removePortal();
9331
+ }
9236
9332
  /**
9237
9333
  * Schedules tooltip removal after a short delay.
9238
9334
  *
@@ -9264,11 +9360,18 @@ function setupTruncationTooltip(options) {
9264
9360
  isHoveringPortal = false;
9265
9361
  scheduleHide();
9266
9362
  }
9363
+ // A second tab stop inside focusEl, such as another clipped text, bubbles its focus here too. Its event.target is
9364
+ // retargeted to the stop's outermost element in focusEl's tree, which sits beside hostEl rather than around or in it.
9365
+ function isFocusForHost(target) {
9366
+ return focusEl === hostEl || target === focusEl || target.contains(hostEl) || hostEl.contains(target);
9367
+ }
9267
9368
  // Keyboard focus only: focus from a click would pin the tooltip open after the pointer leaves.
9268
9369
  // Events from inside a shadow root arrive retargeted to its host, so test the innermost target.
9269
9370
  function showForVisibleFocus(event) {
9270
9371
  if (!isFocusVisible(event.composedPath()[0]))
9271
9372
  return;
9373
+ if (!isFocusForHost(event.target))
9374
+ return;
9272
9375
  isFocused = true;
9273
9376
  showTooltip();
9274
9377
  }
@@ -9328,9 +9431,6 @@ const SENTIMENT_DOT_COLORS = {
9328
9431
  success: 'var(--pine-chip-color-success-dot)',
9329
9432
  warning: 'var(--pine-chip-color-warning-dot)',
9330
9433
  };
9331
- // Controls a chip can sit inside that already take focus, so a clipped label adds no tab stop of its own.
9332
- // Not any `[tabindex]`: a focusable scroll region full of chips would show every chip's tooltip at once.
9333
- const FOCUSABLE_WRAPPER = 'a[href], button, summary, pds-button, pds-link, pds-tab, pds-dropdown-menu-item, [role="option"]';
9334
9434
  // Beside the listbox and level with the option, so the tooltip never covers the other options.
9335
9435
  function besideListbox(wrapper) {
9336
9436
  const option = (wrapper === null || wrapper === void 0 ? void 0 : wrapper.matches('[role="option"]')) ? wrapper : null;
@@ -9557,7 +9657,7 @@ class PdsChip {
9557
9657
  const hostClass = this.classNames();
9558
9658
  const hostStyles = this.hostStyles;
9559
9659
  this.hostKeeper.record(hostClass, hostStyles);
9560
- return (hAsync(Host, { key: '0e67ea3700e8a8e1ad3049b6eafced6934262335', class: hostClass, id: this.componentId, style: hostStyles }, this.setChipContent(), this.effectiveVariant === 'tag' && this.renderCloseButton()));
9660
+ return (hAsync(Host, { key: 'b5afded680c3fa09523a7928d13c2a566a8a504c', class: hostClass, id: this.componentId, style: hostStyles }, this.setChipContent(), this.effectiveVariant === 'tag' && this.renderCloseButton()));
9561
9661
  }
9562
9662
  get el() { return getElement(this); }
9563
9663
  static get style() { return pdsChipTokensCss() + pdsChipCss(); }
@@ -14417,44 +14517,6 @@ class CalendarPortal {
14417
14517
  }
14418
14518
  }
14419
14519
  CalendarPortal.className = 'pds-datepicker-calendar-portal';
14420
- /**
14421
- * The native `<dialog>` or open `popover` (as pds-filter's) the datepicker sits in, so the
14422
- * calendar shares its top layer and a click in it isn't outside it; otherwise `document.body`.
14423
- * `closest()` stops at shadow boundaries and misses one that only wraps slotted content, so this
14424
- * walks assigned slots and shadow hosts, as pds-combobox does.
14425
- */
14426
- function findPortalTarget(from) {
14427
- const seen = new Set();
14428
- let current = from;
14429
- while (current && !seen.has(current)) {
14430
- seen.add(current);
14431
- if (current.nodeType === Node.ELEMENT_NODE && isTopLayerHost(current)) {
14432
- return current;
14433
- }
14434
- const assigned = current.nodeType === Node.ELEMENT_NODE ? current.assignedSlot : null;
14435
- if (assigned) {
14436
- current = assigned;
14437
- continue;
14438
- }
14439
- const parent = current.parentNode;
14440
- current = parent instanceof ShadowRoot ? parent.host : parent;
14441
- }
14442
- return document.body;
14443
- }
14444
- function isTopLayerHost(el) {
14445
- // Only an open dialog: inside a closed one, the calendar would be hidden with it.
14446
- if (el.localName === 'dialog')
14447
- return el.open;
14448
- if (!el.hasAttribute('popover'))
14449
- return false;
14450
- try {
14451
- return el.matches(':popover-open');
14452
- }
14453
- catch (_a) {
14454
- // A browser without the Popover API: no top layer to share.
14455
- return false;
14456
- }
14457
- }
14458
14520
 
14459
14521
  const DEFAULT_LABELS = {
14460
14522
  'today': 'Today',
@@ -17942,12 +18004,16 @@ const pdsIconContent = new Map();
17942
18004
 
17943
18005
  const pdsIconCss = () => `:host{--dimension-icon-height:16px;--dimension-icon-width:16px;--color-icon-fill:currentColor;contain:strict;display:inline-block;fill:var(--color-icon-fill);-ms-flex-negative:0;flex-shrink:0;height:var(--dimension-icon-height);width:var(--dimension-icon-width)}:host .pdsicon{fill:var(--color-icon-fill)}.pds-icon-fill-none{fill:none}.icon-inner,.pds-icon,svg{display:block;height:100%;width:100%}:host(.flip-rtl):host-context([dir=rtl]) .icon-inner{-webkit-transform:scaleX(-1);transform:scaleX(-1)}:host(.flip-rtl:dir(rtl)) .icon-inner{-webkit-transform:scaleX(-1);transform:scaleX(-1)}:host(.flip-rtl:dir(ltr)) .icon-inner{-webkit-transform:scaleX(1);transform:scaleX(1)}`;
17944
18006
 
18007
+ // The attributes that give an icon its own accessible name.
18008
+ const NAMING_ATTRIBUTES = ['aria-label', 'aria-labelledby'];
17945
18009
  class PdsIcon {
17946
18010
  constructor(hostRef) {
17947
18011
  registerInstance(this, hostRef);
17948
18012
  this.didLoadIcon = false;
17949
18013
  this.iconName = null;
18014
+ this.warnedUnnamedFocusable = false;
17950
18015
  this.inheritedAttributes = {}; // eslint-disable-line @typescript-eslint/no-explicit-any
18016
+ this.isFocusable = false;
17951
18017
  this.isVisible = false;
17952
18018
  /**
17953
18019
  * The size of the icon. This can be
@@ -17956,10 +18022,6 @@ class PdsIcon {
17956
18022
  *
17957
18023
  */
17958
18024
  this.size = 'regular';
17959
- this.hasAriaHidden = () => {
17960
- const { el } = this;
17961
- return el.hasAttribute('aria-hidden') && el.getAttribute('aria-hidden') === 'true';
17962
- };
17963
18025
  }
17964
18026
  iconSize() {
17965
18027
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -17998,9 +18060,9 @@ class PdsIcon {
17998
18060
  }, 500);
17999
18061
  }
18000
18062
  componentWillLoad() {
18001
- this.inheritedAttributes = inheritAttributes(this.el, ['aria-label']);
18063
+ this.inheritedAttributes = inheritAttributes(this.el, NAMING_ATTRIBUTES);
18064
+ this.isFocusable = this.el.hasAttribute('tabindex');
18002
18065
  this.setCSSVariables();
18003
- this.setupInitialAriaLabel();
18004
18066
  }
18005
18067
  setCSSVariables() {
18006
18068
  var _a;
@@ -18009,6 +18071,7 @@ class PdsIcon {
18009
18071
  this.el.style.setProperty(`--color-icon-fill`, (_a = normalizeColorValue(this.color)) !== null && _a !== void 0 ? _a : 'currentColor');
18010
18072
  }
18011
18073
  connectedCallback() {
18074
+ this.observeNamingAttributes();
18012
18075
  // Handle re-connection during client-side navigation
18013
18076
  if (!this.isVisible && !this.svgContent) {
18014
18077
  this.waitUntilVisible(this.el, '50px', () => {
@@ -18027,14 +18090,16 @@ class PdsIcon {
18027
18090
  this.io.disconnect();
18028
18091
  this.io = undefined;
18029
18092
  }
18093
+ if (this.mo) {
18094
+ this.mo.disconnect();
18095
+ this.mo = undefined;
18096
+ }
18030
18097
  }
18031
18098
  updateStyles() {
18032
18099
  this.setCSSVariables();
18033
18100
  }
18034
18101
  onIconPropertyChange() {
18035
18102
  this.loadIcon();
18036
- // Update aria-label when icon properties change
18037
- this.setupInitialAriaLabel();
18038
18103
  }
18039
18104
  loadIcon() {
18040
18105
  // Reset load state when URL changes
@@ -18044,26 +18109,34 @@ class PdsIcon {
18044
18109
  this.iconName = getName(this.name, this.icon);
18045
18110
  }
18046
18111
  render() {
18047
- const { ariaLabel, flipRtl, iconName, inheritedAttributes } = this;
18112
+ const { flipRtl, iconName, inheritedAttributes } = this;
18048
18113
  const shouldIconAutoFlip = iconName
18049
18114
  ? shouldRtlFlipIcon(iconName, this.el) && flipRtl !== false
18050
18115
  : false;
18051
18116
  const shouldFlip = flipRtl || shouldIconAutoFlip;
18052
- // Use inherited aria-label if provided, otherwise fall back to auto-generated one
18053
- const finalAriaLabel = inheritedAttributes['aria-label'] || ariaLabel;
18054
- 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" }))));
18117
+ // An icon is decorative unless the author names it. A decorative icon is hidden
18118
+ // from assistive technology, so it contributes nothing to the accessible name of
18119
+ // the button or link it sits inside. Naming it from `name` instead would put an
18120
+ // icon id ("rocket-tone") into that control's name, where neither a screen reader
18121
+ // nor a page-inspecting agent can tell it apart from the real label.
18122
+ //
18123
+ // A focusable icon stays exposed even without a name: hiding something that
18124
+ // takes focus leaves keyboard users on an element a screen reader can't see.
18125
+ const isNamed = NAMING_ATTRIBUTES.some((attr) => inheritedAttributes[attr] !== undefined);
18126
+ const isDecorative = !isNamed && !this.isFocusable;
18127
+ return (hAsync(Host
18128
+ // undefined, not null: null would strip an aria-hidden the author set on a
18129
+ // named icon once the component re-renders.
18130
+ , Object.assign({ key: '6597475535756e7174072dc25c982137724d439d', "aria-hidden": isDecorative ? 'true' : undefined, alt: "", role: isDecorative ? null : 'img', class: Object.assign(Object.assign({}, createColorClasses(this.color)), { 'flip-rtl': shouldFlip, 'icon-rtl': shouldFlip && isRTL(this.el) }) }, inheritedAttributes), (hAsync("div", { class: "icon-inner" }))));
18055
18131
  }
18056
18132
  /*****
18057
18133
  * Private Methods
18058
18134
  ****/
18059
- setupInitialAriaLabel() {
18060
- // Only set aria-label during initial load if one isn't already provided
18061
- if (!this.inheritedAttributes['aria-label']) {
18062
- const iconName = getName(this.name, this.icon);
18063
- if (iconName) {
18064
- this.ariaLabel = iconName.replace(/\-/g, ' ');
18065
- }
18066
- }
18135
+ // The hide/expose decision reads the naming attributes and tabindex, which can
18136
+ // change after load (a React prop going from undefined to a string, or
18137
+ // setAttribute from script). Re-read them when they do.
18138
+ observeNamingAttributes() {
18139
+ return;
18067
18140
  }
18068
18141
  waitUntilVisible(el, rootMargin, cb) {
18069
18142
  {
@@ -18150,7 +18223,8 @@ class PdsIcon {
18150
18223
  "name": [513],
18151
18224
  "size": [513],
18152
18225
  "src": [1],
18153
- "ariaLabel": [32],
18226
+ "inheritedAttributes": [32],
18227
+ "isFocusable": [32],
18154
18228
  "isVisible": [32],
18155
18229
  "svgContent": [32]
18156
18230
  },
@@ -18566,7 +18640,7 @@ class PdsInput {
18566
18640
  }; }
18567
18641
  }
18568
18642
 
18569
- const pdsLinkCss = () => `:host{display:inline}:host pds-icon{-webkit-margin-start:var(--pine-dimension-2xs);margin-inline-start:var(--pine-dimension-2xs)}.pds-link{-ms-flex-align:center;align-items:center;color:var(--color, var(--pds-context-link-color, var(--pine-color-text)));display:-ms-inline-flexbox;display:inline-flex;font-weight:var(--pine-font-weight-medium)}.pds-link:focus-visible{border-radius:var(--pine-dimension-2xs);outline:var(--pine-outline-focus);outline-offset:var(--pine-border-width-thick);position:relative}.pds-link:hover{color:var(--color, var(--pds-context-link-color-hover, var(--pine-color-text-hover)));text-decoration:none}:host([color=secondary]) .pds-link{color:var(--pine-color-text-primary)}:host([color=secondary]) .pds-link:hover{color:var(--pine-color-text-inverse-secondary)}:host([color=accent]) .pds-link{color:var(--pine-color-accent)}:host([color=accent]) .pds-link:hover{color:var(--pine-color-accent-hover)}:host([color=danger]) .pds-link{color:var(--pine-color-danger)}:host([color=danger]) .pds-link:hover{color:var(--pine-color-danger-hover)}.pds-link--sm{font-size:var(--pine-font-size-body-xs)}.pds-link--sm pds-icon{height:var(--pine-dimension-xs);width:var(--pine-dimension-xs)}.pds-link--md{font-size:var(--pine-font-size-body-sm)}.pds-link--md pds-icon{height:var(--pine-dimension-xs);width:var(--pine-dimension-xs)}.pds-link--lg{font-size:var(--pine-font-size-body-md)}.pds-link--lg pds-icon{height:var(--pine-dimension-sm);width:var(--pine-dimension-sm)}.pds-link--plain{text-decoration:none}.pds-link--plain:hover{color:var(--color, var(--pds-context-link-color-hover, var(--pine-color-text-hover)));text-decoration:underline}:host([active]) .pds-link{color:var(--pds-context-link-color, var(--pine-color-text-strong));text-decoration:underline}:host([active]) .pds-link:hover{color:var(--pds-context-link-color-hover, var(--pine-color-text-strong));text-decoration:underline}`;
18643
+ const pdsLinkCss = () => `:host{display:inline}:host pds-icon{-webkit-margin-start:var(--pine-dimension-2xs);margin-inline-start:var(--pine-dimension-2xs)}.pds-link{-ms-flex-align:center;align-items:center;color:var(--color, var(--pds-context-link-color, var(--pine-color-text)));display:-ms-inline-flexbox;display:inline-flex;font-weight:var(--pine-font-weight-medium)}.pds-link:focus-visible{border-radius:var(--pine-dimension-2xs);isolation:isolate;outline:var(--pine-outline-focus);outline-offset:var(--pine-border-width-thick)}.pds-link:hover{color:var(--color, var(--pds-context-link-color-hover, var(--pine-color-text-hover)));text-decoration:none}:host([color=secondary]) .pds-link{color:var(--pine-color-text-primary)}:host([color=secondary]) .pds-link:hover{color:var(--pine-color-text-inverse-secondary)}:host([color=accent]) .pds-link{color:var(--pine-color-accent)}:host([color=accent]) .pds-link:hover{color:var(--pine-color-accent-hover)}:host([color=danger]) .pds-link{color:var(--pine-color-danger)}:host([color=danger]) .pds-link:hover{color:var(--pine-color-danger-hover)}.pds-link--sm{font-size:var(--pine-font-size-body-xs)}.pds-link--sm pds-icon{height:var(--pine-dimension-xs);width:var(--pine-dimension-xs)}.pds-link--md{font-size:var(--pine-font-size-body-sm)}.pds-link--md pds-icon{height:var(--pine-dimension-xs);width:var(--pine-dimension-xs)}.pds-link--lg{font-size:var(--pine-font-size-body-md)}.pds-link--lg pds-icon{height:var(--pine-dimension-sm);width:var(--pine-dimension-sm)}.pds-link--plain{text-decoration:none}.pds-link--plain:hover{color:var(--color, var(--pds-context-link-color-hover, var(--pine-color-text-hover)));text-decoration:underline}:host([active]) .pds-link{color:var(--pds-context-link-color, var(--pine-color-text-strong));text-decoration:underline}:host([active]) .pds-link:hover{color:var(--pds-context-link-color-hover, var(--pine-color-text-strong));text-decoration:underline}`;
18570
18644
 
18571
18645
  // Used when `externalLabel` is unset; an empty string hides the icon instead.
18572
18646
  const DEFAULT_EXTERNAL_LABEL = '(opens in a new tab)';
@@ -18784,7 +18858,8 @@ function collectTabbable(root, found) {
18784
18858
  const isTabStop = (el) => { var _a; return el.tabIndex >= 0 || (el.isContentEditable && !el.hasAttribute('tabindex') && !((_a = el.parentElement) === null || _a === void 0 ? void 0 : _a.isContentEditable)); };
18785
18859
  function visitTabbable(el, found) {
18786
18860
  var _a, _b, _c, _d;
18787
- if (el.hasAttribute('inert'))
18861
+ // A tooltip portaled into a dialog only describes the control that has focus; it's never a stop of its own.
18862
+ if (el.hasAttribute('inert') || el.getAttribute('role') === 'tooltip')
18788
18863
  return;
18789
18864
  if (el.localName === 'slot') {
18790
18865
  const slot = el;
@@ -18840,7 +18915,7 @@ function tabbableIn(root) {
18840
18915
  return oneRadioPerGroup(visible);
18841
18916
  }
18842
18917
 
18843
- const pdsModalCss = () => `.pds-modal__backdrop{-ms-flex-align:start;align-items:flex-start;background-color:rgba(0, 0, 0, 0.4);border:0;display:-ms-flexbox;display:flex;height:100%;inset:0;-ms-flex-pack:center;justify-content:center;margin:0;max-height:100%;max-width:100%;opacity:0;padding:0;position:fixed;-webkit-transition:opacity var(--pine-motion-duration-base) var(--pine-motion-easing-in), visibility var(--pine-motion-duration-base) var(--pine-motion-easing-in);transition:opacity var(--pine-motion-duration-base) var(--pine-motion-easing-in), visibility var(--pine-motion-duration-base) var(--pine-motion-easing-in);visibility:hidden;width:100%;z-index:var(--pine-z-index-modal)}@supports ((-webkit-backdrop-filter: blur(3px)) or (backdrop-filter: blur(3px))){.pds-modal__backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}}pds-modal .pds-modal__backdrop{z-index:var(--pine-z-index-priority)}.pds-modal__backdrop::-webkit-backdrop{background:transparent}.pds-modal__backdrop::-ms-backdrop{background:transparent}.pds-modal__backdrop::backdrop{background:transparent}.pds-modal__backdrop[aria-modal=false]{overflow:auto;-ms-scroll-chaining:none;overscroll-behavior:contain}@supports ((-webkit-backdrop-filter: blur(3px)) or (backdrop-filter: blur(3px))){.pds-modal__backdrop[aria-modal=false]{-webkit-backdrop-filter:none;backdrop-filter:none}.pds-modal__backdrop[aria-modal=false]::before{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);content:"";inset:0;position:fixed;z-index:-1}}.pds-modal__backdrop.open{opacity:1;-webkit-transition-timing-function:var(--pine-motion-easing-out);transition-timing-function:var(--pine-motion-easing-out);visibility:visible}.pds-modal{background:var(--pine-color-background-overlay);border-radius:var(--pine-dimension-sm);-webkit-box-shadow:var(--pine-box-shadow-400);box-shadow:var(--pine-box-shadow-400);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:var(--pine-dimension-md);max-height:none;width:100%}.pds-modal.pds-modal--scrollable{max-height:calc(100vh - (5vh + 96px))}@supports (height: 100dvh){.pds-modal.pds-modal--scrollable{max-height:calc(100dvh - (5dvh + 96px))}}@media (min-width: 992px){.pds-modal{-webkit-margin-before:6vh;margin-block-start:6vh}@supports (height: 100dvh){.pds-modal{-webkit-margin-before:6dvh;margin-block-start:6dvh}}}@media (min-width: 1200px){.pds-modal{-webkit-margin-before:8vh;margin-block-start:8vh}@supports (height: 100dvh){.pds-modal{-webkit-margin-before:8dvh;margin-block-start:8dvh}}}.pds-modal--sm{max-width:520px}.pds-modal--md{max-width:700px}.pds-modal--lg{max-width:900px}.pds-modal--custom{max-width:var(--pds-modal-max-width, 700px)}.pds-modal--fullscreen{border-radius:0;height:100%;margin:0;max-height:100vh;max-width:100%}@supports (height: 100dvh){.pds-modal--fullscreen{max-height:100dvh}}.pds-modal--fullscreen.pds-modal--scrollable{max-height:100vh}@supports (height: 100dvh){.pds-modal--fullscreen.pds-modal--scrollable{max-height:100dvh}}.pds-modal--fullscreen .pds-modal-content{-ms-flex:1;flex:1}.pds-modal--scrollable pds-modal-content{-webkit-border-after:1px solid transparent;border-block-end:1px solid transparent;-webkit-border-before:1px solid transparent;border-block-start:1px solid transparent;overflow-y:auto}.pds-modal:not(.pds-modal--scrollable) pds-modal-content{overflow-y:visible}`;
18918
+ const pdsModalCss = () => `.pds-modal__backdrop{-ms-flex-align:start;align-items:flex-start;background-color:rgba(0, 0, 0, 0.4);border:0;display:-ms-flexbox;display:flex;height:100%;inset:0;-ms-flex-pack:center;justify-content:center;margin:0;max-height:100%;max-width:100%;opacity:0;padding:0;position:fixed;-webkit-transition:opacity var(--pine-motion-duration-base) var(--pine-motion-easing-in), visibility var(--pine-motion-duration-base) var(--pine-motion-easing-in);transition:opacity var(--pine-motion-duration-base) var(--pine-motion-easing-in), visibility var(--pine-motion-duration-base) var(--pine-motion-easing-in);visibility:hidden;width:100%;z-index:var(--pine-z-index-modal)}@supports ((-webkit-backdrop-filter: blur(3px)) or (backdrop-filter: blur(3px))){.pds-modal__backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}}pds-modal pds-modal .pds-modal__backdrop{z-index:var(--pine-z-index-priority)}.pds-modal__backdrop::-webkit-backdrop{background:transparent}.pds-modal__backdrop::-ms-backdrop{background:transparent}.pds-modal__backdrop::backdrop{background:transparent}.pds-modal__backdrop[aria-modal=false]{overflow:auto;-ms-scroll-chaining:none;overscroll-behavior:contain}@supports ((-webkit-backdrop-filter: blur(3px)) or (backdrop-filter: blur(3px))){.pds-modal__backdrop[aria-modal=false]{-webkit-backdrop-filter:none;backdrop-filter:none}.pds-modal__backdrop[aria-modal=false]::before{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);content:"";inset:0;position:fixed;z-index:-1}}.pds-modal__backdrop.open{opacity:1;-webkit-transition-timing-function:var(--pine-motion-easing-out);transition-timing-function:var(--pine-motion-easing-out);visibility:visible}.pds-modal{background:var(--pine-color-background-overlay);border-radius:var(--pine-dimension-sm);-webkit-box-shadow:var(--pine-box-shadow-400);box-shadow:var(--pine-box-shadow-400);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:var(--pine-dimension-md);max-height:none;width:100%}.pds-modal.pds-modal--scrollable{max-height:calc(100vh - (5vh + 96px))}@supports (height: 100dvh){.pds-modal.pds-modal--scrollable{max-height:calc(100dvh - (5dvh + 96px))}}@media (min-width: 992px){.pds-modal{-webkit-margin-before:6vh;margin-block-start:6vh}@supports (height: 100dvh){.pds-modal{-webkit-margin-before:6dvh;margin-block-start:6dvh}}}@media (min-width: 1200px){.pds-modal{-webkit-margin-before:8vh;margin-block-start:8vh}@supports (height: 100dvh){.pds-modal{-webkit-margin-before:8dvh;margin-block-start:8dvh}}}.pds-modal--sm{max-width:520px}.pds-modal--md{max-width:700px}.pds-modal--lg{max-width:900px}.pds-modal--custom{max-width:var(--pds-modal-max-width, 700px)}.pds-modal--fullscreen{border-radius:0;height:100%;margin:0;max-height:100vh;max-width:100%}@supports (height: 100dvh){.pds-modal--fullscreen{max-height:100dvh}}.pds-modal--fullscreen.pds-modal--scrollable{max-height:100vh}@supports (height: 100dvh){.pds-modal--fullscreen.pds-modal--scrollable{max-height:100dvh}}.pds-modal--fullscreen .pds-modal-content{-ms-flex:1;flex:1}.pds-modal--scrollable pds-modal-content{-webkit-border-after:1px solid transparent;border-block-end:1px solid transparent;-webkit-border-before:1px solid transparent;border-block-start:1px solid transparent;overflow-y:auto}.pds-modal:not(.pds-modal--scrollable) pds-modal-content{overflow-y:visible}`;
18844
18919
 
18845
18920
  const PRESET_SIZES = ['sm', 'md', 'lg', 'fullscreen'];
18846
18921
  const isCustomLength = (value) => /^[a-z0-9.%+\-*/(), ]+$/i.test(value) &&
@@ -20017,6 +20092,12 @@ class PdsMultiselect {
20017
20092
  }
20018
20093
  else {
20019
20094
  this.closeDropdown();
20095
+ // Tab would move on to an option's checkbox, which closing removes, dropping focus to the page.
20096
+ // Land on the trigger instead, as Escape does; Shift+Tab already reaches it.
20097
+ const trigger = e.shiftKey ? undefined : this.activeTriggerEl;
20098
+ trigger === null || trigger === void 0 ? void 0 : trigger.focus();
20099
+ if (trigger === null || trigger === void 0 ? void 0 : trigger.matches(':focus'))
20100
+ e.preventDefault();
20020
20101
  }
20021
20102
  break;
20022
20103
  }
@@ -20975,10 +21056,10 @@ class PdsMultiselect {
20975
21056
  }
20976
21057
  render() {
20977
21058
  const hasSelections = this.selectedItems.length > 0;
20978
- return (hAsync(Host, { key: 'a92086af75e20b9b37b147365bfa517d96021700', "aria-disabled": this.disabled ? 'true' : null }, hAsync("div", { key: 'd49e0442e3a348248e5ac3b37afc9f128b34956b', class: "pds-multiselect", onFocusout: this.handleContainerFocusOut }, this.label && (hAsync("label", { key: '41a081803dfd784e20a7135ecf5f5c4657908dd1', id: `${this.componentId}-label`, htmlFor: this.componentId, class: {
21059
+ return (hAsync(Host, { key: '8f1ce5ef092285ce7c0855643fae76a4ec86ee17', "aria-disabled": this.disabled ? 'true' : null }, hAsync("div", { key: 'c14c3d52c1d55fb33a89f1a25055728215a1e4ab', class: "pds-multiselect", onFocusout: this.handleContainerFocusOut }, this.label && (hAsync("label", { key: 'aacd3339b0db2048b31fbc5963f7232bbff78efe', id: `${this.componentId}-label`, htmlFor: this.componentId, class: {
20979
21060
  'pds-multiselect__label': true,
20980
21061
  'visually-hidden': this.hideLabel,
20981
- } }, this.label)), hAsync("div", { key: '0e3c8a3aaf7c70b4ff71972c29b8d5599f62ec97', 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: {
21062
+ } }, this.label)), hAsync("div", { key: '5e1ef76aa5d46798519e5ac885bfa1c8d7c7106c', 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: {
20982
21063
  'pds-multiselect__trigger': true,
20983
21064
  'pds-multiselect__trigger--open': this.isOpen,
20984
21065
  'pds-multiselect__trigger--disabled': this.disabled,
@@ -20994,7 +21075,7 @@ class PdsMultiselect {
20994
21075
  }, 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: {
20995
21076
  'pds-multiselect__trigger-text': true,
20996
21077
  'pds-multiselect__trigger-text--placeholder': !hasSelections || (this.selectedDisplay === 'pill' && this.pillPosition === 'below'),
20997
- } }, 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: 'd5cddc1d3374d94ecf0cce1bcaf7c7125bf3128d', class: "visually-hidden", "aria-live": "polite", "aria-atomic": "true" }, this.removalAnnouncement), this.helperMessage && !(this.errorMessage && this.errorMessage.length > 0) && (hAsync("p", { key: 'e3cb958b6fd2b1e138b769de0f53be1b8564902d', class: "pds-multiselect__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)), this.errorMessage && (hAsync("p", { key: 'f6c2a30cc192391973d9b22fbb6732ce387832ac', class: "pds-multiselect__error", id: messageId(this.componentId, 'error') }, hAsync("pds-icon", { key: 'f437effafaa383b81aec7b5bf635598c8b0075b8', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage)), hAsync("div", { key: 'f1e747137f2dc7cad3d4e1ff8fc293401e3173e1', style: { display: 'none' } }, hAsync("slot", { key: 'f337137b3ca5983dc6641361101f6d19c972778c' })))));
21078
+ } }, 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: '590045e4769812a1a2f7a97580d21d95dbe4e872', class: "visually-hidden", "aria-live": "polite", "aria-atomic": "true" }, this.removalAnnouncement), this.helperMessage && !(this.errorMessage && this.errorMessage.length > 0) && (hAsync("p", { key: '419f4349b7cb17260f03d2bdcfd777561a62de42', class: "pds-multiselect__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)), this.errorMessage && (hAsync("p", { key: 'b922af14c83348607aa9aaaefe9b03b39e71bd42', class: "pds-multiselect__error", id: messageId(this.componentId, 'error') }, hAsync("pds-icon", { key: 'bd08726adf14a42f2ecf0cdfcd390e5639f9fd96', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage)), hAsync("div", { key: '42ad7905fb1816ccdd29b6aa438779929804b368', style: { display: 'none' } }, hAsync("slot", { key: '4f3bf380e93d216790efb0a5de85d6479862350e' })))));
20998
21079
  }
20999
21080
  static get formAssociated() { return true; }
21000
21081
  get el() { return getElement(this); }
@@ -22473,6 +22554,7 @@ class PdsRadioGroup {
22473
22554
  * @defaultValue false
22474
22555
  */
22475
22556
  this.required = false;
22557
+ this.hostKeeper = new HostStylingKeeper();
22476
22558
  }
22477
22559
  handlePropsChange() {
22478
22560
  this.updateChildRadios();
@@ -22524,6 +22606,29 @@ class PdsRadioGroup {
22524
22606
  }
22525
22607
  });
22526
22608
  }
22609
+ connectedCallback() {
22610
+ this.hostKeeper.connect(this.el);
22611
+ // A name set while the group was detached never reaches the observer.
22612
+ this.syncName();
22613
+ if (typeof MutationObserver === 'undefined')
22614
+ return;
22615
+ // Consumers can name the group after render (a prop change, an i18n swap, a morph); re-render so their name wins.
22616
+ this.hostAriaObserver = new MutationObserver(() => this.syncName());
22617
+ this.hostAriaObserver.observe(this.el, { attributeFilter: ['aria-label', 'aria-labelledby'] });
22618
+ }
22619
+ disconnectedCallback() {
22620
+ var _a;
22621
+ this.hostKeeper.disconnect();
22622
+ (_a = this.hostAriaObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
22623
+ this.hostAriaObserver = undefined;
22624
+ }
22625
+ // Re-renders only when the group's name would change, so its own aria-labelledby write doesn't loop back.
22626
+ syncName() {
22627
+ if (this._groupId === undefined)
22628
+ return;
22629
+ if (this.getAriaLabelledBy() !== this.renderedLabelledBy)
22630
+ ;
22631
+ }
22527
22632
  componentWillLoad() {
22528
22633
  // Generate stable group ID once during initialization
22529
22634
  // This ensures DOM stability and accessibility relationships remain consistent across re-renders
@@ -22537,6 +22642,18 @@ class PdsRadioGroup {
22537
22642
  : `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
22538
22643
  this._groupId = `radio-group-${uniqueId}`;
22539
22644
  }
22645
+ // A restored or cloned host still carries the id and ARIA references an earlier instance wrote, pointing at
22646
+ // that instance's label and messages. Drop them so this render writes its own: on first load, Stencil keeps a
22647
+ // host attribute that's already there.
22648
+ const previousId = this.el.getAttribute('id');
22649
+ if (previousId && previousId !== this._groupId) {
22650
+ ['aria-labelledby', 'aria-describedby'].forEach((name) => {
22651
+ var _a, _b;
22652
+ const ids = (_b = (_a = this.el.getAttribute(name)) === null || _a === void 0 ? void 0 : _a.split(/\s+/)) !== null && _b !== void 0 ? _b : [];
22653
+ if (ids.some((id) => id.startsWith(`${previousId}__`)))
22654
+ this.el.removeAttribute(name);
22655
+ });
22656
+ }
22540
22657
  }
22541
22658
  componentDidLoad() {
22542
22659
  if (!this.name) {
@@ -22589,6 +22706,20 @@ class PdsRadioGroup {
22589
22706
  // Otherwise, assume it's a dimension token like "100", "200", etc.
22590
22707
  return `var(--pine-dimension-${this.gap})`;
22591
22708
  }
22709
+ get labelId() {
22710
+ return `${this._groupId}__label`;
22711
+ }
22712
+ // Names the group from its visible label, unless the consumer named it with their own aria-label or aria-labelledby.
22713
+ // A blank aria-label (an empty translation, say) names nothing, so it falls back to groupLabel.
22714
+ getAriaLabelledBy() {
22715
+ var _a;
22716
+ const hostLabelledBy = this.el.getAttribute('aria-labelledby');
22717
+ if ((hostLabelledBy === null || hostLabelledBy === void 0 ? void 0 : hostLabelledBy.trim()) && hostLabelledBy !== this.labelId)
22718
+ return hostLabelledBy;
22719
+ if ((_a = this.el.getAttribute('aria-label')) === null || _a === void 0 ? void 0 : _a.trim())
22720
+ return undefined;
22721
+ return this.groupLabel ? this.labelId : undefined;
22722
+ }
22592
22723
  getAriaDescribedBy() {
22593
22724
  const messageIds = [];
22594
22725
  if (this.errorMessage) {
@@ -22602,13 +22733,23 @@ class PdsRadioGroup {
22602
22733
  render() {
22603
22734
  const gapValue = this.getGapValue();
22604
22735
  const ariaDescribedBy = this.getAriaDescribedBy();
22605
- return (hAsync(Host, { key: 'aaf53113f06a0f49706e53735701fba64e79cb4d', class: this.classNames(), id: this._groupId, role: "group", "aria-describedby": ariaDescribedBy, style: {
22736
+ const ariaLabelledBy = this.getAriaLabelledBy();
22737
+ const hostClass = this.classNames();
22738
+ this.renderedLabelledBy = ariaLabelledBy;
22739
+ // A DOM morph strips what the component wrote on its host; put back its role, name and description.
22740
+ // Only its own aria-labelledby, so a consumer's that the server dropped stays dropped.
22741
+ this.hostKeeper.record(hostClass, { '--pds-radio-group-gap': gapValue }, {
22742
+ role: 'radiogroup',
22743
+ 'aria-describedby': ariaDescribedBy,
22744
+ 'aria-labelledby': ariaLabelledBy === this.labelId ? ariaLabelledBy : undefined,
22745
+ });
22746
+ return (hAsync(Host, { key: '0fe381f99dddae0aeb9189a13b0e2195f1c79886', class: hostClass, id: this._groupId, role: "radiogroup", "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, style: {
22606
22747
  '--pds-radio-group-gap': gapValue,
22607
- } }, this.groupLabel && (hAsync("div", { key: '4be5e43146bf348929e45498107862aaca161644', class: "pds-radio-group__label" }, this.groupLabel)), hAsync("div", { key: 'b4a1b870c1a7167b8dcbcf0a11808bbd9a8cec4e', class: {
22748
+ } }, this.groupLabel && (hAsync("div", { key: '4967dc22fa0265dbfbabf94a49b182b8c06d0bd5', class: "pds-radio-group__label", id: this.labelId }, this.groupLabel)), hAsync("div", { key: '7a782a6920de7eda76ab0060c7512f093671ad41', class: {
22608
22749
  'pds-radio-group__radios': true,
22609
22750
  'pds-radio-group__radios--row': this.direction === 'row',
22610
22751
  'pds-radio-group__radios--column': this.direction === 'column',
22611
- } }, hAsync("slot", { key: '2d841cc69c35a4f9da933bbb33c1384ca343e077', onSlotchange: () => this.updateChildRadios() })), this.helperMessage && (hAsync("div", { key: 'a09bb9e739570c06dc1907cb4e2dceecca36f7d3', class: "pds-radio-group__message", id: messageId(this._groupId, 'helper') }, this.helperMessage)), this.errorMessage && (hAsync("div", { key: 'b8fe891cc4b8683d18c19b3b4ddb70212185b954', class: "pds-radio-group__message pds-radio-group__message--error", id: messageId(this._groupId, 'error'), "aria-live": "assertive" }, hAsync("pds-icon", { key: '9a15d81d8303eeb5a928b96c760f6b15e536e0dc', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage))));
22752
+ } }, hAsync("slot", { key: '48a8d2d74961a402e3a1b053b2f0314e74b4b289', onSlotchange: () => this.updateChildRadios() })), this.helperMessage && (hAsync("div", { key: '58db96d62b8d89f03ab245990d2d6bbd3b1b5f85', class: "pds-radio-group__message", id: messageId(this._groupId, 'helper') }, this.helperMessage)), this.errorMessage && (hAsync("div", { key: 'ad3aafe5f7ed45853c36b537525a8fff68452f55', class: "pds-radio-group__message pds-radio-group__message--error", id: messageId(this._groupId, 'error'), "aria-live": "assertive" }, hAsync("pds-icon", { key: '80ce92868703c5e01434e7e83a7668e320bcbee1', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage))));
22612
22753
  }
22613
22754
  get el() { return getElement(this); }
22614
22755
  static get watchers() { return {
@@ -27514,6 +27655,9 @@ const TEXT_SIZES = [
27514
27655
 
27515
27656
  const pdsTextCss = () => `:host{display:inline}:host([decoration=underline-dotted])>*{-webkit-text-decoration-color:var(--pine-color-text-tertiary);text-decoration-color:var(--pine-color-text-tertiary);-webkit-text-decoration-line:underline;text-decoration-line:underline;-webkit-text-decoration-style:dotted;text-decoration-style:dotted;text-decoration-thickness:12%;text-underline-offset:0.3rem;text-underline-position:under}:host([decoration=strikethrough])>*{text-decoration:line-through}h1{font:var(--pine-typography-heading-1);letter-spacing:var(--pine-letter-spacing-heading-1)}h2{font:var(--pine-typography-heading-2);letter-spacing:var(--pine-letter-spacing-heading-2)}h3{font:var(--pine-typography-heading-3);letter-spacing:var(--pine-letter-spacing-heading-3)}h4{font:var(--pine-typography-heading-4);letter-spacing:var(--pine-letter-spacing-heading-4)}h5{font:var(--pine-typography-heading-5);letter-spacing:var(--pine-letter-spacing-heading-5)}h6{font:var(--pine-typography-heading-6);letter-spacing:var(--pine-letter-spacing-heading-6)}code,em,p,pre,strong{font:var(--pine-typography-body);letter-spacing:var(--pine-letter-spacing)}code,pre{font-family:monospace;letter-spacing:0;line-height:1}em{font-style:normal}strong{font-weight:bolder}:host([truncate]){display:block;min-width:0}:host([truncate])>*{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host([italic])>*{font-style:italic}.pds-text{color:var(--color, var(--pine-color-text));margin:var(--pine-dimension-none)}.pds-text--size-2xl{font-size:var(--pine-font-size-body-2xl)}.pds-text--size-xl{font-size:var(--pine-font-size-body-xl)}.pds-text--size-lg{font-size:var(--pine-font-size-body-lg)}.pds-text--size-md{font-size:var(--pine-font-size-body-md)}.pds-text--size-sm{font-size:var(--pine-font-size-body-sm)}.pds-text--size-xs{font-size:var(--pine-font-size-body-xs)}.pds-text--size-2xs{font-size:var(--pine-font-size-body-2xs)}.pds-text--size-h1{font-size:var(--pine-font-size-heading-1)}.pds-text--size-h2{font-size:var(--pine-font-size-heading-2)}.pds-text--size-h3{font-size:var(--pine-font-size-heading-3)}.pds-text--size-h4{font-size:var(--pine-font-size-heading-4)}.pds-text--size-h5{font-size:var(--pine-font-size-heading-5)}.pds-text--size-h6{font-size:var(--pine-font-size-heading-6)}.pds-text--weight-extra-light{font-weight:var(--pine-font-weight-extra-light)}.pds-text--weight-light{font-weight:var(--pine-font-weight-light)}.pds-text--weight-regular{font-weight:var(--pine-font-weight-regular)}.pds-text--weight-medium{font-weight:var(--pine-font-weight-medium)}.pds-text--weight-semibold{font-weight:var(--pine-font-weight-semi-bold)}.pds-text--weight-bold{font-weight:var(--pine-font-weight-bold)}.pds-text--gutter-2xl{-webkit-margin-after:var(--pine-dimension-2xl);margin-block-end:var(--pine-dimension-2xl)}.pds-text--gutter-xl{-webkit-margin-after:var(--pine-dimension-xl);margin-block-end:var(--pine-dimension-xl)}.pds-text--gutter-lg{-webkit-margin-after:var(--pine-dimension-lg);margin-block-end:var(--pine-dimension-lg)}.pds-text--gutter-md{-webkit-margin-after:var(--pine-dimension-md);margin-block-end:var(--pine-dimension-md)}.pds-text--gutter-sm{-webkit-margin-after:var(--pine-dimension-sm);margin-block-end:var(--pine-dimension-sm)}.pds-text--gutter-xs{-webkit-margin-after:var(--pine-dimension-xs);margin-block-end:var(--pine-dimension-xs)}.pds-text--gutter-2xs{-webkit-margin-after:var(--pine-dimension-2xs);margin-block-end:var(--pine-dimension-2xs)}.pds-text--align-start{text-align:start}.pds-text--align-center{text-align:center}.pds-text--align-end{text-align:end}.pds-text--align-justify{text-align:justify}`;
27516
27657
 
27658
+ // Re-runs setup for each text bound to its wrapping control, keyed by host, so a truncated
27659
+ // text that joins the same control later can take that control's focus away from it.
27660
+ const textsUsingWrapper = new WeakMap();
27517
27661
  /**
27518
27662
  * @part content - The text content container
27519
27663
  */
@@ -27568,17 +27712,39 @@ class PdsText {
27568
27712
  this.destroyTruncationTooltip();
27569
27713
  }
27570
27714
  initTruncationTooltip() {
27715
+ var _a;
27571
27716
  // Clean up any existing tooltip before setting up a new one
27572
27717
  this.destroyTruncationTooltip();
27573
27718
  if (this.contentEl) {
27719
+ const wrapper = this.el.closest(FOCUSABLE_WRAPPER);
27720
+ // A pds-chip with a max width binds its tooltip to the wrapper too.
27721
+ const others = wrapper === null ? [] : wrapper.querySelectorAll('pds-text, pds-chip');
27722
+ // One focus on a shared wrapper would open every clipped text's tooltip at once, so texts sharing one each keep
27723
+ // their own stop, and a text bound before this one joined lets go: this one's focus bubbles to the wrapper too.
27724
+ let sharesWrapper = false;
27725
+ for (let i = 0; i < others.length; i++) {
27726
+ const other = others[i];
27727
+ // The property counts too: setting `truncate` runs setup before the next render reflects the attribute.
27728
+ if (other !== this.el && (other.truncate || other.maxWidth || other.hasAttribute('truncate') || other.hasAttribute('max-width'))) {
27729
+ sharesWrapper = true;
27730
+ (_a = textsUsingWrapper.get(other)) === null || _a === void 0 ? void 0 : _a();
27731
+ }
27732
+ }
27733
+ const usesWrapper = wrapper !== null && !sharesWrapper;
27574
27734
  this.truncationCleanup = setupTruncationTooltip({
27575
27735
  hostEl: this.el,
27576
27736
  contentEl: this.contentEl,
27577
27737
  getTooltipText: () => this.el.textContent || '',
27738
+ // A wrapping link or button already takes focus, so its focus reveals the text instead of a nested tab stop.
27739
+ manageTabIndex: !usesWrapper,
27740
+ focusEl: usesWrapper ? wrapper : this.el,
27578
27741
  });
27742
+ if (usesWrapper)
27743
+ textsUsingWrapper.set(this.el, () => this.initTruncationTooltip());
27579
27744
  }
27580
27745
  }
27581
27746
  destroyTruncationTooltip() {
27747
+ textsUsingWrapper.delete(this.el);
27582
27748
  if (this.truncationCleanup) {
27583
27749
  this.truncationCleanup();
27584
27750
  this.truncationCleanup = null;
@@ -27604,7 +27770,7 @@ class PdsText {
27604
27770
  ? `pds-text--decoration-${this.decoration}`
27605
27771
  : ''}
27606
27772
  `;
27607
- return (hAsync(Tag, { key: 'b79a6e67f11024cb025cb26bbf77231547bd63a4', ref: (el) => (this.contentEl = el), style: this.color && setColor(this.color), class: typeClasses, part: "content" }, hAsync("slot", { key: 'ae1f8ca39899894541eac3c07fb21ead4ab98f40' })));
27773
+ return (hAsync(Tag, { key: '30566c7810d3fd7f76ae281ae6d9a7e66803f0a3', ref: (el) => (this.contentEl = el), style: this.color && setColor(this.color), class: typeClasses, part: "content" }, hAsync("slot", { key: 'f5113458aa9295803fc1c0bc552f9f92602cacba' })));
27608
27774
  }
27609
27775
  get el() { return getElement(this); }
27610
27776
  static get watchers() { return {
@@ -28169,7 +28335,7 @@ class PdsToast {
28169
28335
  }; }
28170
28336
  }
28171
28337
 
28172
- const pdsTooltipCss = () => `.pds-tooltip{--tooltip-border-width-arrow-down:var(--tooltip-sizing-arrow) var(--tooltip-sizing-arrow) 0;--tooltip-border-width-arrow-left:var(--tooltip-sizing-arrow) var(--tooltip-sizing-arrow) var(--tooltip-sizing-arrow) 0;--tooltip-border-width-arrow-right:var(--tooltip-sizing-arrow) 0 var(--tooltip-sizing-arrow) var(--tooltip-sizing-arrow);--tooltip-border-width-arrow-up:0 var(--tooltip-sizing-arrow) var(--tooltip-sizing-arrow);--tooltip-sizing-arrow:6px;--tooltip-sizing-arrow-offset:14px;--tooltip-dimension-max-width:320px}.pds-tooltip__content{background-color:var(--pine-color-primary);border-radius:calc(var(--pine-dimension-xs) * 1.25);-webkit-box-shadow:var(--pine-box-shadow);box-shadow:var(--pine-box-shadow);color:var(--pine-color-text-primary);max-width:var(--tooltip-dimension-max-width);opacity:0;padding:var(--pine-dimension-xs) calc(var(--pine-dimension-md) / 2);position:relative;visibility:hidden;width:-webkit-max-content;width:-moz-max-content;width:max-content}.pds-tooltip--is-open .pds-tooltip__content{opacity:1;visibility:visible;z-index:var(--pine-z-index-raised)}.pds-tooltip.pds-tooltip--has-html-content .pds-tooltip__content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.pds-tooltip__content::after{border-color:transparent;border-right-color:transparent;border-style:solid;border-width:var(--tooltip-border-width-arrow-left);content:"";height:0;position:absolute;width:0}.pds-tooltip--right .pds-tooltip__content::after{border-inline-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-left);left:calc(var(--tooltip-sizing-arrow) * -1);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.pds-tooltip--right-end .pds-tooltip__content::after{border-inline-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-left);bottom:var(--tooltip-sizing-arrow-offset);left:calc(var(--tooltip-sizing-arrow) * -1);top:initial}.pds-tooltip--right-start .pds-tooltip__content::after{border-inline-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-left);left:calc(var(--tooltip-sizing-arrow) * -1);top:var(--tooltip-sizing-arrow-offset)}.pds-tooltip--top .pds-tooltip__content::after{border-block-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-down);bottom:calc(var(--tooltip-sizing-arrow) * -1);left:50%;top:initial;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pds-tooltip--top-start .pds-tooltip__content::after{border-block-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-down);bottom:calc(var(--tooltip-sizing-arrow) * -1);left:var(--tooltip-sizing-arrow-offset);top:initial}.pds-tooltip--top-end .pds-tooltip__content::after{border-block-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-down);bottom:calc(var(--tooltip-sizing-arrow) * -1);left:initial;right:var(--tooltip-sizing-arrow-offset);top:initial}.pds-tooltip--left .pds-tooltip__content::after{border-inline-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-right);left:initial;right:calc(var(--tooltip-sizing-arrow) * -1);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.pds-tooltip--left-end .pds-tooltip__content::after{border-inline-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-right);bottom:var(--tooltip-sizing-arrow-offset);left:initial;right:calc(var(--tooltip-sizing-arrow) * -1);top:initial}.pds-tooltip--left-start .pds-tooltip__content::after{border-inline-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-right);left:initial;right:calc(var(--tooltip-sizing-arrow) * -1);top:var(--tooltip-sizing-arrow-offset)}.pds-tooltip--bottom .pds-tooltip__content::after{border-block-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-up);left:50%;top:calc(var(--tooltip-sizing-arrow) * -1);-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pds-tooltip--bottom-end .pds-tooltip__content::after{border-block-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-up);left:initial;right:var(--tooltip-sizing-arrow-offset);top:calc(var(--tooltip-sizing-arrow) * -1)}.pds-tooltip--bottom-start .pds-tooltip__content::after{border-block-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-up);left:var(--tooltip-sizing-arrow-offset);top:calc(var(--tooltip-sizing-arrow) * -1)}.pds-tooltip--no-arrow .pds-tooltip__content::after{border-width:0}`;
28338
+ const pdsTooltipCss = () => `.pds-tooltip{--tooltip-border-width-arrow-down:var(--tooltip-sizing-arrow) var(--tooltip-sizing-arrow) 0;--tooltip-border-width-arrow-left:var(--tooltip-sizing-arrow) var(--tooltip-sizing-arrow) var(--tooltip-sizing-arrow) 0;--tooltip-border-width-arrow-right:var(--tooltip-sizing-arrow) 0 var(--tooltip-sizing-arrow) var(--tooltip-sizing-arrow);--tooltip-border-width-arrow-up:0 var(--tooltip-sizing-arrow) var(--tooltip-sizing-arrow);--tooltip-sizing-arrow:6px;--tooltip-sizing-arrow-offset:14px;--tooltip-dimension-max-width:320px}:is(dialog,[popover])>.pds-tooltip{font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0;text-transform:none;white-space:normal;word-spacing:normal}.pds-tooltip__content{background-color:var(--pine-color-primary);border-radius:calc(var(--pine-dimension-xs) * 1.25);-webkit-box-shadow:var(--pine-box-shadow);box-shadow:var(--pine-box-shadow);color:var(--pine-color-text-primary);max-width:var(--tooltip-dimension-max-width);opacity:0;padding:var(--pine-dimension-xs) calc(var(--pine-dimension-md) / 2);position:relative;visibility:hidden;width:-webkit-max-content;width:-moz-max-content;width:max-content}.pds-tooltip--is-open .pds-tooltip__content{opacity:1;visibility:visible;z-index:var(--pine-z-index-raised)}.pds-tooltip.pds-tooltip--has-html-content .pds-tooltip__content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.pds-tooltip__content::after{border-color:transparent;border-right-color:transparent;border-style:solid;border-width:var(--tooltip-border-width-arrow-left);content:"";height:0;position:absolute;width:0}.pds-tooltip--right .pds-tooltip__content::after{border-inline-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-left);left:calc(var(--tooltip-sizing-arrow) * -1);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.pds-tooltip--right-end .pds-tooltip__content::after{border-inline-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-left);bottom:var(--tooltip-sizing-arrow-offset);left:calc(var(--tooltip-sizing-arrow) * -1);top:initial}.pds-tooltip--right-start .pds-tooltip__content::after{border-inline-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-left);left:calc(var(--tooltip-sizing-arrow) * -1);top:var(--tooltip-sizing-arrow-offset)}.pds-tooltip--top .pds-tooltip__content::after{border-block-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-down);bottom:calc(var(--tooltip-sizing-arrow) * -1);left:50%;top:initial;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pds-tooltip--top-start .pds-tooltip__content::after{border-block-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-down);bottom:calc(var(--tooltip-sizing-arrow) * -1);left:var(--tooltip-sizing-arrow-offset);top:initial}.pds-tooltip--top-end .pds-tooltip__content::after{border-block-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-down);bottom:calc(var(--tooltip-sizing-arrow) * -1);left:initial;right:var(--tooltip-sizing-arrow-offset);top:initial}.pds-tooltip--left .pds-tooltip__content::after{border-inline-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-right);left:initial;right:calc(var(--tooltip-sizing-arrow) * -1);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.pds-tooltip--left-end .pds-tooltip__content::after{border-inline-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-right);bottom:var(--tooltip-sizing-arrow-offset);left:initial;right:calc(var(--tooltip-sizing-arrow) * -1);top:initial}.pds-tooltip--left-start .pds-tooltip__content::after{border-inline-start-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-right);left:initial;right:calc(var(--tooltip-sizing-arrow) * -1);top:var(--tooltip-sizing-arrow-offset)}.pds-tooltip--bottom .pds-tooltip__content::after{border-block-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-up);left:50%;top:calc(var(--tooltip-sizing-arrow) * -1);-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pds-tooltip--bottom-end .pds-tooltip__content::after{border-block-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-up);left:initial;right:var(--tooltip-sizing-arrow-offset);top:calc(var(--tooltip-sizing-arrow) * -1)}.pds-tooltip--bottom-start .pds-tooltip__content::after{border-block-end-color:var(--pine-color-primary);border-width:var(--tooltip-border-width-arrow-up);left:var(--tooltip-sizing-arrow-offset);top:calc(var(--tooltip-sizing-arrow) * -1)}.pds-tooltip--no-arrow .pds-tooltip__content::after{border-width:0}`;
28173
28339
 
28174
28340
  /**
28175
28341
  * @slot (default) - The tooltip's target element
@@ -28194,6 +28360,7 @@ class PdsTooltip {
28194
28360
  this.currentPathname = '';
28195
28361
  this.pathnameCheckInterval = null;
28196
28362
  this.stopAutoUpdate = null;
28363
+ this.stopWatchingPortalHost = null;
28197
28364
  /**
28198
28365
  * Determines whether or not the tooltip has an arrow
28199
28366
  * @defaultValue true
@@ -28443,7 +28610,12 @@ class PdsTooltip {
28443
28610
  this.lastCopiedHtml = this.strippedHtml(initialCopy);
28444
28611
  this.contentDiv.append(...Array.from(initialCopy.childNodes));
28445
28612
  this.portalEl.appendChild(this.contentDiv);
28446
- document.body.appendChild(this.portalEl);
28613
+ // Nothing in the body paints above a modal dialog or open popover, so the portal goes inside one.
28614
+ const portalHost = findPortalTarget(this.el, isTopLayerInDocument);
28615
+ portalHost.appendChild(this.portalEl);
28616
+ // Closing that host moves no pointer, so a tooltip opened by touch would outlive it unseen.
28617
+ if (portalHost !== document.body)
28618
+ this.stopWatchingPortalHost = onTopLayerClose(portalHost, this.handleHide);
28447
28619
  this.repositionPortal().catch(error => {
28448
28620
  console.warn('Failed to position tooltip on creation:', error);
28449
28621
  });
@@ -28556,6 +28728,10 @@ class PdsTooltip {
28556
28728
  this.stopAutoUpdate();
28557
28729
  this.stopAutoUpdate = null;
28558
28730
  }
28731
+ if (this.stopWatchingPortalHost !== null) {
28732
+ this.stopWatchingPortalHost();
28733
+ this.stopWatchingPortalHost = null;
28734
+ }
28559
28735
  // Stop pathname change detection
28560
28736
  if (this.pathnameCheckInterval !== null) {
28561
28737
  clearInterval(this.pathnameCheckInterval);
@@ -28586,9 +28762,9 @@ class PdsTooltip {
28586
28762
  }
28587
28763
  render() {
28588
28764
  const hostId = this.componentId || undefined;
28589
- return (hAsync(Host, { key: '067eda3089732c6a23032bb087182e6dcd0330fa', id: hostId, class: { 'pds-tooltip--is-open': this.opened } }, hAsync("span", { key: '54f6f233c937f048f119df969630af530b10de25', class: "pds-tooltip__trigger", onMouseEnter: this.handleShow, onMouseLeave: this.handleHide,
28765
+ return (hAsync(Host, { key: '475ff12d4be035e3effa894353e7948b42a23489', id: hostId, class: { 'pds-tooltip--is-open': this.opened } }, hAsync("span", { key: '3375dfb5bb86ba373bc5d617f4a53171505631d1', class: "pds-tooltip__trigger", onMouseEnter: this.handleShow, onMouseLeave: this.handleHide,
28590
28766
  /* focusin/out bubble; ensure keyboard users see tooltips */
28591
- onFocusin: this.handleShow, onFocusout: this.handleHide, ref: el => this.triggerEl = el }, hAsync("slot", { key: 'f8019985ad9fd27deb388e35c43bf2e227ff9c02' })), hAsync("div", { key: '072c4e578aebb99cd213901369a57d7c74734ad9', class: "pds-tooltip__content-slot-wrapper", hidden: true }, hAsync("slot", { key: '22bc45dfb56567f53a608ce2033b062363793450', name: "content" }))));
28767
+ onFocusin: this.handleShow, onFocusout: this.handleHide, ref: el => this.triggerEl = el }, hAsync("slot", { key: 'a3392ad415f5ac7f3883100bf914484ffcc8e536' })), hAsync("div", { key: '774ac2c4808e96649b1536569aaf8cf8a6e3abc2', class: "pds-tooltip__content-slot-wrapper", hidden: true }, hAsync("slot", { key: '672c64b4acdb365623885ac2105a9b90b1dcfa6b', name: "content" }))));
28592
28768
  }
28593
28769
  get el() { return getElement(this); }
28594
28770
  static get watchers() { return {