'use client'; import { FoxChip } from '@fox/core/components/fox-chip'; import { FoxChipArea } from '@fox/core/components/fox-chip-area'; import { FoxFormLabel } from '@fox/core/components/fox-form-label'; import { FoxHelperText } from '@fox/core/components/fox-helper-text'; import styles from './merchant-choice-chips.module.scss'; interface ChoiceOption { value: string; label: string; } interface MerchantChoiceChipsProps { label: string; /** 폼에 실릴 이름. 단일 선택은 값 하나, 복수 선택은 고른 순서대로 같은 이름이 반복된다. */ name: string; options: readonly ChoiceOption[]; values: readonly string[]; onChange: (values: string[]) => void; /** 넘기면 복수 선택이 되고 이 개수까지만 고를 수 있다. 없으면 단일 선택이다. */ maxSelected?: number; required?: boolean; optionalText?: string; error?: string; } /** * 기획 BO-MAL-002 ② · BO-MAL-004 ③ — 칩으로 고르는 선택지. 노출 상태·바우처 사용은 단일, * 배지는 복수(잠정 최대 2)다. * * `FoxChip`의 check형은 `aria-pressed` 버튼이라 폼에 실리지 않는다 — 고른 값은 숨은 입력이 * 나른다. 복수 선택은 고른 순서를 지켜 싣는다(배지는 그 순서로 앱에 노출된다). */ export function MerchantChoiceChips({ label, name, options, values, onChange, maxSelected, required, optionalText, error, }: MerchantChoiceChipsProps) { const isMultiple = maxSelected !== undefined; function toggle(value: string, checked: boolean) { if (!isMultiple) { if (checked) onChange([value]); return; } if (!checked) { onChange(values.filter((item) => item !== value)); return; } if (values.includes(value) || values.length >= maxSelected) { return; } onChange([...values, value]); } return (