@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,18 +1,18 @@
1
- import { getStorybookHelpers } from "@wc-toolkit/storybook-helpers";
2
- import "./map.js";
1
+ import { getStorybookHelpers } from '@wc-toolkit/storybook-helpers';
2
+ import './map.js';
3
3
 
4
- const { events, args, argTypes } = getStorybookHelpers("grantcodes-map");
4
+ const { events, args, argTypes } = getStorybookHelpers('grantcodes-map');
5
5
 
6
6
  const meta = {
7
- title: "Components/Map",
8
- component: "grantcodes-map",
9
- args,
10
- argTypes,
11
- parameters: {
12
- actions: {
13
- handles: events,
14
- },
15
- },
7
+ title: 'Components/Map',
8
+ component: 'grantcodes-map',
9
+ args,
10
+ argTypes,
11
+ parameters: {
12
+ actions: {
13
+ handles: events,
14
+ },
15
+ },
16
16
  };
17
17
 
18
18
  export default meta;
@@ -21,48 +21,48 @@ export default meta;
21
21
  * Default map showing a location in Granollers, Catalonia.
22
22
  */
23
23
  export const Default = {
24
- args: {
25
- lat: "41.648747",
26
- lng: "2.161975",
27
- zoom: 14,
28
- label: "Granollers, Catalonia",
29
- },
24
+ args: {
25
+ lat: '41.648747',
26
+ lng: '2.161975',
27
+ zoom: 14,
28
+ label: 'Granollers, Catalonia',
29
+ },
30
30
  };
31
31
 
32
32
  /**
33
33
  * Map with a directions link below.
34
34
  */
35
35
  export const WithDirections = {
36
- args: {
37
- lat: "41.648747",
38
- lng: "2.161975",
39
- zoom: 14,
40
- label: "Granollers, Catalonia",
41
- "directions-url": "https://maps.google.com/?q=41.648747,2.161975",
42
- },
36
+ args: {
37
+ lat: '41.648747',
38
+ lng: '2.161975',
39
+ zoom: 14,
40
+ label: 'Granollers, Catalonia',
41
+ 'directions-url': 'https://maps.google.com/?q=41.648747,2.161975',
42
+ },
43
43
  };
44
44
 
45
45
  /**
46
46
  * Map with a custom height.
47
47
  */
48
48
  export const CustomHeight = {
49
- args: {
50
- lat: "48.8566",
51
- lng: "2.3522",
52
- zoom: 12,
53
- label: "Paris, France",
54
- height: "600px",
55
- },
49
+ args: {
50
+ lat: '48.8566',
51
+ lng: '2.3522',
52
+ zoom: 12,
53
+ label: 'Paris, France',
54
+ height: '600px',
55
+ },
56
56
  };
57
57
 
58
58
  /**
59
59
  * Zoomed-out world view.
60
60
  */
61
61
  export const ZoomedOut = {
62
- args: {
63
- lat: "0",
64
- lng: "0",
65
- zoom: 2,
66
- label: "World map",
67
- },
62
+ args: {
63
+ lat: '0',
64
+ lng: '0',
65
+ zoom: 2,
66
+ label: 'World map',
67
+ },
68
68
  };
@@ -1 +1 @@
1
- export * from "./media-text.js";
1
+ export * from './media-text.js';
@@ -1,100 +1,106 @@
1
- import { LitElement, html } from "lit";
2
- import mediaTextStyles from "./media-text.css" with { type: "css" };
3
- import "../button/button.js";
1
+ import { html, LitElement } from 'lit';
2
+ import { ifDefined } from 'lit/directives/if-defined.js';
3
+ import mediaTextStyles from './media-text.css' with { type: 'css' };
4
+ import '../button/button.js';
4
5
 
5
6
  export class GrantCodesMediaText extends LitElement {
6
- static styles = [mediaTextStyles];
7
+ static styles = [mediaTextStyles];
7
8
 
8
- static properties = {
9
- /**
10
- * Section heading.
11
- * @type {string}
12
- */
13
- title: { type: String },
14
- /**
15
- * Body text paragraph.
16
- * @type {string}
17
- */
18
- text: { type: String },
19
- /**
20
- * Media object as a JSON string: `{"src":"...","alt":"...","kind":"image|video"}`.
21
- * @type {string}
22
- */
23
- media: { type: String },
24
- /**
25
- * When true, the media appears on the right and text on the left.
26
- * @type {boolean}
27
- */
28
- reverse: { type: Boolean, reflect: true },
29
- /**
30
- * Optional CTA as a JSON string: `{"label":"...","href":"..."}`.
31
- * @type {string}
32
- */
33
- cta: { type: String },
34
- };
9
+ static properties = {
10
+ /**
11
+ * Section heading.
12
+ * @type {string}
13
+ */
14
+ title: { type: String },
15
+ /**
16
+ * Body text paragraph.
17
+ * @type {string}
18
+ */
19
+ text: { type: String },
20
+ /**
21
+ * Media object as a JSON string: `{"src","alt","kind":"image|video","width","height","poster","loading"}`.
22
+ * @type {string}
23
+ */
24
+ media: { type: String },
25
+ /**
26
+ * When true, the media appears on the right and text on the left.
27
+ * @type {boolean}
28
+ */
29
+ reverse: { type: Boolean, reflect: true },
30
+ /**
31
+ * Optional CTA as a JSON string: `{"label":"...","href":"..."}`.
32
+ * @type {string}
33
+ */
34
+ cta: { type: String },
35
+ };
35
36
 
36
- constructor() {
37
- super();
38
- this.title = "";
39
- this.text = "";
40
- this.media = "";
41
- this.reverse = false;
42
- this.cta = "";
43
- }
37
+ constructor() {
38
+ super();
39
+ this.title = '';
40
+ this.text = '';
41
+ this.media = '';
42
+ this.reverse = false;
43
+ this.cta = '';
44
+ }
44
45
 
45
- get _media() {
46
- try {
47
- return this.media ? JSON.parse(this.media) : null;
48
- } catch {
49
- return null;
50
- }
51
- }
46
+ get _media() {
47
+ try {
48
+ return this.media ? JSON.parse(this.media) : null;
49
+ } catch {
50
+ return null;
51
+ }
52
+ }
52
53
 
53
- get _cta() {
54
- try {
55
- return this.cta ? JSON.parse(this.cta) : null;
56
- } catch {
57
- return null;
58
- }
59
- }
54
+ get _cta() {
55
+ try {
56
+ return this.cta ? JSON.parse(this.cta) : null;
57
+ } catch {
58
+ return null;
59
+ }
60
+ }
60
61
 
61
- render() {
62
- const media = this._media;
63
- const cta = this._cta;
64
- return html`
62
+ render() {
63
+ const media = this._media;
64
+ const cta = this._cta;
65
+ return html`
65
66
  <section class="media-text">
66
67
  <div class="media-text__container">
67
68
  <div class="media-text__media">
68
69
  ${
69
- media?.kind === "video"
70
- ? html`<video
70
+ media?.kind === 'video'
71
+ ? html`<video
71
72
  src=${media.src}
72
73
  class="media-text__video"
74
+ poster=${ifDefined(media.poster)}
75
+ width=${ifDefined(media.width)}
76
+ height=${ifDefined(media.height)}
73
77
  controls
74
78
  preload="metadata"
75
- aria-label=${media.alt ?? ""}
79
+ aria-label=${media.alt ?? ''}
76
80
  ></video>`
77
- : html`<img
78
- src=${media?.src ?? ""}
79
- alt=${media?.alt ?? ""}
81
+ : html`<img
82
+ src=${media?.src ?? ''}
83
+ alt=${media?.alt ?? ''}
80
84
  class="media-text__image"
81
- loading="lazy"
85
+ width=${ifDefined(media?.width)}
86
+ height=${ifDefined(media?.height)}
87
+ loading=${media?.loading ?? 'eager'}
82
88
  />`
83
- }
89
+ }
84
90
  </div>
85
91
  <div class="media-text__content">
86
92
  <h2 class="media-text__title">${this.title}</h2>
87
93
  <p class="media-text__text">${this.text}</p>
88
94
  ${
89
- cta
90
- ? html`<grantcodes-button href=${cta.href}
95
+ cta
96
+ ? html`<grantcodes-button href=${cta.href}
91
97
  >${cta.label}</grantcodes-button
92
98
  >`
93
- : null
94
- }
99
+ : null
100
+ }
95
101
  </div>
96
102
  </div>
97
103
  </section>
98
104
  `;
99
- }
105
+ }
100
106
  }
@@ -1,68 +1,68 @@
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
  .media-text {
12
- padding-block: var(--g-spacing-3xl);
13
- padding-inline: var(--g-spacing-md);
12
+ padding-block: var(--g-spacing-3xl);
13
+ padding-inline: var(--g-spacing-md);
14
14
  }
15
15
 
16
16
  .media-text__container {
17
- max-width: 1200px;
18
- margin: 0 auto;
19
- display: grid;
20
- grid-template-columns: 1fr 1fr;
21
- gap: var(--g-spacing-3xl);
22
- align-items: center;
17
+ max-width: 1200px;
18
+ margin: 0 auto;
19
+ display: grid;
20
+ grid-template-columns: 1fr 1fr;
21
+ gap: var(--g-spacing-3xl);
22
+ align-items: center;
23
23
  }
24
24
 
25
25
  :host([reverse]) .media-text__container {
26
- direction: rtl;
26
+ direction: rtl;
27
27
  }
28
28
 
29
29
  :host([reverse]) .media-text__content,
30
30
  :host([reverse]) .media-text__media {
31
- direction: ltr;
31
+ direction: ltr;
32
32
  }
33
33
 
34
34
  @media (max-width: 768px) {
35
- .media-text__container {
36
- grid-template-columns: 1fr;
37
- gap: var(--g-spacing-xl);
38
- direction: ltr;
39
- }
35
+ .media-text__container {
36
+ grid-template-columns: 1fr;
37
+ gap: var(--g-spacing-xl);
38
+ direction: ltr;
39
+ }
40
40
  }
41
41
 
42
42
  .media-text__image,
43
43
  .media-text__video {
44
- inline-size: 100%;
45
- block-size: auto;
46
- display: block;
47
- border-radius: var(--g-border-radius-md, 0.5rem);
48
- object-fit: cover;
49
- aspect-ratio: 4 / 3;
44
+ inline-size: 100%;
45
+ block-size: auto;
46
+ display: block;
47
+ border-radius: var(--g-border-radius-md, 0.5rem);
48
+ object-fit: cover;
49
+ aspect-ratio: 4 / 3;
50
50
  }
51
51
 
52
52
  .media-text__content {
53
- display: flex;
54
- flex-direction: column;
55
- gap: var(--g-spacing-lg);
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: var(--g-spacing-lg);
56
56
  }
57
57
 
58
58
  .media-text__title {
59
- margin: 0;
60
- font: var(--g-typography-h4-font);
61
- color: var(--g-color-content-default);
59
+ margin: 0;
60
+ font: var(--g-typography-h4-font);
61
+ color: var(--g-color-content-default);
62
62
  }
63
63
 
64
64
  .media-text__text {
65
- margin: 0;
66
- font: var(--g-typography-body-lg);
67
- color: var(--g-color-content-subtle);
65
+ margin: 0;
66
+ font: var(--g-typography-body-lg);
67
+ color: var(--g-color-content-subtle);
68
68
  }
@@ -1,6 +1,6 @@
1
- import { GrantCodesMediaText } from "./media-text.component.js";
1
+ import { GrantCodesMediaText } from './media-text.component.js';
2
2
 
3
- export * from "./media-text.component.js";
3
+ export * from './media-text.component.js';
4
4
  export default GrantCodesMediaText;
5
5
 
6
- customElements.define("grantcodes-media-text", GrantCodesMediaText);
6
+ customElements.define('grantcodes-media-text', GrantCodesMediaText);
@@ -1,9 +1,9 @@
1
- import React from "react";
2
- import { createComponent } from "@lit/react";
3
- import { GrantCodesMediaText } from "./media-text.js";
1
+ import { createComponent } from '@lit/react';
2
+ import React from 'react';
3
+ import { GrantCodesMediaText } from './media-text.js';
4
4
 
5
5
  export const MediaText = createComponent({
6
- tagName: "grantcodes-media-text",
7
- elementClass: GrantCodesMediaText,
8
- react: React,
6
+ tagName: 'grantcodes-media-text',
7
+ elementClass: GrantCodesMediaText,
8
+ react: React,
9
9
  });
@@ -1,19 +1,19 @@
1
- import { getStorybookHelpers } from "@wc-toolkit/storybook-helpers";
2
- import "./media-text.js";
1
+ import { getStorybookHelpers } from '@wc-toolkit/storybook-helpers';
2
+ import './media-text.js';
3
3
 
4
- const { events, args, argTypes } = getStorybookHelpers("grantcodes-media-text");
4
+ const { events, args, argTypes } = getStorybookHelpers('grantcodes-media-text');
5
5
 
6
6
  const meta = {
7
- title: "Blocks/MediaText",
8
- component: "grantcodes-media-text",
9
- args,
10
- argTypes,
11
- parameters: {
12
- actions: {
13
- handles: events,
14
- },
15
- layout: "fullscreen",
16
- },
7
+ title: 'Blocks/MediaText',
8
+ component: 'grantcodes-media-text',
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,48 +22,48 @@ export default meta;
22
22
  * Default media-text — image on the left, text on the right.
23
23
  */
24
24
  export const Default = {
25
- args: {
26
- title: "Design tokens done right",
27
- text: "Our style dictionary generates CSS custom properties, JS tokens, and JSON outputs from a single source of truth — keeping every theme in perfect sync.",
28
- media: JSON.stringify({
29
- src: "https://placehold.co/640x480",
30
- alt: "Design tokens diagram",
31
- kind: "image",
32
- }),
33
- cta: JSON.stringify({ label: "Read the docs", href: "/docs/tokens" }),
34
- reverse: false,
35
- },
25
+ args: {
26
+ title: 'Design tokens done right',
27
+ text: 'Our style dictionary generates CSS custom properties, JS tokens, and JSON outputs from a single source of truth — keeping every theme in perfect sync.',
28
+ media: JSON.stringify({
29
+ src: 'https://placehold.co/640x480',
30
+ alt: 'Design tokens diagram',
31
+ kind: 'image',
32
+ }),
33
+ cta: JSON.stringify({ label: 'Read the docs', href: '/docs/tokens' }),
34
+ reverse: false,
35
+ },
36
36
  };
37
37
 
38
38
  /**
39
39
  * Reversed layout — image on the right, text on the left.
40
40
  */
41
41
  export const Reversed = {
42
- args: {
43
- title: "Accessible by default",
44
- text: "Every component ships with ARIA attributes, keyboard navigation, and focus management built in. No extra configuration required.",
45
- media: JSON.stringify({
46
- src: "https://placehold.co/640x480",
47
- alt: "Accessibility diagram",
48
- kind: "image",
49
- }),
50
- reverse: true,
51
- },
42
+ args: {
43
+ title: 'Accessible by default',
44
+ text: 'Every component ships with ARIA attributes, keyboard navigation, and focus management built in. No extra configuration required.',
45
+ media: JSON.stringify({
46
+ src: 'https://placehold.co/640x480',
47
+ alt: 'Accessibility diagram',
48
+ kind: 'image',
49
+ }),
50
+ reverse: true,
51
+ },
52
52
  };
53
53
 
54
54
  /**
55
55
  * Video media variant.
56
56
  */
57
57
  export const Video = {
58
- args: {
59
- title: "See it in action",
60
- text: "Watch how quickly you can spin up a fully-themed UI with our component library.",
61
- media: JSON.stringify({
62
- src: "https://www.w3schools.com/html/mov_bbb.mp4",
63
- alt: "Demo video",
64
- kind: "video",
65
- }),
66
- cta: JSON.stringify({ label: "Try it yourself", href: "/playground" }),
67
- reverse: false,
68
- },
58
+ args: {
59
+ title: 'See it in action',
60
+ text: 'Watch how quickly you can spin up a fully-themed UI with our component library.',
61
+ media: JSON.stringify({
62
+ src: 'https://www.w3schools.com/html/mov_bbb.mp4',
63
+ alt: 'Demo video',
64
+ kind: 'video',
65
+ }),
66
+ cta: JSON.stringify({ label: 'Try it yourself', href: '/playground' }),
67
+ reverse: false,
68
+ },
69
69
  };
@@ -0,0 +1,72 @@
1
+ import { strict as assert } from 'node:assert';
2
+ import { afterEach, describe, it } from 'node:test';
3
+ import { cleanup, fixture } from '../../test-utils/index.js';
4
+ import './media-text.js';
5
+
6
+ const mediaJson = (media) => JSON.stringify(media);
7
+
8
+ describe('Media Text Component', () => {
9
+ let element;
10
+
11
+ afterEach(() => {
12
+ cleanup(element);
13
+ });
14
+
15
+ it('should render with default properties', async () => {
16
+ element = await fixture('grantcodes-media-text');
17
+ assert.ok(element, 'Element should be created');
18
+ assert.ok(element.shadowRoot, 'Element should have shadow root');
19
+ });
20
+
21
+ it('should apply dimensions and eager loading to the image', async () => {
22
+ element = await fixture('grantcodes-media-text', {
23
+ media: mediaJson({ src: '/a.jpg', alt: 'A', width: 1200, height: 800 }),
24
+ });
25
+
26
+ const img = element.shadowRoot.querySelector('img');
27
+ assert.strictEqual(img.getAttribute('width'), '1200', 'Image width should be set');
28
+ assert.strictEqual(img.getAttribute('height'), '800', 'Image height should be set');
29
+ assert.strictEqual(
30
+ img.getAttribute('loading'),
31
+ 'eager',
32
+ 'Media must not be lazy by default so above-the-fold images are not deferred',
33
+ );
34
+ });
35
+
36
+ it('should honour an explicit lazy loading hint', async () => {
37
+ element = await fixture('grantcodes-media-text', {
38
+ media: mediaJson({ src: '/a.jpg', alt: 'A', loading: 'lazy' }),
39
+ });
40
+
41
+ const img = element.shadowRoot.querySelector('img');
42
+ assert.strictEqual(img.getAttribute('loading'), 'lazy');
43
+ });
44
+
45
+ it('should apply dimensions and poster to the video', async () => {
46
+ element = await fixture('grantcodes-media-text', {
47
+ media: mediaJson({
48
+ kind: 'video',
49
+ src: '/a.mp4',
50
+ alt: 'A video',
51
+ poster: '/poster.jpg',
52
+ width: 1280,
53
+ height: 720,
54
+ }),
55
+ });
56
+
57
+ const video = element.shadowRoot.querySelector('video');
58
+ assert.strictEqual(video.getAttribute('width'), '1280');
59
+ assert.strictEqual(video.getAttribute('height'), '720');
60
+ assert.strictEqual(video.getAttribute('poster'), '/poster.jpg');
61
+ });
62
+
63
+ it('should omit dimensions when the media object does not declare them', async () => {
64
+ element = await fixture('grantcodes-media-text', {
65
+ media: mediaJson({ src: '/a.jpg', alt: 'A' }),
66
+ });
67
+
68
+ const img = element.shadowRoot.querySelector('img');
69
+ assert.strictEqual(img.hasAttribute('width'), false);
70
+ assert.strictEqual(img.hasAttribute('height'), false);
71
+ });
72
+ });
@@ -1 +1 @@
1
- export * from "./newsletter.js";
1
+ export * from './newsletter.js';