kopia lustrzana https://github.com/shoelace-style/shoelace
Lit a11y update (#1444)
* update eslint-plugin-lit-a11y to latest * update eslint deps * remove aria- and role attribs from slots; closes #1422pull/1446/head
rodzic
f84d6939bd
commit
e1ca7d1f59
|
@ -92,7 +92,8 @@ module.exports = {
|
||||||
'@typescript-eslint/member-delimiter-style': 'warn',
|
'@typescript-eslint/member-delimiter-style': 'warn',
|
||||||
'@typescript-eslint/method-signature-style': 'warn',
|
'@typescript-eslint/method-signature-style': 'warn',
|
||||||
'@typescript-eslint/no-extraneous-class': 'error',
|
'@typescript-eslint/no-extraneous-class': 'error',
|
||||||
'@typescript-eslint/no-parameter-properties': 'error',
|
'@typescript-eslint/no-redundant-type-constituents': 'off',
|
||||||
|
'@typescript-eslint/parameter-properties': 'error',
|
||||||
'@typescript-eslint/strict-boolean-expressions': 'off'
|
'@typescript-eslint/strict-boolean-expressions': 'off'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -21,7 +21,9 @@ New versions of Shoelace are released as-needed and generally occur when a criti
|
||||||
- Fixed a bug in `<sl-qr-code>` where the `background` attribute was never passed to the QR code [#1416]
|
- Fixed a bug in `<sl-qr-code>` where the `background` attribute was never passed to the QR code [#1416]
|
||||||
- Fixed a bug in `<sl-dropdown>` where aria attributes were incorrectly applied to the default `<slot>` causing Lighthouse errors [#1417]
|
- Fixed a bug in `<sl-dropdown>` where aria attributes were incorrectly applied to the default `<slot>` causing Lighthouse errors [#1417]
|
||||||
- Fixed a bug in `<sl-carousel>` that caused navigation to work incorrectly in some case [#1420]
|
- Fixed a bug in `<sl-carousel>` that caused navigation to work incorrectly in some case [#1420]
|
||||||
|
- Fixed a number of slots that incorrectly had aria- and/or role attributes directly on them [#1422]
|
||||||
- Fixed a bug in `<sl-tree>` that caused focus to be stolen when removing focused tree items [#1430]
|
- Fixed a bug in `<sl-tree>` that caused focus to be stolen when removing focused tree items [#1430]
|
||||||
|
- Updated ESLint and related plugins to the latest versions
|
||||||
|
|
||||||
## 2.5.2
|
## 2.5.2
|
||||||
|
|
||||||
|
|
Plik diff jest za duży
Load Diff
14
package.json
14
package.json
|
@ -79,8 +79,8 @@
|
||||||
"@open-wc/testing": "^3.1.7",
|
"@open-wc/testing": "^3.1.7",
|
||||||
"@types/mocha": "^10.0.1",
|
"@types/mocha": "^10.0.1",
|
||||||
"@types/react": "^18.0.26",
|
"@types/react": "^18.0.26",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.48.1",
|
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
||||||
"@typescript-eslint/parser": "^5.48.1",
|
"@typescript-eslint/parser": "^6.0.0",
|
||||||
"@web/dev-server-esbuild": "^0.3.3",
|
"@web/dev-server-esbuild": "^0.3.3",
|
||||||
"@web/test-runner": "^0.15.0",
|
"@web/test-runner": "^0.15.0",
|
||||||
"@web/test-runner-commands": "^0.6.5",
|
"@web/test-runner-commands": "^0.6.5",
|
||||||
|
@ -96,15 +96,15 @@
|
||||||
"del": "^7.0.0",
|
"del": "^7.0.0",
|
||||||
"download": "^8.0.0",
|
"download": "^8.0.0",
|
||||||
"esbuild": "^0.18.2",
|
"esbuild": "^0.18.2",
|
||||||
"eslint": "^8.31.0",
|
"eslint": "^8.44.0",
|
||||||
"eslint-plugin-chai-expect": "^3.0.0",
|
"eslint-plugin-chai-expect": "^3.0.0",
|
||||||
"eslint-plugin-chai-friendly": "^0.7.2",
|
"eslint-plugin-chai-friendly": "^0.7.2",
|
||||||
"eslint-plugin-import": "^2.27.4",
|
"eslint-plugin-import": "^2.27.5",
|
||||||
"eslint-plugin-lit": "^1.8.2",
|
"eslint-plugin-lit": "^1.8.3",
|
||||||
"eslint-plugin-lit-a11y": "^2.3.0",
|
"eslint-plugin-lit-a11y": "^4.1.0",
|
||||||
"eslint-plugin-markdown": "^3.0.0",
|
"eslint-plugin-markdown": "^3.0.0",
|
||||||
"eslint-plugin-sort-imports-es6-autofix": "^0.6.0",
|
"eslint-plugin-sort-imports-es6-autofix": "^0.6.0",
|
||||||
"eslint-plugin-wc": "^1.4.0",
|
"eslint-plugin-wc": "^1.5.0",
|
||||||
"front-matter": "^4.0.2",
|
"front-matter": "^4.0.2",
|
||||||
"get-port": "^7.0.0",
|
"get-port": "^7.0.0",
|
||||||
"globby": "^13.1.3",
|
"globby": "^13.1.3",
|
||||||
|
|
|
@ -199,9 +199,13 @@ export default class SlAlert extends ShoelaceElement {
|
||||||
aria-hidden=${this.open ? 'false' : 'true'}
|
aria-hidden=${this.open ? 'false' : 'true'}
|
||||||
@mousemove=${this.handleMouseMove}
|
@mousemove=${this.handleMouseMove}
|
||||||
>
|
>
|
||||||
<slot name="icon" part="icon" class="alert__icon"></slot>
|
<div part="icon" class="alert__icon">
|
||||||
|
<slot name="icon"></slot>
|
||||||
|
</div>
|
||||||
|
|
||||||
<slot part="message" class="alert__message" aria-live="polite"></slot>
|
<div part="message" class="alert__message" aria-live="polite">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
|
||||||
${this.closable
|
${this.closable
|
||||||
? html`
|
? html`
|
||||||
|
|
|
@ -69,9 +69,11 @@ export default class SlAvatar extends ShoelaceElement {
|
||||||
avatarWithoutImage = html`<div part="initials" class="avatar__initials">${this.initials}</div>`;
|
avatarWithoutImage = html`<div part="initials" class="avatar__initials">${this.initials}</div>`;
|
||||||
} else {
|
} else {
|
||||||
avatarWithoutImage = html`
|
avatarWithoutImage = html`
|
||||||
<slot name="icon" part="icon" class="avatar__icon" aria-hidden="true">
|
<div part="icon" class="avatar__icon" aria-hidden="true">
|
||||||
<sl-icon name="person-fill" library="system"></sl-icon>
|
<slot name="icon">
|
||||||
</slot>
|
<sl-icon name="person-fill" library="system"></sl-icon>
|
||||||
|
</slot>
|
||||||
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,10 @@ import '../../../dist/shoelace.js';
|
||||||
import { expect, fixture, html } from '@open-wc/testing';
|
import { expect, fixture, html } from '@open-wc/testing';
|
||||||
import type SlBadge from './badge.js';
|
import type SlBadge from './badge.js';
|
||||||
|
|
||||||
|
// The default badge background just misses AA contrast, but the next step up is way too dark. We're going to relax this
|
||||||
|
// rule for now.
|
||||||
|
const ignoredRules = ['color-contrast'];
|
||||||
|
|
||||||
describe('<sl-badge>', () => {
|
describe('<sl-badge>', () => {
|
||||||
let el: SlBadge;
|
let el: SlBadge;
|
||||||
|
|
||||||
|
@ -11,7 +15,7 @@ describe('<sl-badge>', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should pass accessibility tests with a role of status on the base part.', async () => {
|
it('should pass accessibility tests with a role of status on the base part.', async () => {
|
||||||
await expect(el).to.be.accessible();
|
await expect(el).to.be.accessible({ ignoredRules });
|
||||||
|
|
||||||
const part = el.shadowRoot!.querySelector('[part~="base"]')!;
|
const part = el.shadowRoot!.querySelector('[part~="base"]')!;
|
||||||
expect(part.getAttribute('role')).to.eq('status');
|
expect(part.getAttribute('role')).to.eq('status');
|
||||||
|
@ -33,7 +37,7 @@ describe('<sl-badge>', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should pass accessibility tests', async () => {
|
it('should pass accessibility tests', async () => {
|
||||||
await expect(el).to.be.accessible();
|
await expect(el).to.be.accessible({ ignoredRules });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should append the pill class to the classlist to render a pill', () => {
|
it('should append the pill class to the classlist to render a pill', () => {
|
||||||
|
@ -48,7 +52,7 @@ describe('<sl-badge>', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should pass accessibility tests', async () => {
|
it('should pass accessibility tests', async () => {
|
||||||
await expect(el).to.be.accessible();
|
await expect(el).to.be.accessible({ ignoredRules });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should append the pulse class to the classlist to render a pulse', () => {
|
it('should append the pulse class to the classlist to render a pulse', () => {
|
||||||
|
@ -64,7 +68,7 @@ describe('<sl-badge>', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should pass accessibility tests', async () => {
|
it('should pass accessibility tests', async () => {
|
||||||
await expect(el).to.be.accessible();
|
await expect(el).to.be.accessible({ ignoredRules });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should default to square styling, with the primary color', () => {
|
it('should default to square styling, with the primary color', () => {
|
||||||
|
|
|
@ -30,7 +30,7 @@ export default class SlBadge extends ShoelaceElement {
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return html`
|
return html`
|
||||||
<slot
|
<span
|
||||||
part="base"
|
part="base"
|
||||||
class=${classMap({
|
class=${classMap({
|
||||||
badge: true,
|
badge: true,
|
||||||
|
@ -43,7 +43,9 @@ export default class SlBadge extends ShoelaceElement {
|
||||||
'badge--pulse': this.pulse
|
'badge--pulse': this.pulse
|
||||||
})}
|
})}
|
||||||
role="status"
|
role="status"
|
||||||
></slot>
|
>
|
||||||
|
<slot></slot>
|
||||||
|
</span>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,9 @@ export default class SlBreadcrumbItem extends ShoelaceElement {
|
||||||
'breadcrumb-item--has-suffix': this.hasSlotController.test('suffix')
|
'breadcrumb-item--has-suffix': this.hasSlotController.test('suffix')
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
<slot name="prefix" part="prefix" class="breadcrumb-item__prefix"></slot>
|
<span part="prefix" class="breadcrumb-item__prefix">
|
||||||
|
<slot name="prefix"></slot>
|
||||||
|
</span>
|
||||||
|
|
||||||
${isLink
|
${isLink
|
||||||
? html`
|
? html`
|
||||||
|
@ -75,9 +77,13 @@ export default class SlBreadcrumbItem extends ShoelaceElement {
|
||||||
</button>
|
</button>
|
||||||
`}
|
`}
|
||||||
|
|
||||||
<slot name="suffix" part="suffix" class="breadcrumb-item__suffix"></slot>
|
<span part="suffix" class="breadcrumb-item__suffix">
|
||||||
|
<slot name="suffix"></slot>
|
||||||
|
</span>
|
||||||
|
|
||||||
<slot name="separator" part="separator" class="breadcrumb-item__separator" aria-hidden="true"></slot>
|
<span part="separator" class="breadcrumb-item__separator" aria-hidden="true">
|
||||||
|
<slot name="separator"></slot>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,9 +90,11 @@ export default class SlBreadcrumb extends ShoelaceElement {
|
||||||
<slot @slotchange=${this.handleSlotChange}></slot>
|
<slot @slotchange=${this.handleSlotChange}></slot>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<slot name="separator" hidden aria-hidden="true">
|
<span hidden aria-hidden="true">
|
||||||
<sl-icon name=${this.localize.dir() === 'rtl' ? 'chevron-left' : 'chevron-right'} library="system"></sl-icon>
|
<slot name="separator">
|
||||||
</slot>
|
<sl-icon name=${this.localize.dir() === 'rtl' ? 'chevron-left' : 'chevron-right'} library="system"></sl-icon>
|
||||||
|
</slot>
|
||||||
|
</span>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,7 @@ export default class SlButtonGroup extends ShoelaceElement {
|
||||||
render() {
|
render() {
|
||||||
// eslint-disable-next-line lit-a11y/mouse-events-have-key-events
|
// eslint-disable-next-line lit-a11y/mouse-events-have-key-events
|
||||||
return html`
|
return html`
|
||||||
<slot
|
<div
|
||||||
part="base"
|
part="base"
|
||||||
class="button-group"
|
class="button-group"
|
||||||
role="${this.disableRole ? 'presentation' : 'group'}"
|
role="${this.disableRole ? 'presentation' : 'group'}"
|
||||||
|
@ -77,8 +77,9 @@ export default class SlButtonGroup extends ShoelaceElement {
|
||||||
@focusin=${this.handleFocus}
|
@focusin=${this.handleFocus}
|
||||||
@mouseover=${this.handleMouseOver}
|
@mouseover=${this.handleMouseOver}
|
||||||
@mouseout=${this.handleMouseOut}
|
@mouseout=${this.handleMouseOut}
|
||||||
@slotchange=${this.handleSlotChange}
|
>
|
||||||
></slot>
|
<slot @slotchange=${this.handleSlotChange}></slot>
|
||||||
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,16 +108,19 @@ export default class SlImageComparer extends ShoelaceElement {
|
||||||
@keydown=${this.handleKeyDown}
|
@keydown=${this.handleKeyDown}
|
||||||
>
|
>
|
||||||
<div class="image-comparer__image">
|
<div class="image-comparer__image">
|
||||||
<slot name="before" part="before" class="image-comparer__before"></slot>
|
<div part="before" class="image-comparer__before">
|
||||||
|
<slot name="before"></slot>
|
||||||
|
</div>
|
||||||
|
|
||||||
<slot
|
<div
|
||||||
name="after"
|
|
||||||
part="after"
|
part="after"
|
||||||
class="image-comparer__after"
|
class="image-comparer__after"
|
||||||
style=${styleMap({
|
style=${styleMap({
|
||||||
clipPath: isRtl ? `inset(0 0 0 ${100 - this.position}%)` : `inset(0 ${100 - this.position}% 0 0)`
|
clipPath: isRtl ? `inset(0 0 0 ${100 - this.position}%)` : `inset(0 ${100 - this.position}% 0 0)`
|
||||||
})}
|
})}
|
||||||
></slot>
|
>
|
||||||
|
<slot name="after"></slot>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
|
@ -129,8 +132,7 @@ export default class SlImageComparer extends ShoelaceElement {
|
||||||
@mousedown=${this.handleDrag}
|
@mousedown=${this.handleDrag}
|
||||||
@touchstart=${this.handleDrag}
|
@touchstart=${this.handleDrag}
|
||||||
>
|
>
|
||||||
<slot
|
<div
|
||||||
name="handle"
|
|
||||||
part="handle"
|
part="handle"
|
||||||
class="image-comparer__handle"
|
class="image-comparer__handle"
|
||||||
role="scrollbar"
|
role="scrollbar"
|
||||||
|
@ -140,8 +142,10 @@ export default class SlImageComparer extends ShoelaceElement {
|
||||||
aria-controls="image-comparer"
|
aria-controls="image-comparer"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
>
|
>
|
||||||
<sl-icon library="system" name="grip-vertical"></sl-icon>
|
<slot name="handle">
|
||||||
</slot>
|
<sl-icon library="system" name="grip-vertical"></sl-icon>
|
||||||
|
</slot>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
|
@ -147,8 +147,8 @@ export default css`
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
.input__prefix::slotted(sl-icon),
|
.input__prefix ::slotted(sl-icon),
|
||||||
.input__suffix::slotted(sl-icon) {
|
.input__suffix ::slotted(sl-icon) {
|
||||||
color: var(--sl-input-icon-color);
|
color: var(--sl-input-icon-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,11 +172,11 @@ export default css`
|
||||||
width: calc(1em + var(--sl-input-spacing-small) * 2);
|
width: calc(1em + var(--sl-input-spacing-small) * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.input--small .input__prefix::slotted(*) {
|
.input--small .input__prefix ::slotted(*) {
|
||||||
margin-inline-start: var(--sl-input-spacing-small);
|
margin-inline-start: var(--sl-input-spacing-small);
|
||||||
}
|
}
|
||||||
|
|
||||||
.input--small .input__suffix::slotted(*) {
|
.input--small .input__suffix ::slotted(*) {
|
||||||
margin-inline-end: var(--sl-input-spacing-small);
|
margin-inline-end: var(--sl-input-spacing-small);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,11 +196,11 @@ export default css`
|
||||||
width: calc(1em + var(--sl-input-spacing-medium) * 2);
|
width: calc(1em + var(--sl-input-spacing-medium) * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.input--medium .input__prefix::slotted(*) {
|
.input--medium .input__prefix ::slotted(*) {
|
||||||
margin-inline-start: var(--sl-input-spacing-medium);
|
margin-inline-start: var(--sl-input-spacing-medium);
|
||||||
}
|
}
|
||||||
|
|
||||||
.input--medium .input__suffix::slotted(*) {
|
.input--medium .input__suffix ::slotted(*) {
|
||||||
margin-inline-end: var(--sl-input-spacing-medium);
|
margin-inline-end: var(--sl-input-spacing-medium);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,11 +220,11 @@ export default css`
|
||||||
width: calc(1em + var(--sl-input-spacing-large) * 2);
|
width: calc(1em + var(--sl-input-spacing-large) * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.input--large .input__prefix::slotted(*) {
|
.input--large .input__prefix ::slotted(*) {
|
||||||
margin-inline-start: var(--sl-input-spacing-large);
|
margin-inline-start: var(--sl-input-spacing-large);
|
||||||
}
|
}
|
||||||
|
|
||||||
.input--large .input__suffix::slotted(*) {
|
.input--large .input__suffix ::slotted(*) {
|
||||||
margin-inline-end: var(--sl-input-spacing-large);
|
margin-inline-end: var(--sl-input-spacing-large);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -451,7 +451,10 @@ export default class SlInput extends ShoelaceElement implements ShoelaceFormCont
|
||||||
'input--no-spin-buttons': this.noSpinButtons
|
'input--no-spin-buttons': this.noSpinButtons
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
<slot name="prefix" part="prefix" class="input__prefix"></slot>
|
<span part="prefix" class="input__prefix">
|
||||||
|
<slot name="prefix"></slot>
|
||||||
|
</span>
|
||||||
|
|
||||||
<input
|
<input
|
||||||
part="input"
|
part="input"
|
||||||
id="input"
|
id="input"
|
||||||
|
@ -486,64 +489,60 @@ export default class SlInput extends ShoelaceElement implements ShoelaceFormCont
|
||||||
@blur=${this.handleBlur}
|
@blur=${this.handleBlur}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
${
|
${hasClearIcon
|
||||||
hasClearIcon
|
? html`
|
||||||
? html`
|
<button
|
||||||
<button
|
part="clear-button"
|
||||||
part="clear-button"
|
class="input__clear"
|
||||||
class="input__clear"
|
type="button"
|
||||||
type="button"
|
aria-label=${this.localize.term('clearEntry')}
|
||||||
aria-label=${this.localize.term('clearEntry')}
|
@click=${this.handleClearClick}
|
||||||
@click=${this.handleClearClick}
|
tabindex="-1"
|
||||||
tabindex="-1"
|
>
|
||||||
>
|
<slot name="clear-icon">
|
||||||
<slot name="clear-icon">
|
<sl-icon name="x-circle-fill" library="system"></sl-icon>
|
||||||
<sl-icon name="x-circle-fill" library="system"></sl-icon>
|
</slot>
|
||||||
</slot>
|
</button>
|
||||||
</button>
|
`
|
||||||
`
|
: ''}
|
||||||
: ''
|
${this.passwordToggle && !this.disabled
|
||||||
}
|
? html`
|
||||||
${
|
<button
|
||||||
this.passwordToggle && !this.disabled
|
part="password-toggle-button"
|
||||||
? html`
|
class="input__password-toggle"
|
||||||
<button
|
type="button"
|
||||||
part="password-toggle-button"
|
aria-label=${this.localize.term(this.passwordVisible ? 'hidePassword' : 'showPassword')}
|
||||||
class="input__password-toggle"
|
@click=${this.handlePasswordToggle}
|
||||||
type="button"
|
tabindex="-1"
|
||||||
aria-label=${this.localize.term(this.passwordVisible ? 'hidePassword' : 'showPassword')}
|
>
|
||||||
@click=${this.handlePasswordToggle}
|
${this.passwordVisible
|
||||||
tabindex="-1"
|
? html`
|
||||||
>
|
<slot name="show-password-icon">
|
||||||
${this.passwordVisible
|
<sl-icon name="eye-slash" library="system"></sl-icon>
|
||||||
? html`
|
</slot>
|
||||||
<slot name="show-password-icon">
|
`
|
||||||
<sl-icon name="eye-slash" library="system"></sl-icon>
|
: html`
|
||||||
</slot>
|
<slot name="hide-password-icon">
|
||||||
`
|
<sl-icon name="eye" library="system"></sl-icon>
|
||||||
: html`
|
</slot>
|
||||||
<slot name="hide-password-icon">
|
`}
|
||||||
<sl-icon name="eye" library="system"></sl-icon>
|
</button>
|
||||||
</slot>
|
`
|
||||||
`}
|
: ''}
|
||||||
</button>
|
|
||||||
`
|
|
||||||
: ''
|
|
||||||
}
|
|
||||||
|
|
||||||
<slot name="suffix" part="suffix" class="input__suffix"></slot>
|
<span part="suffix" class="input__suffix">
|
||||||
|
<slot name="suffix"></slot>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<slot
|
<div
|
||||||
name="help-text"
|
|
||||||
part="form-control-help-text"
|
part="form-control-help-text"
|
||||||
id="help-text"
|
id="help-text"
|
||||||
class="form-control__help-text"
|
class="form-control__help-text"
|
||||||
aria-hidden=${hasHelpText ? 'false' : 'true'}
|
aria-hidden=${hasHelpText ? 'false' : 'true'}
|
||||||
>
|
>
|
||||||
${this.helpText}
|
<slot name="help-text">${this.helpText}</slot>
|
||||||
</slot>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
|
@ -329,12 +329,9 @@ export default class SlRadioGroup extends ShoelaceElement implements ShoelaceFor
|
||||||
const hasHelpText = this.helpText ? true : !!hasHelpTextSlot;
|
const hasHelpText = this.helpText ? true : !!hasHelpTextSlot;
|
||||||
|
|
||||||
const defaultSlot = html`
|
const defaultSlot = html`
|
||||||
<slot
|
<span @click=${this.handleRadioClick} @keydown=${this.handleKeyDown} role="presentation">
|
||||||
@click=${this.handleRadioClick}
|
<slot @slotchange=${this.syncRadios}></slot>
|
||||||
@keydown=${this.handleKeyDown}
|
</span>
|
||||||
@slotchange=${this.syncRadios}
|
|
||||||
role="presentation"
|
|
||||||
></slot>
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
|
@ -388,15 +385,14 @@ export default class SlRadioGroup extends ShoelaceElement implements ShoelaceFor
|
||||||
: defaultSlot}
|
: defaultSlot}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<slot
|
<div
|
||||||
name="help-text"
|
|
||||||
part="form-control-help-text"
|
part="form-control-help-text"
|
||||||
id="help-text"
|
id="help-text"
|
||||||
class="form-control__help-text"
|
class="form-control__help-text"
|
||||||
aria-hidden=${hasHelpText ? 'false' : 'true'}
|
aria-hidden=${hasHelpText ? 'false' : 'true'}
|
||||||
>
|
>
|
||||||
${this.helpText}
|
<slot name="help-text">${this.helpText}</slot>
|
||||||
</slot>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
`;
|
`;
|
||||||
/* eslint-enable lit-a11y/click-events-have-key-events */
|
/* eslint-enable lit-a11y/click-events-have-key-events */
|
||||||
|
|
|
@ -343,15 +343,14 @@ export default class SlRange extends ShoelaceElement implements ShoelaceFormCont
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<slot
|
<div
|
||||||
name="help-text"
|
|
||||||
part="form-control-help-text"
|
part="form-control-help-text"
|
||||||
id="help-text"
|
id="help-text"
|
||||||
class="form-control__help-text"
|
class="form-control__help-text"
|
||||||
aria-hidden=${hasHelpText ? 'false' : 'true'}
|
aria-hidden=${hasHelpText ? 'false' : 'true'}
|
||||||
>
|
>
|
||||||
${this.helpText}
|
<slot name="help-text">${this.helpText}</slot>
|
||||||
</slot>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
|
@ -835,15 +835,14 @@ export default class SlSelect extends ShoelaceElement implements ShoelaceFormCon
|
||||||
</sl-popup>
|
</sl-popup>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<slot
|
<div
|
||||||
name="help-text"
|
|
||||||
part="form-control-help-text"
|
part="form-control-help-text"
|
||||||
id="help-text"
|
id="help-text"
|
||||||
class="form-control__help-text"
|
class="form-control__help-text"
|
||||||
aria-hidden=${hasHelpText ? 'false' : 'true'}
|
aria-hidden=${hasHelpText ? 'false' : 'true'}
|
||||||
>
|
>
|
||||||
${this.helpText}
|
<slot name="help-text">${this.helpText}</slot>
|
||||||
</slot>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ export default class SlSpinner extends ShoelaceElement {
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return html`
|
return html`
|
||||||
<svg part="base" class="spinner" role="progressbar" aria-valuetext=${this.localize.term('loading')}>
|
<svg part="base" class="spinner" role="progressbar" aria-label=${this.localize.term('loading')}>
|
||||||
<circle class="spinner__track"></circle>
|
<circle class="spinner__track"></circle>
|
||||||
<circle class="spinner__indicator"></circle>
|
<circle class="spinner__indicator"></circle>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
|
@ -372,15 +372,14 @@ export default class SlTextarea extends ShoelaceElement implements ShoelaceFormC
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<slot
|
<div
|
||||||
name="help-text"
|
|
||||||
part="form-control-help-text"
|
part="form-control-help-text"
|
||||||
id="help-text"
|
id="help-text"
|
||||||
class="form-control__help-text"
|
class="form-control__help-text"
|
||||||
aria-hidden=${hasHelpText ? 'false' : 'true'}
|
aria-hidden=${hasHelpText ? 'false' : 'true'}
|
||||||
>
|
>
|
||||||
${this.helpText}
|
<slot name="help-text">${this.helpText}</slot>
|
||||||
</slot>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
|
@ -241,6 +241,12 @@ export default class SlTooltip extends ShoelaceElement {
|
||||||
return waitForEvent(this, 'sl-after-hide');
|
return waitForEvent(this, 'sl-after-hide');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE: Tooltip is a bit unique in that we're using aria-live instead of aria-labelledby to trick screen readers into
|
||||||
|
// announcing the content. It works really well, but it violates an accessibility rule. We're also adding the
|
||||||
|
// aria-describedby attribute to a slot, which is required by <sl-popup> to correctly locate the first assigned
|
||||||
|
// element, otherwise positioning is incorrect.
|
||||||
|
//
|
||||||
render() {
|
render() {
|
||||||
return html`
|
return html`
|
||||||
<sl-popup
|
<sl-popup
|
||||||
|
@ -261,18 +267,13 @@ export default class SlTooltip extends ShoelaceElement {
|
||||||
shift
|
shift
|
||||||
arrow
|
arrow
|
||||||
>
|
>
|
||||||
|
${'' /* eslint-disable-next-line lit-a11y/no-aria-slot */}
|
||||||
<slot slot="anchor" aria-describedby="tooltip"></slot>
|
<slot slot="anchor" aria-describedby="tooltip"></slot>
|
||||||
|
|
||||||
<slot
|
${'' /* eslint-disable-next-line lit-a11y/accessible-name */}
|
||||||
name="content"
|
<div part="body" id="tooltip" class="tooltip__body" role="tooltip" aria-live=${this.open ? 'polite' : 'off'}>
|
||||||
part="body"
|
<slot name="content">${this.content}</slot>
|
||||||
id="tooltip"
|
</div>
|
||||||
class="tooltip__body"
|
|
||||||
role="tooltip"
|
|
||||||
aria-live=${this.open ? 'polite' : 'off'}
|
|
||||||
>
|
|
||||||
${this.content}
|
|
||||||
</slot>
|
|
||||||
</sl-popup>
|
</sl-popup>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
|
@ -288,13 +288,9 @@ export default class SlTreeItem extends ShoelaceElement {
|
||||||
<slot class="tree-item__label" part="label"></slot>
|
<slot class="tree-item__label" part="label"></slot>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<slot
|
<div class="tree-item__children" part="children" role="group">
|
||||||
name="children"
|
<slot name="children" @slotchange="${this.handleChildrenSlotChange}"></slot>
|
||||||
class="tree-item__children"
|
</div>
|
||||||
part="children"
|
|
||||||
role="group"
|
|
||||||
@slotchange="${this.handleChildrenSlotChange}"
|
|
||||||
></slot>
|
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
|
@ -403,8 +403,8 @@ export default class SlTree extends ShoelaceElement {
|
||||||
@mousedown=${this.handleMouseDown}
|
@mousedown=${this.handleMouseDown}
|
||||||
>
|
>
|
||||||
<slot @slotchange=${this.handleSlotChange}></slot>
|
<slot @slotchange=${this.handleSlotChange}></slot>
|
||||||
<slot name="expand-icon" hidden aria-hidden="true"> </slot>
|
<span hidden aria-hidden="true"><slot name="expand-icon"></slot></span>
|
||||||
<slot name="collapse-icon" hidden aria-hidden="true"> </slot>
|
<span hidden aria-hidden="true"><slot name="collapse-icon"></slot></span>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue