"use client"; import { FoxInput, FoxInputState, FoxSelect, FoxSelectItem, FoxSelectOption, FoxSelectOptionItem } from "@/@fox/core/components"; import { useState, type CSSProperties, type ReactNode } from "react"; import { FoxAddress, type FoxAddressSearchResult, type FoxAddressValue } from "../core/components/fox-address"; import { FoxBreadcrumb } from "../core/components/fox-breadcrumb"; import { FoxButton } from "../core/components/fox-button"; import { FoxButtonGroup } from "../core/components/fox-button-group"; import { FoxButtonPanel } from "../core/components/fox-button-panel"; import { FoxCarouselArea } from "../core/components/fox-carousel-area"; import { FoxCarouselButton } from "../core/components/fox-carousel-button"; import { FoxCarouselIndicator } from "../core/components/fox-carousel-indicator"; import { FoxCertified } from "../core/components/fox-certified"; import { FoxCheckIcon } from "../core/components/fox-check-icon"; import { FoxCheckbox } from "../core/components/fox-checkbox"; import { FoxCheckboxGroup } from "../core/components/fox-checkbox-group"; import { FoxConditionalOption } from "../core/components/fox-conditional-option"; import { FoxEmail } from "../core/components/fox-email"; import { FoxFileUpload, type FoxFileItem } from "../core/components/fox-file-upload"; import { FoxFormLabel } from "../core/components/fox-form-label"; import { FoxIconButton } from "../core/components/fox-icon-button"; import { FoxLinkButton } from "../core/components/fox-link-button"; import { FoxPagination } from "../core/components/fox-pagination"; import { FoxPhoneNumber, type FoxPhoneNumberState } from "../core/components/fox-phone-number"; import { FoxRadio } from "../core/components/fox-radio"; import { FoxRadioGroup } from "../core/components/fox-radio-group"; import { FoxRadioIcon } from "../core/components/fox-radio-icon"; import { FoxTag } from "../core/components/fox-tag"; import { FoxTagList } from "../core/components/fox-tag-list"; import { FoxTextArea, type FoxTextAreaState } from "../core/components/fox-text-area"; import { FoxTextButton } from "../core/components/fox-text-button"; import { FoxToggleSwitch } from "../core/components/fox-toggle-switch"; import { FoxCaretLeftIcon, FoxCaretRightIcon, FoxPauseIcon, FoxPlayIcon, FoxPlusIcon, } from "../core/icons"; import { FoxBulletList } from "../core/components/fox-bullet-list"; import { FoxBulletListItem } from "../core/components/fox-bullet-list-item"; import { FoxBadge } from "../core/components/fox-badge"; import { FoxBadgeDot } from "../core/components/fox-badge-dot"; import { FoxBadgeGroup } from "../core/components/fox-badge-group"; import { FoxTable } from "../core/components/fox-table"; import { FoxTableCell } from "../core/components/fox-table-cell"; import { FoxTableRow } from "../core/components/fox-table-row"; import styles from "./dev-test.module.scss"; export interface ComponentExample { /** 해시 링크에 쓰이는 kebab-case 식별자. */ id: string; name: string; description?: string; /** 눈으로 비교해야 하는 조합을 빠짐없이 넣는다 — 예제가 곧 회귀 확인 수단이다. */ variants: { label: string; node: ReactNode }[]; } // 자리 확인용 도형. `currentColor`로 그려야 계열별 색이 입혀진다. style은 FoxSelect // 힌트 아이콘처럼 크기를 줄여 써야 하는 자리에 쓴다. function DemoIcon({ style }: { style?: CSSProperties } = {}) { return ( ); } function DemoStar() { return ( ); } // overlay 계열은 어두운 반투명 배경이라 밝은 바탕 위에서는 대비를 볼 수 없다. function OnPhoto({ children }: { children: ReactNode }) { return ( {children} ); } // 입력 예제는 폭이 있어야 시안(360px)처럼 보인다. function InputStage({ children, wide = false }: { children: ReactNode; wide?: boolean }) { return
{JSON.stringify(value, null, 2)}
>
);
}
// 목록은 업로드 결과에 따라 바뀌므로, 오류 줄까지 보려면 예제가 값을 들고 있어야 한다.
const SAMPLE_FILES: FoxFileItem[] = [
{ id: "a", name: "사업자등록증", meta: ".PDF (20KB)" },
{ id: "b", name: "아주 긴 파일 이름이라 가운데에서 말줄임되어야 하는 첨부물", meta: ".XLSX (1.2MB)" },
{
id: "c",
name: "용량초과파일",
meta: ".ZIP (32MB)",
error: true,
message: "등록 가능한 파일 용량을 초과하였습니다. 20MB 미만의 파일만 등록할 수 있습니다.",
},
];
function FileUploadLiveDemo({ mode }: { mode: "default" | "area" }) {
const [files, setFiles] = useState{log.length ? log.join("\n") : "이벤트가 여기에 쌓입니다 (인증번호는 123456)"}
>
);
}
// active는 호출부가 소유하므로 켜고 끄는 걸 보려면 예제가 상태를 들고 있어야 한다.
function IconToggleDemo() {
const [on, setOn] = useState(false);
return (
<>
현재 {page} / 12 페이지