Skip to content

Commit 9b00fdc

Browse files
authored
feat: allow labels to be hidden but accessible by screen readers (#2920)
Signed-off-by: Akshat Patel <[email protected]>
1 parent 9135eeb commit 9b00fdc

File tree

6 files changed

+28
-3
lines changed

6 files changed

+28
-3
lines changed

src/combobox/combobox.component.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ import { Observable } from "rxjs";
4646
[for]="id"
4747
[id]="labelId"
4848
class="cds--label"
49-
[ngClass]="{'cds--label--disabled': disabled}">
49+
[ngClass]="{
50+
'cds--label--disabled': disabled,
51+
'cds--visually-hidden': hideLabel
52+
}">
5053
<ng-container *ngIf="!isTemplate(label)">{{label}}</ng-container>
5154
<ng-template *ngIf="isTemplate(label)" [ngTemplateOutlet]="label"></ng-template>
5255
</label>
@@ -303,6 +306,10 @@ export class ComboBox implements OnChanges, AfterViewInit, AfterContentInit, OnD
303306
* Label for the combobox.
304307
*/
305308
@Input() label: string | TemplateRef<any>;
309+
/**
310+
* Hide label while keeping it accessible for screen readers
311+
*/
312+
@Input() hideLabel = false;
306313
/**
307314
* Sets the optional helper text.
308315
*/

src/combobox/combobox.stories.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export default {
2828
],
2929
args: {
3030
label: "Label",
31+
hideLabel: false,
3132
helperText: "Optional helper text",
3233
disabled: false,
3334
invalid: false,
@@ -111,6 +112,7 @@ const Template = (args) => ({
111112
[warn]="warn"
112113
[warnText]="warnText"
113114
[label]="label"
115+
[hideLabel]="hideLabel"
114116
[helperText]="helperText"
115117
[items]="items"
116118
[theme]="theme"
@@ -180,6 +182,7 @@ const MultiTemplate = (args) => ({
180182
[invalid]="invalid"
181183
[invalidText]="invalidText"
182184
[label]="label"
185+
[hideLabel]="hideLabel"
183186
[warn]="warn"
184187
[disabled]="disabled"
185188
[size]="size"

src/dropdown/dropdown.component.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ import { hasScrollableParents } from "carbon-components-angular/utils";
5959
*ngIf="label && !skeleton"
6060
[for]="id"
6161
class="cds--label"
62-
[ngClass]="{'cds--label--disabled': disabled}">
62+
[ngClass]="{
63+
'cds--label--disabled': disabled,
64+
'cds--visually-hidden': hideLabel
65+
}">
6366
<ng-container *ngIf="!isTemplate(label)">{{label}}</ng-container>
6467
<ng-template *ngIf="isTemplate(label)" [ngTemplateOutlet]="label"></ng-template>
6568
</label>
@@ -183,6 +186,10 @@ export class Dropdown implements OnInit, AfterContentInit, AfterViewInit, OnDest
183186
* Label for the dropdown.
184187
*/
185188
@Input() label: string | TemplateRef<any>;
189+
/**
190+
* Hide label while keeping it accessible for screen readers
191+
*/
192+
@Input() hideLabel = false;
186193
/**
187194
* Sets the optional helper text.
188195
*/

src/dropdown/dropdown.stories.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export default {
2222
],
2323
args: {
2424
label: "Label",
25+
hideLabel: false,
2526
helperText: "Optional helper text",
2627
disabled: false,
2728
invalid: false,
@@ -88,6 +89,7 @@ const Template = (args) => ({
8889
template: `
8990
<cds-dropdown
9091
[label]="label"
92+
[hideLabel]="hideLabel"
9193
[skeleton]="skeleton"
9294
[helperText]="helperText"
9395
[size]="size"
@@ -115,6 +117,7 @@ const MultiTemplate = (args) => ({
115117
[selectionFeedback]="selectionFeedback"
116118
[(ngModel)]="model"
117119
[label]="label"
120+
[hideLabel]="hideLabel"
118121
[helperText]="helperText"
119122
[size]="size"
120123
[dropUp]="dropUp"
@@ -144,6 +147,7 @@ const ReactiveTemplate = (args) => ({
144147
-->
145148
<app-reactive-forms
146149
[label]="label"
150+
[hideLabel]="hideLabel"
147151
[helperText]="helperText"
148152
[invalid]="invalid"
149153
[invalidText]="invalidText"
@@ -161,6 +165,8 @@ const NgTemplate = (args) => ({
161165
props: args,
162166
template: `
163167
<cds-dropdown
168+
[label]="label"
169+
[hideLabel]="hideLabel"
164170
[theme]="theme"
165171
placeholder="Select"
166172
[displayValue]="dropdownRenderer"

src/dropdown/stories/app-reactive-forms.component.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
<div style="width: 300px">
1919
<cds-dropdown
2020
[label]="label"
21+
[hideLabel]="hideLabel"
2122
[helperText]="helperText"
2223
[invalid]="invalid"
2324
[invalidText]="invalidText"
@@ -41,6 +42,7 @@ export class ReactiveFormsStory implements OnInit {
4142

4243
@Input() items = [];
4344
@Input() label = "";
45+
@Input() hideLabel = false;
4446
@Input() helperText = "";
4547
@Input() invalid = false;
4648
@Input() invalidText = "";

src/input/password.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { Tooltip } from "../tooltip";
1515
})
1616
class TestPasswordInputComponent {}
1717

18-
fdescribe("Password", () => {
18+
describe("Password", () => {
1919
let fixture: ComponentFixture<TestPasswordInputComponent>;
2020
let component: TestPasswordInputComponent;
2121
let passwordEl: DebugElement;

0 commit comments

Comments
 (0)