@grantcodes/ui 2.15.7 → 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 +60 -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,69 +1,65 @@
1
- import { LitElement, html } from "lit";
2
- import newsletterStyles from "./newsletter.css" with { type: "css" };
3
- import "../button/button.js";
1
+ import { html, LitElement } from 'lit';
2
+ import newsletterStyles from './newsletter.css' with { type: 'css' };
3
+ import '../button/button.js';
4
4
 
5
5
  export class GrantCodesNewsletter extends LitElement {
6
- static styles = [newsletterStyles];
6
+ static styles = [newsletterStyles];
7
7
 
8
- static properties = {
9
- /**
10
- * Section heading.
11
- * @type {string}
12
- */
13
- title: { type: String },
14
- /**
15
- * Optional supporting paragraph.
16
- * @type {string}
17
- */
18
- text: { type: String },
19
- /**
20
- * Form action URL.
21
- * @type {string}
22
- */
23
- action: { type: String },
24
- /**
25
- * Form submission method.
26
- * @type {'get' | 'post'}
27
- */
28
- method: { type: String },
29
- /**
30
- * Email input placeholder.
31
- * @type {string}
32
- */
33
- placeholder: { type: String },
34
- /**
35
- * Submit button label.
36
- * @type {string}
37
- */
38
- buttonLabel: { type: String, attribute: "button-label" },
39
- /**
40
- * Optional small disclaimer text below the form.
41
- * @type {string}
42
- */
43
- disclaimer: { type: String },
44
- };
8
+ static properties = {
9
+ /**
10
+ * Section heading.
11
+ * @type {string}
12
+ */
13
+ title: { type: String },
14
+ /**
15
+ * Optional supporting paragraph.
16
+ * @type {string}
17
+ */
18
+ text: { type: String },
19
+ /**
20
+ * Form action URL.
21
+ * @type {string}
22
+ */
23
+ action: { type: String },
24
+ /**
25
+ * Form submission method.
26
+ * @type {'get' | 'post'}
27
+ */
28
+ method: { type: String },
29
+ /**
30
+ * Email input placeholder.
31
+ * @type {string}
32
+ */
33
+ placeholder: { type: String },
34
+ /**
35
+ * Submit button label.
36
+ * @type {string}
37
+ */
38
+ buttonLabel: { type: String, attribute: 'button-label' },
39
+ /**
40
+ * Optional small disclaimer text below the form.
41
+ * @type {string}
42
+ */
43
+ disclaimer: { type: String },
44
+ };
45
45
 
46
- constructor() {
47
- super();
48
- this.title = "";
49
- this.text = "";
50
- this.action = "";
51
- this.method = "post";
52
- this.placeholder = "Your email address";
53
- this.buttonLabel = "Subscribe";
54
- this.disclaimer = "";
55
- }
46
+ constructor() {
47
+ super();
48
+ this.title = '';
49
+ this.text = '';
50
+ this.action = '';
51
+ this.method = 'post';
52
+ this.placeholder = 'Your email address';
53
+ this.buttonLabel = 'Subscribe';
54
+ this.disclaimer = '';
55
+ }
56
56
 
57
- render() {
58
- return html`
57
+ render() {
58
+ return html`
59
59
  <section class="newsletter">
60
60
  <div class="newsletter__container">
61
61
  <h2 class="newsletter__title">${this.title}</h2>
62
- ${
63
- this.text
64
- ? html`<p class="newsletter__text">${this.text}</p>`
65
- : null
66
- }
62
+ ${this.text ? html`<p class="newsletter__text">${this.text}</p>` : null}
67
63
  <form
68
64
  class="newsletter__form"
69
65
  action=${this.action}
@@ -89,13 +85,9 @@ export class GrantCodesNewsletter extends LitElement {
89
85
  </div>
90
86
  </div>
91
87
  </form>
92
- ${
93
- this.disclaimer
94
- ? html`<p class="newsletter__disclaimer">${this.disclaimer}</p>`
95
- : null
96
- }
88
+ ${this.disclaimer ? html`<p class="newsletter__disclaimer">${this.disclaimer}</p>` : null}
97
89
  </div>
98
90
  </section>
99
91
  `;
100
- }
92
+ }
101
93
  }
@@ -1,91 +1,91 @@
1
1
  *,
2
2
  *::before,
3
3
  *::after {
4
- box-sizing: border-box;
4
+ box-sizing: border-box;
5
5
  }
6
6
 
7
7
  :host {
8
- display: block;
8
+ display: block;
9
9
  }
10
10
 
11
11
  .newsletter {
12
- padding-block: var(--g-spacing-3xl);
13
- padding-inline: var(--g-spacing-md);
14
- background: var(--g-color-background-primary-knockout);
15
- text-align: center;
12
+ padding-block: var(--g-spacing-3xl);
13
+ padding-inline: var(--g-spacing-md);
14
+ background: var(--g-color-background-primary-knockout);
15
+ text-align: center;
16
16
  }
17
17
 
18
18
  .newsletter__container {
19
- max-width: 55ch;
20
- margin: 0 auto;
19
+ max-width: 55ch;
20
+ margin: 0 auto;
21
21
  }
22
22
 
23
23
  .newsletter__title {
24
- margin: 0 0 var(--g-spacing-sm);
25
- font: var(--g-typography-h3-font);
26
- color: var(--g-color-content-primary-knockout);
24
+ margin: 0 0 var(--g-spacing-sm);
25
+ font: var(--g-typography-h3-font);
26
+ color: var(--g-color-content-primary-knockout);
27
27
  }
28
28
 
29
29
  .newsletter__text {
30
- margin: 0 0 var(--g-spacing-xl);
31
- font: var(--g-typography-body-lg);
32
- color: var(--g-color-content-primary-knockout);
33
- opacity: 0.9;
30
+ margin: 0 0 var(--g-spacing-xl);
31
+ font: var(--g-typography-body-lg);
32
+ color: var(--g-color-content-primary-knockout);
33
+ opacity: 0.9;
34
34
  }
35
35
 
36
36
  .newsletter__form {
37
- width: 100%;
37
+ width: 100%;
38
38
  }
39
39
 
40
40
  .newsletter__label {
41
- position: absolute;
42
- width: 1px;
43
- height: 1px;
44
- padding: 0;
45
- margin: -1px;
46
- overflow: hidden;
47
- clip: rect(0, 0, 0, 0);
48
- white-space: nowrap;
49
- border: 0;
41
+ position: absolute;
42
+ width: 1px;
43
+ height: 1px;
44
+ padding: 0;
45
+ margin: -1px;
46
+ overflow: hidden;
47
+ clip: rect(0, 0, 0, 0);
48
+ white-space: nowrap;
49
+ border: 0;
50
50
  }
51
51
 
52
52
  .newsletter__field {
53
- display: flex;
54
- flex-direction: column;
55
- gap: var(--g-spacing-sm);
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: var(--g-spacing-sm);
56
56
  }
57
57
 
58
58
  .newsletter__input-wrap {
59
- display: flex;
60
- gap: var(--g-spacing-sm);
59
+ display: flex;
60
+ gap: var(--g-spacing-sm);
61
61
  }
62
62
 
63
63
  .newsletter__input {
64
- flex: 1;
65
- min-width: 0;
66
- padding-block: var(--g-spacing-sm);
67
- padding-inline: var(--g-spacing-md);
68
- font-size: var(--g-typography-body-default-font-size);
69
- border: 2px solid transparent;
70
- border-radius: var(--g-border-radius-md, 0.5rem);
71
- background: var(--g-color-background-default);
72
- color: var(--g-color-content-default);
73
- outline: none;
64
+ flex: 1;
65
+ min-width: 0;
66
+ padding-block: var(--g-spacing-sm);
67
+ padding-inline: var(--g-spacing-md);
68
+ font-size: var(--g-typography-body-default-font-size);
69
+ border: 2px solid transparent;
70
+ border-radius: var(--g-border-radius-md, 0.5rem);
71
+ background: var(--g-color-background-default);
72
+ color: var(--g-color-content-default);
73
+ outline: none;
74
74
  }
75
75
 
76
76
  .newsletter__input:focus {
77
- border-color: var(--g-color-border-default);
77
+ border-color: var(--g-color-border-default);
78
78
  }
79
79
 
80
80
  .newsletter__disclaimer {
81
- margin: var(--g-spacing-md) 0 0;
82
- font: var(--g-typography-body-sm);
83
- color: var(--g-color-content-primary-knockout);
84
- opacity: 0.75;
81
+ margin: var(--g-spacing-md) 0 0;
82
+ font: var(--g-typography-body-sm);
83
+ color: var(--g-color-content-primary-knockout);
84
+ opacity: 0.75;
85
85
  }
86
86
 
87
87
  @media (max-width: 480px) {
88
- .newsletter__input-wrap {
89
- flex-direction: column;
90
- }
88
+ .newsletter__input-wrap {
89
+ flex-direction: column;
90
+ }
91
91
  }
@@ -1,6 +1,6 @@
1
- import { GrantCodesNewsletter } from "./newsletter.component.js";
1
+ import { GrantCodesNewsletter } from './newsletter.component.js';
2
2
 
3
- export * from "./newsletter.component.js";
3
+ export * from './newsletter.component.js';
4
4
  export default GrantCodesNewsletter;
5
5
 
6
- customElements.define("grantcodes-newsletter", GrantCodesNewsletter);
6
+ customElements.define('grantcodes-newsletter', GrantCodesNewsletter);
@@ -1,9 +1,9 @@
1
- import React from "react";
2
- import { createComponent } from "@lit/react";
3
- import { GrantCodesNewsletter } from "./newsletter.js";
1
+ import { createComponent } from '@lit/react';
2
+ import React from 'react';
3
+ import { GrantCodesNewsletter } from './newsletter.js';
4
4
 
5
5
  export const Newsletter = createComponent({
6
- tagName: "grantcodes-newsletter",
7
- elementClass: GrantCodesNewsletter,
8
- react: React,
6
+ tagName: 'grantcodes-newsletter',
7
+ elementClass: GrantCodesNewsletter,
8
+ react: React,
9
9
  });
@@ -1,19 +1,19 @@
1
- import { getStorybookHelpers } from "@wc-toolkit/storybook-helpers";
2
- import "./newsletter.js";
1
+ import { getStorybookHelpers } from '@wc-toolkit/storybook-helpers';
2
+ import './newsletter.js';
3
3
 
4
- const { events, args, argTypes } = getStorybookHelpers("grantcodes-newsletter");
4
+ const { events, args, argTypes } = getStorybookHelpers('grantcodes-newsletter');
5
5
 
6
6
  const meta = {
7
- title: "Blocks/Newsletter",
8
- component: "grantcodes-newsletter",
9
- args,
10
- argTypes,
11
- parameters: {
12
- actions: {
13
- handles: events,
14
- },
15
- layout: "fullscreen",
16
- },
7
+ title: 'Blocks/Newsletter',
8
+ component: 'grantcodes-newsletter',
9
+ args,
10
+ argTypes,
11
+ parameters: {
12
+ actions: {
13
+ handles: events,
14
+ },
15
+ layout: 'fullscreen',
16
+ },
17
17
  };
18
18
 
19
19
  export default meta;
@@ -22,38 +22,38 @@ export default meta;
22
22
  * Default newsletter signup with disclaimer.
23
23
  */
24
24
  export const Default = {
25
- args: {
26
- title: "Stay in the loop",
27
- text: "Get the latest updates, articles, and resources delivered straight to your inbox.",
28
- action: "/subscribe",
29
- method: "post",
30
- placeholder: "you@example.com",
31
- "button-label": "Subscribe",
32
- disclaimer: "No spam. Unsubscribe at any time.",
33
- },
25
+ args: {
26
+ title: 'Stay in the loop',
27
+ text: 'Get the latest updates, articles, and resources delivered straight to your inbox.',
28
+ action: '/subscribe',
29
+ method: 'post',
30
+ placeholder: 'you@example.com',
31
+ 'button-label': 'Subscribe',
32
+ disclaimer: 'No spam. Unsubscribe at any time.',
33
+ },
34
34
  };
35
35
 
36
36
  /**
37
37
  * Minimal newsletter — title and input only.
38
38
  */
39
39
  export const Minimal = {
40
- args: {
41
- title: "Subscribe for updates",
42
- action: "/subscribe",
43
- "button-label": "Subscribe",
44
- },
40
+ args: {
41
+ title: 'Subscribe for updates',
42
+ action: '/subscribe',
43
+ 'button-label': 'Subscribe',
44
+ },
45
45
  };
46
46
 
47
47
  /**
48
48
  * Newsletter with a custom button label and placeholder.
49
49
  */
50
50
  export const CustomLabels = {
51
- args: {
52
- title: "Join the newsletter",
53
- text: "Weekly tips on building great web experiences.",
54
- action: "/newsletter",
55
- placeholder: "Enter your email",
56
- "button-label": "Join now",
57
- disclaimer: "We respect your privacy.",
58
- },
51
+ args: {
52
+ title: 'Join the newsletter',
53
+ text: 'Weekly tips on building great web experiences.',
54
+ action: '/newsletter',
55
+ placeholder: 'Enter your email',
56
+ 'button-label': 'Join now',
57
+ disclaimer: 'We respect your privacy.',
58
+ },
59
59
  };
@@ -1 +1 @@
1
- export * from "./notice.js";
1
+ export * from './notice.js';
@@ -1,71 +1,82 @@
1
- import { LitElement } from "lit";
2
- import { html } from "lit/static-html.js";
3
- import { unsafeHTML } from "lit/directives/unsafe-html.js";
4
- import { classMap } from "lit/directives/class-map.js";
5
- import noticeStyles from "./notice.css" with { type: "css" };
6
- import { GrantCodesIcon } from "../icon/icon.component.js";
7
- import { AlertCircle, Info, CheckCircle2, XCircle, X } from "../../icons.js";
1
+ import { LitElement } from 'lit';
2
+ import { classMap } from 'lit/directives/class-map.js';
3
+ import { unsafeHTML } from 'lit/directives/unsafe-html.js';
4
+ import { html } from 'lit/static-html.js';
5
+ import { AlertCircle, CheckCircle2, Info, X, XCircle } from '../../icons.js';
6
+ import { generateId } from '../../lib/generate-id.js';
7
+ import { startViewTransition } from '../../lib/view-transition.js';
8
+ import { GrantCodesIcon } from '../icon/icon.component.js';
9
+ import noticeStyles from './notice.css' with { type: 'css' };
8
10
 
9
11
  const ICONS = {
10
- info: Info,
11
- success: CheckCircle2,
12
- warning: AlertCircle,
13
- error: XCircle,
12
+ info: Info,
13
+ success: CheckCircle2,
14
+ warning: AlertCircle,
15
+ error: XCircle,
14
16
  };
15
17
 
16
18
  export class GrantCodesNotice extends LitElement {
17
- static dependencies = { "grancodes-icon": GrantCodesIcon };
18
- // Styles are scoped to this element: they won't conflict with styles
19
- // on the main page or in other components. Styling API can be exposed
20
- // via CSS custom properties.
21
- static styles = [noticeStyles];
19
+ static dependencies = { 'grancodes-icon': GrantCodesIcon };
20
+ // Styles are scoped to this element: they won't conflict with styles
21
+ // on the main page or in other components. Styling API can be exposed
22
+ // via CSS custom properties.
23
+ static styles = [noticeStyles];
22
24
 
23
- // Define reactive properties--updating a reactive property causes
24
- // the component to update.
25
- // @property() label = 'Button Label'
26
- static properties = {
27
- variant: { type: String },
28
- title: { type: String },
29
- dismissable: { type: Boolean },
30
- };
25
+ // Define reactive properties--updating a reactive property causes
26
+ // the component to update.
27
+ // @property() label = 'Button Label'
28
+ static properties = {
29
+ variant: { type: String },
30
+ title: { type: String },
31
+ dismissable: { type: Boolean },
32
+ };
31
33
 
32
- constructor() {
33
- super();
34
+ constructor() {
35
+ super();
34
36
 
35
- this.variant = "info";
36
- this.title = "";
37
- this.dismissable = false;
38
- }
37
+ this.variant = 'info';
38
+ this.title = '';
39
+ this.dismissable = false;
39
40
 
40
- onDismiss(_e) {
41
- if (document.startViewTransition) {
42
- document.startViewTransition(() => {
43
- this.remove();
44
- });
45
- } else {
46
- this.remove();
47
- }
48
- }
41
+ // Per-instance, so two notices cannot abort each other's view transition.
42
+ this._viewTransitionName = generateId('notice-vt');
43
+ }
49
44
 
50
- renderDismiss() {
51
- if (this.dismissable) {
52
- return html`
53
- <button class="notice__close" @click=${this.onDismiss}>
54
- <grantcodes-icon title="Close Notice">${unsafeHTML(X)}</grantcodes-icon>
45
+ connectedCallback() {
46
+ super.connectedCallback();
47
+ this.style.setProperty('--notice-vt-name', this._viewTransitionName);
48
+ }
49
+
50
+ onDismiss(_e) {
51
+ startViewTransition(() => {
52
+ this.remove();
53
+ });
54
+ }
55
+
56
+ renderDismiss() {
57
+ if (this.dismissable) {
58
+ return html`
59
+ <button
60
+ class="notice__close"
61
+ type="button"
62
+ aria-label="Dismiss notice"
63
+ @click=${this.onDismiss}
64
+ >
65
+ <grantcodes-icon aria-hidden="true">${unsafeHTML(X)}</grantcodes-icon>
55
66
  </button>
56
67
  `;
57
- }
58
- return html``;
59
- }
68
+ }
69
+ return html``;
70
+ }
60
71
 
61
- render() {
62
- const icon = ICONS[this.variant];
63
- const classes = classMap({
64
- notice: true,
65
- [`notice--${this.variant}`]: true,
66
- });
72
+ render() {
73
+ const icon = ICONS[this.variant];
74
+ const classes = classMap({
75
+ notice: true,
76
+ [`notice--${this.variant}`]: true,
77
+ });
67
78
 
68
- return html`
79
+ return html`
69
80
  <aside class=${classes}>
70
81
  <grantcodes-icon class="notice__icon">${unsafeHTML(icon)}</grantcodes-icon>
71
82
 
@@ -77,5 +88,5 @@ export class GrantCodesNotice extends LitElement {
77
88
  ${this.renderDismiss()}
78
89
  </aside>
79
90
  `;
80
- }
91
+ }
81
92
  }
@@ -1,73 +1,72 @@
1
1
  *,
2
2
  *::before,
3
3
  *::after {
4
- box-sizing: border-box;
4
+ box-sizing: border-box;
5
5
  }
6
6
 
7
7
  .notice {
8
- display: flex;
9
- flex-direction: row;
10
- align-items: flex-start;
11
- gap: var(--g-spacing-md);
12
- padding: var(--g-spacing-md);
13
- border-radius: var(--g-border-radius-sm, 0.25rem);
14
- view-transition-name: notice;
15
- transition: opacity 0.5s;
8
+ display: flex;
9
+ flex-direction: row;
10
+ align-items: flex-start;
11
+ gap: var(--g-spacing-md);
12
+ padding: var(--g-spacing-md);
13
+ border-radius: var(--g-border-radius-sm, 0.25rem);
14
+ view-transition-name: var(--notice-vt-name, none);
15
+ transition: opacity 0.5s;
16
16
  }
17
17
 
18
18
  .notice--info {
19
- color: var(--g-color-content-utility-info);
20
- background-color: var(--g-color-background-utility-info);
19
+ color: var(--g-color-content-utility-info);
20
+ background-color: var(--g-color-background-utility-info);
21
21
  }
22
22
 
23
23
  .notice--success {
24
- color: var(--g-color-content-utility-success);
25
- background-color: var(--g-color-background-utility-success);
24
+ color: var(--g-color-content-utility-success);
25
+ background-color: var(--g-color-background-utility-success);
26
26
  }
27
27
 
28
28
  .notice--warning {
29
- color: var(--g-color-content-utility-warning);
30
- background-color: var(--g-color-background-utility-warning);
29
+ color: var(--g-color-content-utility-warning);
30
+ background-color: var(--g-color-background-utility-warning);
31
31
  }
32
32
 
33
33
  .notice--error {
34
- color: var(--g-color-content-utility-error);
35
- background-color: var(--g-color-background-utility-error);
34
+ color: var(--g-color-content-utility-error);
35
+ background-color: var(--g-color-background-utility-error);
36
36
  }
37
37
 
38
38
  .notice__title {
39
- font-size: var(--g-typography-body-default-font-size);
40
- margin: 0;
39
+ font-size: var(--g-typography-body-default-font-size);
40
+ margin: 0;
41
41
  }
42
42
 
43
43
  .notice__icon {
44
- font-size: calc(var(--g-typography-body-default-line-height) * 1em);
44
+ font-size: calc(var(--g-typography-body-default-line-height) * 1em);
45
45
  }
46
46
 
47
47
  .notice__content {
48
- flex-grow: 1;
48
+ flex-grow: 1;
49
49
  }
50
50
 
51
51
  .notice__close {
52
- background: none;
53
- color: inherit;
54
- opacity: 0.5;
55
- transition: 0.2s;
56
- font-size: calc(var(--g-typography-body-default-line-height) * 1em);
57
- line-height: 1;
58
- padding: var(--g-spacing-sm);
59
- margin: calc(-1 * var(--g-spacing-sm))
60
- calc(-1 * var(--g-spacing-sm)) 0 0;
61
- border: 0;
52
+ background: none;
53
+ color: inherit;
54
+ opacity: 0.5;
55
+ transition: 0.2s;
56
+ font-size: calc(var(--g-typography-body-default-line-height) * 1em);
57
+ line-height: 1;
58
+ padding: var(--g-spacing-sm);
59
+ margin: calc(-1 * var(--g-spacing-sm)) calc(-1 * var(--g-spacing-sm)) 0 0;
60
+ border: 0;
62
61
 
63
- &:hover,
64
- &:focus-visible {
65
- background: none;
66
- color: inherit;
67
- opacity: 1;
68
- }
62
+ &:hover,
63
+ &:focus-visible {
64
+ background: none;
65
+ color: inherit;
66
+ opacity: 1;
67
+ }
69
68
  }
70
69
 
71
70
  .notice p {
72
- margin: 0;
71
+ margin: 0;
73
72
  }