@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.
- package/CHANGELOG.md +60 -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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Custom assertions for web components
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { strict as assert } from
|
|
5
|
+
import { strict as assert } from 'node:assert';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Asserts that an element has a specific attribute
|
|
@@ -11,17 +11,17 @@ import { strict as assert } from "node:assert";
|
|
|
11
11
|
* @param {string} expectedValue - The expected attribute value (optional)
|
|
12
12
|
*/
|
|
13
13
|
export function assertAttribute(element, attribute, expectedValue) {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const hasAttribute = element.hasAttribute(attribute);
|
|
15
|
+
assert.ok(hasAttribute, `Element should have attribute "${attribute}"`);
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
if (expectedValue !== undefined) {
|
|
18
|
+
const actualValue = element.getAttribute(attribute);
|
|
19
|
+
assert.strictEqual(
|
|
20
|
+
actualValue,
|
|
21
|
+
expectedValue,
|
|
22
|
+
`Attribute "${attribute}" should be "${expectedValue}" but was "${actualValue}"`,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/**
|
|
@@ -30,8 +30,8 @@ export function assertAttribute(element, attribute, expectedValue) {
|
|
|
30
30
|
* @param {string} attribute - The attribute name
|
|
31
31
|
*/
|
|
32
32
|
export function assertNoAttribute(element, attribute) {
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
const hasAttribute = element.hasAttribute(attribute);
|
|
34
|
+
assert.ok(!hasAttribute, `Element should not have attribute "${attribute}"`);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/**
|
|
@@ -40,10 +40,7 @@ export function assertNoAttribute(element, attribute) {
|
|
|
40
40
|
* @param {string} className - The class name
|
|
41
41
|
*/
|
|
42
42
|
export function assertClass(element, className) {
|
|
43
|
-
|
|
44
|
-
element.classList.contains(className),
|
|
45
|
-
`Element should have class "${className}"`,
|
|
46
|
-
);
|
|
43
|
+
assert.ok(element.classList.contains(className), `Element should have class "${className}"`);
|
|
47
44
|
}
|
|
48
45
|
|
|
49
46
|
/**
|
|
@@ -52,10 +49,7 @@ export function assertClass(element, className) {
|
|
|
52
49
|
* @param {string} className - The class name
|
|
53
50
|
*/
|
|
54
51
|
export function assertNoClass(element, className) {
|
|
55
|
-
|
|
56
|
-
!element.classList.contains(className),
|
|
57
|
-
`Element should not have class "${className}"`,
|
|
58
|
-
);
|
|
52
|
+
assert.ok(!element.classList.contains(className), `Element should not have class "${className}"`);
|
|
59
53
|
}
|
|
60
54
|
|
|
61
55
|
/**
|
|
@@ -64,10 +58,7 @@ export function assertNoClass(element, className) {
|
|
|
64
58
|
* @param {string} selector - The CSS selector
|
|
65
59
|
*/
|
|
66
60
|
export function assertSelector(element, selector) {
|
|
67
|
-
|
|
68
|
-
element.matches(selector),
|
|
69
|
-
`Element should match selector "${selector}"`,
|
|
70
|
-
);
|
|
61
|
+
assert.ok(element.matches(selector), `Element should match selector "${selector}"`);
|
|
71
62
|
}
|
|
72
63
|
|
|
73
64
|
/**
|
|
@@ -76,12 +67,12 @@ export function assertSelector(element, selector) {
|
|
|
76
67
|
* @param {string} expectedText - The expected text
|
|
77
68
|
*/
|
|
78
69
|
export function assertTextContent(element, expectedText) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
70
|
+
const actualText = element.textContent?.trim();
|
|
71
|
+
assert.strictEqual(
|
|
72
|
+
actualText,
|
|
73
|
+
expectedText,
|
|
74
|
+
`Element text content should be "${expectedText}" but was "${actualText}"`,
|
|
75
|
+
);
|
|
85
76
|
}
|
|
86
77
|
|
|
87
78
|
/**
|
|
@@ -90,11 +81,11 @@ export function assertTextContent(element, expectedText) {
|
|
|
90
81
|
* @param {string} substring - The substring to find
|
|
91
82
|
*/
|
|
92
83
|
export function assertTextIncludes(element, substring) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
84
|
+
const text = element.textContent || '';
|
|
85
|
+
assert.ok(
|
|
86
|
+
text.includes(substring),
|
|
87
|
+
`Element text should include "${substring}" but was "${text}"`,
|
|
88
|
+
);
|
|
98
89
|
}
|
|
99
90
|
|
|
100
91
|
/**
|
|
@@ -103,11 +94,11 @@ export function assertTextIncludes(element, substring) {
|
|
|
103
94
|
* @param {string} selector - The CSS selector to find in shadow root
|
|
104
95
|
*/
|
|
105
96
|
export function assertShadowElement(element, selector) {
|
|
106
|
-
|
|
107
|
-
|
|
97
|
+
const shadowRoot = element.shadowRoot || element.renderRoot;
|
|
98
|
+
assert.ok(shadowRoot, 'Element should have a shadow root');
|
|
108
99
|
|
|
109
|
-
|
|
110
|
-
|
|
100
|
+
const found = shadowRoot.querySelector(selector);
|
|
101
|
+
assert.ok(found, `Shadow root should contain element matching "${selector}"`);
|
|
111
102
|
}
|
|
112
103
|
|
|
113
104
|
/**
|
|
@@ -117,7 +108,7 @@ export function assertShadowElement(element, selector) {
|
|
|
117
108
|
* @param {string} expectedValue - The expected value (optional)
|
|
118
109
|
*/
|
|
119
110
|
export function assertAria(element, ariaAttribute, expectedValue) {
|
|
120
|
-
|
|
111
|
+
assertAttribute(element, ariaAttribute, expectedValue);
|
|
121
112
|
}
|
|
122
113
|
|
|
123
114
|
/**
|
|
@@ -125,17 +116,9 @@ export function assertAria(element, ariaAttribute, expectedValue) {
|
|
|
125
116
|
* @param {HTMLElement} element - The element to check
|
|
126
117
|
*/
|
|
127
118
|
export function assertVisible(element) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
"none",
|
|
132
|
-
"Element should not have display:none",
|
|
133
|
-
);
|
|
134
|
-
assert.notStrictEqual(
|
|
135
|
-
style.visibility,
|
|
136
|
-
"hidden",
|
|
137
|
-
"Element should not have visibility:hidden",
|
|
138
|
-
);
|
|
119
|
+
const style = window.getComputedStyle(element);
|
|
120
|
+
assert.notStrictEqual(style.display, 'none', 'Element should not have display:none');
|
|
121
|
+
assert.notStrictEqual(style.visibility, 'hidden', 'Element should not have visibility:hidden');
|
|
139
122
|
}
|
|
140
123
|
|
|
141
124
|
/**
|
|
@@ -143,10 +126,8 @@ export function assertVisible(element) {
|
|
|
143
126
|
* @param {HTMLElement} element - The element to check
|
|
144
127
|
*/
|
|
145
128
|
export function assertHidden(element) {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
element.hidden === true;
|
|
151
|
-
assert.ok(isHidden, "Element should be hidden");
|
|
129
|
+
const style = window.getComputedStyle(element);
|
|
130
|
+
const isHidden =
|
|
131
|
+
style.display === 'none' || style.visibility === 'hidden' || element.hidden === true;
|
|
132
|
+
assert.ok(isHidden, 'Element should be hidden');
|
|
152
133
|
}
|
package/src/test-utils/events.js
CHANGED
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
* @returns {boolean} Returns true if the event was not cancelled
|
|
11
11
|
*/
|
|
12
12
|
export function dispatchEvent(element, eventName, detail = {}) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
const event = new CustomEvent(eventName, {
|
|
14
|
+
detail,
|
|
15
|
+
bubbles: true,
|
|
16
|
+
composed: true,
|
|
17
|
+
cancelable: true,
|
|
18
|
+
});
|
|
19
|
+
return element.dispatchEvent(event);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -27,22 +27,20 @@ export function dispatchEvent(element, eventName, detail = {}) {
|
|
|
27
27
|
* @returns {Promise<Event>} Resolves with the event object
|
|
28
28
|
*/
|
|
29
29
|
export function waitForEvent(element, eventName, timeout = 3000) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
);
|
|
36
|
-
}, timeout);
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const timeoutId = setTimeout(() => {
|
|
32
|
+
element.removeEventListener(eventName, handler);
|
|
33
|
+
reject(new Error(`Event "${eventName}" did not fire within ${timeout}ms`));
|
|
34
|
+
}, timeout);
|
|
37
35
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
const handler = (event) => {
|
|
37
|
+
clearTimeout(timeoutId);
|
|
38
|
+
element.removeEventListener(eventName, handler);
|
|
39
|
+
resolve(event);
|
|
40
|
+
};
|
|
43
41
|
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
element.addEventListener(eventName, handler);
|
|
43
|
+
});
|
|
46
44
|
}
|
|
47
45
|
|
|
48
46
|
/**
|
|
@@ -50,7 +48,7 @@ export function waitForEvent(element, eventName, timeout = 3000) {
|
|
|
50
48
|
* @param {HTMLElement} element - The element to click
|
|
51
49
|
*/
|
|
52
50
|
export function click(element) {
|
|
53
|
-
|
|
51
|
+
element.click();
|
|
54
52
|
}
|
|
55
53
|
|
|
56
54
|
/**
|
|
@@ -59,14 +57,14 @@ export function click(element) {
|
|
|
59
57
|
* @param {string} key - The key to press (e.g., 'Enter', 'Escape')
|
|
60
58
|
* @param {string} type - The event type ('keydown', 'keyup', 'keypress')
|
|
61
59
|
*/
|
|
62
|
-
export function keyboard(element, key, type =
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
60
|
+
export function keyboard(element, key, type = 'keydown') {
|
|
61
|
+
const event = new KeyboardEvent(type, {
|
|
62
|
+
key,
|
|
63
|
+
bubbles: true,
|
|
64
|
+
composed: true,
|
|
65
|
+
cancelable: true,
|
|
66
|
+
});
|
|
67
|
+
element.dispatchEvent(event);
|
|
70
68
|
}
|
|
71
69
|
|
|
72
70
|
/**
|
|
@@ -74,8 +72,8 @@ export function keyboard(element, key, type = "keydown") {
|
|
|
74
72
|
* @param {HTMLElement} element - The element to focus
|
|
75
73
|
*/
|
|
76
74
|
export function focus(element) {
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
element.focus();
|
|
76
|
+
element.dispatchEvent(new FocusEvent('focus', { bubbles: true }));
|
|
79
77
|
}
|
|
80
78
|
|
|
81
79
|
/**
|
|
@@ -83,6 +81,6 @@ export function focus(element) {
|
|
|
83
81
|
* @param {HTMLElement} element - The element to blur
|
|
84
82
|
*/
|
|
85
83
|
export function blur(element) {
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
element.blur();
|
|
85
|
+
element.dispatchEvent(new FocusEvent('blur', { bubbles: true }));
|
|
88
86
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Test utilities for creating and cleaning up web component fixtures
|
|
3
3
|
*/
|
|
4
|
-
import { Window } from
|
|
4
|
+
import { Window } from 'happy-dom';
|
|
5
5
|
|
|
6
6
|
// Initialize happy-dom window
|
|
7
7
|
const window = new Window();
|
|
@@ -17,12 +17,12 @@ globalThis.Event = window.Event;
|
|
|
17
17
|
|
|
18
18
|
// Polyfill requestAnimationFrame for test environment
|
|
19
19
|
if (!globalThis.requestAnimationFrame) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
globalThis.requestAnimationFrame = (callback) => {
|
|
21
|
+
return setTimeout(callback, 0);
|
|
22
|
+
};
|
|
23
|
+
globalThis.cancelAnimationFrame = (id) => {
|
|
24
|
+
clearTimeout(id);
|
|
25
|
+
};
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
/**
|
|
@@ -32,25 +32,25 @@ if (!globalThis.requestAnimationFrame) {
|
|
|
32
32
|
* @returns {Promise<HTMLElement>} The created element after it's connected
|
|
33
33
|
*/
|
|
34
34
|
export async function fixture(tagName, props = {}) {
|
|
35
|
-
|
|
35
|
+
const element = document.createElement(tagName);
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
// Set properties
|
|
38
|
+
for (const [key, value] of Object.entries(props)) {
|
|
39
|
+
element[key] = value;
|
|
40
|
+
}
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
// Append to body
|
|
43
|
+
document.body.appendChild(element);
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
// Wait for element to be fully connected and updated
|
|
46
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
// If it's a LitElement, wait for updateComplete
|
|
49
|
+
if (element.updateComplete) {
|
|
50
|
+
await element.updateComplete;
|
|
51
|
+
}
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
return element;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
/**
|
|
@@ -58,20 +58,20 @@ export async function fixture(tagName, props = {}) {
|
|
|
58
58
|
* @param {HTMLElement} element - The element to remove
|
|
59
59
|
*/
|
|
60
60
|
export function cleanup(element) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
if (element?.parentNode) {
|
|
62
|
+
element.parentNode.removeChild(element);
|
|
63
|
+
}
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
/**
|
|
67
67
|
* Removes all elements matching the selector from the document
|
|
68
68
|
* @param {string} selector - CSS selector for elements to remove
|
|
69
69
|
*/
|
|
70
|
-
export function cleanupAll(selector =
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
70
|
+
export function cleanupAll(selector = '*') {
|
|
71
|
+
const elements = document.querySelectorAll(selector);
|
|
72
|
+
elements.forEach((el) => {
|
|
73
|
+
if (el.parentNode) {
|
|
74
|
+
el.parentNode.removeChild(el);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
77
|
}
|
package/src/test-utils/index.js
CHANGED
package/src/types.d.ts
CHANGED
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
// Component deep imports
|
|
12
|
-
declare module
|
|
12
|
+
declare module '@grantcodes/ui/components/*';
|
|
13
13
|
|
|
14
14
|
// Style imports
|
|
15
|
-
declare module
|
|
15
|
+
declare module '@grantcodes/ui/styles/*';
|
|
16
16
|
|
|
17
17
|
// Font imports
|
|
18
|
-
declare module
|
|
18
|
+
declare module '@grantcodes/ui/fonts/*';
|