Skip to content

Commit da7e850

Browse files
vaadin-botjouni
andauthored
refactor: align icon on the baseline, force it to be a flex container (#10619) (#10679)
Co-authored-by: Jouni Koivuviita <jouni@vaadin.com>
1 parent 5bc5f01 commit da7e850

File tree

14 files changed

+50
-26
lines changed

14 files changed

+50
-26
lines changed

dev/icon.html

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import '@vaadin/icons/vaadin-iconset.js';
1414
import '@vaadin/tooltip';
1515
import { Iconset } from '@vaadin/icon/vaadin-iconset.js';
16+
import { iconFontCss } from '../packages/icon/test/test-icon-font.js';
1617

1718
const template = document.createElement('template');
1819
template.innerHTML = `
@@ -34,11 +35,30 @@
3435
`;
3536

3637
Iconset.register('my-icons-iconset', 32, template);
38+
39+
const fontIconStyle = document.createElement('style');
40+
fontIconStyle.textContent = iconFontCss;
41+
document.head.append(fontIconStyle);
3742
</script>
3843

3944
<style>
4045
h6 {
41-
margin-top: var(--lumo-space-m);
46+
margin-top: var(--vaadin-gap-m);
47+
margin-bottom: var(--vaadin-gap-xs);
48+
}
49+
50+
vaadin-icon {
51+
outline: 1px dotted red;
52+
}
53+
54+
.baseline {
55+
--vaadin-icon-size: 100px;
56+
font-size: 100px;
57+
}
58+
59+
.baseline .my-icon-font {
60+
line-height: inherit;
61+
vertical-align: baseline;
4262
}
4363
</style>
4464
</head>
@@ -69,6 +89,15 @@ <h6>SVG Sprite</h6>
6989

7090
<h6>SVG Data</h6>
7191
<vaadin-icon id="icon-data"></vaadin-icon>
92+
93+
<h6>Baseline</h6>
94+
<div class="baseline">
95+
<vaadin-icon icon="vaadin:phone"></vaadin-icon>
96+
<vaadin-icon icon="my-icons-iconset:logo"></vaadin-icon>
97+
<vaadin-icon font-family="lumo-icons" char="ea0e"></vaadin-icon>
98+
<vaadin-icon icon-class="my-icon-font icon-before"></vaadin-icon>
99+
</div>
100+
72101
<script>
73102
const iconData = document.querySelector('#icon-data');
74103
iconData.src = `data:image/svg+xml,${encodeURIComponent(

packages/aura/src/typography.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
--aura-font-family-instrument-sans: 'Instrument Sans', var(--aura-font-family-system);
77

88
--aura-font-family: var(--aura-font-family-instrument-sans);
9+
--vaadin-icon-baseline-font-family: var(--aura-font-family);
910

1011
--aura-base-font-size: 14;
1112
--aura-base-line-height: 1.4;

packages/icon/src/styles/vaadin-icon-base-styles.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import { css } from 'lit';
77

88
export const iconStyles = css`
99
:host {
10-
display: inline-flex;
11-
justify-content: center;
12-
align-items: center;
10+
display: inline-flex !important;
11+
justify-content: center !important;
12+
align-items: center !important;
13+
font-size: inherit !important;
1314
box-sizing: border-box;
14-
vertical-align: middle;
1515
width: var(--vaadin-icon-size, 1lh);
1616
height: var(--vaadin-icon-size, 1lh);
1717
flex: none;
@@ -61,4 +61,8 @@ export const iconStyles = css`
6161
display: inline-block;
6262
width: 0;
6363
}
64+
65+
:host(:is([icon-class], [font-family])) .baseline {
66+
font-family: var(--vaadin-icon-baseline-font-family, inherit);
67+
}
6468
`;

packages/icon/src/vaadin-icon-mixin.d.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
55
*/
66
import type { Constructor } from '@open-wc/dedupe-mixin';
7-
import type { SlotStylesMixinClass } from '@vaadin/component-base/src/slot-styles-mixin.js';
87
import type { IconFontSizeMixinClass } from './vaadin-icon-font-size-mixin.js';
98
import type { IconSvgLiteral } from './vaadin-icon-svg.js';
109

@@ -13,7 +12,7 @@ import type { IconSvgLiteral } from './vaadin-icon-svg.js';
1312
*/
1413
export declare function IconMixin<T extends Constructor<HTMLElement>>(
1514
base: T,
16-
): Constructor<IconFontSizeMixinClass> & Constructor<IconMixinClass> & Constructor<SlotStylesMixinClass> & T;
15+
): Constructor<IconFontSizeMixinClass> & Constructor<IconMixinClass> & T;
1716

1817
export declare class IconMixinClass {
1918
/**

packages/icon/src/vaadin-icon-mixin.js

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
* Copyright (c) 2021 - 2025 Vaadin Ltd.
44
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
55
*/
6-
import { SlotStylesMixin } from '@vaadin/component-base/src/slot-styles-mixin.js';
76
import { TooltipController } from '@vaadin/component-base/src/tooltip-controller.js';
87
import { IconFontSizeMixin } from './vaadin-icon-font-size-mixin.js';
98
import { unsafeSvgLiteral } from './vaadin-icon-svg.js';
@@ -14,11 +13,10 @@ const Iconset = customElements.get('vaadin-iconset');
1413

1514
/**
1615
* @polymerMixin
17-
* @mixes SlotStylesMixin
1816
* @mixes IconFontSizeMixin
1917
*/
2018
export const IconMixin = (superClass) =>
21-
class extends IconFontSizeMixin(SlotStylesMixin(superClass)) {
19+
class extends IconFontSizeMixin(superClass) {
2220
static get properties() {
2321
return {
2422
/**
@@ -173,20 +171,6 @@ export const IconMixin = (superClass) =>
173171
this.__fetch = fetch.bind(window);
174172
}
175173

176-
/** @protected */
177-
get slotStyles() {
178-
const tag = this.localName;
179-
return [
180-
`
181-
${tag}[icon-class] {
182-
display: inline-flex;
183-
vertical-align: middle;
184-
font-size: inherit;
185-
}
186-
`,
187-
];
188-
}
189-
190174
/** @private */
191175
get __iconClasses() {
192176
return this.iconClass ? this.iconClass.split(' ') : [];

packages/icon/test/icon-font.test.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,15 @@ describe('vaadin-icon - icon fonts', () => {
5151
// Workaround to trigger cqh recalculation in Safari and Firefox
5252
// https://github.com/vaadin/web-components/issues/8397
5353
async function iconRender(icon) {
54-
icon.style.display = 'block';
54+
const style = document.createElement('style');
55+
style.textContent = `
56+
:host {
57+
display: block !important;
58+
}
59+
`;
60+
icon.shadowRoot.appendChild(style);
5561
await nextResize(icon);
56-
icon.style.display = '';
62+
icon.shadowRoot.removeChild(style);
5763
}
5864

5965
icon.style.padding = '5px';
2 Bytes
Loading
1 Byte
Loading
-2 Bytes
Loading
-903 Bytes
Loading

0 commit comments

Comments
 (0)