@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.
- package/CHANGELOG.md +67 -0
- package/custom-elements.json +476 -346
- package/package.json +23 -23
- package/src/components/accordion/accordion-item.component.js +17 -19
- package/src/components/accordion/accordion-item.css +40 -44
- package/src/components/accordion/accordion.component.js +7 -7
- package/src/components/accordion/accordion.css +5 -5
- package/src/components/accordion/accordion.js +6 -6
- package/src/components/accordion/accordion.react.js +6 -6
- package/src/components/accordion/accordion.stories.js +10 -10
- package/src/components/accordion/accordion.test.js +100 -100
- package/src/components/accordion/index.js +6 -6
- package/src/components/app-bar/app-bar.component.js +86 -92
- package/src/components/app-bar/app-bar.css +187 -203
- package/src/components/app-bar/app-bar.js +3 -3
- package/src/components/app-bar/app-bar.react.js +9 -9
- package/src/components/app-bar/app-bar.stories.js +20 -20
- package/src/components/app-bar/app-bar.test.js +190 -237
- package/src/components/app-bar/index.js +1 -1
- package/src/components/app-bar/nav-link.component.js +7 -9
- package/src/components/app-bar/nav-link.css +23 -28
- package/src/components/app-bar/nav-link.js +3 -3
- package/src/components/app-bar/nav-link.react.js +6 -6
- package/src/components/avatar/avatar.component.js +79 -68
- package/src/components/avatar/avatar.css +18 -18
- package/src/components/avatar/avatar.js +3 -3
- package/src/components/avatar/avatar.react.js +6 -6
- package/src/components/avatar/avatar.stories.js +24 -23
- package/src/components/avatar/avatar.test.js +128 -84
- package/src/components/avatar/index.js +1 -1
- package/src/components/badge/badge.component.js +23 -23
- package/src/components/badge/badge.css +39 -52
- package/src/components/badge/badge.js +3 -3
- package/src/components/badge/badge.react.js +6 -6
- package/src/components/badge/badge.stories.js +23 -23
- package/src/components/badge/badge.test.js +53 -68
- package/src/components/badge/index.js +1 -1
- package/src/components/breadcrumb/breadcrumb.component.js +95 -96
- package/src/components/breadcrumb/breadcrumb.css +42 -44
- package/src/components/breadcrumb/breadcrumb.js +6 -9
- package/src/components/breadcrumb/breadcrumb.react.js +9 -12
- package/src/components/breadcrumb/breadcrumb.stories.js +5 -5
- package/src/components/breadcrumb/breadcrumb.test.js +139 -151
- package/src/components/breadcrumb/index.js +1 -1
- package/src/components/button/button.component.js +101 -103
- package/src/components/button/button.css +90 -94
- package/src/components/button/button.js +3 -3
- package/src/components/button/button.react.js +6 -6
- package/src/components/button/button.stories.js +25 -25
- package/src/components/button/button.test.js +324 -344
- package/src/components/button/index.js +1 -1
- package/src/components/button-group/button-group.component.js +18 -18
- package/src/components/button-group/button-group.css +16 -16
- package/src/components/button-group/button-group.js +3 -3
- package/src/components/button-group/button-group.react.js +6 -6
- package/src/components/button-group/button-group.stories.js +23 -23
- package/src/components/button-group/button-group.test.js +54 -54
- package/src/components/button-group/index.js +1 -1
- package/src/components/card/card.component.js +31 -33
- package/src/components/card/card.css +85 -85
- package/src/components/card/card.js +4 -4
- package/src/components/card/card.react.js +6 -6
- package/src/components/card/card.stories.js +27 -26
- package/src/components/card/card.test.js +56 -56
- package/src/components/card/index.js +1 -1
- package/src/components/code-preview/code-preview.component.js +47 -48
- package/src/components/code-preview/code-preview.css +11 -11
- package/src/components/code-preview/code-preview.js +3 -3
- package/src/components/code-preview/code-preview.react.js +6 -6
- package/src/components/code-preview/code-preview.stories.js +29 -29
- package/src/components/code-preview/code-preview.test.js +112 -135
- package/src/components/code-preview/index.js +1 -1
- package/src/components/container/container.component.js +27 -27
- package/src/components/container/container.css +22 -22
- package/src/components/container/container.js +3 -3
- package/src/components/container/container.react.js +6 -6
- package/src/components/container/container.stories.js +44 -44
- package/src/components/container/container.test.js +54 -66
- package/src/components/container/index.js +1 -1
- package/src/components/countdown/countdown.component.js +160 -162
- package/src/components/countdown/countdown.css +50 -34
- package/src/components/countdown/countdown.js +3 -3
- package/src/components/countdown/countdown.react.js +6 -6
- package/src/components/countdown/countdown.stories.js +34 -34
- package/src/components/countdown/index.js +1 -1
- package/src/components/cta/cta.component.js +77 -81
- package/src/components/cta/cta.css +24 -24
- package/src/components/cta/cta.js +3 -3
- package/src/components/cta/cta.react.js +6 -6
- package/src/components/cta/cta.stories.js +32 -32
- package/src/components/cta/index.js +1 -1
- package/src/components/dialog/dialog.component.js +95 -58
- package/src/components/dialog/dialog.css +45 -50
- package/src/components/dialog/dialog.js +3 -3
- package/src/components/dialog/dialog.react.js +6 -6
- package/src/components/dialog/dialog.stories.js +38 -29
- package/src/components/dialog/dialog.test.js +188 -102
- package/src/components/dialog/index.js +1 -1
- package/src/components/dropdown/dropdown.component.js +220 -201
- package/src/components/dropdown/dropdown.css +60 -84
- package/src/components/dropdown/dropdown.js +6 -9
- package/src/components/dropdown/dropdown.react.js +15 -15
- package/src/components/dropdown/dropdown.stories.js +10 -10
- package/src/components/dropdown/dropdown.test.js +211 -157
- package/src/components/dropdown/index.js +1 -1
- package/src/components/dropzone/dropzone.component.js +126 -129
- package/src/components/dropzone/dropzone.css +35 -37
- package/src/components/dropzone/dropzone.js +3 -3
- package/src/components/dropzone/dropzone.react.js +6 -6
- package/src/components/dropzone/dropzone.stories.js +28 -28
- package/src/components/dropzone/dropzone.test.js +91 -99
- package/src/components/dropzone/index.js +1 -1
- package/src/components/feature-list/feature-list.component.js +78 -86
- package/src/components/feature-list/feature-list.css +37 -37
- package/src/components/feature-list/feature-list.js +3 -3
- package/src/components/feature-list/feature-list.react.js +6 -6
- package/src/components/feature-list/feature-list.stories.js +86 -90
- package/src/components/feature-list/index.js +1 -1
- package/src/components/footer/footer-column.component.js +7 -7
- package/src/components/footer/footer-column.css +22 -22
- package/src/components/footer/footer.component.js +19 -19
- package/src/components/footer/footer.css +38 -38
- package/src/components/footer/footer.js +8 -8
- package/src/components/footer/footer.react.js +9 -9
- package/src/components/footer/footer.stories.js +9 -9
- package/src/components/footer/footer.test.js +101 -111
- package/src/components/footer/index.js +2 -2
- package/src/components/form-field/form-field.component.js +167 -125
- package/src/components/form-field/form-field.css +24 -24
- package/src/components/form-field/form-field.js +3 -3
- package/src/components/form-field/form-field.react.js +6 -6
- package/src/components/form-field/form-field.stories.js +53 -44
- package/src/components/form-field/form-field.test.js +280 -134
- package/src/components/form-field/index.js +1 -1
- package/src/components/gallery/gallery-image.component.js +30 -30
- package/src/components/gallery/gallery-image.js +3 -3
- package/src/components/gallery/gallery-image.react.js +6 -6
- package/src/components/gallery/gallery.component.js +24 -17
- package/src/components/gallery/gallery.css +79 -72
- package/src/components/gallery/gallery.js +3 -3
- package/src/components/gallery/gallery.react.js +6 -6
- package/src/components/gallery/gallery.stories.js +69 -68
- package/src/components/gallery/gallery.test.js +95 -88
- package/src/components/gallery/index.js +2 -2
- package/src/components/hero/hero.component.js +53 -57
- package/src/components/hero/hero.css +27 -27
- package/src/components/hero/hero.js +3 -3
- package/src/components/hero/hero.react.js +6 -6
- package/src/components/hero/hero.stories.js +39 -39
- package/src/components/hero/index.js +1 -1
- package/src/components/icon/icon.component.js +10 -10
- package/src/components/icon/icon.css +13 -13
- package/src/components/icon/icon.js +4 -4
- package/src/components/icon/icon.react.js +6 -6
- package/src/components/icon/icon.stories.js +8 -9
- package/src/components/icon/icon.test.js +54 -55
- package/src/components/icon/index.js +1 -1
- package/src/components/loading/index.js +1 -1
- package/src/components/loading/loading.component.js +41 -14
- package/src/components/loading/loading.css +47 -30
- package/src/components/loading/loading.js +4 -4
- package/src/components/loading/loading.react.js +6 -6
- package/src/components/loading/loading.stories.js +19 -18
- package/src/components/loading/loading.test.js +77 -54
- package/src/components/logo-cloud/index.js +1 -1
- package/src/components/logo-cloud/logo-cloud.component.js +39 -43
- package/src/components/logo-cloud/logo-cloud.css +31 -31
- package/src/components/logo-cloud/logo-cloud.js +3 -3
- package/src/components/logo-cloud/logo-cloud.react.js +6 -6
- package/src/components/logo-cloud/logo-cloud.stories.js +80 -80
- package/src/components/map/index.js +1 -1
- package/src/components/map/map.component.js +103 -107
- package/src/components/map/map.css +22 -22
- package/src/components/map/map.js +3 -3
- package/src/components/map/map.react.js +6 -6
- package/src/components/map/map.stories.js +38 -38
- package/src/components/media-text/index.js +1 -1
- package/src/components/media-text/media-text.component.js +76 -70
- package/src/components/media-text/media-text.css +32 -32
- package/src/components/media-text/media-text.js +3 -3
- package/src/components/media-text/media-text.react.js +6 -6
- package/src/components/media-text/media-text.stories.js +45 -45
- package/src/components/media-text/media-text.test.js +72 -0
- package/src/components/newsletter/index.js +1 -1
- package/src/components/newsletter/newsletter.component.js +56 -64
- package/src/components/newsletter/newsletter.css +48 -48
- package/src/components/newsletter/newsletter.js +3 -3
- package/src/components/newsletter/newsletter.react.js +6 -6
- package/src/components/newsletter/newsletter.stories.js +35 -35
- package/src/components/notice/index.js +1 -1
- package/src/components/notice/notice.component.js +66 -55
- package/src/components/notice/notice.css +37 -38
- package/src/components/notice/notice.js +3 -3
- package/src/components/notice/notice.react.js +6 -6
- package/src/components/notice/notice.stories.js +54 -53
- package/src/components/notice/notice.test.js +210 -156
- package/src/components/pagination/index.js +1 -1
- package/src/components/pagination/pagination.component.js +44 -44
- package/src/components/pagination/pagination.css +6 -6
- package/src/components/pagination/pagination.js +4 -4
- package/src/components/pagination/pagination.react.js +6 -6
- package/src/components/pagination/pagination.stories.js +20 -18
- package/src/components/pagination/pagination.test.js +95 -102
- package/src/components/person/index.js +1 -1
- package/src/components/person/person.component.js +29 -29
- package/src/components/person/person.css +17 -17
- package/src/components/person/person.js +4 -4
- package/src/components/person/person.react.js +6 -6
- package/src/components/person/person.stories.js +34 -33
- package/src/components/person/person.test.js +55 -68
- package/src/components/pricing/index.js +1 -1
- package/src/components/pricing/pricing.component.js +58 -70
- package/src/components/pricing/pricing.css +65 -65
- package/src/components/pricing/pricing.js +3 -3
- package/src/components/pricing/pricing.react.js +6 -6
- package/src/components/pricing/pricing.stories.js +96 -96
- package/src/components/sidebar/index.js +1 -1
- package/src/components/sidebar/sidebar.component.js +157 -130
- package/src/components/sidebar/sidebar.css +118 -115
- package/src/components/sidebar/sidebar.js +4 -4
- package/src/components/sidebar/sidebar.react.js +10 -10
- package/src/components/sidebar/sidebar.stories.js +10 -10
- package/src/components/sidebar/sidebar.test.js +250 -230
- package/src/components/stats/index.js +1 -1
- package/src/components/stats/stats.component.js +42 -50
- package/src/components/stats/stats.css +29 -29
- package/src/components/stats/stats.js +3 -3
- package/src/components/stats/stats.react.js +6 -6
- package/src/components/stats/stats.stories.js +40 -40
- package/src/components/tabs/index.js +2 -2
- package/src/components/tabs/internal/tabs-button.component.js +16 -27
- package/src/components/tabs/internal/tabs-button.js +3 -3
- package/src/components/tabs/internal/tabs-button.react.js +6 -6
- package/src/components/tabs/internal/tabs-item.component.js +30 -30
- package/src/components/tabs/tab.component.js +9 -11
- package/src/components/tabs/tab.js +3 -3
- package/src/components/tabs/tab.react.js +6 -6
- package/src/components/tabs/tabs.component.js +107 -109
- package/src/components/tabs/tabs.css +50 -59
- package/src/components/tabs/tabs.js +4 -4
- package/src/components/tabs/tabs.react.js +6 -6
- package/src/components/tabs/tabs.stories.js +23 -22
- package/src/components/tabs/tabs.test.js +201 -147
- package/src/components/testimonials/index.js +1 -1
- package/src/components/testimonials/testimonials.component.js +47 -51
- package/src/components/testimonials/testimonials.css +31 -31
- package/src/components/testimonials/testimonials.js +3 -3
- package/src/components/testimonials/testimonials.react.js +6 -6
- package/src/components/testimonials/testimonials.stories.js +49 -51
- package/src/components/toast/index.js +1 -1
- package/src/components/toast/toast.component.js +217 -148
- package/src/components/toast/toast.css +101 -99
- package/src/components/toast/toast.js +6 -9
- package/src/components/toast/toast.react.js +12 -12
- package/src/components/toast/toast.stories.js +75 -49
- package/src/components/toast/toast.test.js +260 -221
- package/src/components/tooltip/index.js +1 -1
- package/src/components/tooltip/tooltip.component.js +56 -49
- package/src/components/tooltip/tooltip.css +61 -50
- package/src/components/tooltip/tooltip.js +4 -4
- package/src/components/tooltip/tooltip.react.js +6 -6
- package/src/components/tooltip/tooltip.stories.js +24 -23
- package/src/components/tooltip/tooltip.test.js +143 -155
- package/src/constructor.test.js +31 -0
- package/src/css/base.css +1 -0
- package/src/css/colors.stories.js +120 -122
- package/src/css/elements/a.css +28 -28
- package/src/css/elements/forms/button.css +1 -1
- package/src/css/elements/forms/input.css +80 -80
- package/src/css/elements/forms/label.css +3 -3
- package/src/css/elements/media/image.css +2 -2
- package/src/css/elements.stories.js +48 -49
- package/src/css/helpers.css +8 -8
- package/src/css/layers.stories.js +5 -5
- package/src/css/reset.css +102 -102
- package/src/css/themes/todomap.css +1 -1
- package/src/css/tokens.stories.js +50 -53
- package/src/css/typography.css +30 -32
- package/src/css/typography.stories.js +92 -92
- package/src/css/util/focus-ring.css +12 -20
- package/src/css/view-transitions.css +16 -0
- package/src/exports.test.js +89 -105
- package/src/icons.js +1 -1
- package/src/lib/generate-id.js +1 -1
- package/src/lib/slot-presence-controller.js +48 -0
- package/src/lib/styles/all.css +38 -37
- package/src/lib/styles/focus-ring.css +12 -20
- package/src/lib/view-transition.js +42 -0
- package/src/lib/view-transition.test.js +105 -0
- package/src/main.js +29 -29
- package/src/pages/agency.stories.js +59 -59
- package/src/pages/blog-post.stories.js +48 -48
- package/src/pages/saas-landing.stories.js +180 -180
- package/src/react.js +44 -44
- package/src/react.test.js +42 -51
- package/src/test-utils/assert-helpers.js +39 -58
- package/src/test-utils/events.js +32 -34
- package/src/test-utils/fixture.js +31 -31
- package/src/test-utils/index.js +3 -3
- package/src/types.d.ts +3 -3
|
@@ -1,79 +1,90 @@
|
|
|
1
1
|
*,
|
|
2
2
|
*::before,
|
|
3
3
|
*::after {
|
|
4
|
-
|
|
4
|
+
box-sizing: border-box;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
:host,
|
|
8
8
|
.tooltip,
|
|
9
9
|
.tooltip__slot {
|
|
10
|
-
|
|
10
|
+
width: fit-content;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
.tooltip {
|
|
14
|
-
|
|
14
|
+
position: relative;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
.tooltip__slot {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
/* Modern CSS Anchor Positioning API */
|
|
49
|
+
/* This positions the tooltip relative to its anchor (the slot) */
|
|
50
|
+
position: absolute;
|
|
48
51
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
69
|
-
|
|
71
|
+
display: block;
|
|
72
|
+
opacity: 1;
|
|
70
73
|
}
|
|
71
74
|
|
|
72
|
-
/*
|
|
75
|
+
/* Entry state for the fade, only while motion is welcome. */
|
|
73
76
|
@media (prefers-reduced-motion: no-preference) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
1
|
+
import { GrantCodesTooltip } from './tooltip.component.js';
|
|
2
2
|
|
|
3
|
-
export * from
|
|
3
|
+
export * from './tooltip.component.js';
|
|
4
4
|
export default GrantCodesTooltip;
|
|
5
5
|
|
|
6
|
-
if (!customElements.get(
|
|
7
|
-
|
|
6
|
+
if (!customElements.get('grantcodes-tooltip')) {
|
|
7
|
+
customElements.define('grantcodes-tooltip', GrantCodesTooltip);
|
|
8
8
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import { GrantCodesTooltip } from
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
tagName: 'grantcodes-tooltip',
|
|
7
|
+
elementClass: GrantCodesTooltip,
|
|
8
|
+
react: React,
|
|
9
9
|
});
|
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
args: {
|
|
31
|
+
label: '',
|
|
32
|
+
description: 'This is a tooltip description',
|
|
33
|
+
},
|
|
33
34
|
};
|
|
@@ -1,156 +1,144 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
describe(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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