@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grantcodes/ui",
3
- "version": "2.15.6",
3
+ "version": "2.16.0",
4
4
  "description": "A personal component system built with Lit web components",
5
5
  "type": "module",
6
6
  "main": "src/main.js",
@@ -49,33 +49,33 @@
49
49
  },
50
50
  "license": "MIT",
51
51
  "dependencies": {
52
+ "@grantcodes/style-dictionary": "^1.10.2",
52
53
  "@lit/react": "^1.0.8",
53
- "lit": "^3.3.1",
54
- "shiki": "^3.17.1",
55
- "@grantcodes/style-dictionary": "^1.10.2"
54
+ "lit": "^3.3.3",
55
+ "lucide-static": "^1.47.0",
56
+ "shiki": "^4.4.3"
56
57
  },
57
58
  "devDependencies": {
58
- "@arcmantle/vite-plugin-import-css-sheet": "^1.0.12",
59
- "@biomejs/biome": "2.3.8",
59
+ "@arcmantle/vite-plugin-import-css-sheet": "^1.0.14",
60
+ "@biomejs/biome": "2.5.14",
60
61
  "@custom-elements-manifest/analyzer": "^0.11.0",
61
62
  "@grantcodes/commit": "^2.0.0",
62
- "@lit-labs/ssr-dom-shim": "^1.5.1",
63
- "@playwright/test": "^1.57.0",
64
- "@storybook/addon-docs": "^10.1.4",
65
- "@storybook/addon-themes": "^10.1.4",
66
- "@storybook/web-components-vite": "^10.1.4",
67
- "@wc-toolkit/cem-inheritance": "^1.2.2",
63
+ "@lit-labs/ssr-dom-shim": "^1.6.0",
64
+ "@playwright/test": "^1.63.0",
65
+ "@storybook/addon-docs": "^10.6.0",
66
+ "@storybook/addon-themes": "^10.6.0",
67
+ "@storybook/web-components-vite": "^10.6.0",
68
+ "@wc-toolkit/cem-inheritance": "^1.2.5",
68
69
  "@wc-toolkit/cem-sorter": "^1.0.1",
69
- "@wc-toolkit/cem-validator": "^1.0.3",
70
- "@wc-toolkit/module-path-resolver": "^1.0.0",
71
- "@wc-toolkit/storybook-helpers": "^10.0.0",
72
- "happy-dom": "^20.0.11",
73
- "lucide-static": "^0.555.0",
74
- "npm-run-all": "^4.1.5",
75
- "plop": "^4.0.4",
76
- "react": "^19.2.4",
77
- "storybook": "^10.1.4",
78
- "vite": "^7.2.6"
70
+ "@wc-toolkit/cem-validator": "^1.3.0",
71
+ "@wc-toolkit/module-path-resolver": "^1.0.1",
72
+ "@wc-toolkit/storybook-helpers": "^10.7.7",
73
+ "happy-dom": "^20.14.5",
74
+ "npm-run-all2": "^9.0.3",
75
+ "plop": "^4.0.5",
76
+ "react": "^19.3.0",
77
+ "storybook": "^10.6.0",
78
+ "vite": "^8.3.0"
79
79
  },
80
80
  "files": [
81
81
  "src/**/*",
@@ -107,6 +107,6 @@
107
107
  "fix:lint": "npx @biomejs/biome format --write src",
108
108
  "test": "run-s lint test:unit",
109
109
  "lint": "npx @biomejs/biome lint src",
110
- "test:unit": "NODE_ENV=test node --import @lit-labs/ssr-dom-shim/register-css-hook.js --test --test-concurrency=1 src/**/*.test.js"
110
+ "test:unit": "NODE_ENV=test node --import @lit-labs/ssr-dom-shim/register-css-hook.js --test --test-concurrency=1 'src/**/*.test.js'"
111
111
  }
112
112
  }
@@ -1,26 +1,24 @@
1
- import { LitElement } from "lit";
2
- import { html } from "lit/static-html.js";
3
- import focusRingStyles from "../../lib/styles/focus-ring.css" with {
4
- type: "css",
5
- };
6
- import accordionItemStyles from "./accordion-item.css" with { type: "css" };
1
+ import { LitElement } from 'lit';
2
+ import { html } from 'lit/static-html.js';
3
+ import focusRingStyles from '../../lib/styles/focus-ring.css' with { type: 'css' };
4
+ import accordionItemStyles from './accordion-item.css' with { type: 'css' };
7
5
 
8
6
  export class GrantCodesAccordionItem extends LitElement {
9
- static styles = [focusRingStyles, accordionItemStyles];
7
+ static styles = [focusRingStyles, accordionItemStyles];
10
8
 
11
- static properties = {
12
- title: { type: String },
13
- open: { type: Boolean, reflect: true },
14
- };
9
+ static properties = {
10
+ title: { type: String },
11
+ open: { type: Boolean, reflect: true },
12
+ };
15
13
 
16
- constructor() {
17
- super();
18
- this.title = "";
19
- this.open = false;
20
- }
14
+ constructor() {
15
+ super();
16
+ this.title = '';
17
+ this.open = false;
18
+ }
21
19
 
22
- render() {
23
- return html`
20
+ render() {
21
+ return html`
24
22
  <details class="accordion__item" ?open=${this.open}>
25
23
  <summary class="accordion__summary focus-ring">
26
24
  <span>${this.title}</span>
@@ -33,5 +31,5 @@ export class GrantCodesAccordionItem extends LitElement {
33
31
  </div>
34
32
  </details>
35
33
  `;
36
- }
34
+ }
37
35
  }
@@ -1,82 +1,78 @@
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
  .accordion__item {
12
- border: 1px solid
13
- var(--g-color-border-subtle, var(--g-color-border-default));
14
- border-radius: var(--g-border-radius-md, 0.5rem);
12
+ border: 1px solid var(--g-color-border-subtle, var(--g-color-border-default));
13
+ border-radius: var(--g-border-radius-md, 0.5rem);
15
14
  }
16
15
 
17
16
  .accordion__item::details-content {
18
- block-size: 0;
19
- overflow: clip;
20
- transition:
21
- block-size 0.25s ease,
22
- content-visibility 0.25s allow-discrete;
17
+ block-size: 0;
18
+ overflow: clip;
19
+ transition:
20
+ block-size 0.25s ease,
21
+ content-visibility 0.25s;
22
+ transition-behavior: allow-discrete;
23
23
  }
24
24
 
25
25
  .accordion__item[open]::details-content {
26
- block-size: auto;
26
+ block-size: auto;
27
27
  }
28
28
 
29
29
  .accordion__summary {
30
- padding: var(--g-spacing-md);
31
- cursor: pointer;
32
- background: var(--g-color-background-subtle);
33
- font-weight: var(--g-typography-body-font-weight);
34
- list-style: none;
35
- display: flex;
36
- justify-content: space-between;
37
- align-items: center;
38
- gap: var(--g-spacing-md);
39
- border-radius: var(--g-border-radius-md, 0.5rem);
40
- transition-property: background-color, outline-width, outline-color;
30
+ padding: var(--g-spacing-md);
31
+ cursor: pointer;
32
+ background: var(--g-color-background-subtle);
33
+ font-weight: var(--g-typography-body-font-weight);
34
+ list-style: none;
35
+ display: flex;
36
+ justify-content: space-between;
37
+ align-items: center;
38
+ gap: var(--g-spacing-md);
39
+ border-radius: var(--g-border-radius-md, 0.5rem);
40
+ transition-property: background-color, outline-width, outline-color;
41
41
  }
42
42
 
43
43
  .accordion__summary:hover {
44
- background: var(
45
- --g-color-background-subtle-hover,
46
- var(--g-color-background-subtle)
47
- );
44
+ background: var(--g-color-background-subtle-hover, var(--g-color-background-subtle));
48
45
  }
49
46
 
50
47
  .accordion__summary::-webkit-details-marker {
51
- display: none;
48
+ display: none;
52
49
  }
53
50
 
54
51
  .accordion__chevron {
55
- display: block;
56
- inline-size: 1em;
57
- block-size: 1em;
58
- flex-shrink: 0;
59
- transition: transform 0.25s ease;
60
- color: var(--g-color-content-subtle, currentColor);
52
+ display: block;
53
+ inline-size: 1em;
54
+ block-size: 1em;
55
+ flex-shrink: 0;
56
+ transition: transform 0.25s ease;
57
+ color: var(--g-color-content-subtle, currentColor);
61
58
  }
62
59
 
63
60
  .accordion__item[open] .accordion__chevron {
64
- transform: rotateX(180deg);
61
+ transform: rotateX(180deg);
65
62
  }
66
63
 
67
64
  .accordion__content {
68
- padding: var(--g-spacing-md);
69
- background: var(--g-color-background-default);
70
- border-radius: 0 0 var(--g-border-radius-md, 0.5rem)
71
- var(--g-border-radius-md, 0.5rem);
65
+ padding: var(--g-spacing-md);
66
+ background: var(--g-color-background-default);
67
+ border-radius: 0 0 var(--g-border-radius-md, 0.5rem) var(--g-border-radius-md, 0.5rem);
72
68
  }
73
69
 
74
70
  @media (prefers-reduced-motion: reduce) {
75
- .accordion__chevron {
76
- transition: none;
77
- }
71
+ .accordion__chevron {
72
+ transition: none;
73
+ }
78
74
 
79
- .accordion__item::details-content {
80
- transition: none;
81
- }
75
+ .accordion__item::details-content {
76
+ transition: none;
77
+ }
82
78
  }
@@ -1,11 +1,11 @@
1
- import { LitElement } from "lit";
2
- import { html } from "lit/static-html.js";
3
- import accordionStyles from "./accordion.css" with { type: "css" };
1
+ import { LitElement } from 'lit';
2
+ import { html } from 'lit/static-html.js';
3
+ import accordionStyles from './accordion.css' with { type: 'css' };
4
4
 
5
5
  export class GrantCodesAccordion extends LitElement {
6
- static styles = [accordionStyles];
6
+ static styles = [accordionStyles];
7
7
 
8
- render() {
9
- return html`<div class="accordion"><slot></slot></div>`;
10
- }
8
+ render() {
9
+ return html`<div class="accordion"><slot></slot></div>`;
10
+ }
11
11
  }
@@ -1,15 +1,15 @@
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
  .accordion {
12
- display: flex;
13
- flex-direction: column;
14
- gap: var(--g-spacing-sm);
12
+ display: flex;
13
+ flex-direction: column;
14
+ gap: var(--g-spacing-sm);
15
15
  }
@@ -1,9 +1,9 @@
1
- import { GrantCodesAccordion } from "./accordion.component.js";
2
- import { GrantCodesAccordionItem } from "./accordion-item.component.js";
1
+ import { GrantCodesAccordion } from './accordion.component.js';
2
+ import { GrantCodesAccordionItem } from './accordion-item.component.js';
3
3
 
4
- export * from "./accordion.component.js";
5
- export * from "./accordion-item.component.js";
4
+ export * from './accordion.component.js';
5
+ export * from './accordion-item.component.js';
6
6
  export default GrantCodesAccordion;
7
7
 
8
- customElements.define("grantcodes-accordion", GrantCodesAccordion);
9
- customElements.define("grantcodes-accordion-item", GrantCodesAccordionItem);
8
+ customElements.define('grantcodes-accordion', GrantCodesAccordion);
9
+ customElements.define('grantcodes-accordion-item', GrantCodesAccordionItem);
@@ -1,9 +1,9 @@
1
- import React from "react";
2
- import { createComponent } from "@lit/react";
3
- import { GrantCodesAccordion } from "./accordion.js";
1
+ import { createComponent } from '@lit/react';
2
+ import React from 'react';
3
+ import { GrantCodesAccordion } from './accordion.js';
4
4
 
5
5
  export const Accordion = createComponent({
6
- tagName: "grantcodes-accordion",
7
- elementClass: GrantCodesAccordion,
8
- react: React,
6
+ tagName: 'grantcodes-accordion',
7
+ elementClass: GrantCodesAccordion,
8
+ react: React,
9
9
  });
@@ -1,9 +1,9 @@
1
- import { html } from "lit";
2
- import "./accordion.js";
1
+ import { html } from 'lit';
2
+ import './accordion.js';
3
3
 
4
4
  const meta = {
5
- title: "Components/Accordion",
6
- component: "grantcodes-accordion",
5
+ title: 'Components/Accordion',
6
+ component: 'grantcodes-accordion',
7
7
  };
8
8
 
9
9
  export default meta;
@@ -12,7 +12,7 @@ export default meta;
12
12
  * Default accordion with multiple items.
13
13
  */
14
14
  export const Accordion = {
15
- render: () => html`
15
+ render: () => html`
16
16
  <grantcodes-accordion>
17
17
  <grantcodes-accordion-item title="What is this?">
18
18
  This is an accordion component that allows you to collapse and expand content sections.
@@ -31,7 +31,7 @@ export const Accordion = {
31
31
  * Single item accordion.
32
32
  */
33
33
  export const SingleItem = {
34
- render: () => html`
34
+ render: () => html`
35
35
  <grantcodes-accordion>
36
36
  <grantcodes-accordion-item title="Click to expand">
37
37
  This is the content that appears when you expand this accordion item.
@@ -44,7 +44,7 @@ export const SingleItem = {
44
44
  * Accordion with multiple items, first one expanded by default.
45
45
  */
46
46
  export const MultipleItems = {
47
- render: () => html`
47
+ render: () => html`
48
48
  <grantcodes-accordion>
49
49
  <grantcodes-accordion-item title="First Section" open>
50
50
  Content for the first section.
@@ -66,7 +66,7 @@ export const MultipleItems = {
66
66
  * Text content in slots is plain text — HTML-looking strings display literally.
67
67
  */
68
68
  export const EscapedPlainTextContent = {
69
- render: () => html`
69
+ render: () => html`
70
70
  <grantcodes-accordion>
71
71
  <grantcodes-accordion-item title="HTML-looking plain text">
72
72
  &lt;strong&gt;This stays text&lt;/strong&gt;
@@ -79,7 +79,7 @@ export const EscapedPlainTextContent = {
79
79
  * Slotted HTML content renders naturally — consumers compose their own markup.
80
80
  */
81
81
  export const TrustedHtmlContent = {
82
- render: () => html`
82
+ render: () => html`
83
83
  <grantcodes-accordion>
84
84
  <grantcodes-accordion-item title="Trusted rich content">
85
85
  <p>This renders <strong>trusted HTML</strong>.</p>
@@ -96,7 +96,7 @@ export const TrustedHtmlContent = {
96
96
  * Items can slot any HTML — paragraphs, lists, images, or plain text.
97
97
  */
98
98
  export const MixedContent = {
99
- render: () => html`
99
+ render: () => html`
100
100
  <grantcodes-accordion>
101
101
  <grantcodes-accordion-item title="Rich markup">
102
102
  <p>This panel uses <em>multiple</em> HTML elements:</p>
@@ -1,103 +1,103 @@
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 "./accordion.js";
5
-
6
- describe("Accordion", () => {
7
- let element;
8
-
9
- afterEach(() => {
10
- cleanup(element);
11
- });
12
-
13
- it("renders a slot for accordion items", async () => {
14
- element = await fixture("grantcodes-accordion");
15
- const slot = element.shadowRoot.querySelector("slot:not([name])");
16
- assert.ok(slot, "Default slot should exist");
17
- });
18
-
19
- it("renders accordion wrapper", async () => {
20
- element = await fixture("grantcodes-accordion");
21
- const wrapper = element.shadowRoot.querySelector(".accordion");
22
- assert.ok(wrapper, "Accordion wrapper should exist");
23
- });
24
-
25
- it("accepts slotted accordion items", async () => {
26
- element = await fixture("grantcodes-accordion");
27
- const item = document.createElement("grantcodes-accordion-item");
28
- item.setAttribute("title", "FAQ");
29
- item.textContent = "Answer text";
30
- element.appendChild(item);
31
- await element.updateComplete;
32
- await item.updateComplete;
33
-
34
- const found = element.querySelector("grantcodes-accordion-item");
35
- assert.ok(found, "Slotted accordion item should be present");
36
- assert.strictEqual(found.getAttribute("title"), "FAQ");
37
- assert.strictEqual(found.textContent, "Answer text");
38
- });
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 './accordion.js';
5
+
6
+ describe('Accordion', () => {
7
+ let element;
8
+
9
+ afterEach(() => {
10
+ cleanup(element);
11
+ });
12
+
13
+ it('renders a slot for accordion items', async () => {
14
+ element = await fixture('grantcodes-accordion');
15
+ const slot = element.shadowRoot.querySelector('slot:not([name])');
16
+ assert.ok(slot, 'Default slot should exist');
17
+ });
18
+
19
+ it('renders accordion wrapper', async () => {
20
+ element = await fixture('grantcodes-accordion');
21
+ const wrapper = element.shadowRoot.querySelector('.accordion');
22
+ assert.ok(wrapper, 'Accordion wrapper should exist');
23
+ });
24
+
25
+ it('accepts slotted accordion items', async () => {
26
+ element = await fixture('grantcodes-accordion');
27
+ const item = document.createElement('grantcodes-accordion-item');
28
+ item.setAttribute('title', 'FAQ');
29
+ item.textContent = 'Answer text';
30
+ element.appendChild(item);
31
+ await element.updateComplete;
32
+ await item.updateComplete;
33
+
34
+ const found = element.querySelector('grantcodes-accordion-item');
35
+ assert.ok(found, 'Slotted accordion item should be present');
36
+ assert.strictEqual(found.getAttribute('title'), 'FAQ');
37
+ assert.strictEqual(found.textContent, 'Answer text');
38
+ });
39
39
  });
40
40
 
41
- describe("GrantCodesAccordionItem", () => {
42
- let element;
43
-
44
- afterEach(() => {
45
- cleanup(element);
46
- });
47
-
48
- it("renders a details element with summary and slot", async () => {
49
- element = await fixture("grantcodes-accordion-item", {
50
- title: "Section",
51
- });
52
- const details = element.shadowRoot.querySelector("details");
53
- const summary = element.shadowRoot.querySelector("summary");
54
- const slot = element.shadowRoot.querySelector("slot");
55
-
56
- assert.ok(details, "Details element should exist");
57
- assert.ok(summary, "Summary should exist");
58
- assert.ok(slot, "Slot should exist");
59
- assert.strictEqual(summary.textContent.trim().replace(/\s+/g, " "), "Section");
60
- });
61
-
62
- it("renders HTML content via slot", async () => {
63
- element = await fixture("grantcodes-accordion-item", {
64
- title: "Rich",
65
- });
66
- element.innerHTML = "<strong>Trusted</strong>";
67
- await element.updateComplete;
68
-
69
- const strong = element.querySelector("strong");
70
- assert.ok(strong, "Slotted HTML should render a strong element");
71
- assert.strictEqual(strong.textContent, "Trusted");
72
- });
73
-
74
- it("renders text content as escaped plain text", async () => {
75
- element = await fixture("grantcodes-accordion-item", {
76
- title: "Plain",
77
- });
78
- element.textContent = "<strong>Plain</strong>";
79
- await element.updateComplete;
80
-
81
- const strong = element.querySelector("strong");
82
- assert.strictEqual(strong, null, "Escaped text should not create a strong element");
83
- assert.strictEqual(element.textContent, "<strong>Plain</strong>");
84
- });
85
-
86
- it("supports the open attribute", async () => {
87
- element = await fixture("grantcodes-accordion-item", {
88
- title: "Open item",
89
- open: true,
90
- });
91
- const details = element.shadowRoot.querySelector("details");
92
- assert.ok(details.hasAttribute("open"), "Details should be open");
93
- });
94
-
95
- it("renders an empty slot by default", async () => {
96
- element = await fixture("grantcodes-accordion-item", {
97
- title: "Empty",
98
- });
99
- const content = element.shadowRoot.querySelector(".accordion__content");
100
- const slot = content.querySelector("slot");
101
- assert.ok(slot, "Slot should exist in content area");
102
- });
41
+ describe('GrantCodesAccordionItem', () => {
42
+ let element;
43
+
44
+ afterEach(() => {
45
+ cleanup(element);
46
+ });
47
+
48
+ it('renders a details element with summary and slot', async () => {
49
+ element = await fixture('grantcodes-accordion-item', {
50
+ title: 'Section',
51
+ });
52
+ const details = element.shadowRoot.querySelector('details');
53
+ const summary = element.shadowRoot.querySelector('summary');
54
+ const slot = element.shadowRoot.querySelector('slot');
55
+
56
+ assert.ok(details, 'Details element should exist');
57
+ assert.ok(summary, 'Summary should exist');
58
+ assert.ok(slot, 'Slot should exist');
59
+ assert.strictEqual(summary.textContent.trim().replace(/\s+/g, ' '), 'Section');
60
+ });
61
+
62
+ it('renders HTML content via slot', async () => {
63
+ element = await fixture('grantcodes-accordion-item', {
64
+ title: 'Rich',
65
+ });
66
+ element.innerHTML = '<strong>Trusted</strong>';
67
+ await element.updateComplete;
68
+
69
+ const strong = element.querySelector('strong');
70
+ assert.ok(strong, 'Slotted HTML should render a strong element');
71
+ assert.strictEqual(strong.textContent, 'Trusted');
72
+ });
73
+
74
+ it('renders text content as escaped plain text', async () => {
75
+ element = await fixture('grantcodes-accordion-item', {
76
+ title: 'Plain',
77
+ });
78
+ element.textContent = '<strong>Plain</strong>';
79
+ await element.updateComplete;
80
+
81
+ const strong = element.querySelector('strong');
82
+ assert.strictEqual(strong, null, 'Escaped text should not create a strong element');
83
+ assert.strictEqual(element.textContent, '<strong>Plain</strong>');
84
+ });
85
+
86
+ it('supports the open attribute', async () => {
87
+ element = await fixture('grantcodes-accordion-item', {
88
+ title: 'Open item',
89
+ open: true,
90
+ });
91
+ const details = element.shadowRoot.querySelector('details');
92
+ assert.ok(details.hasAttribute('open'), 'Details should be open');
93
+ });
94
+
95
+ it('renders an empty slot by default', async () => {
96
+ element = await fixture('grantcodes-accordion-item', {
97
+ title: 'Empty',
98
+ });
99
+ const content = element.shadowRoot.querySelector('.accordion__content');
100
+ const slot = content.querySelector('slot');
101
+ assert.ok(slot, 'Slot should exist in content area');
102
+ });
103
103
  });
@@ -1,9 +1,9 @@
1
- import { GrantCodesAccordion } from "./accordion.component.js";
2
- import { GrantCodesAccordionItem } from "./accordion-item.component.js";
1
+ import { GrantCodesAccordion } from './accordion.component.js';
2
+ import { GrantCodesAccordionItem } from './accordion-item.component.js';
3
3
 
4
- export * from "./accordion.component.js";
5
- export * from "./accordion-item.component.js";
4
+ export * from './accordion.component.js';
5
+ export * from './accordion-item.component.js';
6
6
  export default GrantCodesAccordion;
7
7
 
8
- customElements.define("grantcodes-accordion", GrantCodesAccordion);
9
- customElements.define("grantcodes-accordion-item", GrantCodesAccordionItem);
8
+ customElements.define('grantcodes-accordion', GrantCodesAccordion);
9
+ customElements.define('grantcodes-accordion-item', GrantCodesAccordionItem);