@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,84 +1,82 @@
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
  .breadcrumb {
12
- display: block;
12
+ display: block;
13
13
  }
14
14
 
15
15
  .breadcrumb__list {
16
- display: flex;
17
- flex-wrap: wrap;
18
- align-items: center;
19
- gap: var(--g-spacing-sm);
20
- margin: 0;
21
- padding: 0;
22
- list-style: none;
16
+ display: flex;
17
+ flex-wrap: wrap;
18
+ align-items: center;
19
+ gap: var(--g-spacing-sm);
20
+ margin: 0;
21
+ padding: 0;
22
+ list-style: none;
23
23
  }
24
24
 
25
25
  .breadcrumb__item {
26
- display: inline-flex;
27
- align-items: center;
28
- gap: var(--g-spacing-sm);
29
- font-size: var(--g-typography-body-sm-font-size);
30
- color: var(--g-color-primary-700);
26
+ display: inline-flex;
27
+ align-items: center;
28
+ gap: var(--g-spacing-sm);
29
+ font-size: var(--g-typography-body-sm-font-size);
30
+ color: var(--g-color-primary-700);
31
31
  }
32
32
 
33
33
  /* Separator using ::after pseudo-element; driven by parent via data-has-separator */
34
34
  :host([data-has-separator]) .breadcrumb__item::after {
35
- content: var(--component-breadcrumb-separator, "/");
36
- display: inline-block;
37
- color: var(--g-color-primary-400);
38
- font-weight: var(--g-typography-body-lg-font-weight);
39
- user-select: none;
40
- pointer-events: none;
35
+ content: var(--component-breadcrumb-separator, "/");
36
+ display: inline-block;
37
+ color: var(--g-color-content-subtle);
38
+ font-weight: var(--g-typography-body-lg-font-weight);
39
+ user-select: none;
40
+ pointer-events: none;
41
41
  }
42
42
 
43
43
  /* Current page styling */
44
44
  .breadcrumb__item[data-current] {
45
- color: var(--color-base-primary-900);
45
+ color: var(--g-color-content-default);
46
46
  }
47
47
 
48
48
  .breadcrumb__item[data-current]::after {
49
- display: none;
49
+ display: none;
50
50
  }
51
51
 
52
52
  .breadcrumb__link {
53
- color: var(--g-color-primary-600);
54
- text-decoration: none;
55
- transition: color 0.2s ease;
56
- border-radius: var(--g-border-radius-md, 0.25rem);
57
- padding-inline: 0.25em;
58
- padding-block: 0.125em;
59
- margin-inline: -0.25em;
60
- margin-block: -0.125em;
53
+ text-decoration: none;
54
+ border-radius: var(--g-border-radius-md, 0.25rem);
55
+ padding-inline: 0.25em;
56
+ padding-block: 0.125em;
57
+ margin-inline: -0.25em;
58
+ margin-block: -0.125em;
61
59
  }
62
60
 
63
- .breadcrumb__link:hover {
64
- color: var(--g-color-primary-700);
65
- text-decoration: underline;
61
+ .breadcrumb__link:hover,
62
+ .breadcrumb__link:focus-visible {
63
+ text-decoration: underline wavy;
66
64
  }
67
65
 
68
66
  .breadcrumb__text {
69
- display: inline-block;
67
+ display: inline-block;
70
68
  }
71
69
 
72
70
  /* Responsive: Show only last few items on small screens */
73
71
  @media (max-width: 640px) {
74
- .breadcrumb__item:not(:last-child):not(:nth-last-child(2)) {
75
- display: none;
76
- }
72
+ .breadcrumb__item:not(:last-child):not(:nth-last-child(2)) {
73
+ display: none;
74
+ }
77
75
 
78
- .breadcrumb__item:nth-last-child(2)::before {
79
- content: "...";
80
- display: inline-block;
81
- margin-inline-end: 0.5rem;
82
- color: var(--g-color-primary-400);
83
- }
76
+ .breadcrumb__item:nth-last-child(2)::before {
77
+ content: "...";
78
+ display: inline-block;
79
+ margin-inline-end: 0.5rem;
80
+ color: var(--g-color-content-subtle);
81
+ }
84
82
  }
@@ -1,14 +1,11 @@
1
- import {
2
- GrantCodesBreadcrumb,
3
- GrantCodesBreadcrumbItem,
4
- } from "./breadcrumb.component.js";
1
+ import { GrantCodesBreadcrumb, GrantCodesBreadcrumbItem } from './breadcrumb.component.js';
5
2
 
6
- export * from "./breadcrumb.component.js";
3
+ export * from './breadcrumb.component.js';
7
4
  export default GrantCodesBreadcrumb;
8
5
 
9
- if (!customElements.get("grantcodes-breadcrumb")) {
10
- customElements.define("grantcodes-breadcrumb", GrantCodesBreadcrumb);
6
+ if (!customElements.get('grantcodes-breadcrumb')) {
7
+ customElements.define('grantcodes-breadcrumb', GrantCodesBreadcrumb);
11
8
  }
12
- if (!customElements.get("grantcodes-breadcrumb-item")) {
13
- customElements.define("grantcodes-breadcrumb-item", GrantCodesBreadcrumbItem);
9
+ if (!customElements.get('grantcodes-breadcrumb-item')) {
10
+ customElements.define('grantcodes-breadcrumb-item', GrantCodesBreadcrumbItem);
14
11
  }
@@ -1,18 +1,15 @@
1
- import React from "react";
2
- import { createComponent } from "@lit/react";
3
- import {
4
- GrantCodesBreadcrumb,
5
- GrantCodesBreadcrumbItem,
6
- } from "./breadcrumb.js";
1
+ import { createComponent } from '@lit/react';
2
+ import React from 'react';
3
+ import { GrantCodesBreadcrumb, GrantCodesBreadcrumbItem } from './breadcrumb.js';
7
4
 
8
5
  export const Breadcrumb = createComponent({
9
- tagName: "grantcodes-breadcrumb",
10
- elementClass: GrantCodesBreadcrumb,
11
- react: React,
6
+ tagName: 'grantcodes-breadcrumb',
7
+ elementClass: GrantCodesBreadcrumb,
8
+ react: React,
12
9
  });
13
10
 
14
11
  export const BreadcrumbItem = createComponent({
15
- tagName: "grantcodes-breadcrumb-item",
16
- elementClass: GrantCodesBreadcrumbItem,
17
- react: React,
12
+ tagName: 'grantcodes-breadcrumb-item',
13
+ elementClass: GrantCodesBreadcrumbItem,
14
+ react: React,
18
15
  });
@@ -1,9 +1,9 @@
1
- import { html } from "lit";
2
- import "./breadcrumb.js";
1
+ import { html } from 'lit';
2
+ import './breadcrumb.js';
3
3
 
4
4
  const meta = {
5
- title: "Components/Breadcrumb",
6
- component: "grantcodes-breadcrumb",
5
+ title: 'Components/Breadcrumb',
6
+ component: 'grantcodes-breadcrumb',
7
7
  };
8
8
 
9
9
  export default meta;
@@ -12,7 +12,7 @@ export default meta;
12
12
  * Basic breadcrumb navigation showing the current page hierarchy
13
13
  */
14
14
  export const Breadcrumb = {
15
- render: () => html`
15
+ render: () => html`
16
16
  <grantcodes-breadcrumb>
17
17
  <grantcodes-breadcrumb-item href="/">Home</grantcodes-breadcrumb-item>
18
18
  <grantcodes-breadcrumb-item href="/products">Products</grantcodes-breadcrumb-item>
@@ -1,154 +1,142 @@
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 "./breadcrumb.js";
5
-
6
- describe("Breadcrumb Component", () => {
7
- let element;
8
-
9
- afterEach(() => {
10
- cleanup(element);
11
- });
12
-
13
- it("should render breadcrumb container", async () => {
14
- element = await fixture("grantcodes-breadcrumb");
15
- assert.ok(element, "Element should be created");
16
- assert.ok(element.shadowRoot, "Element should have shadow root");
17
- });
18
-
19
- it("should render nav element with aria-label", async () => {
20
- element = await fixture("grantcodes-breadcrumb");
21
- const nav = element.shadowRoot.querySelector("nav");
22
- assert.ok(nav, "Nav element should exist");
23
- assert.strictEqual(
24
- nav.getAttribute("aria-label"),
25
- "Breadcrumb",
26
- "Should have breadcrumb aria-label",
27
- );
28
- });
29
-
30
- it("should render ordered list", async () => {
31
- element = await fixture("grantcodes-breadcrumb");
32
- const list = element.shadowRoot.querySelector("ol");
33
- assert.ok(list, "Ordered list should exist");
34
- assert.ok(
35
- list.classList.contains("breadcrumb__list"),
36
- "Should have breadcrumb__list class",
37
- );
38
- });
39
-
40
- it("should have default separator", async () => {
41
- element = await fixture("grantcodes-breadcrumb");
42
- assert.strictEqual(element.separator, "/", "Default separator should be /");
43
- });
44
-
45
- it("should have slot for breadcrumb items", async () => {
46
- element = await fixture("grantcodes-breadcrumb");
47
- const slot = element.shadowRoot.querySelector("slot");
48
- assert.ok(slot, "Slot should exist for breadcrumb items");
49
- });
1
+ import { strict as assert } from 'node:assert';
2
+ import { afterEach, describe, it } from 'node:test';
3
+ import linkStyles from '../../css/elements/a.css' with { type: 'css' };
4
+ import { cleanup, fixture } from '../../test-utils/index.js';
5
+ import { GrantCodesBreadcrumbItem } from './breadcrumb.component.js';
6
+ import './breadcrumb.js';
7
+
8
+ describe('Breadcrumb Component', () => {
9
+ let element;
10
+
11
+ afterEach(() => {
12
+ cleanup(element);
13
+ });
14
+
15
+ it('should render breadcrumb container', async () => {
16
+ element = await fixture('grantcodes-breadcrumb');
17
+ assert.ok(element, 'Element should be created');
18
+ assert.ok(element.shadowRoot, 'Element should have shadow root');
19
+ });
20
+
21
+ it('should render nav element with aria-label', async () => {
22
+ element = await fixture('grantcodes-breadcrumb');
23
+ const nav = element.shadowRoot.querySelector('nav');
24
+ assert.ok(nav, 'Nav element should exist');
25
+ assert.strictEqual(
26
+ nav.getAttribute('aria-label'),
27
+ 'Breadcrumb',
28
+ 'Should have breadcrumb aria-label',
29
+ );
30
+ });
31
+
32
+ it('should render ordered list', async () => {
33
+ element = await fixture('grantcodes-breadcrumb');
34
+ const list = element.shadowRoot.querySelector('ol');
35
+ assert.ok(list, 'Ordered list should exist');
36
+ assert.ok(list.classList.contains('breadcrumb__list'), 'Should have breadcrumb__list class');
37
+ });
38
+
39
+ it('should have default separator', async () => {
40
+ element = await fixture('grantcodes-breadcrumb');
41
+ assert.strictEqual(element.separator, '/', 'Default separator should be /');
42
+ });
43
+
44
+ it('should have slot for breadcrumb items', async () => {
45
+ element = await fixture('grantcodes-breadcrumb');
46
+ const slot = element.shadowRoot.querySelector('slot');
47
+ assert.ok(slot, 'Slot should exist for breadcrumb items');
48
+ });
50
49
  });
51
50
 
52
- describe("Breadcrumb Item Component", () => {
53
- let element;
54
-
55
- afterEach(() => {
56
- cleanup(element);
57
- });
58
-
59
- it("should render breadcrumb item", async () => {
60
- element = await fixture("grantcodes-breadcrumb-item");
61
- assert.ok(element, "Element should be created");
62
- assert.ok(element.shadowRoot, "Element should have shadow root");
63
- });
64
-
65
- it("should render as link when href is provided", async () => {
66
- element = await fixture("grantcodes-breadcrumb-item", {
67
- href: "/test",
68
- });
69
-
70
- const link = element.shadowRoot.querySelector(".breadcrumb__link");
71
- assert.ok(link, "Link should exist");
72
- assert.strictEqual(
73
- link.getAttribute("href"),
74
- "/test",
75
- "Href should be set",
76
- );
77
- });
78
-
79
- it("should render as span when no href", async () => {
80
- element = await fixture("grantcodes-breadcrumb-item");
81
-
82
- const span = element.shadowRoot.querySelector(".breadcrumb__text");
83
- assert.ok(span, "Span should exist");
84
- });
85
-
86
- it("should render as span when current", async () => {
87
- element = await fixture("grantcodes-breadcrumb-item", {
88
- href: "/test",
89
- current: true,
90
- });
91
-
92
- const span = element.shadowRoot.querySelector(".breadcrumb__text");
93
- const link = element.shadowRoot.querySelector(".breadcrumb__link");
94
- assert.ok(span, "Span should exist for current page");
95
- assert.ok(!link, "Link should not exist for current page");
96
- });
97
-
98
- it("should have current attribute when current is true", async () => {
99
- element = await fixture("grantcodes-breadcrumb-item", {
100
- current: true,
101
- });
102
-
103
- const item = element.shadowRoot.querySelector(".breadcrumb__item");
104
- assert.ok(
105
- item.hasAttribute("data-current"),
106
- "Should have data-current attribute",
107
- );
108
- });
109
-
110
- it("should not have current attribute when current is false", async () => {
111
- element = await fixture("grantcodes-breadcrumb-item", {
112
- current: false,
113
- });
114
-
115
- const item = element.shadowRoot.querySelector(".breadcrumb__item");
116
- assert.ok(
117
- !item.hasAttribute("data-current"),
118
- "Should not have data-current attribute",
119
- );
120
- });
121
-
122
- it("should render list item", async () => {
123
- element = await fixture("grantcodes-breadcrumb-item");
124
- const item = element.shadowRoot.querySelector("li");
125
- assert.ok(item, "List item should exist");
126
- });
127
-
128
- it("should render slotted content", async () => {
129
- element = await fixture("grantcodes-breadcrumb-item");
130
- element.textContent = "Home";
131
-
132
- await element.updateComplete;
133
-
134
- assert.strictEqual(
135
- element.textContent,
136
- "Home",
137
- "Slotted content should be rendered",
138
- );
139
- });
140
-
141
- it("should not be current by default", async () => {
142
- element = await fixture("grantcodes-breadcrumb-item");
143
- assert.strictEqual(
144
- element.current,
145
- false,
146
- "Should not be current by default",
147
- );
148
- });
149
-
150
- it("should have empty href by default", async () => {
151
- element = await fixture("grantcodes-breadcrumb-item");
152
- assert.strictEqual(element.href, "", "Href should be empty by default");
153
- });
51
+ describe('Breadcrumb Item Component', () => {
52
+ let element;
53
+
54
+ afterEach(() => {
55
+ cleanup(element);
56
+ });
57
+
58
+ it('should render breadcrumb item', async () => {
59
+ element = await fixture('grantcodes-breadcrumb-item');
60
+ assert.ok(element, 'Element should be created');
61
+ assert.ok(element.shadowRoot, 'Element should have shadow root');
62
+ });
63
+
64
+ it('should render as link when href is provided', async () => {
65
+ element = await fixture('grantcodes-breadcrumb-item', {
66
+ href: '/test',
67
+ });
68
+
69
+ const link = element.shadowRoot.querySelector('.breadcrumb__link');
70
+ assert.ok(link, 'Link should exist');
71
+ assert.strictEqual(link.getAttribute('href'), '/test', 'Href should be set');
72
+ });
73
+
74
+ it('should render as span when no href', async () => {
75
+ element = await fixture('grantcodes-breadcrumb-item');
76
+
77
+ const span = element.shadowRoot.querySelector('.breadcrumb__text');
78
+ assert.ok(span, 'Span should exist');
79
+ });
80
+
81
+ it('should render as span when current', async () => {
82
+ element = await fixture('grantcodes-breadcrumb-item', {
83
+ href: '/test',
84
+ current: true,
85
+ });
86
+
87
+ const span = element.shadowRoot.querySelector('.breadcrumb__text');
88
+ const link = element.shadowRoot.querySelector('.breadcrumb__link');
89
+ assert.ok(span, 'Span should exist for current page');
90
+ assert.ok(!link, 'Link should not exist for current page');
91
+ });
92
+
93
+ it('should have current attribute when current is true', async () => {
94
+ element = await fixture('grantcodes-breadcrumb-item', {
95
+ current: true,
96
+ });
97
+
98
+ const item = element.shadowRoot.querySelector('.breadcrumb__item');
99
+ assert.ok(item.hasAttribute('data-current'), 'Should have data-current attribute');
100
+ });
101
+
102
+ it('should not have current attribute when current is false', async () => {
103
+ element = await fixture('grantcodes-breadcrumb-item', {
104
+ current: false,
105
+ });
106
+
107
+ const item = element.shadowRoot.querySelector('.breadcrumb__item');
108
+ assert.ok(!item.hasAttribute('data-current'), 'Should not have data-current attribute');
109
+ });
110
+
111
+ it('should render list item', async () => {
112
+ element = await fixture('grantcodes-breadcrumb-item');
113
+ const item = element.shadowRoot.querySelector('li');
114
+ assert.ok(item, 'List item should exist');
115
+ });
116
+
117
+ it('should render slotted content', async () => {
118
+ element = await fixture('grantcodes-breadcrumb-item');
119
+ element.textContent = 'Home';
120
+
121
+ await element.updateComplete;
122
+
123
+ assert.strictEqual(element.textContent, 'Home', 'Slotted content should be rendered');
124
+ });
125
+
126
+ it('should not be current by default', async () => {
127
+ element = await fixture('grantcodes-breadcrumb-item');
128
+ assert.strictEqual(element.current, false, 'Should not be current by default');
129
+ });
130
+
131
+ it('should have empty href by default', async () => {
132
+ element = await fixture('grantcodes-breadcrumb-item');
133
+ assert.strictEqual(element.href, '', 'Href should be empty by default');
134
+ });
135
+
136
+ it('adopts the shared default link styles', () => {
137
+ assert.ok(
138
+ GrantCodesBreadcrumbItem.styles.includes(linkStyles),
139
+ 'Breadcrumb item should adopt css/elements/a.css',
140
+ );
141
+ });
154
142
  });
@@ -1 +1 @@
1
- export * from "./breadcrumb.js";
1
+ export * from './breadcrumb.js';