Skip to content

Commit 483d56f

Browse files
asynclizcopybara-github
authored andcommitted
feat(labs): add expressive icon component
PiperOrigin-RevId: 906605113
1 parent 917e080 commit 483d56f

10 files changed

Lines changed: 69 additions & 7 deletions

File tree

icon/internal/icon.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import {html, LitElement} from 'lit';
88

99
/**
10-
* TODO(b/265336902): add docs
10+
* An icon element.
1111
*/
1212
export class Icon extends LitElement {
1313
protected override render() {

labs/gb/components/fab/demo/stories.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import '@material/web/icon/icon.js';
87
import '@material/web/labs/gb/components/fab/md-fab.js';
8+
import '@material/web/labs/gb/styles/icon/md-icon.js';
99

1010
import {MaterialStoryInit} from './material-collection.js';
1111
import {FabColor, FabSize} from '@material/web/labs/gb/components/fab/fab.js';

labs/gb/components/iconbutton/demo/stories.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import '@material/web/icon/icon.js';
87
import '@material/web/labs/gb/components/iconbutton/md-icon-button.js';
8+
import '@material/web/labs/gb/styles/icon/md-icon.js';
99

1010
import {MaterialStoryInit} from './material-collection.js';
1111
import {

labs/gb/components/list/demo/stories.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import '@material/web/icon/icon.js';
87
import '@material/web/labs/gb/components/list/md-list.js';
98
import '@material/web/labs/gb/components/list/md-list-item.js';
9+
import '@material/web/labs/gb/styles/icon/md-icon.js';
1010

1111
import {MaterialStoryInit} from './material-collection.js';
1212
import {styles as checkboxStyles} from '@material/web/labs/gb/components/checkbox/checkbox.cssresult.js';

labs/gb/components/switch/demo/stories.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import '@material/web/icon/icon.js';
87
import '@material/web/labs/gb/components/switch/md-switch.js';
8+
import '@material/web/labs/gb/styles/icon/md-icon.js';
99

1010
import {MaterialStoryInit} from './material-collection.js';
1111
import {adoptStyles} from '@material/web/labs/gb/styles/adopt-styles.js';

labs/gb/styles/icon/md-icon.scss

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
}
4141

4242
@layer md.sys.icon {
43-
.md-icon {
43+
.md-icon,
44+
:host(.md-icon) {
4445
display: inline-flex;
4546
place-items: center;
4647
place-content: center;

labs/gb/styles/icon/md-icon.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* @license
3+
* Copyright 2026 Google LLC
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
import {type CSSResultOrNative} from 'lit';
8+
import {customElement} from 'lit/decorators.js';
9+
import {Icon as IconBase} from '../../../../icon/internal/icon.js';
10+
11+
import iconStyles from './md-icon.css' with {type: 'css'}; // github-only
12+
// import iconStyles from './md-icon.cssresult.js'; // google3-only
13+
14+
declare global {
15+
interface HTMLElementTagNameMap {
16+
/** A Material Design icon component. */
17+
'md-icon': Icon;
18+
}
19+
}
20+
21+
/**
22+
* A Material Design icon component.
23+
*/
24+
@customElement('md-icon')
25+
export class Icon extends IconBase {
26+
static override styles: CSSResultOrNative[] = [iconStyles];
27+
28+
override connectedCallback() {
29+
super.connectedCallback();
30+
this.classList.add('md-icon');
31+
}
32+
}

labs/gb/styles/m3.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@
99
@import 'icon/md-icon';
1010
@import 'motion/md-motion-tokens-easing';
1111
@import 'shape/md-shape-tokens';
12+
@import 'space/md-space-tokens';
1213
@import 'typography/md-typography-tokens';
1314
// go/keep-sorted end
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*!
2+
* Copyright 2026 Google LLC
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
@layer md.sys.space {
7+
:root {
8+
--md-sys-space-unit: 8px;
9+
--md-sys-space-0: calc(var(--md-sys-space-unit) * 0);
10+
--md-sys-space-25: calc(var(--md-sys-space-unit) * 0.25);
11+
--md-sys-space-50: calc(var(--md-sys-space-unit) * 0.5);
12+
--md-sys-space-75: calc(var(--md-sys-space-unit) * 0.75);
13+
--md-sys-space-100: var(--md-sys-space-unit);
14+
--md-sys-space-125: calc(var(--md-sys-space-unit) * 1.25);
15+
--md-sys-space-150: calc(var(--md-sys-space-unit) * 1.5);
16+
--md-sys-space-175: calc(var(--md-sys-space-unit) * 1.75);
17+
--md-sys-space-200: calc(var(--md-sys-space-unit) * 2);
18+
--md-sys-space-250: calc(var(--md-sys-space-unit) * 2.5);
19+
--md-sys-space-300: calc(var(--md-sys-space-unit) * 3);
20+
--md-sys-space-400: calc(var(--md-sys-space-unit) * 4);
21+
--md-sys-space-450: calc(var(--md-sys-space-unit) * 4.5);
22+
--md-sys-space-500: calc(var(--md-sys-space-unit) * 5);
23+
--md-sys-space-600: calc(var(--md-sys-space-unit) * 6);
24+
--md-sys-space-700: calc(var(--md-sys-space-unit) * 7);
25+
--md-sys-space-800: calc(var(--md-sys-space-unit) * 8);
26+
--md-sys-space-900: calc(var(--md-sys-space-unit) * 9);
27+
}
28+
}

labs/gb/styles/tailwind.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@
135135
--shadow-2xl: initial; // Material does not have a 2xl shadow.
136136

137137
// Space
138-
--spacing: 8px;
138+
--spacing: var(--md-sys-space-unit);
139139

140140
// Breakpoints
141141
--breakpoint-sm: 600px; // medium

0 commit comments

Comments
 (0)