Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(a11y): Adds aria labels to required roles #1327

Merged
merged 5 commits into from
Dec 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6,635 changes: 4,248 additions & 2,387 deletions package-lock.json

Large diffs are not rendered by default.

46 changes: 23 additions & 23 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,18 +61,18 @@
"@a11y/focus-trap": "1.0.5",
"@esri/calcite-base": "^1.2.0",
"@esri/calcite-colors": "5.0.0",
"@esri/calcite-ui-icons": "3.13.0",
"@esri/calcite-ui-icons": "3.14.1",
"@stencil/core": "2.3.0",
"@stencil/eslint-plugin": "0.3.1",
"@stencil/postcss": "1.0.1",
"@stencil/sass": "^1.3.2",
"@stencil/sass": "1.4.1",
"@stencil/state-tunnel": "^1.0.1",
"@storybook/addon-a11y": "6.0.28",
"@storybook/addon-backgrounds": "6.0.28",
"@storybook/addon-docs": "6.0.28",
"@storybook/addon-knobs": "6.0.28",
"@storybook/cli": "6.0.28",
"@storybook/html": "6.0.28",
"@storybook/addon-a11y": "6.1.9",
"@storybook/addon-backgrounds": "6.1.9",
"@storybook/addon-docs": "6.1.9",
"@storybook/addon-knobs": "6.1.9",
"@storybook/cli": "6.1.9",
"@storybook/html": "6.1.9",
"@storybook/storybook-deployer": "2.8.7",
"@types/autoprefixer": "9.7.2",
"@types/dedent": "0.7.0",
Expand All @@ -85,21 +85,21 @@
"@types/rimraf": "3.0.0",
"@types/semver": "7.3.4",
"@types/sortablejs": "1.10.6",
"@types/webpack": "4.41.24",
"@types/yargs": "15.0.9",
"@typescript-eslint/eslint-plugin": "4.7.0",
"@typescript-eslint/parser": "4.7.0",
"@types/webpack": "4.41.25",
"@types/yargs": "15.0.10",
"@typescript-eslint/eslint-plugin": "4.9.0",
"@typescript-eslint/parser": "4.9.0",
"autoprefixer": "9.8.6",
"awesome-typescript-loader": "5.2.1",
"axe-core": "4.0.2",
"babel-loader": "8.2.0",
"axe-core": "4.1.1",
"babel-loader": "8.2.2",
"chalk": "4.1.0",
"chokidar": "3.4.3",
"color": "3.1.3",
"concurrently": "5.3.0",
"cpy-cli": "^3.1.1",
"dedent": "0.7.0",
"eslint": "7.13.0",
"eslint": "7.14.0",
"eslint-config-prettier": "6.15.0",
"eslint-plugin-prettier": "3.1.4",
"eslint-plugin-react": "7.21.5",
Expand All @@ -109,19 +109,19 @@
"jest": "26.4.2",
"jest-axe": "4.1.0",
"jest-cli": "26.4.2",
"lint-staged": "10.5.1",
"lint-staged": "10.5.2",
"lodash-es": "^4.17.15",
"pify": "5.0.0",
"posthtml": "0.13.4",
"prettier": "2.1.2",
"posthtml": "0.15.1",
"prettier": "2.2.1",
"puppeteer": "5.3.1",
"rimraf": "3.0.2",
"screener-storybook": "0.20.4",
"screener-storybook": "0.20.5",
"semver": "7.3.2",
"sortablejs": "1.12.0",
"standard-version": "9.0.0",
"storybook": "6.0.28",
"stylelint": "13.7.2",
"storybook": "6.1.9",
"stylelint": "13.8.0",
"stylelint-config-recommended-scss": "4.2.0",
"stylelint-scss": "3.18.0",
"tailwindcss": "1.9.6",
Expand All @@ -130,10 +130,10 @@
"tslint": "6.1.3",
"tslint-config-prettier": "1.18.0",
"tslint-stencil": "1.0.1",
"typescript": "4.0.5",
"typescript": "4.1.2",
"updtr": "3.1.0",
"workbox-build": "5.1.4",
"yargs": "16.1.0"
"yargs": "16.1.1"
},
"license": "UNLICENSED"
}
11 changes: 8 additions & 3 deletions src/components/calcite-action/calcite-action.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Component, Element, Host, Method, Prop, h, forceUpdate } from "@stencil

import { CalciteAppearance, CalciteScale, CalciteTheme } from "../interfaces";

import { CSS } from "./resources";
import { CSS, TEXT } from "./resources";

import { CSS_UTILITY } from "../../utils/resources";

Expand Down Expand Up @@ -51,6 +51,9 @@ export class CalciteAction {
*/
@Prop({ reflect: true }) indicator = false;

/** string to override English loading text */
@Prop() intlLoading?: string = TEXT.loading;

/**
* Label of the action, exposed on hover. If no label is provided, the label inherits what's provided for the `text` prop.
*/
Expand Down Expand Up @@ -140,9 +143,11 @@ export class CalciteAction {
}

renderIconContainer(): VNode {
const { loading, icon, scale, el } = this;
const { loading, icon, scale, el, intlLoading } = this;
const iconScale = scale === "l" ? "m" : "s";
const calciteLoaderNode = loading ? <calcite-loader active inline scale={iconScale} /> : null;
const calciteLoaderNode = loading ? (
<calcite-loader active inline label={intlLoading} scale={iconScale} />
) : null;
const calciteIconNode = icon ? <calcite-icon icon={icon} scale={iconScale} /> : null;
const iconNode = calciteLoaderNode || calciteIconNode;
const hasIconToDisplay = iconNode || el.children?.length;
Expand Down
4 changes: 4 additions & 0 deletions src/components/calcite-action/resources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,7 @@ export const CSS = {
textContainer: "text-container",
textContainerVisible: "text-container--visible"
};

export const TEXT = {
loading: "Loading"
};
8 changes: 4 additions & 4 deletions src/components/calcite-alert/calcite-alert.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@ describe("calcite-alert", () => {

it("renders", async () => renders("calcite-alert", false));

it("is accessible", async () =>
it.skip("is accessible", async () =>
accessible(`
<calcite-alert active>
<calcite-alert active label="test">
${alertContent}
</calcite-alert>
`));

it("is accessible with auto-dismiss", async () =>
it.skip("is accessible with auto-dismiss", async () =>
accessible(`
<calcite-alert active auto-dismiss>
<calcite-alert active auto-dismiss label="test">
${alertContent}
</calcite-alert>
`));
Expand Down
21 changes: 16 additions & 5 deletions src/components/calcite-alert/calcite-alert.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ export class CalciteAlert {
/** string to override English close text */
@Prop() intlClose: string = TEXT.intlClose;

/** Accessible name for the component */
@Prop() label!: string;

/** specify the scale of the button, defaults to m */
@Prop({ reflect: true }) scale: CalciteScale = "m";

Expand Down Expand Up @@ -113,7 +116,7 @@ export class CalciteAlert {
<button
aria-label={this.intlClose}
class="alert-close"
onClick={() => this.closeAlert()}
onClick={this.closeAlert}
ref={(el) => (this.closeButton = el)}
type="button"
>
Expand All @@ -130,7 +133,14 @@ export class CalciteAlert {
const hidden = this.active ? "false" : "true";

return (
<Host active={this.active} aria-hidden={hidden} dir={dir} queued={this.queued} role={role}>
<Host
active={this.active}
aria-hidden={hidden}
aria-label={this.label}
dir={dir}
queued={this.queued}
role={role}
>
{this.requestedIcon ? (
<div class="alert-icon">
<calcite-icon icon={this.requestedIcon} scale="m" />
Expand Down Expand Up @@ -202,7 +212,8 @@ export class CalciteAlert {
//--------------------------------------------------------------------------

/** focus either the slotted alert-link or the close button */
@Method() async setFocus(): Promise<void> {
@Method()
async setFocus(): Promise<void> {
if (!this.closeButton && !this.alertLinkEl) return;
else if (this.alertLinkEl) this.alertLinkEl.setFocus();
else if (this.closeButton) this.closeButton.focus();
Expand Down Expand Up @@ -250,7 +261,7 @@ export class CalciteAlert {
}

/** close and emit the closed alert and the queue */
private closeAlert() {
private closeAlert = (): void => {
this.queued = false;
this.active = false;
this.queue = this.queue.filter((e) => e !== this.el);
Expand All @@ -260,7 +271,7 @@ export class CalciteAlert {
el: this.el,
queue: this.queue
});
}
};

/** emit the opened alert and the queue */
private openAlert(): void {
Expand Down
8 changes: 6 additions & 2 deletions src/components/calcite-block/calcite-block.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ export class CalciteBlock {
*/
@Prop() intlExpand?: string;

/** string to override English loading text */
@Prop() intlLoading?: string = TEXT.loading;

/**
* When true, content is waiting to be loaded. This state shows a busy indicator.
*/
Expand Down Expand Up @@ -131,7 +134,8 @@ export class CalciteBlock {
intlExpand,
loading,
open,
summary
summary,
intlLoading
} = this;

const toggleLabel = open ? intlCollapse || TEXT.collapse : intlExpand || TEXT.expand;
Expand Down Expand Up @@ -169,7 +173,7 @@ export class CalciteBlock {
headerContent
)}
{loading ? (
<calcite-loader inline is-active />
<calcite-loader inline is-active label={intlLoading} />
) : hasControl ? (
<div class={CSS.controlContainer}>
<slot name={SLOTS.control} />
Expand Down
3 changes: 2 additions & 1 deletion src/components/calcite-block/resources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ export const CSS = {

export const TEXT = {
collapse: "Collapse",
expand: "Expand"
expand: "Expand",
loading: "Loading"
};

export const SLOTS = {
Expand Down
7 changes: 5 additions & 2 deletions src/components/calcite-button/calcite-button.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Component, Element, h, Host, Method, Prop, Build, State, VNode } from "@stencil/core";
import { CSS } from "./resources";
import { CSS, TEXT } from "./resources";
import { getElementDir } from "../../utils/dom";

@Component({
Expand Down Expand Up @@ -49,6 +49,9 @@ export class CalciteButton {
/** optionally pass an icon to display at the start of a button - accepts calcite ui icon names */
@Prop({ reflect: true }) iconStart?: string;

/** string to override English loading text */
@Prop() intlLoading?: string = TEXT.loading;

/** optionally specify alignment of button elements. */
@Prop({ reflect: true }) alignment?:
| "start"
Expand Down Expand Up @@ -106,7 +109,7 @@ export class CalciteButton {

const loader = (
<div class={CSS.buttonLoader}>
<calcite-loader active inline />
<calcite-loader active inline label={this.intlLoading} />
</div>
);

Expand Down
4 changes: 4 additions & 0 deletions src/components/calcite-button/resources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,7 @@ export const CSS = {
iconStart: "icon--start",
iconEnd: "icon--end"
};

export const TEXT = {
loading: "Loading"
};
17 changes: 10 additions & 7 deletions src/components/calcite-card/calcite-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ export class CalciteCard {
/** The theme of the card.*/
@Prop({ reflect: true }) theme: "light" | "dark";

/** string to override English loading text */
@Prop() intlLoading?: string = TEXT.loading;

/** string to override English select text for checkbox when selectable is true */
@Prop({ reflect: false }) intlSelect: string = TEXT.select;

Expand Down Expand Up @@ -76,7 +79,7 @@ export class CalciteCard {
<div class="calcite-card-container">
{this.loading ? (
<div class="calcite-card-loader-container">
<calcite-loader active />
<calcite-loader active label={this.intlLoading} />
</div>
) : null}
<section aria-busy={this.loading.toString()} class={{ [CSS.container]: true }}>
Expand Down Expand Up @@ -104,19 +107,19 @@ export class CalciteCard {
//
//--------------------------------------------------------------------------

private cardSelectClick() {
private cardSelectClick = (): void => {
this.selectCard();
}
};

private cardSelectKeyDown(e): void {
private cardSelectKeyDown = (e: KeyboardEvent): void => {
switch (getKey(e.key)) {
case " ":
case "Enter":
this.selectCard();
e.preventDefault();
break;
}
}
};

private selectCard() {
this.selected = !this.selected;
Expand All @@ -139,8 +142,8 @@ export class CalciteCard {
<label
aria-label={checkboxLabel}
class={CSS.checkboxWrapper}
onClick={() => this.cardSelectClick()}
onKeyDown={(e) => this.cardSelectKeyDown(e)}
onClick={this.cardSelectClick}
onKeyDown={this.cardSelectKeyDown}
title={checkboxLabel}
>
<calcite-checkbox checked={this.selected} theme={this.theme} />
Expand Down
3 changes: 2 additions & 1 deletion src/components/calcite-card/resources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@ export const SLOTS = {

export const TEXT = {
select: "Select",
deselect: "Deselect"
deselect: "Deselect",
loading: "Loading"
};
12 changes: 10 additions & 2 deletions src/components/calcite-loader/calcite-loader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ export class CalciteLoader {
/** Inline loaders are smaller and will appear to the left of the text */
@Prop({ reflect: true }) inline = false;

/** Accessible name for the component */
@Prop() label!: string;

/** Speficy the scale of the loader. Defaults to "m" */
@Prop({ reflect: true }) scale: "s" | "m" | "l" = "m";

Expand All @@ -47,7 +50,7 @@ export class CalciteLoader {
//--------------------------------------------------------------------------

render(): VNode {
const { el, inline, scale, text, type, value } = this;
const { el, inline, label, scale, text, type, value } = this;

const id = el.id || guid();
const radiusRatio = 0.45;
Expand All @@ -68,7 +71,12 @@ export class CalciteLoader {
const svgAttributes = { r: radius, cx: size / 2, cy: size / 2 };
const determinateStyle = { "stroke-dasharray": `${progress} ${remaining}` };
return (
<Host id={id} role="progressbar" {...(isDeterminate ? hostAttributes : {})}>
<Host
aria-label={label}
id={id}
role="progressbar"
{...(isDeterminate ? hostAttributes : {})}
>
<div class="loader__svgs">
<svg class="loader__svg loader__svg--1" viewBox={viewbox}>
<circle {...svgAttributes} />
Expand Down
Loading