@phcdevworks/spectre-components 1.20.0 → 1.21.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 (350) hide show
  1. package/README.md +672 -49
  2. package/dist/accordion-item.cjs +540 -0
  3. package/dist/accordion-item.cjs.map +1 -0
  4. package/dist/accordion-item.d.cts +59 -0
  5. package/dist/accordion-item.d.ts +59 -0
  6. package/dist/accordion-item.js +537 -0
  7. package/dist/accordion-item.js.map +1 -0
  8. package/dist/accordion.cjs +468 -0
  9. package/dist/accordion.cjs.map +1 -0
  10. package/dist/accordion.d.cts +38 -0
  11. package/dist/accordion.d.ts +38 -0
  12. package/dist/accordion.js +465 -0
  13. package/dist/accordion.js.map +1 -0
  14. package/dist/alert.cjs +166 -65
  15. package/dist/alert.cjs.map +1 -1
  16. package/dist/alert.d.cts +41 -8
  17. package/dist/alert.d.ts +41 -8
  18. package/dist/alert.js +168 -67
  19. package/dist/alert.js.map +1 -1
  20. package/dist/avatar.cjs +27 -1
  21. package/dist/avatar.cjs.map +1 -1
  22. package/dist/avatar.d.cts +19 -3
  23. package/dist/avatar.d.ts +19 -3
  24. package/dist/avatar.js +27 -1
  25. package/dist/avatar.js.map +1 -1
  26. package/dist/badge.cjs +35 -2
  27. package/dist/badge.cjs.map +1 -1
  28. package/dist/badge.d.cts +31 -3
  29. package/dist/badge.d.ts +31 -3
  30. package/dist/badge.js +35 -2
  31. package/dist/badge.js.map +1 -1
  32. package/dist/breadcrumb.cjs +464 -0
  33. package/dist/breadcrumb.cjs.map +1 -0
  34. package/dist/breadcrumb.d.cts +32 -0
  35. package/dist/breadcrumb.d.ts +32 -0
  36. package/dist/breadcrumb.js +461 -0
  37. package/dist/breadcrumb.js.map +1 -0
  38. package/dist/button.cjs +32 -2
  39. package/dist/button.cjs.map +1 -1
  40. package/dist/button.d.cts +19 -3
  41. package/dist/button.d.ts +19 -3
  42. package/dist/button.js +32 -2
  43. package/dist/button.js.map +1 -1
  44. package/dist/card-bleed.cjs +458 -0
  45. package/dist/card-bleed.cjs.map +1 -0
  46. package/dist/card-bleed.d.cts +37 -0
  47. package/dist/card-bleed.d.ts +37 -0
  48. package/dist/card-bleed.js +455 -0
  49. package/dist/card-bleed.js.map +1 -0
  50. package/dist/card.cjs +27 -1
  51. package/dist/card.cjs.map +1 -1
  52. package/dist/card.d.cts +19 -3
  53. package/dist/card.d.ts +19 -3
  54. package/dist/card.js +27 -1
  55. package/dist/card.js.map +1 -1
  56. package/dist/carousel.cjs +655 -0
  57. package/dist/carousel.cjs.map +1 -0
  58. package/dist/carousel.d.cts +79 -0
  59. package/dist/carousel.d.ts +79 -0
  60. package/dist/carousel.js +652 -0
  61. package/dist/carousel.js.map +1 -0
  62. package/dist/checkbox.cjs +3 -1
  63. package/dist/checkbox.cjs.map +1 -1
  64. package/dist/checkbox.js +3 -1
  65. package/dist/checkbox.js.map +1 -1
  66. package/dist/choice-card.cjs +524 -0
  67. package/dist/choice-card.cjs.map +1 -0
  68. package/dist/choice-card.d.cts +81 -0
  69. package/dist/choice-card.d.ts +81 -0
  70. package/dist/choice-card.js +521 -0
  71. package/dist/choice-card.js.map +1 -0
  72. package/dist/container.cjs +23 -6
  73. package/dist/container.cjs.map +1 -1
  74. package/dist/container.d.cts +9 -3
  75. package/dist/container.d.ts +9 -3
  76. package/dist/container.js +23 -7
  77. package/dist/container.js.map +1 -1
  78. package/dist/datepicker.cjs +580 -0
  79. package/dist/datepicker.cjs.map +1 -0
  80. package/dist/datepicker.d.cts +78 -0
  81. package/dist/datepicker.d.ts +78 -0
  82. package/dist/datepicker.js +577 -0
  83. package/dist/datepicker.js.map +1 -0
  84. package/dist/dom-CX9bgbcQ.d.cts +3 -0
  85. package/dist/dom-CX9bgbcQ.d.ts +3 -0
  86. package/dist/dropdown.cjs +24 -0
  87. package/dist/dropdown.cjs.map +1 -1
  88. package/dist/dropdown.d.cts +3 -2
  89. package/dist/dropdown.d.ts +3 -2
  90. package/dist/dropdown.js +25 -1
  91. package/dist/dropdown.js.map +1 -1
  92. package/dist/external-auth-button.cjs +494 -0
  93. package/dist/external-auth-button.cjs.map +1 -0
  94. package/dist/external-auth-button.d.cts +71 -0
  95. package/dist/external-auth-button.d.ts +71 -0
  96. package/dist/external-auth-button.js +491 -0
  97. package/dist/external-auth-button.js.map +1 -0
  98. package/dist/fieldset.cjs +3 -1
  99. package/dist/fieldset.cjs.map +1 -1
  100. package/dist/fieldset.js +3 -1
  101. package/dist/fieldset.js.map +1 -1
  102. package/dist/file-input.cjs +371 -0
  103. package/dist/file-input.cjs.map +1 -0
  104. package/dist/file-input.d.cts +96 -0
  105. package/dist/file-input.d.ts +96 -0
  106. package/dist/file-input.js +367 -0
  107. package/dist/file-input.js.map +1 -0
  108. package/dist/footer-chip.cjs +22 -2
  109. package/dist/footer-chip.cjs.map +1 -1
  110. package/dist/footer-chip.d.cts +12 -1
  111. package/dist/footer-chip.d.ts +12 -1
  112. package/dist/footer-chip.js +22 -2
  113. package/dist/footer-chip.js.map +1 -1
  114. package/dist/footer-link.cjs +19 -1
  115. package/dist/footer-link.cjs.map +1 -1
  116. package/dist/footer-link.d.cts +12 -1
  117. package/dist/footer-link.d.ts +12 -1
  118. package/dist/footer-link.js +19 -1
  119. package/dist/footer-link.js.map +1 -1
  120. package/dist/footer.cjs +30 -1
  121. package/dist/footer.cjs.map +1 -1
  122. package/dist/footer.d.cts +2 -1
  123. package/dist/footer.d.ts +2 -1
  124. package/dist/footer.js +31 -2
  125. package/dist/footer.js.map +1 -1
  126. package/dist/{form-DpPtizpY.d.cts → form-CVO7mlDa.d.cts} +38 -9
  127. package/dist/{form-DpPtizpY.d.ts → form-CVO7mlDa.d.ts} +38 -9
  128. package/dist/grid.cjs +35 -1
  129. package/dist/grid.cjs.map +1 -1
  130. package/dist/grid.d.cts +9 -3
  131. package/dist/grid.d.ts +9 -3
  132. package/dist/grid.js +35 -2
  133. package/dist/grid.js.map +1 -1
  134. package/dist/icon-box.cjs +27 -1
  135. package/dist/icon-box.cjs.map +1 -1
  136. package/dist/icon-box.d.cts +19 -3
  137. package/dist/icon-box.d.ts +19 -3
  138. package/dist/icon-box.js +27 -1
  139. package/dist/icon-box.js.map +1 -1
  140. package/dist/index.cjs +3654 -107
  141. package/dist/index.cjs.map +1 -1
  142. package/dist/index.d.cts +26 -1
  143. package/dist/index.d.ts +26 -1
  144. package/dist/index.js +3594 -110
  145. package/dist/index.js.map +1 -1
  146. package/dist/input-group.cjs +471 -0
  147. package/dist/input-group.cjs.map +1 -0
  148. package/dist/input-group.d.cts +31 -0
  149. package/dist/input-group.d.ts +31 -0
  150. package/dist/input-group.js +468 -0
  151. package/dist/input-group.js.map +1 -0
  152. package/dist/input.cjs +96 -4
  153. package/dist/input.cjs.map +1 -1
  154. package/dist/input.d.cts +45 -6
  155. package/dist/input.d.ts +45 -6
  156. package/dist/input.js +98 -6
  157. package/dist/input.js.map +1 -1
  158. package/dist/label.cjs +3 -1
  159. package/dist/label.cjs.map +1 -1
  160. package/dist/label.js +3 -1
  161. package/dist/label.js.map +1 -1
  162. package/dist/list-group-item.cjs +367 -0
  163. package/dist/list-group-item.cjs.map +1 -0
  164. package/dist/list-group-item.d.cts +73 -0
  165. package/dist/list-group-item.d.ts +73 -0
  166. package/dist/list-group-item.js +364 -0
  167. package/dist/list-group-item.js.map +1 -0
  168. package/dist/list-group.cjs +610 -0
  169. package/dist/list-group.cjs.map +1 -0
  170. package/dist/list-group.d.cts +58 -0
  171. package/dist/list-group.d.ts +58 -0
  172. package/dist/list-group.js +607 -0
  173. package/dist/list-group.js.map +1 -0
  174. package/dist/modal.cjs +38 -35
  175. package/dist/modal.cjs.map +1 -1
  176. package/dist/modal.d.cts +1 -3
  177. package/dist/modal.d.ts +1 -3
  178. package/dist/modal.js +38 -35
  179. package/dist/modal.js.map +1 -1
  180. package/dist/nav-item.cjs +107 -4
  181. package/dist/nav-item.cjs.map +1 -1
  182. package/dist/nav-item.d.cts +52 -2
  183. package/dist/nav-item.d.ts +52 -2
  184. package/dist/nav-item.js +108 -5
  185. package/dist/nav-item.js.map +1 -1
  186. package/dist/nav.cjs +25 -1
  187. package/dist/nav.cjs.map +1 -1
  188. package/dist/nav.d.cts +2 -1
  189. package/dist/nav.d.ts +2 -1
  190. package/dist/nav.js +26 -2
  191. package/dist/nav.js.map +1 -1
  192. package/dist/offcanvas.cjs +621 -0
  193. package/dist/offcanvas.cjs.map +1 -0
  194. package/dist/offcanvas.d.cts +61 -0
  195. package/dist/offcanvas.d.ts +61 -0
  196. package/dist/offcanvas.js +617 -0
  197. package/dist/offcanvas.js.map +1 -0
  198. package/dist/pagination.cjs +452 -0
  199. package/dist/pagination.cjs.map +1 -0
  200. package/dist/pagination.d.cts +69 -0
  201. package/dist/pagination.d.ts +69 -0
  202. package/dist/pagination.js +448 -0
  203. package/dist/pagination.js.map +1 -0
  204. package/dist/popover.cjs +534 -0
  205. package/dist/popover.cjs.map +1 -0
  206. package/dist/popover.d.cts +59 -0
  207. package/dist/popover.d.ts +59 -0
  208. package/dist/popover.js +530 -0
  209. package/dist/popover.js.map +1 -0
  210. package/dist/pricing-card.cjs +121 -64
  211. package/dist/pricing-card.cjs.map +1 -1
  212. package/dist/pricing-card.d.cts +21 -7
  213. package/dist/pricing-card.d.ts +21 -7
  214. package/dist/pricing-card.js +122 -65
  215. package/dist/pricing-card.js.map +1 -1
  216. package/dist/progress.cjs +403 -0
  217. package/dist/progress.cjs.map +1 -0
  218. package/dist/progress.d.cts +70 -0
  219. package/dist/progress.d.ts +70 -0
  220. package/dist/progress.js +398 -0
  221. package/dist/progress.js.map +1 -0
  222. package/dist/prose.cjs +425 -0
  223. package/dist/prose.cjs.map +1 -0
  224. package/dist/prose.d.cts +21 -0
  225. package/dist/prose.d.ts +21 -0
  226. package/dist/prose.js +422 -0
  227. package/dist/prose.js.map +1 -0
  228. package/dist/radio.cjs +3 -1
  229. package/dist/radio.cjs.map +1 -1
  230. package/dist/radio.js +3 -1
  231. package/dist/radio.js.map +1 -1
  232. package/dist/range.cjs +381 -0
  233. package/dist/range.cjs.map +1 -0
  234. package/dist/range.d.cts +76 -0
  235. package/dist/range.d.ts +76 -0
  236. package/dist/range.js +378 -0
  237. package/dist/range.js.map +1 -0
  238. package/dist/rating.cjs +33 -0
  239. package/dist/rating.cjs.map +1 -1
  240. package/dist/rating.d.cts +38 -3
  241. package/dist/rating.d.ts +38 -3
  242. package/dist/rating.js +33 -0
  243. package/dist/rating.js.map +1 -1
  244. package/dist/section.cjs +27 -3
  245. package/dist/section.cjs.map +1 -1
  246. package/dist/section.d.cts +16 -1
  247. package/dist/section.d.ts +16 -1
  248. package/dist/section.js +27 -4
  249. package/dist/section.js.map +1 -1
  250. package/dist/select.cjs +6 -1
  251. package/dist/select.cjs.map +1 -1
  252. package/dist/select.d.cts +7 -1
  253. package/dist/select.d.ts +7 -1
  254. package/dist/select.js +6 -1
  255. package/dist/select.js.map +1 -1
  256. package/dist/sidebar-link.cjs +19 -1
  257. package/dist/sidebar-link.cjs.map +1 -1
  258. package/dist/sidebar-link.d.cts +13 -2
  259. package/dist/sidebar-link.d.ts +13 -2
  260. package/dist/sidebar-link.js +19 -1
  261. package/dist/sidebar-link.js.map +1 -1
  262. package/dist/sidebar-toggle.cjs +3 -1
  263. package/dist/sidebar-toggle.cjs.map +1 -1
  264. package/dist/sidebar-toggle.js +3 -1
  265. package/dist/sidebar-toggle.js.map +1 -1
  266. package/dist/sidebar.cjs +33 -1
  267. package/dist/sidebar.cjs.map +1 -1
  268. package/dist/sidebar.d.cts +1 -0
  269. package/dist/sidebar.d.ts +1 -0
  270. package/dist/sidebar.js +34 -2
  271. package/dist/sidebar.js.map +1 -1
  272. package/dist/spinner.cjs +2 -1
  273. package/dist/spinner.cjs.map +1 -1
  274. package/dist/spinner.d.cts +2 -2
  275. package/dist/spinner.d.ts +2 -2
  276. package/dist/spinner.js +2 -1
  277. package/dist/spinner.js.map +1 -1
  278. package/dist/stack.cjs +4 -2
  279. package/dist/stack.cjs.map +1 -1
  280. package/dist/stack.d.cts +2 -2
  281. package/dist/stack.d.ts +2 -2
  282. package/dist/stack.js +4 -2
  283. package/dist/stack.js.map +1 -1
  284. package/dist/states-Bgzwu_XZ.d.cts +9 -0
  285. package/dist/states-Bgzwu_XZ.d.ts +9 -0
  286. package/dist/stepper.cjs +495 -0
  287. package/dist/stepper.cjs.map +1 -0
  288. package/dist/stepper.d.cts +40 -0
  289. package/dist/stepper.d.ts +40 -0
  290. package/dist/stepper.js +491 -0
  291. package/dist/stepper.js.map +1 -0
  292. package/dist/switch.cjs +492 -0
  293. package/dist/switch.cjs.map +1 -0
  294. package/dist/switch.d.cts +82 -0
  295. package/dist/switch.d.ts +82 -0
  296. package/dist/switch.js +488 -0
  297. package/dist/switch.js.map +1 -0
  298. package/dist/tab-panel.cjs +465 -0
  299. package/dist/tab-panel.cjs.map +1 -0
  300. package/dist/tab-panel.d.cts +48 -0
  301. package/dist/tab-panel.d.ts +48 -0
  302. package/dist/tab-panel.js +462 -0
  303. package/dist/tab-panel.js.map +1 -0
  304. package/dist/table.cjs +506 -0
  305. package/dist/table.cjs.map +1 -0
  306. package/dist/table.d.cts +54 -0
  307. package/dist/table.d.ts +54 -0
  308. package/dist/table.js +501 -0
  309. package/dist/table.js.map +1 -0
  310. package/dist/tabs.cjs +596 -0
  311. package/dist/tabs.cjs.map +1 -0
  312. package/dist/tabs.d.cts +65 -0
  313. package/dist/tabs.d.ts +65 -0
  314. package/dist/tabs.js +592 -0
  315. package/dist/tabs.js.map +1 -0
  316. package/dist/tag.cjs +27 -1
  317. package/dist/tag.cjs.map +1 -1
  318. package/dist/tag.d.cts +19 -3
  319. package/dist/tag.d.ts +19 -3
  320. package/dist/tag.js +27 -1
  321. package/dist/tag.js.map +1 -1
  322. package/dist/testimonial.cjs +130 -64
  323. package/dist/testimonial.cjs.map +1 -1
  324. package/dist/testimonial.d.cts +23 -8
  325. package/dist/testimonial.d.ts +23 -8
  326. package/dist/testimonial.js +131 -65
  327. package/dist/testimonial.js.map +1 -1
  328. package/dist/text.cjs +65 -6
  329. package/dist/text.cjs.map +1 -1
  330. package/dist/text.d.cts +24 -3
  331. package/dist/text.d.ts +24 -3
  332. package/dist/text.js +64 -8
  333. package/dist/text.js.map +1 -1
  334. package/dist/textarea.cjs +3 -0
  335. package/dist/textarea.cjs.map +1 -1
  336. package/dist/textarea.d.cts +7 -1
  337. package/dist/textarea.d.ts +7 -1
  338. package/dist/textarea.js +3 -0
  339. package/dist/textarea.js.map +1 -1
  340. package/dist/toast.cjs +2 -1
  341. package/dist/toast.cjs.map +1 -1
  342. package/dist/toast.d.cts +2 -2
  343. package/dist/toast.d.ts +2 -2
  344. package/dist/toast.js +2 -1
  345. package/dist/toast.js.map +1 -1
  346. package/dist/tooltip.cjs.map +1 -1
  347. package/dist/tooltip.d.cts +2 -2
  348. package/dist/tooltip.d.ts +2 -2
  349. package/dist/tooltip.js.map +1 -1
  350. package/package.json +126 -11
@@ -0,0 +1,59 @@
1
+ import * as lit_html from 'lit-html';
2
+ import { S as SpectreBaseElement } from './base-D0s95V2v.cjs';
3
+ import { w as SpectrePopoverPlacement } from './form-CVO7mlDa.cjs';
4
+ export { ab as spectrePopoverPlacements } from './form-CVO7mlDa.cjs';
5
+ import 'lit';
6
+
7
+ interface SpectrePopoverProps {
8
+ ariaLabel?: string | null;
9
+ id?: string | null | undefined;
10
+ label?: string | undefined;
11
+ open?: boolean | undefined;
12
+ placement?: SpectrePopoverPlacement | undefined;
13
+ title?: string | null | undefined;
14
+ triggerLabel?: string | undefined;
15
+ }
16
+ declare class SpectrePopoverElement extends SpectreBaseElement implements SpectrePopoverProps {
17
+ static properties: {
18
+ label: {
19
+ type: StringConstructor;
20
+ };
21
+ open: {
22
+ type: BooleanConstructor;
23
+ reflect: boolean;
24
+ };
25
+ placement: {
26
+ type: StringConstructor;
27
+ reflect: boolean;
28
+ };
29
+ triggerLabel: {
30
+ attribute: string;
31
+ type: StringConstructor;
32
+ };
33
+ };
34
+ label: string | undefined;
35
+ open: boolean | undefined;
36
+ placement: SpectrePopoverPlacement | undefined;
37
+ triggerLabel: string | undefined;
38
+ private readonly baseId;
39
+ private readonly projection;
40
+ get id(): string;
41
+ set id(value: string | null | undefined);
42
+ get title(): string;
43
+ set title(value: string | null | undefined);
44
+ connectedCallback(): void;
45
+ disconnectedCallback(): void;
46
+ protected willUpdate(changedProperties: Map<PropertyKey, unknown>): void;
47
+ private get triggerElement();
48
+ private get panelId();
49
+ private get headerId();
50
+ private get hasHeader();
51
+ private handleDocumentClick;
52
+ private handleDocumentKeydown;
53
+ private setOpen;
54
+ private get dialogLabelledBy();
55
+ render(): lit_html.TemplateResult<1>;
56
+ }
57
+ declare function defineSpectrePopover(tagName?: string): typeof SpectrePopoverElement;
58
+
59
+ export { SpectrePopoverElement, SpectrePopoverPlacement, type SpectrePopoverProps, defineSpectrePopover };
@@ -0,0 +1,59 @@
1
+ import * as lit_html from 'lit-html';
2
+ import { S as SpectreBaseElement } from './base-D0s95V2v.js';
3
+ import { w as SpectrePopoverPlacement } from './form-CVO7mlDa.js';
4
+ export { ab as spectrePopoverPlacements } from './form-CVO7mlDa.js';
5
+ import 'lit';
6
+
7
+ interface SpectrePopoverProps {
8
+ ariaLabel?: string | null;
9
+ id?: string | null | undefined;
10
+ label?: string | undefined;
11
+ open?: boolean | undefined;
12
+ placement?: SpectrePopoverPlacement | undefined;
13
+ title?: string | null | undefined;
14
+ triggerLabel?: string | undefined;
15
+ }
16
+ declare class SpectrePopoverElement extends SpectreBaseElement implements SpectrePopoverProps {
17
+ static properties: {
18
+ label: {
19
+ type: StringConstructor;
20
+ };
21
+ open: {
22
+ type: BooleanConstructor;
23
+ reflect: boolean;
24
+ };
25
+ placement: {
26
+ type: StringConstructor;
27
+ reflect: boolean;
28
+ };
29
+ triggerLabel: {
30
+ attribute: string;
31
+ type: StringConstructor;
32
+ };
33
+ };
34
+ label: string | undefined;
35
+ open: boolean | undefined;
36
+ placement: SpectrePopoverPlacement | undefined;
37
+ triggerLabel: string | undefined;
38
+ private readonly baseId;
39
+ private readonly projection;
40
+ get id(): string;
41
+ set id(value: string | null | undefined);
42
+ get title(): string;
43
+ set title(value: string | null | undefined);
44
+ connectedCallback(): void;
45
+ disconnectedCallback(): void;
46
+ protected willUpdate(changedProperties: Map<PropertyKey, unknown>): void;
47
+ private get triggerElement();
48
+ private get panelId();
49
+ private get headerId();
50
+ private get hasHeader();
51
+ private handleDocumentClick;
52
+ private handleDocumentKeydown;
53
+ private setOpen;
54
+ private get dialogLabelledBy();
55
+ render(): lit_html.TemplateResult<1>;
56
+ }
57
+ declare function defineSpectrePopover(tagName?: string): typeof SpectrePopoverElement;
58
+
59
+ export { SpectrePopoverElement, SpectrePopoverPlacement, type SpectrePopoverProps, defineSpectrePopover };
@@ -0,0 +1,530 @@
1
+ import { LitElement, nothing, html } from 'lit';
2
+ import { ifDefined } from 'lit/directives/if-defined.js';
3
+ import { getPopoverClasses, getPopoverArrowClasses, getPopoverHeaderClasses, getPopoverBodyClasses } from '@phcdevworks/spectre-ui';
4
+
5
+ // src/components/popover/sp-popover.ts
6
+ var SpectreBaseElement = class extends LitElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this._ariaLabel = null;
10
+ this._ariaLabelledBy = null;
11
+ this._ariaDescribedBy = null;
12
+ this._autocapitalize = "";
13
+ this._autofocus = false;
14
+ this._spellcheck = null;
15
+ this._title = "";
16
+ this._id = "";
17
+ }
18
+ get ariaLabel() {
19
+ return this._ariaLabel;
20
+ }
21
+ set ariaLabel(value) {
22
+ if (this._ariaLabel === value) {
23
+ return;
24
+ }
25
+ this._ariaLabel = value;
26
+ this._removeHostAttribute("aria-label");
27
+ this.requestUpdate();
28
+ }
29
+ get ariaLabelledBy() {
30
+ return this._ariaLabelledBy;
31
+ }
32
+ set ariaLabelledBy(value) {
33
+ if (this._ariaLabelledBy === value) {
34
+ return;
35
+ }
36
+ this._ariaLabelledBy = value;
37
+ this._removeHostAttribute("aria-labelledby");
38
+ this.requestUpdate();
39
+ }
40
+ get ariaDescribedBy() {
41
+ return this._ariaDescribedBy;
42
+ }
43
+ set ariaDescribedBy(value) {
44
+ if (this._ariaDescribedBy === value) {
45
+ return;
46
+ }
47
+ this._ariaDescribedBy = value;
48
+ this._removeHostAttribute("aria-describedby");
49
+ this.requestUpdate();
50
+ }
51
+ get autocapitalize() {
52
+ return this._autocapitalize;
53
+ }
54
+ set autocapitalize(value) {
55
+ const normalizedValue = value ?? "";
56
+ if (this._autocapitalize === normalizedValue) {
57
+ return;
58
+ }
59
+ this._autocapitalize = normalizedValue;
60
+ this._removeHostAttribute("autocapitalize");
61
+ this.requestUpdate();
62
+ }
63
+ get spellcheck() {
64
+ return this._spellcheck ?? super.spellcheck;
65
+ }
66
+ set spellcheck(value) {
67
+ if (this._spellcheck === value) {
68
+ return;
69
+ }
70
+ this._spellcheck = value ?? null;
71
+ this._removeHostAttribute("spellcheck");
72
+ this.requestUpdate();
73
+ }
74
+ get title() {
75
+ return this._title;
76
+ }
77
+ set title(value) {
78
+ const normalizedValue = value ?? "";
79
+ if (this._title === normalizedValue) {
80
+ return;
81
+ }
82
+ this._title = normalizedValue;
83
+ this._removeHostAttribute("title");
84
+ this.requestUpdate();
85
+ }
86
+ get id() {
87
+ return this._id;
88
+ }
89
+ set id(value) {
90
+ const normalizedValue = value ?? "";
91
+ if (this._id === normalizedValue) {
92
+ return;
93
+ }
94
+ this._id = normalizedValue;
95
+ this._removeHostAttribute("id");
96
+ this.requestUpdate();
97
+ }
98
+ get autofocus() {
99
+ return this._autofocus;
100
+ }
101
+ set autofocus(value) {
102
+ const normalizedValue = !!value;
103
+ if (this._autofocus === normalizedValue) {
104
+ return;
105
+ }
106
+ this._autofocus = normalizedValue;
107
+ this._removeHostAttribute("autofocus");
108
+ this.requestUpdate();
109
+ }
110
+ // Spectre components intentionally render in light DOM so the global
111
+ // `@phcdevworks/spectre-ui` styling contract can apply directly.
112
+ createRenderRoot() {
113
+ return this;
114
+ }
115
+ connectedCallback() {
116
+ super.connectedCallback();
117
+ const proxiedAttributes = [
118
+ "id",
119
+ "title",
120
+ "autocapitalize",
121
+ "autofocus",
122
+ "spellcheck",
123
+ "aria-label",
124
+ "aria-labelledby",
125
+ "aria-describedby"
126
+ ];
127
+ proxiedAttributes.forEach((attr) => {
128
+ const value = super.getAttribute(attr);
129
+ if (value !== null) {
130
+ this.setAttribute(attr, value);
131
+ }
132
+ });
133
+ }
134
+ getAttribute(qualifiedName) {
135
+ switch (qualifiedName) {
136
+ case "id":
137
+ return this.id || null;
138
+ case "title":
139
+ return this.title || null;
140
+ case "autocapitalize":
141
+ return this.autocapitalize || null;
142
+ case "autofocus":
143
+ return this.autofocus ? "" : null;
144
+ case "spellcheck":
145
+ return this._spellcheck !== null ? String(this._spellcheck) : null;
146
+ case "aria-label":
147
+ return this.ariaLabel;
148
+ case "aria-labelledby":
149
+ return this.ariaLabelledBy;
150
+ case "aria-describedby":
151
+ return this.ariaDescribedBy;
152
+ default:
153
+ return super.getAttribute(qualifiedName);
154
+ }
155
+ }
156
+ hasAttribute(qualifiedName) {
157
+ switch (qualifiedName) {
158
+ case "id":
159
+ return this.id !== "";
160
+ case "title":
161
+ return this.title !== "";
162
+ case "autocapitalize":
163
+ return this.autocapitalize !== "";
164
+ case "autofocus":
165
+ return this.autofocus;
166
+ case "spellcheck":
167
+ return this._spellcheck !== null;
168
+ case "aria-label":
169
+ return this.ariaLabel !== null;
170
+ case "aria-labelledby":
171
+ return this.ariaLabelledBy !== null;
172
+ case "aria-describedby":
173
+ return this.ariaDescribedBy !== null;
174
+ default:
175
+ return super.hasAttribute(qualifiedName);
176
+ }
177
+ }
178
+ setAttribute(qualifiedName, value) {
179
+ switch (qualifiedName) {
180
+ case "id":
181
+ this.id = value;
182
+ break;
183
+ case "title":
184
+ this.title = value;
185
+ break;
186
+ case "autocapitalize":
187
+ this.autocapitalize = value;
188
+ break;
189
+ case "autofocus":
190
+ this.autofocus = true;
191
+ break;
192
+ case "spellcheck":
193
+ this.spellcheck = value !== "false";
194
+ break;
195
+ case "aria-label":
196
+ this.ariaLabel = value;
197
+ break;
198
+ case "aria-labelledby":
199
+ this.ariaLabelledBy = value;
200
+ break;
201
+ case "aria-describedby":
202
+ this.ariaDescribedBy = value;
203
+ break;
204
+ default:
205
+ super.setAttribute(qualifiedName, value);
206
+ }
207
+ }
208
+ removeAttribute(qualifiedName) {
209
+ switch (qualifiedName) {
210
+ case "id":
211
+ this.id = "";
212
+ break;
213
+ case "title":
214
+ this.title = "";
215
+ break;
216
+ case "autocapitalize":
217
+ this.autocapitalize = "";
218
+ break;
219
+ case "autofocus":
220
+ this.autofocus = false;
221
+ break;
222
+ case "spellcheck":
223
+ this.spellcheck = null;
224
+ break;
225
+ case "aria-label":
226
+ this.ariaLabel = null;
227
+ break;
228
+ case "aria-labelledby":
229
+ this.ariaLabelledBy = null;
230
+ break;
231
+ case "aria-describedby":
232
+ this.ariaDescribedBy = null;
233
+ break;
234
+ default:
235
+ super.removeAttribute(qualifiedName);
236
+ }
237
+ }
238
+ _removeHostAttribute(name) {
239
+ const host = this;
240
+ if (HTMLElement.prototype.hasAttribute.call(host, name)) {
241
+ HTMLElement.prototype.removeAttribute.call(host, name);
242
+ }
243
+ }
244
+ get forwardedAriaLabel() {
245
+ const value = this.ariaLabel?.trim();
246
+ return value ? value : void 0;
247
+ }
248
+ get forwardedAriaLabelledBy() {
249
+ const value = this.ariaLabelledBy?.trim();
250
+ return value ? value : void 0;
251
+ }
252
+ get forwardedAriaDescribedBy() {
253
+ const value = this.ariaDescribedBy?.trim();
254
+ return value ? value : void 0;
255
+ }
256
+ // Subclasses that expose `disabled`/`loading` properties get this disabled
257
+ // calculation for free instead of redeclaring it per component.
258
+ get isDisabled() {
259
+ const self = this;
260
+ return (self.disabled ?? false) || (self.loading ?? false);
261
+ }
262
+ // Subclasses get this for free instead of redeclaring it per component.
263
+ get hasForwardedLabel() {
264
+ return Boolean(this.forwardedAriaLabel || this.forwardedAriaLabelledBy);
265
+ }
266
+ };
267
+ SpectreBaseElement.properties = {};
268
+
269
+ // src/utils/dom.ts
270
+ function hasMeaningfulContent(nodes) {
271
+ return nodes.some((node) => {
272
+ if (node.nodeType === Node.ELEMENT_NODE) {
273
+ return true;
274
+ }
275
+ if (node.nodeType === Node.TEXT_NODE) {
276
+ return (node.textContent?.trim().length ?? 0) > 0;
277
+ }
278
+ return false;
279
+ });
280
+ }
281
+ var idCounter = 0;
282
+ function createUniqueId(prefix) {
283
+ idCounter += 1;
284
+ return `${prefix}-${idCounter}`;
285
+ }
286
+ var spectrePopoverPlacements = [
287
+ "top",
288
+ "bottom",
289
+ "left",
290
+ "right"
291
+ ];
292
+ function isPopoverPlacement(value) {
293
+ return spectrePopoverPlacements.includes(
294
+ value
295
+ );
296
+ }
297
+
298
+ // src/utils/projection.ts
299
+ function slotOf(node) {
300
+ if (node.nodeType !== Node.ELEMENT_NODE) {
301
+ return void 0;
302
+ }
303
+ return node.getAttribute("slot") ?? void 0;
304
+ }
305
+ var ProjectionController = class {
306
+ constructor(host, internalAttributes) {
307
+ this.host = host;
308
+ this.internalAttributes = internalAttributes;
309
+ this.projected = [];
310
+ host.addController(this);
311
+ }
312
+ hostConnected() {
313
+ this.sync();
314
+ this.observe();
315
+ }
316
+ hostDisconnected() {
317
+ this.disconnect();
318
+ }
319
+ hostUpdate() {
320
+ this.sync();
321
+ this.disconnect();
322
+ }
323
+ hostUpdated() {
324
+ this.observe();
325
+ }
326
+ // Every projected node in authored order, regardless of slot.
327
+ all() {
328
+ return [...this.projected];
329
+ }
330
+ // Omitting `slot` returns the nodes without a slot attribute.
331
+ nodes(slot) {
332
+ return this.projected.filter((node) => slotOf(node) === slot);
333
+ }
334
+ elements(slot) {
335
+ return this.nodes(slot).filter(
336
+ (node) => node.nodeType === Node.ELEMENT_NODE
337
+ );
338
+ }
339
+ has(slot) {
340
+ return hasMeaningfulContent(this.nodes(slot));
341
+ }
342
+ isInternalNode(node) {
343
+ return node.nodeType === Node.ELEMENT_NODE && this.internalAttributes.some(
344
+ (name) => node.hasAttribute(name)
345
+ );
346
+ }
347
+ isProjectable(node) {
348
+ if (node.nodeType === Node.COMMENT_NODE || this.isInternalNode(node)) {
349
+ return false;
350
+ }
351
+ if (node.nodeType === Node.TEXT_NODE && this.hostHasRendered) {
352
+ return Boolean(node.textContent?.trim());
353
+ }
354
+ return true;
355
+ }
356
+ get hostHasRendered() {
357
+ return this.host.hasUpdated;
358
+ }
359
+ sync() {
360
+ const next = [
361
+ .../* @__PURE__ */ new Set([
362
+ ...this.projected.filter((node) => this.host.contains(node)),
363
+ ...Array.from(this.host.childNodes).filter(
364
+ (node) => this.isProjectable(node)
365
+ )
366
+ ])
367
+ ];
368
+ const changed = next.length !== this.projected.length || next.some((node, index) => node !== this.projected[index]);
369
+ if (changed) {
370
+ this.projected = next;
371
+ }
372
+ return changed;
373
+ }
374
+ observe() {
375
+ if (this.observer || !this.host.isConnected) {
376
+ return;
377
+ }
378
+ this.observer = new MutationObserver(() => {
379
+ if (this.sync()) {
380
+ this.host.requestUpdate();
381
+ }
382
+ });
383
+ this.observer.observe(this.host, { childList: true });
384
+ }
385
+ disconnect() {
386
+ this.observer?.disconnect();
387
+ this.observer = void 0;
388
+ }
389
+ };
390
+ var SpectrePopoverElement = class extends SpectreBaseElement {
391
+ constructor() {
392
+ super(...arguments);
393
+ this.label = void 0;
394
+ this.open = false;
395
+ this.placement = "bottom";
396
+ this.triggerLabel = "Show details";
397
+ this.baseId = createUniqueId("sp-popover");
398
+ this.projection = new ProjectionController(this, [
399
+ "data-sp-popover-trigger",
400
+ "data-sp-popover-native"
401
+ ]);
402
+ this.handleDocumentClick = (event) => {
403
+ if (this.open && !event.composedPath().includes(this)) {
404
+ this.setOpen(false);
405
+ }
406
+ };
407
+ this.handleDocumentKeydown = (event) => {
408
+ if (event.key === "Escape" && this.open) {
409
+ this.setOpen(false);
410
+ this.triggerElement?.focus();
411
+ }
412
+ };
413
+ }
414
+ get id() {
415
+ return super.id;
416
+ }
417
+ set id(value) {
418
+ super.id = value;
419
+ }
420
+ get title() {
421
+ return super.title;
422
+ }
423
+ set title(value) {
424
+ super.title = value;
425
+ }
426
+ connectedCallback() {
427
+ var _a, _b;
428
+ super.connectedCallback();
429
+ (_a = this.style).position || (_a.position = "relative");
430
+ (_b = this.style).display || (_b.display = "inline-block");
431
+ document.addEventListener("click", this.handleDocumentClick);
432
+ document.addEventListener("keydown", this.handleDocumentKeydown);
433
+ }
434
+ disconnectedCallback() {
435
+ document.removeEventListener("click", this.handleDocumentClick);
436
+ document.removeEventListener("keydown", this.handleDocumentKeydown);
437
+ super.disconnectedCallback();
438
+ }
439
+ willUpdate(changedProperties) {
440
+ if (changedProperties.has("open") && this.open == null) {
441
+ this.open = false;
442
+ }
443
+ if (changedProperties.has("placement") && (this.placement == null || !isPopoverPlacement(this.placement))) {
444
+ this.placement = "bottom";
445
+ }
446
+ if (changedProperties.has("triggerLabel") && !this.triggerLabel) {
447
+ this.triggerLabel = "Show details";
448
+ }
449
+ }
450
+ get triggerElement() {
451
+ return this.querySelector("[data-sp-popover-trigger]");
452
+ }
453
+ get panelId() {
454
+ return this.id || `${this.baseId}-panel`;
455
+ }
456
+ get headerId() {
457
+ return `${this.baseId}-header`;
458
+ }
459
+ get hasHeader() {
460
+ return this.projection.has("header") || Boolean(this.label);
461
+ }
462
+ setOpen(open) {
463
+ if (this.open === open) {
464
+ return;
465
+ }
466
+ this.open = open;
467
+ this.dispatchEvent(
468
+ new CustomEvent(open ? "sp-open" : "sp-close", { bubbles: true })
469
+ );
470
+ }
471
+ get dialogLabelledBy() {
472
+ if (this.forwardedAriaLabel) {
473
+ return void 0;
474
+ }
475
+ return this.hasHeader ? this.headerId : `${this.baseId}-trigger`;
476
+ }
477
+ render() {
478
+ const open = this.open ?? false;
479
+ return html`<button
480
+ aria-controls="${this.panelId}"
481
+ aria-expanded="${open ? "true" : "false"}"
482
+ aria-haspopup="dialog"
483
+ data-sp-popover-trigger
484
+ id="${this.baseId}-trigger"
485
+ type="button"
486
+ @click="${() => this.setOpen(!open)}"
487
+ >
488
+ ${this.projection.has("trigger") ? this.projection.nodes("trigger") : this.triggerLabel}
489
+ </button>
490
+ <div
491
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
492
+ aria-labelledby="${ifDefined(this.dialogLabelledBy)}"
493
+ class="${getPopoverClasses({
494
+ open,
495
+ placement: this.placement
496
+ })}"
497
+ data-sp-popover-native
498
+ id="${this.panelId}"
499
+ role="dialog"
500
+ title="${ifDefined(this.title || void 0)}"
501
+ >
502
+ <span aria-hidden="true" class="${getPopoverArrowClasses()}"></span>
503
+ ${this.hasHeader ? html`<div
504
+ class="${getPopoverHeaderClasses()}"
505
+ id="${this.headerId}"
506
+ >
507
+ ${this.projection.has("header") ? this.projection.nodes("header") : this.label}
508
+ </div>` : nothing}
509
+ <div class="${getPopoverBodyClasses()}">${this.projection.nodes()}</div>
510
+ </div>`;
511
+ }
512
+ };
513
+ SpectrePopoverElement.properties = {
514
+ label: { type: String },
515
+ open: { type: Boolean, reflect: true },
516
+ placement: { type: String, reflect: true },
517
+ triggerLabel: { attribute: "trigger-label", type: String }
518
+ };
519
+ function defineSpectrePopover(tagName = "sp-popover") {
520
+ const existingElement = customElements.get(tagName);
521
+ if (existingElement) {
522
+ return existingElement;
523
+ }
524
+ customElements.define(tagName, SpectrePopoverElement);
525
+ return SpectrePopoverElement;
526
+ }
527
+
528
+ export { SpectrePopoverElement, defineSpectrePopover, spectrePopoverPlacements };
529
+ //# sourceMappingURL=popover.js.map
530
+ //# sourceMappingURL=popover.js.map