summaryrefslogtreecommitdiffstats
path: root/src/ui/objects/TextField.tsx
blob: dc7893a92755d4b26c94705d2f117ddd78a39ca6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import type { HTMLAttributes } from "corvos/plugins/jsx.ts";

export type Props = HTMLAttributes<"input"> & {
	"pre"?: JSX.Element;
	"post"?: JSX.Element;
	"invalid"?: boolean;
	"pill"?: boolean;
	"x-model"?: string;
};

export const TextField = ({
	pre,
	post,
	disabled,
	invalid,
	pill,
	placeholder,
	readonly,
	value,
	pattern,
	required,
	"x-model": xModel,
	class: cls,
	...props
}: Props) => {
	const extended = !!pre || !!post;

	return (
		<div
			class:list={[
				"o-text-field",
				{
					"is-disabled": disabled,
					"is-invalid": invalid,
					"l-media": extended,
					"l-media--gapless": extended,
					"o-text-field--extended": extended,
					"o-text-field--pill": pill,
				},
				cls,
			]}
			{...props}
		>
			{pre}{" "}
			<input
				class="o-text-field__native"
				class:list={{
					"l-media__block": extended,
					"l-media__block--main": extended,
				}}
				disabled={disabled}
				pattern={pattern}
				placeholder={placeholder}
				readonly={readonly}
				required={required}
				value={value}
				x-model={xModel}
			/>{" "}
			{post} <div class="o-text-field__bg"></div>
		</div>
	);
};