@warp-ds/elements 2.8.0-next.1 → 2.8.0-next.3
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/dist/api.js.map +1 -1
- package/dist/custom-elements.json +4097 -3178
- package/dist/index.d.ts +1053 -832
- package/dist/packages/combobox/combobox.react.stories.d.ts +1 -1
- package/dist/packages/radio/base-element.d.ts +46 -0
- package/dist/packages/radio/base-element.js +100 -0
- package/dist/packages/radio/custom-error-validator.d.ts +6 -0
- package/dist/packages/radio/custom-error-validator.js +22 -0
- package/dist/packages/radio/form-associated-element.d.ts +103 -0
- package/dist/packages/radio/form-associated-element.js +282 -0
- package/dist/packages/radio/host-styles.d.ts +1 -0
- package/dist/packages/radio/host-styles.js +12 -0
- package/dist/packages/radio/invalid.d.ts +8 -0
- package/dist/packages/radio/invalid.js +5 -0
- package/dist/packages/radio/radio-styles.d.ts +1 -0
- package/dist/packages/radio/radio-styles.js +148 -0
- package/dist/packages/radio/radio.a11y.test.d.ts +2 -0
- package/dist/packages/radio/radio.a11y.test.js +81 -0
- package/dist/packages/radio/radio.d.ts +53 -0
- package/dist/packages/radio/radio.js +2602 -0
- package/dist/packages/radio/radio.js.map +7 -0
- package/dist/packages/radio/radio.react.stories.d.ts +9 -0
- package/dist/packages/radio/radio.react.stories.js +10 -0
- package/dist/packages/radio/radio.stories.d.ts +32 -0
- package/dist/packages/radio/radio.stories.js +275 -0
- package/dist/packages/radio/radio.test.d.ts +1 -0
- package/dist/packages/radio/radio.test.js +185 -0
- package/dist/packages/radio/react.d.ts +2 -0
- package/dist/packages/radio/react.js +11 -0
- package/dist/packages/radio/required-validator.d.ts +11 -0
- package/dist/packages/radio/required-validator.js +34 -0
- package/dist/packages/radio/slot.d.ts +20 -0
- package/dist/packages/radio/slot.js +71 -0
- package/dist/packages/radio/watch.d.ts +26 -0
- package/dist/packages/radio/watch.js +39 -0
- package/dist/packages/radio-group/locales/da/messages.d.mts +1 -0
- package/dist/packages/radio-group/locales/da/messages.mjs +1 -0
- package/dist/packages/radio-group/locales/en/messages.d.mts +1 -0
- package/dist/packages/radio-group/locales/en/messages.mjs +1 -0
- package/dist/packages/radio-group/locales/fi/messages.d.mts +1 -0
- package/dist/packages/radio-group/locales/fi/messages.mjs +1 -0
- package/dist/packages/radio-group/locales/nb/messages.d.mts +1 -0
- package/dist/packages/radio-group/locales/nb/messages.mjs +1 -0
- package/dist/packages/radio-group/locales/sv/messages.d.mts +1 -0
- package/dist/packages/radio-group/locales/sv/messages.mjs +1 -0
- package/dist/packages/radio-group/radio-group-styles.d.ts +1 -0
- package/dist/packages/radio-group/radio-group-styles.js +61 -0
- package/dist/packages/radio-group/radio-group.a11y.test.d.ts +2 -0
- package/dist/packages/radio-group/radio-group.a11y.test.js +118 -0
- package/dist/packages/radio-group/radio-group.d.ts +88 -0
- package/dist/packages/radio-group/radio-group.js +2704 -0
- package/dist/packages/radio-group/radio-group.js.map +7 -0
- package/dist/packages/radio-group/radio-group.test.d.ts +2 -0
- package/dist/packages/radio-group/radio-group.test.js +392 -0
- package/dist/packages/radio-group/react.d.ts +7 -0
- package/dist/packages/radio-group/react.js +17 -0
- package/dist/packages/select/select.react.stories.d.ts +1 -1
- package/dist/packages/textarea/textarea.react.stories.d.ts +1 -1
- package/dist/packages/textfield/textfield.react.stories.d.ts +1 -1
- package/dist/packages/toast/api.js +1 -1
- package/dist/packages/toast/toast.js.map +1 -1
- package/dist/web-types.json +579 -398
- package/package.json +1 -1
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { css } from 'lit';
|
|
2
|
+
export const styles = css `
|
|
3
|
+
:host {
|
|
4
|
+
display: inline-flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
gap: var(--_gap);
|
|
7
|
+
|
|
8
|
+
--_gap: var(--w-c-radio-gap, 8px);
|
|
9
|
+
|
|
10
|
+
--_size: var(--w-c-radio-size, 2rem);
|
|
11
|
+
--_radius: var(--w-c-radio-radius, 50%);
|
|
12
|
+
--_border-width: var(--w-c-radio-border-width, 1px);
|
|
13
|
+
--_checked-border-width: var(--w-c-radio-checked-border-width, 0.6rem);
|
|
14
|
+
|
|
15
|
+
--_bg: var(--w-c-radio-bg, var(--w-s-color-background));
|
|
16
|
+
--_border-color: var(--w-c-radio-border-color, var(--w-s-color-border-strong));
|
|
17
|
+
--_border-color-checked: var(--w-c-radio-border-color-checked, var(--w-s-color-border-selected));
|
|
18
|
+
--_border-color-invalid: var(--w-c-radio-border-color-invalid, var(--w-s-color-border-negative));
|
|
19
|
+
|
|
20
|
+
--_outline-width: var(--w-c-radio-outline-width, 2px);
|
|
21
|
+
--_outline-color: var(--w-c-radio-outline-color, var(--w-s-color-border-focus));
|
|
22
|
+
--_outline-offset: var(--w-c-radio-outline-offset, var(--w-outline-offset, 1px));
|
|
23
|
+
|
|
24
|
+
--_border-color-disabled: var(--w-c-radio-border-color-disabled, var(--w-s-color-border-disabled));
|
|
25
|
+
--_bg-disabled: var(--w-c-radio-bg-disabled, var(--w-s-color-background-disabled-subtle));
|
|
26
|
+
|
|
27
|
+
--_label-font-size: var(--w-c-radio-label-font-size, var(--w-font-size-m));
|
|
28
|
+
--_label-line-height: var(--w-c-radio-label-line-height, var(--w-line-height-m));
|
|
29
|
+
--_label-color: var(--w-c-radio-label-color, currentColor);
|
|
30
|
+
--_label-color-disabled: var(--w-c-radio-label-color-disabled, var(--w-s-color-text-disabled));
|
|
31
|
+
|
|
32
|
+
--_cursor: var(--w-c-radio-cursor, pointer);
|
|
33
|
+
--_cursor-disabled: var(--w-c-radio-cursor-disabled, not-allowed);
|
|
34
|
+
|
|
35
|
+
--_transition: var(
|
|
36
|
+
--w-c-radio-transition,
|
|
37
|
+
border-color 150ms cubic-bezier(0.4, 0, 0.2, 1),
|
|
38
|
+
border-width 150ms cubic-bezier(0.4, 0, 0.2, 1),
|
|
39
|
+
background-color 150ms cubic-bezier(0.4, 0, 0.2, 1)
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
:host([disabled-ui]) {
|
|
44
|
+
--w-c-radio-border-color: var(--w-c-radio-border-color-disabled, var(--w-s-color-border-disabled));
|
|
45
|
+
--w-c-radio-bg: var(--w-c-radio-bg-disabled, var(--w-s-color-background-disabled-subtle));
|
|
46
|
+
--w-c-radio-border-color-checked: var(--w-c-radio-border-color-disabled, var(--w-s-color-border-disabled));
|
|
47
|
+
--w-c-radio-label-color: var(--w-c-radio-label-color-disabled, var(--w-s-color-text-disabled));
|
|
48
|
+
--w-c-radio-cursor: var(--w-c-radio-cursor-disabled, not-allowed);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.wrapper {
|
|
52
|
+
display: inline-flex;
|
|
53
|
+
align-items: center;
|
|
54
|
+
gap: var(--_gap);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
[part='control'] {
|
|
58
|
+
appearance: none;
|
|
59
|
+
-webkit-appearance: none;
|
|
60
|
+
margin: 0;
|
|
61
|
+
|
|
62
|
+
width: var(--_size);
|
|
63
|
+
height: var(--_size);
|
|
64
|
+
border-style: solid;
|
|
65
|
+
border-width: var(--_border-width);
|
|
66
|
+
border-color: var(--_border-color);
|
|
67
|
+
border-radius: var(--_radius);
|
|
68
|
+
background-color: var(--_bg);
|
|
69
|
+
cursor: var(--_cursor);
|
|
70
|
+
flex-shrink: 0;
|
|
71
|
+
|
|
72
|
+
transition: var(--_transition);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
:host([checked-ui]) [part='control'],
|
|
76
|
+
:host([role='radio'][checked-ui]) [part='control'],
|
|
77
|
+
:host([role='radio']:state(checked)) [part='control'] {
|
|
78
|
+
border-color: var(--_border-color-checked);
|
|
79
|
+
border-width: var(--_checked-border-width);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
:host([invalid]) [part='control'] {
|
|
83
|
+
border-color: var(--_border-color-invalid);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
:host(:focus-visible) {
|
|
87
|
+
outline: none;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
:host(:focus-visible) [part='control'] {
|
|
91
|
+
outline: var(--_outline-width) solid var(--_outline-color);
|
|
92
|
+
outline-offset: var(--_outline-offset);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
:host([disabled-ui]) [part='control'],
|
|
96
|
+
:host([role='radio']:state(disabled)) [part='control'] {
|
|
97
|
+
border-color: var(--_border-color-disabled);
|
|
98
|
+
background-color: var(--_bg-disabled);
|
|
99
|
+
cursor: var(--_cursor-disabled);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
:host([disabled-ui][checked-ui]) [part='control'] {
|
|
103
|
+
border-color: var(--_border-color-disabled);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
[part='label'] {
|
|
107
|
+
font-size: var(--_label-font-size);
|
|
108
|
+
line-height: var(--_label-line-height);
|
|
109
|
+
color: var(--_label-color);
|
|
110
|
+
user-select: none;
|
|
111
|
+
cursor: var(--_cursor);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@media (prefers-reduced-motion: reduce) {
|
|
115
|
+
:host {
|
|
116
|
+
--w-c-radio-transition: none;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
@media (forced-colors: active) {
|
|
121
|
+
:host {
|
|
122
|
+
--w-c-radio-bg: Canvas;
|
|
123
|
+
--w-c-radio-border-color: ButtonText;
|
|
124
|
+
--w-c-radio-border-color-checked: Highlight;
|
|
125
|
+
--w-c-radio-outline-color: Highlight;
|
|
126
|
+
--w-c-radio-bg-disabled: Canvas;
|
|
127
|
+
--w-c-radio-border-color-disabled: GrayText;
|
|
128
|
+
--w-c-radio-label-color: CanvasText;
|
|
129
|
+
--w-c-radio-label-color-disabled: GrayText;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
[part='control'] {
|
|
133
|
+
forced-color-adjust: none;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
:host([checked-ui]) [part='control'],
|
|
137
|
+
:host([role='radio']:state(checked)) [part='control'] {
|
|
138
|
+
background-color: var(--_border-color-checked);
|
|
139
|
+
border-color: var(--_border-color-checked);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
:host([disabled-ui][checked-ui]) [part='control'],
|
|
143
|
+
:host([role='radio']:state(disabled):state(checked)) [part='control'] {
|
|
144
|
+
background-color: var(--_border-color-disabled);
|
|
145
|
+
border-color: var(--_border-color-disabled);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
`;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { html } from 'lit';
|
|
2
|
+
import { describe, expect, test } from 'vitest';
|
|
3
|
+
import { render } from 'vitest-browser-lit';
|
|
4
|
+
import './radio.js';
|
|
5
|
+
import '../radio-group/radio-group.js';
|
|
6
|
+
describe('w-radio accessibility (WCAG 2.2)', () => {
|
|
7
|
+
describe('axe-core automated checks', () => {
|
|
8
|
+
test('default state has no violations', async () => {
|
|
9
|
+
const page = render(html `
|
|
10
|
+
<w-radio-group label="Options">
|
|
11
|
+
<w-radio value="one">One</w-radio>
|
|
12
|
+
<w-radio value="two">Two</w-radio>
|
|
13
|
+
</w-radio-group>
|
|
14
|
+
`);
|
|
15
|
+
await expect(page).toHaveNoAxeViolations();
|
|
16
|
+
});
|
|
17
|
+
test('disabled state has no violations', async () => {
|
|
18
|
+
const page = render(html `
|
|
19
|
+
<w-radio-group label="Options">
|
|
20
|
+
<w-radio value="one" disabled>One</w-radio>
|
|
21
|
+
<w-radio value="two">Two</w-radio>
|
|
22
|
+
</w-radio-group>
|
|
23
|
+
`);
|
|
24
|
+
await expect(page).toHaveNoAxeViolations();
|
|
25
|
+
});
|
|
26
|
+
test('checked state has no violations', async () => {
|
|
27
|
+
const page = render(html `
|
|
28
|
+
<w-radio-group label="Options">
|
|
29
|
+
<w-radio value="one" checked>One</w-radio>
|
|
30
|
+
<w-radio value="two">Two</w-radio>
|
|
31
|
+
</w-radio-group>
|
|
32
|
+
`);
|
|
33
|
+
await expect(page).toHaveNoAxeViolations();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('WCAG 1.3.1 - Info and Relationships', () => {
|
|
37
|
+
test('radio has accessible name from label slot', async () => {
|
|
38
|
+
const page = render(html `
|
|
39
|
+
<w-radio-group label="Options">
|
|
40
|
+
<w-radio value="one">First option</w-radio>
|
|
41
|
+
</w-radio-group>
|
|
42
|
+
`);
|
|
43
|
+
await expect.element(page.getByRole('radio', { name: 'First option' })).toBeVisible();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('WCAG 4.1.2 - Name, Role, Value', () => {
|
|
47
|
+
test('disabled state is exposed', async () => {
|
|
48
|
+
const page = render(html `
|
|
49
|
+
<w-radio-group label="Options">
|
|
50
|
+
<w-radio value="one" disabled>Disabled</w-radio>
|
|
51
|
+
</w-radio-group>
|
|
52
|
+
`);
|
|
53
|
+
await expect.element(page.getByRole('radio', { name: 'Disabled' })).toBeDisabled();
|
|
54
|
+
});
|
|
55
|
+
test('checked state is exposed', async () => {
|
|
56
|
+
const page = render(html `
|
|
57
|
+
<w-radio-group label="Options">
|
|
58
|
+
<w-radio value="one">Checked</w-radio>
|
|
59
|
+
<w-radio value="two">Unchecked</w-radio>
|
|
60
|
+
</w-radio-group>
|
|
61
|
+
`);
|
|
62
|
+
const group = document.querySelector('w-radio-group');
|
|
63
|
+
await group.updateComplete;
|
|
64
|
+
const [checkedRadio, uncheckedRadio] = Array.from(document.querySelectorAll('w-radio'));
|
|
65
|
+
await checkedRadio.click();
|
|
66
|
+
await group.updateComplete;
|
|
67
|
+
await expect.poll(() => checkedRadio.getAttribute('aria-checked')).toBe('true');
|
|
68
|
+
await expect.poll(() => uncheckedRadio.getAttribute('aria-checked')).toBe('false');
|
|
69
|
+
});
|
|
70
|
+
test('role and accessible name are preserved', async () => {
|
|
71
|
+
const page = render(html `
|
|
72
|
+
<w-radio-group label="Options">
|
|
73
|
+
<w-radio value="one">First option</w-radio>
|
|
74
|
+
<w-radio value="two">Second option</w-radio>
|
|
75
|
+
</w-radio-group>
|
|
76
|
+
`);
|
|
77
|
+
await expect.element(page.getByRole('radio', { name: 'First option' })).toBeVisible();
|
|
78
|
+
await expect.element(page.getByRole('radio', { name: 'Second option' })).toBeVisible();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { PropertyValues } from 'lit';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
declare const WRadio_base: import("@open-wc/form-control").Constructor<import("@open-wc/form-control").FormControlInterface> & typeof LitElement;
|
|
4
|
+
export declare class WRadio extends WRadio_base {
|
|
5
|
+
#private;
|
|
6
|
+
static styles: import("lit").CSSResult[];
|
|
7
|
+
/** The name of the radio, submitted as a name/value pair with form data. */
|
|
8
|
+
name: string;
|
|
9
|
+
/** The radio's value. When selected, the radio group will receive this value. */
|
|
10
|
+
value: string | null;
|
|
11
|
+
/** Draws the radio in a checked state (reflected to attribute). */
|
|
12
|
+
checked: boolean;
|
|
13
|
+
/** Disables the radio. */
|
|
14
|
+
disabled: boolean;
|
|
15
|
+
/** Makes the radio a required field. */
|
|
16
|
+
required: boolean;
|
|
17
|
+
/** Draws the radio in an invalid state. */
|
|
18
|
+
invalid: boolean;
|
|
19
|
+
constructor();
|
|
20
|
+
connectedCallback(): void;
|
|
21
|
+
private syncAriaDisabled;
|
|
22
|
+
private syncAriaChecked;
|
|
23
|
+
protected willUpdate(changedProperties: PropertyValues<this>): void;
|
|
24
|
+
updated(changedProperties: PropertyValues<this>): void;
|
|
25
|
+
private handleClick;
|
|
26
|
+
private handleInvalid;
|
|
27
|
+
private handleKeyDown;
|
|
28
|
+
resetFormControl(): void;
|
|
29
|
+
/** Returns the validation message if the radio is invalid, otherwise an empty string */
|
|
30
|
+
get validationMessage(): string;
|
|
31
|
+
/** Returns the validity state of the radio */
|
|
32
|
+
get validity(): ValidityState;
|
|
33
|
+
/** Checks whether the radio passes constraint validation */
|
|
34
|
+
checkValidity(): boolean;
|
|
35
|
+
/** Checks validity and shows the browser's validation message if invalid */
|
|
36
|
+
reportValidity(): boolean;
|
|
37
|
+
private isInGroup;
|
|
38
|
+
private getRadioScope;
|
|
39
|
+
private getStandaloneNamedRadios;
|
|
40
|
+
private syncStandaloneTabOrder;
|
|
41
|
+
private uncheckOtherRadios;
|
|
42
|
+
private updateValidity;
|
|
43
|
+
private syncFormValue;
|
|
44
|
+
private syncTabIndex;
|
|
45
|
+
private shouldSyncFormState;
|
|
46
|
+
render(): import("lit").TemplateResult<1>;
|
|
47
|
+
}
|
|
48
|
+
declare global {
|
|
49
|
+
interface HTMLElementTagNameMap {
|
|
50
|
+
'w-radio': WRadio;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export {};
|