@pine-ds/core 4.9.0 → 4.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/components/mock-pds-modal.js +1 -1
  2. package/components/pds-checkbox2.js +1 -1
  3. package/components/pds-chip2.js +1 -1
  4. package/components/pds-combobox.js +2 -2
  5. package/components/pds-datepicker.js +1 -1
  6. package/components/pds-dropdown-menu.js +1 -1
  7. package/components/pds-icon2.js +1 -1
  8. package/components/pds-link2.js +1 -1
  9. package/components/pds-modal2.js +1 -1
  10. package/components/pds-multiselect.js +1 -1
  11. package/components/pds-radio-group.js +1 -1
  12. package/components/pds-text2.js +1 -1
  13. package/components/pds-tooltip.js +1 -1
  14. package/components/portal-target.js +1 -0
  15. package/components/tabbable.js +1 -1
  16. package/components/truncation-tooltip.js +1 -1
  17. package/dist/cjs/{index-Do70atou.js → index-BDnbr0DK.js} +1 -1
  18. package/dist/cjs/{index-BsWY_xEJ.js → index-D9iJuJCP.js} +12 -0
  19. package/dist/cjs/loader.cjs.js +2 -2
  20. package/dist/cjs/mock-pds-modal.cjs.entry.js +2 -2
  21. package/dist/cjs/pds-accordion.cjs.entry.js +2 -2
  22. package/dist/cjs/pds-alert.cjs.entry.js +1 -1
  23. package/dist/cjs/pds-avatar.cjs.entry.js +2 -2
  24. package/dist/cjs/pds-box.cjs.entry.js +1 -1
  25. package/dist/cjs/pds-button.cjs.entry.js +2 -2
  26. package/dist/cjs/pds-checkbox.cjs.entry.js +3 -3
  27. package/dist/cjs/pds-chip.cjs.entry.js +9 -9
  28. package/dist/cjs/pds-combobox.cjs.entry.js +102 -16
  29. package/dist/cjs/pds-container.cjs.entry.js +1 -1
  30. package/dist/cjs/pds-copytext.cjs.entry.js +4 -3
  31. package/dist/cjs/pds-datepicker.cjs.entry.js +4 -41
  32. package/dist/cjs/pds-divider.cjs.entry.js +1 -1
  33. package/dist/cjs/pds-drawer-content.cjs.entry.js +1 -1
  34. package/dist/cjs/pds-drawer-footer.cjs.entry.js +1 -1
  35. package/dist/cjs/pds-drawer-header.cjs.entry.js +1 -1
  36. package/dist/cjs/pds-drawer.cjs.entry.js +1 -1
  37. package/dist/cjs/pds-dropdown-menu-item.cjs.entry.js +1 -1
  38. package/dist/cjs/pds-dropdown-menu-separator.cjs.entry.js +1 -1
  39. package/dist/cjs/pds-dropdown-menu.cjs.entry.js +59 -47
  40. package/dist/cjs/pds-filter.cjs.entry.js +2 -2
  41. package/dist/cjs/pds-filters.cjs.entry.js +1 -1
  42. package/dist/cjs/pds-icon.cjs.entry.js +54 -21
  43. package/dist/cjs/pds-image.cjs.entry.js +1 -1
  44. package/dist/cjs/pds-input.cjs.entry.js +2 -2
  45. package/dist/cjs/pds-link.cjs.entry.js +3 -3
  46. package/dist/cjs/pds-loader.cjs.entry.js +1 -1
  47. package/dist/cjs/pds-modal-content.cjs.entry.js +1 -1
  48. package/dist/cjs/pds-modal-footer.cjs.entry.js +1 -1
  49. package/dist/cjs/pds-modal-header.cjs.entry.js +1 -1
  50. package/dist/cjs/pds-modal.cjs.entry.js +3 -3
  51. package/dist/cjs/pds-multiselect.cjs.entry.js +11 -5
  52. package/dist/cjs/pds-popover.cjs.entry.js +2 -2
  53. package/dist/cjs/pds-progress.cjs.entry.js +1 -1
  54. package/dist/cjs/pds-property.cjs.entry.js +1 -1
  55. package/dist/cjs/pds-radio-group.cjs.entry.js +66 -5
  56. package/dist/cjs/pds-radio.cjs.entry.js +2 -2
  57. package/dist/cjs/pds-row.cjs.entry.js +1 -1
  58. package/dist/cjs/pds-select.cjs.entry.js +2 -2
  59. package/dist/cjs/pds-sortable-item.cjs.entry.js +2 -2
  60. package/dist/cjs/pds-sortable.cjs.entry.js +1 -1
  61. package/dist/cjs/pds-switch.cjs.entry.js +2 -2
  62. package/dist/cjs/pds-tab.cjs.entry.js +1 -1
  63. package/dist/cjs/pds-table-body.cjs.entry.js +1 -1
  64. package/dist/cjs/pds-table-cell.cjs.entry.js +3 -2
  65. package/dist/cjs/pds-table-head-cell.cjs.entry.js +2 -2
  66. package/dist/cjs/pds-table-head.cjs.entry.js +1 -1
  67. package/dist/cjs/pds-table-row.cjs.entry.js +1 -1
  68. package/dist/cjs/pds-table.cjs.entry.js +1 -1
  69. package/dist/cjs/pds-tabpanel.cjs.entry.js +1 -1
  70. package/dist/cjs/pds-tabs.cjs.entry.js +1 -1
  71. package/dist/cjs/pds-text.cjs.entry.js +29 -3
  72. package/dist/cjs/pds-textarea.cjs.entry.js +2 -2
  73. package/dist/cjs/pds-toast.cjs.entry.js +1 -1
  74. package/dist/cjs/pds-tooltip.cjs.entry.js +16 -5
  75. package/dist/cjs/pine-core.cjs.js +2 -2
  76. package/dist/cjs/portal-target-e8WQ6dLx.js +70 -0
  77. package/dist/cjs/{tabbable-CddSt_Hi.js → tabbable-BrrrGvdG.js} +2 -1
  78. package/dist/cjs/{truncation-tooltip-O5nQmXPw.js → truncation-tooltip-Bikp7n9I.js} +43 -3
  79. package/dist/collection/components/pds-checkbox/pds-checkbox.css +20 -14
  80. package/dist/collection/components/pds-chip/pds-chip.js +5 -6
  81. package/dist/collection/components/pds-combobox/grouped-options-panel.js +39 -1
  82. package/dist/collection/components/pds-combobox/pds-combobox.css +37 -1
  83. package/dist/collection/components/pds-combobox/pds-combobox.js +62 -14
  84. package/dist/collection/components/pds-combobox/stories/pds-combobox.stories.js +48 -0
  85. package/dist/collection/components/pds-datepicker/calendar-portal.js +1 -38
  86. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu.js +64 -46
  87. package/dist/collection/components/pds-link/pds-link.css +1 -1
  88. package/dist/collection/components/pds-link/stories/pds-link.stories.js +48 -0
  89. package/dist/collection/components/pds-modal/pds-modal.css +1 -1
  90. package/dist/collection/components/pds-multiselect/pds-multiselect.js +9 -3
  91. package/dist/collection/components/pds-radio-group/pds-radio-group.js +65 -4
  92. package/dist/collection/components/pds-text/pds-text.js +28 -3
  93. package/dist/collection/components/pds-text/stories/pds-text.stories.js +16 -0
  94. package/dist/collection/components/pds-tooltip/pds-tooltip.css +11 -0
  95. package/dist/collection/components/pds-tooltip/pds-tooltip.js +14 -3
  96. package/dist/collection/components/pds-tooltip/stories/pds-tooltip.stories.js +30 -0
  97. package/dist/collection/utils/portal-target.js +64 -0
  98. package/dist/collection/utils/tabbable.js +2 -1
  99. package/dist/collection/utils/truncation-tooltip.js +42 -3
  100. package/dist/docs.json +9 -3
  101. package/dist/esm/{index-BFSwd-GQ.js → index-4_RRPJTO.js} +12 -1
  102. package/dist/esm/{index-m3pqpeWg.js → index-DvN3tyZp.js} +1 -1
  103. package/dist/esm/loader.js +3 -3
  104. package/dist/esm/mock-pds-modal.entry.js +2 -2
  105. package/dist/esm/pds-accordion.entry.js +2 -2
  106. package/dist/esm/pds-alert.entry.js +1 -1
  107. package/dist/esm/pds-avatar.entry.js +2 -2
  108. package/dist/esm/pds-box.entry.js +1 -1
  109. package/dist/esm/pds-button.entry.js +2 -2
  110. package/dist/esm/pds-checkbox.entry.js +3 -3
  111. package/dist/esm/pds-chip.entry.js +8 -8
  112. package/dist/esm/pds-combobox.entry.js +102 -16
  113. package/dist/esm/pds-container.entry.js +1 -1
  114. package/dist/esm/pds-copytext.entry.js +4 -3
  115. package/dist/esm/pds-datepicker.entry.js +3 -40
  116. package/dist/esm/pds-divider.entry.js +1 -1
  117. package/dist/esm/pds-drawer-content.entry.js +1 -1
  118. package/dist/esm/pds-drawer-footer.entry.js +1 -1
  119. package/dist/esm/pds-drawer-header.entry.js +1 -1
  120. package/dist/esm/pds-drawer.entry.js +1 -1
  121. package/dist/esm/pds-dropdown-menu-item.entry.js +1 -1
  122. package/dist/esm/pds-dropdown-menu-separator.entry.js +1 -1
  123. package/dist/esm/pds-dropdown-menu.entry.js +59 -47
  124. package/dist/esm/pds-filter.entry.js +2 -2
  125. package/dist/esm/pds-filters.entry.js +1 -1
  126. package/dist/esm/pds-icon.entry.js +54 -21
  127. package/dist/esm/pds-image.entry.js +1 -1
  128. package/dist/esm/pds-input.entry.js +2 -2
  129. package/dist/esm/pds-link.entry.js +3 -3
  130. package/dist/esm/pds-loader.entry.js +1 -1
  131. package/dist/esm/pds-modal-content.entry.js +1 -1
  132. package/dist/esm/pds-modal-footer.entry.js +1 -1
  133. package/dist/esm/pds-modal-header.entry.js +1 -1
  134. package/dist/esm/pds-modal.entry.js +3 -3
  135. package/dist/esm/pds-multiselect.entry.js +11 -5
  136. package/dist/esm/pds-popover.entry.js +2 -2
  137. package/dist/esm/pds-progress.entry.js +1 -1
  138. package/dist/esm/pds-property.entry.js +1 -1
  139. package/dist/esm/pds-radio-group.entry.js +66 -5
  140. package/dist/esm/pds-radio.entry.js +2 -2
  141. package/dist/esm/pds-row.entry.js +1 -1
  142. package/dist/esm/pds-select.entry.js +2 -2
  143. package/dist/esm/pds-sortable-item.entry.js +2 -2
  144. package/dist/esm/pds-sortable.entry.js +1 -1
  145. package/dist/esm/pds-switch.entry.js +2 -2
  146. package/dist/esm/pds-tab.entry.js +1 -1
  147. package/dist/esm/pds-table-body.entry.js +1 -1
  148. package/dist/esm/pds-table-cell.entry.js +3 -2
  149. package/dist/esm/pds-table-head-cell.entry.js +2 -2
  150. package/dist/esm/pds-table-head.entry.js +1 -1
  151. package/dist/esm/pds-table-row.entry.js +1 -1
  152. package/dist/esm/pds-table.entry.js +1 -1
  153. package/dist/esm/pds-tabpanel.entry.js +1 -1
  154. package/dist/esm/pds-tabs.entry.js +1 -1
  155. package/dist/esm/pds-text.entry.js +29 -3
  156. package/dist/esm/pds-textarea.entry.js +2 -2
  157. package/dist/esm/pds-toast.entry.js +1 -1
  158. package/dist/esm/pds-tooltip.entry.js +16 -5
  159. package/dist/esm/pine-core.js +3 -3
  160. package/dist/esm/portal-target-CKRzRKdO.js +66 -0
  161. package/dist/esm/{tabbable-DCKBKRUy.js → tabbable-C6ZWpp3v.js} +2 -1
  162. package/dist/esm/{truncation-tooltip-D_gvhB9r.js → truncation-tooltip-DBcPipr9.js} +43 -4
  163. package/dist/esm-es5/{index-BFSwd-GQ.js → index-4_RRPJTO.js} +1 -1
  164. package/dist/esm-es5/loader.js +1 -1
  165. package/dist/esm-es5/mock-pds-modal.entry.js +1 -1
  166. package/dist/esm-es5/pds-accordion.entry.js +1 -1
  167. package/dist/esm-es5/pds-alert.entry.js +1 -1
  168. package/dist/esm-es5/pds-avatar.entry.js +1 -1
  169. package/dist/esm-es5/pds-box.entry.js +1 -1
  170. package/dist/esm-es5/pds-button.entry.js +1 -1
  171. package/dist/esm-es5/pds-checkbox.entry.js +1 -1
  172. package/dist/esm-es5/pds-chip.entry.js +1 -1
  173. package/dist/esm-es5/pds-combobox.entry.js +2 -2
  174. package/dist/esm-es5/pds-container.entry.js +1 -1
  175. package/dist/esm-es5/pds-copytext.entry.js +1 -1
  176. package/dist/esm-es5/pds-datepicker.entry.js +1 -1
  177. package/dist/esm-es5/pds-divider.entry.js +1 -1
  178. package/dist/esm-es5/pds-drawer-content.entry.js +1 -1
  179. package/dist/esm-es5/pds-drawer-footer.entry.js +1 -1
  180. package/dist/esm-es5/pds-drawer-header.entry.js +1 -1
  181. package/dist/esm-es5/pds-drawer.entry.js +1 -1
  182. package/dist/esm-es5/pds-dropdown-menu-item.entry.js +1 -1
  183. package/dist/esm-es5/pds-dropdown-menu-separator.entry.js +1 -1
  184. package/dist/esm-es5/pds-dropdown-menu.entry.js +1 -1
  185. package/dist/esm-es5/pds-filter.entry.js +1 -1
  186. package/dist/esm-es5/pds-filters.entry.js +1 -1
  187. package/dist/esm-es5/pds-icon.entry.js +1 -1
  188. package/dist/esm-es5/pds-image.entry.js +1 -1
  189. package/dist/esm-es5/pds-input.entry.js +1 -1
  190. package/dist/esm-es5/pds-link.entry.js +1 -1
  191. package/dist/esm-es5/pds-loader.entry.js +1 -1
  192. package/dist/esm-es5/pds-modal-content.entry.js +1 -1
  193. package/dist/esm-es5/pds-modal-footer.entry.js +1 -1
  194. package/dist/esm-es5/pds-modal-header.entry.js +1 -1
  195. package/dist/esm-es5/pds-modal.entry.js +1 -1
  196. package/dist/esm-es5/pds-multiselect.entry.js +1 -1
  197. package/dist/esm-es5/pds-popover.entry.js +1 -1
  198. package/dist/esm-es5/pds-progress.entry.js +1 -1
  199. package/dist/esm-es5/pds-property.entry.js +1 -1
  200. package/dist/esm-es5/pds-radio-group.entry.js +1 -1
  201. package/dist/esm-es5/pds-radio.entry.js +1 -1
  202. package/dist/esm-es5/pds-row.entry.js +1 -1
  203. package/dist/esm-es5/pds-select.entry.js +1 -1
  204. package/dist/esm-es5/pds-sortable-item.entry.js +1 -1
  205. package/dist/esm-es5/pds-sortable.entry.js +1 -1
  206. package/dist/esm-es5/pds-switch.entry.js +1 -1
  207. package/dist/esm-es5/pds-tab.entry.js +1 -1
  208. package/dist/esm-es5/pds-table-body.entry.js +1 -1
  209. package/dist/esm-es5/pds-table-cell.entry.js +1 -1
  210. package/dist/esm-es5/pds-table-head-cell.entry.js +1 -1
  211. package/dist/esm-es5/pds-table-head.entry.js +1 -1
  212. package/dist/esm-es5/pds-table-row.entry.js +1 -1
  213. package/dist/esm-es5/pds-table.entry.js +1 -1
  214. package/dist/esm-es5/pds-tabpanel.entry.js +1 -1
  215. package/dist/esm-es5/pds-tabs.entry.js +1 -1
  216. package/dist/esm-es5/pds-text.entry.js +1 -1
  217. package/dist/esm-es5/pds-textarea.entry.js +1 -1
  218. package/dist/esm-es5/pds-toast.entry.js +1 -1
  219. package/dist/esm-es5/pds-tooltip.entry.js +1 -1
  220. package/dist/esm-es5/pine-core.js +1 -1
  221. package/dist/esm-es5/portal-target-CKRzRKdO.js +1 -0
  222. package/dist/esm-es5/tabbable-C6ZWpp3v.js +1 -0
  223. package/dist/esm-es5/truncation-tooltip-DBcPipr9.js +1 -0
  224. package/dist/pine-core/{p-7a19477e.system.entry.js → p-01f1cdaf.system.entry.js} +1 -1
  225. package/dist/pine-core/{p-ee449a4b.entry.js → p-07323107.entry.js} +1 -1
  226. package/dist/pine-core/{p-14d872d3.entry.js → p-08b8e941.entry.js} +1 -1
  227. package/dist/pine-core/p-0b7b3fc2.system.entry.js +3 -0
  228. package/dist/pine-core/p-0d5f0ab5.system.entry.js +1 -0
  229. package/dist/pine-core/p-124a0a24.entry.js +1 -0
  230. package/dist/pine-core/p-128c04e7.entry.js +1 -0
  231. package/dist/pine-core/{p-3cc19ea8.system.entry.js → p-1415c988.system.entry.js} +1 -1
  232. package/dist/pine-core/{p-de176bd9.entry.js → p-143b33a6.entry.js} +1 -1
  233. package/dist/pine-core/{p-e9a53a88.system.entry.js → p-14dedf01.system.entry.js} +1 -1
  234. package/dist/pine-core/{p-60d27247.system.entry.js → p-19cf1d91.system.entry.js} +1 -1
  235. package/dist/pine-core/{p-bcf57566.entry.js → p-1ca8d183.entry.js} +1 -1
  236. package/dist/pine-core/{p-11e7d660.entry.js → p-1e3ef425.entry.js} +1 -1
  237. package/dist/pine-core/{p-98cc327b.entry.js → p-1f62bb71.entry.js} +2 -2
  238. package/dist/pine-core/{p-6f34ad9c.entry.js → p-2a18852f.entry.js} +1 -1
  239. package/dist/pine-core/{p-3ce7e72e.system.entry.js → p-2b9622c1.system.entry.js} +1 -1
  240. package/dist/pine-core/{p-9fbcba0d.entry.js → p-2dd30d12.entry.js} +1 -1
  241. package/dist/pine-core/{p-8b97dd57.system.entry.js → p-3306dc5a.system.entry.js} +1 -1
  242. package/dist/pine-core/{p-ce554098.entry.js → p-3610cb3b.entry.js} +1 -1
  243. package/dist/pine-core/{p-079c39d1.entry.js → p-39276663.entry.js} +1 -1
  244. package/dist/pine-core/{p-89fefe36.entry.js → p-39e57657.entry.js} +1 -1
  245. package/dist/pine-core/p-3a1dc752.system.entry.js +1 -0
  246. package/dist/pine-core/{p-ef4d8fea.entry.js → p-3c229091.entry.js} +1 -1
  247. package/dist/pine-core/{p-d8bedb58.system.entry.js → p-3f8bd3fb.system.entry.js} +1 -1
  248. package/dist/pine-core/{p-6845867f.system.entry.js → p-42d43c3f.system.entry.js} +1 -1
  249. package/dist/pine-core/{p-4ee44585.system.entry.js → p-42f70f93.system.entry.js} +1 -1
  250. package/dist/pine-core/{p-0bd61097.system.entry.js → p-4a90b9c8.system.entry.js} +1 -1
  251. package/dist/pine-core/{p-64283f7b.entry.js → p-4cfe922b.entry.js} +1 -1
  252. package/dist/pine-core/p-4d47023c.system.entry.js +1 -0
  253. package/dist/pine-core/{p-b037dcbd.system.entry.js → p-4d98bc0c.system.entry.js} +1 -1
  254. package/dist/pine-core/{p-3556f6ad.entry.js → p-50ddadbf.entry.js} +1 -1
  255. package/dist/pine-core/{p-1e5648bf.system.entry.js → p-548bce53.system.entry.js} +1 -1
  256. package/dist/pine-core/{p-92a8cf7d.entry.js → p-590df41a.entry.js} +1 -1
  257. package/dist/pine-core/{p-f549f2bc.entry.js → p-5946203c.entry.js} +1 -1
  258. package/dist/pine-core/{p-d7db749a.system.entry.js → p-5f181694.system.entry.js} +1 -1
  259. package/dist/pine-core/{p-9713d6a5.system.entry.js → p-60a30975.system.entry.js} +1 -1
  260. package/dist/pine-core/{p-d94ebe84.entry.js → p-61cfdbb2.entry.js} +1 -1
  261. package/dist/pine-core/p-62aa6a78.system.entry.js +1 -0
  262. package/dist/pine-core/p-639acef8.system.entry.js +1 -0
  263. package/dist/pine-core/{p-cb560aab.system.entry.js → p-63f85859.system.entry.js} +1 -1
  264. package/dist/pine-core/{p-001d4b86.entry.js → p-64bcb378.entry.js} +1 -1
  265. package/dist/pine-core/{p-bdde1e53.entry.js → p-67999353.entry.js} +1 -1
  266. package/dist/pine-core/{p-be3b4f12.system.entry.js → p-67f795d5.system.entry.js} +1 -1
  267. package/dist/pine-core/{p-6b6ae1be.entry.js → p-6a1aa8d3.entry.js} +1 -1
  268. package/dist/pine-core/p-6f4ab1ea.system.entry.js +1 -0
  269. package/dist/pine-core/{p-110b4051.system.entry.js → p-724baba3.system.entry.js} +1 -1
  270. package/dist/pine-core/p-72659a0e.system.entry.js +1 -0
  271. package/dist/pine-core/p-7a51f15e.entry.js +1 -0
  272. package/dist/pine-core/p-7b978fff.system.entry.js +1 -0
  273. package/dist/pine-core/p-8436cbfb.entry.js +1 -0
  274. package/dist/pine-core/{p-ced6a814.system.entry.js → p-849ec281.system.entry.js} +1 -1
  275. package/dist/pine-core/p-87a32ded.system.entry.js +1 -0
  276. package/dist/pine-core/{p-f09f27ab.system.entry.js → p-89d38a82.system.entry.js} +1 -1
  277. package/dist/pine-core/{p-6602b4d0.entry.js → p-8ade17ce.entry.js} +1 -1
  278. package/dist/pine-core/{p-ebf0c51b.system.entry.js → p-8afd5f5b.system.entry.js} +1 -1
  279. package/dist/pine-core/{p-9fe4a64a.entry.js → p-8e7f75e6.entry.js} +1 -1
  280. package/dist/pine-core/{p-b9d71b76.entry.js → p-8fb520df.entry.js} +1 -1
  281. package/dist/pine-core/{p-3b5b8f73.entry.js → p-92115e88.entry.js} +1 -1
  282. package/dist/pine-core/{p-239774c9.entry.js → p-947582e1.entry.js} +1 -1
  283. package/dist/pine-core/{p-98843402.system.entry.js → p-94c9b7d1.system.entry.js} +1 -1
  284. package/dist/pine-core/p-97356d4b.entry.js +1 -0
  285. package/dist/pine-core/p-973c3ac0.entry.js +1 -0
  286. package/dist/pine-core/p-97653e60.entry.js +1 -0
  287. package/dist/pine-core/{p-7073146f.entry.js → p-97b73359.entry.js} +1 -1
  288. package/dist/pine-core/{p-bfdfbe9f.entry.js → p-99530cb5.entry.js} +1 -1
  289. package/dist/pine-core/{p-50af67ea.system.entry.js → p-9b32727a.system.entry.js} +1 -1
  290. package/dist/pine-core/{p-CjRCtzPD.system.js → p-BK1sLRfg.system.js} +1 -1
  291. package/dist/pine-core/p-BZVUD2on.js +1 -0
  292. package/dist/pine-core/p-C6ZWpp3v.js +1 -0
  293. package/dist/pine-core/p-CKRzRKdO.js +1 -0
  294. package/dist/pine-core/p-Dj-z_ugg.system.js +1 -0
  295. package/dist/pine-core/{p-BplEmwUQ.js → p-M31tvpDN.js} +2 -2
  296. package/dist/pine-core/p-XK45dzWR.system.js +1 -0
  297. package/dist/pine-core/{p-d9243653.system.entry.js → p-a09c9c5e.system.entry.js} +1 -1
  298. package/dist/pine-core/{p-55fce29e.entry.js → p-a4ce12ef.entry.js} +1 -1
  299. package/dist/pine-core/{p-dea2a254.entry.js → p-a594c41f.entry.js} +1 -1
  300. package/dist/pine-core/{p-2d5b1deb.entry.js → p-a9d96e22.entry.js} +1 -1
  301. package/dist/pine-core/{p-e1fdd53a.system.entry.js → p-ad5208a4.system.entry.js} +1 -1
  302. package/dist/pine-core/p-afc2f165.entry.js +1 -0
  303. package/dist/pine-core/{p-25bf2f26.system.entry.js → p-bcc378ba.system.entry.js} +2 -2
  304. package/dist/pine-core/{p-3f62581a.system.entry.js → p-bd7dc317.system.entry.js} +1 -1
  305. package/dist/pine-core/p-bfa34194.entry.js +1 -0
  306. package/dist/pine-core/{p-5c46553f.system.entry.js → p-c2afe4f3.system.entry.js} +1 -1
  307. package/dist/pine-core/{p-17fc76e7.system.entry.js → p-c5e1eb3c.system.entry.js} +1 -1
  308. package/dist/pine-core/p-c6a9e62c.system.entry.js +1 -0
  309. package/dist/pine-core/{p-7a14473e.entry.js → p-c7a53c4f.entry.js} +1 -1
  310. package/dist/pine-core/{p-5967d9fa.system.entry.js → p-c8a0b562.system.entry.js} +1 -1
  311. package/dist/pine-core/{p-735b3631.entry.js → p-c9ae7964.entry.js} +1 -1
  312. package/dist/pine-core/{p-b243767b.system.entry.js → p-cb9baf78.system.entry.js} +1 -1
  313. package/dist/pine-core/{p-6d64e6c7.entry.js → p-ce9fa14b.entry.js} +1 -1
  314. package/dist/pine-core/{p-68fdfb8f.system.entry.js → p-d018dc60.system.entry.js} +1 -1
  315. package/dist/pine-core/p-d47b2a6a.system.entry.js +1 -0
  316. package/dist/pine-core/{p-0790dd0d.system.entry.js → p-d48fe5a0.system.entry.js} +1 -1
  317. package/dist/pine-core/{p-414faecf.entry.js → p-d6f338e0.entry.js} +1 -1
  318. package/dist/pine-core/{p-b7cbd913.system.entry.js → p-d920d759.system.entry.js} +1 -1
  319. package/dist/pine-core/{p-87642228.entry.js → p-d9719e37.entry.js} +1 -1
  320. package/dist/pine-core/p-da8b864a.entry.js +2 -0
  321. package/dist/pine-core/{p-f2c487e6.entry.js → p-db7fb5a3.entry.js} +1 -1
  322. package/dist/pine-core/p-dd7ded84.entry.js +1 -0
  323. package/dist/pine-core/p-de455073.system.entry.js +1 -0
  324. package/dist/pine-core/{p-a7d25143.entry.js → p-e1d1b5d8.entry.js} +1 -1
  325. package/dist/pine-core/p-e3de6a1d.entry.js +1 -0
  326. package/dist/pine-core/{p-2c0047cd.entry.js → p-e7002cee.entry.js} +1 -1
  327. package/dist/pine-core/{p-5133e8be.system.entry.js → p-e82f758f.system.entry.js} +1 -1
  328. package/dist/pine-core/p-e84fa9ed.entry.js +1 -0
  329. package/dist/pine-core/{p-9dbc017f.system.entry.js → p-eb4f0daa.system.entry.js} +1 -1
  330. package/dist/pine-core/p-eb56af4a.system.entry.js +1 -0
  331. package/dist/pine-core/p-eeYeEogd.system.js +1 -0
  332. package/dist/pine-core/{p-b33ad96e.system.entry.js → p-eecd9ad8.system.entry.js} +1 -1
  333. package/dist/pine-core/{p-06279b93.system.entry.js → p-ef0eba9b.system.entry.js} +1 -1
  334. package/dist/pine-core/{p-0c60f577.system.entry.js → p-ef3a855f.system.entry.js} +1 -1
  335. package/dist/pine-core/{p-6dad76cb.system.entry.js → p-f11cce27.system.entry.js} +1 -1
  336. package/dist/pine-core/p-f354dbac.entry.js +1 -0
  337. package/dist/pine-core/{p-bda7e3be.entry.js → p-f6f4fd42.entry.js} +1 -1
  338. package/dist/pine-core/{p-7fcf3d37.entry.js → p-f71d71ca.entry.js} +1 -1
  339. package/dist/pine-core/p-f834cb07.system.entry.js +1 -0
  340. package/dist/pine-core/p-f9063262.system.entry.js +1 -0
  341. package/dist/pine-core/p-f99bd77f.entry.js +1 -0
  342. package/dist/pine-core/p-wB2y8gR7.system.js +1 -0
  343. package/dist/pine-core/pine-core.esm.js +1 -1
  344. package/dist/pine-core/pine-core.js +1 -1
  345. package/dist/types/components/pds-combobox/combobox-interface.d.ts +26 -0
  346. package/dist/types/components/pds-combobox/grouped-options-panel.d.ts +17 -0
  347. package/dist/types/components/pds-combobox/pds-combobox.d.ts +12 -2
  348. package/dist/types/components/pds-datepicker/calendar-portal.d.ts +0 -7
  349. package/dist/types/components/pds-dropdown-menu/pds-dropdown-menu.d.ts +4 -0
  350. package/dist/types/components/pds-radio-group/pds-radio-group.d.ts +8 -0
  351. package/dist/types/components/pds-text/pds-text.d.ts +4 -0
  352. package/dist/types/components/pds-tooltip/pds-tooltip.d.ts +1 -0
  353. package/dist/types/components.d.ts +2 -2
  354. package/dist/types/utils/portal-target.d.ts +17 -0
  355. package/dist/types/utils/truncation-tooltip.d.ts +5 -2
  356. package/dist/vscode.html-data.json +3 -3
  357. package/hydrate/index.js +422 -146
  358. package/hydrate/index.mjs +422 -146
  359. package/package.json +2 -2
  360. package/dist/esm-es5/tabbable-DCKBKRUy.js +0 -1
  361. package/dist/esm-es5/truncation-tooltip-D_gvhB9r.js +0 -1
  362. package/dist/pine-core/p-07b4524e.entry.js +0 -1
  363. package/dist/pine-core/p-08bbd3e6.system.entry.js +0 -1
  364. package/dist/pine-core/p-22ae92f7.system.entry.js +0 -1
  365. package/dist/pine-core/p-272b24ad.system.entry.js +0 -1
  366. package/dist/pine-core/p-38b87aa2.system.entry.js +0 -1
  367. package/dist/pine-core/p-3afb1208.entry.js +0 -1
  368. package/dist/pine-core/p-463a29fa.entry.js +0 -1
  369. package/dist/pine-core/p-568a9a79.system.entry.js +0 -1
  370. package/dist/pine-core/p-5ce5836e.system.entry.js +0 -1
  371. package/dist/pine-core/p-5f3242c8.system.entry.js +0 -1
  372. package/dist/pine-core/p-60e3b1af.entry.js +0 -1
  373. package/dist/pine-core/p-7d3a20ba.entry.js +0 -1
  374. package/dist/pine-core/p-9201b497.system.entry.js +0 -1
  375. package/dist/pine-core/p-94597b73.entry.js +0 -1
  376. package/dist/pine-core/p-97be00f4.system.entry.js +0 -1
  377. package/dist/pine-core/p-9a8971e2.system.entry.js +0 -1
  378. package/dist/pine-core/p-9a8d2985.system.entry.js +0 -3
  379. package/dist/pine-core/p-CirzxZ33.js +0 -1
  380. package/dist/pine-core/p-D52aRqFx.system.js +0 -1
  381. package/dist/pine-core/p-DCKBKRUy.js +0 -1
  382. package/dist/pine-core/p-DXO1yd32.system.js +0 -1
  383. package/dist/pine-core/p-a2078add.entry.js +0 -1
  384. package/dist/pine-core/p-a48b025a.system.entry.js +0 -1
  385. package/dist/pine-core/p-ad3b1ec3.entry.js +0 -1
  386. package/dist/pine-core/p-b017eb99.system.entry.js +0 -1
  387. package/dist/pine-core/p-b6edfdfe.entry.js +0 -2
  388. package/dist/pine-core/p-c02a32ec.entry.js +0 -1
  389. package/dist/pine-core/p-c1da80e5.entry.js +0 -1
  390. package/dist/pine-core/p-c233866c.system.entry.js +0 -1
  391. package/dist/pine-core/p-d7930540.entry.js +0 -1
  392. package/dist/pine-core/p-dfadfcd1.entry.js +0 -1
  393. package/dist/pine-core/p-e70cb112.system.entry.js +0 -1
  394. package/dist/pine-core/p-eb93cc6e.entry.js +0 -1
  395. package/dist/pine-core/p-ebf74c43.system.entry.js +0 -1
  396. package/dist/pine-core/p-fc743f6e.entry.js +0 -1
  397. package/dist/pine-core/p-wXfuz0Bd.system.js +0 -1
  398. /package/dist/esm-es5/{index-m3pqpeWg.js → index-DvN3tyZp.js} +0 -0
  399. /package/dist/pine-core/{p-m3pqpeWg.js → p-DvN3tyZp.js} +0 -0
  400. /package/dist/pine-core/{p-DaCT2ssj.system.js → p-vFsJv75D.system.js} +0 -0
@@ -4,7 +4,7 @@ import { autoUpdate, computePosition, flip, offset, shift } from "@floating-ui/d
4
4
  import { cancelDebouncedEvent, debounceEvent, flushDebouncedEvent } from "../../utils/utils";
5
5
  import { closest } from "../../utils/closest";
6
6
  import DOMPurify from "dompurify";
7
- import { FlyoutController, buildPanelEntries, findGroup, groupIconOf, groupLabelOf, isGroupDisabled, isOptionDisabled, optionIconOf, panelColumn, parentOptgroupOf, } from "./grouped-options-panel";
7
+ import { FlyoutController, buildPanelEntries, findGroup, groupBadgeOf, groupIconOf, groupLabelOf, isGroupDisabled, isOptionDisabled, optionBadgeOf, optionIconOf, panelColumn, parentOptgroupOf, } from "./grouped-options-panel";
8
8
  /**
9
9
  * @slot option - Option elements for the combobox dropdown
10
10
  * @slot trigger-content - Custom content for the button trigger when customTriggerContent is true
@@ -1133,6 +1133,7 @@ export class PdsCombobox {
1133
1133
  // Only strings group an option or name an icon; anything else from JS is ignored, not coerced.
1134
1134
  if (typeof opt.icon === 'string' && opt.icon !== '')
1135
1135
  optionEl.setAttribute('data-icon', opt.icon);
1136
+ this.setBadgeAttributes(optionEl, opt.badge);
1136
1137
  if (typeof opt.group !== 'string' || opt.group === '') {
1137
1138
  ungrouped.push(optionEl);
1138
1139
  this.panelPositions.set(optionEl, position);
@@ -1149,6 +1150,8 @@ export class PdsCombobox {
1149
1150
  if (!optgroup.hasAttribute('data-icon') && typeof opt.groupIcon === 'string' && opt.groupIcon !== '') {
1150
1151
  optgroup.setAttribute('data-icon', opt.groupIcon);
1151
1152
  }
1153
+ if (!optgroup.hasAttribute('data-badge'))
1154
+ this.setBadgeAttributes(optgroup, opt.groupBadge);
1152
1155
  optgroup.appendChild(optionEl);
1153
1156
  });
1154
1157
  [...ungrouped, ...groupEntries].forEach(entry => {
@@ -1638,7 +1641,10 @@ export class PdsCombobox {
1638
1641
  };
1639
1642
  const reveal = () => {
1640
1643
  e.preventDefault();
1641
- this.revealedGroupLabel = current.label;
1644
+ // The row's name, badge and all, as the row itself is named.
1645
+ const optgroup = current;
1646
+ const badge = groupBadgeOf(optgroup);
1647
+ this.revealedGroupLabel = badge === null ? optgroup.label : `${optgroup.label}, ${badge.label}`;
1642
1648
  return true;
1643
1649
  };
1644
1650
  switch (e.key) {
@@ -2187,11 +2193,16 @@ export class PdsCombobox {
2187
2193
  return;
2188
2194
  const { optgroup, key, options, members } = group;
2189
2195
  const groupIcon = groupIconOf(optgroup);
2196
+ const badge = groupBadgeOf(optgroup);
2190
2197
  // As in the grouped displays: disabled when there's nothing left in it to choose.
2191
2198
  const disabled = members.length > 0 && members.every(member => isOptionDisabled(member));
2192
- rendered.push(h("li", { key: key, class: { 'pds-combobox__group': true, 'pds-combobox__group--disabled': disabled }, role: "group", "aria-label": optgroup.label, "aria-disabled": disabled ? 'true' : undefined }, h("div", { class: { 'pds-combobox__group-label': true, 'pds-combobox__group-label--with-icon': groupIcon !== null }, "aria-hidden": "true" }, groupIcon !== null && (
2199
+ rendered.push(h("li", { key: key, class: { 'pds-combobox__group': true, 'pds-combobox__group--disabled': disabled }, role: "group", "aria-label": badge === null ? optgroup.label : `${optgroup.label}, ${badge.label}`, "aria-disabled": disabled ? 'true' : undefined }, h("div", { class: {
2200
+ 'pds-combobox__group-label': true,
2201
+ 'pds-combobox__group-label--with-icon': groupIcon !== null,
2202
+ 'pds-combobox__group-label--with-badge': badge !== null,
2203
+ }, "aria-hidden": "true" }, groupIcon !== null && (
2193
2204
  // `name`, not `icon`: `icon` also loads URLs and data: SVGs, unsanitized.
2194
- h("pds-icon", { name: groupIcon, size: "small", "aria-hidden": "true", class: "pds-combobox__group-icon" })), optgroup.label), h("ul", { class: "pds-combobox__group-list", role: "presentation" }, options)));
2205
+ h("pds-icon", { name: groupIcon, size: "small", "aria-hidden": "true", class: "pds-combobox__group-icon" })), badge === null ? optgroup.label : h("span", { class: "pds-combobox__group-label-text" }, optgroup.label), this.renderBadge(badge, 'pds-combobox__group-badge')), h("ul", { class: "pds-combobox__group-list", role: "presentation" }, options)));
2195
2206
  group = null;
2196
2207
  };
2197
2208
  this.filteredItems.forEach((item, itemIdx) => {
@@ -2317,20 +2328,56 @@ export class PdsCombobox {
2317
2328
  const isChip = this.isOptionChip(option);
2318
2329
  const isDisabled = isOptionDisabled(option);
2319
2330
  const tree = level !== undefined;
2320
- return (h("li", { key: option.value, id: this.optionDomId(index), role: tree ? 'treeitem' : 'option', "aria-selected": isSelected ? 'true' : tree ? undefined : 'false', "aria-disabled": isDisabled ? 'true' : undefined, "aria-level": level, "aria-setsize": setsize, "aria-posinset": posinset, "aria-label": isLayout || isChip ? option.getAttribute('aria-label') || this.getOptionLabel(option) : undefined, tabindex: this.usesBodyPortal || this.usesPanelSearch || tree ? '-1' : isHighlighted ? '0' : '-1', class: {
2331
+ const badge = isLayout || isChip ? null : optionBadgeOf(option);
2332
+ return (h("li", { key: option.value, id: this.optionDomId(index), role: tree ? 'treeitem' : 'option', "aria-selected": isSelected ? 'true' : tree ? undefined : 'false', "aria-disabled": isDisabled ? 'true' : undefined, "aria-level": level, "aria-setsize": setsize, "aria-posinset": posinset, "aria-label": isLayout || isChip
2333
+ ? option.getAttribute('aria-label') || this.getOptionLabel(option)
2334
+ : badge && `${this.getOptionLabel(option)}, ${badge.label}`, tabindex: this.usesBodyPortal || this.usesPanelSearch || tree ? '-1' : isHighlighted ? '0' : '-1', class: {
2321
2335
  'pds-combobox__option': true,
2322
2336
  'pds-combobox__option--highlighted': isHighlighted,
2323
2337
  'pds-combobox__option--layout': isLayout,
2324
2338
  'pds-combobox__option--chip': isChip,
2325
2339
  'pds-combobox__option--disabled': isDisabled,
2326
- }, "data-option-index": index, onMouseDown: this.onOptionMouseDown, onClick: this.onOptionClick, onMouseEnter: this.onOptionMouseEnter, onKeyDown: this.onOptionKeyDown }, isLayout ? (h("pds-box", { class: "pds-combobox__option-layout-wrapper", innerHTML: this.getOptionLayoutContent(option) })) : isChip ? (this.renderOptionChip(option)) : (this.renderOptionLabel(option)), isSelected && h("pds-icon", { icon: "check", size: "regular", "aria-hidden": "true", class: "pds-combobox__option-check" })));
2340
+ 'pds-combobox__option--with-badge': badge !== null,
2341
+ }, "data-option-index": index, onMouseDown: this.onOptionMouseDown, onClick: this.onOptionClick, onMouseEnter: this.onOptionMouseEnter, onKeyDown: this.onOptionKeyDown }, isLayout ? (h("pds-box", { class: "pds-combobox__option-layout-wrapper", innerHTML: this.getOptionLayoutContent(option) })) : isChip ? (this.renderOptionChip(option)) : ([this.renderOptionLabel(option), this.renderOptionBadge(option)]), isSelected && h("pds-icon", { icon: "check", size: "regular", "aria-hidden": "true", class: "pds-combobox__option-check" })));
2327
2342
  }
2328
- /** An option's text, after its `data-icon` when it has one. */
2343
+ /** Copies an `options` badge to an option's or optgroup's `data-badge*` attributes; only strings count. */
2344
+ setBadgeAttributes(element, badge) {
2345
+ if (typeof badge !== 'object' || badge === null)
2346
+ return;
2347
+ const { label, sentiment, icon } = badge;
2348
+ if (typeof label !== 'string' || label.trim() === '')
2349
+ return;
2350
+ element.setAttribute('data-badge', label);
2351
+ if (typeof sentiment === 'string')
2352
+ element.setAttribute('data-badge-sentiment', sentiment);
2353
+ if (typeof icon === 'string')
2354
+ element.setAttribute('data-badge-icon', icon);
2355
+ }
2356
+ /** An option's badge, after its text. */
2357
+ renderOptionBadge(option) {
2358
+ return this.renderBadge(optionBadgeOf(option), 'pds-combobox__option-badge');
2359
+ }
2360
+ /** A badge as a `pds-chip`: after an option's text, or a group's label. */
2361
+ renderBadge(badge, className) {
2362
+ var _a;
2363
+ if (badge === null)
2364
+ return null;
2365
+ return (h("pds-chip", { size: "sm", sentiment: badge.sentiment,
2366
+ // A Pine icon name only, checked by optionBadgeOf; pds-chip's `icon` also loads URLs.
2367
+ icon: (_a = badge.icon) !== null && _a !== void 0 ? _a : undefined,
2368
+ // A long label, often a translated one, truncates rather than squeezing the option's text.
2369
+ maxWidth: "50%", class: className }, badge.label));
2370
+ }
2371
+ /**
2372
+ * An option's text, after its `data-icon` when it has one. Beside a badge the text is always
2373
+ * wrapped, so it can shrink and wrap rather than push the badge out of the row.
2374
+ */
2329
2375
  renderOptionLabel(option) {
2330
2376
  const icon = optionIconOf(option);
2331
2377
  const label = this.truncate ? (h("span", { key: this.getOptionLabel(option), class: "pds-combobox__option-text" }, this.getOptionLabel(option))) : this.getOptionLabel(option);
2332
- if (icon === null)
2333
- return label;
2378
+ if (icon === null) {
2379
+ return optionBadgeOf(option) === null ? label : h("span", { class: "pds-combobox__option-label" }, label);
2380
+ }
2334
2381
  return (h("span", { class: "pds-combobox__option-label" }, h("pds-icon", { name: icon, size: "regular", "aria-hidden": "true", class: "pds-combobox__option-icon" }), label));
2335
2382
  }
2336
2383
  /** The grouped panel's rows, in the order the panel draws them and the keyboard moves through. */
@@ -2369,7 +2416,8 @@ export class PdsCombobox {
2369
2416
  }
2370
2417
  /**
2371
2418
  * Drilled into a group: its treeitem, expanded. Its row reads as a way back ("Back: Tag") and
2372
- * leads its options.
2419
+ * leads its options. It leaves out the group's badge: the row is a way back, not a group to
2420
+ * choose, and the badge was on the row that opened it. An option's own badge still shows.
2373
2421
  */
2374
2422
  renderGroupBackRow(group, { posinset, setsize }) {
2375
2423
  const id = this.groupDomId(group.optgroup);
@@ -2398,9 +2446,9 @@ export class PdsCombobox {
2398
2446
  'pds-combobox__group-row--highlighted': isCurrent && (flyout || this.keyboardNavigating),
2399
2447
  'pds-combobox__group-row--keyboard': isCurrent && this.keyboardNavigating,
2400
2448
  'pds-combobox__group-row--disabled': disabled,
2401
- }, role: "treeitem", "aria-expanded": isOpen ? 'true' : 'false', "aria-disabled": disabled ? 'true' : undefined, "aria-level": 1, "aria-posinset": posinset, "aria-setsize": setsize, "aria-labelledby": `${id}-label`, "data-group-index": groupIndex, onMouseEnter: flyout ? this.onGroupRowMouseEnter : undefined, onMouseLeave: flyout ? this.onGroupRowMouseLeave : undefined }, h("div", { class: "pds-combobox__group-row-trigger", "data-group-index": groupIndex, onMouseDown: this.onOptionMouseDown, onMouseEnter: this.onGroupRowTriggerMouseEnter, onClick: this.onGroupRowClick }, h("span", { class: "pds-combobox__group-row-label", id: `${id}-label` }, group.icon !== null && (
2449
+ }, role: "treeitem", "aria-expanded": isOpen ? 'true' : 'false', "aria-disabled": disabled ? 'true' : undefined, "aria-level": 1, "aria-posinset": posinset, "aria-setsize": setsize, "aria-labelledby": group.badge === null ? `${id}-label` : undefined, "aria-label": group.badge === null ? undefined : `${group.label}, ${group.badge.label}`, "data-group-index": groupIndex, onMouseEnter: flyout ? this.onGroupRowMouseEnter : undefined, onMouseLeave: flyout ? this.onGroupRowMouseLeave : undefined }, h("div", { class: "pds-combobox__group-row-trigger", "data-group-index": groupIndex, onMouseDown: this.onOptionMouseDown, onMouseEnter: this.onGroupRowTriggerMouseEnter, onClick: this.onGroupRowClick }, h("span", { class: "pds-combobox__group-row-label", id: `${id}-label` }, group.icon !== null && (
2402
2450
  // `name`, not `icon`: `icon` also loads URLs and data: SVGs, unsanitized.
2403
- h("pds-icon", { name: group.icon, size: "regular", "aria-hidden": "true", class: "pds-combobox__group-icon" })), group.label), h("pds-icon", { name: "caret-right", size: "regular", "aria-hidden": "true", class: "pds-combobox__group-row-caret" })), isOpen && (h("ul", { class: "pds-combobox__flyout", role: "group", "aria-label": group.label, style: { minWidth: this.flyoutMinWidth, maxWidth: this.flyoutMaxWidth } }, this.renderGroupOptions(group)))));
2451
+ h("pds-icon", { name: group.icon, size: "regular", "aria-hidden": "true", class: "pds-combobox__group-icon" })), group.label), this.renderBadge(group.badge, 'pds-combobox__group-badge'), h("pds-icon", { name: "caret-right", size: "regular", "aria-hidden": "true", class: "pds-combobox__group-row-caret" })), isOpen && (h("ul", { class: "pds-combobox__flyout", role: "group", "aria-label": group.label, style: { minWidth: this.flyoutMinWidth, maxWidth: this.flyoutMaxWidth } }, this.renderGroupOptions(group)))));
2404
2452
  }
2405
2453
  // Helper method to render the caret icon
2406
2454
  renderCaretIcon() {
@@ -2557,13 +2605,13 @@ export class PdsCombobox {
2557
2605
  ]
2558
2606
  .filter(Boolean)
2559
2607
  .join(' ');
2560
- return (h(Host, { key: '2786062989bc490e87ea382b5c80f7e2758c1a8a', "aria-disabled": this.disabled ? 'true' : null }, h("div", { key: 'b3b272a99528d725a52d3092a3650efacaf54b34', class: "pds-combobox", tabIndex: -1, onFocusout: this.onComboboxFocusOut, part: "combobox" }, this.hasVisibleLabel && (h("label", { key: '8e2e0021e1f60cddfe41b918406c7d76659fbff1', htmlFor: this.trigger === 'input' ? this.componentId : undefined, id: this.labelId, class: "pds-combobox__label", onClick: this.onLabelClick }, this.label)), this.trigger === 'input' ? (h("div", { class: "pds-combobox__input-wrapper", style: { width: this.triggerWidth } }, h("input", { ref: el => {
2608
+ return (h(Host, { key: '104eb1c4cdca4494b10dea660e27a98b0c18bf64', "aria-disabled": this.disabled ? 'true' : null }, h("div", { key: '2548ff2b304bb6a5a249b5059a0b60b55cdf2152', class: "pds-combobox", tabIndex: -1, onFocusout: this.onComboboxFocusOut, part: "combobox" }, this.hasVisibleLabel && (h("label", { key: '7a261c72452ca7a278e1067e41c6eed52f29edc8', htmlFor: this.trigger === 'input' ? this.componentId : undefined, id: this.labelId, class: "pds-combobox__label", onClick: this.onLabelClick }, this.label)), this.trigger === 'input' ? (h("div", { class: "pds-combobox__input-wrapper", style: { width: this.triggerWidth } }, h("input", { ref: el => {
2561
2609
  this.inputEl = el;
2562
2610
  this.triggerEl = el;
2563
2611
  }, class: {
2564
2612
  'pds-combobox__input': true,
2565
2613
  'pds-combobox__input--invalid': this.isInvalid(),
2566
- }, type: "text", role: "combobox", "aria-autocomplete": "list", "aria-haspopup": this.inputPopupRole === 'tree' ? 'tree' : undefined, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.hideLabel ? this.label : undefined, id: this.componentId, value: this.displayText, placeholder: this.placeholder, disabled: this.disabled, onInput: this.handleInput, onClick: this.handleInputClick, onKeyDown: this.handleKeyDown, autocomplete: "off", part: "input" }), h("pds-icon", { icon: "enlarge", "aria-hidden": "true", class: "pds-combobox__input-icon" }))) : this.trigger === 'chip' ? (h("div", { class: this.getChipTriggerClass(), style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, ref: el => (this.triggerEl = el), part: "chip-trigger" }, this.renderChipTriggerContent())) : (h("div", { class: triggerClass, style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, onMouseEnter: this.truncate ? this.onButtonTriggerMouseEnter : undefined, ref: el => (this.triggerEl = el), part: "button-trigger" }, this.renderButtonTriggerContent())), this.renderMessages(), h("div", { key: '2216779564fa3f4efd1b4d0972ac045fa0851078', style: { display: 'none' } }, h("slot", { key: '77b344d7301193f435949cbe2be2b28e1d7f6602', onSlotchange: () => this.updateOptions() })), this.renderDropdown(), this.groupDisplay !== 'inline' && [
2614
+ }, type: "text", role: "combobox", "aria-autocomplete": "list", "aria-haspopup": this.inputPopupRole === 'tree' ? 'tree' : undefined, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.hideLabel ? this.label : undefined, id: this.componentId, value: this.displayText, placeholder: this.placeholder, disabled: this.disabled, onInput: this.handleInput, onClick: this.handleInputClick, onKeyDown: this.handleKeyDown, autocomplete: "off", part: "input" }), h("pds-icon", { icon: "enlarge", "aria-hidden": "true", class: "pds-combobox__input-icon" }))) : this.trigger === 'chip' ? (h("div", { class: this.getChipTriggerClass(), style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, ref: el => (this.triggerEl = el), part: "chip-trigger" }, this.renderChipTriggerContent())) : (h("div", { class: triggerClass, style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, onMouseEnter: this.truncate ? this.onButtonTriggerMouseEnter : undefined, ref: el => (this.triggerEl = el), part: "button-trigger" }, this.renderButtonTriggerContent())), this.renderMessages(), h("div", { key: 'ffd3bc72b34a7278f3fa706a236017a26b86ea3f', style: { display: 'none' } }, h("slot", { key: 'f47a81191ad7fd8c6bf63cf8ef39934cbf7fd28c', onSlotchange: () => this.updateOptions() })), this.renderDropdown(), this.groupDisplay !== 'inline' && [
2567
2615
  h("span", { key: "drill-status", class: "visually-hidden", role: "status", "aria-live": "polite" }, this.isOpen && this.effectiveGroupDisplay === 'drill-in' && this.openGroup !== null ? this.openGroup.label : ''),
2568
2616
  // Its own region: sharing one, revealing a row then opening it would leave the text the
2569
2617
  // same, and opening the group would go unannounced.
@@ -598,6 +598,7 @@ OptionIconsWithGroups.args = {
598
598
  { id: 'email-activity', text: 'Email activity', group: 'Email' },
599
599
  { id: 'marketing-status', text: 'Email marketing status', group: 'Email' },
600
600
  { id: 'sequence', text: 'Sequence', group: 'Email' },
601
+ { id: 'responsive', text: 'Responsive marketing emails', group: 'Email', badge: { label: 'New', sentiment: 'accent', icon: 'star' } },
601
602
  { id: 'event', text: 'Event', icon: 'calendar-date' },
602
603
  { id: 'custom-fields', text: 'Custom fields', group: 'Fields', groupIcon: 'columns' },
603
604
  { id: 'default-fields', text: 'Default fields', group: 'Fields' },
@@ -748,6 +749,53 @@ DisabledOptions.argTypes = {
748
749
  groupDisplay: { control: 'inline-radio', options: ['inline', 'flyout', 'drill-in'] },
749
750
  };
750
751
 
752
+ // A plan-gated group: listed, disabled, with a Premium badge on its row, before the chevron.
753
+ // The badge comes from the first option in the group that sets groupBadge.
754
+ export const GroupBadges = (args) => html`
755
+ <div style="min-height: 320px;">
756
+ <pds-combobox
757
+ component-id="combobox-group-badges"
758
+ label=${args.label}
759
+ placeholder=${args.placeholder}
760
+ trigger="button"
761
+ mode="select-only"
762
+ group-display=${args.groupDisplay}
763
+ drill-in-back-label="Back"
764
+ trigger-width="300px"
765
+ dropdown-width="300px"
766
+ .options=${args.options}
767
+ ></pds-combobox>
768
+ </div>`;
769
+
770
+ GroupBadges.args = {
771
+ label: 'Action',
772
+ placeholder: 'Choose an action',
773
+ groupDisplay: 'drill-in',
774
+ options: [
775
+ { id: 'email_send', text: 'Send an email', group: 'Email', groupIcon: 'mail' },
776
+ { id: 'contact_tag_add', text: 'Add a tag', group: 'Contact', groupIcon: 'contact' },
777
+ {
778
+ id: 'facebook_message_send',
779
+ text: 'Send a Facebook message',
780
+ group: 'Facebook',
781
+ groupBadge: { label: 'Premium', sentiment: 'brand', icon: 'premium' },
782
+ disabled: true,
783
+ },
784
+ { id: 'facebook_comment_reply', text: 'Reply to a comment', group: 'Facebook', disabled: true },
785
+ {
786
+ id: 'instagram_message_send',
787
+ text: 'Send an Instagram message',
788
+ group: 'Instagram',
789
+ groupBadge: { label: 'Premium', sentiment: 'brand', icon: 'premium' },
790
+ disabled: true,
791
+ },
792
+ ],
793
+ };
794
+
795
+ GroupBadges.argTypes = {
796
+ groupDisplay: { control: 'inline-radio', options: ['inline', 'flyout', 'drill-in'] },
797
+ };
798
+
751
799
  export const OptionGroupsPdsText = (args) => html`
752
800
  <pds-combobox
753
801
  component-id="combobox-pds-text-groups"
@@ -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
- }
@@ -107,7 +107,7 @@ export class PdsDropdownMenu {
107
107
  this.currentFocusIndex = -1;
108
108
  // Return focus to trigger
109
109
  if (this.isFocusInMenu()) {
110
- this.triggerEl.focus();
110
+ this.focusTrigger();
111
111
  }
112
112
  };
113
113
  // Handle click on the trigger element
@@ -158,6 +158,14 @@ export class PdsDropdownMenu {
158
158
  const focused = this.host.getRootNode().activeElement;
159
159
  return focused != null && this.host.contains(focused);
160
160
  }
161
+ // A trigger whose host can't take focus itself, such as pds-chip, passes it to the control inside.
162
+ focusTrigger() {
163
+ var _a, _b;
164
+ this.triggerEl.focus();
165
+ if (this.host.getRootNode().activeElement === this.triggerEl)
166
+ return;
167
+ (_b = (_a = this.triggerEl.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('button, [href], [tabindex]:not([tabindex="-1"])')) === null || _b === void 0 ? void 0 : _b.focus();
168
+ }
161
169
  // Check if a menu item is disabled (handles both component and raw elements)
162
170
  isItemDisabled(item) {
163
171
  const tagName = item.tagName.toLowerCase();
@@ -253,6 +261,23 @@ export class PdsDropdownMenu {
253
261
  this.focusItemByIndex(prevIndex);
254
262
  }
255
263
  }
264
+ // Unlike the arrow keys, Tab stops at either end of the menu instead of wrapping.
265
+ adjacentEnabledIndex(fromIndex, step) {
266
+ for (let index = fromIndex + step; index >= 0 && index < this.menuItems.length; index += step) {
267
+ if (!this.isItemDisabled(this.menuItems[index]))
268
+ return index;
269
+ }
270
+ return -1;
271
+ }
272
+ // An enabled item can still refuse focus (hidden, or a link with no href), so each one is tried in turn.
273
+ focusAdjacentItem(fromIndex, step) {
274
+ for (let index = this.adjacentEnabledIndex(fromIndex, step); index !== -1; index = this.adjacentEnabledIndex(index, step)) {
275
+ this.focusItemByIndex(index);
276
+ if (this.getFocusedItemIndex() === index)
277
+ return true;
278
+ }
279
+ return false;
280
+ }
256
281
  // Escape is taken in document's capture phase, before a modal around the menu hears it on
257
282
  // document and closes too.
258
283
  handleEscapeKeyDown(event) {
@@ -261,6 +286,28 @@ export class PdsDropdownMenu {
261
286
  event.preventDefault();
262
287
  this.closeDropdown();
263
288
  }
289
+ // Taken in the capture phase, so a modal or popover around the menu that traps Tab finds the key
290
+ // already handled, or focus back on the trigger with the items hidden.
291
+ handleTabKeyDown(event) {
292
+ if (!this.isOpen || event.key !== 'Tab' || event.defaultPrevented)
293
+ return;
294
+ const currentIndex = this.getFocusedItemIndex();
295
+ if (currentIndex === -1) {
296
+ // The menu sits after the trigger, so Shift+Tab from the trigger leaves it behind. So does Shift+Tab
297
+ // from outside the menu, where focus stays after a mouse open in Safari.
298
+ if (event.shiftKey && (document.activeElement === this.triggerEl || !this.isFocusInMenu()))
299
+ this.closeDropdown();
300
+ return;
301
+ }
302
+ if (this.focusAdjacentItem(currentIndex, event.shiftKey ? -1 : 1)) {
303
+ event.preventDefault();
304
+ return;
305
+ }
306
+ // Past either end, closing moves focus to the trigger. Shift+Tab stays there; Tab carries on past it.
307
+ if (event.shiftKey)
308
+ event.preventDefault();
309
+ this.closeDropdown();
310
+ }
264
311
  // Handle keyboard events for the dropdown
265
312
  handleKeyDown(event) {
266
313
  if (!this.isOpen)
@@ -300,54 +347,19 @@ export class PdsDropdownMenu {
300
347
  }
301
348
  }
302
349
  break;
303
- case 'Tab':
304
- if (event.shiftKey) {
305
- // Let Shift+Tab navigate naturally from first item to trigger
306
- // For all other items, move to previous item
307
- const currentIndex = this.getFocusedItemIndex();
308
- if (currentIndex > 0) {
309
- // If not on first item, prevent default and go to previous item
310
- event.preventDefault();
311
- this.focusPreviousItem(); // Use our method that skips disabled items
312
- }
313
- // If on first item or no item, let natural tab order move back to trigger
350
+ case 'Tab': {
351
+ // Tab from an item is handled in handleTabKeyDown; from anywhere else it moves into the menu.
352
+ if (event.shiftKey || this.getFocusedItemIndex() !== -1)
353
+ break;
354
+ if (this.focusAdjacentItem(-1, 1)) {
355
+ event.preventDefault();
314
356
  }
315
357
  else {
316
- // Forward Tab navigation
317
- const activeElement = document.activeElement;
318
- const isTriggerFocused = activeElement === this.triggerEl;
319
- const currentIndex = this.getFocusedItemIndex();
320
- if (isTriggerFocused && this.menuItems.length > 0) {
321
- // If trigger is focused, move to first non-disabled menu item
322
- event.preventDefault();
323
- // Find the first non-disabled item
324
- let firstFocusableIndex = 0;
325
- while (firstFocusableIndex < this.menuItems.length && this.isItemDisabled(this.menuItems[firstFocusableIndex])) {
326
- firstFocusableIndex++;
327
- }
328
- if (firstFocusableIndex < this.menuItems.length) {
329
- this.focusItemByIndex(firstFocusableIndex);
330
- }
331
- }
332
- else if (currentIndex === -1 && this.menuItems.length > 0) {
333
- // If no menu item is focused, focus the first non-disabled one
334
- event.preventDefault();
335
- // Find the first non-disabled item
336
- let firstFocusableIndex = 0;
337
- while (firstFocusableIndex < this.menuItems.length && this.isItemDisabled(this.menuItems[firstFocusableIndex])) {
338
- firstFocusableIndex++;
339
- }
340
- if (firstFocusableIndex < this.menuItems.length) {
341
- this.focusItemByIndex(firstFocusableIndex);
342
- }
343
- }
344
- else if (currentIndex !== -1) {
345
- // Use our method that skips disabled items
346
- event.preventDefault();
347
- this.focusNextItem();
348
- }
358
+ // With no item to move to, Tab carries on past the menu, as it does past the last item.
359
+ this.closeDropdown();
349
360
  }
350
361
  break;
362
+ }
351
363
  }
352
364
  }
353
365
  // Handle clicks outside the dropdown to close it
@@ -357,7 +369,7 @@ export class PdsDropdownMenu {
357
369
  }
358
370
  }
359
371
  render() {
360
- return (h(Host, { key: '0ed3d8ee889a5423ca9de66a86791d084f75abf0', id: this.componentId }, h("slot", { key: '6bab71652d6afe094075623d3a48641a4d89b232', name: "trigger", onSlotchange: this.handleTriggerSlotChange }), h("pds-box", { key: 'fcef0667f999ae5b8cd03eb94a0db0be7be502cb', "border-radius": "sm", display: "flex", direction: "column", class: "pds-dropdown-menu--panel is-hidden", shadow: "100", part: "menu-panel" }, h("div", { key: 'c78d5bd7e48c5483b12171341271f9132f4b2ff9', class: { 'pds-dropdown-menu__header': true, 'is-hidden': !this.hasHeader } }, h("slot", { key: '6464994260720d6046da548f4aad0896965cc47c', name: "header", onSlotchange: this.handleHeaderSlotChange })), h("div", { key: '3e97dfc4e1911f91ce8917faf981d436e71e5c24', class: "pds-dropdown-menu__items", role: "menu", "aria-orientation": "vertical" }, h("slot", { key: 'dfd77a8b73df5ce9eef3e661d3f9501cb8bfdba2', onSlotchange: this.handleSlotChange })))));
372
+ return (h(Host, { key: 'aa4ce84354cf87638ee46fd7ed69520228b7e656', id: this.componentId }, h("slot", { key: '948800e67d18c8c6cc9e77ef3aeab635c5035453', name: "trigger", onSlotchange: this.handleTriggerSlotChange }), h("pds-box", { key: '3ce2a2879b14aad975cea8ae72fcbf8c3abcf20c', "border-radius": "sm", display: "flex", direction: "column", class: "pds-dropdown-menu--panel is-hidden", shadow: "100", part: "menu-panel" }, h("div", { key: 'ad25fbf4f3c7a24653c229e64fe2ce893a92e4c8', class: { 'pds-dropdown-menu__header': true, 'is-hidden': !this.hasHeader } }, h("slot", { key: '35a5903543e08577997b456bcd312bdd009fd8fc', name: "header", onSlotchange: this.handleHeaderSlotChange })), h("div", { key: 'a9593adacf047918c1d87494f8c951a2a4a5f76f', class: "pds-dropdown-menu__items", role: "menu", "aria-orientation": "vertical" }, h("slot", { key: '8d2def1cc7020608220099f4ced0f44e9838cce8', onSlotchange: this.handleSlotChange })))));
361
373
  }
362
374
  static get is() { return "pds-dropdown-menu"; }
363
375
  static get encapsulation() { return "shadow"; }
@@ -435,6 +447,12 @@ export class PdsDropdownMenu {
435
447
  "target": "document",
436
448
  "capture": true,
437
449
  "passive": false
450
+ }, {
451
+ "name": "keydown",
452
+ "method": "handleTabKeyDown",
453
+ "target": "document",
454
+ "capture": true,
455
+ "passive": false
438
456
  }, {
439
457
  "name": "keydown",
440
458
  "method": "handleKeyDown",
@@ -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"; }