import { type CSSProperties, type ReactNode } from 'react'; import { type SInputProps } from '../SInput'; import { type STextareaProps } from '../STextarea'; import { type SNumberInputProps } from '../SNumberInput'; import { type SSelectProps } from '../SSelect'; import { type SRadioGroupProps } from '../SRadio'; import { type SCheckboxProps } from '../SCheckbox'; import { type SDatePickerProps } from '../SDatePicker'; import { type SDateRangePickerProps } from '../SDateRangePicker'; import { type SFilePickerProps } from '../SFilePicker'; export type SKeyValueFieldType = 'text' | 'input' | 'textarea' | 'number-input' | 'select' | 'radio' | 'checkbox' | 'date-picker' | 'date-range-picker' | 'file-picker'; /** field type과 무관한 공통 속성 (레이아웃·레이블·스팬 등) */ export interface SKeyValueFieldBase { name: string; label?: string; required?: boolean; helpText?: string[]; hideTh?: boolean; thRowSpan?: number; thColSpan?: number; tdRowSpan?: number; tdColSpan?: number; thWidth?: number | string; thClass?: string; tdClass?: string; /** 셀 커스텀 렌더 (React 확장). 지정 시 type/options는 무시되고 이 노드가 그대로 렌더됩니다. */ render?: ReactNode; } /** * `options`에서 제외되는 키. * - `onValueChange`: 테이블이 `onChange`로 승격시키므로 field 단위로 지정할 수 없습니다. * - `value`: 지정은 가능하나 `values` prop이 같은 name을 가지면 그쪽이 우선합니다. (타입은 유지) */ type FieldOptions

= Omit; /** * `type`에 따라 `options`가 해당 컴포넌트의 props로 좁혀지는 discriminated union. * `type` 생략 시 `text`로 동작합니다. */ export type SKeyValueFieldByType = { type?: 'text'; options?: { value?: ReactNode; }; } | { type: 'input'; options?: FieldOptions; } | { type: 'textarea'; options?: FieldOptions; } | { type: 'number-input'; options?: FieldOptions; } | { type: 'select'; options?: FieldOptions; } | { type: 'radio'; options?: FieldOptions; } | { type: 'checkbox'; options?: FieldOptions; } | { type: 'date-picker'; options?: FieldOptions; } | { type: 'date-range-picker'; options?: FieldOptions; } | { type: 'file-picker'; options?: FieldOptions; }; export type SKeyValueField = SKeyValueFieldBase & SKeyValueFieldByType; /** * field type별 `onChange`로 올라오는 값 타입. * - `string`: input · textarea · select · radio · date-picker * - `number`: number-input * - `boolean`: checkbox * - `string[]`: date-range-picker */ export type SKeyValueFieldValue = string | number | boolean | string[]; /** * `onChange` 콜백 detail. * 제네릭 `V`에 폼 값 형태(`{ [name]: value }`)를 넘기면 `name`/`value`/`values`가 정밀하게 타이핑됩니다. * 미지정 시 `value`는 {@link SKeyValueFieldValue} 유니온으로 잡힙니다. */ export interface SKeyValueChangeDetail = Record> { /** 변경된 field의 name */ name: Extract; /** 변경된 field의 새 값 */ value: V[Extract]; /** 변경이 반영된 전체 값 객체 (`{ [name]: value }`). controlled 패턴에서 그대로 상태에 반영하면 됩니다. */ values: V; } export interface SKeyValueTableProps { /** 2차원 배열. row → [th|td] 필드들 */ fields?: SKeyValueField[][]; /** * field name을 key로 하는 값 객체 (`{ [name]: value }`). * 지정 시 해당 field의 값으로 사용되며, field별 `options.value`보다 우선합니다. * `onChange`의 `detail.values`와 함께 controlled 패턴으로 사용합니다. */ values?: Record; /** 우측 검색 패널 */ search?: boolean; /** border-radius 제어 */ radius?: 'default' | 'useTop' | 'full'; /** 값 변경 (sdChange) */ onChange?: (detail: SKeyValueChangeDetail) => void; /** 검색 클릭 (sdSearch) */ onSearch?: () => void; className?: string; style?: CSSProperties; } /** SKeyValueTable — sd-key-value-table 포팅. th/td 폼 레이아웃 + 필드 렌더러. */ export declare function SKeyValueTable({ fields, values, search, radius, onChange, onSearch, className, style, }: SKeyValueTableProps): import("react").JSX.Element | null; export {};