| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- 'use client';
- import { useId } from 'react';
- const inputClass =
- 'rounded-lg border bg-fd-background px-3 py-2 text-sm outline-none transition-colors focus-visible:border-fd-primary focus-visible:ring-2 focus-visible:ring-fd-ring/30';
- export function TextField({
- label,
- value,
- onChange,
- placeholder,
- hint,
- inputMode,
- }: {
- label: string;
- value: string;
- onChange: (value: string) => void;
- placeholder?: string;
- hint?: string;
- inputMode?: 'numeric' | 'text';
- }) {
- const id = useId();
- return (
- <div className="flex flex-col gap-1.5">
- <label htmlFor={id} className="text-sm font-medium">
- {label}
- </label>
- {/* Values are technical (hosts, links) and stay LTR even on RTL pages. */}
- <input
- id={id}
- dir="ltr"
- inputMode={inputMode}
- value={value}
- placeholder={placeholder}
- onChange={(e) => onChange(e.target.value)}
- className={inputClass}
- />
- {hint ? <span className="text-xs text-fd-muted-foreground">{hint}</span> : null}
- </div>
- );
- }
- export function CheckboxField({
- label,
- checked,
- onChange,
- }: {
- label: string;
- checked: boolean;
- onChange: (checked: boolean) => void;
- }) {
- const id = useId();
- return (
- <label htmlFor={id} className="inline-flex cursor-pointer items-center gap-2 text-sm">
- <input
- id={id}
- type="checkbox"
- checked={checked}
- onChange={(e) => onChange(e.target.checked)}
- className="size-4 accent-fd-primary"
- />
- {label}
- </label>
- );
- }
- export function SelectField({
- label,
- value,
- onChange,
- options,
- }: {
- label: string;
- value: string;
- onChange: (value: string) => void;
- options: readonly string[];
- }) {
- const id = useId();
- return (
- <div className="flex flex-col gap-1.5">
- <label htmlFor={id} className="text-sm font-medium">
- {label}
- </label>
- <select
- id={id}
- value={value}
- onChange={(e) => onChange(e.target.value)}
- className={inputClass}
- >
- {options.map((opt) => (
- <option key={opt} value={opt}>
- {opt}
- </option>
- ))}
- </select>
- </div>
- );
- }
|