@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
@@ -1,4 +1,5 @@
1
1
  import { closest } from "../../utils/closest";
2
+ import { findPortalTarget } from "../../utils/portal-target";
2
3
  /**
3
4
  * Where the open calendar lives: a `div` in `document.body`, or in the nearest `<dialog>` so it
4
5
  * shares a modal's top layer, outside any `overflow: hidden` or transformed ancestor that would
@@ -96,41 +97,3 @@ export class CalendarPortal {
96
97
  }
97
98
  }
98
99
  CalendarPortal.className = 'pds-datepicker-calendar-portal';
99
- /**
100
- * The native `<dialog>` or open `popover` (as pds-filter's) the datepicker sits in, so the
101
- * calendar shares its top layer and a click in it isn't outside it; otherwise `document.body`.
102
- * `closest()` stops at shadow boundaries and misses one that only wraps slotted content, so this
103
- * walks assigned slots and shadow hosts, as pds-combobox does.
104
- */
105
- export function findPortalTarget(from) {
106
- const seen = new Set();
107
- let current = from;
108
- while (current && !seen.has(current)) {
109
- seen.add(current);
110
- if (current.nodeType === Node.ELEMENT_NODE && isTopLayerHost(current)) {
111
- return current;
112
- }
113
- const assigned = current.nodeType === Node.ELEMENT_NODE ? current.assignedSlot : null;
114
- if (assigned) {
115
- current = assigned;
116
- continue;
117
- }
118
- const parent = current.parentNode;
119
- current = parent instanceof ShadowRoot ? parent.host : parent;
120
- }
121
- return document.body;
122
- }
123
- function isTopLayerHost(el) {
124
- // Only an open dialog: inside a closed one, the calendar would be hidden with it.
125
- if (el.localName === 'dialog')
126
- return el.open;
127
- if (!el.hasAttribute('popover'))
128
- return false;
129
- try {
130
- return el.matches(':popover-open');
131
- }
132
- catch (_a) {
133
- // A browser without the Popover API: no top layer to share.
134
- return false;
135
- }
136
- }
@@ -13,9 +13,9 @@
13
13
  }
14
14
  .pds-link:focus-visible {
15
15
  border-radius: var(--pine-dimension-2xs);
16
+ isolation: isolate;
16
17
  outline: var(--pine-outline-focus);
17
18
  outline-offset: var(--pine-border-width-thick);
18
- position: relative;
19
19
  }
20
20
  .pds-link:hover {
21
21
  color: var(--color, var(--pds-context-link-color-hover, var(--pine-color-text-hover)));
@@ -73,3 +73,51 @@ export const NavTabs = {
73
73
  </nav>
74
74
  `,
75
75
  };
76
+
77
+ // A whole row that is one link. The click area is the link part's ::after stretched over
78
+ // the positioned row, so the row activates the link without nesting anything inside it.
79
+ // Trailing controls sit above that box so they stay separately clickable, and the focus
80
+ // ring is drawn on the stretched box rather than on the text.
81
+ export const WholeRowLink = {
82
+ render: () => html`
83
+ <style>
84
+ .pds-link-row {
85
+ position: relative;
86
+ }
87
+
88
+ .pds-link-row:hover {
89
+ background-color: var(--pine-color-background-muted);
90
+ }
91
+
92
+ .pds-link-row pds-link::part(link)::after {
93
+ border-radius: var(--pine-border-radius-md);
94
+ content: "";
95
+ inset: 0;
96
+ position: absolute;
97
+ }
98
+
99
+ .pds-link-row pds-link::part(link):focus-visible {
100
+ outline: none;
101
+ }
102
+
103
+ .pds-link-row pds-link::part(link):focus-visible::after {
104
+ outline: var(--pine-outline-focus);
105
+ outline-offset: var(--pine-border-width-thick);
106
+ }
107
+
108
+ .pds-link-row__trailing {
109
+ position: relative;
110
+ z-index: 1;
111
+ }
112
+ </style>
113
+ <pds-box class="pds-link-row" border border-radius="md" padding="sm" align-items="center" justify-content="space-between">
114
+ <pds-box gap="xs" align-items="center">
115
+ <pds-icon name="file" aria-hidden="true"></pds-icon>
116
+ <pds-link href="#row-target" variant="plain">Quarterly report</pds-link>
117
+ </pds-box>
118
+ <pds-box class="pds-link-row__trailing">
119
+ <pds-button variant="secondary" size="small">Download</pds-button>
120
+ </pds-box>
121
+ </pds-box>
122
+ `,
123
+ };
@@ -23,7 +23,7 @@
23
23
  backdrop-filter: blur(3px);
24
24
  }
25
25
  }
26
- pds-modal .pds-modal__backdrop {
26
+ pds-modal pds-modal .pds-modal__backdrop {
27
27
  z-index: var(--pine-z-index-priority);
28
28
  }
29
29
  .pds-modal__backdrop::backdrop {
@@ -302,6 +302,12 @@ export class PdsMultiselect {
302
302
  }
303
303
  else {
304
304
  this.closeDropdown();
305
+ // Tab would move on to an option's checkbox, which closing removes, dropping focus to the page.
306
+ // Land on the trigger instead, as Escape does; Shift+Tab already reaches it.
307
+ const trigger = e.shiftKey ? undefined : this.activeTriggerEl;
308
+ trigger === null || trigger === void 0 ? void 0 : trigger.focus();
309
+ if (trigger === null || trigger === void 0 ? void 0 : trigger.matches(':focus'))
310
+ e.preventDefault();
305
311
  }
306
312
  break;
307
313
  }
@@ -1260,10 +1266,10 @@ export class PdsMultiselect {
1260
1266
  }
1261
1267
  render() {
1262
1268
  const hasSelections = this.selectedItems.length > 0;
1263
- return (h(Host, { key: 'a92086af75e20b9b37b147365bfa517d96021700', "aria-disabled": this.disabled ? 'true' : null }, h("div", { key: 'd49e0442e3a348248e5ac3b37afc9f128b34956b', class: "pds-multiselect", onFocusout: this.handleContainerFocusOut }, this.label && (h("label", { key: '41a081803dfd784e20a7135ecf5f5c4657908dd1', id: `${this.componentId}-label`, htmlFor: this.componentId, class: {
1269
+ return (h(Host, { key: '8f1ce5ef092285ce7c0855643fae76a4ec86ee17', "aria-disabled": this.disabled ? 'true' : null }, h("div", { key: 'c14c3d52c1d55fb33a89f1a25055728215a1e4ab', class: "pds-multiselect", onFocusout: this.handleContainerFocusOut }, this.label && (h("label", { key: 'aacd3339b0db2048b31fbc5963f7232bbff78efe', id: `${this.componentId}-label`, htmlFor: this.componentId, class: {
1264
1270
  'pds-multiselect__label': true,
1265
1271
  'visually-hidden': this.hideLabel,
1266
- } }, this.label)), h("div", { key: '0e3c8a3aaf7c70b4ff71972c29b8d5599f62ec97', class: "pds-multiselect__wrapper", ref: el => (this.containerEl = el), style: { width: this.triggerWidth } }, this.slottedTriggerEl ? (h("slot", { name: "trigger" })) : this.selectedDisplay === 'pill' && this.pillPosition === 'inline' ? (h("div", { ref: el => (this.pillInlineTriggerEl = el || undefined), part: "trigger", class: {
1272
+ } }, this.label)), h("div", { key: '5e1ef76aa5d46798519e5ac885bfa1c8d7c7106c', class: "pds-multiselect__wrapper", ref: el => (this.containerEl = el), style: { width: this.triggerWidth } }, this.slottedTriggerEl ? (h("slot", { name: "trigger" })) : this.selectedDisplay === 'pill' && this.pillPosition === 'inline' ? (h("div", { ref: el => (this.pillInlineTriggerEl = el || undefined), part: "trigger", class: {
1267
1273
  'pds-multiselect__trigger': true,
1268
1274
  'pds-multiselect__trigger--open': this.isOpen,
1269
1275
  'pds-multiselect__trigger--disabled': this.disabled,
@@ -1279,7 +1285,7 @@ export class PdsMultiselect {
1279
1285
  }, 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 }, h("span", { class: {
1280
1286
  'pds-multiselect__trigger-text': true,
1281
1287
  'pds-multiselect__trigger-text--placeholder': !hasSelections || (this.selectedDisplay === 'pill' && this.pillPosition === 'below'),
1282
- } }, this.getTriggerText()), h("pds-icon", { "aria-hidden": "true", class: "pds-multiselect__icon", icon: enlarge }))), this.renderDropdown()), this.selectedDisplay === 'pill' && this.pillPosition === 'below' && this.renderBelowPills(), h("span", { key: 'd5cddc1d3374d94ecf0cce1bcaf7c7125bf3128d', class: "visually-hidden", "aria-live": "polite", "aria-atomic": "true" }, this.removalAnnouncement), this.helperMessage && !(this.errorMessage && this.errorMessage.length > 0) && (h("p", { key: 'e3cb958b6fd2b1e138b769de0f53be1b8564902d', class: "pds-multiselect__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)), this.errorMessage && (h("p", { key: 'f6c2a30cc192391973d9b22fbb6732ce387832ac', class: "pds-multiselect__error", id: messageId(this.componentId, 'error') }, h("pds-icon", { key: 'f437effafaa383b81aec7b5bf635598c8b0075b8', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage)), h("div", { key: 'f1e747137f2dc7cad3d4e1ff8fc293401e3173e1', style: { display: 'none' } }, h("slot", { key: 'f337137b3ca5983dc6641361101f6d19c972778c' })))));
1288
+ } }, this.getTriggerText()), h("pds-icon", { "aria-hidden": "true", class: "pds-multiselect__icon", icon: enlarge }))), this.renderDropdown()), this.selectedDisplay === 'pill' && this.pillPosition === 'below' && this.renderBelowPills(), h("span", { key: '590045e4769812a1a2f7a97580d21d95dbe4e872', class: "visually-hidden", "aria-live": "polite", "aria-atomic": "true" }, this.removalAnnouncement), this.helperMessage && !(this.errorMessage && this.errorMessage.length > 0) && (h("p", { key: '419f4349b7cb17260f03d2bdcfd777561a62de42', class: "pds-multiselect__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)), this.errorMessage && (h("p", { key: 'b922af14c83348607aa9aaaefe9b03b39e71bd42', class: "pds-multiselect__error", id: messageId(this.componentId, 'error') }, h("pds-icon", { key: 'bd08726adf14a42f2ecf0cdfcd390e5639f9fd96', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage)), h("div", { key: '42ad7905fb1816ccdd29b6aa438779929804b368', style: { display: 'none' } }, h("slot", { key: '4f3bf380e93d216790efb0a5de85d6479862350e' })))));
1283
1289
  }
1284
1290
  static get is() { return "pds-multiselect"; }
1285
1291
  static get encapsulation() { return "shadow"; }
@@ -1,4 +1,5 @@
1
- import { Host, h } from "@stencil/core";
1
+ import { Host, h, forceUpdate } from "@stencil/core";
2
+ import { HostStylingKeeper } from "../../utils/attributes";
2
3
  import { messageId } from "../../utils/form";
3
4
  import { danger } from "@pine-ds/icons/icons";
4
5
  /**
@@ -32,6 +33,7 @@ export class PdsRadioGroup {
32
33
  * @defaultValue false
33
34
  */
34
35
  this.required = false;
36
+ this.hostKeeper = new HostStylingKeeper();
35
37
  }
36
38
  handlePropsChange() {
37
39
  this.updateChildRadios();
@@ -83,6 +85,29 @@ export class PdsRadioGroup {
83
85
  }
84
86
  });
85
87
  }
88
+ connectedCallback() {
89
+ this.hostKeeper.connect(this.el);
90
+ // A name set while the group was detached never reaches the observer.
91
+ this.syncName();
92
+ if (typeof MutationObserver === 'undefined')
93
+ return;
94
+ // Consumers can name the group after render (a prop change, an i18n swap, a morph); re-render so their name wins.
95
+ this.hostAriaObserver = new MutationObserver(() => this.syncName());
96
+ this.hostAriaObserver.observe(this.el, { attributeFilter: ['aria-label', 'aria-labelledby'] });
97
+ }
98
+ disconnectedCallback() {
99
+ var _a;
100
+ this.hostKeeper.disconnect();
101
+ (_a = this.hostAriaObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
102
+ this.hostAriaObserver = undefined;
103
+ }
104
+ // Re-renders only when the group's name would change, so its own aria-labelledby write doesn't loop back.
105
+ syncName() {
106
+ if (this._groupId === undefined)
107
+ return;
108
+ if (this.getAriaLabelledBy() !== this.renderedLabelledBy)
109
+ forceUpdate(this);
110
+ }
86
111
  componentWillLoad() {
87
112
  // Generate stable group ID once during initialization
88
113
  // This ensures DOM stability and accessibility relationships remain consistent across re-renders
@@ -96,6 +121,18 @@ export class PdsRadioGroup {
96
121
  : `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
97
122
  this._groupId = `radio-group-${uniqueId}`;
98
123
  }
124
+ // A restored or cloned host still carries the id and ARIA references an earlier instance wrote, pointing at
125
+ // that instance's label and messages. Drop them so this render writes its own: on first load, Stencil keeps a
126
+ // host attribute that's already there.
127
+ const previousId = this.el.getAttribute('id');
128
+ if (previousId && previousId !== this._groupId) {
129
+ ['aria-labelledby', 'aria-describedby'].forEach((name) => {
130
+ var _a, _b;
131
+ const ids = (_b = (_a = this.el.getAttribute(name)) === null || _a === void 0 ? void 0 : _a.split(/\s+/)) !== null && _b !== void 0 ? _b : [];
132
+ if (ids.some((id) => id.startsWith(`${previousId}__`)))
133
+ this.el.removeAttribute(name);
134
+ });
135
+ }
99
136
  }
100
137
  componentDidLoad() {
101
138
  if (!this.name) {
@@ -148,6 +185,20 @@ export class PdsRadioGroup {
148
185
  // Otherwise, assume it's a dimension token like "100", "200", etc.
149
186
  return `var(--pine-dimension-${this.gap})`;
150
187
  }
188
+ get labelId() {
189
+ return `${this._groupId}__label`;
190
+ }
191
+ // Names the group from its visible label, unless the consumer named it with their own aria-label or aria-labelledby.
192
+ // A blank aria-label (an empty translation, say) names nothing, so it falls back to groupLabel.
193
+ getAriaLabelledBy() {
194
+ var _a;
195
+ const hostLabelledBy = this.el.getAttribute('aria-labelledby');
196
+ if ((hostLabelledBy === null || hostLabelledBy === void 0 ? void 0 : hostLabelledBy.trim()) && hostLabelledBy !== this.labelId)
197
+ return hostLabelledBy;
198
+ if ((_a = this.el.getAttribute('aria-label')) === null || _a === void 0 ? void 0 : _a.trim())
199
+ return undefined;
200
+ return this.groupLabel ? this.labelId : undefined;
201
+ }
151
202
  getAriaDescribedBy() {
152
203
  const messageIds = [];
153
204
  if (this.errorMessage) {
@@ -161,13 +212,23 @@ export class PdsRadioGroup {
161
212
  render() {
162
213
  const gapValue = this.getGapValue();
163
214
  const ariaDescribedBy = this.getAriaDescribedBy();
164
- return (h(Host, { key: 'aaf53113f06a0f49706e53735701fba64e79cb4d', class: this.classNames(), id: this._groupId, role: "group", "aria-describedby": ariaDescribedBy, style: {
215
+ const ariaLabelledBy = this.getAriaLabelledBy();
216
+ const hostClass = this.classNames();
217
+ this.renderedLabelledBy = ariaLabelledBy;
218
+ // A DOM morph strips what the component wrote on its host; put back its role, name and description.
219
+ // Only its own aria-labelledby, so a consumer's that the server dropped stays dropped.
220
+ this.hostKeeper.record(hostClass, { '--pds-radio-group-gap': gapValue }, {
221
+ role: 'radiogroup',
222
+ 'aria-describedby': ariaDescribedBy,
223
+ 'aria-labelledby': ariaLabelledBy === this.labelId ? ariaLabelledBy : undefined,
224
+ });
225
+ return (h(Host, { key: '0fe381f99dddae0aeb9189a13b0e2195f1c79886', class: hostClass, id: this._groupId, role: "radiogroup", "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, style: {
165
226
  '--pds-radio-group-gap': gapValue,
166
- } }, this.groupLabel && (h("div", { key: '4be5e43146bf348929e45498107862aaca161644', class: "pds-radio-group__label" }, this.groupLabel)), h("div", { key: 'b4a1b870c1a7167b8dcbcf0a11808bbd9a8cec4e', class: {
227
+ } }, this.groupLabel && (h("div", { key: '4967dc22fa0265dbfbabf94a49b182b8c06d0bd5', class: "pds-radio-group__label", id: this.labelId }, this.groupLabel)), h("div", { key: '7a782a6920de7eda76ab0060c7512f093671ad41', class: {
167
228
  'pds-radio-group__radios': true,
168
229
  'pds-radio-group__radios--row': this.direction === 'row',
169
230
  'pds-radio-group__radios--column': this.direction === 'column',
170
- } }, h("slot", { key: '2d841cc69c35a4f9da933bbb33c1384ca343e077', onSlotchange: () => this.updateChildRadios() })), this.helperMessage && (h("div", { key: 'a09bb9e739570c06dc1907cb4e2dceecca36f7d3', class: "pds-radio-group__message", id: messageId(this._groupId, 'helper') }, this.helperMessage)), this.errorMessage && (h("div", { key: 'b8fe891cc4b8683d18c19b3b4ddb70212185b954', class: "pds-radio-group__message pds-radio-group__message--error", id: messageId(this._groupId, 'error'), "aria-live": "assertive" }, h("pds-icon", { key: '9a15d81d8303eeb5a928b96c760f6b15e536e0dc', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage))));
231
+ } }, h("slot", { key: '48a8d2d74961a402e3a1b053b2f0314e74b4b289', onSlotchange: () => this.updateChildRadios() })), this.helperMessage && (h("div", { key: '58db96d62b8d89f03ab245990d2d6bbd3b1b5f85', class: "pds-radio-group__message", id: messageId(this._groupId, 'helper') }, this.helperMessage)), this.errorMessage && (h("div", { key: 'ad3aafe5f7ed45853c36b537525a8fff68452f55', class: "pds-radio-group__message pds-radio-group__message--error", id: messageId(this._groupId, 'error'), "aria-live": "assertive" }, h("pds-icon", { key: '80ce92868703c5e01434e7e83a7668e320bcbee1', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage))));
171
232
  }
172
233
  static get is() { return "pds-radio-group"; }
173
234
  static get encapsulation() { return "scoped"; }
@@ -1,7 +1,10 @@
1
1
  import { h } from "@stencil/core";
2
2
  import { setColor } from "../../utils/utils";
3
- import { setupTruncationTooltip } from "../../utils/truncation-tooltip";
3
+ import { FOCUSABLE_WRAPPER, setupTruncationTooltip } from "../../utils/truncation-tooltip";
4
4
  import { TEXT_SIZES } from "../../utils/types";
5
+ // Re-runs setup for each text bound to its wrapping control, keyed by host, so a truncated
6
+ // text that joins the same control later can take that control's focus away from it.
7
+ const textsUsingWrapper = new WeakMap();
5
8
  /**
6
9
  * @part content - The text content container
7
10
  */
@@ -55,17 +58,39 @@ export class PdsText {
55
58
  this.destroyTruncationTooltip();
56
59
  }
57
60
  initTruncationTooltip() {
61
+ var _a;
58
62
  // Clean up any existing tooltip before setting up a new one
59
63
  this.destroyTruncationTooltip();
60
64
  if (this.contentEl) {
65
+ const wrapper = this.el.closest(FOCUSABLE_WRAPPER);
66
+ // A pds-chip with a max width binds its tooltip to the wrapper too.
67
+ const others = wrapper === null ? [] : wrapper.querySelectorAll('pds-text, pds-chip');
68
+ // One focus on a shared wrapper would open every clipped text's tooltip at once, so texts sharing one each keep
69
+ // their own stop, and a text bound before this one joined lets go: this one's focus bubbles to the wrapper too.
70
+ let sharesWrapper = false;
71
+ for (let i = 0; i < others.length; i++) {
72
+ const other = others[i];
73
+ // The property counts too: setting `truncate` runs setup before the next render reflects the attribute.
74
+ if (other !== this.el && (other.truncate || other.maxWidth || other.hasAttribute('truncate') || other.hasAttribute('max-width'))) {
75
+ sharesWrapper = true;
76
+ (_a = textsUsingWrapper.get(other)) === null || _a === void 0 ? void 0 : _a();
77
+ }
78
+ }
79
+ const usesWrapper = wrapper !== null && !sharesWrapper;
61
80
  this.truncationCleanup = setupTruncationTooltip({
62
81
  hostEl: this.el,
63
82
  contentEl: this.contentEl,
64
83
  getTooltipText: () => this.el.textContent || '',
84
+ // A wrapping link or button already takes focus, so its focus reveals the text instead of a nested tab stop.
85
+ manageTabIndex: !usesWrapper,
86
+ focusEl: usesWrapper ? wrapper : this.el,
65
87
  });
88
+ if (usesWrapper)
89
+ textsUsingWrapper.set(this.el, () => this.initTruncationTooltip());
66
90
  }
67
91
  }
68
92
  destroyTruncationTooltip() {
93
+ textsUsingWrapper.delete(this.el);
69
94
  if (this.truncationCleanup) {
70
95
  this.truncationCleanup();
71
96
  this.truncationCleanup = null;
@@ -91,7 +116,7 @@ export class PdsText {
91
116
  ? `pds-text--decoration-${this.decoration}`
92
117
  : ''}
93
118
  `;
94
- return (h(Tag, { key: 'b79a6e67f11024cb025cb26bbf77231547bd63a4', ref: (el) => (this.contentEl = el), style: this.color && setColor(this.color), class: typeClasses, part: "content" }, h("slot", { key: 'ae1f8ca39899894541eac3c07fb21ead4ab98f40' })));
119
+ return (h(Tag, { key: '30566c7810d3fd7f76ae281ae6d9a7e66803f0a3', ref: (el) => (this.contentEl = el), style: this.color && setColor(this.color), class: typeClasses, part: "content" }, h("slot", { key: 'f5113458aa9295803fc1c0bc552f9f92602cacba' })));
95
120
  }
96
121
  static get is() { return "pds-text"; }
97
122
  static get encapsulation() { return "shadow"; }
@@ -279,7 +304,7 @@ export class PdsText {
279
304
  "optional": true,
280
305
  "docs": {
281
306
  "tags": [],
282
- "text": "If set or `true`, the text will be truncated. Must add a `width` to the element.\nWhen text overflows, a tooltip showing the full text will appear on hover/focus.\nNote: While the text is overflowing, the element receives tabindex=\"0\" so the\ntooltip can be reached by keyboard. Text that fits is left out of the tab order."
307
+ "text": "If set or `true`, the text will be truncated. Must add a `width` to the element.\nWhen text overflows, a tooltip showing the full text will appear on hover/focus.\nNote: While the text is overflowing, the element receives tabindex=\"0\" so the\ntooltip can be reached by keyboard. Text that fits is left out of the tab order.\nInside a link or button (including `pds-button`, `pds-link`, `pds-tab`, and\n`pds-dropdown-menu-item`) that holds no other truncated text or `pds-chip` with a\n`max-width`, no tab stop is added; the tooltip appears when that control receives\nkeyboard focus."
283
308
  },
284
309
  "getter": false,
285
310
  "setter": false,
@@ -123,3 +123,19 @@ Truncate.args = {
123
123
  truncate: true,
124
124
  width: '250px',
125
125
  };
126
+
127
+ const TruncateInLinkTemplate = (args) => html`
128
+ <div style="width: ${args.width || '250px'};">
129
+ <a href="#">
130
+ <pds-text tag="${args.tag}" ?truncate="${args.truncate}">${args.slot}</pds-text>
131
+ </a>
132
+ </div>
133
+ <pds-text tag="p" size="xs" color="secondary" gutter="sm">Tab to the link to see the full content in a tooltip. The truncated text adds no tab stop of its own.</pds-text>`;
134
+
135
+ export const TruncateInLink = TruncateInLinkTemplate.bind();
136
+ TruncateInLink.args = {
137
+ slot: 'Id irure id magna ipsum voluptate irure esse eu nulla. Ullamco officia adipisicing qui nulla non sint.',
138
+ tag: 'p',
139
+ truncate: true,
140
+ width: '250px',
141
+ };
@@ -8,6 +8,17 @@
8
8
  --tooltip-dimension-max-width: 320px;
9
9
  }
10
10
 
11
+ :is(dialog, [popover]) > .pds-tooltip {
12
+ font-style: normal;
13
+ font-weight: normal;
14
+ letter-spacing: normal;
15
+ text-align: start;
16
+ text-indent: 0;
17
+ text-transform: none;
18
+ white-space: normal;
19
+ word-spacing: normal;
20
+ }
21
+
11
22
  .pds-tooltip__content {
12
23
  background-color: var(--pine-color-primary);
13
24
  border-radius: calc(var(--pine-dimension-xs) * 1.25);
@@ -1,5 +1,6 @@
1
1
  import { Host, h } from "@stencil/core";
2
2
  import { classNamesOf, isStencilClass } from "../../utils/keep-hydrated";
3
+ import { findPortalTarget, isTopLayerInDocument, onTopLayerClose } from "../../utils/portal-target";
3
4
  import { autoUpdate, computePosition, flip, offset, shift, } from "@floating-ui/dom";
4
5
  /**
5
6
  * @slot (default) - The tooltip's target element
@@ -23,6 +24,7 @@ export class PdsTooltip {
23
24
  this.currentPathname = '';
24
25
  this.pathnameCheckInterval = null;
25
26
  this.stopAutoUpdate = null;
27
+ this.stopWatchingPortalHost = null;
26
28
  /**
27
29
  * Determines whether or not the tooltip has an arrow
28
30
  * @defaultValue true
@@ -272,7 +274,12 @@ export class PdsTooltip {
272
274
  this.lastCopiedHtml = this.strippedHtml(initialCopy);
273
275
  this.contentDiv.append(...Array.from(initialCopy.childNodes));
274
276
  this.portalEl.appendChild(this.contentDiv);
275
- document.body.appendChild(this.portalEl);
277
+ // Nothing in the body paints above a modal dialog or open popover, so the portal goes inside one.
278
+ const portalHost = findPortalTarget(this.el, isTopLayerInDocument);
279
+ portalHost.appendChild(this.portalEl);
280
+ // Closing that host moves no pointer, so a tooltip opened by touch would outlive it unseen.
281
+ if (portalHost !== document.body)
282
+ this.stopWatchingPortalHost = onTopLayerClose(portalHost, this.handleHide);
276
283
  this.repositionPortal().catch(error => {
277
284
  console.warn('Failed to position tooltip on creation:', error);
278
285
  });
@@ -385,6 +392,10 @@ export class PdsTooltip {
385
392
  this.stopAutoUpdate();
386
393
  this.stopAutoUpdate = null;
387
394
  }
395
+ if (this.stopWatchingPortalHost !== null) {
396
+ this.stopWatchingPortalHost();
397
+ this.stopWatchingPortalHost = null;
398
+ }
388
399
  // Stop pathname change detection
389
400
  if (this.pathnameCheckInterval !== null) {
390
401
  clearInterval(this.pathnameCheckInterval);
@@ -415,9 +426,9 @@ export class PdsTooltip {
415
426
  }
416
427
  render() {
417
428
  const hostId = this.componentId || undefined;
418
- return (h(Host, { key: '067eda3089732c6a23032bb087182e6dcd0330fa', id: hostId, class: { 'pds-tooltip--is-open': this.opened } }, h("span", { key: '54f6f233c937f048f119df969630af530b10de25', class: "pds-tooltip__trigger", onMouseEnter: this.handleShow, onMouseLeave: this.handleHide,
429
+ return (h(Host, { key: '475ff12d4be035e3effa894353e7948b42a23489', id: hostId, class: { 'pds-tooltip--is-open': this.opened } }, h("span", { key: '3375dfb5bb86ba373bc5d617f4a53171505631d1', class: "pds-tooltip__trigger", onMouseEnter: this.handleShow, onMouseLeave: this.handleHide,
419
430
  /* focusin/out bubble; ensure keyboard users see tooltips */
420
- onFocusin: this.handleShow, onFocusout: this.handleHide, ref: el => this.triggerEl = el }, h("slot", { key: 'f8019985ad9fd27deb388e35c43bf2e227ff9c02' })), h("div", { key: '072c4e578aebb99cd213901369a57d7c74734ad9', class: "pds-tooltip__content-slot-wrapper", hidden: true }, h("slot", { key: '22bc45dfb56567f53a608ce2033b062363793450', name: "content" }))));
431
+ onFocusin: this.handleShow, onFocusout: this.handleHide, ref: el => this.triggerEl = el }, h("slot", { key: 'a3392ad415f5ac7f3883100bf914484ffcc8e536' })), h("div", { key: '774ac2c4808e96649b1536569aaf8cf8a6e3abc2', class: "pds-tooltip__content-slot-wrapper", hidden: true }, h("slot", { key: '672c64b4acdb365623885ac2105a9b90b1dcfa6b', name: "content" }))));
421
432
  }
422
433
  static get is() { return "pds-tooltip"; }
423
434
  static get originalStyleUrls() {
@@ -20,6 +20,29 @@ const HTMLContentTemplate = (args) => html`
20
20
  <pds-button variant="secondary">Hover</pds-button>
21
21
  </pds-tooltip>`;
22
22
 
23
+ const InModalTemplate = (args) => html`
24
+ <pds-button onclick="document.querySelector('#tooltip-modal').open = true">Open modal</pds-button>
25
+ <pds-modal id="tooltip-modal" component-id="tooltip-modal" size="sm">
26
+ <pds-modal-header>
27
+ <pds-box padding="md">
28
+ <pds-text tag="h2" size="h3">Publish changes</pds-text>
29
+ </pds-box>
30
+ </pds-modal-header>
31
+ <pds-modal-content>
32
+ <pds-box padding-inline-start="md" padding-inline-end="md">
33
+ <pds-text tag="p">Hover or focus Publish: its tooltip shows above the open modal.</pds-text>
34
+ </pds-box>
35
+ </pds-modal-content>
36
+ <pds-modal-footer>
37
+ <pds-box fit gap="sm" justify-content="end" padding="md">
38
+ <pds-button variant="secondary" onclick="document.querySelector('#tooltip-modal').open = false">Cancel</pds-button>
39
+ <pds-tooltip content=${args.content} ?has-arrow=${args.hasArrow} placement=${args.placement}>
40
+ <pds-button variant="primary">Publish</pds-button>
41
+ </pds-tooltip>
42
+ </pds-box>
43
+ </pds-modal-footer>
44
+ </pds-modal>`;
45
+
23
46
  const PositionTemplate = (args) => html`
24
47
  <div class="demo-container" style="min-height: 50vh; width: 100%; display: flex; align-items: center; justify-content: center;">
25
48
  <div class="position-demo-grid">
@@ -99,3 +122,10 @@ NoArrow.args = {
99
122
  placement: "bottom-start",
100
123
  slot: "target text"
101
124
  };
125
+
126
+ export const InModal = InModalTemplate.bind({});
127
+ InModal.args = {
128
+ content: "Fix the errors on the page to publish",
129
+ hasArrow: true,
130
+ placement: "top",
131
+ };
@@ -0,0 +1,64 @@
1
+ /**
2
+ * The native `<dialog>` or open `popover` (as pds-filter's) an element sits in, so a popup portaled
3
+ * there shares its top layer and a click in it isn't outside it; otherwise `document.body`.
4
+ * `closest()` stops at shadow boundaries and misses one that only wraps slotted content, so this
5
+ * walks assigned slots and shadow hosts, as pds-combobox does. `isHost` picks which ancestor counts.
6
+ */
7
+ export function findPortalTarget(from, isHost = isOpenDialogOrPopover) {
8
+ const seen = new Set();
9
+ let current = from;
10
+ while (current && !seen.has(current)) {
11
+ seen.add(current);
12
+ if (current.nodeType === Node.ELEMENT_NODE && isHost(current)) {
13
+ return current;
14
+ }
15
+ const assigned = current.nodeType === Node.ELEMENT_NODE ? current.assignedSlot : null;
16
+ if (assigned) {
17
+ current = assigned;
18
+ continue;
19
+ }
20
+ const parent = current.parentNode;
21
+ current = parent instanceof ShadowRoot ? parent.host : parent;
22
+ }
23
+ return document.body;
24
+ }
25
+ /**
26
+ * A modal dialog or open popover, which paints in the top layer above anything in the body, that
27
+ * sits in the document itself: the document's stylesheets don't reach into a shadow root.
28
+ */
29
+ export function isTopLayerInDocument(el) {
30
+ if (el.getRootNode() !== el.ownerDocument)
31
+ return false;
32
+ return matchesSafely(el, ':modal') || matchesSafely(el, ':popover-open');
33
+ }
34
+ /**
35
+ * Calls `onClose` once `host` leaves the top layer (its dialog closes or its popover hides), and
36
+ * returns a function that stops listening.
37
+ */
38
+ export function onTopLayerClose(host, onClose) {
39
+ const check = () => {
40
+ if (!isTopLayerInDocument(host))
41
+ onClose();
42
+ };
43
+ host.addEventListener('close', check);
44
+ host.addEventListener('toggle', check);
45
+ return () => {
46
+ host.removeEventListener('close', check);
47
+ host.removeEventListener('toggle', check);
48
+ };
49
+ }
50
+ function isOpenDialogOrPopover(el) {
51
+ // Only an open dialog: inside a closed one, the popup would be hidden with it.
52
+ if (el.localName === 'dialog')
53
+ return el.open;
54
+ return el.hasAttribute('popover') && matchesSafely(el, ':popover-open');
55
+ }
56
+ function matchesSafely(el, selector) {
57
+ try {
58
+ return el.matches(selector);
59
+ }
60
+ catch (_a) {
61
+ // A browser without the selector (no Popover API, or no :modal): no top layer to share.
62
+ return false;
63
+ }
64
+ }
@@ -24,7 +24,8 @@ function collectTabbable(root, found) {
24
24
  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)); };
25
25
  function visitTabbable(el, found) {
26
26
  var _a, _b, _c, _d;
27
- if (el.hasAttribute('inert'))
27
+ // A tooltip portaled into a dialog only describes the control that has focus; it's never a stop of its own.
28
+ if (el.hasAttribute('inert') || el.getAttribute('role') === 'tooltip')
28
29
  return;
29
30
  if (el.localName === 'slot') {
30
31
  const slot = el;