@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,79 +1,90 @@
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
8
  .tooltip,
9
9
  .tooltip__slot {
10
- width: fit-content;
10
+ width: fit-content;
11
11
  }
12
12
 
13
13
  .tooltip {
14
- position: relative;
14
+ position: relative;
15
15
  }
16
16
 
17
17
  .tooltip__slot {
18
- padding: var(--g-spacing-sm);
19
- margin: calc(-1 * var(--g-spacing-sm));
20
- /* Anchor name will be set via JavaScript to include unique ID */
18
+ padding: var(--g-spacing-sm);
19
+ margin: calc(-1 * var(--g-spacing-sm));
20
+ /* Anchor name will be set via JavaScript to include unique ID */
21
21
  }
22
22
 
23
23
  .tooltip__content {
24
- display: none;
25
- width: fit-content;
26
- margin: 0;
27
- max-width: 100%;
28
- min-width: 6rem;
29
- z-index: 100;
30
- border-radius: var(--g-border-radius-md);
31
- padding: 0.6em 1em;
32
- font-size: var(--g-typography-font-size-xs);
33
- line-height: 1;
34
- color: var(--g-color-primary-900);
35
- background-color: var(--g-color-primary-100);
36
- box-shadow:
37
- 0 1px 3px rgba(0, 0, 0, 0.12),
38
- 0 1px 2px rgba(0, 0, 0, 0.24);
39
- user-select: none;
40
- text-align: center;
41
- opacity: 0;
42
- transition: opacity 0.2s;
43
- transition-behavior: allow-discrete;
24
+ display: none;
25
+ width: fit-content;
26
+ margin: 0;
27
+ max-width: 100%;
28
+ min-width: 6rem;
29
+ z-index: 100;
30
+ border-radius: var(--g-border-radius-md);
31
+ padding: 0.6em 1em;
32
+ font-size: var(--g-typography-font-size-xs);
33
+ line-height: 1;
34
+ color: var(--g-color-primary-900);
35
+ background-color: var(--g-color-primary-100);
36
+ box-shadow:
37
+ 0 1px 3px rgba(0, 0, 0, 0.12),
38
+ 0 1px 2px rgba(0, 0, 0, 0.24);
39
+ user-select: none;
40
+ text-align: center;
41
+ opacity: 0;
42
+ /* allow-discrete keeps the box rendered while it fades out. */
43
+ transition:
44
+ opacity 0.2s ease,
45
+ display 0.2s;
46
+ transition-behavior: allow-discrete;
44
47
 
45
- /* Modern CSS Anchor Positioning API */
46
- /* This positions the tooltip relative to its anchor (the slot) */
47
- position: absolute;
48
+ /* Modern CSS Anchor Positioning API */
49
+ /* This positions the tooltip relative to its anchor (the slot) */
50
+ position: absolute;
48
51
 
49
- /* Try anchor positioning first (modern browsers) */
50
- position-anchor: var(--tooltip-anchor, none);
51
- position-area: block-end;
52
- margin-block-start: 0.5rem;
52
+ /* Try anchor positioning first (modern browsers) */
53
+ position-anchor: var(--tooltip-anchor, none);
54
+ position-area: block-end;
55
+ margin-block-start: 0.5rem;
53
56
 
54
- /* Fallback for browsers without anchor positioning support */
55
- @supports not (position-area: block-end) {
56
- /* Traditional positioning as fallback */
57
- position: absolute;
58
- top: 100%;
59
- left: 50%;
60
- transform: translateX(-50%);
61
- margin-top: 0.5rem;
62
- }
57
+ /* Fallback for browsers without anchor positioning support */
58
+ @supports not (position-area: block-end) {
59
+ /* Traditional positioning as fallback */
60
+ position: absolute;
61
+ top: 100%;
62
+ left: 50%;
63
+ transform: translateX(-50%);
64
+ margin-top: 0.5rem;
65
+ }
63
66
  }
64
67
 
65
68
  .tooltip__slot:hover + .tooltip__content,
66
69
  .tooltip__slot:focus + .tooltip__content,
67
70
  .tooltip__slot:focus-within + .tooltip__content {
68
- display: block;
69
- opacity: 1;
71
+ display: block;
72
+ opacity: 1;
70
73
  }
71
74
 
72
- /* Optional: Position tooltip above when near bottom of viewport */
75
+ /* Entry state for the fade, only while motion is welcome. */
73
76
  @media (prefers-reduced-motion: no-preference) {
74
- .tooltip__content {
75
- @starting-style {
76
- opacity: 0;
77
- }
78
- }
77
+ @starting-style {
78
+ .tooltip__slot:hover + .tooltip__content,
79
+ .tooltip__slot:focus + .tooltip__content,
80
+ .tooltip__slot:focus-within + .tooltip__content {
81
+ opacity: 0;
82
+ }
83
+ }
84
+ }
85
+
86
+ @media (prefers-reduced-motion: reduce) {
87
+ .tooltip__content {
88
+ transition: none;
89
+ }
79
90
  }
@@ -1,8 +1,8 @@
1
- import { GrantCodesTooltip } from "./tooltip.component.js";
1
+ import { GrantCodesTooltip } from './tooltip.component.js';
2
2
 
3
- export * from "./tooltip.component.js";
3
+ export * from './tooltip.component.js';
4
4
  export default GrantCodesTooltip;
5
5
 
6
- if (!customElements.get("grantcodes-tooltip")) {
7
- customElements.define("grantcodes-tooltip", GrantCodesTooltip);
6
+ if (!customElements.get('grantcodes-tooltip')) {
7
+ customElements.define('grantcodes-tooltip', GrantCodesTooltip);
8
8
  }
@@ -1,9 +1,9 @@
1
- import React from "react";
2
- import { createComponent } from "@lit/react";
3
- import { GrantCodesTooltip } from "./tooltip.js";
1
+ import { createComponent } from '@lit/react';
2
+ import React from 'react';
3
+ import { GrantCodesTooltip } from './tooltip.js';
4
4
 
5
5
  export const Tooltip = createComponent({
6
- tagName: "grantcodes-tooltip",
7
- elementClass: GrantCodesTooltip,
8
- react: React,
6
+ tagName: 'grantcodes-tooltip',
7
+ elementClass: GrantCodesTooltip,
8
+ react: React,
9
9
  });
@@ -1,24 +1,25 @@
1
- import { html } from "lit/static-html.js";
2
- import { getStorybookHelpers } from "@wc-toolkit/storybook-helpers";
3
- const { events, args, argTypes, template } =
4
- getStorybookHelpers("grantcodes-tooltip");
5
- import "./tooltip.js";
1
+ import { getStorybookHelpers } from '@wc-toolkit/storybook-helpers';
2
+ import { html } from 'lit/static-html.js';
3
+
4
+ const { events, args, argTypes, template } = getStorybookHelpers('grantcodes-tooltip');
5
+
6
+ import './tooltip.js';
6
7
 
7
8
  const meta = {
8
- title: "Components/Tooltip",
9
- component: "grantcodes-tooltip",
10
- args: {
11
- ...args,
12
- label: "This is a tooltip label",
13
- description: "",
14
- },
15
- argTypes,
16
- render: (args) => template(args, html`<span>This has a tooltip</span>`),
17
- parameters: {
18
- actions: {
19
- handles: events,
20
- },
21
- },
9
+ title: 'Components/Tooltip',
10
+ component: 'grantcodes-tooltip',
11
+ args: {
12
+ ...args,
13
+ label: 'This is a tooltip label',
14
+ description: '',
15
+ },
16
+ argTypes,
17
+ render: (args) => template(args, html`<span>This has a tooltip</span>`),
18
+ parameters: {
19
+ actions: {
20
+ handles: events,
21
+ },
22
+ },
22
23
  };
23
24
 
24
25
  export default meta;
@@ -26,8 +27,8 @@ export default meta;
26
27
  export const Tooltip = {};
27
28
 
28
29
  export const Description = {
29
- args: {
30
- label: "",
31
- description: "This is a tooltip description",
32
- },
30
+ args: {
31
+ label: '',
32
+ description: 'This is a tooltip description',
33
+ },
33
34
  };
@@ -1,156 +1,144 @@
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 "./tooltip.js";
5
-
6
- describe("Tooltip 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-tooltip");
15
- assert.ok(element, "Element should be created");
16
- assert.ok(element.shadowRoot, "Element should have shadow root");
17
- });
18
-
19
- it("should have label property", async () => {
20
- element = await fixture("grantcodes-tooltip", {
21
- label: "Tooltip label",
22
- });
23
-
24
- assert.strictEqual(
25
- element.label,
26
- "Tooltip label",
27
- "Label property should be set",
28
- );
29
- });
30
-
31
- it("should have description property", async () => {
32
- element = await fixture("grantcodes-tooltip", {
33
- description: "Tooltip description",
34
- });
35
-
36
- assert.strictEqual(
37
- element.description,
38
- "Tooltip description",
39
- "Description property should be set",
40
- );
41
- });
42
-
43
- it("should render tooltip wrapper", async () => {
44
- element = await fixture("grantcodes-tooltip", {
45
- label: "Test",
46
- });
47
-
48
- const tooltip = element.shadowRoot.querySelector(".tooltip");
49
- assert.ok(tooltip, "Tooltip wrapper should exist");
50
- });
51
-
52
- it("should render tooltip content", async () => {
53
- element = await fixture("grantcodes-tooltip", {
54
- label: "Test label",
55
- });
56
-
57
- const content = element.shadowRoot.querySelector(".tooltip__content");
58
- assert.ok(content, "Tooltip content should exist");
59
- assert.strictEqual(
60
- content.textContent.trim(),
61
- "Test label",
62
- "Content should match label",
63
- );
64
- });
65
-
66
- it("should have role=tooltip on content", async () => {
67
- element = await fixture("grantcodes-tooltip", {
68
- label: "Test",
69
- });
70
-
71
- const content = element.shadowRoot.querySelector(".tooltip__content");
72
- assert.strictEqual(
73
- content.getAttribute("role"),
74
- "tooltip",
75
- "Should have tooltip role",
76
- );
77
- });
78
-
79
- it("should generate unique ID", async () => {
80
- const element1 = await fixture("grantcodes-tooltip", { label: "Test 1" });
81
- const element2 = await fixture("grantcodes-tooltip", { label: "Test 2" });
82
-
83
- assert.notStrictEqual(element1.id, element2.id, "IDs should be unique");
84
-
85
- cleanup(element1);
86
- cleanup(element2);
87
- });
88
-
89
- it("should have slot for trigger element", async () => {
90
- element = await fixture("grantcodes-tooltip", {
91
- label: "Tooltip",
92
- });
93
-
94
- const slot = element.shadowRoot.querySelector(".tooltip__slot slot");
95
- assert.ok(slot, "Slot should exist for trigger element");
96
- });
97
-
98
- it.skip("should throw error if both label and description are provided", async () => {
99
- // Skipped: Error is thrown during render which causes unhandled rejection in test environment
100
- // The error handling works correctly in production, but is difficult to test properly
101
- await assert.rejects(
102
- async () => {
103
- element = await fixture("grantcodes-tooltip", {
104
- label: "Label",
105
- description: "Description",
106
- });
107
- await element.updateComplete;
108
- },
109
- {
110
- message: "You cannot provide both a label and a description",
111
- },
112
- "Should throw error when both label and description are provided",
113
- );
114
- });
115
-
116
- it("should display description when provided", async () => {
117
- element = await fixture("grantcodes-tooltip", {
118
- description: "This is a description",
119
- });
120
-
121
- const content = element.shadowRoot.querySelector(".tooltip__content");
122
- assert.strictEqual(
123
- content.textContent.trim(),
124
- "This is a description",
125
- "Content should match description",
126
- );
127
- });
128
-
129
- it("should set aria-labelledby when label is provided", async () => {
130
- element = await fixture("grantcodes-tooltip", {
131
- label: "Button label",
132
- });
133
-
134
- const button = document.createElement("button");
135
- element.appendChild(button);
136
-
137
- await element.updateComplete;
138
-
139
- // The aria-labelledby is set in firstUpdated
140
- // In a test environment, this might need special handling
141
- });
142
-
143
- it("should set aria-describedby when description is provided", async () => {
144
- element = await fixture("grantcodes-tooltip", {
145
- description: "Button description",
146
- });
147
-
148
- const button = document.createElement("button");
149
- element.appendChild(button);
150
-
151
- await element.updateComplete;
152
-
153
- // The aria-describedby is set in firstUpdated
154
- // In a test environment, this might need special handling
155
- });
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 './tooltip.js';
5
+
6
+ describe('Tooltip 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-tooltip');
15
+ assert.ok(element, 'Element should be created');
16
+ assert.ok(element.shadowRoot, 'Element should have shadow root');
17
+ });
18
+
19
+ it('should have label property', async () => {
20
+ element = await fixture('grantcodes-tooltip', {
21
+ label: 'Tooltip label',
22
+ });
23
+
24
+ assert.strictEqual(element.label, 'Tooltip label', 'Label property should be set');
25
+ });
26
+
27
+ it('should have description property', async () => {
28
+ element = await fixture('grantcodes-tooltip', {
29
+ description: 'Tooltip description',
30
+ });
31
+
32
+ assert.strictEqual(
33
+ element.description,
34
+ 'Tooltip description',
35
+ 'Description property should be set',
36
+ );
37
+ });
38
+
39
+ it('should render tooltip wrapper', async () => {
40
+ element = await fixture('grantcodes-tooltip', {
41
+ label: 'Test',
42
+ });
43
+
44
+ const tooltip = element.shadowRoot.querySelector('.tooltip');
45
+ assert.ok(tooltip, 'Tooltip wrapper should exist');
46
+ });
47
+
48
+ it('should render tooltip content', async () => {
49
+ element = await fixture('grantcodes-tooltip', {
50
+ label: 'Test label',
51
+ });
52
+
53
+ const content = element.shadowRoot.querySelector('.tooltip__content');
54
+ assert.ok(content, 'Tooltip content should exist');
55
+ assert.strictEqual(content.textContent.trim(), 'Test label', 'Content should match label');
56
+ });
57
+
58
+ it('should have role=tooltip on content', async () => {
59
+ element = await fixture('grantcodes-tooltip', {
60
+ label: 'Test',
61
+ });
62
+
63
+ const content = element.shadowRoot.querySelector('.tooltip__content');
64
+ assert.strictEqual(content.getAttribute('role'), 'tooltip', 'Should have tooltip role');
65
+ });
66
+
67
+ it('should generate unique ID', async () => {
68
+ const element1 = await fixture('grantcodes-tooltip', { label: 'Test 1' });
69
+ const element2 = await fixture('grantcodes-tooltip', { label: 'Test 2' });
70
+
71
+ assert.notStrictEqual(element1.id, element2.id, 'IDs should be unique');
72
+
73
+ cleanup(element1);
74
+ cleanup(element2);
75
+ });
76
+
77
+ it('should have slot for trigger element', async () => {
78
+ element = await fixture('grantcodes-tooltip', {
79
+ label: 'Tooltip',
80
+ });
81
+
82
+ const slot = element.shadowRoot.querySelector('.tooltip__slot slot');
83
+ assert.ok(slot, 'Slot should exist for trigger element');
84
+ });
85
+
86
+ it.skip('should throw error if both label and description are provided', async () => {
87
+ // Skipped: Error is thrown during render which causes unhandled rejection in test environment
88
+ // The error handling works correctly in production, but is difficult to test properly
89
+ await assert.rejects(
90
+ async () => {
91
+ element = await fixture('grantcodes-tooltip', {
92
+ label: 'Label',
93
+ description: 'Description',
94
+ });
95
+ await element.updateComplete;
96
+ },
97
+ {
98
+ message: 'You cannot provide both a label and a description',
99
+ },
100
+ 'Should throw error when both label and description are provided',
101
+ );
102
+ });
103
+
104
+ it('should display description when provided', async () => {
105
+ element = await fixture('grantcodes-tooltip', {
106
+ description: 'This is a description',
107
+ });
108
+
109
+ const content = element.shadowRoot.querySelector('.tooltip__content');
110
+ assert.strictEqual(
111
+ content.textContent.trim(),
112
+ 'This is a description',
113
+ 'Content should match description',
114
+ );
115
+ });
116
+
117
+ it('should set aria-labelledby when label is provided', async () => {
118
+ element = await fixture('grantcodes-tooltip', {
119
+ label: 'Button label',
120
+ });
121
+
122
+ const button = document.createElement('button');
123
+ element.appendChild(button);
124
+
125
+ await element.updateComplete;
126
+
127
+ // The aria-labelledby is set in firstUpdated
128
+ // In a test environment, this might need special handling
129
+ });
130
+
131
+ it('should set aria-describedby when description is provided', async () => {
132
+ element = await fixture('grantcodes-tooltip', {
133
+ description: 'Button description',
134
+ });
135
+
136
+ const button = document.createElement('button');
137
+ element.appendChild(button);
138
+
139
+ await element.updateComplete;
140
+
141
+ // The aria-describedby is set in firstUpdated
142
+ // In a test environment, this might need special handling
143
+ });
156
144
  });
@@ -0,0 +1,31 @@
1
+ import { strict as assert } from 'node:assert';
2
+ import { describe, it } from 'node:test';
3
+ // Side-effect import: sets up the happy-dom window and document globals.
4
+ import './test-utils/index.js';
5
+ import './components/dropdown/dropdown.js';
6
+ import './components/form-field/form-field.js';
7
+ import './components/tabs/tabs.js';
8
+ import './components/tooltip/tooltip.js';
9
+
10
+ // A custom element that gains an attribute in its constructor is never upgraded by
11
+ // document.createElement in a real browser: the element stays inert.
12
+ const TAGS = [
13
+ 'grantcodes-dropdown',
14
+ 'grantcodes-form-field',
15
+ 'grantcodes-tabs',
16
+ 'grantcodes-tooltip',
17
+ ];
18
+
19
+ describe('component construction', () => {
20
+ for (const tag of TAGS) {
21
+ it(`should construct ${tag} without touching its attributes`, () => {
22
+ const element = document.createElement(tag);
23
+
24
+ assert.strictEqual(
25
+ element.getAttribute('id'),
26
+ null,
27
+ `${tag} set an attribute during construction, so browsers will not upgrade it`,
28
+ );
29
+ });
30
+ }
31
+ });
package/src/css/base.css CHANGED
@@ -5,3 +5,4 @@
5
5
  @import "./elements.css" layer(base);
6
6
  @import "./util/index.css" layer(utilities);
7
7
  @import "./helpers.css" layer(utilities);
8
+ @import "./view-transitions.css";