Skip to content

Commit e3647e1

Browse files
committed
docs: improve styling filters
close #30911
1 parent 6d2560b commit e3647e1

File tree

2 files changed

+57
-9
lines changed

2 files changed

+57
-9
lines changed

docs/src/app/pages/component-viewer/token-table.html

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,37 @@
1010

1111
<mat-form-field subscriptSizing="dynamic" appearance="outline">
1212
<mat-label>Filter by type</mat-label>
13-
<mat-select [value]="typeFilter()" (selectionChange)="typeFilter.set($event.value)">
13+
<mat-select [(value)]="typeFilter">
1414
@for (type of types; track $index) {
1515
<mat-option [value]="type">{{type | titlecase}}</mat-option>
1616
}
1717
</mat-select>
18+
@if (typeFilter()) {
19+
<button matSuffix matIconButton aria-label="Clear type filter" matTooltip="Clear type filter"
20+
(click)="typeFilter.set(null); $event.stopPropagation()">
21+
<mat-icon>clear</mat-icon>
22+
</button>
23+
}
24+
</mat-form-field>
25+
26+
<mat-form-field subscriptSizing="dynamic" appearance="outline">
27+
<mat-label>Filter by system token</mat-label>
28+
<input #systemTokenInput matInput [matAutocomplete]="systemTokenAutocomplete"
29+
[value]="systemTokenFilter()"
30+
(input)="systemTokenFilter.set(systemTokenInput.value)"/>
31+
<mat-autocomplete autoActiveFirstOption #systemTokenAutocomplete="matAutocomplete"
32+
(optionSelected)="systemTokenFilter.set(systemTokenInput.value)">
33+
@for (systemToken of systemTokens(); track systemToken) {
34+
<mat-option [value]="systemToken">{{systemToken}}</mat-option>
35+
}
36+
</mat-autocomplete>
37+
@if (systemTokenFilter()) {
38+
<button matSuffix matIconButton aria-label="Clear system token filter"
39+
matTooltip="Clear system token filter"
40+
(click)="systemTokenFilter.set(''); $event.stopPropagation()">
41+
<mat-icon>clear</mat-icon>
42+
</button>
43+
}
1844
</mat-form-field>
1945

2046
<button mat-button (click)="reset()">Reset filters</button>

docs/src/app/pages/component-viewer/token-table.ts

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@
88

99
import {ChangeDetectionStrategy, Component, computed, input, signal} from '@angular/core';
1010
import {TitleCasePipe} from '@angular/common';
11-
import {MatButton} from '@angular/material/button';
12-
import {MatFormField, MatLabel} from '@angular/material/form-field';
11+
import {MatAutocomplete, MatAutocompleteTrigger} from '@angular/material/autocomplete';
12+
import {MatButton, MatIconButton} from '@angular/material/button';
13+
import {MatFormField, MatLabel, MatSuffix} from '@angular/material/form-field';
14+
import {MatIcon} from '@angular/material/icon';
1315
import {MatInput} from '@angular/material/input';
1416
import {MatOption, MatSelect} from '@angular/material/select';
17+
import {MatTooltip} from '@angular/material/tooltip';
1518
import {TokenName} from './token-name';
1619

1720
type TokenType = 'base' | 'color' | 'typography' | 'density';
@@ -30,35 +33,54 @@ export interface Token {
3033
styleUrl: './token-table.scss',
3134
changeDetection: ChangeDetectionStrategy.OnPush,
3235
imports: [
36+
MatAutocomplete,
37+
MatAutocompleteTrigger,
3338
MatButton,
39+
MatIconButton,
3440
MatFormField,
3541
MatLabel,
42+
MatSuffix,
43+
MatIcon,
3644
MatInput,
3745
MatSelect,
3846
MatOption,
47+
MatTooltip,
3948
TokenName,
4049
TitleCasePipe,
4150
],
4251
})
4352
export class TokenTable {
44-
tokens = input.required<Token[]>();
53+
readonly tokens = input.required<Token[]>();
4554

46-
protected nameFilter = signal('');
47-
protected typeFilter = signal<TokenType | null>(null);
48-
protected types: TokenType[] = ['base', 'color', 'typography', 'density'];
49-
protected filteredTokens = computed(() => {
55+
protected readonly nameFilter = signal('');
56+
protected readonly typeFilter = signal<TokenType | null>(null);
57+
protected readonly systemTokenFilter = signal('');
58+
protected readonly types: TokenType[] = ['base', 'color', 'typography', 'density'];
59+
protected readonly systemTokens = computed(() => {
60+
return [
61+
...new Set(
62+
this.tokens()
63+
.map(token => token.derivedFrom)
64+
.filter(Boolean),
65+
),
66+
];
67+
});
68+
protected readonly filteredTokens = computed(() => {
5069
const name = this.nameFilter().trim().toLowerCase();
5170
const typeFilter = this.typeFilter();
71+
const systemTokenFilter = this.systemTokenFilter();
5272

5373
return this.tokens().filter(
5474
token =>
5575
(!name || token.overridesName.toLowerCase().includes(name)) &&
56-
(!typeFilter || token.type === typeFilter),
76+
(!typeFilter || token.type === typeFilter) &&
77+
(!systemTokenFilter || token.derivedFrom?.toLowerCase().includes(systemTokenFilter)),
5778
);
5879
});
5980

6081
protected reset() {
6182
this.nameFilter.set('');
6283
this.typeFilter.set(null);
84+
this.systemTokenFilter.set('');
6385
}
6486
}

0 commit comments

Comments
 (0)