Skip to content

Commit

Permalink
feat: migrate floating label, line ripple, and notched outline to typ…
Browse files Browse the repository at this point in the history
…escript
  • Loading branch information
hperrin committed Sep 10, 2021
1 parent 075f48a commit f05373e
Show file tree
Hide file tree
Showing 40 changed files with 190 additions and 1,557 deletions.
4 changes: 3 additions & 1 deletion packages/banner/ambient.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ declare namespace svelte.JSX {
['onSMUIBannerButton:primaryActionClick']?: (
event: CustomEvent<any> & { target: T }
) => any;
['onSMUIBannerButton:secondaryActionClick']?: any;
['onSMUIBannerButton:secondaryActionClick']?: (
event: CustomEvent<any> & { target: T }
) => any;
}
}
4 changes: 3 additions & 1 deletion packages/chips/ambient.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ declare namespace svelte.JSX {
['onSMUIChipsChip:mount']?: (
event: CustomEvent<any> & { target: T }
) => any;
['onSMUIChipsChip:unmount']?: any;
['onSMUIChipsChip:unmount']?: (
event: CustomEvent<any> & { target: T }
) => any;
['onMDCChip:interaction']?: (
event: CustomEvent<any> & { target: T }
) => any;
Expand Down
4 changes: 2 additions & 2 deletions packages/data-table/Body.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
[className]: true,
'mdc-data-table__content': true,
})}
on:SMUI:data-table:row:mount={handleRowMount}
on:SMUI:data-table:row:unmount={handleRowUnmount}
on:SMUIDataTableRow:mount={handleRowMount}
on:SMUIDataTableRow:unmount={handleRowUnmount}
{...$$restProps}><slot /></tbody
>

Expand Down
4 changes: 2 additions & 2 deletions packages/data-table/Row.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@
addAttr,
};
dispatch(getElement(), 'SMUI:data-table:row:mount', accessor);
dispatch(getElement(), 'SMUIDataTableRow:mount', accessor);
return () => {
dispatch(getElement(), 'SMUI:data-table:row:unmount');
dispatch(getElement(), 'SMUIDataTableRow:unmount');
};
});
Expand Down
56 changes: 30 additions & 26 deletions packages/floating-label/FloatingLabel.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,12 @@
.map(([name, value]) => `${name}: ${value};`)
.concat([style])
.join(' ')}
for={forId || (inputProps ? inputProps.id : null)}
for={forId || (inputProps ? inputProps.id : undefined)}
{...$$restProps}><slot /></label
>
{/if}

<script>
<script lang="ts">
import { MDCFloatingLabelFoundation } from '@material/floating-label';
import { onMount, getContext } from 'svelte';
import { get_current_component } from 'svelte/internal';
Expand All @@ -46,34 +46,38 @@
classMap,
useActions,
dispatch,
ActionArray,
} from '@smui/common/internal';
import type { SMUIFloatingLabelAccessor } from './FloatingLabel.types';
const forwardEvents = forwardEventsBuilder(get_current_component());
export let use = [];
export let use: ActionArray = [];
let className = '';
export { className as class };
export let style = '';
let forId = null;
let forId: string | undefined = undefined;
export { forId as for };
export let floatAbove = false;
export let required = false;
export let wrapped = false;
let element;
let instance;
let internalClasses = {};
let internalStyles = {};
let inputProps = getContext('SMUI:generic:input:props') || {};
let element: HTMLSpanElement | HTMLLabelElement;
let instance: MDCFloatingLabelFoundation;
let internalClasses: { [k: string]: boolean } = {};
let internalStyles: { [k: string]: string } = {};
let inputProps =
getContext<{ id?: string } | undefined>('SMUI:generic:input:props') ?? {};
let previousFloatAbove = floatAbove;
$: if (previousFloatAbove !== floatAbove) {
$: if (instance && previousFloatAbove !== floatAbove) {
previousFloatAbove = floatAbove;
instance.float(floatAbove);
}
let previousRequired = required;
$: if (previousRequired !== required) {
$: if (instance && previousRequired !== required) {
previousRequired = required;
instance.setRequired(required);
}
Expand All @@ -84,53 +88,53 @@
removeClass,
getWidth: () => {
const el = getElement();
const clone = el.cloneNode(true);
el.parentNode.appendChild(clone);
const clone = el.cloneNode(true) as typeof el;
el.parentNode?.appendChild(clone);
clone.classList.add('smui-floating-label--remove-transition');
clone.classList.add('smui-floating-label--force-size');
clone.classList.remove('mdc-floating-label--float-above');
const scrollWidth = clone.scrollWidth;
el.parentNode.removeChild(clone);
el.parentNode?.removeChild(clone);
return scrollWidth;
},
registerInteractionHandler: (evtType, handler) =>
getElement().addEventListener(evtType, handler),
getElement().addEventListener(evtType, handler as EventListener),
deregisterInteractionHandler: (evtType, handler) =>
getElement().removeEventListener(evtType, handler),
getElement().removeEventListener(evtType, handler as EventListener),
});
const accessor = {
const accessor: SMUIFloatingLabelAccessor = {
get element() {
return getElement();
},
addStyle,
removeStyle,
};
dispatch(element, 'SMUI:floating-label:mount', accessor);
dispatch(element, 'SMUIFloatingLabel:mount', accessor);
instance.init();
return () => {
dispatch(element, 'SMUI:floating-label:unmount', accessor);
dispatch(element, 'SMUIFloatingLabel:unmount', accessor);
instance.destroy();
};
});
function addClass(className) {
function addClass(className: string) {
if (!internalClasses[className]) {
internalClasses[className] = true;
}
}
function removeClass(className) {
function removeClass(className: string) {
if (!(className in internalClasses) || internalClasses[className]) {
internalClasses[className] = false;
}
}
function addStyle(name, value) {
function addStyle(name: string, value: string) {
if (internalStyles[name] != value) {
if (value === '' || value == null) {
delete internalStyles[name];
Expand All @@ -141,22 +145,22 @@
}
}
function removeStyle(name) {
function removeStyle(name: string) {
if (name in internalStyles) {
delete internalStyles[name];
internalStyles = internalStyles;
}
}
export function shake(shouldShake) {
export function shake(shouldShake: boolean) {
instance.shake(shouldShake);
}
export function float(shouldFloat) {
export function float(shouldFloat: boolean) {
floatAbove = shouldFloat;
}
export function setRequired(isRequired) {
export function setRequired(isRequired: boolean) {
required = isRequired;
}
Expand Down
5 changes: 5 additions & 0 deletions packages/floating-label/FloatingLabel.types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export interface SMUIFloatingLabelAccessor {
readonly element: HTMLSpanElement | HTMLLabelElement;
addStyle(name: string, value: string): void;
removeStyle(name: string): void;
}
2 changes: 0 additions & 2 deletions packages/floating-label/bare.js

This file was deleted.

2 changes: 2 additions & 0 deletions packages/floating-label/bare.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './index';
export { default } from './index';
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import FloatingLabel from './FloatingLabel.svelte';
export * from './FloatingLabel.types';

export default FloatingLabel;

0 comments on commit f05373e

Please sign in to comment.