@pine-ds/core 3.28.0 → 3.30.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 (374) hide show
  1. package/components/form.js +1 -1
  2. package/components/pds-avatar.js +1 -1
  3. package/components/pds-checkbox2.js +1 -1
  4. package/components/pds-combobox.js +2 -2
  5. package/components/pds-input.js +1 -1
  6. package/components/pds-link2.js +1 -1
  7. package/components/pds-modal.js +1 -1
  8. package/components/pds-multiselect.js +1 -1
  9. package/components/pds-radio.js +1 -1
  10. package/components/pds-select.js +1 -1
  11. package/components/pds-switch.js +1 -1
  12. package/components/pds-tab.js +1 -1
  13. package/components/pds-tabpanel.js +1 -1
  14. package/components/pds-tabs.js +1 -1
  15. package/components/pds-text2.js +1 -1
  16. package/components/pds-textarea.js +1 -1
  17. package/components/pds-toast.js +1 -1
  18. package/components/pds-tooltip.js +1 -1
  19. package/dist/cjs/{form-CpM5Z8q7.js → form-MhwfKTuo.js} +11 -7
  20. package/dist/cjs/{index-DBhfI2Jq.js → index-BdFrBXCD.js} +5 -1
  21. package/dist/cjs/{index-DGBoDsAL.js → index-CKNNY-lQ.js} +1 -1
  22. package/dist/cjs/loader.cjs.js +2 -2
  23. package/dist/cjs/mock-pds-modal.cjs.entry.js +1 -1
  24. package/dist/cjs/pds-accordion.cjs.entry.js +2 -2
  25. package/dist/cjs/pds-alert.cjs.entry.js +1 -1
  26. package/dist/cjs/pds-avatar.cjs.entry.js +39 -8
  27. package/dist/cjs/pds-box.cjs.entry.js +1 -1
  28. package/dist/cjs/pds-button.cjs.entry.js +2 -2
  29. package/dist/cjs/pds-checkbox.cjs.entry.js +6 -6
  30. package/dist/cjs/pds-chip.cjs.entry.js +2 -2
  31. package/dist/cjs/pds-combobox.cjs.entry.js +21 -5
  32. package/dist/cjs/pds-container.cjs.entry.js +1 -1
  33. package/dist/cjs/pds-copytext.cjs.entry.js +2 -2
  34. package/dist/cjs/pds-divider.cjs.entry.js +1 -1
  35. package/dist/cjs/pds-dropdown-menu-item.cjs.entry.js +1 -1
  36. package/dist/cjs/pds-dropdown-menu-separator.cjs.entry.js +1 -1
  37. package/dist/cjs/pds-dropdown-menu.cjs.entry.js +1 -1
  38. package/dist/cjs/pds-filter.cjs.entry.js +2 -2
  39. package/dist/cjs/pds-filters.cjs.entry.js +1 -1
  40. package/dist/cjs/pds-icon.cjs.entry.js +1 -1
  41. package/dist/cjs/pds-image.cjs.entry.js +1 -1
  42. package/dist/cjs/pds-input.cjs.entry.js +4 -4
  43. package/dist/cjs/pds-link.cjs.entry.js +12 -5
  44. package/dist/cjs/pds-loader.cjs.entry.js +1 -1
  45. package/dist/cjs/pds-modal-content.cjs.entry.js +1 -1
  46. package/dist/cjs/pds-modal-footer.cjs.entry.js +1 -1
  47. package/dist/cjs/pds-modal-header.cjs.entry.js +1 -1
  48. package/dist/cjs/pds-modal.cjs.entry.js +36 -6
  49. package/dist/cjs/pds-multiselect.cjs.entry.js +7 -7
  50. package/dist/cjs/pds-popover.cjs.entry.js +1 -1
  51. package/dist/cjs/pds-progress.cjs.entry.js +1 -1
  52. package/dist/cjs/pds-property.cjs.entry.js +1 -1
  53. package/dist/cjs/pds-radio-group.cjs.entry.js +3 -3
  54. package/dist/cjs/pds-radio.cjs.entry.js +7 -7
  55. package/dist/cjs/pds-row.cjs.entry.js +1 -1
  56. package/dist/cjs/pds-select.cjs.entry.js +9 -4
  57. package/dist/cjs/pds-sortable-item.cjs.entry.js +2 -2
  58. package/dist/cjs/pds-sortable.cjs.entry.js +1 -1
  59. package/dist/cjs/pds-switch.cjs.entry.js +6 -6
  60. package/dist/cjs/pds-tab.cjs.entry.js +41 -6
  61. package/dist/cjs/pds-table-body.cjs.entry.js +1 -1
  62. package/dist/cjs/pds-table-cell.cjs.entry.js +1 -1
  63. package/dist/cjs/pds-table-head-cell.cjs.entry.js +2 -2
  64. package/dist/cjs/pds-table-head.cjs.entry.js +1 -1
  65. package/dist/cjs/pds-table-row.cjs.entry.js +1 -1
  66. package/dist/cjs/pds-table.cjs.entry.js +1 -1
  67. package/dist/cjs/pds-tabpanel.cjs.entry.js +8 -3
  68. package/dist/cjs/pds-tabs.cjs.entry.js +74 -3
  69. package/dist/cjs/pds-text.cjs.entry.js +2 -2
  70. package/dist/cjs/pds-textarea.cjs.entry.js +7 -7
  71. package/dist/cjs/pds-toast.cjs.entry.js +4 -4
  72. package/dist/cjs/pds-tooltip.cjs.entry.js +3 -3
  73. package/dist/cjs/pine-core.cjs.js +2 -2
  74. package/dist/collection/components/pds-avatar/pds-avatar.css +29 -0
  75. package/dist/collection/components/pds-avatar/pds-avatar.js +105 -5
  76. package/dist/collection/components/pds-avatar/stories/pds-avatar.stories.js +23 -0
  77. package/dist/collection/components/pds-button/pds-button.js +1 -1
  78. package/dist/collection/components/pds-button/stories/pds-button.stories.js +25 -0
  79. package/dist/collection/components/pds-checkbox/pds-checkbox.js +3 -3
  80. package/dist/collection/components/pds-combobox/pds-combobox.css +32 -0
  81. package/dist/collection/components/pds-combobox/pds-combobox.js +76 -3
  82. package/dist/collection/components/pds-combobox/stories/pds-combobox.stories.js +25 -0
  83. package/dist/collection/components/pds-input/pds-input.js +1 -1
  84. package/dist/collection/components/pds-link/pds-link.css +10 -0
  85. package/dist/collection/components/pds-link/pds-link.js +32 -2
  86. package/dist/collection/components/pds-link/stories/pds-link.stories.js +14 -0
  87. package/dist/collection/components/pds-modal/pds-modal.js +58 -5
  88. package/dist/collection/components/pds-modal/stories/pds-modal.stories.js +77 -0
  89. package/dist/collection/components/pds-multiselect/pds-multiselect.css +2 -2
  90. package/dist/collection/components/pds-multiselect/pds-multiselect.js +3 -3
  91. package/dist/collection/components/pds-radio/pds-radio.css +6 -0
  92. package/dist/collection/components/pds-radio/pds-radio.js +3 -3
  93. package/dist/collection/components/pds-select/pds-select.js +7 -2
  94. package/dist/collection/components/pds-switch/pds-switch.js +3 -3
  95. package/dist/collection/components/pds-tabs/pds-tab/pds-tab.css +4 -4
  96. package/dist/collection/components/pds-tabs/pds-tab/pds-tab.js +161 -5
  97. package/dist/collection/components/pds-tabs/pds-tabpanel/pds-tabpanel.css +9 -0
  98. package/dist/collection/components/pds-tabs/pds-tabpanel/pds-tabpanel.js +29 -1
  99. package/dist/collection/components/pds-tabs/pds-tabs.css +14 -0
  100. package/dist/collection/components/pds-tabs/pds-tabs.js +146 -4
  101. package/dist/collection/components/pds-tabs/stories/pds-tabs.stories.js +43 -0
  102. package/dist/collection/components/pds-text/pds-text.js +1 -1
  103. package/dist/collection/components/pds-textarea/pds-textarea.js +4 -4
  104. package/dist/collection/components/pds-toast/pds-toast.js +3 -3
  105. package/dist/collection/components/pds-tooltip/pds-tooltip.js +2 -2
  106. package/dist/collection/utils/form.js +11 -7
  107. package/dist/docs.json +466 -6
  108. package/dist/esm/{form-C3xDZBme.js → form-BuRbS7Hp.js} +11 -7
  109. package/dist/esm/{index-D4ys0pep.js → index-BjlFq0VD.js} +1 -1
  110. package/dist/esm/{index-CaRgVPt7.js → index-NNDTPCWx.js} +5 -2
  111. package/dist/esm/loader.js +3 -3
  112. package/dist/esm/mock-pds-modal.entry.js +1 -1
  113. package/dist/esm/pds-accordion.entry.js +2 -2
  114. package/dist/esm/pds-alert.entry.js +1 -1
  115. package/dist/esm/pds-avatar.entry.js +39 -8
  116. package/dist/esm/pds-box.entry.js +1 -1
  117. package/dist/esm/pds-button.entry.js +2 -2
  118. package/dist/esm/pds-checkbox.entry.js +6 -6
  119. package/dist/esm/pds-chip.entry.js +2 -2
  120. package/dist/esm/pds-combobox.entry.js +21 -5
  121. package/dist/esm/pds-container.entry.js +1 -1
  122. package/dist/esm/pds-copytext.entry.js +2 -2
  123. package/dist/esm/pds-divider.entry.js +1 -1
  124. package/dist/esm/pds-dropdown-menu-item.entry.js +1 -1
  125. package/dist/esm/pds-dropdown-menu-separator.entry.js +1 -1
  126. package/dist/esm/pds-dropdown-menu.entry.js +1 -1
  127. package/dist/esm/pds-filter.entry.js +2 -2
  128. package/dist/esm/pds-filters.entry.js +1 -1
  129. package/dist/esm/pds-icon.entry.js +1 -1
  130. package/dist/esm/pds-image.entry.js +1 -1
  131. package/dist/esm/pds-input.entry.js +4 -4
  132. package/dist/esm/pds-link.entry.js +12 -5
  133. package/dist/esm/pds-loader.entry.js +1 -1
  134. package/dist/esm/pds-modal-content.entry.js +1 -1
  135. package/dist/esm/pds-modal-footer.entry.js +1 -1
  136. package/dist/esm/pds-modal-header.entry.js +1 -1
  137. package/dist/esm/pds-modal.entry.js +36 -6
  138. package/dist/esm/pds-multiselect.entry.js +7 -7
  139. package/dist/esm/pds-popover.entry.js +1 -1
  140. package/dist/esm/pds-progress.entry.js +1 -1
  141. package/dist/esm/pds-property.entry.js +1 -1
  142. package/dist/esm/pds-radio-group.entry.js +3 -3
  143. package/dist/esm/pds-radio.entry.js +7 -7
  144. package/dist/esm/pds-row.entry.js +1 -1
  145. package/dist/esm/pds-select.entry.js +9 -4
  146. package/dist/esm/pds-sortable-item.entry.js +2 -2
  147. package/dist/esm/pds-sortable.entry.js +1 -1
  148. package/dist/esm/pds-switch.entry.js +6 -6
  149. package/dist/esm/pds-tab.entry.js +41 -6
  150. package/dist/esm/pds-table-body.entry.js +1 -1
  151. package/dist/esm/pds-table-cell.entry.js +1 -1
  152. package/dist/esm/pds-table-head-cell.entry.js +2 -2
  153. package/dist/esm/pds-table-head.entry.js +1 -1
  154. package/dist/esm/pds-table-row.entry.js +1 -1
  155. package/dist/esm/pds-table.entry.js +1 -1
  156. package/dist/esm/pds-tabpanel.entry.js +8 -3
  157. package/dist/esm/pds-tabs.entry.js +74 -3
  158. package/dist/esm/pds-text.entry.js +2 -2
  159. package/dist/esm/pds-textarea.entry.js +7 -7
  160. package/dist/esm/pds-toast.entry.js +4 -4
  161. package/dist/esm/pds-tooltip.entry.js +3 -3
  162. package/dist/esm/pine-core.js +3 -3
  163. package/dist/esm-es5/form-BuRbS7Hp.js +1 -0
  164. package/dist/esm-es5/{index-CaRgVPt7.js → index-NNDTPCWx.js} +2 -2
  165. package/dist/esm-es5/loader.js +1 -1
  166. package/dist/esm-es5/mock-pds-modal.entry.js +1 -1
  167. package/dist/esm-es5/pds-accordion.entry.js +1 -1
  168. package/dist/esm-es5/pds-alert.entry.js +1 -1
  169. package/dist/esm-es5/pds-avatar.entry.js +1 -1
  170. package/dist/esm-es5/pds-box.entry.js +1 -1
  171. package/dist/esm-es5/pds-button.entry.js +1 -1
  172. package/dist/esm-es5/pds-checkbox.entry.js +1 -1
  173. package/dist/esm-es5/pds-chip.entry.js +1 -1
  174. package/dist/esm-es5/pds-combobox.entry.js +2 -2
  175. package/dist/esm-es5/pds-container.entry.js +1 -1
  176. package/dist/esm-es5/pds-copytext.entry.js +1 -1
  177. package/dist/esm-es5/pds-divider.entry.js +1 -1
  178. package/dist/esm-es5/pds-dropdown-menu-item.entry.js +1 -1
  179. package/dist/esm-es5/pds-dropdown-menu-separator.entry.js +1 -1
  180. package/dist/esm-es5/pds-dropdown-menu.entry.js +1 -1
  181. package/dist/esm-es5/pds-filter.entry.js +1 -1
  182. package/dist/esm-es5/pds-filters.entry.js +1 -1
  183. package/dist/esm-es5/pds-icon.entry.js +1 -1
  184. package/dist/esm-es5/pds-image.entry.js +1 -1
  185. package/dist/esm-es5/pds-input.entry.js +1 -1
  186. package/dist/esm-es5/pds-link.entry.js +1 -1
  187. package/dist/esm-es5/pds-loader.entry.js +1 -1
  188. package/dist/esm-es5/pds-modal-content.entry.js +1 -1
  189. package/dist/esm-es5/pds-modal-footer.entry.js +1 -1
  190. package/dist/esm-es5/pds-modal-header.entry.js +1 -1
  191. package/dist/esm-es5/pds-modal.entry.js +1 -1
  192. package/dist/esm-es5/pds-multiselect.entry.js +1 -1
  193. package/dist/esm-es5/pds-popover.entry.js +1 -1
  194. package/dist/esm-es5/pds-progress.entry.js +1 -1
  195. package/dist/esm-es5/pds-property.entry.js +1 -1
  196. package/dist/esm-es5/pds-radio-group.entry.js +1 -1
  197. package/dist/esm-es5/pds-radio.entry.js +1 -1
  198. package/dist/esm-es5/pds-row.entry.js +1 -1
  199. package/dist/esm-es5/pds-select.entry.js +1 -1
  200. package/dist/esm-es5/pds-sortable-item.entry.js +1 -1
  201. package/dist/esm-es5/pds-sortable.entry.js +1 -1
  202. package/dist/esm-es5/pds-switch.entry.js +1 -1
  203. package/dist/esm-es5/pds-tab.entry.js +1 -1
  204. package/dist/esm-es5/pds-table-body.entry.js +1 -1
  205. package/dist/esm-es5/pds-table-cell.entry.js +1 -1
  206. package/dist/esm-es5/pds-table-head-cell.entry.js +1 -1
  207. package/dist/esm-es5/pds-table-head.entry.js +1 -1
  208. package/dist/esm-es5/pds-table-row.entry.js +1 -1
  209. package/dist/esm-es5/pds-table.entry.js +1 -1
  210. package/dist/esm-es5/pds-tabpanel.entry.js +1 -1
  211. package/dist/esm-es5/pds-tabs.entry.js +1 -1
  212. package/dist/esm-es5/pds-text.entry.js +1 -1
  213. package/dist/esm-es5/pds-textarea.entry.js +1 -1
  214. package/dist/esm-es5/pds-toast.entry.js +1 -1
  215. package/dist/esm-es5/pds-tooltip.entry.js +1 -1
  216. package/dist/esm-es5/pine-core.js +1 -1
  217. package/dist/pine-core/p-02805a93.system.entry.js +1 -0
  218. package/dist/pine-core/{p-571d6bef.system.entry.js → p-076aaa00.system.entry.js} +1 -1
  219. package/dist/pine-core/p-0a09ccbe.entry.js +1 -0
  220. package/dist/pine-core/p-0a4f2d5f.system.entry.js +1 -0
  221. package/dist/pine-core/p-12154189.system.entry.js +1 -0
  222. package/dist/pine-core/p-1482053d.entry.js +1 -0
  223. package/dist/pine-core/{p-44f58d33.system.entry.js → p-1deded6e.system.entry.js} +1 -1
  224. package/dist/pine-core/p-1e87e72a.entry.js +1 -0
  225. package/dist/pine-core/{p-fa81009f.system.entry.js → p-1f20608e.system.entry.js} +1 -1
  226. package/dist/pine-core/{p-27ac77c3.entry.js → p-1fb985bb.entry.js} +1 -1
  227. package/dist/pine-core/{p-855dfc31.system.entry.js → p-20e0d06c.system.entry.js} +1 -1
  228. package/dist/pine-core/p-24fcf841.system.entry.js +1 -0
  229. package/dist/pine-core/{p-c273210a.entry.js → p-292cf8f9.entry.js} +1 -1
  230. package/dist/pine-core/p-2d1cc047.entry.js +1 -0
  231. package/dist/pine-core/{p-002c420f.system.entry.js → p-2ec460e1.system.entry.js} +1 -1
  232. package/dist/pine-core/{p-e0cfb931.system.entry.js → p-2fc127b4.system.entry.js} +1 -1
  233. package/dist/pine-core/p-31679dbc.system.entry.js +1 -0
  234. package/dist/pine-core/{p-d09ae46d.system.entry.js → p-3170d53b.system.entry.js} +1 -1
  235. package/dist/pine-core/{p-0451fdf7.entry.js → p-39ad92fc.entry.js} +1 -1
  236. package/dist/pine-core/{p-974bf0c5.entry.js → p-39c6e6c9.entry.js} +1 -1
  237. package/dist/pine-core/p-3c09f2d4.system.entry.js +1 -0
  238. package/dist/pine-core/{p-d5c1f85e.system.entry.js → p-3c6300a8.system.entry.js} +1 -1
  239. package/dist/pine-core/{p-3ad9bcef.system.entry.js → p-3cece186.system.entry.js} +1 -1
  240. package/dist/pine-core/{p-8a00e32b.system.entry.js → p-3e3b3bf6.system.entry.js} +1 -1
  241. package/dist/pine-core/p-43268325.system.entry.js +1 -0
  242. package/dist/pine-core/{p-52f7115b.entry.js → p-43a1d9d7.entry.js} +1 -1
  243. package/dist/pine-core/{p-13ec2343.entry.js → p-43ef94bc.entry.js} +1 -1
  244. package/dist/pine-core/{p-618ba6d5.system.entry.js → p-464ec4eb.system.entry.js} +1 -1
  245. package/dist/pine-core/{p-ee6f914c.entry.js → p-47708864.entry.js} +1 -1
  246. package/dist/pine-core/{p-ccb889d8.system.entry.js → p-507e831f.system.entry.js} +1 -1
  247. package/dist/pine-core/{p-3fa80c5a.system.entry.js → p-559042b7.system.entry.js} +1 -1
  248. package/dist/pine-core/p-5aa59b20.entry.js +2 -0
  249. package/dist/pine-core/p-5c229a7f.entry.js +1 -0
  250. package/dist/pine-core/{p-5c6c2f79.system.entry.js → p-5c7a72aa.system.entry.js} +1 -1
  251. package/dist/pine-core/{p-71ca8845.system.entry.js → p-5e6e8d4e.system.entry.js} +1 -1
  252. package/dist/pine-core/{p-6a2373d0.system.entry.js → p-606418b7.system.entry.js} +1 -1
  253. package/dist/pine-core/{p-22bfa998.entry.js → p-6254d112.entry.js} +1 -1
  254. package/dist/pine-core/{p-5a2df1e2.entry.js → p-62f75f84.entry.js} +1 -1
  255. package/dist/pine-core/{p-041243ee.system.entry.js → p-69372e72.system.entry.js} +1 -1
  256. package/dist/pine-core/p-69e1a82b.system.entry.js +3 -0
  257. package/dist/pine-core/p-6f82e8dc.system.entry.js +1 -0
  258. package/dist/pine-core/{p-1e3beca4.system.entry.js → p-7153efaf.system.entry.js} +1 -1
  259. package/dist/pine-core/{p-7aca41d9.system.entry.js → p-7803c5b6.system.entry.js} +1 -1
  260. package/dist/pine-core/{p-74e06c8d.system.entry.js → p-78cd9f97.system.entry.js} +1 -1
  261. package/dist/pine-core/{p-edf4e4eb.system.entry.js → p-79598750.system.entry.js} +1 -1
  262. package/dist/pine-core/p-7a7954b2.system.entry.js +1 -0
  263. package/dist/pine-core/{p-3ba36512.system.entry.js → p-7b85115b.system.entry.js} +1 -1
  264. package/dist/pine-core/{p-83eb33d4.entry.js → p-7bac161d.entry.js} +1 -1
  265. package/dist/pine-core/{p-e70c9002.entry.js → p-7d15be6a.entry.js} +1 -1
  266. package/dist/pine-core/{p-621fdce1.entry.js → p-7e065b59.entry.js} +1 -1
  267. package/dist/pine-core/p-809e0506.entry.js +1 -0
  268. package/dist/pine-core/{p-73b81009.entry.js → p-83e8f145.entry.js} +1 -1
  269. package/dist/pine-core/{p-c7c17fe3.system.entry.js → p-85f7428b.system.entry.js} +1 -1
  270. package/dist/pine-core/{p-568bb210.system.entry.js → p-86d12f3c.system.entry.js} +1 -1
  271. package/dist/pine-core/{p-ae840ec4.entry.js → p-87ba6d2b.entry.js} +1 -1
  272. package/dist/pine-core/{p-e48161a5.entry.js → p-8c0040c4.entry.js} +1 -1
  273. package/dist/pine-core/{p-a659cce1.entry.js → p-8c85f53a.entry.js} +1 -1
  274. package/dist/pine-core/{p-20f39b93.system.entry.js → p-8d6fd5a7.system.entry.js} +1 -1
  275. package/dist/pine-core/{p-3f19666c.entry.js → p-92f648ba.entry.js} +1 -1
  276. package/dist/pine-core/{p-e620e492.system.entry.js → p-9374cf48.system.entry.js} +1 -1
  277. package/dist/pine-core/{p-babd0607.system.entry.js → p-9aaee1e9.system.entry.js} +1 -1
  278. package/dist/pine-core/p-B1rytYxP.system.js +1 -0
  279. package/dist/pine-core/p-BuRbS7Hp.js +1 -0
  280. package/dist/pine-core/p-BxIzb-Wc.system.js +1 -0
  281. package/dist/pine-core/{p-CdwliqhD.system.js → p-DVZjHa4_.system.js} +2 -2
  282. package/dist/pine-core/p-NNDTPCWx.js +2 -0
  283. package/dist/pine-core/{p-ba88ff60.system.entry.js → p-a03c12a4.system.entry.js} +1 -1
  284. package/dist/pine-core/p-a07b331a.entry.js +1 -0
  285. package/dist/pine-core/p-a0edb4ad.entry.js +1 -0
  286. package/dist/pine-core/{p-2cc1ec4c.entry.js → p-a9ef5295.entry.js} +1 -1
  287. package/dist/pine-core/p-aa0753e1.entry.js +1 -0
  288. package/dist/pine-core/{p-334b7c30.entry.js → p-ac2775b5.entry.js} +1 -1
  289. package/dist/pine-core/{p-a1750a54.entry.js → p-b0058cb0.entry.js} +1 -1
  290. package/dist/pine-core/p-b0674b8d.entry.js +1 -0
  291. package/dist/pine-core/{p-5f36fafa.system.entry.js → p-b5c760c8.system.entry.js} +1 -1
  292. package/dist/pine-core/{p-3a1b7302.system.entry.js → p-b6812452.system.entry.js} +1 -1
  293. package/dist/pine-core/{p-2b0cb8c4.system.entry.js → p-b89583e7.system.entry.js} +1 -1
  294. package/dist/pine-core/{p-5584a56b.entry.js → p-b9380ce8.entry.js} +1 -1
  295. package/dist/pine-core/{p-7a4da839.entry.js → p-bf759fc0.entry.js} +1 -1
  296. package/dist/pine-core/{p-791d357a.entry.js → p-c1932447.entry.js} +1 -1
  297. package/dist/pine-core/{p-cce83ef0.entry.js → p-c2688710.entry.js} +1 -1
  298. package/dist/pine-core/{p-46de2438.entry.js → p-c35fe2e2.entry.js} +1 -1
  299. package/dist/pine-core/{p-ef71710b.system.entry.js → p-c3748812.system.entry.js} +2 -2
  300. package/dist/pine-core/{p-59a5dd77.system.entry.js → p-c52ad43b.system.entry.js} +1 -1
  301. package/dist/pine-core/p-c625d5ea.system.entry.js +1 -0
  302. package/dist/pine-core/{p-25f8690f.entry.js → p-caf73216.entry.js} +1 -1
  303. package/dist/pine-core/{p-587a15ee.system.entry.js → p-cf389430.system.entry.js} +1 -1
  304. package/dist/pine-core/{p-ae2b466a.system.entry.js → p-d00f54f0.system.entry.js} +1 -1
  305. package/dist/pine-core/{p-7874fe2b.entry.js → p-d037308b.entry.js} +1 -1
  306. package/dist/pine-core/{p-52e9ec4f.entry.js → p-d281464e.entry.js} +1 -1
  307. package/dist/pine-core/{p-04f8b32a.entry.js → p-d70201bb.entry.js} +1 -1
  308. package/dist/pine-core/{p-9865431f.system.entry.js → p-d9cb26fe.system.entry.js} +1 -1
  309. package/dist/pine-core/{p-44388b8f.system.entry.js → p-dc460e2d.system.entry.js} +1 -1
  310. package/dist/pine-core/{p-01dba061.entry.js → p-dcc4ee5e.entry.js} +1 -1
  311. package/dist/pine-core/{p-f366f064.entry.js → p-def5d3d3.entry.js} +1 -1
  312. package/dist/pine-core/p-dfa70d20.entry.js +1 -0
  313. package/dist/pine-core/{p-c3a99f39.entry.js → p-eb42ca18.entry.js} +1 -1
  314. package/dist/pine-core/{p-59c60e5b.entry.js → p-ebe218f8.entry.js} +1 -1
  315. package/dist/pine-core/{p-889fce8a.entry.js → p-ec2c0e57.entry.js} +2 -2
  316. package/dist/pine-core/{p-fb68e503.system.entry.js → p-eed4b552.system.entry.js} +1 -1
  317. package/dist/pine-core/p-f6d1469d.entry.js +1 -0
  318. package/dist/pine-core/p-fb17773a.system.entry.js +1 -0
  319. package/dist/pine-core/p-fef6694d.entry.js +1 -0
  320. package/dist/pine-core/{p-0bf56f61.entry.js → p-ff1e9a32.entry.js} +1 -1
  321. package/dist/pine-core/p-ff3399ed.entry.js +1 -0
  322. package/dist/pine-core/pine-core.css +1 -1
  323. package/dist/pine-core/pine-core.esm.js +1 -1
  324. package/dist/pine-core/pine-core.js +1 -1
  325. package/dist/types/components/pds-avatar/pds-avatar.d.ts +25 -0
  326. package/dist/types/components/pds-button/pds-button.d.ts +1 -1
  327. package/dist/types/components/pds-combobox/pds-combobox.d.ts +14 -0
  328. package/dist/types/components/pds-link/pds-link.d.ts +7 -0
  329. package/dist/types/components/pds-modal/pds-modal.d.ts +10 -0
  330. package/dist/types/components/pds-select/pds-select.d.ts +1 -0
  331. package/dist/types/components/pds-tabs/pds-tab/pds-tab.d.ts +42 -0
  332. package/dist/types/components/pds-tabs/pds-tabpanel/pds-tabpanel.d.ts +5 -0
  333. package/dist/types/components/pds-tabs/pds-tabs.d.ts +25 -2
  334. package/dist/types/components.d.ts +172 -5
  335. package/dist/types/utils/form.d.ts +4 -1
  336. package/dist/vscode.html-data.json +10909 -0
  337. package/hydrate/index.js +291 -65
  338. package/hydrate/index.mjs +291 -65
  339. package/package.json +2 -2
  340. package/dist/esm-es5/form-C3xDZBme.js +0 -1
  341. package/dist/pine-core/p-003f91b1.system.entry.js +0 -1
  342. package/dist/pine-core/p-006398c3.system.entry.js +0 -1
  343. package/dist/pine-core/p-1f4910b0.system.entry.js +0 -1
  344. package/dist/pine-core/p-2af1d1d3.system.entry.js +0 -1
  345. package/dist/pine-core/p-3876b9be.entry.js +0 -1
  346. package/dist/pine-core/p-4abec102.system.entry.js +0 -3
  347. package/dist/pine-core/p-4e49712d.entry.js +0 -1
  348. package/dist/pine-core/p-63e0d4a5.system.entry.js +0 -1
  349. package/dist/pine-core/p-65fb166c.system.entry.js +0 -1
  350. package/dist/pine-core/p-6c5aacad.entry.js +0 -1
  351. package/dist/pine-core/p-7247fb4f.entry.js +0 -2
  352. package/dist/pine-core/p-73dd2a2b.entry.js +0 -1
  353. package/dist/pine-core/p-7520a715.system.entry.js +0 -1
  354. package/dist/pine-core/p-7766e970.entry.js +0 -1
  355. package/dist/pine-core/p-7b954dbf.entry.js +0 -1
  356. package/dist/pine-core/p-8065c732.entry.js +0 -1
  357. package/dist/pine-core/p-835d9f18.system.entry.js +0 -1
  358. package/dist/pine-core/p-B1u-QvFn.system.js +0 -1
  359. package/dist/pine-core/p-C3xDZBme.js +0 -1
  360. package/dist/pine-core/p-C61CFP22.system.js +0 -1
  361. package/dist/pine-core/p-CaRgVPt7.js +0 -2
  362. package/dist/pine-core/p-a982ac91.system.entry.js +0 -1
  363. package/dist/pine-core/p-ab957ace.system.entry.js +0 -1
  364. package/dist/pine-core/p-af48e6ae.entry.js +0 -1
  365. package/dist/pine-core/p-b1b317a5.entry.js +0 -1
  366. package/dist/pine-core/p-bdf18687.entry.js +0 -1
  367. package/dist/pine-core/p-db1572a3.entry.js +0 -1
  368. package/dist/pine-core/p-e291db30.entry.js +0 -1
  369. package/dist/pine-core/p-e77c5c08.system.entry.js +0 -1
  370. package/dist/pine-core/p-f2cf8e76.entry.js +0 -1
  371. package/dist/pine-core/p-fda3f3c6.entry.js +0 -1
  372. /package/dist/esm-es5/{index-D4ys0pep.js → index-BjlFq0VD.js} +0 -0
  373. /package/dist/pine-core/{p-D4ys0pep.js → p-BjlFq0VD.js} +0 -0
  374. /package/dist/pine-core/{p-C62JIZmE.system.js → p-WYNNo1N0.system.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { h, Host } from "@stencil/core";
2
- import { isSpecTest } from "../../utils/form";
2
+ import { assignDescription, isSpecTest, messageId } from "../../utils/form";
3
3
  import { autoUpdate, computePosition, flip, offset, shift } from "@floating-ui/dom";
4
4
  import { debounceEvent } from "../../utils/utils";
5
5
  import DOMPurify from "dompurify";
@@ -1450,6 +1450,19 @@ export class PdsCombobox {
1450
1450
  ,
1451
1451
  large: chipProps.large, icon: chipProps.icon, dot: chipProps.dot, class: "pds-combobox__option-chip" }, this.getOptionLabel(option)));
1452
1452
  }
1453
+ // Mirrors pds-multiselect and pds-select: an error message on its own puts the
1454
+ // field in an invalid state, so assistive tech agrees with the visual treatment.
1455
+ isInvalid() {
1456
+ return Boolean(this.invalid) || Boolean(this.errorMessage);
1457
+ }
1458
+ renderMessages() {
1459
+ const hasErrorMessage = Boolean(this.errorMessage);
1460
+ const showHelperMessage = Boolean(this.helperMessage) && !hasErrorMessage;
1461
+ return [
1462
+ showHelperMessage && (h("p", { class: "pds-combobox__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)),
1463
+ hasErrorMessage && (h("p", { class: "pds-combobox__error", id: messageId(this.componentId, 'error'), "aria-live": "assertive" }, h("pds-icon", { icon: "danger", size: "small", "aria-hidden": "true" }), this.errorMessage)),
1464
+ ];
1465
+ }
1453
1466
  render() {
1454
1467
  const triggerClass = [
1455
1468
  'pds-combobox__button-trigger',
@@ -1458,10 +1471,13 @@ export class PdsCombobox {
1458
1471
  ]
1459
1472
  .filter(Boolean)
1460
1473
  .join(' ');
1461
- return (h(Host, { key: '3de5711e53460545e3cb962d446880a99edcd44c', "aria-disabled": this.disabled ? 'true' : null }, h("div", { key: 'cce16999fc6be08b99a113ae58cb2be0fbe9c577', class: "pds-combobox", tabIndex: -1, onFocusout: this.onComboboxFocusOut, part: "combobox" }, this.label && !this.hideLabel && (h("label", { key: '355650eba712d6c91694752daed4cf18008a920d', htmlFor: this.componentId, class: "pds-combobox__label" }, this.label)), this.trigger === 'input' ? (h("div", { class: "pds-combobox__input-wrapper", style: { width: this.triggerWidth } }, h("input", { ref: el => {
1474
+ return (h(Host, { key: '115a28c139b06d852de925536a7345958730265b', "aria-disabled": this.disabled ? 'true' : null }, h("div", { key: 'b0ede014fa6bfda054aa641556afa82c8240be52', class: "pds-combobox", tabIndex: -1, onFocusout: this.onComboboxFocusOut, part: "combobox" }, this.label && !this.hideLabel && (h("label", { key: 'befefbc617146f1b5f896988608a6a57f6ff826c', htmlFor: this.componentId, class: "pds-combobox__label" }, this.label)), this.trigger === 'input' ? (h("div", { class: "pds-combobox__input-wrapper", style: { width: this.triggerWidth } }, h("input", { ref: el => {
1462
1475
  this.inputEl = el;
1463
1476
  this.triggerEl = el;
1464
- }, class: "pds-combobox__input", type: "text", role: "combobox", "aria-autocomplete": "list", "aria-controls": this.listboxId, "aria-activedescendant": this.isOpen && this.highlightedIndex >= 0 ? this.optionDomId(this.highlightedIndex) : undefined, "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: "combobox", "aria-haspopup": "listbox", "aria-controls": this.listboxId, "aria-activedescendant": this.isOpen && this.highlightedIndex >= 0 ? this.optionDomId(this.highlightedIndex) : undefined, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.hideLabel ? this.label : undefined, 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: "combobox", "aria-haspopup": "listbox", "aria-controls": this.listboxId, "aria-activedescendant": this.isOpen && this.highlightedIndex >= 0 ? this.optionDomId(this.highlightedIndex) : undefined, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.hideLabel ? this.label : undefined, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, ref: el => (this.triggerEl = el), part: "button-trigger" }, this.renderButtonTriggerContent())), h("div", { key: '87ffd9a2472b7459343daf4c0f7d46f260365180', style: { display: 'none' } }, h("slot", { key: 'fd0e21c876fbf21761ad63c9529a304912aecd1d', onSlotchange: () => this.updateOptions() })), this.renderDropdown())));
1477
+ }, class: {
1478
+ 'pds-combobox__input': true,
1479
+ 'pds-combobox__input--invalid': this.isInvalid(),
1480
+ }, type: "text", role: "combobox", "aria-autocomplete": "list", "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.isOpen && this.highlightedIndex >= 0 ? this.optionDomId(this.highlightedIndex) : undefined, "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: "combobox", "aria-haspopup": "listbox", "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.isOpen && this.highlightedIndex >= 0 ? this.optionDomId(this.highlightedIndex) : undefined, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.hideLabel ? this.label : undefined, 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: "combobox", "aria-haspopup": "listbox", "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.isOpen && this.highlightedIndex >= 0 ? this.optionDomId(this.highlightedIndex) : undefined, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.hideLabel ? this.label : undefined, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, ref: el => (this.triggerEl = el), part: "button-trigger" }, this.renderButtonTriggerContent())), this.renderMessages(), h("div", { key: '5458993624cf3b2cd70026001a289cb3328b955e', style: { display: 'none' } }, h("slot", { key: '03178355e67f7347f832725d26fafe6281bd2541', onSlotchange: () => this.updateOptions() })), this.renderDropdown())));
1465
1481
  }
1466
1482
  static get is() { return "pds-combobox"; }
1467
1483
  static get encapsulation() { return "shadow"; }
@@ -1582,6 +1598,25 @@ export class PdsCombobox {
1582
1598
  "attribute": "disabled",
1583
1599
  "defaultValue": "false"
1584
1600
  },
1601
+ "errorMessage": {
1602
+ "type": "string",
1603
+ "mutable": false,
1604
+ "complexType": {
1605
+ "original": "string",
1606
+ "resolved": "string",
1607
+ "references": {}
1608
+ },
1609
+ "required": false,
1610
+ "optional": true,
1611
+ "docs": {
1612
+ "tags": [],
1613
+ "text": "Error message to display."
1614
+ },
1615
+ "getter": false,
1616
+ "setter": false,
1617
+ "reflect": false,
1618
+ "attribute": "error-message"
1619
+ },
1585
1620
  "dropdownPlacement": {
1586
1621
  "type": "string",
1587
1622
  "mutable": false,
@@ -1651,6 +1686,25 @@ export class PdsCombobox {
1651
1686
  "attribute": "dropdown-mount",
1652
1687
  "defaultValue": "'host'"
1653
1688
  },
1689
+ "helperMessage": {
1690
+ "type": "string",
1691
+ "mutable": false,
1692
+ "complexType": {
1693
+ "original": "string",
1694
+ "resolved": "string",
1695
+ "references": {}
1696
+ },
1697
+ "required": false,
1698
+ "optional": true,
1699
+ "docs": {
1700
+ "tags": [],
1701
+ "text": "Helper message to display below the combobox."
1702
+ },
1703
+ "getter": false,
1704
+ "setter": false,
1705
+ "reflect": false,
1706
+ "attribute": "helper-message"
1707
+ },
1654
1708
  "hideLabel": {
1655
1709
  "type": "boolean",
1656
1710
  "mutable": false,
@@ -1671,6 +1725,25 @@ export class PdsCombobox {
1671
1725
  "attribute": "hide-label",
1672
1726
  "defaultValue": "false"
1673
1727
  },
1728
+ "invalid": {
1729
+ "type": "boolean",
1730
+ "mutable": false,
1731
+ "complexType": {
1732
+ "original": "boolean",
1733
+ "resolved": "boolean",
1734
+ "references": {}
1735
+ },
1736
+ "required": false,
1737
+ "optional": true,
1738
+ "docs": {
1739
+ "tags": [],
1740
+ "text": "If true, the combobox is in an invalid state."
1741
+ },
1742
+ "getter": false,
1743
+ "setter": false,
1744
+ "reflect": false,
1745
+ "attribute": "invalid"
1746
+ },
1674
1747
  "label": {
1675
1748
  "type": "string",
1676
1749
  "mutable": false,
@@ -10,7 +10,10 @@ export default {
10
10
  dropdownPlacement: 'bottom-start',
11
11
  dropdownMount: 'host',
12
12
  dropdownWidth: '236px',
13
+ errorMessage: null,
14
+ helperMessage: null,
13
15
  hideLabel: false,
16
+ invalid: false,
14
17
  maxHeight: null,
15
18
  mode: 'filter',
16
19
  trigger: 'input',
@@ -38,7 +41,10 @@ const BaseTemplate = (args) => html`
38
41
  dropdown-placement=${args.dropdownPlacement}
39
42
  dropdown-mount=${args.dropdownMount}
40
43
  dropdown-width=${args.dropdownWidth}
44
+ error-message=${args.errorMessage}
45
+ helper-message=${args.helperMessage}
41
46
  hide-label=${args.hideLabel}
47
+ invalid=${args.invalid}
42
48
  max-height=${args.maxHeight}
43
49
  label=${args.label}
44
50
  placeholder=${args.placeholder}
@@ -70,6 +76,25 @@ Default.args = {
70
76
  value: 'panda',
71
77
  };
72
78
 
79
+ export const HelperMessage = BaseTemplate.bind();
80
+ HelperMessage.args = {
81
+ componentId: 'combobox-helper-story',
82
+ name: 'favoriteAnimal',
83
+ label: 'Favorite Animal',
84
+ placeholder: 'placeholder_text',
85
+ helperMessage: 'Start typing to filter the list.',
86
+ };
87
+
88
+ export const ErrorMessage = BaseTemplate.bind();
89
+ ErrorMessage.args = {
90
+ componentId: 'combobox-error-story',
91
+ name: 'favoriteAnimal',
92
+ label: 'Favorite Animal',
93
+ placeholder: 'placeholder_text',
94
+ errorMessage: 'Please choose an animal.',
95
+ invalid: true,
96
+ };
97
+
73
98
  export const ButtonTrigger = BaseTemplate.bind();
74
99
  ButtonTrigger.args = {
75
100
  componentId: 'combobox-button-trigger-story',
@@ -289,7 +289,7 @@ export class PdsInput {
289
289
  return (h(Host, { key: 'ecf4cc212e5c3ebc18082b790803e6b2ccb8ca77', "aria-disabled": this.disabled ? 'true' : null, "aria-readonly": this.readonly ? 'true' : null, "has-prefix": this.hasPrefix ? 'true' : null, "has-suffix": this.hasSuffix ? 'true' : null, "has-prepend": this.hasPrepend ? 'true' : null, "has-append": this.hasAppend ? 'true' : null, "has-action": this.hasAction && !this.hideLabel ? 'true' : null, "full-width": this.fullWidth ? 'true' : null }, h("div", { key: 'acdf92a30068fc04a17816ec6d85295b47e512ee', class: "pds-input" }, label && (h("div", { key: '4569f0b3761db89e85a090eff6af1c47cb562115', class: {
290
290
  'pds-input__label-wrapper': true,
291
291
  'visually-hidden': this.hideLabel,
292
- } }, h("label", { key: '90b0a863d78115fa158429db11548fc2a9ee5ae6', htmlFor: componentId, class: "pds-input__label" }, h("span", { key: '3d440aaafc4daeffe45152cd23d27472d7ebf85a' }, label, this.required && h("span", { key: 'c7bf6ef6191e961a106b8885cab604aa89730eba', class: "pds-input__required-indicator" }, " *"))), !this.hideLabel && this.renderAction())), h("div", { key: '81f0b8a347bc9a06c753b9f31f5e30ac78e45adb', class: inputWrapperClasses }, this.renderPrepend(), this.renderPrefix(), h("input", Object.assign({ key: '3785b396bf9174766973e8b19028e4dcecde19d9', ref: (input) => (this.nativeInput = input), class: "pds-input__field", "aria-describedby": assignDescription(componentId, invalid, helperMessage), "aria-invalid": invalid ? "true" : undefined, autocomplete: this.autocomplete, disabled: disabled, id: componentId, max: this.max, maxlength: this.maxlength, min: this.min, minlength: this.minlength, name: this.name, pattern: this.pattern, placeholder: this.placeholder, readOnly: this.readonly, required: this.required, step: this.step, type: this.type, value: value, onInput: this.onInputEvent, onChange: this.onChangeEvent, onBlur: this.onBlurEvent, onFocus: this.onFocusEvent, onKeyDown: this.onKeyDownEvent, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd }, this.inheritedAttributes)), this.renderSuffix(), this.renderAppend()), helperMessage && (h("p", { key: 'e9e4aa936346811e0a5ca0fa5107f548b52fcc99', class: "pds-input__helper-message", id: messageId(componentId, 'helper') }, helperMessage)), errorMessage && (h("p", { key: 'ef3694246fa3d8f818da438e7ec4411dd56b084c', class: "pds-input__error-message", id: messageId(componentId, 'error') }, h("pds-icon", { key: 'f1e488b33c8338f54cd83a59e219311a844e3c97', "aria-hidden": "true", icon: danger, size: "small" }), errorMessage)))));
292
+ } }, h("label", { key: '90b0a863d78115fa158429db11548fc2a9ee5ae6', htmlFor: componentId, class: "pds-input__label" }, h("span", { key: '3d440aaafc4daeffe45152cd23d27472d7ebf85a' }, label, this.required && h("span", { key: 'c7bf6ef6191e961a106b8885cab604aa89730eba', class: "pds-input__required-indicator" }, " *"))), !this.hideLabel && this.renderAction())), h("div", { key: '81f0b8a347bc9a06c753b9f31f5e30ac78e45adb', class: inputWrapperClasses }, this.renderPrepend(), this.renderPrefix(), h("input", Object.assign({ key: '41ed8dab6f7c71c6c382627ca4dc48bb95c1161d', ref: (input) => (this.nativeInput = input), class: "pds-input__field", "aria-describedby": assignDescription(componentId, invalid, helperMessage, errorMessage), "aria-invalid": invalid ? "true" : undefined, autocomplete: this.autocomplete, disabled: disabled, id: componentId, max: this.max, maxlength: this.maxlength, min: this.min, minlength: this.minlength, name: this.name, pattern: this.pattern, placeholder: this.placeholder, readOnly: this.readonly, required: this.required, step: this.step, type: this.type, value: value, onInput: this.onInputEvent, onChange: this.onChangeEvent, onBlur: this.onBlurEvent, onFocus: this.onFocusEvent, onKeyDown: this.onKeyDownEvent, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd }, this.inheritedAttributes)), this.renderSuffix(), this.renderAppend()), helperMessage && (h("p", { key: '4791ddeb01b758a94a2fddfec6093b9b39eefafa', class: "pds-input__helper-message", id: messageId(componentId, 'helper') }, helperMessage)), errorMessage && (h("p", { key: 'd0a22ae4b0e400e1d5df55e35c0aaaa5c5ea3ab7', class: "pds-input__error-message", id: messageId(componentId, 'error') }, h("pds-icon", { key: '69975cdcc15e5ab6df9e2c354977e2c6dae18f6e', "aria-hidden": "true", icon: danger, size: "small" }), errorMessage)))));
293
293
  }
294
294
  static get is() { return "pds-input"; }
295
295
  static get encapsulation() { return "shadow"; }
@@ -70,4 +70,14 @@
70
70
  .pds-link--plain:hover {
71
71
  color: var(--color, var(--pds-context-link-color-hover, var(--pine-color-text-hover)));
72
72
  text-decoration: underline;
73
+ }
74
+
75
+ :host([active]) .pds-link {
76
+ color: var(--pds-context-link-color, var(--pine-color-text-strong));
77
+ text-decoration: underline;
78
+ }
79
+
80
+ :host([active]) .pds-link:hover {
81
+ color: var(--pds-context-link-color-hover, var(--pine-color-text-strong));
82
+ text-decoration: underline;
73
83
  }
@@ -7,6 +7,13 @@ import { launch } from "@pine-ds/icons/icons";
7
7
  */
8
8
  export class PdsLink {
9
9
  constructor() {
10
+ /**
11
+ * Marks the link as the current/active navigation item — for tab strips and
12
+ * nav rails built from links. Applies the active treatment (persistent
13
+ * underline + strong text) and sets `aria-current="page"`.
14
+ * @defaultValue false
15
+ */
16
+ this.active = false;
10
17
  /**
11
18
  * Determines whether the link should open in a new tab.
12
19
  * @defaultValue false
@@ -49,8 +56,8 @@ export class PdsLink {
49
56
  const targetValue = this.target || (this.external ? '_blank' : undefined);
50
57
  const showExternalIcon = this.external;
51
58
  const relValue = targetValue === '_blank' ? 'noopener noreferrer' : undefined;
52
- return (h("a", { key: '314a6249f39716ab2e632c2cb4c588ce2c74a77b', class: this.classNames(), download: this.download, href: this.href, id: this.componentId, part: "link", target: targetValue, rel: relValue, style: this.setLinkStyles(), "data-turbo": this.turbo || undefined, "data-turbo-frame": this.turboFrame || undefined, "data-turbo-action": this.turboAction || undefined, "data-turbo-method": this.turboMethod || undefined, "data-turbo-confirm": this.turboConfirm || undefined, "data-turbo-stream": this.turboStream || undefined, "data-turbo-prefetch": this.turboPrefetch || undefined, "data-turbo-preload": this.turboPreload || undefined }, h("slot", { key: 'ceab5601c349ece4b142f16f682d5a2d2d0ba59a' }, this.href), showExternalIcon &&
53
- h("pds-icon", { key: 'cba3137af21eb374c8318e43e279e77fefdc1b5c', icon: launch, size: this.fontSize })));
59
+ return (h("a", { key: '5d0c5a0a5b8b80a8cdff802a3d78dad85a9ccdc4', class: this.classNames(), download: this.download, href: this.href, id: this.componentId, part: "link", "aria-current": this.active ? 'page' : undefined, target: targetValue, rel: relValue, style: this.setLinkStyles(), "data-turbo": this.turbo || undefined, "data-turbo-frame": this.turboFrame || undefined, "data-turbo-action": this.turboAction || undefined, "data-turbo-method": this.turboMethod || undefined, "data-turbo-confirm": this.turboConfirm || undefined, "data-turbo-stream": this.turboStream || undefined, "data-turbo-prefetch": this.turboPrefetch || undefined, "data-turbo-preload": this.turboPreload || undefined }, h("slot", { key: '06b7be14d867eae1b7acba8570f1e94bdf840fbb' }, this.href), showExternalIcon &&
60
+ h("pds-icon", { key: '678414f7d20fd20b6931cc401163180c3ad0094c', icon: launch, size: this.fontSize })));
54
61
  }
55
62
  static get is() { return "pds-link"; }
56
63
  static get encapsulation() { return "shadow"; }
@@ -66,6 +73,29 @@ export class PdsLink {
66
73
  }
67
74
  static get properties() {
68
75
  return {
76
+ "active": {
77
+ "type": "boolean",
78
+ "mutable": false,
79
+ "complexType": {
80
+ "original": "boolean",
81
+ "resolved": "boolean",
82
+ "references": {}
83
+ },
84
+ "required": false,
85
+ "optional": false,
86
+ "docs": {
87
+ "tags": [{
88
+ "name": "defaultValue",
89
+ "text": "false"
90
+ }],
91
+ "text": "Marks the link as the current/active navigation item \u2014 for tab strips and\nnav rails built from links. Applies the active treatment (persistent\nunderline + strong text) and sets `aria-current=\"page\"`."
92
+ },
93
+ "getter": false,
94
+ "setter": false,
95
+ "reflect": true,
96
+ "attribute": "active",
97
+ "defaultValue": "false"
98
+ },
69
99
  "color": {
70
100
  "type": "string",
71
101
  "mutable": false,
@@ -58,3 +58,17 @@ WithoutCustomTextInSlot.args = {
58
58
  fontSize: 'lg',
59
59
  variant: 'inline'
60
60
  };
61
+
62
+ // A per-URL tab strip built from links (pds-tabs is an in-page panel switcher,
63
+ // not navigation). `active` marks the current destination — persistent underline
64
+ // + strong text, and `aria-current="page"`, which is the correct ARIA token for
65
+ // links that navigate to distinct pages.
66
+ export const NavTabs = {
67
+ render: () => html`
68
+ <nav aria-label="Club sections" style="display: flex; gap: var(--pine-dimension-md);">
69
+ <pds-link href="/clubs/1/chat" font-size="md" ?active=${true}>Chat</pds-link>
70
+ <pds-link href="/clubs/1/resources" font-size="md" variant="plain">Resources</pds-link>
71
+ <pds-link href="/clubs/1/members" font-size="md" variant="plain">Members</pds-link>
72
+ </nav>
73
+ `,
74
+ };
@@ -22,6 +22,16 @@ export class PdsModal {
22
22
  * @default true
23
23
  */
24
24
  this.scrollable = true;
25
+ /**
26
+ * Whether the modal opens outside the browser top layer as a non-modal dialog.
27
+ * When `true` it opens with `dialog.show()` instead of `dialog.showModal()`, so
28
+ * overlays rendered elsewhere in the DOM (file pickers, editor menus) can display
29
+ * above it via `z-index`. The page is not made inert and focus is not trapped in
30
+ * this mode. Read when the modal opens; changing it while the modal is open is
31
+ * not supported.
32
+ * @default false
33
+ */
34
+ this.disableTopLayer = false;
25
35
  /**
26
36
  * Stores the list of focusable elements in the modal
27
37
  */
@@ -43,6 +53,13 @@ export class PdsModal {
43
53
  return;
44
54
  // Handle Escape key to close the modal
45
55
  if (e.key === 'Escape') {
56
+ // In non-top-layer mode, focus can move into an overlay stacked above the
57
+ // modal (the reason disableTopLayer exists). If that overlay owns focus,
58
+ // leave Escape to it rather than dismissing this modal out from under it.
59
+ const active = document.activeElement;
60
+ if (this.disableTopLayer && active && active !== document.body && !this.el.contains(active)) {
61
+ return;
62
+ }
46
63
  // Always prevent native dialog close behavior
47
64
  e.preventDefault();
48
65
  // Only close if backdropDismiss is enabled and this is the innermost modal
@@ -53,6 +70,11 @@ export class PdsModal {
53
70
  }
54
71
  // Handle Tab key for focus trapping
55
72
  if (e.key === 'Tab') {
73
+ // In non-top-layer mode the modal is deliberately not focus-isolated: focus
74
+ // must be able to leave it into overlays stacked above (the whole point of
75
+ // disableTopLayer), so do not trap Tab here.
76
+ if (this.disableTopLayer)
77
+ return;
56
78
  // If there are no focusable elements, do nothing
57
79
  if (this.focusableElements.length === 0)
58
80
  return;
@@ -170,8 +192,16 @@ export class PdsModal {
170
192
  try {
171
193
  // Store the currently focused element to restore focus when modal closes
172
194
  this.previousActiveElement = document.activeElement;
173
- // Use native dialog showModal method which makes the rest of the page inert
174
- this.modalRef.showModal();
195
+ // showModal() promotes the dialog to the browser top layer (and makes the
196
+ // rest of the page inert), which prevents any overlay outside the dialog
197
+ // from ever painting above it. show() opens a non-modal dialog that stays
198
+ // in the normal stacking context so those overlays can stack above it.
199
+ if (this.disableTopLayer) {
200
+ this.modalRef.show();
201
+ }
202
+ else {
203
+ this.modalRef.showModal();
204
+ }
175
205
  this.open = true;
176
206
  // Update focusable elements and set initial focus
177
207
  // Using a longer timeout to ensure all components are fully rendered
@@ -233,14 +263,14 @@ export class PdsModal {
233
263
  return thisZIndex === maxZIndex;
234
264
  }
235
265
  render() {
236
- return (h("dialog", { key: 'cf2710a889d8f0e80a3551088ab38a88dc44ad1e', class: {
266
+ return (h("dialog", { key: 'd345ea0a585213fd7879a2fe27071705fbdba79b', class: {
237
267
  'pds-modal__backdrop': true,
238
268
  'open': this.open
239
- }, "aria-modal": "true", "aria-labelledby": `${this.componentId}-heading`, onClick: this.handleBackdropClick }, h("div", { key: 'a06d017153e67ad38bc1ced56ba22aeade977aaf', class: {
269
+ }, "aria-modal": this.disableTopLayer ? 'false' : 'true', "aria-labelledby": `${this.componentId}-heading`, onClick: this.handleBackdropClick }, h("div", { key: '34c9a222d58ffd9736a36ab6848679186167e878', class: {
240
270
  'pds-modal': true,
241
271
  [`pds-modal--${this.size}`]: true,
242
272
  'pds-modal--scrollable': this.scrollable
243
- }, part: "modal" }, h("slot", { key: 'd995c586809a4940c091912244a86cb4605a961c' }))));
273
+ }, part: "modal" }, h("slot", { key: '4eef9c3001b6a7c972fa8e49fa3f0b140c7fe7ce' }))));
244
274
  }
245
275
  static get is() { return "pds-modal"; }
246
276
  static get originalStyleUrls() {
@@ -365,6 +395,29 @@ export class PdsModal {
365
395
  "reflect": false,
366
396
  "attribute": "scrollable",
367
397
  "defaultValue": "true"
398
+ },
399
+ "disableTopLayer": {
400
+ "type": "boolean",
401
+ "mutable": false,
402
+ "complexType": {
403
+ "original": "boolean",
404
+ "resolved": "boolean",
405
+ "references": {}
406
+ },
407
+ "required": false,
408
+ "optional": false,
409
+ "docs": {
410
+ "tags": [{
411
+ "name": "default",
412
+ "text": "false"
413
+ }],
414
+ "text": "Whether the modal opens outside the browser top layer as a non-modal dialog.\nWhen `true` it opens with `dialog.show()` instead of `dialog.showModal()`, so\noverlays rendered elsewhere in the DOM (file pickers, editor menus) can display\nabove it via `z-index`. The page is not made inert and focus is not trapped in\nthis mode. Read when the modal opens; changing it while the modal is open is\nnot supported."
415
+ },
416
+ "getter": false,
417
+ "setter": false,
418
+ "reflect": false,
419
+ "attribute": "disable-top-layer",
420
+ "defaultValue": "false"
368
421
  }
369
422
  };
370
423
  }
@@ -8,6 +8,7 @@ export default {
8
8
  args: {
9
9
  backdropDismiss: true,
10
10
  componentId: 'modal-demo',
11
+ disableTopLayer: false,
11
12
  open: false,
12
13
  scrollable: true,
13
14
  size: 'md',
@@ -26,6 +27,7 @@ const BaseTemplate = (args) => html`
26
27
  component-id="${args.componentId}"
27
28
  size="${args.size}"
28
29
  ?backdrop-dismiss=${args.backdropDismiss}
30
+ ?disable-top-layer=${args.disableTopLayer}
29
31
  scrollable="${args.scrollable}"
30
32
  ?open=${args.open}
31
33
  key="${args.scrollable ? 'scrollable' : 'non-scrollable'}"
@@ -652,3 +654,78 @@ export const CustomBorders = CustomBordersTemplate.bind({});
652
654
  CustomBorders.args = {
653
655
  componentId: 'custom-borders-modal',
654
656
  };
657
+
658
+ // Demonstrates `disable-top-layer`: the modal opens as a non-modal dialog
659
+ // (dialog.show()) so an overlay appended to document.body can display above it.
660
+ // With the default top-layer behavior the same overlay would render behind the
661
+ // modal and be unreachable.
662
+ const DisableTopLayerTemplate = (args) => html`
663
+ <div style="padding: 1rem;">
664
+ <pds-button onClick="document.querySelector('#${args.componentId}').open = true">
665
+ Open Modal (disable-top-layer)
666
+ </pds-button>
667
+
668
+ <pds-modal
669
+ id="${args.componentId}"
670
+ component-id="${args.componentId}"
671
+ size="${args.size}"
672
+ ?backdrop-dismiss=${args.backdropDismiss}
673
+ ?disable-top-layer=${args.disableTopLayer}
674
+ ?open=${args.open}
675
+ >
676
+ <pds-modal-header>
677
+ <pds-box direction="column" fit padding="md">
678
+ <pds-box align-items="center" fit justify-content="space-between">
679
+ <pds-text tag="h2" size="h3">Modal Title</pds-text>
680
+ <pds-button
681
+ class="pds-modal__close"
682
+ variant="unstyled"
683
+ icon-only="true"
684
+ onclick="document.querySelector('#${args.componentId}').open = false"
685
+ aria-label="Close modal"
686
+ part="close-button"
687
+ >
688
+ <pds-icon slot="start" name="remove" aria-hidden="true"></pds-icon>
689
+ </pds-button>
690
+ </pds-box>
691
+ </pds-box>
692
+ </pds-modal-header>
693
+
694
+ <pds-modal-content>
695
+ <pds-box fit direction="column" padding-inline-start="md" padding-inline-end="md" gap="sm">
696
+ <p>
697
+ This modal uses <code>disable-top-layer</code>, so it renders in the normal stacking
698
+ context instead of the browser top layer.
699
+ </p>
700
+ <p>
701
+ An overlay appended to <code>document.body</code> with a higher <code>z-index</code> can
702
+ therefore display above it &mdash; useful for file pickers, rich-text editor menus, and
703
+ other body-mounted overlays that would otherwise be trapped behind a top-layer dialog.
704
+ </p>
705
+ <pds-button
706
+ variant="secondary"
707
+ onclick="(function(){var o=document.createElement('button');o.type='button';o.textContent='Overlay above the modal — focusable, keyboard-dismissable. Click or press Enter.';o.setAttribute('style','position:fixed;inset:auto 2rem 2rem auto;max-width:20rem;padding:1rem;border:0;text-align:start;border-radius:8px;background:#111;color:#fff;z-index:2147483647;cursor:pointer;box-shadow:0 8px 24px rgba(0,0,0,.4)');var modal=document.querySelector('#${args.componentId}');var remove=function(){o.remove()};o.onclick=remove;o.addEventListener('keydown',function(e){if(e.key==='Escape')remove()});if(modal)modal.addEventListener('pdsModalClose',remove,{once:true});document.body.appendChild(o);o.focus();})()"
708
+ >
709
+ Show overlay above modal
710
+ </pds-button>
711
+ </pds-box>
712
+ </pds-modal-content>
713
+
714
+ <pds-modal-footer>
715
+ <pds-box justify-content="end" fit padding="md" gap="sm">
716
+ <pds-button variant="secondary" onclick="document.querySelector('#${args.componentId}').open = false">
717
+ Close
718
+ </pds-button>
719
+ </pds-box>
720
+ </pds-modal-footer>
721
+ </pds-modal>
722
+ </div>
723
+ `;
724
+
725
+ export const DisableTopLayer = DisableTopLayerTemplate.bind({});
726
+ DisableTopLayer.args = {
727
+ componentId: 'disable-top-layer-modal',
728
+ disableTopLayer: true,
729
+ size: 'md',
730
+ open: false,
731
+ };
@@ -291,7 +291,7 @@
291
291
 
292
292
  .pds-multiselect__helper {
293
293
  color: var(--pine-color-text-message);
294
- font: var(--pine-typography-body-sm);
294
+ font: var(--pine-typography-body-sm-medium);
295
295
  margin-block-start: var(--pine-dimension-2xs);
296
296
  margin-inline-start: var(--pine-dimension-none);
297
297
  }
@@ -300,7 +300,7 @@
300
300
  align-items: flex-start;
301
301
  color: var(--pine-color-text-message-danger);
302
302
  display: flex;
303
- font: var(--pine-typography-body-sm);
303
+ font: var(--pine-typography-body-sm-medium);
304
304
  gap: var(--pine-dimension-2xs);
305
305
  margin-block-start: var(--pine-dimension-2xs);
306
306
  margin-inline-start: var(--pine-dimension-none);
@@ -1031,16 +1031,16 @@ export class PdsMultiselect {
1031
1031
  'pds-multiselect__trigger--invalid': this.invalid || !!this.errorMessage,
1032
1032
  'pds-multiselect__trigger--has-value': hasSelections,
1033
1033
  'pds-multiselect__trigger--pill-inline': true,
1034
- }, onClick: this.handleTriggerClick }, this.renderInlinePills(), h("button", { ref: el => (this.triggerEl = el), type: "button", id: this.componentId, part: "pill-toggle", class: "pds-multiselect__pill-toggle", disabled: this.disabled, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-haspopup": "listbox", "aria-labelledby": this.label ? `${this.componentId}-label` : undefined, "aria-required": this.required ? 'true' : undefined, "aria-describedby": assignDescription(this.componentId, this.invalid || !!this.errorMessage, this.errorMessage || this.helperMessage), "aria-invalid": this.invalid || !!this.errorMessage ? 'true' : undefined, onKeyDown: this.handleTriggerKeyDown }, h("pds-icon", { class: "pds-multiselect__icon", icon: enlarge })))) : (h("button", { ref: el => (this.triggerEl = el), type: "button", part: "trigger", class: {
1034
+ }, onClick: this.handleTriggerClick }, this.renderInlinePills(), h("button", { ref: el => (this.triggerEl = el), type: "button", id: this.componentId, part: "pill-toggle", class: "pds-multiselect__pill-toggle", disabled: this.disabled, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-haspopup": "listbox", "aria-labelledby": this.label ? `${this.componentId}-label` : undefined, "aria-required": this.required ? 'true' : undefined, "aria-describedby": assignDescription(this.componentId, this.invalid || !!this.errorMessage, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid || !!this.errorMessage ? 'true' : undefined, onKeyDown: this.handleTriggerKeyDown }, h("pds-icon", { class: "pds-multiselect__icon", icon: enlarge })))) : (h("button", { ref: el => (this.triggerEl = el), type: "button", part: "trigger", class: {
1035
1035
  'pds-multiselect__trigger': true,
1036
1036
  'pds-multiselect__trigger--open': this.isOpen,
1037
1037
  'pds-multiselect__trigger--disabled': this.disabled,
1038
1038
  'pds-multiselect__trigger--invalid': this.invalid || !!this.errorMessage,
1039
1039
  'pds-multiselect__trigger--has-value': hasSelections,
1040
- }, 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.errorMessage || this.helperMessage), "aria-invalid": this.invalid || !!this.errorMessage ? 'true' : undefined, onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeyDown }, h("span", { class: {
1040
+ }, 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: {
1041
1041
  'pds-multiselect__trigger-text': true,
1042
1042
  'pds-multiselect__trigger-text--placeholder': !hasSelections || (this.selectedDisplay === 'pill' && this.pillPosition === 'below'),
1043
- } }, this.getTriggerText()), h("pds-icon", { class: "pds-multiselect__icon", icon: enlarge }))), this.renderDropdown()), this.selectedDisplay === 'pill' && this.pillPosition === 'below' && this.renderBelowPills(), h("span", { key: '973443f9eb29dcf7fb1bde3f9101ac02967a8fd9', class: "visually-hidden", "aria-live": "polite", "aria-atomic": "true" }, this.removalAnnouncement), this.helperMessage && !(this.errorMessage && this.errorMessage.length > 0) && (h("p", { key: '568aab2b278abb7f4426d84ee926b4883375fb11', class: "pds-multiselect__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)), this.errorMessage && (h("p", { key: 'daddf192efd47df8c15267b9896913b926e02544', class: "pds-multiselect__error", id: messageId(this.componentId, 'error') }, h("pds-icon", { key: 'd0c72ab75a8e02e61c09e980ae817790804a776a', icon: danger, size: "small" }), this.errorMessage)), h("div", { key: '0453db2fca10b3573b1dd244875f90c856c8887b', style: { display: 'none' } }, h("slot", { key: 'a612741afc9545e5e50c47d27c3c27c1d7cade3c' })))));
1043
+ } }, this.getTriggerText()), h("pds-icon", { class: "pds-multiselect__icon", icon: enlarge }))), this.renderDropdown()), this.selectedDisplay === 'pill' && this.pillPosition === 'below' && this.renderBelowPills(), h("span", { key: '199804f5352818d32542864e3a61f7a9364cc2e3', class: "visually-hidden", "aria-live": "polite", "aria-atomic": "true" }, this.removalAnnouncement), this.helperMessage && !(this.errorMessage && this.errorMessage.length > 0) && (h("p", { key: 'e6855ff0aaf18f59dced2df5d636cadb4d47427b', class: "pds-multiselect__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)), this.errorMessage && (h("p", { key: '29eae23d8db31b9b9c292d5cd1dc5f641613ed32', class: "pds-multiselect__error", id: messageId(this.componentId, 'error') }, h("pds-icon", { key: 'aad6fd945998957cd28ab6eb97c4d80f0a732ea5', icon: danger, size: "small" }), this.errorMessage)), h("div", { key: '7d0d56a1e097cfc0c7396c1957d16014cb071b1e', style: { display: 'none' } }, h("slot", { key: '6e7fc9dbdab3977248439aa5ea14f13e0f45bbc6' })))));
1044
1044
  }
1045
1045
  static get is() { return "pds-multiselect"; }
1046
1046
  static get encapsulation() { return "shadow"; }
@@ -59,6 +59,9 @@
59
59
  color: var(--pine-color-text-label-disabled);
60
60
  cursor: not-allowed;
61
61
  }
62
+ :host(.has-border):has(input:disabled) label::after {
63
+ cursor: not-allowed;
64
+ }
62
65
  :host(.has-border).is-invalid .pds-radio__message--error {
63
66
  color: var(--pine-color-text-message-danger);
64
67
  }
@@ -255,6 +258,9 @@ label:has(input:disabled) {
255
258
  color: var(--pine-color-text-label-disabled);
256
259
  cursor: not-allowed;
257
260
  }
261
+ :host(.has-image).is-disabled label::after {
262
+ cursor: not-allowed;
263
+ }
258
264
  :host(.has-image).is-disabled .pds-radio__message {
259
265
  color: var(--pine-color-text-label-disabled);
260
266
  }
@@ -80,11 +80,11 @@ export class PdsRadio {
80
80
  }
81
81
  render() {
82
82
  const renderLabelAndMessages = () => [
83
- h("label", { htmlFor: this.componentId, key: `${this.componentId}-label` }, h("input", { key: '75aca490be2db050f66ddd9cb45ce122bea4db53', "aria-describedby": assignDescription(this.componentId, this.invalid, this.helperMessage), "aria-invalid": this.invalid ? "true" : undefined, type: "radio", id: this.componentId, name: this.name, value: this.value, checked: this.checked, required: this.required, disabled: this.disabled, onChange: this.handleRadioChange, class: this.hasImage() ? 'visually-hidden' : '' }), h("span", { key: '1bbc7398d3be35e301526b0f842274a3f1db4457', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)),
83
+ h("label", { htmlFor: this.componentId, key: `${this.componentId}-label` }, h("input", { key: 'ca6cb85ace418259f13b6be404e125d4c1c3a778', "aria-describedby": assignDescription(this.componentId, this.invalid, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid ? "true" : undefined, type: "radio", id: this.componentId, name: this.name, value: this.value, checked: this.checked, required: this.required, disabled: this.disabled, onChange: this.handleRadioChange, class: this.hasImage() ? 'visually-hidden' : '' }), h("span", { key: '968c3dcc6b3e18a177db0570a9104b4755827a3e', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)),
84
84
  this.helperMessage && (h("div", { key: `${this.componentId}-helper`, class: 'pds-radio__message', id: messageId(this.componentId, 'helper') }, this.helperMessage)),
85
- this.errorMessage && (h("div", { key: `${this.componentId}-error`, class: `pds-radio__message pds-radio__message--error`, id: messageId(this.componentId, 'error'), "aria-live": "assertive" }, h("pds-icon", { key: 'e1a1228fa52e68623098f09493d93aa03d2e65c4', icon: danger, size: "small" }), this.errorMessage))
85
+ this.errorMessage && (h("div", { key: `${this.componentId}-error`, class: `pds-radio__message pds-radio__message--error`, id: messageId(this.componentId, 'error'), "aria-live": "assertive" }, h("pds-icon", { key: '2dec1d43ade25a8ff70301fb661174eff5efadeb', icon: danger, size: "small" }), this.errorMessage))
86
86
  ];
87
- return (h(Host, { key: '60fabeef5778fd30e46cfd23d05684e1743bc57f', class: this.classNames() }, this.hasImage() && (h("div", { key: '9ba3e60182a68cc8e996623cf46e17001ff451f6', class: "pds-radio__image-container", part: "image-container" }, h("slot", { key: 'bf8927129eb68ee7ed07a1f8f8727f013254e133', name: "image", onSlotchange: () => (this._hasImage = this.hasImageSlot()) }))), this.hasImage() ? (h("div", { class: "pds-radio__content-wrapper" }, renderLabelAndMessages())) : (renderLabelAndMessages())));
87
+ return (h(Host, { key: '75563601db01d7db2a4c4e74364c0bb2d57ac9ae', class: this.classNames() }, this.hasImage() && (h("div", { key: '120ca4dd9d3828cda49c0f7539f429e2aaa89329', class: "pds-radio__image-container", part: "image-container" }, h("slot", { key: 'a03496e1acc3799740aa20342408de97991cad68', name: "image", onSlotchange: () => (this._hasImage = this.hasImageSlot()) }))), this.hasImage() ? (h("div", { class: "pds-radio__content-wrapper" }, renderLabelAndMessages())) : (renderLabelAndMessages())));
88
88
  }
89
89
  static get is() { return "pds-radio"; }
90
90
  static get encapsulation() { return "scoped"; }
@@ -1,5 +1,5 @@
1
1
  import { Host, h } from "@stencil/core";
2
- import { isSpecTest, messageId, exposeTypeProperty } from "../../utils/form";
2
+ import { assignDescription, isSpecTest, messageId, exposeTypeProperty } from "../../utils/form";
3
3
  import { danger, enlarge } from "@pine-ds/icons/icons";
4
4
  /**
5
5
  * @slot action - Content to be displayed in the label area, typically for help icons or links
@@ -140,6 +140,11 @@ export class PdsSelect {
140
140
  return null;
141
141
  return (h("div", { class: "pds-select__message" }, this.getHelperMessage(), this.getErrorMessage()));
142
142
  }
143
+ // The field also renders as invalid whenever an error message is present, via
144
+ // `select:has(~ .pds-select__message .pds-select__error-message)` in the styles.
145
+ isInvalid() {
146
+ return Boolean(this.invalid) || Boolean(this.errorMessage);
147
+ }
143
148
  classNames() {
144
149
  const classNames = [];
145
150
  if (this.invalid) {
@@ -223,7 +228,7 @@ export class PdsSelect {
223
228
  }
224
229
  render() {
225
230
  const hasAction = this.el.querySelector('[slot="action"]') !== null;
226
- return (h(Host, { key: '71f6bfba3361eaac3459c1b30b23183503b57ae5', "aria-disabled": this.disabled ? 'true' : null, class: this.classNames(), "has-action": hasAction && !this.hideLabel ? 'true' : null }, h("div", { key: 'cbd0059fc405179a59c29f81510d2948e358531c', class: "pds-select" }, !this.hideLabel && (h("div", { key: '87d42d145ec0a46a474bb599e46226efc72d1acb', class: "pds-select__label-wrapper" }, h("label", { key: '23e4b10a8b99023d1779de0eb6c56ff31189dce1', htmlFor: this.componentId }, h("span", { key: 'b655a0850ce9ce173fbd814461df8529c9c150d9', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)), hasAction && this.renderAction())), h("select", { key: 'a9f2cd048cdea6f0a44305a2760c418617d7c0eb', "aria-label": this.hideLabel ? this.label : undefined, autocomplete: this.autocomplete || undefined, class: "pds-select__field", disabled: this.disabled, id: this.componentId, multiple: this.multiple, name: this.name, onBlur: this.onBlur, onChange: this.onSelectUpdate, onFocus: this.onFocus, onKeyDown: this.onKeyDown, part: "select", required: this.required, ref: (el) => (this.selectEl = el) }), h("div", { key: 'cca5b1b634d1d77bc4164cb196fdd1c4ffcb888e', "aria-hidden": "true", class: "hidden", ref: (el) => (this.slotContainer = el) }, h("slot", { key: '018780883212786a89c5e6f776dc8c69853bf732', onSlotchange: this.handleSlotChange })), this.renderMessages(), !this.multiple && h("pds-icon", { key: '10e82ad220b4e9d8d9c0710a14335d5603bd6164', "aria-hidden": "true", class: "pds-select__select-icon", icon: enlarge }))));
231
+ return (h(Host, { key: 'c74f5e86a09bd3fe6e8048ca103ec9aa66a98fc6', "aria-disabled": this.disabled ? 'true' : null, class: this.classNames(), "has-action": hasAction && !this.hideLabel ? 'true' : null }, h("div", { key: '76de23d6b0d9e32fab48e09a8f6ee3211e196115', class: "pds-select" }, !this.hideLabel && (h("div", { key: '1db87074447cbc819e6b06dd89135d018656a471', class: "pds-select__label-wrapper" }, h("label", { key: 'bc28c3b3361a19ee14a1b79edda736340009d87d', htmlFor: this.componentId }, h("span", { key: 'f0828e0e83c7c0d7cf50e08df4b861dad4df9eb9', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)), hasAction && this.renderAction())), h("select", { key: 'd7d254887c976a95ad1f1da2ea540d6d3f986630', "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-label": this.hideLabel ? this.label : undefined, autocomplete: this.autocomplete || undefined, class: "pds-select__field", disabled: this.disabled, id: this.componentId, multiple: this.multiple, name: this.name, onBlur: this.onBlur, onChange: this.onSelectUpdate, onFocus: this.onFocus, onKeyDown: this.onKeyDown, part: "select", required: this.required, ref: (el) => (this.selectEl = el) }), h("div", { key: '793a84d41bd5e18d64757238704a053b1135a83c', "aria-hidden": "true", class: "hidden", ref: (el) => (this.slotContainer = el) }, h("slot", { key: '27ed9ff31bbf83fcbd2ed8dd2b23b97422b18d25', onSlotchange: this.handleSlotChange })), this.renderMessages(), !this.multiple && h("pds-icon", { key: '43d415eab0fc8a3c02e19848a5622ea43f04256e', "aria-hidden": "true", class: "pds-select__select-icon", icon: enlarge }))));
227
232
  }
228
233
  static get is() { return "pds-select"; }
229
234
  static get encapsulation() { return "shadow"; }