@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.mjs CHANGED
@@ -5646,7 +5646,7 @@ var setScopedSSR = (opts) => {
5646
5646
  var needsScopedSSR = () => scopedSSR;
5647
5647
  var scopedSSR = false;
5648
5648
 
5649
- 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}`;
5649
+ 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}`;
5650
5650
 
5651
5651
  /**
5652
5652
  * Mock PdsModal component for testing purposes
@@ -5752,7 +5752,7 @@ class MockPdsModal {
5752
5752
  }; }
5753
5753
  }
5754
5754
 
5755
- /* pds-icons v10.7.0, ES Modules */
5755
+ /* pds-icons v10.8.0, ES Modules */
5756
5756
 
5757
5757
  const addCircle = "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='pdsicon'><path fill-rule='evenodd' d='M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12m11-5a1 1 0 0 1 1 1v3h3a1 1 0 1 1 0 2h-3v3a1 1 0 1 1-2 0v-3H8a1 1 0 1 1 0-2h3V8a1 1 0 0 1 1-1'/></svg>";
5758
5758
  const calendarSimple = "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='pdsicon'><path fill-rule='evenodd' d='M8 1a1 1 0 0 1 1 1v1h6V2a1 1 0 1 1 2 0v1.002c.476.003.891.013 1.252.042.562.046 1.079.145 1.564.392a4 4 0 0 1 1.748 1.748c.247.485.346 1.002.392 1.564C22 7.29 22 7.954 22 8.758v8.483c0 .805 0 1.47-.044 2.01-.046.563-.145 1.08-.392 1.565a4 4 0 0 1-1.748 1.748c-.485.247-1.002.346-1.564.392-.541.044-1.206.044-2.01.044H7.758c-.805 0-1.47 0-2.01-.044-.563-.046-1.08-.145-1.565-.392a4 4 0 0 1-1.748-1.748c-.247-.485-.346-1.002-.392-1.564C2 18.71 2 18.046 2 17.242V8.758c0-.805 0-1.47.044-2.01.046-.563.145-1.08.392-1.565a4 4 0 0 1 1.748-1.748c.485-.247 1.002-.346 1.564-.392.361-.03.777-.04 1.252-.042V2a1 1 0 0 1 1-1M7 5.002c-.446.003-.795.012-1.089.036-.438.035-.663.1-.819.18a2 2 0 0 0-.874.874c-.08.156-.145.38-.18.819C4 7.361 4 7.943 4 8.8V9h16v-.2c0-.857 0-1.439-.038-1.889-.035-.438-.1-.663-.18-.819a2 2 0 0 0-.874-.874c-.156-.08-.38-.145-.819-.18A15 15 0 0 0 17 5.002V6a1 1 0 1 1-2 0V5H9v1a1 1 0 1 1-2 0zM20 11H4v6.2c0 .857 0 1.439.038 1.889.035.438.1.663.18.819a2 2 0 0 0 .874.874c.156.08.38.145.819.18C6.361 21 6.943 21 7.8 21h8.4c.857 0 1.439 0 1.889-.038.438-.035.663-.1.819-.18a2 2 0 0 0 .874-.874c.08-.156.145-.38.18-.819.037-.45.038-1.032.038-1.889z'/></svg>";
@@ -8996,6 +8996,74 @@ const computePosition = (reference, floating, options) => {
8996
8996
  });
8997
8997
  };
8998
8998
 
8999
+ /**
9000
+ * The native `<dialog>` or open `popover` (as pds-filter's) an element sits in, so a popup portaled
9001
+ * there shares its top layer and a click in it isn't outside it; otherwise `document.body`.
9002
+ * `closest()` stops at shadow boundaries and misses one that only wraps slotted content, so this
9003
+ * walks assigned slots and shadow hosts, as pds-combobox does. `isHost` picks which ancestor counts.
9004
+ */
9005
+ function findPortalTarget(from, isHost = isOpenDialogOrPopover) {
9006
+ const seen = new Set();
9007
+ let current = from;
9008
+ while (current && !seen.has(current)) {
9009
+ seen.add(current);
9010
+ if (current.nodeType === Node.ELEMENT_NODE && isHost(current)) {
9011
+ return current;
9012
+ }
9013
+ const assigned = current.nodeType === Node.ELEMENT_NODE ? current.assignedSlot : null;
9014
+ if (assigned) {
9015
+ current = assigned;
9016
+ continue;
9017
+ }
9018
+ const parent = current.parentNode;
9019
+ current = parent instanceof ShadowRoot ? parent.host : parent;
9020
+ }
9021
+ return document.body;
9022
+ }
9023
+ /**
9024
+ * A modal dialog or open popover, which paints in the top layer above anything in the body, that
9025
+ * sits in the document itself: the document's stylesheets don't reach into a shadow root.
9026
+ */
9027
+ function isTopLayerInDocument(el) {
9028
+ if (el.getRootNode() !== el.ownerDocument)
9029
+ return false;
9030
+ return matchesSafely(el, ':modal') || matchesSafely(el, ':popover-open');
9031
+ }
9032
+ /**
9033
+ * Calls `onClose` once `host` leaves the top layer (its dialog closes or its popover hides), and
9034
+ * returns a function that stops listening.
9035
+ */
9036
+ function onTopLayerClose(host, onClose) {
9037
+ const check = () => {
9038
+ if (!isTopLayerInDocument(host))
9039
+ onClose();
9040
+ };
9041
+ host.addEventListener('close', check);
9042
+ host.addEventListener('toggle', check);
9043
+ return () => {
9044
+ host.removeEventListener('close', check);
9045
+ host.removeEventListener('toggle', check);
9046
+ };
9047
+ }
9048
+ function isOpenDialogOrPopover(el) {
9049
+ // Only an open dialog: inside a closed one, the popup would be hidden with it.
9050
+ if (el.localName === 'dialog')
9051
+ return el.open;
9052
+ return el.hasAttribute('popover') && matchesSafely(el, ':popover-open');
9053
+ }
9054
+ function matchesSafely(el, selector) {
9055
+ try {
9056
+ return el.matches(selector);
9057
+ }
9058
+ catch (_a) {
9059
+ // A browser without the selector (no Popover API, or no :modal): no top layer to share.
9060
+ return false;
9061
+ }
9062
+ }
9063
+
9064
+ // Controls that clipped text can sit inside that already take focus, so the text adds no tab stop of its own.
9065
+ // Not any `[tabindex]`: a focusable scroll region full of chips would show every chip's tooltip at once.
9066
+ const FOCUSABLE_WRAPPER = 'a[href], button, summary, pds-button, pds-link, pds-tab, pds-dropdown-menu-item, [role="option"]';
8999
9067
  /** CSS class prefix used for truncation tooltip portal elements */
9000
9068
  const TOOLTIP_CLASS = 'pds-truncation-tooltip';
9001
9069
  /**
@@ -9005,7 +9073,8 @@ const TOOLTIP_CLASS = 'pds-truncation-tooltip';
9005
9073
  *
9006
9074
  * Z-Index Strategy:
9007
9075
  * Uses --pine-z-index-nuclear (9999) to ensure tooltips appear above all other UI elements.
9008
- * This is necessary because tooltips are portaled to document.body and must overlay:
9076
+ * This is necessary because tooltips are portaled to document.body, or into the modal dialog or
9077
+ * open popover around the host (the top layer, which no z-index reaches from the body), and must overlay:
9009
9078
  * - Modal dialogs
9010
9079
  * - Dropdown menus
9011
9080
  * - Other floating UI elements
@@ -9045,6 +9114,15 @@ function injectStyles() {
9045
9114
  opacity: 1;
9046
9115
  visibility: visible;
9047
9116
  }
9117
+ :is(dialog, [popover]) > .${TOOLTIP_CLASS} {
9118
+ font-style: normal;
9119
+ font-weight: normal;
9120
+ text-align: start;
9121
+ text-indent: 0;
9122
+ text-transform: none;
9123
+ white-space: normal;
9124
+ word-spacing: normal;
9125
+ }
9048
9126
  `;
9049
9127
  document.head.appendChild(style);
9050
9128
  }
@@ -9071,7 +9149,8 @@ function isFocusVisible(el) {
9071
9149
  *
9072
9150
  * When the element's text overflows, hovering the host element or giving it
9073
9151
  * keyboard focus will display a tooltip showing the full text content. The
9074
- * tooltip is rendered as a portal on document.body and positioned with Floating UI.
9152
+ * tooltip is rendered as a portal on document.body, or in the modal dialog or open popover around
9153
+ * the host, and positioned with Floating UI.
9075
9154
  *
9076
9155
  * Also owns the element's `tabindex` while it is clipped — see syncTabIndex.
9077
9156
  *
@@ -9081,6 +9160,7 @@ function setupTruncationTooltip(options) {
9081
9160
  const { hostEl, contentEl, getTooltipText, placement = 'top', reference = hostEl, manageTabIndex = true, focusEl = hostEl } = options;
9082
9161
  injectStyles();
9083
9162
  let portalEl = null;
9163
+ let stopWatchingPortalHost = null;
9084
9164
  let isHovering = false;
9085
9165
  let isHoveringPortal = false;
9086
9166
  let isFocused = false;
@@ -9159,7 +9239,11 @@ function setupTruncationTooltip(options) {
9159
9239
  contentDiv.className = `${TOOLTIP_CLASS}__content`;
9160
9240
  contentDiv.textContent = text.trim();
9161
9241
  portalEl.appendChild(contentDiv);
9162
- document.body.appendChild(portalEl);
9242
+ const portalHost = findPortalTarget(hostEl, isTopLayerInDocument);
9243
+ portalHost.appendChild(portalEl);
9244
+ // Closing that host moves no pointer, so a tooltip opened by touch would outlive it unseen.
9245
+ if (portalHost !== document.body)
9246
+ stopWatchingPortalHost = onTopLayerClose(portalHost, closeWithPortalHost);
9163
9247
  // Allow the user to hover into the tooltip to select/copy text
9164
9248
  portalEl.addEventListener('mouseenter', handlePortalMouseEnter);
9165
9249
  portalEl.addEventListener('mouseleave', handlePortalMouseLeave);
@@ -9198,6 +9282,10 @@ function setupTruncationTooltip(options) {
9198
9282
  }
9199
9283
  }
9200
9284
  function removePortal() {
9285
+ if (stopWatchingPortalHost !== null) {
9286
+ stopWatchingPortalHost();
9287
+ stopWatchingPortalHost = null;
9288
+ }
9201
9289
  if (portalEl) {
9202
9290
  portalEl.removeEventListener('mouseenter', handlePortalMouseEnter);
9203
9291
  portalEl.removeEventListener('mouseleave', handlePortalMouseLeave);
@@ -9231,6 +9319,14 @@ function setupTruncationTooltip(options) {
9231
9319
  return;
9232
9320
  removePortal();
9233
9321
  }
9322
+ // Hover and focus can't outlast a host that's no longer shown, so none of them keeps it open.
9323
+ function closeWithPortalHost() {
9324
+ isHovering = false;
9325
+ isHoveringPortal = false;
9326
+ isFocused = false;
9327
+ cancelHideTimeout();
9328
+ removePortal();
9329
+ }
9234
9330
  /**
9235
9331
  * Schedules tooltip removal after a short delay.
9236
9332
  *
@@ -9262,11 +9358,18 @@ function setupTruncationTooltip(options) {
9262
9358
  isHoveringPortal = false;
9263
9359
  scheduleHide();
9264
9360
  }
9361
+ // A second tab stop inside focusEl, such as another clipped text, bubbles its focus here too. Its event.target is
9362
+ // retargeted to the stop's outermost element in focusEl's tree, which sits beside hostEl rather than around or in it.
9363
+ function isFocusForHost(target) {
9364
+ return focusEl === hostEl || target === focusEl || target.contains(hostEl) || hostEl.contains(target);
9365
+ }
9265
9366
  // Keyboard focus only: focus from a click would pin the tooltip open after the pointer leaves.
9266
9367
  // Events from inside a shadow root arrive retargeted to its host, so test the innermost target.
9267
9368
  function showForVisibleFocus(event) {
9268
9369
  if (!isFocusVisible(event.composedPath()[0]))
9269
9370
  return;
9371
+ if (!isFocusForHost(event.target))
9372
+ return;
9270
9373
  isFocused = true;
9271
9374
  showTooltip();
9272
9375
  }
@@ -9326,9 +9429,6 @@ const SENTIMENT_DOT_COLORS = {
9326
9429
  success: 'var(--pine-chip-color-success-dot)',
9327
9430
  warning: 'var(--pine-chip-color-warning-dot)',
9328
9431
  };
9329
- // Controls a chip can sit inside that already take focus, so a clipped label adds no tab stop of its own.
9330
- // Not any `[tabindex]`: a focusable scroll region full of chips would show every chip's tooltip at once.
9331
- const FOCUSABLE_WRAPPER = 'a[href], button, summary, pds-button, pds-link, pds-tab, pds-dropdown-menu-item, [role="option"]';
9332
9432
  // Beside the listbox and level with the option, so the tooltip never covers the other options.
9333
9433
  function besideListbox(wrapper) {
9334
9434
  const option = (wrapper === null || wrapper === void 0 ? void 0 : wrapper.matches('[role="option"]')) ? wrapper : null;
@@ -9555,7 +9655,7 @@ class PdsChip {
9555
9655
  const hostClass = this.classNames();
9556
9656
  const hostStyles = this.hostStyles;
9557
9657
  this.hostKeeper.record(hostClass, hostStyles);
9558
- return (hAsync(Host, { key: '0e67ea3700e8a8e1ad3049b6eafced6934262335', class: hostClass, id: this.componentId, style: hostStyles }, this.setChipContent(), this.effectiveVariant === 'tag' && this.renderCloseButton()));
9658
+ return (hAsync(Host, { key: 'b5afded680c3fa09523a7928d13c2a566a8a504c', class: hostClass, id: this.componentId, style: hostStyles }, this.setChipContent(), this.effectiveVariant === 'tag' && this.renderCloseButton()));
9559
9659
  }
9560
9660
  get el() { return getElement(this); }
9561
9661
  static get style() { return pdsChipTokensCss() + pdsChipCss(); }
@@ -14415,44 +14515,6 @@ class CalendarPortal {
14415
14515
  }
14416
14516
  }
14417
14517
  CalendarPortal.className = 'pds-datepicker-calendar-portal';
14418
- /**
14419
- * The native `<dialog>` or open `popover` (as pds-filter's) the datepicker sits in, so the
14420
- * calendar shares its top layer and a click in it isn't outside it; otherwise `document.body`.
14421
- * `closest()` stops at shadow boundaries and misses one that only wraps slotted content, so this
14422
- * walks assigned slots and shadow hosts, as pds-combobox does.
14423
- */
14424
- function findPortalTarget(from) {
14425
- const seen = new Set();
14426
- let current = from;
14427
- while (current && !seen.has(current)) {
14428
- seen.add(current);
14429
- if (current.nodeType === Node.ELEMENT_NODE && isTopLayerHost(current)) {
14430
- return current;
14431
- }
14432
- const assigned = current.nodeType === Node.ELEMENT_NODE ? current.assignedSlot : null;
14433
- if (assigned) {
14434
- current = assigned;
14435
- continue;
14436
- }
14437
- const parent = current.parentNode;
14438
- current = parent instanceof ShadowRoot ? parent.host : parent;
14439
- }
14440
- return document.body;
14441
- }
14442
- function isTopLayerHost(el) {
14443
- // Only an open dialog: inside a closed one, the calendar would be hidden with it.
14444
- if (el.localName === 'dialog')
14445
- return el.open;
14446
- if (!el.hasAttribute('popover'))
14447
- return false;
14448
- try {
14449
- return el.matches(':popover-open');
14450
- }
14451
- catch (_a) {
14452
- // A browser without the Popover API: no top layer to share.
14453
- return false;
14454
- }
14455
- }
14456
14518
 
14457
14519
  const DEFAULT_LABELS = {
14458
14520
  'today': 'Today',
@@ -17940,12 +18002,16 @@ const pdsIconContent = new Map();
17940
18002
 
17941
18003
  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)}`;
17942
18004
 
18005
+ // The attributes that give an icon its own accessible name.
18006
+ const NAMING_ATTRIBUTES = ['aria-label', 'aria-labelledby'];
17943
18007
  class PdsIcon {
17944
18008
  constructor(hostRef) {
17945
18009
  registerInstance(this, hostRef);
17946
18010
  this.didLoadIcon = false;
17947
18011
  this.iconName = null;
18012
+ this.warnedUnnamedFocusable = false;
17948
18013
  this.inheritedAttributes = {}; // eslint-disable-line @typescript-eslint/no-explicit-any
18014
+ this.isFocusable = false;
17949
18015
  this.isVisible = false;
17950
18016
  /**
17951
18017
  * The size of the icon. This can be
@@ -17954,10 +18020,6 @@ class PdsIcon {
17954
18020
  *
17955
18021
  */
17956
18022
  this.size = 'regular';
17957
- this.hasAriaHidden = () => {
17958
- const { el } = this;
17959
- return el.hasAttribute('aria-hidden') && el.getAttribute('aria-hidden') === 'true';
17960
- };
17961
18023
  }
17962
18024
  iconSize() {
17963
18025
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -17996,9 +18058,9 @@ class PdsIcon {
17996
18058
  }, 500);
17997
18059
  }
17998
18060
  componentWillLoad() {
17999
- this.inheritedAttributes = inheritAttributes(this.el, ['aria-label']);
18061
+ this.inheritedAttributes = inheritAttributes(this.el, NAMING_ATTRIBUTES);
18062
+ this.isFocusable = this.el.hasAttribute('tabindex');
18000
18063
  this.setCSSVariables();
18001
- this.setupInitialAriaLabel();
18002
18064
  }
18003
18065
  setCSSVariables() {
18004
18066
  var _a;
@@ -18007,6 +18069,7 @@ class PdsIcon {
18007
18069
  this.el.style.setProperty(`--color-icon-fill`, (_a = normalizeColorValue(this.color)) !== null && _a !== void 0 ? _a : 'currentColor');
18008
18070
  }
18009
18071
  connectedCallback() {
18072
+ this.observeNamingAttributes();
18010
18073
  // Handle re-connection during client-side navigation
18011
18074
  if (!this.isVisible && !this.svgContent) {
18012
18075
  this.waitUntilVisible(this.el, '50px', () => {
@@ -18025,14 +18088,16 @@ class PdsIcon {
18025
18088
  this.io.disconnect();
18026
18089
  this.io = undefined;
18027
18090
  }
18091
+ if (this.mo) {
18092
+ this.mo.disconnect();
18093
+ this.mo = undefined;
18094
+ }
18028
18095
  }
18029
18096
  updateStyles() {
18030
18097
  this.setCSSVariables();
18031
18098
  }
18032
18099
  onIconPropertyChange() {
18033
18100
  this.loadIcon();
18034
- // Update aria-label when icon properties change
18035
- this.setupInitialAriaLabel();
18036
18101
  }
18037
18102
  loadIcon() {
18038
18103
  // Reset load state when URL changes
@@ -18042,26 +18107,34 @@ class PdsIcon {
18042
18107
  this.iconName = getName(this.name, this.icon);
18043
18108
  }
18044
18109
  render() {
18045
- const { ariaLabel, flipRtl, iconName, inheritedAttributes } = this;
18110
+ const { flipRtl, iconName, inheritedAttributes } = this;
18046
18111
  const shouldIconAutoFlip = iconName
18047
18112
  ? shouldRtlFlipIcon(iconName, this.el) && flipRtl !== false
18048
18113
  : false;
18049
18114
  const shouldFlip = flipRtl || shouldIconAutoFlip;
18050
- // Use inherited aria-label if provided, otherwise fall back to auto-generated one
18051
- const finalAriaLabel = inheritedAttributes['aria-label'] || ariaLabel;
18052
- 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" }))));
18115
+ // An icon is decorative unless the author names it. A decorative icon is hidden
18116
+ // from assistive technology, so it contributes nothing to the accessible name of
18117
+ // the button or link it sits inside. Naming it from `name` instead would put an
18118
+ // icon id ("rocket-tone") into that control's name, where neither a screen reader
18119
+ // nor a page-inspecting agent can tell it apart from the real label.
18120
+ //
18121
+ // A focusable icon stays exposed even without a name: hiding something that
18122
+ // takes focus leaves keyboard users on an element a screen reader can't see.
18123
+ const isNamed = NAMING_ATTRIBUTES.some((attr) => inheritedAttributes[attr] !== undefined);
18124
+ const isDecorative = !isNamed && !this.isFocusable;
18125
+ return (hAsync(Host
18126
+ // undefined, not null: null would strip an aria-hidden the author set on a
18127
+ // named icon once the component re-renders.
18128
+ , 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" }))));
18053
18129
  }
18054
18130
  /*****
18055
18131
  * Private Methods
18056
18132
  ****/
18057
- setupInitialAriaLabel() {
18058
- // Only set aria-label during initial load if one isn't already provided
18059
- if (!this.inheritedAttributes['aria-label']) {
18060
- const iconName = getName(this.name, this.icon);
18061
- if (iconName) {
18062
- this.ariaLabel = iconName.replace(/\-/g, ' ');
18063
- }
18064
- }
18133
+ // The hide/expose decision reads the naming attributes and tabindex, which can
18134
+ // change after load (a React prop going from undefined to a string, or
18135
+ // setAttribute from script). Re-read them when they do.
18136
+ observeNamingAttributes() {
18137
+ return;
18065
18138
  }
18066
18139
  waitUntilVisible(el, rootMargin, cb) {
18067
18140
  {
@@ -18148,7 +18221,8 @@ class PdsIcon {
18148
18221
  "name": [513],
18149
18222
  "size": [513],
18150
18223
  "src": [1],
18151
- "ariaLabel": [32],
18224
+ "inheritedAttributes": [32],
18225
+ "isFocusable": [32],
18152
18226
  "isVisible": [32],
18153
18227
  "svgContent": [32]
18154
18228
  },
@@ -18564,7 +18638,7 @@ class PdsInput {
18564
18638
  }; }
18565
18639
  }
18566
18640
 
18567
- 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}`;
18641
+ 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}`;
18568
18642
 
18569
18643
  // Used when `externalLabel` is unset; an empty string hides the icon instead.
18570
18644
  const DEFAULT_EXTERNAL_LABEL = '(opens in a new tab)';
@@ -18782,7 +18856,8 @@ function collectTabbable(root, found) {
18782
18856
  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)); };
18783
18857
  function visitTabbable(el, found) {
18784
18858
  var _a, _b, _c, _d;
18785
- if (el.hasAttribute('inert'))
18859
+ // A tooltip portaled into a dialog only describes the control that has focus; it's never a stop of its own.
18860
+ if (el.hasAttribute('inert') || el.getAttribute('role') === 'tooltip')
18786
18861
  return;
18787
18862
  if (el.localName === 'slot') {
18788
18863
  const slot = el;
@@ -18838,7 +18913,7 @@ function tabbableIn(root) {
18838
18913
  return oneRadioPerGroup(visible);
18839
18914
  }
18840
18915
 
18841
- 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}`;
18916
+ 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}`;
18842
18917
 
18843
18918
  const PRESET_SIZES = ['sm', 'md', 'lg', 'fullscreen'];
18844
18919
  const isCustomLength = (value) => /^[a-z0-9.%+\-*/(), ]+$/i.test(value) &&
@@ -20015,6 +20090,12 @@ class PdsMultiselect {
20015
20090
  }
20016
20091
  else {
20017
20092
  this.closeDropdown();
20093
+ // Tab would move on to an option's checkbox, which closing removes, dropping focus to the page.
20094
+ // Land on the trigger instead, as Escape does; Shift+Tab already reaches it.
20095
+ const trigger = e.shiftKey ? undefined : this.activeTriggerEl;
20096
+ trigger === null || trigger === void 0 ? void 0 : trigger.focus();
20097
+ if (trigger === null || trigger === void 0 ? void 0 : trigger.matches(':focus'))
20098
+ e.preventDefault();
20018
20099
  }
20019
20100
  break;
20020
20101
  }
@@ -20973,10 +21054,10 @@ class PdsMultiselect {
20973
21054
  }
20974
21055
  render() {
20975
21056
  const hasSelections = this.selectedItems.length > 0;
20976
- 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: {
21057
+ 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: {
20977
21058
  'pds-multiselect__label': true,
20978
21059
  'visually-hidden': this.hideLabel,
20979
- } }, 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: {
21060
+ } }, 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: {
20980
21061
  'pds-multiselect__trigger': true,
20981
21062
  'pds-multiselect__trigger--open': this.isOpen,
20982
21063
  'pds-multiselect__trigger--disabled': this.disabled,
@@ -20992,7 +21073,7 @@ class PdsMultiselect {
20992
21073
  }, 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: {
20993
21074
  'pds-multiselect__trigger-text': true,
20994
21075
  'pds-multiselect__trigger-text--placeholder': !hasSelections || (this.selectedDisplay === 'pill' && this.pillPosition === 'below'),
20995
- } }, 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' })))));
21076
+ } }, 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' })))));
20996
21077
  }
20997
21078
  static get formAssociated() { return true; }
20998
21079
  get el() { return getElement(this); }
@@ -22471,6 +22552,7 @@ class PdsRadioGroup {
22471
22552
  * @defaultValue false
22472
22553
  */
22473
22554
  this.required = false;
22555
+ this.hostKeeper = new HostStylingKeeper();
22474
22556
  }
22475
22557
  handlePropsChange() {
22476
22558
  this.updateChildRadios();
@@ -22522,6 +22604,29 @@ class PdsRadioGroup {
22522
22604
  }
22523
22605
  });
22524
22606
  }
22607
+ connectedCallback() {
22608
+ this.hostKeeper.connect(this.el);
22609
+ // A name set while the group was detached never reaches the observer.
22610
+ this.syncName();
22611
+ if (typeof MutationObserver === 'undefined')
22612
+ return;
22613
+ // Consumers can name the group after render (a prop change, an i18n swap, a morph); re-render so their name wins.
22614
+ this.hostAriaObserver = new MutationObserver(() => this.syncName());
22615
+ this.hostAriaObserver.observe(this.el, { attributeFilter: ['aria-label', 'aria-labelledby'] });
22616
+ }
22617
+ disconnectedCallback() {
22618
+ var _a;
22619
+ this.hostKeeper.disconnect();
22620
+ (_a = this.hostAriaObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
22621
+ this.hostAriaObserver = undefined;
22622
+ }
22623
+ // Re-renders only when the group's name would change, so its own aria-labelledby write doesn't loop back.
22624
+ syncName() {
22625
+ if (this._groupId === undefined)
22626
+ return;
22627
+ if (this.getAriaLabelledBy() !== this.renderedLabelledBy)
22628
+ ;
22629
+ }
22525
22630
  componentWillLoad() {
22526
22631
  // Generate stable group ID once during initialization
22527
22632
  // This ensures DOM stability and accessibility relationships remain consistent across re-renders
@@ -22535,6 +22640,18 @@ class PdsRadioGroup {
22535
22640
  : `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
22536
22641
  this._groupId = `radio-group-${uniqueId}`;
22537
22642
  }
22643
+ // A restored or cloned host still carries the id and ARIA references an earlier instance wrote, pointing at
22644
+ // that instance's label and messages. Drop them so this render writes its own: on first load, Stencil keeps a
22645
+ // host attribute that's already there.
22646
+ const previousId = this.el.getAttribute('id');
22647
+ if (previousId && previousId !== this._groupId) {
22648
+ ['aria-labelledby', 'aria-describedby'].forEach((name) => {
22649
+ var _a, _b;
22650
+ const ids = (_b = (_a = this.el.getAttribute(name)) === null || _a === void 0 ? void 0 : _a.split(/\s+/)) !== null && _b !== void 0 ? _b : [];
22651
+ if (ids.some((id) => id.startsWith(`${previousId}__`)))
22652
+ this.el.removeAttribute(name);
22653
+ });
22654
+ }
22538
22655
  }
22539
22656
  componentDidLoad() {
22540
22657
  if (!this.name) {
@@ -22587,6 +22704,20 @@ class PdsRadioGroup {
22587
22704
  // Otherwise, assume it's a dimension token like "100", "200", etc.
22588
22705
  return `var(--pine-dimension-${this.gap})`;
22589
22706
  }
22707
+ get labelId() {
22708
+ return `${this._groupId}__label`;
22709
+ }
22710
+ // Names the group from its visible label, unless the consumer named it with their own aria-label or aria-labelledby.
22711
+ // A blank aria-label (an empty translation, say) names nothing, so it falls back to groupLabel.
22712
+ getAriaLabelledBy() {
22713
+ var _a;
22714
+ const hostLabelledBy = this.el.getAttribute('aria-labelledby');
22715
+ if ((hostLabelledBy === null || hostLabelledBy === void 0 ? void 0 : hostLabelledBy.trim()) && hostLabelledBy !== this.labelId)
22716
+ return hostLabelledBy;
22717
+ if ((_a = this.el.getAttribute('aria-label')) === null || _a === void 0 ? void 0 : _a.trim())
22718
+ return undefined;
22719
+ return this.groupLabel ? this.labelId : undefined;
22720
+ }
22590
22721
  getAriaDescribedBy() {
22591
22722
  const messageIds = [];
22592
22723
  if (this.errorMessage) {
@@ -22600,13 +22731,23 @@ class PdsRadioGroup {
22600
22731
  render() {
22601
22732
  const gapValue = this.getGapValue();
22602
22733
  const ariaDescribedBy = this.getAriaDescribedBy();
22603
- return (hAsync(Host, { key: 'aaf53113f06a0f49706e53735701fba64e79cb4d', class: this.classNames(), id: this._groupId, role: "group", "aria-describedby": ariaDescribedBy, style: {
22734
+ const ariaLabelledBy = this.getAriaLabelledBy();
22735
+ const hostClass = this.classNames();
22736
+ this.renderedLabelledBy = ariaLabelledBy;
22737
+ // A DOM morph strips what the component wrote on its host; put back its role, name and description.
22738
+ // Only its own aria-labelledby, so a consumer's that the server dropped stays dropped.
22739
+ this.hostKeeper.record(hostClass, { '--pds-radio-group-gap': gapValue }, {
22740
+ role: 'radiogroup',
22741
+ 'aria-describedby': ariaDescribedBy,
22742
+ 'aria-labelledby': ariaLabelledBy === this.labelId ? ariaLabelledBy : undefined,
22743
+ });
22744
+ return (hAsync(Host, { key: '0fe381f99dddae0aeb9189a13b0e2195f1c79886', class: hostClass, id: this._groupId, role: "radiogroup", "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, style: {
22604
22745
  '--pds-radio-group-gap': gapValue,
22605
- } }, this.groupLabel && (hAsync("div", { key: '4be5e43146bf348929e45498107862aaca161644', class: "pds-radio-group__label" }, this.groupLabel)), hAsync("div", { key: 'b4a1b870c1a7167b8dcbcf0a11808bbd9a8cec4e', class: {
22746
+ } }, this.groupLabel && (hAsync("div", { key: '4967dc22fa0265dbfbabf94a49b182b8c06d0bd5', class: "pds-radio-group__label", id: this.labelId }, this.groupLabel)), hAsync("div", { key: '7a782a6920de7eda76ab0060c7512f093671ad41', class: {
22606
22747
  'pds-radio-group__radios': true,
22607
22748
  'pds-radio-group__radios--row': this.direction === 'row',
22608
22749
  'pds-radio-group__radios--column': this.direction === 'column',
22609
- } }, 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))));
22750
+ } }, 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))));
22610
22751
  }
22611
22752
  get el() { return getElement(this); }
22612
22753
  static get watchers() { return {
@@ -27512,6 +27653,9 @@ const TEXT_SIZES = [
27512
27653
 
27513
27654
  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}`;
27514
27655
 
27656
+ // Re-runs setup for each text bound to its wrapping control, keyed by host, so a truncated
27657
+ // text that joins the same control later can take that control's focus away from it.
27658
+ const textsUsingWrapper = new WeakMap();
27515
27659
  /**
27516
27660
  * @part content - The text content container
27517
27661
  */
@@ -27566,17 +27710,39 @@ class PdsText {
27566
27710
  this.destroyTruncationTooltip();
27567
27711
  }
27568
27712
  initTruncationTooltip() {
27713
+ var _a;
27569
27714
  // Clean up any existing tooltip before setting up a new one
27570
27715
  this.destroyTruncationTooltip();
27571
27716
  if (this.contentEl) {
27717
+ const wrapper = this.el.closest(FOCUSABLE_WRAPPER);
27718
+ // A pds-chip with a max width binds its tooltip to the wrapper too.
27719
+ const others = wrapper === null ? [] : wrapper.querySelectorAll('pds-text, pds-chip');
27720
+ // One focus on a shared wrapper would open every clipped text's tooltip at once, so texts sharing one each keep
27721
+ // their own stop, and a text bound before this one joined lets go: this one's focus bubbles to the wrapper too.
27722
+ let sharesWrapper = false;
27723
+ for (let i = 0; i < others.length; i++) {
27724
+ const other = others[i];
27725
+ // The property counts too: setting `truncate` runs setup before the next render reflects the attribute.
27726
+ if (other !== this.el && (other.truncate || other.maxWidth || other.hasAttribute('truncate') || other.hasAttribute('max-width'))) {
27727
+ sharesWrapper = true;
27728
+ (_a = textsUsingWrapper.get(other)) === null || _a === void 0 ? void 0 : _a();
27729
+ }
27730
+ }
27731
+ const usesWrapper = wrapper !== null && !sharesWrapper;
27572
27732
  this.truncationCleanup = setupTruncationTooltip({
27573
27733
  hostEl: this.el,
27574
27734
  contentEl: this.contentEl,
27575
27735
  getTooltipText: () => this.el.textContent || '',
27736
+ // A wrapping link or button already takes focus, so its focus reveals the text instead of a nested tab stop.
27737
+ manageTabIndex: !usesWrapper,
27738
+ focusEl: usesWrapper ? wrapper : this.el,
27576
27739
  });
27740
+ if (usesWrapper)
27741
+ textsUsingWrapper.set(this.el, () => this.initTruncationTooltip());
27577
27742
  }
27578
27743
  }
27579
27744
  destroyTruncationTooltip() {
27745
+ textsUsingWrapper.delete(this.el);
27580
27746
  if (this.truncationCleanup) {
27581
27747
  this.truncationCleanup();
27582
27748
  this.truncationCleanup = null;
@@ -27602,7 +27768,7 @@ class PdsText {
27602
27768
  ? `pds-text--decoration-${this.decoration}`
27603
27769
  : ''}
27604
27770
  `;
27605
- return (hAsync(Tag, { key: 'b79a6e67f11024cb025cb26bbf77231547bd63a4', ref: (el) => (this.contentEl = el), style: this.color && setColor(this.color), class: typeClasses, part: "content" }, hAsync("slot", { key: 'ae1f8ca39899894541eac3c07fb21ead4ab98f40' })));
27771
+ return (hAsync(Tag, { key: '30566c7810d3fd7f76ae281ae6d9a7e66803f0a3', ref: (el) => (this.contentEl = el), style: this.color && setColor(this.color), class: typeClasses, part: "content" }, hAsync("slot", { key: 'f5113458aa9295803fc1c0bc552f9f92602cacba' })));
27606
27772
  }
27607
27773
  get el() { return getElement(this); }
27608
27774
  static get watchers() { return {
@@ -28167,7 +28333,7 @@ class PdsToast {
28167
28333
  }; }
28168
28334
  }
28169
28335
 
28170
- 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}`;
28336
+ 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}`;
28171
28337
 
28172
28338
  /**
28173
28339
  * @slot (default) - The tooltip's target element
@@ -28192,6 +28358,7 @@ class PdsTooltip {
28192
28358
  this.currentPathname = '';
28193
28359
  this.pathnameCheckInterval = null;
28194
28360
  this.stopAutoUpdate = null;
28361
+ this.stopWatchingPortalHost = null;
28195
28362
  /**
28196
28363
  * Determines whether or not the tooltip has an arrow
28197
28364
  * @defaultValue true
@@ -28441,7 +28608,12 @@ class PdsTooltip {
28441
28608
  this.lastCopiedHtml = this.strippedHtml(initialCopy);
28442
28609
  this.contentDiv.append(...Array.from(initialCopy.childNodes));
28443
28610
  this.portalEl.appendChild(this.contentDiv);
28444
- document.body.appendChild(this.portalEl);
28611
+ // Nothing in the body paints above a modal dialog or open popover, so the portal goes inside one.
28612
+ const portalHost = findPortalTarget(this.el, isTopLayerInDocument);
28613
+ portalHost.appendChild(this.portalEl);
28614
+ // Closing that host moves no pointer, so a tooltip opened by touch would outlive it unseen.
28615
+ if (portalHost !== document.body)
28616
+ this.stopWatchingPortalHost = onTopLayerClose(portalHost, this.handleHide);
28445
28617
  this.repositionPortal().catch(error => {
28446
28618
  console.warn('Failed to position tooltip on creation:', error);
28447
28619
  });
@@ -28554,6 +28726,10 @@ class PdsTooltip {
28554
28726
  this.stopAutoUpdate();
28555
28727
  this.stopAutoUpdate = null;
28556
28728
  }
28729
+ if (this.stopWatchingPortalHost !== null) {
28730
+ this.stopWatchingPortalHost();
28731
+ this.stopWatchingPortalHost = null;
28732
+ }
28557
28733
  // Stop pathname change detection
28558
28734
  if (this.pathnameCheckInterval !== null) {
28559
28735
  clearInterval(this.pathnameCheckInterval);
@@ -28584,9 +28760,9 @@ class PdsTooltip {
28584
28760
  }
28585
28761
  render() {
28586
28762
  const hostId = this.componentId || undefined;
28587
- 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,
28763
+ 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,
28588
28764
  /* focusin/out bubble; ensure keyboard users see tooltips */
28589
- 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" }))));
28765
+ 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" }))));
28590
28766
  }
28591
28767
  get el() { return getElement(this); }
28592
28768
  static get watchers() { return {