@grantcodes/ui 2.15.6 → 2.16.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 (300) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/custom-elements.json +476 -346
  3. package/package.json +23 -23
  4. package/src/components/accordion/accordion-item.component.js +17 -19
  5. package/src/components/accordion/accordion-item.css +40 -44
  6. package/src/components/accordion/accordion.component.js +7 -7
  7. package/src/components/accordion/accordion.css +5 -5
  8. package/src/components/accordion/accordion.js +6 -6
  9. package/src/components/accordion/accordion.react.js +6 -6
  10. package/src/components/accordion/accordion.stories.js +10 -10
  11. package/src/components/accordion/accordion.test.js +100 -100
  12. package/src/components/accordion/index.js +6 -6
  13. package/src/components/app-bar/app-bar.component.js +86 -92
  14. package/src/components/app-bar/app-bar.css +187 -203
  15. package/src/components/app-bar/app-bar.js +3 -3
  16. package/src/components/app-bar/app-bar.react.js +9 -9
  17. package/src/components/app-bar/app-bar.stories.js +20 -20
  18. package/src/components/app-bar/app-bar.test.js +190 -237
  19. package/src/components/app-bar/index.js +1 -1
  20. package/src/components/app-bar/nav-link.component.js +7 -9
  21. package/src/components/app-bar/nav-link.css +23 -28
  22. package/src/components/app-bar/nav-link.js +3 -3
  23. package/src/components/app-bar/nav-link.react.js +6 -6
  24. package/src/components/avatar/avatar.component.js +79 -68
  25. package/src/components/avatar/avatar.css +18 -18
  26. package/src/components/avatar/avatar.js +3 -3
  27. package/src/components/avatar/avatar.react.js +6 -6
  28. package/src/components/avatar/avatar.stories.js +24 -23
  29. package/src/components/avatar/avatar.test.js +128 -84
  30. package/src/components/avatar/index.js +1 -1
  31. package/src/components/badge/badge.component.js +23 -23
  32. package/src/components/badge/badge.css +39 -52
  33. package/src/components/badge/badge.js +3 -3
  34. package/src/components/badge/badge.react.js +6 -6
  35. package/src/components/badge/badge.stories.js +23 -23
  36. package/src/components/badge/badge.test.js +53 -68
  37. package/src/components/badge/index.js +1 -1
  38. package/src/components/breadcrumb/breadcrumb.component.js +95 -96
  39. package/src/components/breadcrumb/breadcrumb.css +42 -44
  40. package/src/components/breadcrumb/breadcrumb.js +6 -9
  41. package/src/components/breadcrumb/breadcrumb.react.js +9 -12
  42. package/src/components/breadcrumb/breadcrumb.stories.js +5 -5
  43. package/src/components/breadcrumb/breadcrumb.test.js +139 -151
  44. package/src/components/breadcrumb/index.js +1 -1
  45. package/src/components/button/button.component.js +101 -103
  46. package/src/components/button/button.css +90 -94
  47. package/src/components/button/button.js +3 -3
  48. package/src/components/button/button.react.js +6 -6
  49. package/src/components/button/button.stories.js +25 -25
  50. package/src/components/button/button.test.js +324 -344
  51. package/src/components/button/index.js +1 -1
  52. package/src/components/button-group/button-group.component.js +18 -18
  53. package/src/components/button-group/button-group.css +16 -16
  54. package/src/components/button-group/button-group.js +3 -3
  55. package/src/components/button-group/button-group.react.js +6 -6
  56. package/src/components/button-group/button-group.stories.js +23 -23
  57. package/src/components/button-group/button-group.test.js +54 -54
  58. package/src/components/button-group/index.js +1 -1
  59. package/src/components/card/card.component.js +31 -33
  60. package/src/components/card/card.css +85 -85
  61. package/src/components/card/card.js +4 -4
  62. package/src/components/card/card.react.js +6 -6
  63. package/src/components/card/card.stories.js +27 -26
  64. package/src/components/card/card.test.js +56 -56
  65. package/src/components/card/index.js +1 -1
  66. package/src/components/code-preview/code-preview.component.js +47 -48
  67. package/src/components/code-preview/code-preview.css +11 -11
  68. package/src/components/code-preview/code-preview.js +3 -3
  69. package/src/components/code-preview/code-preview.react.js +6 -6
  70. package/src/components/code-preview/code-preview.stories.js +29 -29
  71. package/src/components/code-preview/code-preview.test.js +112 -135
  72. package/src/components/code-preview/index.js +1 -1
  73. package/src/components/container/container.component.js +27 -27
  74. package/src/components/container/container.css +22 -22
  75. package/src/components/container/container.js +3 -3
  76. package/src/components/container/container.react.js +6 -6
  77. package/src/components/container/container.stories.js +44 -44
  78. package/src/components/container/container.test.js +54 -66
  79. package/src/components/container/index.js +1 -1
  80. package/src/components/countdown/countdown.component.js +160 -162
  81. package/src/components/countdown/countdown.css +50 -34
  82. package/src/components/countdown/countdown.js +3 -3
  83. package/src/components/countdown/countdown.react.js +6 -6
  84. package/src/components/countdown/countdown.stories.js +34 -34
  85. package/src/components/countdown/index.js +1 -1
  86. package/src/components/cta/cta.component.js +77 -81
  87. package/src/components/cta/cta.css +24 -24
  88. package/src/components/cta/cta.js +3 -3
  89. package/src/components/cta/cta.react.js +6 -6
  90. package/src/components/cta/cta.stories.js +32 -32
  91. package/src/components/cta/index.js +1 -1
  92. package/src/components/dialog/dialog.component.js +95 -58
  93. package/src/components/dialog/dialog.css +45 -50
  94. package/src/components/dialog/dialog.js +3 -3
  95. package/src/components/dialog/dialog.react.js +6 -6
  96. package/src/components/dialog/dialog.stories.js +38 -29
  97. package/src/components/dialog/dialog.test.js +188 -102
  98. package/src/components/dialog/index.js +1 -1
  99. package/src/components/dropdown/dropdown.component.js +220 -201
  100. package/src/components/dropdown/dropdown.css +60 -84
  101. package/src/components/dropdown/dropdown.js +6 -9
  102. package/src/components/dropdown/dropdown.react.js +15 -15
  103. package/src/components/dropdown/dropdown.stories.js +10 -10
  104. package/src/components/dropdown/dropdown.test.js +211 -157
  105. package/src/components/dropdown/index.js +1 -1
  106. package/src/components/dropzone/dropzone.component.js +126 -129
  107. package/src/components/dropzone/dropzone.css +35 -37
  108. package/src/components/dropzone/dropzone.js +3 -3
  109. package/src/components/dropzone/dropzone.react.js +6 -6
  110. package/src/components/dropzone/dropzone.stories.js +28 -28
  111. package/src/components/dropzone/dropzone.test.js +91 -99
  112. package/src/components/dropzone/index.js +1 -1
  113. package/src/components/feature-list/feature-list.component.js +78 -86
  114. package/src/components/feature-list/feature-list.css +37 -37
  115. package/src/components/feature-list/feature-list.js +3 -3
  116. package/src/components/feature-list/feature-list.react.js +6 -6
  117. package/src/components/feature-list/feature-list.stories.js +86 -90
  118. package/src/components/feature-list/index.js +1 -1
  119. package/src/components/footer/footer-column.component.js +7 -7
  120. package/src/components/footer/footer-column.css +22 -22
  121. package/src/components/footer/footer.component.js +19 -19
  122. package/src/components/footer/footer.css +38 -38
  123. package/src/components/footer/footer.js +8 -8
  124. package/src/components/footer/footer.react.js +9 -9
  125. package/src/components/footer/footer.stories.js +9 -9
  126. package/src/components/footer/footer.test.js +101 -111
  127. package/src/components/footer/index.js +2 -2
  128. package/src/components/form-field/form-field.component.js +167 -125
  129. package/src/components/form-field/form-field.css +24 -24
  130. package/src/components/form-field/form-field.js +3 -3
  131. package/src/components/form-field/form-field.react.js +6 -6
  132. package/src/components/form-field/form-field.stories.js +53 -44
  133. package/src/components/form-field/form-field.test.js +280 -134
  134. package/src/components/form-field/index.js +1 -1
  135. package/src/components/gallery/gallery-image.component.js +30 -30
  136. package/src/components/gallery/gallery-image.js +3 -3
  137. package/src/components/gallery/gallery-image.react.js +6 -6
  138. package/src/components/gallery/gallery.component.js +24 -17
  139. package/src/components/gallery/gallery.css +79 -72
  140. package/src/components/gallery/gallery.js +3 -3
  141. package/src/components/gallery/gallery.react.js +6 -6
  142. package/src/components/gallery/gallery.stories.js +69 -68
  143. package/src/components/gallery/gallery.test.js +95 -88
  144. package/src/components/gallery/index.js +2 -2
  145. package/src/components/hero/hero.component.js +53 -57
  146. package/src/components/hero/hero.css +27 -27
  147. package/src/components/hero/hero.js +3 -3
  148. package/src/components/hero/hero.react.js +6 -6
  149. package/src/components/hero/hero.stories.js +39 -39
  150. package/src/components/hero/index.js +1 -1
  151. package/src/components/icon/icon.component.js +10 -10
  152. package/src/components/icon/icon.css +13 -13
  153. package/src/components/icon/icon.js +4 -4
  154. package/src/components/icon/icon.react.js +6 -6
  155. package/src/components/icon/icon.stories.js +8 -9
  156. package/src/components/icon/icon.test.js +54 -55
  157. package/src/components/icon/index.js +1 -1
  158. package/src/components/loading/index.js +1 -1
  159. package/src/components/loading/loading.component.js +41 -14
  160. package/src/components/loading/loading.css +47 -30
  161. package/src/components/loading/loading.js +4 -4
  162. package/src/components/loading/loading.react.js +6 -6
  163. package/src/components/loading/loading.stories.js +19 -18
  164. package/src/components/loading/loading.test.js +77 -54
  165. package/src/components/logo-cloud/index.js +1 -1
  166. package/src/components/logo-cloud/logo-cloud.component.js +39 -43
  167. package/src/components/logo-cloud/logo-cloud.css +31 -31
  168. package/src/components/logo-cloud/logo-cloud.js +3 -3
  169. package/src/components/logo-cloud/logo-cloud.react.js +6 -6
  170. package/src/components/logo-cloud/logo-cloud.stories.js +80 -80
  171. package/src/components/map/index.js +1 -1
  172. package/src/components/map/map.component.js +103 -107
  173. package/src/components/map/map.css +22 -22
  174. package/src/components/map/map.js +3 -3
  175. package/src/components/map/map.react.js +6 -6
  176. package/src/components/map/map.stories.js +38 -38
  177. package/src/components/media-text/index.js +1 -1
  178. package/src/components/media-text/media-text.component.js +76 -70
  179. package/src/components/media-text/media-text.css +32 -32
  180. package/src/components/media-text/media-text.js +3 -3
  181. package/src/components/media-text/media-text.react.js +6 -6
  182. package/src/components/media-text/media-text.stories.js +45 -45
  183. package/src/components/media-text/media-text.test.js +72 -0
  184. package/src/components/newsletter/index.js +1 -1
  185. package/src/components/newsletter/newsletter.component.js +56 -64
  186. package/src/components/newsletter/newsletter.css +48 -48
  187. package/src/components/newsletter/newsletter.js +3 -3
  188. package/src/components/newsletter/newsletter.react.js +6 -6
  189. package/src/components/newsletter/newsletter.stories.js +35 -35
  190. package/src/components/notice/index.js +1 -1
  191. package/src/components/notice/notice.component.js +66 -55
  192. package/src/components/notice/notice.css +37 -38
  193. package/src/components/notice/notice.js +3 -3
  194. package/src/components/notice/notice.react.js +6 -6
  195. package/src/components/notice/notice.stories.js +54 -53
  196. package/src/components/notice/notice.test.js +210 -156
  197. package/src/components/pagination/index.js +1 -1
  198. package/src/components/pagination/pagination.component.js +44 -44
  199. package/src/components/pagination/pagination.css +6 -6
  200. package/src/components/pagination/pagination.js +4 -4
  201. package/src/components/pagination/pagination.react.js +6 -6
  202. package/src/components/pagination/pagination.stories.js +20 -18
  203. package/src/components/pagination/pagination.test.js +95 -102
  204. package/src/components/person/index.js +1 -1
  205. package/src/components/person/person.component.js +29 -29
  206. package/src/components/person/person.css +17 -17
  207. package/src/components/person/person.js +4 -4
  208. package/src/components/person/person.react.js +6 -6
  209. package/src/components/person/person.stories.js +34 -33
  210. package/src/components/person/person.test.js +55 -68
  211. package/src/components/pricing/index.js +1 -1
  212. package/src/components/pricing/pricing.component.js +58 -70
  213. package/src/components/pricing/pricing.css +65 -65
  214. package/src/components/pricing/pricing.js +3 -3
  215. package/src/components/pricing/pricing.react.js +6 -6
  216. package/src/components/pricing/pricing.stories.js +96 -96
  217. package/src/components/sidebar/index.js +1 -1
  218. package/src/components/sidebar/sidebar.component.js +157 -130
  219. package/src/components/sidebar/sidebar.css +118 -115
  220. package/src/components/sidebar/sidebar.js +4 -4
  221. package/src/components/sidebar/sidebar.react.js +10 -10
  222. package/src/components/sidebar/sidebar.stories.js +10 -10
  223. package/src/components/sidebar/sidebar.test.js +250 -230
  224. package/src/components/stats/index.js +1 -1
  225. package/src/components/stats/stats.component.js +42 -50
  226. package/src/components/stats/stats.css +29 -29
  227. package/src/components/stats/stats.js +3 -3
  228. package/src/components/stats/stats.react.js +6 -6
  229. package/src/components/stats/stats.stories.js +40 -40
  230. package/src/components/tabs/index.js +2 -2
  231. package/src/components/tabs/internal/tabs-button.component.js +16 -27
  232. package/src/components/tabs/internal/tabs-button.js +3 -3
  233. package/src/components/tabs/internal/tabs-button.react.js +6 -6
  234. package/src/components/tabs/internal/tabs-item.component.js +30 -30
  235. package/src/components/tabs/tab.component.js +9 -11
  236. package/src/components/tabs/tab.js +3 -3
  237. package/src/components/tabs/tab.react.js +6 -6
  238. package/src/components/tabs/tabs.component.js +107 -109
  239. package/src/components/tabs/tabs.css +50 -59
  240. package/src/components/tabs/tabs.js +4 -4
  241. package/src/components/tabs/tabs.react.js +6 -6
  242. package/src/components/tabs/tabs.stories.js +23 -22
  243. package/src/components/tabs/tabs.test.js +201 -147
  244. package/src/components/testimonials/index.js +1 -1
  245. package/src/components/testimonials/testimonials.component.js +47 -51
  246. package/src/components/testimonials/testimonials.css +31 -31
  247. package/src/components/testimonials/testimonials.js +3 -3
  248. package/src/components/testimonials/testimonials.react.js +6 -6
  249. package/src/components/testimonials/testimonials.stories.js +49 -51
  250. package/src/components/toast/index.js +1 -1
  251. package/src/components/toast/toast.component.js +217 -148
  252. package/src/components/toast/toast.css +101 -99
  253. package/src/components/toast/toast.js +6 -9
  254. package/src/components/toast/toast.react.js +12 -12
  255. package/src/components/toast/toast.stories.js +75 -49
  256. package/src/components/toast/toast.test.js +260 -221
  257. package/src/components/tooltip/index.js +1 -1
  258. package/src/components/tooltip/tooltip.component.js +56 -49
  259. package/src/components/tooltip/tooltip.css +61 -50
  260. package/src/components/tooltip/tooltip.js +4 -4
  261. package/src/components/tooltip/tooltip.react.js +6 -6
  262. package/src/components/tooltip/tooltip.stories.js +24 -23
  263. package/src/components/tooltip/tooltip.test.js +143 -155
  264. package/src/constructor.test.js +31 -0
  265. package/src/css/base.css +1 -0
  266. package/src/css/colors.stories.js +120 -122
  267. package/src/css/elements/a.css +28 -28
  268. package/src/css/elements/forms/button.css +1 -1
  269. package/src/css/elements/forms/input.css +80 -80
  270. package/src/css/elements/forms/label.css +3 -3
  271. package/src/css/elements/media/image.css +2 -2
  272. package/src/css/elements.stories.js +48 -49
  273. package/src/css/helpers.css +8 -8
  274. package/src/css/layers.stories.js +5 -5
  275. package/src/css/reset.css +102 -102
  276. package/src/css/themes/todomap.css +1 -1
  277. package/src/css/tokens.stories.js +50 -53
  278. package/src/css/typography.css +30 -32
  279. package/src/css/typography.stories.js +92 -92
  280. package/src/css/util/focus-ring.css +12 -20
  281. package/src/css/view-transitions.css +16 -0
  282. package/src/exports.test.js +89 -105
  283. package/src/icons.js +1 -1
  284. package/src/lib/generate-id.js +1 -1
  285. package/src/lib/slot-presence-controller.js +48 -0
  286. package/src/lib/styles/all.css +38 -37
  287. package/src/lib/styles/focus-ring.css +12 -20
  288. package/src/lib/view-transition.js +42 -0
  289. package/src/lib/view-transition.test.js +105 -0
  290. package/src/main.js +29 -29
  291. package/src/pages/agency.stories.js +59 -59
  292. package/src/pages/blog-post.stories.js +48 -48
  293. package/src/pages/saas-landing.stories.js +180 -180
  294. package/src/react.js +44 -44
  295. package/src/react.test.js +42 -51
  296. package/src/test-utils/assert-helpers.js +39 -58
  297. package/src/test-utils/events.js +32 -34
  298. package/src/test-utils/fixture.js +31 -31
  299. package/src/test-utils/index.js +3 -3
  300. package/src/types.d.ts +3 -3
@@ -1,103 +1,189 @@
1
- import { describe, it, afterEach } from "node:test";
2
- import { strict as assert } from "node:assert";
3
- import { fixture, cleanup, click } from "../../test-utils/index.js";
4
- import "./dialog.js";
5
-
6
- describe("Dialog Component", () => {
7
- let element;
8
-
9
- afterEach(() => {
10
- cleanup(element);
11
- });
12
-
13
- it("should render with default properties", async () => {
14
- element = await fixture("grantcodes-dialog");
15
- assert.ok(element, "Element should be created");
16
- assert.ok(element.shadowRoot, "Element should have shadow root");
17
- });
18
-
19
- it("should be closed by default", async () => {
20
- element = await fixture("grantcodes-dialog");
21
- assert.strictEqual(
22
- element.open,
23
- false,
24
- "Dialog should be closed by default",
25
- );
26
- });
27
-
28
- it("should render dialog element", async () => {
29
- element = await fixture("grantcodes-dialog");
30
- const dialog = element.shadowRoot.querySelector("dialog");
31
- assert.ok(dialog, "Dialog element should exist");
32
- });
33
-
34
- it("should open when open property is set to true", async () => {
35
- element = await fixture("grantcodes-dialog", {
36
- open: true,
37
- });
38
-
39
- await element.updateComplete;
40
-
41
- // Note: In tests, showModal() might not work as expected without a browser environment
42
- assert.strictEqual(element.open, true, "Open property should be true");
43
- });
44
-
45
- it("should be dismissible by default", async () => {
46
- element = await fixture("grantcodes-dialog");
47
- assert.strictEqual(
48
- element.dismissible,
49
- true,
50
- "Should be dismissible by default",
51
- );
52
- });
53
-
54
- it("should render dismiss button when dismissible", async () => {
55
- element = await fixture("grantcodes-dialog", {
56
- dismissible: true,
57
- });
58
-
59
- const dismissButton = element.shadowRoot.querySelector(".dialog__dismiss");
60
- assert.ok(dismissButton, "Dismiss button should exist");
61
- });
62
-
63
- it("should not render dismiss button when not dismissible", async () => {
64
- element = await fixture("grantcodes-dialog", {
65
- dismissible: false,
66
- });
67
-
68
- const dismissButton = element.shadowRoot.querySelector(".dialog__dismiss");
69
- assert.ok(!dismissButton, "Dismiss button should not exist");
70
- });
71
-
72
- it("should have header slot", async () => {
73
- element = await fixture("grantcodes-dialog");
74
- const headerSlot = element.shadowRoot.querySelector('slot[name="header"]');
75
- assert.ok(headerSlot, "Header slot should exist");
76
- });
77
-
78
- it("should have footer slot", async () => {
79
- element = await fixture("grantcodes-dialog");
80
- const footerSlot = element.shadowRoot.querySelector('slot[name="footer"]');
81
- assert.ok(footerSlot, "Footer slot should exist");
82
- });
83
-
84
- it("should have default content slot", async () => {
85
- element = await fixture("grantcodes-dialog");
86
- const slot = element.shadowRoot.querySelector("slot.dialog__content");
87
- assert.ok(slot, "Content slot should exist");
88
- });
89
-
90
- it("should close when dismiss button is clicked", async () => {
91
- element = await fixture("grantcodes-dialog", {
92
- open: true,
93
- dismissible: true,
94
- });
95
-
96
- const dismissButton = element.shadowRoot.querySelector(".dialog__dismiss");
97
- click(dismissButton);
98
-
99
- await element.updateComplete;
100
-
101
- assert.strictEqual(element.open, false, "Dialog should be closed");
102
- });
1
+ import { strict as assert } from 'node:assert';
2
+ import { afterEach, describe, it } from 'node:test';
3
+ import { cleanup, click, fixture } from '../../test-utils/index.js';
4
+ import './dialog.js';
5
+
6
+ describe('Dialog Component', () => {
7
+ let element;
8
+
9
+ afterEach(() => {
10
+ cleanup(element);
11
+ });
12
+
13
+ it('should render with default properties', async () => {
14
+ element = await fixture('grantcodes-dialog');
15
+ assert.ok(element, 'Element should be created');
16
+ assert.ok(element.shadowRoot, 'Element should have shadow root');
17
+ });
18
+
19
+ it('should be closed by default', async () => {
20
+ element = await fixture('grantcodes-dialog');
21
+ assert.strictEqual(element.open, false, 'Dialog should be closed by default');
22
+ });
23
+
24
+ it('should render dialog element', async () => {
25
+ element = await fixture('grantcodes-dialog');
26
+ const dialog = element.shadowRoot.querySelector('dialog');
27
+ assert.ok(dialog, 'Dialog element should exist');
28
+ });
29
+
30
+ it('should open modally and close through the native dialog methods', async () => {
31
+ element = await fixture('grantcodes-dialog');
32
+ const dialog = element.shadowRoot.querySelector('dialog');
33
+ let modalOpens = 0;
34
+ let closes = 0;
35
+ dialog.showModal = () => {
36
+ assert.strictEqual(dialog.open, false, 'The open attribute must not precede showModal');
37
+ modalOpens++;
38
+ dialog.setAttribute('open', '');
39
+ };
40
+ dialog.close = () => {
41
+ closes++;
42
+ dialog.removeAttribute('open');
43
+ };
44
+
45
+ element.open = true;
46
+ await element.updateComplete;
47
+ assert.strictEqual(modalOpens, 1, 'Opening must call showModal');
48
+
49
+ element.open = false;
50
+ await element.updateComplete;
51
+ assert.strictEqual(closes, 1, 'Closing must call close');
52
+ });
53
+
54
+ it('should be dismissible by default', async () => {
55
+ element = await fixture('grantcodes-dialog');
56
+ assert.strictEqual(element.dismissible, true, 'Should be dismissible by default');
57
+ });
58
+
59
+ it('should render dismiss button when dismissible', async () => {
60
+ element = await fixture('grantcodes-dialog', {
61
+ dismissible: true,
62
+ });
63
+
64
+ const dismissButton = element.shadowRoot.querySelector('.dialog__dismiss');
65
+ assert.ok(dismissButton, 'Dismiss button should exist');
66
+ });
67
+
68
+ it('should not render dismiss button when not dismissible', async () => {
69
+ element = await fixture('grantcodes-dialog', {
70
+ dismissible: false,
71
+ });
72
+
73
+ const dismissButton = element.shadowRoot.querySelector('.dialog__dismiss');
74
+ assert.ok(!dismissButton, 'Dismiss button should not exist');
75
+ });
76
+
77
+ it('should have header slot', async () => {
78
+ element = await fixture('grantcodes-dialog');
79
+ const headerSlot = element.shadowRoot.querySelector('slot[name="header"]');
80
+ assert.ok(headerSlot, 'Header slot should exist');
81
+ });
82
+
83
+ it('should have footer slot', async () => {
84
+ element = await fixture('grantcodes-dialog');
85
+ const footerSlot = element.shadowRoot.querySelector('slot[name="footer"]');
86
+ assert.ok(footerSlot, 'Footer slot should exist');
87
+ });
88
+
89
+ it('should have default content slot', async () => {
90
+ element = await fixture('grantcodes-dialog');
91
+ const slot = element.shadowRoot.querySelector('slot.dialog__content');
92
+ assert.ok(slot, 'Content slot should exist');
93
+ });
94
+
95
+ it('should hide the header when nothing is slotted into it', async () => {
96
+ element = await fixture('grantcodes-dialog');
97
+ const header = element.shadowRoot.querySelector('.dialog__header');
98
+ assert.ok(header, 'Header element should exist');
99
+ assert.ok(header.hasAttribute('hidden'), 'Header should be hidden without slotted content');
100
+ });
101
+
102
+ it('should render the header when content is slotted into it', async () => {
103
+ element = document.createElement('grantcodes-dialog');
104
+ element.innerHTML = '<h2 slot="header">Dialog Header</h2>';
105
+ document.body.appendChild(element);
106
+ await element.updateComplete;
107
+
108
+ const header = element.shadowRoot.querySelector('.dialog__header');
109
+ assert.ok(header, 'Header element should exist');
110
+ assert.ok(
111
+ !header.hasAttribute('hidden'),
112
+ 'Header should be visible when content is slotted into it',
113
+ );
114
+ });
115
+
116
+ it('should hide the footer when nothing is slotted into it', async () => {
117
+ element = await fixture('grantcodes-dialog');
118
+ const footer = element.shadowRoot.querySelector('.dialog__footer');
119
+ assert.ok(footer, 'Footer element should exist');
120
+ assert.ok(footer.hasAttribute('hidden'), 'Footer should be hidden without slotted content');
121
+ });
122
+
123
+ it('should render the footer when content is slotted into it', async () => {
124
+ element = document.createElement('grantcodes-dialog');
125
+ element.innerHTML = '<div slot="footer">Actions</div>';
126
+ document.body.appendChild(element);
127
+ await element.updateComplete;
128
+
129
+ const footer = element.shadowRoot.querySelector('.dialog__footer');
130
+ assert.ok(footer, 'Footer element should exist');
131
+ assert.ok(
132
+ !footer.hasAttribute('hidden'),
133
+ 'Footer should be visible when content is slotted into it',
134
+ );
135
+ });
136
+
137
+ it('should close when dismiss button is clicked', async () => {
138
+ element = await fixture('grantcodes-dialog', {
139
+ open: true,
140
+ dismissible: true,
141
+ });
142
+
143
+ const dismissButton = element.shadowRoot.querySelector('.dialog__dismiss');
144
+ click(dismissButton);
145
+
146
+ await element.updateComplete;
147
+
148
+ assert.strictEqual(element.open, false, 'Dialog should be closed');
149
+ });
150
+
151
+ it('should sync open to false when the native dialog fires close', async () => {
152
+ element = await fixture('grantcodes-dialog', { open: true });
153
+ const dialog = element.shadowRoot.querySelector('dialog');
154
+
155
+ dialog.dispatchEvent(new Event('close'));
156
+ await element.updateComplete;
157
+
158
+ assert.strictEqual(element.open, false, 'open should follow the native dialog state');
159
+ });
160
+
161
+ it('should sync open to false when the native dialog fires cancel', async () => {
162
+ element = await fixture('grantcodes-dialog', { open: true });
163
+ const dialog = element.shadowRoot.querySelector('dialog');
164
+
165
+ dialog.dispatchEvent(new Event('cancel'));
166
+ await element.updateComplete;
167
+
168
+ assert.strictEqual(element.open, false, 'Esc should sync open back to false');
169
+ });
170
+
171
+ it('should not throw when reopened after the native dialog closed', async () => {
172
+ element = await fixture('grantcodes-dialog', { open: true });
173
+ const dialog = element.shadowRoot.querySelector('dialog');
174
+
175
+ dialog.dispatchEvent(new Event('close'));
176
+ await element.updateComplete;
177
+
178
+ element.open = true;
179
+ await element.updateComplete;
180
+
181
+ assert.strictEqual(element.open, true, 'Dialog should reopen after a native close');
182
+ });
183
+
184
+ it('should not enable light-dismiss when not dismissible', async () => {
185
+ element = await fixture('grantcodes-dialog', { dismissible: false });
186
+ const dialog = element.shadowRoot.querySelector('dialog');
187
+ assert.notStrictEqual(dialog.getAttribute('closedby'), 'any');
188
+ });
103
189
  });
@@ -1 +1 @@
1
- export * from "./dialog.js";
1
+ export * from './dialog.js';