예제
폼
접근 가능한 레이블, 검증 상태, 텍스트·날짜·기간 입력, 그룹 선택 컨트롤을 조합합니다.
공개 계약
NxCheckboxNxComboboxNxFieldGroupNxFieldLegendNxFieldsetNxFileDropzoneNxFormFieldNxFormSectionNxSearchFieldNxSelectNxTextAreaNxTextInputNxDatePickerNxDateRangePickerNxRadioNxRadioGroup실행 미리 보기
실시간복사 가능한 소스
코드 예시
TSX
import { useState } from "react";
import {
NxButton,
NxCheckbox,
NxCombobox,
NxDatePicker,
NxDateRangePicker,
NxFieldGroup,
NxFieldLegend,
NxFieldset,
NxFileDropzone,
NxFormField,
NxFormSection,
NxRadio,
NxRadioGroup,
NxSearchField,
NxSelect,
NxTextArea,
NxTextInput,
} from "@nexia/sdk/host";
const TEAM_OPTIONS = [
{ value: "operations", label: "Operations" },
{ value: "quality", label: "Quality" },
{ value: "maintenance", label: "Maintenance" },
] as const;
export function FormsExample() {
const [search, setSearch] = useState("");
const [team, setTeam] = useState<string | null>("operations");
const [owner, setOwner] = useState<string | null>("min-kim");
const [fileName, setFileName] = useState<string | null>(null);
const [cadence, setCadence] = useState("weekly");
const [reviewDate, setReviewDate] = useState<string | null>("2026-09-15");
const [reportingPeriod, setReportingPeriod] = useState<{
start: string | null;
end: string | null;
}>({
start: "2026-09-01",
end: "2026-09-30",
});
return (
<NxFormSection
placement="footer"
spacing="stack"
actions={<NxButton type="submit">Save</NxButton>}
onSubmit={(event) => event.preventDefault()}
>
<NxFieldGroup className="grid gap-5 lg:grid-cols-2">
<NxFormField
label="Workspace name"
help="Use a name your team will recognize."
required
>
{({ id, describedBy, invalid }) => (
<NxTextInput
id={id}
aria-describedby={describedBy}
invalid={invalid}
defaultValue="Operations"
/>
)}
</NxFormField>
<NxFormField label="Description">
{({ id, describedBy, invalid }) => (
<NxTextArea
id={id}
aria-describedby={describedBy}
invalid={invalid}
rows={3}
defaultValue="Daily production coordination"
/>
)}
</NxFormField>
<NxSearchField
value={search}
onChange={setSearch}
placeholder="Search records"
aria-label="Search records"
/>
<NxSelect
value={team}
options={TEAM_OPTIONS}
onChange={setTeam}
placeholder="Select a team"
ariaLabel="Team"
fullWidth
/>
<NxCombobox
value={owner}
onChange={setOwner}
options={[
{
value: "min-kim",
label: "Min Kim",
meta: "Operations",
},
{
value: "sora-choi",
label: "Sora Choi",
meta: "Quality",
},
]}
placeholder="Select an owner"
ariaLabel="Owner"
searchPlaceholder="Search people"
fullWidth
/>
<NxFileDropzone
accept=".csv"
onFile={(file) => setFileName(file.name)}
prompt="Drop a CSV file here"
browseLabel="Browse"
hint="Up to 10 MB"
selectedFileName={fileName}
inputLabel="Upload CSV"
/>
</NxFieldGroup>
<NxFieldset>
<NxFieldLegend>Notifications</NxFieldLegend>
<NxCheckbox
label="Email me when provisioning completes"
defaultChecked
/>
</NxFieldset>
<NxFieldset>
<NxFieldLegend>Review cadence</NxFieldLegend>
<NxRadioGroup
name="review-cadence"
value={cadence}
onChange={setCadence}
orientation="horizontal"
aria-label="Review cadence"
>
<NxRadio value="weekly" label="Weekly" />
<NxRadio value="monthly" label="Monthly" />
</NxRadioGroup>
</NxFieldset>
<NxFieldGroup className="grid gap-5 lg:grid-cols-2">
<NxDatePicker
label="Next review"
value={reviewDate}
onChange={setReviewDate}
clearable
/>
<NxDateRangePicker
label="Reporting period"
value={reportingPeriod}
onChange={setReportingPeriod}
clearable
/>
</NxFieldGroup>
</NxFormSection>
);
}