2022-09-06 01:51:57 +00:00
|
|
|
import {theme, vars} from 'app/client/ui2018/cssVars';
|
2022-08-22 19:46:25 +00:00
|
|
|
import {dom, DomElementArg, Observable, styled} from 'grainjs';
|
|
|
|
|
|
|
|
export const cssInput = styled('input', `
|
|
|
|
font-size: ${vars.mediumFontSize};
|
|
|
|
height: 48px;
|
|
|
|
line-height: 20px;
|
|
|
|
width: 100%;
|
|
|
|
padding: 14px;
|
2022-09-06 01:51:57 +00:00
|
|
|
border: 1px solid ${theme.inputBorder};
|
2022-08-22 19:46:25 +00:00
|
|
|
border-radius: 4px;
|
|
|
|
outline: none;
|
|
|
|
display: block;
|
2022-09-06 01:51:57 +00:00
|
|
|
color: ${theme.inputFg};
|
|
|
|
background-color: ${theme.inputBg};
|
|
|
|
|
|
|
|
&::placeholder {
|
|
|
|
color: ${theme.inputPlaceholderFg};
|
|
|
|
}
|
2022-08-22 19:46:25 +00:00
|
|
|
|
|
|
|
&[type=number] {
|
|
|
|
-moz-appearance: textfield;
|
|
|
|
}
|
|
|
|
&[type=number]::-webkit-inner-spin-button,
|
|
|
|
&[type=number]::-webkit-outer-spin-button {
|
|
|
|
-webkit-appearance: none;
|
|
|
|
margin: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
&-invalid {
|
2022-09-06 01:51:57 +00:00
|
|
|
border: 1px solid ${theme.inputInvalid};
|
2022-08-22 19:46:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
&-valid {
|
2022-09-06 01:51:57 +00:00
|
|
|
border: 1px solid ${theme.inputValid};
|
2022-08-22 19:46:25 +00:00
|
|
|
}
|
|
|
|
`);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Builds a text input that updates `obs` as you type.
|
|
|
|
*/
|
|
|
|
export function textInput(obs: Observable<string>, ...args: DomElementArg[]): HTMLInputElement {
|
|
|
|
return cssInput(
|
|
|
|
dom.prop('value', obs),
|
|
|
|
dom.on('input', (_e, elem) => obs.set(elem.value)),
|
|
|
|
...args,
|
|
|
|
);
|
|
|
|
}
|