@pine-ds/core 4.7.1 → 4.8.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 (233) hide show
  1. package/components/pds-avatar.js +1 -1
  2. package/components/pds-button2.js +1 -1
  3. package/components/pds-checkbox2.js +1 -1
  4. package/components/pds-chip2.js +1 -1
  5. package/components/pds-combobox.js +1 -1
  6. package/components/pds-drawer.js +1 -1
  7. package/components/pds-dropdown-menu-item.js +1 -1
  8. package/components/pds-dropdown-menu.js +1 -1
  9. package/components/pds-modal-content.js +1 -1
  10. package/components/pds-modal2.js +1 -1
  11. package/components/pds-multiselect.js +1 -1
  12. package/components/pds-popover.js +1 -1
  13. package/components/pds-radio-group.js +1 -1
  14. package/components/pds-radio.js +1 -1
  15. package/components/pds-switch.js +1 -1
  16. package/components/pds-table-head-cell2.js +1 -1
  17. package/components/pds-textarea.js +1 -1
  18. package/components/pds-toast.js +1 -1
  19. package/components/truncation-tooltip.js +1 -1
  20. package/dist/cjs/{index-5Azb8EQG.js → index-Do70atou.js} +1 -1
  21. package/dist/cjs/loader.cjs.js +1 -1
  22. package/dist/cjs/pds-accordion.cjs.entry.js +1 -1
  23. package/dist/cjs/pds-avatar.cjs.entry.js +3 -3
  24. package/dist/cjs/pds-button.cjs.entry.js +24 -21
  25. package/dist/cjs/pds-checkbox.cjs.entry.js +2 -2
  26. package/dist/cjs/pds-chip.cjs.entry.js +4 -4
  27. package/dist/cjs/pds-combobox.cjs.entry.js +4 -4
  28. package/dist/cjs/pds-copytext.cjs.entry.js +2 -2
  29. package/dist/cjs/pds-datepicker.cjs.entry.js +1 -1
  30. package/dist/cjs/pds-drawer.cjs.entry.js +1 -1
  31. package/dist/cjs/pds-dropdown-menu-item.cjs.entry.js +31 -2
  32. package/dist/cjs/pds-dropdown-menu.cjs.entry.js +4 -4
  33. package/dist/cjs/pds-filter.cjs.entry.js +1 -1
  34. package/dist/cjs/pds-input.cjs.entry.js +1 -1
  35. package/dist/cjs/pds-link.cjs.entry.js +1 -1
  36. package/dist/cjs/pds-modal-content.cjs.entry.js +32 -30
  37. package/dist/cjs/pds-modal.cjs.entry.js +4 -4
  38. package/dist/cjs/pds-multiselect.cjs.entry.js +6 -6
  39. package/dist/cjs/pds-popover.cjs.entry.js +187 -11
  40. package/dist/cjs/pds-radio-group.cjs.entry.js +2 -2
  41. package/dist/cjs/pds-radio.cjs.entry.js +3 -3
  42. package/dist/cjs/pds-select.cjs.entry.js +1 -1
  43. package/dist/cjs/pds-sortable-item.cjs.entry.js +1 -1
  44. package/dist/cjs/pds-switch.cjs.entry.js +2 -2
  45. package/dist/cjs/pds-table-cell.cjs.entry.js +1 -1
  46. package/dist/cjs/pds-table-head-cell.cjs.entry.js +2 -2
  47. package/dist/cjs/pds-text.cjs.entry.js +1 -1
  48. package/dist/cjs/pds-textarea.cjs.entry.js +2 -2
  49. package/dist/cjs/pds-toast.cjs.entry.js +1 -1
  50. package/dist/cjs/pine-core.cjs.js +1 -1
  51. package/dist/cjs/{truncation-tooltip-DO9xli2e.js → truncation-tooltip-BtuiXLV0.js} +31 -6
  52. package/dist/collection/components/pds-avatar/pds-avatar.js +2 -2
  53. package/dist/collection/components/pds-button/pds-button.js +24 -22
  54. package/dist/collection/components/pds-button/stories/pds-button.stories.js +3 -3
  55. package/dist/collection/components/pds-checkbox/pds-checkbox.js +1 -1
  56. package/dist/collection/components/pds-chip/pds-chip.js +2 -2
  57. package/dist/collection/components/pds-combobox/pds-combobox.js +4 -4
  58. package/dist/collection/components/pds-datepicker/stories/pds-datepicker.stories.js +1 -1
  59. package/dist/collection/components/pds-drawer/pds-drawer.css +4 -0
  60. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu-item/pds-dropdown-menu-item.css +8 -0
  61. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu-item/pds-dropdown-menu-item.js +58 -6
  62. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu.js +4 -4
  63. package/dist/collection/components/pds-dropdown-menu/stories/pds-dropdown-menu.stories.js +39 -0
  64. package/dist/collection/components/pds-modal/pds-modal-content/pds-modal-content.js +32 -30
  65. package/dist/collection/components/pds-modal/pds-modal.js +4 -4
  66. package/dist/collection/components/pds-multiselect/pds-multiselect.js +5 -5
  67. package/dist/collection/components/pds-popover/pds-popover.js +240 -11
  68. package/dist/collection/components/pds-popover/stories/pds-popover.stories.js +31 -0
  69. package/dist/collection/components/pds-radio/pds-radio.js +2 -2
  70. package/dist/collection/components/pds-radio-group/pds-radio-group.js +1 -1
  71. package/dist/collection/components/pds-switch/pds-switch.js +1 -1
  72. package/dist/collection/components/pds-table/pds-table-head-cell/pds-table-head-cell.js +1 -1
  73. package/dist/collection/components/pds-table/stories/pds-table.stories.js +1 -1
  74. package/dist/collection/components/pds-text/stories/pds-text.stories.js +1 -1
  75. package/dist/collection/components/pds-textarea/pds-textarea.js +1 -1
  76. package/dist/collection/components/pds-toast/pds-toast.js +1 -1
  77. package/dist/collection/utils/truncation-tooltip.js +31 -6
  78. package/dist/docs.json +124 -7
  79. package/dist/esm/{index-BJXk71tO.js → index-BWDu62Mo.js} +1 -1
  80. package/dist/esm/loader.js +1 -1
  81. package/dist/esm/pds-accordion.entry.js +1 -1
  82. package/dist/esm/pds-avatar.entry.js +3 -3
  83. package/dist/esm/pds-button.entry.js +24 -21
  84. package/dist/esm/pds-checkbox.entry.js +2 -2
  85. package/dist/esm/pds-chip.entry.js +4 -4
  86. package/dist/esm/pds-combobox.entry.js +4 -4
  87. package/dist/esm/pds-copytext.entry.js +2 -2
  88. package/dist/esm/pds-datepicker.entry.js +1 -1
  89. package/dist/esm/pds-drawer.entry.js +1 -1
  90. package/dist/esm/pds-dropdown-menu-item.entry.js +31 -2
  91. package/dist/esm/pds-dropdown-menu.entry.js +4 -4
  92. package/dist/esm/pds-filter.entry.js +1 -1
  93. package/dist/esm/pds-input.entry.js +1 -1
  94. package/dist/esm/pds-link.entry.js +1 -1
  95. package/dist/esm/pds-modal-content.entry.js +32 -30
  96. package/dist/esm/pds-modal.entry.js +4 -4
  97. package/dist/esm/pds-multiselect.entry.js +6 -6
  98. package/dist/esm/pds-popover.entry.js +187 -11
  99. package/dist/esm/pds-radio-group.entry.js +2 -2
  100. package/dist/esm/pds-radio.entry.js +3 -3
  101. package/dist/esm/pds-select.entry.js +1 -1
  102. package/dist/esm/pds-sortable-item.entry.js +1 -1
  103. package/dist/esm/pds-switch.entry.js +2 -2
  104. package/dist/esm/pds-table-cell.entry.js +1 -1
  105. package/dist/esm/pds-table-head-cell.entry.js +2 -2
  106. package/dist/esm/pds-text.entry.js +1 -1
  107. package/dist/esm/pds-textarea.entry.js +2 -2
  108. package/dist/esm/pds-toast.entry.js +1 -1
  109. package/dist/esm/pine-core.js +1 -1
  110. package/dist/esm/{truncation-tooltip-DRXsdKk1.js → truncation-tooltip-FaW67DiY.js} +31 -6
  111. package/dist/esm-es5/loader.js +1 -1
  112. package/dist/esm-es5/pds-accordion.entry.js +1 -1
  113. package/dist/esm-es5/pds-avatar.entry.js +1 -1
  114. package/dist/esm-es5/pds-button.entry.js +1 -1
  115. package/dist/esm-es5/pds-checkbox.entry.js +1 -1
  116. package/dist/esm-es5/pds-chip.entry.js +1 -1
  117. package/dist/esm-es5/pds-combobox.entry.js +1 -1
  118. package/dist/esm-es5/pds-copytext.entry.js +1 -1
  119. package/dist/esm-es5/pds-datepicker.entry.js +1 -1
  120. package/dist/esm-es5/pds-drawer.entry.js +1 -1
  121. package/dist/esm-es5/pds-dropdown-menu-item.entry.js +1 -1
  122. package/dist/esm-es5/pds-dropdown-menu.entry.js +1 -1
  123. package/dist/esm-es5/pds-filter.entry.js +1 -1
  124. package/dist/esm-es5/pds-input.entry.js +1 -1
  125. package/dist/esm-es5/pds-link.entry.js +1 -1
  126. package/dist/esm-es5/pds-modal-content.entry.js +1 -1
  127. package/dist/esm-es5/pds-modal.entry.js +1 -1
  128. package/dist/esm-es5/pds-multiselect.entry.js +1 -1
  129. package/dist/esm-es5/pds-popover.entry.js +1 -1
  130. package/dist/esm-es5/pds-radio-group.entry.js +1 -1
  131. package/dist/esm-es5/pds-radio.entry.js +1 -1
  132. package/dist/esm-es5/pds-select.entry.js +1 -1
  133. package/dist/esm-es5/pds-sortable-item.entry.js +1 -1
  134. package/dist/esm-es5/pds-switch.entry.js +1 -1
  135. package/dist/esm-es5/pds-table-cell.entry.js +1 -1
  136. package/dist/esm-es5/pds-table-head-cell.entry.js +1 -1
  137. package/dist/esm-es5/pds-text.entry.js +1 -1
  138. package/dist/esm-es5/pds-textarea.entry.js +1 -1
  139. package/dist/esm-es5/pds-toast.entry.js +1 -1
  140. package/dist/esm-es5/pine-core.js +1 -1
  141. package/dist/esm-es5/truncation-tooltip-FaW67DiY.js +1 -0
  142. package/dist/pine-core/{p-e836f3ec.system.entry.js → p-00a50de5.system.entry.js} +2 -2
  143. package/dist/pine-core/{p-1437585e.system.entry.js → p-047433a4.system.entry.js} +1 -1
  144. package/dist/pine-core/{p-7fa66cad.entry.js → p-089c3e60.entry.js} +1 -1
  145. package/dist/pine-core/{p-341c38f1.system.entry.js → p-0af0d752.system.entry.js} +1 -1
  146. package/dist/pine-core/{p-3a959459.system.entry.js → p-121612a7.system.entry.js} +1 -1
  147. package/dist/pine-core/{p-cde8eb81.entry.js → p-138b278b.entry.js} +1 -1
  148. package/dist/pine-core/{p-cfd012d4.entry.js → p-158b2f51.entry.js} +1 -1
  149. package/dist/pine-core/p-17f97f1a.entry.js +1 -0
  150. package/dist/pine-core/{p-5c90091e.system.entry.js → p-19ba2788.system.entry.js} +1 -1
  151. package/dist/pine-core/p-1dc5a7e0.system.entry.js +1 -0
  152. package/dist/pine-core/{p-355e4cf9.entry.js → p-25ea48d1.entry.js} +1 -1
  153. package/dist/pine-core/{p-c81d8ac8.entry.js → p-295f64ea.entry.js} +1 -1
  154. package/dist/pine-core/{p-576cf904.system.entry.js → p-29cd4113.system.entry.js} +1 -1
  155. package/dist/pine-core/{p-1ee86d87.system.entry.js → p-332590c7.system.entry.js} +1 -1
  156. package/dist/pine-core/p-36cb4bf6.entry.js +1 -0
  157. package/dist/pine-core/{p-080cb087.system.entry.js → p-3c977d8d.system.entry.js} +1 -1
  158. package/dist/pine-core/p-3d51891a.entry.js +1 -0
  159. package/dist/pine-core/{p-72865997.entry.js → p-44f546ae.entry.js} +1 -1
  160. package/dist/pine-core/{p-b60ac7eb.system.entry.js → p-4bfc8b3e.system.entry.js} +1 -1
  161. package/dist/pine-core/p-5833a072.system.entry.js +1 -0
  162. package/dist/pine-core/p-5cfd4d41.system.entry.js +1 -0
  163. package/dist/pine-core/{p-f2c253d8.entry.js → p-62433f32.entry.js} +1 -1
  164. package/dist/pine-core/{p-ebd0bff2.entry.js → p-631f5bcc.entry.js} +1 -1
  165. package/dist/pine-core/p-717323e4.entry.js +1 -0
  166. package/dist/pine-core/{p-e7a95a49.system.entry.js → p-719542e1.system.entry.js} +1 -1
  167. package/dist/pine-core/p-73f931a1.entry.js +1 -0
  168. package/dist/pine-core/{p-f77905aa.system.entry.js → p-884cb31d.system.entry.js} +1 -1
  169. package/dist/pine-core/{p-4435fff6.system.entry.js → p-8987fd45.system.entry.js} +1 -1
  170. package/dist/pine-core/{p-02088776.entry.js → p-8c588ca0.entry.js} +1 -1
  171. package/dist/pine-core/p-8e3ff75d.entry.js +1 -0
  172. package/dist/pine-core/{p-bd26a5e8.entry.js → p-90d5edc6.entry.js} +1 -1
  173. package/dist/pine-core/p-91f60173.entry.js +1 -0
  174. package/dist/pine-core/{p-258770cf.system.entry.js → p-9265497e.system.entry.js} +1 -1
  175. package/dist/pine-core/p-9713fb36.entry.js +1 -0
  176. package/dist/pine-core/p-99fdf70f.entry.js +1 -0
  177. package/dist/pine-core/{p-0a84d220.entry.js → p-9aaedded.entry.js} +1 -1
  178. package/dist/pine-core/p-9df5e204.entry.js +1 -0
  179. package/dist/pine-core/p-CuSNnuFu.system.js +1 -1
  180. package/dist/pine-core/p-D04W0cAO.system.js +1 -0
  181. package/dist/pine-core/{p-6d603d16.system.entry.js → p-acca5f7b.system.entry.js} +1 -1
  182. package/dist/pine-core/{p-a19cd59c.entry.js → p-aff411d0.entry.js} +1 -1
  183. package/dist/pine-core/{p-bb73ad66.entry.js → p-b182f806.entry.js} +1 -1
  184. package/dist/pine-core/{p-01aa382c.system.entry.js → p-b9d145f8.system.entry.js} +1 -1
  185. package/dist/pine-core/p-bdac8f2b.entry.js +1 -0
  186. package/dist/pine-core/{p-aa032a5e.system.entry.js → p-be9b6e63.system.entry.js} +1 -1
  187. package/dist/pine-core/{p-ff3de72e.entry.js → p-c483997a.entry.js} +1 -1
  188. package/dist/pine-core/p-c4e12f0a.entry.js +1 -0
  189. package/dist/pine-core/{p-e8cb76e8.entry.js → p-c97bfac9.entry.js} +1 -1
  190. package/dist/pine-core/{p-bd67156b.system.entry.js → p-ca4ee736.system.entry.js} +1 -1
  191. package/dist/pine-core/p-cccfe60f.system.entry.js +1 -0
  192. package/dist/pine-core/{p-c5c9ed36.system.entry.js → p-d3d69ca4.system.entry.js} +1 -1
  193. package/dist/pine-core/{p-f0d24298.system.entry.js → p-ea340c55.system.entry.js} +1 -1
  194. package/dist/pine-core/{p-88ff1604.entry.js → p-ea8f5d29.entry.js} +1 -1
  195. package/dist/pine-core/{p-d8570b4b.system.entry.js → p-eaf85be6.system.entry.js} +1 -1
  196. package/dist/pine-core/{p-fc25b956.system.entry.js → p-ecc7a531.system.entry.js} +1 -1
  197. package/dist/pine-core/{p-cfc52b95.system.entry.js → p-ee0e30bf.system.entry.js} +1 -1
  198. package/dist/pine-core/{p-e803f629.system.entry.js → p-ef13f665.system.entry.js} +1 -1
  199. package/dist/pine-core/{p-97d0b89e.system.entry.js → p-f3067d90.system.entry.js} +1 -1
  200. package/dist/pine-core/{p-JtdHT_W5.js → p-jrkGLEPe.js} +1 -1
  201. package/dist/pine-core/pine-core.esm.js +1 -1
  202. package/dist/types/components/pds-button/pds-button.d.ts +3 -4
  203. package/dist/types/components/pds-dropdown-menu/pds-dropdown-menu-item/pds-dropdown-menu-item.d.ts +13 -3
  204. package/dist/types/components/pds-modal/pds-modal-content/pds-modal-content.d.ts +2 -0
  205. package/dist/types/components/pds-popover/pds-popover.d.ts +43 -1
  206. package/dist/types/components.d.ts +43 -10
  207. package/dist/types/utils/truncation-tooltip.d.ts +4 -4
  208. package/dist/types/utils/types.d.ts +1 -0
  209. package/dist/vscode.html-data.json +50 -7
  210. package/hydrate/index.js +341 -104
  211. package/hydrate/index.mjs +341 -104
  212. package/package.json +2 -2
  213. package/dist/esm-es5/truncation-tooltip-DRXsdKk1.js +0 -1
  214. package/dist/pine-core/p-153ba77b.entry.js +0 -1
  215. package/dist/pine-core/p-645a482b.system.entry.js +0 -1
  216. package/dist/pine-core/p-74a05bcc.entry.js +0 -1
  217. package/dist/pine-core/p-7bf6563a.system.entry.js +0 -1
  218. package/dist/pine-core/p-80a698ae.entry.js +0 -1
  219. package/dist/pine-core/p-82cf4ec6.entry.js +0 -1
  220. package/dist/pine-core/p-8d292b48.entry.js +0 -1
  221. package/dist/pine-core/p-92ae6082.entry.js +0 -1
  222. package/dist/pine-core/p-993d1043.entry.js +0 -1
  223. package/dist/pine-core/p-a787b34a.system.entry.js +0 -1
  224. package/dist/pine-core/p-b69f04b7.entry.js +0 -1
  225. package/dist/pine-core/p-beb23781.entry.js +0 -1
  226. package/dist/pine-core/p-bf5887e8.system.entry.js +0 -1
  227. package/dist/pine-core/p-c36b490e.entry.js +0 -1
  228. package/dist/pine-core/p-ca0d48e8.entry.js +0 -1
  229. package/dist/pine-core/p-f474d7de.entry.js +0 -1
  230. package/dist/pine-core/p-qhdoK1Jp.system.js +0 -1
  231. /package/dist/esm-es5/{index-BJXk71tO.js → index-BWDu62Mo.js} +0 -0
  232. /package/dist/pine-core/{p-BJXk71tO.js → p-BWDu62Mo.js} +0 -0
  233. /package/dist/pine-core/{p-n3_ytl_p.system.js → p-ClDiSG97.system.js} +0 -0
@@ -48,8 +48,12 @@ const cssEscape = (value) => {
48
48
 
49
49
  const pdsPopoverCss = () => `:host{--sizing-max-width-default:352px;display:inline-block}:host .pds-popover__trigger-wrapper{display:inline-block}:host .pds-popover__content-slot-wrapper{display:none}`;
50
50
 
51
- /** Open auto popovers, in the order they opened: Escape goes to the last one it applies to. */
52
- const openAutoPopovers = [];
51
+ /** Open popovers that close on Escape, in the order they opened: Escape goes to the last one it applies to. */
52
+ const popoversTakingEscape = [];
53
+ /** Hovering the trigger waits this long before opening, so a pointer passing over it doesn't open it. */
54
+ const HOVER_OPEN_DELAY_MS = 120;
55
+ /** Leaving the trigger and panel waits this long before closing, which covers the gap between them. */
56
+ const HOVER_CLOSE_DELAY_MS = 200;
53
57
  /** The focused element, followed down through shadow roots to the control that has focus. */
54
58
  function deepActiveElement() {
55
59
  var _a;
@@ -109,11 +113,29 @@ const PdsPopover = class {
109
113
  * Timestamp when popover was opened (for preventing immediate close)
110
114
  */
111
115
  this.openTimestamp = 0;
116
+ /**
117
+ * Set while hover holds the popover open, until a click pins it or it closes
118
+ */
119
+ this.hoverOpened = false;
120
+ /**
121
+ * Set when the pointer left while focus was in the panel, so focus leaving it closes it instead
122
+ */
123
+ this.closeWhenFocusLeaves = false;
124
+ /**
125
+ * How far the pointer was from the panel at its last move after leaving the trigger
126
+ */
127
+ this.panelDistance = Infinity;
112
128
  /**
113
129
  * Determines the action that triggers the popover. For manual popovers, the consumer is responsible for toggling this value.
114
130
  * @defaultValue "show"
115
131
  */
116
132
  this.popoverTargetAction = 'show';
133
+ /**
134
+ * Determines how the popover opens. With `hover`, it also opens when the pointer rests on the trigger and closes
135
+ * when the pointer leaves, until a click on the trigger keeps it open. Enter or Space on the trigger opens it either way.
136
+ * @defaultValue "click"
137
+ */
138
+ this.openOn = 'click';
117
139
  /**
118
140
  * Determines the type of popover. Auto popovers can be "light dismissed" by clicking outside of the popover.
119
141
  * Manual popovers require the consumer to handle the visibility of the popover.
@@ -124,6 +146,11 @@ const PdsPopover = class {
124
146
  * @defaultValue 352
125
147
  */
126
148
  this.maxWidth = 352;
149
+ /**
150
+ * Sets the padding of the popover content
151
+ * @defaultValue "md"
152
+ */
153
+ this.padding = 'md';
127
154
  /**
128
155
  * Determines the preferred position of the popover
129
156
  * @defaultValue "right"
@@ -138,6 +165,7 @@ const PdsPopover = class {
138
165
  // Clean up previous trigger's event listener if it exists
139
166
  if (this.triggerEl != null) {
140
167
  this.triggerEl.removeEventListener('click', this.handleTriggerClick);
168
+ this.stopListeningForHover(this.triggerEl);
141
169
  }
142
170
  if (assignedElements.length > 0) {
143
171
  // Use the first assigned element as the trigger
@@ -145,6 +173,7 @@ const PdsPopover = class {
145
173
  this.linkTriggerToPortal();
146
174
  // Attach click listener to handle popover visibility
147
175
  this.triggerEl.addEventListener('click', this.handleTriggerClick);
176
+ this.listenForHover(this.triggerEl);
148
177
  }
149
178
  else {
150
179
  this.triggerEl = null;
@@ -171,6 +200,13 @@ const PdsPopover = class {
171
200
  if (!anchorWithHref) {
172
201
  event.preventDefault();
173
202
  }
203
+ if (this.openOn === 'hover' && this.popoverTargetAction !== 'hide') {
204
+ const heldByHover = this.hoverOpened;
205
+ this.pin();
206
+ // Pinning, not toggling: the hover before a click has already opened it.
207
+ if (heldByHover)
208
+ return;
209
+ }
174
210
  // Execute the appropriate action based on popoverTargetAction prop
175
211
  switch (this.popoverTargetAction) {
176
212
  case 'show':
@@ -185,6 +221,60 @@ const PdsPopover = class {
185
221
  break;
186
222
  }
187
223
  };
224
+ // A tap sends touch pointer events and then a click, so touch takes the click path alone.
225
+ this.handleHoverEnter = (event) => {
226
+ if (event.pointerType === 'touch')
227
+ return;
228
+ this.clearHoverTimers();
229
+ if (this.active)
230
+ return;
231
+ this.hoverOpenTimer = setTimeout(() => {
232
+ this.hoverOpenTimer = undefined;
233
+ if (this.active || this.portalEl == null)
234
+ return;
235
+ this.hoverOpened = true;
236
+ this.show();
237
+ }, HOVER_OPEN_DELAY_MS);
238
+ };
239
+ this.handleHoverLeave = (event) => {
240
+ if (event.pointerType === 'touch')
241
+ return;
242
+ this.clearHoverTimers();
243
+ if (!this.hoverOpened)
244
+ return;
245
+ this.hoverCloseTimer = setTimeout(this.closeFromHover, HOVER_CLOSE_DELAY_MS);
246
+ if (event.currentTarget !== this.triggerEl)
247
+ return;
248
+ this.panelDistance = this.distanceToPanel(event);
249
+ document.addEventListener('pointermove', this.handleMoveTowardPanel);
250
+ };
251
+ // A slow diagonal from the trigger to a panel shorter than it runs beside the panel for longer
252
+ // than the close delay, so each move that brings the pointer closer starts the delay again.
253
+ this.handleMoveTowardPanel = (event) => {
254
+ const distance = this.distanceToPanel(event);
255
+ if (distance < this.panelDistance) {
256
+ clearTimeout(this.hoverCloseTimer);
257
+ this.hoverCloseTimer = setTimeout(this.closeFromHover, HOVER_CLOSE_DELAY_MS);
258
+ }
259
+ this.panelDistance = distance;
260
+ };
261
+ this.handleHoverFocusOut = (event) => {
262
+ if (!this.closeWhenFocusLeaves || containsComposed(this.portalEl, event.relatedTarget))
263
+ return;
264
+ this.closeWhenFocusLeaves = false;
265
+ this.hoverCloseTimer = setTimeout(this.closeFromHover, HOVER_CLOSE_DELAY_MS);
266
+ };
267
+ this.closeFromHover = () => {
268
+ this.clearHoverTimers();
269
+ if (!this.hoverOpened)
270
+ return;
271
+ // Content shown on hover stays while focus is in it (WCAG 1.4.13).
272
+ if (containsComposed(this.portalEl, deepActiveElement())) {
273
+ this.closeWhenFocusLeaves = true;
274
+ return;
275
+ }
276
+ this.hide();
277
+ };
188
278
  /** The focus style copied into a shadow root the panel opened in, which `document.head` can't reach. */
189
279
  this.shadowFocusStyle = null;
190
280
  /** The dialog the panel was opened in, closed along with it. */
@@ -206,6 +296,32 @@ const PdsPopover = class {
206
296
  }
207
297
  };
208
298
  }
299
+ openOnChanged() {
300
+ this.pin();
301
+ this.stopListeningForHover(this.triggerEl);
302
+ this.stopListeningForHover(this.portalEl);
303
+ // Out of the page, connectedCallback binds them when it comes back.
304
+ if (!this.isComponentMounted)
305
+ return;
306
+ this.listenForHover(this.triggerEl);
307
+ this.listenForHover(this.portalEl);
308
+ }
309
+ applyPadding() {
310
+ if (this.portalEl != null)
311
+ this.portalEl.style.padding = this.paddingToken();
312
+ }
313
+ paddingToken() {
314
+ switch (this.padding) {
315
+ case 'none':
316
+ return 'var(--pine-dimension-none)';
317
+ case 'xs':
318
+ return 'var(--pine-dimension-xs)';
319
+ case 'sm':
320
+ return 'var(--pine-dimension-sm)';
321
+ default:
322
+ return 'var(--pine-dimension-md)';
323
+ }
324
+ }
209
325
  restorePlacementDefault(newValue) {
210
326
  this.placement = restoreReflectedDefault(this.el, 'placement', newValue, 'right');
211
327
  }
@@ -256,6 +372,48 @@ const PdsPopover = class {
256
372
  // Skips values already in place, so the trigger observer's own callback doesn't loop.
257
373
  return setAttributesIfChanged(this.triggerEl, { 'aria-expanded': String(this.active), 'aria-controls': this.portalEl.id });
258
374
  }
375
+ listenForHover(el) {
376
+ if (this.openOn !== 'hover' || el == null)
377
+ return;
378
+ el.addEventListener('pointerenter', this.handleHoverEnter);
379
+ el.addEventListener('pointerleave', this.handleHoverLeave);
380
+ el.addEventListener('focusout', this.handleHoverFocusOut);
381
+ }
382
+ stopListeningForHover(el) {
383
+ if (el == null)
384
+ return;
385
+ el.removeEventListener('pointerenter', this.handleHoverEnter);
386
+ el.removeEventListener('pointerleave', this.handleHoverLeave);
387
+ el.removeEventListener('focusout', this.handleHoverFocusOut);
388
+ }
389
+ distanceToPanel({ clientX, clientY }) {
390
+ const panel = this.portalEl.getBoundingClientRect();
391
+ return Math.hypot(Math.max(panel.left - clientX, 0, clientX - panel.right), Math.max(panel.top - clientY, 0, clientY - panel.bottom));
392
+ }
393
+ /**
394
+ * Keeps a popover that hover opened open, closing from then on as one opened by a click does. A
395
+ * manual one gives up Escape again, which it took only while hover held it.
396
+ */
397
+ pin() {
398
+ var _a;
399
+ this.clearHoverTimers();
400
+ if (!this.hoverOpened)
401
+ return;
402
+ this.hoverOpened = false;
403
+ if (this.popoverType === 'auto')
404
+ return;
405
+ this.forgetOpen();
406
+ (_a = this.portalEl) === null || _a === void 0 ? void 0 : _a.removeAttribute('data-pds-popover-open');
407
+ document.removeEventListener('keydown', this.boundEscapeKeyHandler);
408
+ }
409
+ clearHoverTimers() {
410
+ clearTimeout(this.hoverOpenTimer);
411
+ clearTimeout(this.hoverCloseTimer);
412
+ this.hoverOpenTimer = undefined;
413
+ this.hoverCloseTimer = undefined;
414
+ this.closeWhenFocusLeaves = false;
415
+ document.removeEventListener('pointermove', this.handleMoveTowardPanel);
416
+ }
259
417
  // componentDidLoad doesn't run again when a popover comes back, so rebuild whatever
260
418
  // disconnectedCallback tore down. Each step is a no-op when nothing was.
261
419
  connectedCallback() {
@@ -265,6 +423,7 @@ const PdsPopover = class {
265
423
  this.isComponentMounted = true;
266
424
  this.createPortal();
267
425
  (_a = this.triggerEl) === null || _a === void 0 ? void 0 : _a.addEventListener('click', this.handleTriggerClick);
426
+ this.listenForHover(this.triggerEl);
268
427
  this.observeTrigger();
269
428
  this.linkTriggerToPortal();
270
429
  // Still open after a move: the trigger moved, so the portal follows it, into the dialog it
@@ -299,6 +458,7 @@ const PdsPopover = class {
299
458
  if (this.triggerEl != null) {
300
459
  this.triggerEl.removeEventListener('click', this.handleTriggerClick);
301
460
  }
461
+ this.stopListeningForHover(this.triggerEl);
302
462
  (_a = this.triggerObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
303
463
  this.triggerObserver = null;
304
464
  // Clean up all event listeners
@@ -307,6 +467,8 @@ const PdsPopover = class {
307
467
  document.removeEventListener('submit', this.handleSubmitFromPanel, true);
308
468
  // Clear any pending debounce timers
309
469
  this.clearDebounceTimers();
470
+ this.clearHoverTimers();
471
+ this.hoverOpened = false;
310
472
  // Remove portal from DOM
311
473
  this.removePortal();
312
474
  }
@@ -340,7 +502,7 @@ const PdsPopover = class {
340
502
  this.portalEl.style.borderRadius = 'var(--pine-dimension-125)';
341
503
  this.portalEl.style.boxShadow = 'var(--pine-box-shadow-200)';
342
504
  this.portalEl.style.margin = 'var(--pine-dimension-none)';
343
- this.portalEl.style.padding = 'var(--pine-dimension-md)';
505
+ this.portalEl.style.padding = this.paddingToken();
344
506
  // Generate unique ID
345
507
  if (!this.componentId) {
346
508
  (_a = this.generatedPortalId) !== null && _a !== void 0 ? _a : (this.generatedPortalId = `pds-popover-portal-${PdsPopover.instanceCounter++}`);
@@ -354,6 +516,7 @@ const PdsPopover = class {
354
516
  // Add global focus styles to match Pine design system
355
517
  // This is done after appending to ensure it's part of the document and can access CSS variables
356
518
  this.addPortalFocusStyles();
519
+ this.listenForHover(this.portalEl);
357
520
  }
358
521
  /**
359
522
  * Adds Pine design system focus styles and dark mode border to the portal element
@@ -481,8 +644,8 @@ const PdsPopover = class {
481
644
  // Update portal content with latest slot content
482
645
  this.updatePortalContent();
483
646
  // Show portal. The attribute tells a modal around it that this popover takes Escape first; only
484
- // an auto popover listens for Escape.
485
- if (this.popoverType === 'auto')
647
+ // an auto popover, or one hover opened, listens for Escape.
648
+ if (this.popoverType === 'auto' || this.hoverOpened)
486
649
  this.portalEl.setAttribute('data-pds-popover-open', '');
487
650
  this.portalEl.style.display = 'block';
488
651
  this.portalEl.style.opacity = '1';
@@ -496,11 +659,16 @@ const PdsPopover = class {
496
659
  // Add scroll and resize listeners for repositioning (always)
497
660
  this.addScrollAndResizeListeners();
498
661
  document.addEventListener('submit', this.handleSubmitFromPanel, true);
499
- // Add document listeners for light dismiss and escape key (auto type only)
662
+ // Add document listeners for light dismiss and escape key (auto type only), or for the escape
663
+ // key alone while hover holds a manual popover open
500
664
  if (this.popoverType === 'auto') {
501
- openAutoPopovers.push(this);
665
+ popoversTakingEscape.push(this);
502
666
  this.addLightDismissListeners();
503
667
  }
668
+ else if (this.hoverOpened) {
669
+ popoversTakingEscape.push(this);
670
+ document.addEventListener('keydown', this.boundEscapeKeyHandler);
671
+ }
504
672
  // Emit open event
505
673
  this.pdsPopoverOpen.emit({
506
674
  componentId: this.componentId,
@@ -511,9 +679,11 @@ const PdsPopover = class {
511
679
  * Closes the popover programmatically
512
680
  */
513
681
  async hide() {
682
+ this.clearHoverTimers();
514
683
  if (!this.active || !this.portalEl)
515
684
  return;
516
685
  this.active = false;
686
+ this.hoverOpened = false;
517
687
  this.unwatchDialogClose();
518
688
  // Restoring the content drops its focus to the body, so check where focus is first. In a
519
689
  // shadow root, document.activeElement is only its host.
@@ -592,9 +762,9 @@ const PdsPopover = class {
592
762
  this.portalEl.style.border = root instanceof ShadowRoot && closest('[data-theme="dark"]', this.el) ? 'var(--pine-border)' : '';
593
763
  }
594
764
  forgetOpen() {
595
- const index = openAutoPopovers.indexOf(this);
765
+ const index = popoversTakingEscape.indexOf(this);
596
766
  if (index >= 0)
597
- openAutoPopovers.splice(index, 1);
767
+ popoversTakingEscape.splice(index, 1);
598
768
  }
599
769
  /**
600
770
  * Whether an Escape is this popover's. One from a dialog the popover isn't in belongs to that
@@ -703,7 +873,7 @@ const PdsPopover = class {
703
873
  return;
704
874
  // Like the native Popover API, Escape closes only the top popover: the last one opened that
705
875
  // it applies to. Every open popover hears it, so each checks whether it's that one.
706
- const top = [...openAutoPopovers].reverse().find(popover => popover.takesEscapeFrom(event));
876
+ const top = [...popoversTakingEscape].reverse().find(popover => popover.takesEscapeFrom(event));
707
877
  if (top !== this)
708
878
  return;
709
879
  // Take the key, so the dialog or modal around it doesn't close too.
@@ -828,10 +998,16 @@ const PdsPopover = class {
828
998
  }, 16); // ~1 frame at 60fps
829
999
  }
830
1000
  render() {
831
- return (h(Host, { key: 'da8a0c715df1199231b1265085f3f9ae0234032d', id: this.componentId }, h("span", { key: 'f35023492399420829cec2e88556462f5ac1663e', class: "pds-popover__trigger-wrapper" }, h("slot", { key: '38ebe92eebb87665467b3f92ff94dc8095450063', name: "trigger", onSlotchange: this.handleTriggerSlotChange })), h("div", { key: '8917930f4520544d14bbd68b4c7936dd60af19e3', class: "pds-popover__content-slot-wrapper" }, h("slot", { key: '28d3f9112256edd95721a79a7072a9e35a3712bf', onSlotchange: this.handleContentSlotChange }))));
1001
+ return (h(Host, { key: 'e48b897acdc9e89f2e6b1449e7a358da7da1060c', id: this.componentId }, h("span", { key: 'b83b2c234b07703c2c850a9991c94939ed2fdaf7', class: "pds-popover__trigger-wrapper" }, h("slot", { key: '0a7f7829ee445fd57cf824ebee1409b3c571f983', name: "trigger", onSlotchange: this.handleTriggerSlotChange })), h("div", { key: '8c1fe2d4d7c4342b4bd5eb4c56e596f17b4e14fa', class: "pds-popover__content-slot-wrapper" }, h("slot", { key: '4ccfce1f335acbc436f7942e497f5d360f849d48', onSlotchange: this.handleContentSlotChange }))));
832
1002
  }
833
1003
  get el() { return getElement(this); }
834
1004
  static get watchers() { return {
1005
+ "openOn": [{
1006
+ "openOnChanged": 0
1007
+ }],
1008
+ "padding": [{
1009
+ "applyPadding": 0
1010
+ }],
835
1011
  "placement": [{
836
1012
  "restorePlacementDefault": 0
837
1013
  }]
@@ -1,6 +1,6 @@
1
1
  import { r as registerInstance, c as createEvent, h, H as Host, a as getElement } from './index-Cw9J31qd.js';
2
2
  import { m as messageId } from './form-BuRbS7Hp.js';
3
- import { b as danger } from './index-BJXk71tO.js';
3
+ import { b as danger } from './index-BWDu62Mo.js';
4
4
  import './keep-hydrated-BLG6RDBt.js';
5
5
 
6
6
  const pdsRadioGroupCss = () => `.sc-pds-radio-group-h{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:var(--pine-dimension-sm)}.is-invalid.sc-pds-radio-group-h .pds-radio-group__message--error.sc-pds-radio-group{color:var(--pine-color-text-message-danger)}.pds-radio-group__label.sc-pds-radio-group{color:var(--pine-color-text-label);font:var(--pine-typography-heading-6);font-weight:var(--pine-font-weight-medium);letter-spacing:var(--pine-letter-spacing-heading-6)}.pds-radio-group__radios.sc-pds-radio-group{display:-ms-flexbox;display:flex;gap:var(--pds-radio-group-gap, var(--pine-dimension-xs))}.pds-radio-group__radios--row.sc-pds-radio-group{-ms-flex-align:start;align-items:flex-start;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.pds-radio-group__radios--column.sc-pds-radio-group{-ms-flex-direction:column;flex-direction:column}.pds-radio-group__message.sc-pds-radio-group{color:var(--pine-color-text-message);font:var(--pine-typography-body);width:100%}.pds-radio-group__message--error.sc-pds-radio-group{display:-ms-flexbox;display:flex;gap:var(--pine-dimension-2xs)}.pds-radio-group__message--error.sc-pds-radio-group pds-icon.sc-pds-radio-group{-webkit-margin-before:var(--pine-dimension-050);margin-block-start:var(--pine-dimension-050)}`;
@@ -169,7 +169,7 @@ const PdsRadioGroup = class {
169
169
  'pds-radio-group__radios': true,
170
170
  'pds-radio-group__radios--row': this.direction === 'row',
171
171
  'pds-radio-group__radios--column': this.direction === 'column',
172
- } }, h("slot", { key: 'd88dde3c631e25c01bc7b6d3ef5d517255fabd1a', onSlotchange: () => this.updateChildRadios() })), this.helperMessage && (h("div", { key: 'a229214ed01663b0fc34f35e27c7148b4eb412ab', class: "pds-radio-group__message", id: messageId(this._groupId, 'helper') }, this.helperMessage)), this.errorMessage && (h("div", { key: 'dc092f2e6dbef0cb369cf00a6eccf9a095a0313d', class: "pds-radio-group__message pds-radio-group__message--error", id: messageId(this._groupId, 'error'), "aria-live": "assertive" }, h("pds-icon", { key: 'd242da328731e55fa52d8e624fdfc750bfa6cce4', icon: danger, size: "small" }), this.errorMessage))));
172
+ } }, h("slot", { key: 'd88dde3c631e25c01bc7b6d3ef5d517255fabd1a', onSlotchange: () => this.updateChildRadios() })), this.helperMessage && (h("div", { key: 'a229214ed01663b0fc34f35e27c7148b4eb412ab', class: "pds-radio-group__message", id: messageId(this._groupId, 'helper') }, this.helperMessage)), this.errorMessage && (h("div", { key: 'dc092f2e6dbef0cb369cf00a6eccf9a095a0313d', class: "pds-radio-group__message pds-radio-group__message--error", id: messageId(this._groupId, 'error'), "aria-live": "assertive" }, h("pds-icon", { key: '83b0129d3d45b74ef1f53acc923387b2de7f079b', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage))));
173
173
  }
174
174
  get el() { return getElement(this); }
175
175
  static get watchers() { return {
@@ -1,7 +1,7 @@
1
1
  import { r as registerInstance, c as createEvent, h, H as Host, a as getElement } from './index-Cw9J31qd.js';
2
2
  import { H as HostStylingKeeper } from './attributes-WXw_I_uJ.js';
3
3
  import { e as exposeTypeProperty, a as assignDescription, m as messageId } from './form-BuRbS7Hp.js';
4
- import { b as danger } from './index-BJXk71tO.js';
4
+ import { b as danger } from './index-BWDu62Mo.js';
5
5
  import './keep-hydrated-BLG6RDBt.js';
6
6
 
7
7
  const labelCss = () => `.sc-pds-radio-h{display:inline-block}[aria-disabled=true].sc-pds-radio-h label.sc-pds-radio{color:var(--pine-color-text-label-disabled)}[aria-readonly=true].sc-pds-radio-h label.sc-pds-radio{color:var(--pine-color-text-label-readonly)}label.sc-pds-radio{color:var(--pine-color-text-label);font:var(--pine-typography-body-medium);letter-spacing:var(--pine-letter-spacing)}`;
@@ -104,11 +104,11 @@ const PdsRadio = class {
104
104
  const renderLabelAndMessages = () => [
105
105
  h("label", { htmlFor: this.componentId, key: `${this.componentId}-label` }, h("input", { key: 'ccd618855831bcee309e815f2cd2712fd4e8fe1f', "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: '2e372a880c28f48fb804bac2518208082c141fad', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)),
106
106
  this.helperMessage && (h("div", { key: `${this.componentId}-helper`, class: 'pds-radio__message', id: messageId(this.componentId, 'helper') }, this.helperMessage)),
107
- 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: '889d502575f6a162f450b6b58d76a6f6f1c74e4b', icon: danger, size: "small" }), this.errorMessage))
107
+ 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: '08e7a2319eddc1d314ee9dddd51a5ce88cd4ae48', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage))
108
108
  ];
109
109
  const hostClass = this.classNames();
110
110
  this.hostKeeper.record(hostClass);
111
- return (h(Host, { key: '374003032b28407581a55f1fb0a304c49acf3c16', class: hostClass }, this.hasImage() && (h("div", { key: '7eeb516267de1afcfa85fc7567999db488c2f4f5', class: "pds-radio__image-container", part: "image-container" }, h("slot", { key: 'a312fea06f0c015bffab3bb392ff04d4913fd1c0', name: "image", onSlotchange: () => (this._hasImage = this.hasImageSlot()) }))), this.hasImage() ? (h("div", { class: "pds-radio__content-wrapper" }, renderLabelAndMessages())) : (renderLabelAndMessages())));
111
+ return (h(Host, { key: '351376552abee90f50c3aceb03ecf8a81ae1b82b', class: hostClass }, this.hasImage() && (h("div", { key: 'fd85fd36b2ebd99b12c3bb2a13cf3d3e3c26530f', class: "pds-radio__image-container", part: "image-container" }, h("slot", { key: 'abe75dbe38d29340b805f70861b084c1b3836be9', name: "image", onSlotchange: () => (this._hasImage = this.hasImageSlot()) }))), this.hasImage() ? (h("div", { class: "pds-radio__content-wrapper" }, renderLabelAndMessages())) : (renderLabelAndMessages())));
112
112
  }
113
113
  get el() { return getElement(this); }
114
114
  };
@@ -1,7 +1,7 @@
1
1
  import { r as registerInstance, c as createEvent, h, H as Host, a as getElement } from './index-Cw9J31qd.js';
2
2
  import { H as HostStylingKeeper } from './attributes-WXw_I_uJ.js';
3
3
  import { e as exposeTypeProperty, m as messageId, i as isSpecTest, a as assignDescription } from './form-BuRbS7Hp.js';
4
- import { b as danger, e as enlarge } from './index-BJXk71tO.js';
4
+ import { b as danger, e as enlarge } from './index-BWDu62Mo.js';
5
5
  import './keep-hydrated-BLG6RDBt.js';
6
6
 
7
7
  const pdsSelectTokensCss = () => `:host{--pine-select-color-background-danger:var(--pine-color-red-050)}`;
@@ -1,6 +1,6 @@
1
1
  import { r as registerInstance, h, H as Host, a as getElement } from './index-Cw9J31qd.js';
2
2
  import { H as HostStylingKeeper } from './attributes-WXw_I_uJ.js';
3
- import { h as handle } from './index-BJXk71tO.js';
3
+ import { h as handle } from './index-BWDu62Mo.js';
4
4
  import './keep-hydrated-BLG6RDBt.js';
5
5
 
6
6
  const pdsSortableItemCss = () => `.pds-sortable-item.sc-pds-sortable-item-h{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding-block:var(--pine-dimension-xs);padding-inline:var(--pine-dimension-md)}.pds-sortable-item.sc-pds-sortable-item-h .pds-sortable-item__actions.sc-pds-sortable-item{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-padding-start:var(--pine-dimension-md);padding-inline-start:var(--pine-dimension-md)}.pds-sortable-item.sc-pds-sortable-item-h .pds-sortable-item__handle.sc-pds-sortable-item{line-height:1;-webkit-margin-end:var(--pine-dimension-md);margin-inline-end:var(--pine-dimension-md)}.pds-sortable--bordered .pds-sortable-item.sc-pds-sortable-item-h:first-child{border-start-end-radius:calc(var(--pine-dimension-xs) * 1.25);border-start-start-radius:calc(var(--pine-dimension-xs) * 1.25)}.pds-sortable--bordered .pds-sortable-item.sc-pds-sortable-item-h:last-child{border-end-end-radius:calc(var(--pine-dimension-xs) * 1.25);border-end-start-radius:calc(var(--pine-dimension-xs) * 1.25)}.pds-sortable--divided .pds-sortable-item.sc-pds-sortable-item-h{-webkit-border-after:var(--pine-border);border-block-end:var(--pine-border)}.pds-sortable--divided .pds-sortable-item.sc-pds-sortable-item-h:last-child{-webkit-border-after:0;border-block-end:0}.pds-sortable--handle-type-row .pds-sortable-item.sc-pds-sortable-item-h{cursor:-webkit-grab;cursor:grab}.pds-sortable--handle-type-handle .pds-sortable-item.sc-pds-sortable-item-h .pds-sortable-item__handle.sc-pds-sortable-item{cursor:-webkit-grab;cursor:grab}.pds-sortable--disabled .pds-sortable-item.sc-pds-sortable-item-h{cursor:not-allowed;opacity:0.5}.pds-sortable--disabled .pds-sortable-item.sc-pds-sortable-item-h .pds-sortable-item__handle.sc-pds-sortable-item{cursor:not-allowed}.pds-sortable--disabled .pds-sortable-item.sc-pds-sortable-item-h:hover{background-color:transparent}.pds-sortable:not(.pds-sortable--disabled) .pds-sortable-item.sc-pds-sortable-item-h:hover{background-color:var(--pine-color-background-container-hover)}.pds-sortable:not(.pds-sortable--disabled) .pds-sortable-item.sc-pds-sortable-item-h:hover pds-icon.sc-pds-sortable-item{color:var(--pine-color-info)}.pds-sortable-item--drag.sc-pds-sortable-item-h{background-color:var(--pine-color-background-container);border-radius:0;-webkit-box-shadow:var(--pine-box-shadow-400);box-shadow:var(--pine-box-shadow-400);opacity:1}.pds-sortable-item--ghost.sc-pds-sortable-item-h{background-color:var(--pine-color-background-container-hover);border-radius:0}`;
@@ -1,6 +1,6 @@
1
1
  import { r as registerInstance, c as createEvent, h, H as Host, a as getElement } from './index-Cw9J31qd.js';
2
2
  import { e as exposeTypeProperty, i as isSpecTest, m as messageId, a as assignDescription } from './form-BuRbS7Hp.js';
3
- import { b as danger } from './index-BJXk71tO.js';
3
+ import { b as danger } from './index-BWDu62Mo.js';
4
4
  import { H as HostStylingKeeper, i as inheritAriaAttributes } from './attributes-WXw_I_uJ.js';
5
5
  import './keep-hydrated-BLG6RDBt.js';
6
6
 
@@ -120,7 +120,7 @@ const PdsSwitch = class {
120
120
  this.hostKeeper.record(hostClass, {}, { 'aria-disabled': ariaDisabled });
121
121
  return (h(Host, { key: 'b8bd2870be101081aa8a65cdee45397bc4c21435', class: hostClass, "aria-disabled": ariaDisabled }, h("label", { key: '1e223f22f7fc6c576098353ad67dc11500def8b4', htmlFor: this.componentId }, h("input", Object.assign({ key: 'edf59869e165a65b97465ea9de06f7ea82fbc9a6', "aria-describedby": assignDescription(this.componentId, this.invalid, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid ? "true" : undefined, checked: this.checked, class: "pds-switch__input", disabled: this.disabled, id: this.componentId, name: this.name ? this.name : this.componentId, onChange: this.onSwitchUpdate, required: this.required, type: "checkbox", value: this.value }, this.inheritedAttributes)), h("span", { key: '1c252b9455471069f8c6ea6c13f2e88c99308b41', class: this.hideLabel ? 'visually-hidden' : '' }, h("slot", { key: 'ce0d471918bd3018f5e55d0d1e6c5c2247790f81', name: "label", onSlotchange: this.updateHasLabelSlot }), !this.hasLabelSlot && this.label)), this.helperMessage &&
122
122
  h("div", { key: '64874b15403f1f42344715ac34febdfb8d94042a', class: `pds-switch__message`, id: messageId(this.componentId, 'helper') }, this.helperMessage), this.errorMessage &&
123
- h("div", { key: '560ea486859124bb0ac2f75ab4bd34b0bca7efbc', class: `pds-switch__message pds-switch__message--error`, id: messageId(this.componentId, 'error'), "aria-live": "assertive" }, h("pds-icon", { key: 'f49caaba976579eb5588e442499595c7dba7ceff', icon: danger, size: "small" }), this.errorMessage)));
123
+ h("div", { key: '560ea486859124bb0ac2f75ab4bd34b0bca7efbc', class: `pds-switch__message pds-switch__message--error`, id: messageId(this.componentId, 'error'), "aria-live": "assertive" }, h("pds-icon", { key: '2ae8dc876745af26fa2418f2265248aeb8f97a2b', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage)));
124
124
  }
125
125
  static get formAssociated() { return true; }
126
126
  get el() { return getElement(this); }
@@ -1,6 +1,6 @@
1
1
  import { r as registerInstance, h, H as Host, a as getElement } from './index-Cw9J31qd.js';
2
2
  import { a as isScrolledFromInlineStart } from './scroll-DtgUQhjl.js';
3
- import { s as setupTruncationTooltip } from './truncation-tooltip-DRXsdKk1.js';
3
+ import { s as setupTruncationTooltip } from './truncation-tooltip-FaW67DiY.js';
4
4
  import './keep-hydrated-BLG6RDBt.js';
5
5
  import './floating-ui.dom-BPqJgIq6.js';
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { r as registerInstance, c as createEvent, h, H as Host, a as getElement } from './index-Cw9J31qd.js';
2
- import { i as upSmall, d as downSmall } from './index-BJXk71tO.js';
2
+ import { i as upSmall, d as downSmall } from './index-BWDu62Mo.js';
3
3
  import { a as isScrolledFromInlineStart } from './scroll-DtgUQhjl.js';
4
4
  import './keep-hydrated-BLG6RDBt.js';
5
5
 
@@ -209,7 +209,7 @@ const PdsTableHeadCell = class {
209
209
  this.tableRef.fixedColumn &&
210
210
  this.tableRef.selectable
211
211
  ? { '--fixed-cell-position': '40px' }
212
- : {} }, h("slot", { key: '96084d87a34d7b601a8e8325f344f1fe6601204e' }), this.sortable && this.isActive && (h("pds-icon", { key: 'cba838fa029b280561676c2b57af7f8f00055511', icon: this.sortingDirection === 'asc' ? upSmall : downSmall, part: "sort-icon" }))));
212
+ : {} }, h("slot", { key: '96084d87a34d7b601a8e8325f344f1fe6601204e' }), this.sortable && this.isActive && (h("pds-icon", { key: '79606519d810dc9882a91cbc3b6a199457086631', icon: this.sortingDirection === 'asc' ? upSmall : downSmall, part: "sort-icon", "aria-hidden": "true" }))));
213
213
  }
214
214
  get hostElement() { return getElement(this); }
215
215
  };
@@ -1,6 +1,6 @@
1
1
  import { r as registerInstance, h, a as getElement } from './index-Cw9J31qd.js';
2
2
  import { s as setColor } from './utils-OYK5-nwe.js';
3
- import { s as setupTruncationTooltip } from './truncation-tooltip-DRXsdKk1.js';
3
+ import { s as setupTruncationTooltip } from './truncation-tooltip-FaW67DiY.js';
4
4
  import { TEXT_SIZES } from './index.js';
5
5
  import './keep-hydrated-BLG6RDBt.js';
6
6
  import './floating-ui.dom-BPqJgIq6.js';
@@ -2,7 +2,7 @@ import { r as registerInstance, c as createEvent, h, H as Host, a as getElement
2
2
  import { i as isSpecTest, b as isRequired, e as exposeTypeProperty, a as assignDescription, m as messageId } from './form-BuRbS7Hp.js';
3
3
  import { d as debounceEvent, f as flushDebouncedEvent, c as cancelDebouncedEvent } from './utils-OYK5-nwe.js';
4
4
  import { i as inheritAriaAttributes, a as inheritAttributes } from './attributes-WXw_I_uJ.js';
5
- import { b as danger } from './index-BJXk71tO.js';
5
+ import { b as danger } from './index-BWDu62Mo.js';
6
6
  import { f as formatMessage } from './i18n-format-BJgZHCWe.js';
7
7
  import './keep-hydrated-BLG6RDBt.js';
8
8
 
@@ -320,7 +320,7 @@ const PdsTextarea = class {
320
320
  return (h(Host, { key: '5933dab0c3cd25b1cf2f6851ece8e8064bc7f3b9', "aria-disabled": this.disabled ? 'true' : null, "aria-readonly": this.readonly ? 'true' : null, "has-action": this.hasAction && !this.hideLabel ? 'true' : null }, h("div", { key: '4f1752514d8e5b0f0e3439515cb9e5f043607da1', class: "pds-textarea" }, this.label &&
321
321
  h("div", { key: 'd4e6df0b381d781b70eeae72ff2f0e9428c0d901', class: "pds-textarea__label-wrapper" }, h("label", { key: '747d82067eb571d02840cfd981865821099f288b', htmlFor: this.componentId }, h("span", { key: 'bfab6e8ede66d0169dd020b7dd97e125aba417b0', class: this.hideLabel ? 'visually-hidden' : '' }, this.label)), !this.hideLabel && this.renderAction()), h("div", { key: 'a18611c03270e7491c1af69f931419c832192c06', class: "pds-textarea__field-wrapper" }, h("textarea", Object.assign({ key: '868382c7b04a4e59c0daa9d98afcdc9048f6224f', ref: (el) => this.nativeTextarea = el, "aria-describedby": assignDescription(this.componentId, this.invalid, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid ? "true" : undefined, autocomplete: this.autocomplete, class: this.textareaClassNames(), disabled: this.disabled, id: this.componentId, maxlength: this.maxLength, name: this.name, placeholder: this.placeholder, readOnly: this.readonly, required: this.required, rows: this.rows, onBlur: this.onBlur, onChange: this.onTextareaChange, onFocus: this.onFocus, onInput: this.onInput, onKeyDown: this.onKeyDown }, this.inheritedAttributes), value), this.renderCharacterCounter()), this.helperMessage &&
322
322
  h("p", { key: 'dcb36f21443d2a782c25b7c29c4ce6215f3b212b', class: "pds-textarea__helper-message", id: messageId(this.componentId, 'helper') }, this.helperMessage), this.invalid &&
323
- h("p", { key: 'be30fb1a38453296e26b775955389c0ec569df67', "aria-live": "assertive", class: "pds-textarea__error-message", id: messageId(this.componentId, 'error') }, h("pds-icon", { key: 'd93dce10d9d9db5815ac5f331848940aed735ba0', icon: danger, size: "small" }), this.errorMessage))));
323
+ h("p", { key: 'be30fb1a38453296e26b775955389c0ec569df67', "aria-live": "assertive", class: "pds-textarea__error-message", id: messageId(this.componentId, 'error') }, h("pds-icon", { key: '853f06489ef6ca50205799659d221bd3bea7d8da', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage))));
324
324
  }
325
325
  static get formAssociated() { return true; }
326
326
  get el() { return getElement(this); }
@@ -130,7 +130,7 @@ const PdsToast = class {
130
130
  'pds-toast--animating-out': this.isAnimatingOut
131
131
  }, role: "alert", "aria-live": "polite" }, this.renderIcon(), h("span", { key: 'eaf615d41c138e2c73088d29bac9349f49a63ba7', class: "pds-toast__message" }, h("slot", { key: '33973447154d80b016f5a7954b0473db03228379' })), this.dismissible && (h("button", { key: 'e189834633e1e648282ee43633fd05e53ce38869', type: "button", part: "dismiss", class: "pds-toast__button", onClick: () => {
132
132
  this.dismiss();
133
- }, "aria-label": this.dismissLabel }, h("pds-icon", { key: '623a0e4d56e30781fb31bcd085511c17a4777edc', name: "remove" }))))));
133
+ }, "aria-label": this.dismissLabel }, h("pds-icon", { key: '913201979e52be743ba933ff173e023b81553362', name: "remove", "aria-hidden": "true" }))))));
134
134
  }
135
135
  get el() { return getElement(this); }
136
136
  static get watchers() { return {