@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 +1 @@
1
- export * from "./button.js";
1
+ export * from './button.js';
@@ -1,27 +1,27 @@
1
- import { LitElement } from "lit";
2
- import { html } from "lit/static-html.js";
3
- import buttonGroupStyles from "./button-group.css" with { type: "css" };
1
+ import { LitElement } from 'lit';
2
+ import { html } from 'lit/static-html.js';
3
+ import buttonGroupStyles from './button-group.css' with { type: 'css' };
4
4
 
5
5
  export class GrantCodesButtonGroup extends LitElement {
6
- // Styles are scoped to this element: they won't conflict with styles
7
- // on the main page or in other components. Styling API can be exposed
8
- // via CSS custom properties.
9
- static styles = [buttonGroupStyles];
6
+ // Styles are scoped to this element: they won't conflict with styles
7
+ // on the main page or in other components. Styling API can be exposed
8
+ // via CSS custom properties.
9
+ static styles = [buttonGroupStyles];
10
10
 
11
- // Define reactive properties--updating a reactive property causes
12
- // the component to update.
13
- // @property() label = 'Button Label'
11
+ // Define reactive properties--updating a reactive property causes
12
+ // the component to update.
13
+ // @property() label = 'Button Label'
14
14
 
15
- // The render() method is called any time reactive properties change.
16
- // Return HTML in a string template literal tagged with the `html`
17
- // tag function to describe the component's internal DOM.
18
- // Expressions can set attribute values, property values, event handlers,
19
- // and child nodes/text.
20
- render() {
21
- return html`
15
+ // The render() method is called any time reactive properties change.
16
+ // Return HTML in a string template literal tagged with the `html`
17
+ // tag function to describe the component's internal DOM.
18
+ // Expressions can set attribute values, property values, event handlers,
19
+ // and child nodes/text.
20
+ render() {
21
+ return html`
22
22
  <div class="button-group">
23
23
  <slot></slot>
24
24
  </div>
25
25
  `;
26
- }
26
+ }
27
27
  }
@@ -2,38 +2,38 @@
2
2
  *,
3
3
  *::before,
4
4
  *::after {
5
- box-sizing: border-box;
5
+ box-sizing: border-box;
6
6
  }
7
7
 
8
8
  :host {
9
- display: block;
9
+ display: block;
10
10
  }
11
11
 
12
12
  .button-group {
13
- display: inline-flex;
14
- flex-direction: row;
15
- flex-wrap: wrap;
16
- background: var(--g-color-background-default);
17
- border-radius: var(--g-border-radius-md);
18
- min-width: fit-content;
19
- max-width: 100%;
20
- overflow: hidden;
13
+ display: inline-flex;
14
+ flex-direction: row;
15
+ flex-wrap: wrap;
16
+ background: var(--g-color-background-default);
17
+ border-radius: var(--g-border-radius-md);
18
+ min-width: fit-content;
19
+ max-width: 100%;
20
+ overflow: hidden;
21
21
  }
22
22
 
23
23
  .button-group ::slotted(grantcodes-button) {
24
- --button-border-radius-start: 0;
25
- --button-border-radius-end: 0;
24
+ --_button-border-radius-start: 0;
25
+ --_button-border-radius-end: 0;
26
26
  }
27
27
 
28
28
  .button-group ::slotted(grantcodes-button:first-child) {
29
- --button-border-radius-start: var(--g-border-radius-md);
29
+ --_button-border-radius-start: var(--g-border-radius-md);
30
30
  }
31
31
 
32
32
  .button-group ::slotted(grantcodes-button:last-child) {
33
- --button-border-radius-end: var(--g-border-radius-md);
33
+ --_button-border-radius-end: var(--g-border-radius-md);
34
34
  }
35
35
 
36
36
  .button-group ::slotted(grantcodes-button:focus-visible) {
37
- position: relative;
38
- z-index: 1;
37
+ position: relative;
38
+ z-index: 1;
39
39
  }
@@ -1,6 +1,6 @@
1
- import { GrantCodesButtonGroup } from "./button-group.component.js";
1
+ import { GrantCodesButtonGroup } from './button-group.component.js';
2
2
 
3
- export * from "./button-group.component.js";
3
+ export * from './button-group.component.js';
4
4
  export default GrantCodesButtonGroup;
5
5
 
6
- customElements.define("grantcodes-button-group", GrantCodesButtonGroup);
6
+ customElements.define('grantcodes-button-group', GrantCodesButtonGroup);
@@ -1,9 +1,9 @@
1
- import React from "react";
2
- import { createComponent } from "@lit/react";
3
- import { GrantCodesButtonGroup } from "./button-group.js";
1
+ import { createComponent } from '@lit/react';
2
+ import React from 'react';
3
+ import { GrantCodesButtonGroup } from './button-group.js';
4
4
 
5
5
  export const ButtonGroup = createComponent({
6
- tagName: "grantcodes-button-group",
7
- elementClass: GrantCodesButtonGroup,
8
- react: React,
6
+ tagName: 'grantcodes-button-group',
7
+ elementClass: GrantCodesButtonGroup,
8
+ react: React,
9
9
  });
@@ -1,31 +1,31 @@
1
- import { getStorybookHelpers } from "@wc-toolkit/storybook-helpers";
2
- const { events, args, argTypes, template } = getStorybookHelpers(
3
- "grantcodes-button-group",
4
- );
5
- import { html } from "lit/static-html.js";
6
- import "./button-group";
7
- import "../button/button";
1
+ import { getStorybookHelpers } from '@wc-toolkit/storybook-helpers';
2
+
3
+ const { events, args, argTypes, template } = getStorybookHelpers('grantcodes-button-group');
4
+
5
+ import { html } from 'lit/static-html.js';
6
+ import './button-group';
7
+ import '../button/button';
8
8
 
9
9
  const meta = {
10
- title: "Components/ButtonGroup",
11
- component: "grantcodes-button-group",
12
- args: {
13
- ...args,
14
- },
15
- argTypes,
16
- render: (args) =>
17
- template(
18
- args,
19
- html`
10
+ title: 'Components/ButtonGroup',
11
+ component: 'grantcodes-button-group',
12
+ args: {
13
+ ...args,
14
+ },
15
+ argTypes,
16
+ render: (args) =>
17
+ template(
18
+ args,
19
+ html`
20
20
  <grantcodes-button>Button 1</grantcodes-button>
21
21
  <grantcodes-button>Button 2</grantcodes-button>
22
22
  <grantcodes-button>Button 3</grantcodes-button>`,
23
- ),
24
- parameters: {
25
- actions: {
26
- handles: events,
27
- },
28
- },
23
+ ),
24
+ parameters: {
25
+ actions: {
26
+ handles: events,
27
+ },
28
+ },
29
29
  };
30
30
 
31
31
  export default meta;
@@ -1,55 +1,55 @@
1
- import { describe, it, afterEach } from "node:test";
2
- import { strict as assert } from "node:assert";
3
- import { fixture, cleanup } from "../../test-utils/index.js";
4
- import "./button-group.js";
5
-
6
- describe("Button Group 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-button-group");
15
- assert.ok(element, "Element should be created");
16
- assert.ok(element.shadowRoot, "Element should have shadow root");
17
- });
18
-
19
- it("should render button group wrapper", async () => {
20
- element = await fixture("grantcodes-button-group");
21
- const group = element.shadowRoot.querySelector(".button-group");
22
- assert.ok(group, "Button group wrapper should exist");
23
- });
24
-
25
- it("should have slot for buttons", async () => {
26
- element = await fixture("grantcodes-button-group");
27
- const slot = element.shadowRoot.querySelector("slot");
28
- assert.ok(slot, "Slot should exist for buttons");
29
- });
30
-
31
- it("should support multiple slotted buttons", async () => {
32
- element = await fixture("grantcodes-button-group");
33
-
34
- const button1 = document.createElement("button");
35
- button1.textContent = "Button 1";
36
- const button2 = document.createElement("button");
37
- button2.textContent = "Button 2";
38
- const button3 = document.createElement("button");
39
- button3.textContent = "Button 3";
40
-
41
- element.appendChild(button1);
42
- element.appendChild(button2);
43
- element.appendChild(button3);
44
-
45
- await element.updateComplete;
46
-
47
- assert.strictEqual(element.children.length, 3, "Should have three buttons");
48
- });
49
-
50
- it("should group buttons together visually", async () => {
51
- element = await fixture("grantcodes-button-group");
52
- const group = element.shadowRoot.querySelector(".button-group");
53
- assert.ok(group, "Button group should provide visual grouping");
54
- });
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 './button-group.js';
5
+
6
+ describe('Button Group 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-button-group');
15
+ assert.ok(element, 'Element should be created');
16
+ assert.ok(element.shadowRoot, 'Element should have shadow root');
17
+ });
18
+
19
+ it('should render button group wrapper', async () => {
20
+ element = await fixture('grantcodes-button-group');
21
+ const group = element.shadowRoot.querySelector('.button-group');
22
+ assert.ok(group, 'Button group wrapper should exist');
23
+ });
24
+
25
+ it('should have slot for buttons', async () => {
26
+ element = await fixture('grantcodes-button-group');
27
+ const slot = element.shadowRoot.querySelector('slot');
28
+ assert.ok(slot, 'Slot should exist for buttons');
29
+ });
30
+
31
+ it('should support multiple slotted buttons', async () => {
32
+ element = await fixture('grantcodes-button-group');
33
+
34
+ const button1 = document.createElement('button');
35
+ button1.textContent = 'Button 1';
36
+ const button2 = document.createElement('button');
37
+ button2.textContent = 'Button 2';
38
+ const button3 = document.createElement('button');
39
+ button3.textContent = 'Button 3';
40
+
41
+ element.appendChild(button1);
42
+ element.appendChild(button2);
43
+ element.appendChild(button3);
44
+
45
+ await element.updateComplete;
46
+
47
+ assert.strictEqual(element.children.length, 3, 'Should have three buttons');
48
+ });
49
+
50
+ it('should group buttons together visually', async () => {
51
+ element = await fixture('grantcodes-button-group');
52
+ const group = element.shadowRoot.querySelector('.button-group');
53
+ assert.ok(group, 'Button group should provide visual grouping');
54
+ });
55
55
  });
@@ -1 +1 @@
1
- export * from "./button-group.js";
1
+ export * from './button-group.js';
@@ -1,48 +1,46 @@
1
- import { LitElement, html } from "lit";
2
- import cardStyles from "./card.css" with { type: "css" };
1
+ import { html, LitElement } from 'lit';
2
+ import cardStyles from './card.css' with { type: 'css' };
3
3
 
4
4
  export class GrantCodesCard extends LitElement {
5
- static properties = {
6
- hasHeader: { type: Boolean, reflect: true },
7
- hasFooter: { type: Boolean, reflect: true },
8
- };
5
+ static properties = {
6
+ hasHeader: { type: Boolean, reflect: true },
7
+ hasFooter: { type: Boolean, reflect: true },
8
+ };
9
9
 
10
- static styles = [cardStyles];
10
+ static styles = [cardStyles];
11
11
 
12
- constructor() {
13
- super();
14
- this.hasHeader = false;
15
- this.hasFooter = false;
16
- }
12
+ constructor() {
13
+ super();
14
+ this.hasHeader = false;
15
+ this.hasFooter = false;
16
+ }
17
17
 
18
- firstUpdated() {
19
- this._checkSlots();
20
- this.shadowRoot.querySelectorAll("slot").forEach((slot) => {
21
- slot.addEventListener("slotchange", () => this._checkSlots());
22
- });
23
- }
18
+ firstUpdated() {
19
+ this._checkSlots();
20
+ this.shadowRoot.querySelectorAll('slot').forEach((slot) => {
21
+ slot.addEventListener('slotchange', () => this._checkSlots());
22
+ });
23
+ }
24
24
 
25
- _checkSlots() {
26
- const headerSlot = this.shadowRoot?.querySelector('slot[name="header"]');
27
- const footerSlot = this.shadowRoot?.querySelector('slot[name="footer"]');
28
- this.hasHeader =
29
- (headerSlot?.assignedNodes({ flatten: true }).length ?? 0) > 0;
30
- this.hasFooter =
31
- (footerSlot?.assignedNodes({ flatten: true }).length ?? 0) > 0;
25
+ _checkSlots() {
26
+ const headerSlot = this.shadowRoot?.querySelector('slot[name="header"]');
27
+ const footerSlot = this.shadowRoot?.querySelector('slot[name="footer"]');
28
+ this.hasHeader = (headerSlot?.assignedNodes({ flatten: true }).length ?? 0) > 0;
29
+ this.hasFooter = (footerSlot?.assignedNodes({ flatten: true }).length ?? 0) > 0;
32
30
 
33
- const headerEl = this.shadowRoot?.querySelector(".card__header");
34
- const footerEl = this.shadowRoot?.querySelector(".card__footer");
35
- headerEl?.toggleAttribute("data-has-content", this.hasHeader);
36
- footerEl?.toggleAttribute("data-has-content", this.hasFooter);
37
- }
31
+ const headerEl = this.shadowRoot?.querySelector('.card__header');
32
+ const footerEl = this.shadowRoot?.querySelector('.card__footer');
33
+ headerEl?.toggleAttribute('data-has-content', this.hasHeader);
34
+ footerEl?.toggleAttribute('data-has-content', this.hasFooter);
35
+ }
38
36
 
39
- render() {
40
- return html`
37
+ render() {
38
+ return html`
41
39
  <div class="card">
42
40
  <div class="card__header"><slot name="header"></slot></div>
43
41
  <div class="card__content"><slot></slot></div>
44
42
  <div class="card__footer"><slot name="footer"></slot></div>
45
43
  </div>
46
44
  `;
47
- }
45
+ }
48
46
  }
@@ -2,149 +2,149 @@
2
2
  *,
3
3
  *::before,
4
4
  *::after {
5
- box-sizing: border-box;
5
+ box-sizing: border-box;
6
6
  }
7
7
 
8
8
  :host {
9
- display: block;
10
- flex-grow: 1;
11
- /* Enable container queries for responsive card layouts */
12
- container-type: inline-size;
13
- container-name: card;
9
+ display: block;
10
+ flex-grow: 1;
11
+ /* Enable container queries for responsive card layouts */
12
+ container-type: inline-size;
13
+ container-name: card;
14
14
  }
15
15
 
16
16
  .card {
17
- display: flex;
18
- inline-size: 100%;
19
- min-block-size: 100%;
20
- flex-direction: column;
21
- justify-content: flex-start;
22
- overflow: hidden;
23
- background: var(--g-color-background-default);
24
- border-style: solid;
25
- border-width: var(--g-border-width-sm);
26
- border-color: var(--g-color-border-default);
27
- border-radius: var(--g-border-radius-md);
28
- box-shadow: var(--g-box-shadow-md);
29
- transition:
30
- box-shadow 0.2s ease,
31
- transform 0.2s ease,
32
- border-color 0.2s ease,
33
- background-color 0.2s ease;
17
+ display: flex;
18
+ inline-size: 100%;
19
+ min-block-size: 100%;
20
+ flex-direction: column;
21
+ justify-content: flex-start;
22
+ overflow: hidden;
23
+ background: var(--g-color-background-default);
24
+ border-style: solid;
25
+ border-width: var(--g-border-width-sm);
26
+ border-color: var(--g-color-border-default);
27
+ border-radius: var(--g-border-radius-md);
28
+ box-shadow: var(--g-box-shadow-md);
29
+ transition:
30
+ box-shadow 0.2s ease,
31
+ transform 0.2s ease,
32
+ border-color 0.2s ease,
33
+ background-color 0.2s ease;
34
34
  }
35
35
 
36
36
  /* Image support - images in header or content will be styled appropriately */
37
37
  .card__header img,
38
38
  .card__content img {
39
- display: block;
40
- inline-size: 100%;
41
- block-size: auto;
42
- border-radius: inherit;
39
+ display: block;
40
+ inline-size: 100%;
41
+ block-size: auto;
42
+ border-radius: inherit;
43
43
  }
44
44
 
45
45
  .card__header {
46
- padding-inline: var(--g-spacing-md);
47
- padding-block: var(--g-spacing-sm);
48
- border-block-end: 1px solid var(--g-color-border-default);
46
+ padding-inline: var(--g-spacing-md);
47
+ padding-block: var(--g-spacing-sm);
48
+ border-block-end: 1px solid var(--g-color-border-default);
49
49
  }
50
50
 
51
51
  .card__header:not([data-has-content]) {
52
- display: none;
52
+ display: none;
53
53
  }
54
54
 
55
55
  .card__header ::slotted(*) {
56
- margin: 0;
57
- font: var(--g-typography-h5-font);
56
+ margin: 0;
57
+ font: var(--g-typography-h5-font);
58
58
  }
59
59
 
60
60
  .card__content {
61
- display: flex;
62
- flex-direction: column;
63
- justify-content: flex-start;
64
- gap: var(--g-spacing-md);
65
- padding-block: var(--g-spacing-md);
66
- padding-inline: var(--g-spacing-md);
61
+ display: flex;
62
+ flex-direction: column;
63
+ justify-content: flex-start;
64
+ gap: var(--g-spacing-md);
65
+ padding-block: var(--g-spacing-md);
66
+ padding-inline: var(--g-spacing-md);
67
67
  }
68
68
 
69
69
  .card__content:has(::slotted(:empty)) {
70
- display: none;
70
+ display: none;
71
71
  }
72
72
 
73
73
  .card__content > * {
74
- margin: 0;
74
+ margin: 0;
75
75
  }
76
76
 
77
77
  .card__footer {
78
- display: flex;
79
- flex-direction: row;
80
- flex-wrap: wrap;
81
- justify-content: flex-start;
82
- align-items: center;
83
- gap: var(--g-spacing-sm);
84
- padding-inline: var(--g-spacing-md);
85
- padding-block: var(--g-spacing-sm);
86
- border-block-start: 1px solid var(--g-color-border-default);
87
- background: var(--g-color-background-default);
78
+ display: flex;
79
+ flex-direction: row;
80
+ flex-wrap: wrap;
81
+ justify-content: flex-start;
82
+ align-items: center;
83
+ gap: var(--g-spacing-sm);
84
+ padding-inline: var(--g-spacing-md);
85
+ padding-block: var(--g-spacing-sm);
86
+ border-block-start: 1px solid var(--g-color-border-default);
87
+ background: var(--g-color-background-default);
88
88
  }
89
89
 
90
90
  .card__footer:not([data-has-content]) {
91
- display: none;
91
+ display: none;
92
92
  }
93
93
 
94
94
  .card__footer ::slotted(grantcodes-button-group) {
95
- width: 100%;
96
- justify-content: flex-end;
95
+ width: 100%;
96
+ justify-content: flex-end;
97
97
  }
98
98
 
99
99
  .card__meta {
100
- display: flex;
101
- flex-direction: row;
102
- align-items: center;
103
- flex-wrap: wrap;
104
- gap: var(--g-spacing-md);
105
- margin: 0;
106
- padding-inline: var(--g-spacing-md);
107
- padding-block: 1em;
108
- font-size: var(--g-typography-font-size-xs);
109
- /* Use color-mix() for modern color manipulation */
110
- background-color: color-mix(
111
- in srgb,
112
- var(--g-color-background-default) 90%,
113
- var(--g-color-primary-500) 10%
114
- );
115
- color: var(--g-color-content-default);
100
+ display: flex;
101
+ flex-direction: row;
102
+ align-items: center;
103
+ flex-wrap: wrap;
104
+ gap: var(--g-spacing-md);
105
+ margin: 0;
106
+ padding-inline: var(--g-spacing-md);
107
+ padding-block: 1em;
108
+ font-size: var(--g-typography-font-size-xs);
109
+ /* Use color-mix() for modern color manipulation */
110
+ background-color: color-mix(
111
+ in srgb,
112
+ var(--g-color-background-default) 90%,
113
+ var(--g-color-primary-500) 10%
114
+ );
115
+ color: var(--g-color-content-default);
116
116
  }
117
117
 
118
118
  .card__meta__item {
119
- display: flex;
120
- flex-direction: row;
121
- align-items: center;
122
- flex-wrap: nowrap;
123
- gap: 0.3em;
119
+ display: flex;
120
+ flex-direction: row;
121
+ align-items: center;
122
+ flex-wrap: nowrap;
123
+ gap: 0.3em;
124
124
  }
125
125
 
126
126
  .card__meta__item dt,
127
127
  .card__meta__item dd {
128
- display: block;
129
- margin: 0;
130
- padding: 0;
128
+ display: block;
129
+ margin: 0;
130
+ padding: 0;
131
131
  }
132
132
 
133
133
  .card__meta__item dt::after {
134
- content: ":";
134
+ content: ":";
135
135
  }
136
136
 
137
137
  :host(.is-clickable) .card {
138
- cursor: pointer;
138
+ cursor: pointer;
139
139
  }
140
140
 
141
141
  :host(.is-clickable:hover) .card {
142
- transform: translateY(-2px);
143
- box-shadow: var(--g-box-shadow-lg);
144
- border-color: var(--g-color-border-default);
142
+ transform: translateY(-2px);
143
+ box-shadow: var(--g-box-shadow-lg);
144
+ border-color: var(--g-color-border-default);
145
145
  }
146
146
 
147
147
  :host(.is-clickable:active) .card {
148
- transform: translateY(-1px);
149
- border-color: var(--g-color-border-primary);
148
+ transform: translateY(-1px);
149
+ border-color: var(--g-color-border-primary);
150
150
  }
@@ -1,8 +1,8 @@
1
- import { GrantCodesCard } from "./card.component.js";
1
+ import { GrantCodesCard } from './card.component.js';
2
2
 
3
- export * from "./card.component.js";
3
+ export * from './card.component.js';
4
4
  export default GrantCodesCard;
5
5
 
6
- if (!customElements.get("grantcodes-card")) {
7
- customElements.define("grantcodes-card", GrantCodesCard);
6
+ if (!customElements.get('grantcodes-card')) {
7
+ customElements.define('grantcodes-card', GrantCodesCard);
8
8
  }
@@ -1,9 +1,9 @@
1
- import React from "react";
2
- import { createComponent } from "@lit/react";
3
- import { GrantCodesCard } from "./card.js";
1
+ import { createComponent } from '@lit/react';
2
+ import React from 'react';
3
+ import { GrantCodesCard } from './card.js';
4
4
 
5
5
  export const Card = createComponent({
6
- tagName: "grantcodes-card",
7
- elementClass: GrantCodesCard,
8
- react: React,
6
+ tagName: 'grantcodes-card',
7
+ elementClass: GrantCodesCard,
8
+ react: React,
9
9
  });