feat(form-core): allow [label-sr-only] on FormControl
This commit is contained in:
parent
1ae8f16ab7
commit
90b0d3b114
2 changed files with 58 additions and 0 deletions
|
|
@ -43,6 +43,7 @@ const FormControlMixinImplementation = superclass =>
|
||||||
name: { type: String, reflect: true },
|
name: { type: String, reflect: true },
|
||||||
readOnly: { type: Boolean, attribute: 'readonly', reflect: true },
|
readOnly: { type: Boolean, attribute: 'readonly', reflect: true },
|
||||||
label: String, // FIXME: { attribute: false } breaks a bunch of tests, but shouldn't...
|
label: String, // FIXME: { attribute: false } breaks a bunch of tests, but shouldn't...
|
||||||
|
labelSrOnly: { type: Boolean, attribute: 'label-sr-only', reflect: true },
|
||||||
helpText: { type: String, attribute: 'help-text' },
|
helpText: { type: String, attribute: 'help-text' },
|
||||||
modelValue: { attribute: false },
|
modelValue: { attribute: false },
|
||||||
_ariaLabelledNodes: { attribute: false },
|
_ariaLabelledNodes: { attribute: false },
|
||||||
|
|
@ -186,6 +187,12 @@ const FormControlMixinImplementation = superclass =>
|
||||||
*/
|
*/
|
||||||
this.label = '';
|
this.label = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The label will only be visible for srceen readers when true
|
||||||
|
* @type {boolean}
|
||||||
|
*/
|
||||||
|
this.labelSrOnly = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The helpt text for the input node.
|
* The helpt text for the input node.
|
||||||
* When no value is defined, textContent of [slot=help-text] will be used
|
* When no value is defined, textContent of [slot=help-text] will be used
|
||||||
|
|
@ -699,6 +706,20 @@ const FormControlMixinImplementation = superclass =>
|
||||||
color: var(--disabled-text-color, #767676);
|
color: var(--disabled-text-color, #767676);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:host([label-sr-only]) .form-field__label {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
overflow: hidden;
|
||||||
|
clip-path: inset(100%);
|
||||||
|
clip: rect(1px, 1px, 1px, 1px);
|
||||||
|
white-space: nowrap;
|
||||||
|
border: 0;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************
|
/***********************
|
||||||
{block} .input-group
|
{block} .input-group
|
||||||
*********************/
|
*********************/
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,43 @@ describe('FormControlMixin', () => {
|
||||||
expect(el.label).to.equal('');
|
expect(el.label).to.equal('');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* N.B. For platform controls, the same would be achieved with <input aria-label="My label">
|
||||||
|
* However, since FormControl is usually not the activeElement (_inputNode is), this
|
||||||
|
* will not have the desired effect on for instance lion-input
|
||||||
|
*/
|
||||||
|
it('supports "label-sr-only" to make label visually hidden, but accessible for screen reader users', async () => {
|
||||||
|
const el = /** @type {FormControlMixinClass} */ (
|
||||||
|
await fixture(html`
|
||||||
|
<${tag} label-sr-only>
|
||||||
|
<label slot="label">Email <span>address</span></label>
|
||||||
|
${inputSlot}
|
||||||
|
</${tag}>`)
|
||||||
|
);
|
||||||
|
|
||||||
|
const expectedValues = {
|
||||||
|
position: 'absolute',
|
||||||
|
top: '0px',
|
||||||
|
width: '1px',
|
||||||
|
height: '1px',
|
||||||
|
overflow: 'hidden',
|
||||||
|
clipPath: 'inset(100%)',
|
||||||
|
clip: 'rect(1px, 1px, 1px, 1px)',
|
||||||
|
whiteSpace: 'nowrap',
|
||||||
|
borderWidth: '0px',
|
||||||
|
margin: '0px',
|
||||||
|
padding: '0px',
|
||||||
|
};
|
||||||
|
|
||||||
|
const labelStyle = window.getComputedStyle(
|
||||||
|
// @ts-ignore
|
||||||
|
el.shadowRoot?.querySelector('.form-field__label'),
|
||||||
|
);
|
||||||
|
Object.entries(expectedValues).forEach(([key, val]) => {
|
||||||
|
expect(labelStyle[key]).to.equal(val);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('can have a help-text', async () => {
|
it('can have a help-text', async () => {
|
||||||
const elAttr = /** @type {FormControlMixinClass} */ (
|
const elAttr = /** @type {FormControlMixinClass} */ (
|
||||||
await fixture(html`
|
await fixture(html`
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue