Skip to content

Commit 7cea773

Browse files
asynclizcopybara-github
authored andcommitted
refactor(field): simplify rendering
PiperOrigin-RevId: 511557733
1 parent 535d889 commit 7cea773

File tree

4 files changed

+46
-71
lines changed

4 files changed

+46
-71
lines changed

field/lib/field.ts

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import {html, LitElement, PropertyValues} from 'lit';
7+
import {html, LitElement, nothing, PropertyValues, TemplateResult} from 'lit';
88
import {property, queryAsync, state} from 'lit/decorators.js';
99
import {classMap} from 'lit/directives/class-map.js';
1010

@@ -57,6 +57,9 @@ export class Field extends LitElement {
5757
}
5858

5959
protected override render() {
60+
const floatingLabel = this.renderLabel(/*isFloating*/ true);
61+
const restingLabel = this.renderLabel(/*isFloating*/ false);
62+
const outline = this.renderOutline?.(floatingLabel);
6063
const classes = {
6164
'disabled': this.disabled,
6265
'error': this.error && !this.disabled,
@@ -71,7 +74,22 @@ export class Field extends LitElement {
7174
return html`
7275
<span class="field ${classMap(classes)}">
7376
<span class="container">
74-
${this.renderContainerContents()}
77+
${this.renderBackground?.()}
78+
${this.renderIndicator?.()}
79+
${outline}
80+
<span class="start">
81+
<slot name="start"></slot>
82+
</span>
83+
<span class="middle">
84+
${restingLabel}
85+
${outline ? nothing : floatingLabel}
86+
<span class="content">
87+
<slot></slot>
88+
</span>
89+
</span>
90+
<span class="end">
91+
<slot name="end"></slot>
92+
</span>
7593
</span>
7694
7795
<span class="supporting-text">
@@ -86,31 +104,9 @@ export class Field extends LitElement {
86104
`;
87105
}
88106

89-
protected renderContainerContents() {
90-
return html`
91-
<span class="start">
92-
<slot name="start"></slot>
93-
</span>
94-
<span class="middle">${this.renderMiddleContents()}</span>
95-
<span class="end">
96-
<slot name="end"></slot>
97-
</span>
98-
`;
99-
}
100-
101-
protected renderMiddleContents() {
102-
return html`
103-
<span class="content"><slot></slot></span>
104-
`;
105-
}
106-
107-
protected renderFloatingLabel() {
108-
return this.renderLabel(/*isFloating*/ true);
109-
}
110-
111-
protected renderRestingLabel() {
112-
return this.renderLabel(/*isFloating*/ false);
113-
}
107+
protected renderBackground?(): TemplateResult;
108+
protected renderIndicator?(): TemplateResult;
109+
protected renderOutline?(floatingLabel: TemplateResult): TemplateResult;
114110

115111
private renderLabel(isFloating: boolean) {
116112
let visible: boolean;

field/lib/field_test.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
// import 'jasmine'; (google3-only)
88

9-
import {html} from 'lit';
9+
import {html, TemplateResult} from 'lit';
1010
import {customElement} from 'lit/decorators.js';
1111

1212
import {Environment} from '../../testing/environment.js';
@@ -27,12 +27,8 @@ class TestField extends Field {
2727
}
2828

2929
// Ensure floating/resting labels are both rendered
30-
protected override renderMiddleContents() {
31-
return html`
32-
${this.renderFloatingLabel()}
33-
${this.renderRestingLabel()}
34-
${super.renderMiddleContents()}
35-
`;
30+
protected override renderOutline(floatingLabel: TemplateResult) {
31+
return floatingLabel;
3632
}
3733
}
3834

field/lib/filled-field.ts

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,45 +18,36 @@ export class FilledField extends Field {
1818

1919
constructor() {
2020
super();
21-
this.addEventListener('click', this.handleClick);
21+
this.addEventListener('click', event => {
22+
if (!this.disabled) {
23+
this.updateStrokeTransformOrigin(event);
24+
}
25+
});
2226
}
2327

24-
protected override update(props: PropertyValues<FilledField>) {
25-
// Upon losing focus, the stroke resets to expanding from the center, such
26-
// as when re-focusing with a keyboard.
27-
const unfocusing = props.has('focused') && !this.focused;
28-
if (unfocusing) {
29-
this.updateStrokeTransformOrigin();
30-
}
31-
32-
super.update(props);
33-
}
34-
35-
protected override renderContainerContents() {
36-
const strokeStyle = {transformOrigin: this.strokeTransformOrigin};
28+
protected override renderBackground() {
3729
return html`
3830
<span class="state-layer"></span>
39-
${super.renderContainerContents()}
40-
<span class="active-indicator"
41-
style="${styleMap(strokeStyle)}"></span>
4231
`;
4332
}
4433

45-
protected override renderMiddleContents() {
34+
protected override renderIndicator() {
35+
const strokeStyle = {transformOrigin: this.strokeTransformOrigin};
4636
return html`
47-
${this.renderFloatingLabel()}
48-
${this.renderRestingLabel()}
49-
${super.renderMiddleContents()}
37+
<span class="active-indicator" style="${styleMap(strokeStyle)}"></span>
5038
`;
5139
}
5240

53-
private readonly handleClick = (event: MouseEvent|TouchEvent) => {
54-
if (this.disabled) {
55-
return;
41+
protected override update(props: PropertyValues<FilledField>) {
42+
// Upon losing focus, the stroke resets to expanding from the center, such
43+
// as when re-focusing with a keyboard.
44+
const unfocusing = props.has('focused') && !this.focused;
45+
if (unfocusing) {
46+
this.updateStrokeTransformOrigin();
5647
}
5748

58-
this.updateStrokeTransformOrigin(event);
59-
};
49+
super.update(props);
50+
}
6051

6152
private updateStrokeTransformOrigin(event?: MouseEvent|TouchEvent) {
6253
let transformOrigin = '';

field/lib/outlined-field.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,25 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import {html} from 'lit';
7+
import {html, TemplateResult} from 'lit';
88

99
import {Field} from './field.js';
1010

1111
/**
1212
* An outlined field component.
1313
*/
1414
export class OutlinedField extends Field {
15-
protected override renderContainerContents() {
15+
protected override renderOutline(floatingLabel: TemplateResult) {
1616
return html`
1717
<span class="outline">
1818
<span class="outline-start"></span>
1919
<span class="outline-notch">
2020
<span class="outline-panel-inactive"></span>
2121
<span class="outline-panel-active"></span>
22-
${this.renderFloatingLabel()}
22+
${floatingLabel}
2323
</span>
2424
<span class="outline-end"></span>
2525
</span>
26-
${super.renderContainerContents()}
27-
`;
28-
}
29-
30-
protected override renderMiddleContents() {
31-
return html`
32-
${this.renderRestingLabel()}
33-
${super.renderMiddleContents()}
3426
`;
3527
}
3628
}

0 commit comments

Comments
 (0)