Skip to content

Commit 60e10c2

Browse files
committed
feat: updated Text Field for MDC v10
1 parent 24b2699 commit 60e10c2

28 files changed

+2298
-1523
lines changed

README.md

+7-7
Original file line numberDiff line numberDiff line change
@@ -226,20 +226,20 @@ Update Progress Checklist:
226226
- [x] Drawers
227227
- [x] Image List
228228
- [x] Checkboxes
229-
- [ ] Floating Label
229+
- [x] Floating Label
230230
- [x] Form Fields
231-
- [ ] Line Ripple
232-
- [ ] Notched Outline
231+
- [x] Line Ripple
232+
- [x] Notched Outline
233233
- [x] Radio Buttons
234234
- [ ] Select Menus
235235
- [ ] Select Helper Text
236236
- [ ] Select Icon
237237
- [x] Sliders
238238
- [x] Switches
239-
- [ ] Text Field
240-
- [ ] Text Field Character Counter
241-
- [ ] Text Field Helper Text
242-
- [ ] Text Field Icon
239+
- [x] Text Field
240+
- [x] Text Field Character Counter
241+
- [x] Text Field Helper Text
242+
- [x] Text Field Icon
243243
- [x] Linear Progress
244244
- [x] Lists
245245
- [x] Menu Surface

packages/ripple/Ripple.js

+21-9
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,16 @@ export default function Ripple(
1313
unbounded = false,
1414
disabled = false,
1515
color = null,
16+
active = null,
1617
addClass = (className) => node.classList.add(className),
1718
removeClass = (className) => node.classList.remove(className),
1819
addStyle = (name, value) =>
1920
(sentinel || node).style.setProperty(name, value),
20-
active = null,
21+
registerInteractionHandler = (evtType, handler) =>
22+
node.addEventListener(evtType, handler, applyPassive()),
23+
deregisterInteractionHandler = (evtType, handler) =>
24+
node.removeEventListener(evtType, handler, applyPassive()),
25+
initPromise = Promise.resolve(),
2126
} = {}
2227
) {
2328
let instance;
@@ -61,8 +66,7 @@ export default function Ripple(
6166
handler,
6267
applyPassive()
6368
),
64-
deregisterInteractionHandler: (evtType, handler) =>
65-
node.removeEventListener(evtType, handler, applyPassive()),
69+
deregisterInteractionHandler,
6670
deregisterResizeHandler: (handler) =>
6771
window.removeEventListener('resize', handler),
6872
getWindowPageOffset: () => ({
@@ -79,18 +83,22 @@ export default function Ripple(
7983
handler,
8084
applyPassive()
8185
),
82-
registerInteractionHandler: (evtType, handler) =>
83-
node.addEventListener(evtType, handler, applyPassive()),
86+
registerInteractionHandler,
8487
registerResizeHandler: (handler) =>
8588
window.addEventListener('resize', handler),
8689
removeClass,
8790
updateCssVariable: addStyle,
8891
});
89-
instance.init();
90-
instance.setUnbounded(unbounded);
92+
93+
initPromise.then(() => {
94+
instance.init();
95+
instance.setUnbounded(unbounded);
96+
});
9197
} else if (instance && !ripple) {
92-
instance.destroy();
93-
instance = null;
98+
initPromise.then(() => {
99+
instance.destroy();
100+
instance = null;
101+
});
94102
}
95103

96104
if (!ripple && unbounded) {
@@ -137,6 +145,10 @@ export default function Ripple(
137145
active: null,
138146
...props,
139147
});
148+
// Note that you can't change
149+
// registerInteractionHandler,
150+
// deregisterInteractionHandler,
151+
// and initPromise
140152
handleProps();
141153
},
142154

packages/textfield/HelperLine.js

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { classAdderBuilder } from '@smui/common/internal.js';
2+
import Div from '@smui/common/Div.svelte';
3+
4+
export default classAdderBuilder({
5+
class: 'mdc-text-field-helper-line',
6+
component: Div,
7+
forwardEvents: [
8+
'SMUI:textfield:helper-text:id',
9+
'SMUI:textfield:helper-text:mount',
10+
'SMUI:textfield:helper-text:unmount',
11+
'SMUI:textfield:character-counter:mount',
12+
'SMUI:textfield:character-counter:unmount',
13+
],
14+
});

packages/textfield/Input.svelte

+26-2
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
[className]: true,
77
'mdc-text-field__input': true,
88
})}
9-
{type}
10-
{...valueProp}
119
on:change={(e) => (type === 'file' || type === 'range') && valueUpdater(e)}
1210
on:input={(e) => type !== 'file' && valueUpdater(e)}
1311
on:change={changeHandler}
12+
{type}
13+
{...valueProp}
14+
{...internalAttrs}
1415
{...exclude($$props, [
1516
'use',
1617
'class',
@@ -49,6 +50,7 @@
4950
export let updateInvalid = true;
5051
5152
let element;
53+
let internalAttrs = {};
5254
let valueProp = {};
5355
5456
$: if (type === 'file') {
@@ -95,6 +97,28 @@
9597
}
9698
}
9799
100+
export function getAttr(name) {
101+
return name in internalAttrs
102+
? internalAttrs[name]
103+
: getElement().getAttribute(name);
104+
}
105+
106+
export function addAttr(name, value) {
107+
if (internalAttrs[name] !== value) {
108+
internalAttrs[name] = value;
109+
}
110+
}
111+
112+
export function removeAttr(name) {
113+
if (!(name in internalAttrs) || internalAttrs[name] != null) {
114+
internalAttrs[name] = undefined;
115+
}
116+
}
117+
118+
export function focus() {
119+
getElement().focus();
120+
}
121+
98122
export function getElement() {
99123
return element;
100124
}

packages/textfield/Prefix.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { classAdderBuilder } from '@smui/common/internal.js';
2+
import Span from '@smui/common/Span.svelte';
3+
4+
export default classAdderBuilder({
5+
class: 'mdc-text-field__affix mdc-text-field__affix--prefix',
6+
component: Span,
7+
});

packages/textfield/Suffix.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { classAdderBuilder } from '@smui/common/internal.js';
2+
import Span from '@smui/common/Span.svelte';
3+
4+
export default classAdderBuilder({
5+
class: 'mdc-text-field__affix mdc-text-field__affix--suffix',
6+
component: Span,
7+
});

packages/textfield/Textarea.svelte

+25-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
[className]: true,
77
'mdc-text-field__input': true,
88
})}
9-
bind:value
109
on:change={changeHandler}
10+
bind:value
11+
{...internalAttrs}
1112
{...exclude($$props, [
1213
'use',
1314
'class',
@@ -42,6 +43,7 @@
4243
export let updateInvalid = true;
4344
4445
let element;
46+
let internalAttrs = {};
4547
4648
onMount(() => {
4749
if (updateInvalid) {
@@ -56,6 +58,28 @@
5658
}
5759
}
5860
61+
export function getAttr(name) {
62+
return name in internalAttrs
63+
? internalAttrs[name]
64+
: getElement().getAttribute(name);
65+
}
66+
67+
export function addAttr(name, value) {
68+
if (internalAttrs[name] !== value) {
69+
internalAttrs[name] = value;
70+
}
71+
}
72+
73+
export function removeAttr(name) {
74+
if (!(name in internalAttrs) || internalAttrs[name] != null) {
75+
internalAttrs[name] = undefined;
76+
}
77+
}
78+
79+
export function focus() {
80+
getElement().focus();
81+
}
82+
5983
export function getElement() {
6084
return element;
6185
}

0 commit comments

Comments
 (0)